module Propellor.Property.XFCE where

import Propellor.Base
import qualified Propellor.Property.Apt as Apt
import qualified Propellor.Property.File as File
import qualified Propellor.Property.User as User

installed :: Property DebianLike
installed :: Property DebianLike
installed = [Package] -> Property DebianLike
Apt.installed [Package
"task-xfce-desktop"]
	forall p. IsProp p => p -> Package -> p
`describe` Package
"XFCE desktop installed"

-- | Minimal install of XFCE, with a terminal emulator and panel,
-- and X and network-manager, but not any of the extra apps.
installedMin :: Property DebianLike
installedMin :: Property DebianLike
installedMin = [Package] -> Property DebianLike
Apt.installedMin [Package
"xfce4", Package
"xfce4-terminal", Package
"task-desktop"]
	forall p. IsProp p => p -> Package -> p
`describe` Package
"minimal XFCE desktop installed"

-- | Installs network-manager-gnome, which is the way to get
-- network-manager to manage networking in XFCE too.
networkManager :: Property DebianLike
networkManager :: Property DebianLike
networkManager = [Package] -> Property DebianLike
Apt.installedMin [Package
"network-manager-gnome"]

-- | Normally at first login, XFCE asks what kind of panel the user wants.
-- This enables the default configuration noninteractively.
defaultPanelFor :: User -> File.Overwrite -> Property DebianLike
defaultPanelFor :: User -> Overwrite -> Property DebianLike
defaultPanelFor u :: User
u@(User Package
username) Overwrite
overwrite = forall {k} (metatypes :: k).
SingI metatypes =>
Package
-> (OuterMetaTypesWitness metatypes -> Propellor Result)
-> Property (MetaTypes metatypes)
property' Package
desc forall a b. (a -> b) -> a -> b
$ \OuterMetaTypesWitness
  '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]
w -> do
	Package
home <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ User -> IO Package
User.homedir User
u
	forall (inner :: [MetaType]) (outer :: [MetaType]).
EnsurePropertyAllowed inner outer =>
OuterMetaTypesWitness outer
-> Property (MetaTypes inner) -> Propellor Result
ensureProperty OuterMetaTypesWitness
  '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish]
w (Package -> Property DebianLike
go Package
home)
  where
	desc :: Package
desc = Package
"default XFCE panel for " forall a. [a] -> [a] -> [a]
++ Package
username
	basecf :: Package
basecf = Package
".config" Package -> Package -> Package
</> Package
"xfce4" Package -> Package -> Package
</> Package
"xfconf"
		Package -> Package -> Package
</> Package
"xfce-perchannel-xml" Package -> Package -> Package
</> Package
"xfce4-panel.xml"
	-- This location is probably Debian-specific.
	defcf :: Package
defcf = Package
"/etc/xdg/xfce4/panel/default.xml"
	go :: FilePath -> Property DebianLike
	go :: Package -> Property DebianLike
go Package
home = forall (p :: * -> *) (untightened :: [MetaType])
       (tightened :: [MetaType]).
(TightenTargets p, TightenTargetsAllowed untightened tightened,
 SingI tightened) =>
p (MetaTypes untightened) -> p (MetaTypes tightened)
tightenTargets forall a b. (a -> b) -> a -> b
$ 
		forall i.
Overwrite -> Package -> (Package -> Property i) -> Property i
File.checkOverwrite Overwrite
overwrite (Package
home Package -> Package -> Package
</> Package
basecf) forall a b. (a -> b) -> a -> b
$ \Package
cf ->
			Package
cf Package
-> Package
-> Property
     (MetaTypes
        '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish,
           'Targeting 'OSArchLinux, 'Targeting 'OSFreeBSD])
`File.isCopyOf` Package
defcf
				forall x y. Combines x y => x -> y -> CombinedType x y
`before` forall metatypes.
Monoid (Property metatypes) =>
Package
-> Package -> (Package -> Property metatypes) -> Property metatypes
File.applyPath Package
home Package
basecf
					(\Package
f -> Package
-> User
-> Group
-> Property
     (MetaTypes
        '[ 'Targeting 'OSDebian, 'Targeting 'OSBuntish,
           'Targeting 'OSArchLinux, 'Targeting 'OSFreeBSD])
File.ownerGroup Package
f User
u (User -> Group
userGroup User
u))
				forall x y. Combines x y => x -> y -> CombinedType x y
`requires` [Package] -> Property DebianLike
Apt.installed [Package
"xfce4-panel"]