%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \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 = "\ \ \ \ \ \ \ \ \ \ " 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} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%