{-# LANGUAGE OverloadedStrings #-}
module DBus.Notify
(
notify
, replace
, Notification
, mkSessionClient
, connectSession
, Client
, blankNote
, Note (..)
, Body (..)
, URL
, Timeout (..)
, Action (..)
, Image
, Icon (..)
, Category (..)
, UrgencyLevel (..)
, Hint (..)
, getCapabilities
, Capability (..)
) where
import DBus
import DBus.Client
import Control.Applicative
import Data.Maybe (fromMaybe, fromJust)
import Data.Int
import Data.Word
import Data.Char (isLower, toLower)
import Control.Arrow (first, second, (***))
import qualified Data.Map as M
{-# DEPRECATED mkSessionClient "Use DBus.Client.connectSession" #-}
mkSessionClient :: IO Client
mkSessionClient :: IO Client
mkSessionClient = IO Client
connectSession
blankNote :: Note
blankNote :: Note
blankNote = Note { appName :: [Char]
appName=[Char]
""
, appImage :: Maybe Icon
appImage=forall a. Maybe a
Nothing
, summary :: [Char]
summary=[Char]
""
, body :: Maybe Body
body=forall a. Maybe a
Nothing
, actions :: [(Action, [Char])]
actions=[]
, hints :: [Hint]
hints=[]
, expiry :: Timeout
expiry=Timeout
Dependent
}
data Note = Note { Note -> [Char]
appName :: String
, Note -> Maybe Icon
appImage :: Maybe Icon
, Note -> [Char]
summary :: String
, Note -> Maybe Body
body :: Maybe Body
, Note -> [(Action, [Char])]
actions :: [(Action, String)]
, Note -> [Hint]
hints :: [Hint]
, Note -> Timeout
expiry :: Timeout
}
deriving (Note -> Note -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Note -> Note -> Bool
$c/= :: Note -> Note -> Bool
== :: Note -> Note -> Bool
$c== :: Note -> Note -> Bool
Eq, Int -> Note -> ShowS
[Note] -> ShowS
Note -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Note] -> ShowS
$cshowList :: [Note] -> ShowS
show :: Note -> [Char]
$cshow :: Note -> [Char]
showsPrec :: Int -> Note -> ShowS
$cshowsPrec :: Int -> Note -> ShowS
Show)
data Body = Text String
| Bold Body
| Italic Body
| Underline Body
| Hyperlink URL Body
| Img URL String
| Concat Body Body
deriving (Body -> Body -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Body -> Body -> Bool
$c/= :: Body -> Body -> Bool
== :: Body -> Body -> Bool
$c== :: Body -> Body -> Bool
Eq, Int -> Body -> ShowS
[Body] -> ShowS
Body -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Body] -> ShowS
$cshowList :: [Body] -> ShowS
show :: Body -> [Char]
$cshow :: Body -> [Char]
showsPrec :: Int -> Body -> ShowS
$cshowsPrec :: Int -> Body -> ShowS
Show)
type URL = String
data Timeout = Never
| Dependent
| Milliseconds Int32
deriving (Timeout -> Timeout -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Timeout -> Timeout -> Bool
$c/= :: Timeout -> Timeout -> Bool
== :: Timeout -> Timeout -> Bool
$c== :: Timeout -> Timeout -> Bool
Eq, Int -> Timeout -> ShowS
[Timeout] -> ShowS
Timeout -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Timeout] -> ShowS
$cshowList :: [Timeout] -> ShowS
show :: Timeout -> [Char]
$cshow :: Timeout -> [Char]
showsPrec :: Int -> Timeout -> ShowS
$cshowsPrec :: Int -> Timeout -> ShowS
Show)
newtype Action = Action { Action -> [Char]
actionName :: String }
deriving (Action -> Action -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Action -> Action -> Bool
$c/= :: Action -> Action -> Bool
== :: Action -> Action -> Bool
$c== :: Action -> Action -> Bool
Eq, Int -> Action -> ShowS
[Action] -> ShowS
Action -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Action] -> ShowS
$cshowList :: [Action] -> ShowS
show :: Action -> [Char]
$cshow :: Action -> [Char]
showsPrec :: Int -> Action -> ShowS
$cshowsPrec :: Int -> Action -> ShowS
Show)
newtype Image = Image { Image -> [Char]
bitmap :: String }
deriving (Image -> Image -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Image -> Image -> Bool
$c/= :: Image -> Image -> Bool
== :: Image -> Image -> Bool
$c== :: Image -> Image -> Bool
Eq, Int -> Image -> ShowS
[Image] -> ShowS
Image -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Image] -> ShowS
$cshowList :: [Image] -> ShowS
show :: Image -> [Char]
$cshow :: Image -> [Char]
showsPrec :: Int -> Image -> ShowS
$cshowsPrec :: Int -> Image -> ShowS
Show)
data Icon = File FilePath | Icon String
deriving (Icon -> Icon -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Icon -> Icon -> Bool
$c/= :: Icon -> Icon -> Bool
== :: Icon -> Icon -> Bool
$c== :: Icon -> Icon -> Bool
Eq, Int -> Icon -> ShowS
[Icon] -> ShowS
Icon -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Icon] -> ShowS
$cshowList :: [Icon] -> ShowS
show :: Icon -> [Char]
$cshow :: Icon -> [Char]
showsPrec :: Int -> Icon -> ShowS
$cshowsPrec :: Int -> Icon -> ShowS
Show)
iconString :: Icon -> [Char]
iconString (File [Char]
fp) = [Char]
"file://" forall a. [a] -> [a] -> [a]
++ [Char]
fp
iconString (Icon [Char]
name) = [Char]
name
data UrgencyLevel = Low
| Normal
| Critical
deriving (UrgencyLevel -> UrgencyLevel -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UrgencyLevel -> UrgencyLevel -> Bool
$c/= :: UrgencyLevel -> UrgencyLevel -> Bool
== :: UrgencyLevel -> UrgencyLevel -> Bool
$c== :: UrgencyLevel -> UrgencyLevel -> Bool
Eq, Eq UrgencyLevel
UrgencyLevel -> UrgencyLevel -> Bool
UrgencyLevel -> UrgencyLevel -> Ordering
UrgencyLevel -> UrgencyLevel -> UrgencyLevel
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel
$cmin :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel
max :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel
$cmax :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel
>= :: UrgencyLevel -> UrgencyLevel -> Bool
$c>= :: UrgencyLevel -> UrgencyLevel -> Bool
> :: UrgencyLevel -> UrgencyLevel -> Bool
$c> :: UrgencyLevel -> UrgencyLevel -> Bool
<= :: UrgencyLevel -> UrgencyLevel -> Bool
$c<= :: UrgencyLevel -> UrgencyLevel -> Bool
< :: UrgencyLevel -> UrgencyLevel -> Bool
$c< :: UrgencyLevel -> UrgencyLevel -> Bool
compare :: UrgencyLevel -> UrgencyLevel -> Ordering
$ccompare :: UrgencyLevel -> UrgencyLevel -> Ordering
Ord, Int -> UrgencyLevel
UrgencyLevel -> Int
UrgencyLevel -> [UrgencyLevel]
UrgencyLevel -> UrgencyLevel
UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
UrgencyLevel -> UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
$cenumFromThenTo :: UrgencyLevel -> UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
enumFromTo :: UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
$cenumFromTo :: UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
enumFromThen :: UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
$cenumFromThen :: UrgencyLevel -> UrgencyLevel -> [UrgencyLevel]
enumFrom :: UrgencyLevel -> [UrgencyLevel]
$cenumFrom :: UrgencyLevel -> [UrgencyLevel]
fromEnum :: UrgencyLevel -> Int
$cfromEnum :: UrgencyLevel -> Int
toEnum :: Int -> UrgencyLevel
$ctoEnum :: Int -> UrgencyLevel
pred :: UrgencyLevel -> UrgencyLevel
$cpred :: UrgencyLevel -> UrgencyLevel
succ :: UrgencyLevel -> UrgencyLevel
$csucc :: UrgencyLevel -> UrgencyLevel
Enum, Int -> UrgencyLevel -> ShowS
[UrgencyLevel] -> ShowS
UrgencyLevel -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [UrgencyLevel] -> ShowS
$cshowList :: [UrgencyLevel] -> ShowS
show :: UrgencyLevel -> [Char]
$cshow :: UrgencyLevel -> [Char]
showsPrec :: Int -> UrgencyLevel -> ShowS
$cshowsPrec :: Int -> UrgencyLevel -> ShowS
Show)
data Hint = Urgency UrgencyLevel
| Category Category
| ImageData Image
| ImagePath Icon
| SoundFile FilePath
| SuppressSound Bool
| X Int32
| Y Int32
deriving (Hint -> Hint -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Hint -> Hint -> Bool
$c/= :: Hint -> Hint -> Bool
== :: Hint -> Hint -> Bool
$c== :: Hint -> Hint -> Bool
Eq, Int -> Hint -> ShowS
[Hint] -> ShowS
Hint -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Hint] -> ShowS
$cshowList :: [Hint] -> ShowS
show :: Hint -> [Char]
$cshow :: Hint -> [Char]
showsPrec :: Int -> Hint -> ShowS
$cshowsPrec :: Int -> Hint -> ShowS
Show)
data Category = Device | DeviceAdded | DeviceError | DeviceRemoved
| Email | EmailArrived | EmailBounced
| Im | ImError | ImReceived
| Network | NetworkConnected | NetworkDisconnected | NetworkError
| Presence | PresenceOffline | PresenceOnline
| Transfer | TransferComplete | TransferError
deriving (Category -> Category -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Category -> Category -> Bool
$c/= :: Category -> Category -> Bool
== :: Category -> Category -> Bool
$c== :: Category -> Category -> Bool
Eq, Int -> Category -> ShowS
[Category] -> ShowS
Category -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Category] -> ShowS
$cshowList :: [Category] -> ShowS
show :: Category -> [Char]
$cshow :: Category -> [Char]
showsPrec :: Int -> Category -> ShowS
$cshowsPrec :: Int -> Category -> ShowS
Show)
data ClosedReason = Expired | Dismissed | CloseNotificationCalled
data NotificationEvent = ActionInvoked Action | Closed ClosedReason
data Notification = Notification { Notification -> Word32
notificationId :: Word32 }
notify :: Client -> Note -> IO Notification
notify :: Client -> Note -> IO Notification
notify Client
cl = Client -> Notification -> Note -> IO Notification
replace Client
cl (Notification { notificationId :: Word32
notificationId=Word32
0 })
callNotificationMethod :: Client -> MemberName -> [Variant] -> IO MethodReturn
callNotificationMethod Client
client MemberName
methodName [Variant]
args =
Client -> MethodCall -> IO MethodReturn
call_ Client
client forall a b. (a -> b) -> a -> b
$ (ObjectPath -> InterfaceName -> MemberName -> MethodCall
methodCall ObjectPath
path InterfaceName
iface MemberName
methodName)
{ methodCallDestination :: Maybe BusName
methodCallDestination=forall a. a -> Maybe a
Just BusName
busname
, methodCallBody :: [Variant]
methodCallBody=[Variant]
args
}
where
busname :: BusName
busname = BusName
"org.freedesktop.Notifications"
path :: ObjectPath
path = ObjectPath
"/org/freedesktop/Notifications"
iface :: InterfaceName
iface = InterfaceName
"org.freedesktop.Notifications"
replace :: Client -> Notification -> Note -> IO Notification
replace :: Client -> Notification -> Note -> IO Notification
replace Client
cl (Notification { notificationId :: Notification -> Word32
notificationId=Word32
replaceId }) Note
note =
Word32 -> Notification
Notification forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsVariant a => Variant -> Maybe a
fromVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. MethodReturn -> [Variant]
methodReturnBody forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Client -> MemberName -> [Variant] -> IO MethodReturn
callNotificationMethod Client
cl MemberName
"Notify" [Variant]
args
where
args :: [Variant]
args = forall a b. (a -> b) -> [a] -> [b]
map (forall a b. (a -> b) -> a -> b
$ Note
note)
[ forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> [Char]
appName
, forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall a. IsVariant a => a -> Variant
toVariant (Word32
replaceId::Word32)
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a -> a
fromMaybe [Char]
"" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Icon -> [Char]
iconString forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> Maybe Icon
appImage
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> [Char]
summary
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a -> a
fromMaybe [Char]
"" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Body -> [Char]
flattenBody forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> Maybe Body
body
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Action, [Char])] -> [[Char]]
actionsArray forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> [(Action, [Char])]
actions
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Hint] -> Map [Char] Variant
hintsDict forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> [Hint]
hints
, forall a. IsVariant a => a -> Variant
toVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. Timeout -> Int32
timeoutInt forall b c a. (b -> c) -> (a -> b) -> a -> c
. Note -> Timeout
expiry
]
data Capability = ActionsCap | BodyCap | BodyHyperlinksCap | BodyImagesCap
| BodyMarkupCap | IconMultiCap | IconStaticCap | SoundCap
| UnknownCap String
deriving (Capability -> Capability -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Capability -> Capability -> Bool
$c/= :: Capability -> Capability -> Bool
== :: Capability -> Capability -> Bool
$c== :: Capability -> Capability -> Bool
Eq, ReadPrec [Capability]
ReadPrec Capability
Int -> ReadS Capability
ReadS [Capability]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Capability]
$creadListPrec :: ReadPrec [Capability]
readPrec :: ReadPrec Capability
$creadPrec :: ReadPrec Capability
readList :: ReadS [Capability]
$creadList :: ReadS [Capability]
readsPrec :: Int -> ReadS Capability
$creadsPrec :: Int -> ReadS Capability
Read, Int -> Capability -> ShowS
[Capability] -> ShowS
Capability -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Capability] -> ShowS
$cshowList :: [Capability] -> ShowS
show :: Capability -> [Char]
$cshow :: Capability -> [Char]
showsPrec :: Int -> Capability -> ShowS
$cshowsPrec :: Int -> Capability -> ShowS
Show)
getCapabilities :: Client -> IO [Capability]
getCapabilities :: Client -> IO [Capability]
getCapabilities Client
cl = forall a b. (a -> b) -> [a] -> [b]
map [Char] -> Capability
readCapability forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsVariant a => Variant -> Maybe a
fromVariant forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> a
head forall b c a. (b -> c) -> (a -> b) -> a -> c
. MethodReturn -> [Variant]
methodReturnBody
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Client -> MemberName -> [Variant] -> IO MethodReturn
callNotificationMethod Client
cl MemberName
"GetCapabilities" []
readCapability :: String -> Capability
readCapability :: [Char] -> Capability
readCapability [Char]
s = case [Char]
s of
[Char]
"actions" -> Capability
ActionsCap
[Char]
"body" -> Capability
BodyCap
[Char]
"body-hyperlinks" -> Capability
BodyHyperlinksCap
[Char]
"body-images" -> Capability
BodyImagesCap
[Char]
"body-markup" -> Capability
BodyMarkupCap
[Char]
"icon-multi" -> Capability
IconMultiCap
[Char]
"icon-static" -> Capability
IconStaticCap
[Char]
"sound" -> Capability
SoundCap
[Char]
s -> [Char] -> Capability
UnknownCap [Char]
s
timeoutInt :: Timeout -> Int32
timeoutInt :: Timeout -> Int32
timeoutInt Timeout
Never = Int32
0
timeoutInt Timeout
Dependent = -Int32
1
timeoutInt (Milliseconds Int32
n)
| Int32
n forall a. Ord a => a -> a -> Bool
> Int32
0 = Int32
n
| Bool
otherwise = forall a. HasCallStack => [Char] -> a
error [Char]
"notification timeout not positive"
flattenBody :: Body -> String
flattenBody :: Body -> [Char]
flattenBody (Text [Char]
s) = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> [Char]
escape [Char]
s
where
escape :: Char -> [Char]
escape Char
'>' = [Char]
">"
escape Char
'<' = [Char]
"<"
escape Char
'&' = [Char]
"&"
escape Char
x = [Char
x]
flattenBody (Bold Body
b) = [Char]
"<b>" forall a. [a] -> [a] -> [a]
++ Body -> [Char]
flattenBody Body
b forall a. [a] -> [a] -> [a]
++ [Char]
"</b>"
flattenBody (Italic Body
b) = [Char]
"<i>" forall a. [a] -> [a] -> [a]
++ Body -> [Char]
flattenBody Body
b forall a. [a] -> [a] -> [a]
++ [Char]
"</i>"
flattenBody (Underline Body
b) = [Char]
"<u>" forall a. [a] -> [a] -> [a]
++ Body -> [Char]
flattenBody Body
b forall a. [a] -> [a] -> [a]
++ [Char]
"</u>"
flattenBody (Hyperlink [Char]
h Body
b) = [Char]
"<a href=\"" forall a. [a] -> [a] -> [a]
++ [Char]
h forall a. [a] -> [a] -> [a]
++ [Char]
"\">" forall a. [a] -> [a] -> [a]
++ Body -> [Char]
flattenBody Body
b forall a. [a] -> [a] -> [a]
++ [Char]
"</a>"
flattenBody (Img [Char]
h [Char]
alt) = [Char]
"<img src=\"" forall a. [a] -> [a] -> [a]
++ [Char]
h forall a. [a] -> [a] -> [a]
++ [Char]
"\" alt=\"" forall a. [a] -> [a] -> [a]
++ [Char]
alt forall a. [a] -> [a] -> [a]
++ [Char]
"\"/>"
flattenBody (Concat Body
b1 Body
b2) = Body -> [Char]
flattenBody Body
b1 forall a. [a] -> [a] -> [a]
++ Body -> [Char]
flattenBody Body
b2
actionsArray :: [(Action, [Char])] -> [[Char]]
actionsArray = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Action, [Char]) -> [[Char]]
pairList
where
pairList :: (Action, [Char]) -> [[Char]]
pairList (Action
a, [Char]
b) = [Action -> [Char]
actionName Action
a, [Char]
b]
hintsDict :: [Hint] -> M.Map String Variant
hintsDict :: [Hint] -> Map [Char] Variant
hintsDict = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map Hint -> ([Char], Variant)
hint
where
hint :: Hint -> (String, Variant)
hint :: Hint -> ([Char], Variant)
hint (Urgency UrgencyLevel
u) = ([Char]
"urgency", forall a. IsVariant a => a -> Variant
toVariant (forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ forall a. Enum a => a -> Int
fromEnum UrgencyLevel
u :: Word8))
hint (Category Category
c) = ([Char]
"category", forall a. IsVariant a => a -> Variant
toVariant forall a b. (a -> b) -> a -> b
$ Category -> [Char]
catName Category
c)
hint (ImagePath Icon
p) = ([Char]
"image-path", forall a. IsVariant a => a -> Variant
toVariant forall a b. (a -> b) -> a -> b
$ Icon -> [Char]
iconString Icon
p)
hint (ImageData Image
i) = ([Char]
"image-data", forall a. IsVariant a => a -> Variant
toVariant forall a b. (a -> b) -> a -> b
$ Image -> [Char]
bitmap Image
i)
hint (SoundFile [Char]
s) = ([Char]
"sound-file", forall a. IsVariant a => a -> Variant
toVariant [Char]
s)
hint (SuppressSound Bool
b) = ([Char]
"suppress-sound", forall a. IsVariant a => a -> Variant
toVariant Bool
b)
hint (X Int32
x) = ([Char]
"x", forall a. IsVariant a => a -> Variant
toVariant Int32
x)
hint (Y Int32
y) = ([Char]
"x", forall a. IsVariant a => a -> Variant
toVariant Int32
y)
catName :: Category -> String
catName :: Category -> [Char]
catName Category
c = ShowS
catName' (forall a. Show a => a -> [Char]
show Category
c)
where
catName' :: ShowS
catName' (Char
c:[Char]
cs) = forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower forall a b. (a -> b) -> a -> b
$ Char
cforall a. a -> [a] -> [a]
: (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. [a] -> [a] -> [a]
(++) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (Char
'.'forall a. a -> [a] -> [a]
:) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isLower forall a b. (a -> b) -> a -> b
$ [Char]
cs)