packages feed

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}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%