packages feed

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 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