-- Author: Andy Stewart -- Maintainer: Andy Stewart -- -- 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 . {-# 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