manatee-terminal-0.1.0: Manatee/Extension/Terminal/TerminalView.hs
-- Author: Andy Stewart <lazycat.manatee@gmail.com>
-- Maintainer: Andy Stewart <lazycat.manatee@gmail.com>
--
-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved.
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveDataTypeable #-}
module Manatee.Extension.Terminal.TerminalView where
import Control.Applicative
import Control.Concurrent.STM
import Data.Map (Map)
import Data.Text.Lazy (Text)
import Data.Typeable
import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)
import Graphics.UI.Gtk.Vte.Vte
import Manatee.Core.Config
import Manatee.Core.DBus
import Manatee.Core.PageFrame
import Manatee.Core.PageView
import Manatee.Core.Types
import Manatee.Extension.Terminal.TerminalBuffer
import Manatee.Toolkit.General.STM
import Manatee.Toolkit.Gtk.ScrolledWindow
import Paths_manatee_terminal
import System.FilePath
import qualified Data.Map as M
data TerminalView =
TerminalView {terminalViewPlugId :: TVar PagePlugId
,terminalViewFrame :: PageFrame
,terminalViewView :: Terminal
,terminalViewBuffer :: TerminalBuffer
}
deriving Typeable
instance PageBuffer TerminalBuffer where
pageBufferGetName = readTVarIO . terminalBufferDirectory
pageBufferSetName _ _ = return ()
pageBufferClient = terminalBufferClient
pageBufferCreateView a pId = PageViewWrap <$> terminalViewNew a pId
pageBufferMode = terminalBufferMode
pageBufferPackageName _ = fmap takeFileName getDataDir
instance PageView TerminalView where
pageViewBuffer = PageBufferWrap . terminalViewBuffer
pageViewPlugId = terminalViewPlugId
pageViewFrame = terminalViewFrame
pageViewLocalKeymap _ = terminalViewLocalKeymap
pageViewLocalCommandMap _ = terminalViewLocalCommandMap
pageViewFocus = widgetGrabFocus . terminalViewView
pageViewPropagateWidget = castToWidget . terminalViewView
pageViewSaveState view = terminalViewSaveState view Nothing
pageViewRestoreState view = terminalViewRestoreState view Nothing
pageViewWriteState view path = terminalViewSaveState view (Just path)
pageViewReadState view path = terminalViewRestoreState view (Just path)
pageViewCopy = terminalViewCopy
pageViewPaste = terminalViewPaste
-- | New terminal view.
terminalViewNew :: TerminalBuffer -> PagePlugId -> IO TerminalView
terminalViewNew buffer plugId = do
-- Create UI frame.
pFrame <- pageFrameNewWithModeName (pageModeName $ terminalBufferMode buffer)
-- Create view.
terminal <- terminalNew
terminalForkCommand terminal Nothing Nothing Nothing Nothing False False False
pageFrameAddChild pFrame terminal
pId <- newTVarIO plugId
let terminalView = TerminalView pId pFrame terminal buffer
-- Send `RenderProcessExit` signal when exit current temrinal.
terminal `on` childExited $
mkDaemonSignal (pageViewClient terminalView) RenderProcessExit (RenderProcessExitArgs (terminalBufferPageId buffer))
-- Return view.
return terminalView
-- | Keymap.
terminalViewLocalKeymap :: Map Text Text
terminalViewLocalKeymap =
M.fromList []
-- | Keymap.
terminalViewLocalCommandMap :: Map Text (TerminalView -> IO ())
terminalViewLocalCommandMap =
M.fromList []
-- | Terminal view copy.
terminalViewCopy :: TerminalView -> IO Bool
terminalViewCopy view = do
terminalCopyClipboard (terminalViewView view)
return True
-- | Terminal view paste.
terminalViewPaste :: TerminalView -> IO Bool
terminalViewPaste view = do
terminalPasteClipboard (terminalViewView view)
return True
-- | Scrolled window.
terminalViewScrolledWindow :: TerminalView -> ScrolledWindow
terminalViewScrolledWindow =
pageFrameScrolledWindow . terminalViewFrame
-- | Save state.
terminalViewSaveState :: TerminalView -> Maybe FilePath -> IO ()
terminalViewSaveState view@(TerminalView {terminalViewBuffer = buffer})
statePath = do
-- Get scroll position.
scrolledWindowPosition <- scrolledWindowGetValue (terminalViewScrolledWindow view)
-- Save state.
let state = TerminalState scrolledWindowPosition
case statePath of
Nothing -> writeTVarIO (terminalBufferState buffer) state
Just path -> writeConfigPath path state
-- | Restore state.
terminalViewRestoreState :: TerminalView -> Maybe FilePath -> IO ()
terminalViewRestoreState view@(TerminalView {terminalViewBuffer = buffer})
statePath = do
bufferState <- readTVarIO (terminalBufferState buffer)
(TerminalState scrolledWindowPosition) <-
case statePath of
Just path -> readConfigPath path bufferState
Nothing -> return bufferState
-- Restore scroll position.
scrolledWindowSetValue (terminalViewScrolledWindow view) scrolledWindowPosition