packages feed

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}

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