packages feed

leksah-0.16.2.2: src/IDE/OSX.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}
-----------------------------------------------------------------------------
--
-- Module      :  IDE.OSX
-- Copyright   :  (c) Juergen Nicklisch-Franken, Hamish Mackenzie
-- License     :  GNU-GPL
--
-- Maintainer  :  <maintainer at leksah.org>
-- Stability   :  provisional
-- Portability :  portable
--
--
--  Support for OSX
--
---------------------------------------------------------------------------------

module IDE.OSX (
    applicationNew
,   updateMenu
,   applicationReady
,   allowFullscreen
) where

import Control.Monad.IO.Class (MonadIO(..))
import GI.Gdk.Objects.Window (IsWindow)
import GI.Gtk.Objects.UIManager (uIManagerGetWidget, UIManager(..))
import IDE.Core.State

#if defined(darwin_HOST_OS)

import Control.Monad.Reader.Class (ask)
import IDE.Command (canQuit)
import Data.Text (Text)
import GI.GtkosxApplication
       (Application(..), applicationReady,
        applicationSetUseQuartzAccelerators,
        onApplicationNSApplicationBlockTermination,
        applicationInsertAppMenuItem, applicationSetMenuBar, Application)
import GI.Gtk.Objects.Widget (widgetHide)
import Data.GI.Base (unsafeCastTo, new')
import GI.Gtk.Objects.MenuShell (MenuShell(..))
import GI.Gtk.Objects.MenuItem (MenuItem(..))
import GI.Gtk.Objects.SeparatorMenuItem (separatorMenuItemNew)
import Control.Monad.IO.Class (MonadIO)
import Data.GI.Base.BasicTypes (NullToNothing(..))

applicationNew :: MonadIO m => m Application
applicationNew = new' Application []

updateMenu :: Application -> UIManager -> IDEM ()
updateMenu app uiManager = do
    ideR <- ask
    uIManagerGetWidget uiManager "/ui/menubar" >>= mapM (liftIO . unsafeCastTo MenuShell) >>= \case
        Just menu -> do
            widgetHide menu
            applicationSetMenuBar app menu
        Nothing   -> return ()

    uIManagerGetWidget uiManager "/ui/menubar/_File/_Quit" >>= \case
        Just quit -> widgetHide quit
        Nothing   -> return ()

    uIManagerGetWidget uiManager "/ui/menubar/_Help/_About" >>= mapM (liftIO . unsafeCastTo MenuItem) >>= \case
        Just about -> do
            applicationInsertAppMenuItem app about 0
            sep <- separatorMenuItemNew
            applicationInsertAppMenuItem app sep 1
        Nothing   -> return ()

    uIManagerGetWidget uiManager "/ui/menubar/_Tools/_Preferences" >>= mapM (liftIO . unsafeCastTo MenuItem) >>= \case
        Just prefs -> do
            applicationInsertAppMenuItem app prefs 2
        Nothing   -> return ()

    onApplicationNSApplicationBlockTermination app $ reflectIDE (fmap not canQuit) ideR

    applicationSetUseQuartzAccelerators app True

allowFullscreen :: IsWindow window => window -> IO ()
allowFullscreen _ = return ()

#else

data Application = Application
applicationNew :: MonadIO m => m Application
applicationNew = return Application
updateMenu :: Application -> UIManager -> IDEM ()
updateMenu _ _ = return ()
applicationReady :: MonadIO m => Application -> m ()
applicationReady _ = return ()
allowFullscreen :: MonadIO m => IsWindow window => window -> m ()
allowFullscreen _ = return ()

#endif