manatee-processmanager 0.0.8 → 0.1.0
raw patch · 8 files changed
+158/−62 lines, 8 filesdep +binarydep +derivedep −gtk-serialized-eventdep ~manatee-coresetup-changedbinary-added
Dependencies added: binary, derive
Dependencies removed: gtk-serialized-event
Dependency ranges changed: manatee-core
Files
- Main.hs +1/−1
- Manatee/Extension/ProcessManager.hs +1/−1
- Manatee/Extension/ProcessManager/PageMode.hs +1/−1
- Manatee/Extension/ProcessManager/ProcessBuffer.hs +34/−6
- Manatee/Extension/ProcessManager/ProcessView.hs +99/−44
- Setup.hs +13/−3
- data/welcome/snapshot.png binary
- manatee-processmanager.cabal +9/−6
Main.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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
Manatee/Extension/ProcessManager.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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
Manatee/Extension/ProcessManager/PageMode.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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
Manatee/Extension/ProcessManager/ProcessBuffer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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@@ -17,6 +17,7 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. {-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-} module Manatee.Extension.ProcessManager.ProcessBuffer where import Control.Applicative@@ -25,18 +26,19 @@ import Control.Concurrent.STM import Control.Monad import DBus.Client hiding (Signal)-import Data.Ord+import Data.Binary+import Data.DeriveTH import Data.List+import Data.Ord import Data.Typeable-import Graphics.UI.Gtk.General.Enums-import Graphics.UI.Gtk.General.General-import Graphics.UI.Gtk.ModelView.TreeSortable+import Graphics.UI.Gtk hiding (get)+import Manatee.Core.Config import Manatee.Core.Types import Manatee.Extension.ProcessManager.PageMode import Manatee.Toolkit.General.List import Manatee.Toolkit.General.Misc import Manatee.Toolkit.General.STM-import System.Linux.Proc+import System.Linux.Proc hiding (ProcessState) data ProcessBuffer = ProcessBuffer {processBufferName :: String@@ -49,9 +51,15 @@ ,processBufferBroadcastChannel :: TChan ProcTChanSignal ,processBufferDelay :: Int ,processBufferViewCounter :: TVar Int+ ,processBufferState :: TVar ProcessState } deriving Typeable +data ProcessState =+ ProcessState {processStateSelectedPath :: (Maybe TreePath)+ ,processStateScrolledPosition :: (Double, Double)+ }+ data ProcTChanSignal = Empty | UpdateProcesses ([ProcStatus], [ProcStatus], [ProcStatus]) | KillProcess Int@@ -150,6 +158,11 @@ compareRow MCmdline row1 row2 = return $ comparing psCmdline row1 row2 compareRow MUser row1 row2 = return $ comparing psUsername row1 row2 +-- | Init state.+processInitState :: ProcessState +processInitState = + ProcessState Nothing (0, 0)+ -- | Create process buffer. processBufferNew :: FilePath -> [String] -> Client -> PageId -> CustomizeWrap -> IO ProcessBuffer processBufferNew path _ client pageId _ = do@@ -175,6 +188,7 @@ <*> newTChanIO <*> pure 3000 -- default delay is 3s <*> newTVarIO 0+ <*> newTVarIO processInitState -- | Update process buffer status. processBufferUpdate :: ProcessBuffer -> IO () @@ -224,3 +238,17 @@ Nothing -> ([x], []) in ((++) add *** (++) diff) (diffProcessStatus xs oldStatus) +-- | Write state.+processBufferWriteState :: ProcessBuffer -> FilePath -> IO ()+processBufferWriteState buffer path = do+ state <- readTVarIO $ processBufferState buffer+ writeConfigPath path state++-- | Read state.+processBufferReadState :: ProcessBuffer -> FilePath -> IO () +processBufferReadState buffer path = do+ state <- readConfigPath path processInitState+ writeTVarIO (processBufferState buffer) state+ +$(derive makeBinary ''ProcessState)+
Manatee/Extension/ProcessManager/ProcessView.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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@@ -28,8 +28,9 @@ import Data.Text.Lazy (Text) import Data.Typeable import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)-import Graphics.UI.Gtk.Gdk.SerializedEvent+import Manatee.Core.Config import Manatee.Core.PageFrame+import Manatee.Core.PageView import Manatee.Core.Types import Manatee.Extension.ProcessManager.ProcessBuffer import Manatee.Toolkit.General.Basic@@ -38,11 +39,11 @@ import Manatee.Toolkit.General.Process import Manatee.Toolkit.General.STM import Manatee.Toolkit.Gtk.Concurrent-import Manatee.Toolkit.Gtk.Gtk import Manatee.Toolkit.Gtk.ModelView+import Manatee.Toolkit.Gtk.ScrolledWindow import Paths_manatee_processmanager-import System.Linux.Proc import System.FilePath+import System.Linux.Proc import qualified Data.Map as M @@ -66,16 +67,21 @@ pageBufferPackageName _ = fmap takeFileName getDataDir instance PageView ProcessView where- pageViewBuffer = PageBufferWrap . processViewBuffer- pageViewPlugId = processViewPlugId- pageViewBox = pageFrameBox . processViewFrame- pageViewScrolledWindow = processViewScrolledWindow- pageViewFocus = treeViewFocus . processViewTreeView- pageViewHandleKeyAction = processViewHandleKeyAction- pageViewScrollToTop = processViewScrollToTop- pageViewScrollToBottom = processViewScrollToBottom- pageViewScrollVerticalPage = processViewScrollVerticalPage- pageViewScrollVerticalStep = processViewScrollVerticalStep+ pageViewBuffer = PageBufferWrap . processViewBuffer+ pageViewPlugId = processViewPlugId+ pageViewFrame = processViewFrame+ pageViewLocalKeymap _ = processViewLocalKeymap+ pageViewLocalCommandMap _ = processViewLocalCommandMap+ pageViewFocus = treeViewFocus . processViewTreeView+ pageViewPropagateWidget = castToWidget . processViewTreeView+ pageViewSaveState view = processViewSaveState view Nothing+ pageViewRestoreState view = processViewRestoreState view Nothing+ pageViewWriteState view path = processViewSaveState view (Just path)+ pageViewReadState view path = processViewRestoreState view (Just path)+ pageViewScrollToTop = processViewScrollToTop+ pageViewScrollToBottom = processViewScrollToBottom+ pageViewScrollVerticalPage = processViewScrollVerticalPage+ pageViewScrollVerticalStep = processViewScrollVerticalStep -- | Create process view. processViewNew :: ProcessBuffer -> PagePlugId -> IO ProcessView@@ -262,39 +268,54 @@ set cell [cellText := getCellText info row ,cellXAlign := getCellXAlign info] --- | Handle keymap.-processViewHandleKeyAction :: ProcessView -> Text -> SerializedEvent -> IO () -processViewHandleKeyAction view keystoke sEvent = - case M.lookup keystoke processViewKeymap of- Just action -> action view- Nothing -> widgetPropagateEvent (processViewTreeView view) sEvent- -- | Keymap.-processViewKeymap :: Map Text (ProcessView -> IO ())-processViewKeymap = +processViewLocalKeymap :: Map Text Text+processViewLocalKeymap = M.fromList- [("j", processViewNextNode)- ,("k", processViewPrevNode)- ,("Down", processViewNextNode)- ,("Up", processViewPrevNode) - ,("J", processViewScrollToBottom)- ,("K", processViewScrollToTop)- ,(" ", processViewScrollVerticalPage True)- ,("b", processViewScrollVerticalPage False)- ,("PageDown", processViewScrollVerticalPage True)- ,("PageUp", processViewScrollVerticalPage False)- ,(";", processViewKillProcess)- ,("1", processViewSortByName)- ,("2", processViewSortByProcessId)- ,("3", processViewSortByUser)- ,("4", processViewSortByState)- ,("5", processViewSortByMemory)- ,("6", processViewSortByCPU)- ,("7", processViewSortByPriority)- ,("8", processViewSortByThreads)- ,("9", processViewSortByCmdline)+ [("j", "Next")+ ,("k", "Previous")+ ,("Down", "Next")+ ,("Up", "Previous") + ,("J", "Scroll to bottom")+ ,("K", "Scroll to top")+ ,(" ", "Scroll page up")+ ,("b", "Scroll page down")+ ,("PageDown", "Scroll page up")+ ,("PageUp", "Scroll page down")+ ,(";", "Kill process")+ ,("1", "Sort by name")+ ,("2", "Sort by process id")+ ,("3", "Sort by user")+ ,("4", "Sort by state")+ ,("5", "Sort by memory")+ ,("6", "Sort by cpu")+ ,("7", "Sort by priority")+ ,("8", "Sort by threads")+ ,("9", "Sort by command") ] +-- | Keymap.+processViewLocalCommandMap :: Map Text (ProcessView -> IO ())+processViewLocalCommandMap = + M.fromList+ [("Next", processViewNextNode)+ ,("Previous", processViewPrevNode)+ ,("Scroll to bottom", processViewScrollToBottom)+ ,("Scroll to top", processViewScrollToTop)+ ,("Scroll page up", processViewScrollVerticalPage True)+ ,("Scroll page down", processViewScrollVerticalPage False)+ ,("Kill process", processViewKillProcess)+ ,("Sort by name", processViewSortByName)+ ,("Sort by process id",processViewSortByProcessId)+ ,("Sort by user", processViewSortByUser)+ ,("Sort by state", processViewSortByState)+ ,("Sort by memory", processViewSortByMemory)+ ,("Sort by cpu", processViewSortByCPU)+ ,("Sort by priority", processViewSortByPriority)+ ,("Sort by threads", processViewSortByThreads)+ ,("Sort by command", processViewSortByCmdline)+ ]+ -- | Next node. processViewNextNode :: ProcessView -> IO () processViewNextNode = treeViewFocusNextToplevelNode . processViewTreeView@@ -426,7 +447,7 @@ processViewRemoveProcess view (head currentPath) -- Popup notify message.- pageFrameShowOutputbar (processViewFrame view) ("Kill process '" ++ processName ++ "' (" ++ show processId ++ ")") Nothing+ pageViewShowOutputbar view ("Kill process '" ++ processName ++ "' (" ++ show processId ++ ")") Nothing -- | Remove process from view. processViewRemoveProcess :: ProcessView -> Int -> IO ()@@ -438,3 +459,37 @@ processViewScrolledWindow :: ProcessView -> ScrolledWindow processViewScrolledWindow = pageFrameScrolledWindow . processViewFrame++-- | Save state.+processViewSaveState :: ProcessView -> Maybe FilePath -> IO ()+processViewSaveState view@(ProcessView {processViewBuffer = buffer+ ,processViewTreeView = treeView}) + statePath = do+ -- Get selected path.+ selectedPath <- treeViewGetSelectedPath treeView++ -- Get scroll position.+ scrolledWindowPosition <- scrolledWindowGetValue (processViewScrolledWindow view)++ -- Save state.+ let state = ProcessState selectedPath scrolledWindowPosition+ case statePath of+ Nothing -> writeTVarIO (processBufferState buffer) state+ Just path -> writeConfigPath path state++-- | Restore state.+processViewRestoreState :: ProcessView -> Maybe FilePath -> IO ()+processViewRestoreState view@(ProcessView {processViewBuffer = buffer+ ,processViewTreeView= treeView}) + statePath = do+ bufferState <- readTVarIO (processBufferState buffer)+ (ProcessState selectedPath scrolledWindowPosition) <- + case statePath of+ Just path -> readConfigPath path bufferState+ Nothing -> return bufferState++ -- Restore selected path.+ selectedPath ?>= \path -> treeViewSetCursor treeView path Nothing++ -- Restore scroll position.+ scrolledWindowSetValue (processViewScrolledWindow view) scrolledWindowPosition
Setup.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- 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@@ -19,6 +19,7 @@ import Distribution.Simple import Manatee.Core.Config import Manatee.Core.Types+import Manatee.Toolkit.Cabal.Utils import Manatee.Extension.ProcessManager.PageMode import qualified Data.Map as M@@ -26,7 +27,7 @@ main = defaultMainWithHooks simpleUserHooks { -- Update PageTypeRule after install successful.- postInst = \ _ _ _ _ -> do+ postInst = \ _ _ pack_des lbi -> do (PageTypeRule rule) <- readConfig pageTypeRulePath (PageTypeRule M.empty) writeConfig pageTypeRulePath (PageTypeRule (M.insert "PageProcessManager" "manatee-processmanager" rule)) -- Update PageModeRule.@@ -37,6 +38,15 @@ -- Update ExtensionGloalKeymap. (ExtensionGloalKeymap keymap) <- readConfig extensionGlobalKeymapPath (ExtensionGloalKeymap M.empty) writeConfig extensionGlobalKeymapPath (ExtensionGloalKeymap- (M.insert "F2" ("PageProcessManager", "ProcessManager", []) keymap))+ (M.insert "F2" ("Process Manager",+ ("PageProcessManager", "ProcessManager", [])) keymap)) + -- Update Application info.+ let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"+ (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)+ writeConfig welcomeApplicationPath (WelcomeApplication+ (M.insert + ("Process Manager", snapshotPath)+ ("PageProcessManager", "ProcessManager", [])+ apps)) }
+ data/welcome/snapshot.png view
binary file changed (absent → 195071 bytes)
manatee-processmanager.cabal view
@@ -1,13 +1,13 @@ name: manatee-processmanager-version: 0.0.8+version: 0.1.0 Cabal-Version: >= 1.6 license: GPL-3 license-file: LICENSE-copyright: (c) 2009 ~ 2010 Andy Stewart+copyright: (c) 2010 ~ 2011 Andy Stewart synopsis: Process manager extension for Manatee. description: manatee-processmanager is process manager extension for Manatee (Haskell/Gtk+ Integrated Live Environment) .- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>+ Video (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html> . Screenshots at : <http://goo.gl/MkVw> .@@ -22,16 +22,19 @@ stability: provisional category: Manatee, Process Manager, System -tested-with: GHC==6.12.3+tested-with: GHC==7.0.2 build-type: Custom +data-dir: ""+data-files: data/welcome/snapshot.png+ Source-Repository head type: darcs location: http://patch-tag.com/r/AndyStewart/manatee-processmanager Library- build-depends: base >= 4 && < 5, manatee-core >= 0.0.8, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,- containers >= 0.3.0.0, gtk-serialized-event >= 0.12.0, gtk >= 0.12.0,+ build-depends: base >= 4 && < 5, manatee-core >= 0.1.0, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,+ containers >= 0.3.0.0, gtk >= 0.12.0, derive, binary, text >= 0.7.1.0, proc >= 0.0.8, filepath exposed-modules: Manatee.Extension.ProcessManager