packages feed

keera-posture-0.1.3: src/Controller/Conditions/PopupMenu.hs

{-# LANGUAGE CPP #-}
-- | Shows the popup menu when the user right-clicks the icon. The exact
-- behaviour depends a little on the OS, but the overall effect is more or less
-- similar.
module Controller.Conditions.PopupMenu where

import Control.Monad
import Control.Monad.Trans
import Graphics.UI.Gtk

import CombinedEnvironment

-- | Shows/hides the menu as instructed by the user
installHandlers :: CEnv -> IO()
installHandlers cenv = void $ do
  icon <- trayIcon $ mainWindowBuilder $ view cenv
  icon `on` statusIconPopupMenu $ condition cenv
  menu <- mainMenu $ mainWindowBuilder $ view cenv
  menu `onFocusOut` const (liftIO $ onViewAsync (menuPopdown menu) >> return False)
#ifndef linux_HOST_OS
  menuClose <- mainMenuClose $ mainWindowBuilder $ view cenv
  menuClose `on` menuItemActivate $ onViewAsync (menuPopdown menu)
#endif

-- | Adapts the menu to the OS and shows it
condition :: CEnv -> Maybe MouseButton -> TimeStamp -> IO()
condition cenv _m _t = onViewAsync $ do
  menu <- mainMenu $ mainWindowBuilder $ view cenv
  -- This should be some other way
  widgetShowAll menu

  menuClose <- mainMenuClose $ mainWindowBuilder $ view cenv
  menuSep   <- mainMenuSeparator0 $ mainWindowBuilder $ view cenv
#ifdef linux_HOST_OS
  widgetHide menuClose
  widgetHide menuSep
#else
  widgetShow menuClose
  widgetShow menuSep
#endif
  menuPopup menu Nothing