traypoweroff-1.0.0: src/TrayPowerOff.lhs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
module Main() where
\end{code}
\begin{code}
import Graphics.UI.Gtk( initGUI, mainGUI, on )
import Graphics.UI.Gtk.Gdk.Events( TimeStamp )
import Graphics.UI.Gtk.General.Enums( MouseButton )
import Graphics.UI.Gtk.Display.StatusIcon
( statusIconNewFromFile, statusIconActivate, statusIconPopupMenu )
import Graphics.UI.Gtk.ActionMenuToolbar.Action( actionNew, actionActivated )
import Graphics.UI.Gtk.ActionMenuToolbar.ActionGroup
( ActionGroup, actionGroupNew, actionGroupAddAction )
import Graphics.UI.Gtk.ActionMenuToolbar.UIManager
( uiManagerNew, uiManagerAddUiFromString, uiManagerGetWidget
, uiManagerInsertActionGroup )
import Graphics.UI.Gtk.MenuComboToolbar.Menu( Menu, castToMenu, menuPopup )
import Paths_traypoweroff( getDataFileName )
import Data.Maybe( fromJust )
import System.Cmd( system )
import System.Exit( ExitCode(..) )
import Control.Monad( mapM_ )
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
data MenuItem = MenuItem { menuId :: String
, menuText :: String
, menuAction :: IO () }
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
menuXml :: String
menuXml = "<popup>\
\ <menuitem action=\"AOFF\" />\
\ <menuitem action=\"AREB\" />\
\ <menuitem action=\"ASUS\" />\
\ <menuitem action=\"AHIB\" />\
\ </popup>"
menuItems :: [MenuItem]
menuItems = [ MenuItem "AOFF" "PowerOff" powerOffAction
, MenuItem "AREB" "Reboot" rebootAction
, MenuItem "ASUS" "Suspend" suspendAction
, MenuItem "AHIB" "Hibernate" hibernateAction ]
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
main :: IO()
main = do
initGUI
iconfile <- getDataFileName "icons/icon64.png"
icon <- statusIconNewFromFile iconfile
group <- actionGroupNew "AGRP"
mapM_ (createMenuItem group) menuItems
uiman <- uiManagerNew
uiManagerAddUiFromString uiman menuXml
uiManagerInsertActionGroup uiman group 0
pop <- fmap (castToMenu . fromJust) $ uiManagerGetWidget uiman "/popup"
on icon statusIconActivate $ menuActivate pop
on icon statusIconPopupMenu $ menuPopUp pop
mainGUI
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
createMenuItem :: ActionGroup -> MenuItem -> IO ()
createMenuItem group item = do
action <- actionNew (menuId item) (menuText item) Nothing Nothing
on action actionActivated (menuAction item)
actionGroupAddAction group action
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
menuPopUp :: Menu -> Maybe MouseButton -> TimeStamp -> IO ()
menuPopUp menu _ _ = menuPopup menu Nothing
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
menuActivate :: Menu -> IO ()
menuActivate menu = menuPopup menu Nothing
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
powerOffAction :: IO ()
powerOffAction = do
err <- system "sudo /sbin/poweroff"
case err of
ExitFailure n -> putStrLn $ "Error code: " ++ show n
ExitSuccess -> return ()
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
rebootAction :: IO ()
rebootAction = do
err <- system "sudo /sbin/reboot"
case err of
ExitFailure n -> putStrLn $ "Error code: " ++ show n
ExitSuccess -> return ()
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
suspendAction :: IO ()
suspendAction = do
err <- system "sudo /usr/sbin/pm-suspend"
case err of
ExitFailure n -> putStrLn $ "Error code: " ++ show n
ExitSuccess -> return ()
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
hibernateAction :: IO ()
hibernateAction = do
err <- system "sudo /usr/sbin/pm-hibernate"
case err of
ExitFailure n -> putStrLn $ "Error code: " ++ show n
ExitSuccess -> return ()
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%