module Manatee.Plugin.Anything.AnythingApplication where
import Control.Monad
import DBus.Client hiding (Signal)
import Data.ByteString.UTF8 hiding (take, length)
import Data.Char (toLower)
import Data.List
import Data.Maybe
import Data.Ord (comparing)
import Data.Typeable
import Manatee.Plugin.Anything.Anything
import Manatee.Plugin.Anything.Types
import Manatee.Toolkit.General.Process
import Manatee.Toolkit.General.String
import Manatee.Toolkit.Gio.Gio
import System.FilePath
import System.GIO
data ApplicationInfo =
ApplicationInfo {applicationInfoName :: String
,applicationInfoDescription :: String
,applicationInfoCommand :: String
} deriving Typeable
instance AnythingCandidate ApplicationInfo where
candidateCommandName = applicationInfoCommand
candidateFilterName a = applicationInfoName a ++ " " ++ applicationInfoDescription a
candidateCompletionName a _ = applicationInfoName a
candidateExpandName a _ = return $ applicationInfoName a
anythingApplication :: Anything
anythingApplication =
Anything {anythingColumnTitle = ["Application", "Description"]
,anythingColumnFun = anythingApplicationColumnFun
,anythingSearch = AnythingSearch anythingApplicationSearch
,anythingFilterRule = anythingFuzzyFilterRule False
,anythingCompletionRule = id
,anythingInputDepend = False
,anythingCommandFun = anythingApplicationCommandFun
,anythingCalculateDelay = 0
}
anythingApplicationSearch :: AnythingInput -> Client -> IO [ApplicationInfo]
anythingApplicationSearch _ _ =
liftM (sortBy (comparing (map toLower . applicationInfoName)) . map
(\x -> ApplicationInfo
(takeFileName $ appInfoGetExecutable x)
(fromMaybe "" $ appInfoGetDescription x)
(anythingApplicationFilterCommandName $ toString $ fromMaybe "" $ appInfoGetCommandline x)
)) appInfoGetAll
anythingApplicationColumnFun :: [AnythingColumnFun]
anythingApplicationColumnFun =
[applicationInfoName . anythingCandidateUnpack
,applicationInfoDescription . anythingCandidateUnpack]
anythingApplicationCommandFun :: AnythingCommandFun
anythingApplicationCommandFun _ (AnythingCandidateWrap a) _ = do
let command = candidateCommandName a
return [("Startup application", anythingApplicationActionStartup command)
,("Running in terminal", anythingApplicationActionRunInTerminal command)]
anythingApplicationActionStartup :: String -> Client -> IO ()
anythingApplicationActionStartup command _ =
runExternalCommand command
anythingApplicationActionRunInTerminal :: String -> Client -> IO ()
anythingApplicationActionRunInTerminal command _ =
launchCommandInTerminal command
anythingApplicationFilterCommandName :: String -> String
anythingApplicationFilterCommandName =
dropSuffix ["%u", "%U"]