traypoweroff-0.9.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
( 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(..) )
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
main :: IO()
main = do
initGUI
iconfile <- getDataFileName "icons/icon64.png"
icon <- statusIconNewFromFile iconfile
aoff <- actionNew "AOFF" "PowerOff" Nothing Nothing
on aoff actionActivated powerOffAction
areb <- actionNew "AREB" "Reboot" Nothing Nothing
on areb actionActivated rebootAction
group <- actionGroupNew "AGRP"
actionGroupAddAction group aoff
actionGroupAddAction group areb
uiman <- uiManagerNew
uiManagerAddUiFromString uiman uiDecl
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}
menuPopUp :: Menu -> Maybe MouseButton -> TimeStamp -> IO ()
menuPopUp menu _ _ = do
menuPopup menu Nothing
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
menuActivate :: Menu -> IO ()
menuActivate menu = do
menuPopup menu Nothing
\end{code}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{code}
uiDecl :: [Char]
uiDecl = "<popup>\
\ <menuitem action=\"AOFF\" />\
\ <menuitem action=\"AREB\" />\
\ </popup>"
\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}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%