    {-# LANGUAGE CPP #-}

    module Termonad.Gtk where

    import Termonad.Prelude

    import GHC.Stack (HasCallStack)
    import GI.Gdk
      ( GObject
      , ManagedPtr
      , castTo
      )
    import GI.Gio (ApplicationFlags)
    import GI.Gtk (Application, applicationNew, builderGetObject)
    import qualified GI.Gtk as Gtk

    objFromBuildUnsafe ::
         GObject o => Gtk.Builder -> Text -> (ManagedPtr o -> o) -> IO o
    objFromBuildUnsafe builder name constructor = do
      maybePlainObj <- builderGetObject builder name
      case maybePlainObj of
        Nothing -> error $ "Couldn't get " <> unpack name <> " from builder!"
        Just plainObj -> do
          maybeNewObj <- castTo constructor plainObj
          case maybeNewObj of
            Nothing ->
              error $
                "Got " <>
                unpack name <>
                " from builder, but couldn't convert to object!"
            Just obj -> pure obj

    appNew :: (HasCallStack, MonadIO m) => Maybe Text -> [ApplicationFlags] -> m Application
    appNew appName appFlags = do
      maybeApp <- applicationNew appName appFlags
      case maybeApp of
        Nothing -> fail "Could not create application for some reason!"
        Just app -> pure app