summaryrefslogtreecommitdiff
path: root/Utility/FreeDesktop.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/FreeDesktop.hs')
-rw-r--r--Utility/FreeDesktop.hs21
1 files changed, 18 insertions, 3 deletions
diff --git a/Utility/FreeDesktop.hs b/Utility/FreeDesktop.hs
index e3ced6d74..6338948d2 100644
--- a/Utility/FreeDesktop.hs
+++ b/Utility/FreeDesktop.hs
@@ -3,6 +3,7 @@
- http://standards.freedesktop.org/basedir-spec/latest/
- http://standards.freedesktop.org/desktop-entry-spec/latest/
- http://standards.freedesktop.org/menu-spec/latest/
+ - http://standards.freedesktop.org/icon-theme-spec/latest/
-
- Copyright 2012 Joey Hess <joey@kitenet.net>
-
@@ -16,6 +17,7 @@ module Utility.FreeDesktop (
writeDesktopMenuFile,
desktopMenuFilePath,
autoStartPath,
+ iconFilePath,
systemDataDir,
systemConfigDir,
userDataDir,
@@ -34,6 +36,7 @@ import System.Directory
import System.FilePath
import Data.List
import Data.String.Utils
+import Data.Maybe
import Control.Applicative
type DesktopEntry = [(Key, Value)]
@@ -54,18 +57,19 @@ toString (ListV l)
where
escapesemi = join "\\;" . split ";"
-genDesktopEntry :: String -> String -> Bool -> FilePath -> [String] -> DesktopEntry
-genDesktopEntry name comment terminal program categories =
+genDesktopEntry :: String -> String -> Bool -> FilePath -> Maybe String -> [String] -> DesktopEntry
+genDesktopEntry name comment terminal program icon categories = catMaybes
[ item "Type" StringV "Application"
, item "Version" NumericV 1.0
, item "Name" StringV name
, item "Comment" StringV comment
, item "Terminal" BoolV terminal
, item "Exec" StringV program
+ , maybe Nothing (item "Icon" StringV) icon
, item "Categories" ListV (map StringV categories)
]
where
- item x c y = (x, c y)
+ item x c y = Just (x, c y)
buildDesktopMenuFile :: DesktopEntry -> String
buildDesktopMenuFile d = unlines ("[Desktop Entry]" : map keyvalue d) ++ "\n"
@@ -89,6 +93,17 @@ autoStartPath :: String -> FilePath -> FilePath
autoStartPath basename configdir =
configdir </> "autostart" </> desktopfile basename
+{- Path to use for an icon file.
+ - The resolution is something like "48x48" or "scalable". -}
+iconFilePath :: FilePath -> String -> Bool -> IO FilePath
+iconFilePath file resolution systemwide
+ | systemwide = return $ systemDataDir </> "icons" </> subpath
+ | otherwise = do
+ home <- myHomeDir
+ return $ home </> ".icons" </> subpath
+ where
+ subpath = "hicolor" </> resolution </> "apps" </> file
+
desktopfile :: FilePath -> FilePath
desktopfile f = f ++ ".desktop"