Filtering of processes
part of darcs patch Wed Sep 21 20:53:22 EEST 2005 Martin Gasbichler <gasbichl@informatik.uni-tuebingen.de>
This commit is contained in:
parent
fdd47211ac
commit
8e2a6cd437
|
@ -11,6 +11,19 @@
|
|||
(make-unmarked-text-element 'time #f (right-align-string 6 "TIME "))
|
||||
(make-unmarked-text-element 'command #f "COMMAND"))))
|
||||
|
||||
|
||||
(define (column->opertions column)
|
||||
(case column
|
||||
((pid) (values < = > process-info-pid))
|
||||
((ppid) (values < = > process-info-ppid))
|
||||
((user) (values string<? string=? string>?
|
||||
process-info-logname))
|
||||
((time) (values < = > process-info-time))
|
||||
((command) (values string<? string=? string>?
|
||||
process-info-executable))
|
||||
(else
|
||||
(error "unknown column" column))))
|
||||
|
||||
(define (layout-process width p)
|
||||
(cut-to-size
|
||||
width
|
||||
|
@ -39,10 +52,61 @@
|
|||
processes)
|
||||
num-lines)))
|
||||
|
||||
(define (make-filter-window list-viewer entries
|
||||
compare-val select-val)
|
||||
(let* ((vals
|
||||
(delete-duplicates
|
||||
(map select-val entries) compare-val))
|
||||
(val-strings
|
||||
(map display-to-string vals))
|
||||
(max-width
|
||||
(apply max (map string-length val-strings)))
|
||||
(dialog (make-app-window 10 10 (+ 2 max-width) 10)))
|
||||
(app-window-init-curses-win! dialog)
|
||||
(let* ((dialog-win (app-window-curses-win dialog))
|
||||
(select-list
|
||||
(make-select-list
|
||||
(map (lambda (val str)
|
||||
(make-unmarked-text-element
|
||||
val #f str))
|
||||
vals val-strings)
|
||||
7)))
|
||||
|
||||
(define (paint)
|
||||
(werase dialog-win)
|
||||
(box dialog-win
|
||||
(ascii->char 0) (ascii->char 0))
|
||||
(paint-selection-list-at select-list 1 1 dialog-win max-width #t)
|
||||
(wrefresh dialog-win))
|
||||
|
||||
(paint)
|
||||
(lambda (key)
|
||||
(cond ((= key 27)
|
||||
(delete-app-window! dialog)
|
||||
(close-modal-window!)
|
||||
#t)
|
||||
((select-list-key? key)
|
||||
(set! select-list
|
||||
(select-list-handle-key-press select-list key))
|
||||
(paint)
|
||||
#f)
|
||||
((= key 10)
|
||||
(let* ((val (select-list-selected-entry select-list))
|
||||
(new-entries
|
||||
(filter (lambda (entry)
|
||||
(compare-val (select-val entry)
|
||||
val)) entries)))
|
||||
(send list-viewer 'set-entries! new-entries))
|
||||
(delete-app-window! dialog)
|
||||
(close-modal-window!)
|
||||
#t)
|
||||
(else #f))))))
|
||||
|
||||
(define-option 'ps 'kill-key (char->ascii #\k))
|
||||
(define-option 'ps 'refresh-key (char->ascii #\g))
|
||||
(define-option 'ps 'sort-up-key (char->ascii #\s))
|
||||
(define-option 'ps 'sort-down-key (char->ascii #\S))
|
||||
(define-option 'ps 'filter-key (char->ascii #\f))
|
||||
|
||||
(define (make-pps-viewer processes buffer)
|
||||
(let* ((processes processes)
|
||||
|
@ -84,26 +148,24 @@
|
|||
((or (= key (config 'ps 'sort-up-key))
|
||||
(= key (config 'ps 'sort-down-key)))
|
||||
(let ((column (select-line-selected-entry header-line)))
|
||||
(receive (compare-up compare-down select)
|
||||
(case column
|
||||
((pid) (values < > process-info-pid))
|
||||
((ppid) (values < > process-info-ppid))
|
||||
((user) (values string<? string>?
|
||||
process-info-logname))
|
||||
((time) (values < > process-info-time))
|
||||
((command) (values string<? string>?
|
||||
process-info-executable))
|
||||
(else
|
||||
(error "unknown column" column)))
|
||||
(receive (compare-up compare-equal compare-down select)
|
||||
(column->opertions column)
|
||||
(let ((compare (if (= key (config 'ps 'sort-up-key))
|
||||
compare-up
|
||||
compare-down)))
|
||||
(set-processes!
|
||||
(list-sort
|
||||
(lambda (p1 p2)
|
||||
(compare (select p1) (select p2)))
|
||||
processes))
|
||||
(send self 'set-processes!
|
||||
(list-sort
|
||||
(lambda (p1 p2)
|
||||
(compare (select p1) (select p2)))
|
||||
processes))
|
||||
self))))
|
||||
((= key (config 'ps 'filter-key))
|
||||
(receive (compare-up compare-equal compare-down select)
|
||||
(column->opertions
|
||||
(select-line-selected-entry header-line))
|
||||
(set-modal-window!
|
||||
(make-filter-window self processes compare-equal select))
|
||||
self))
|
||||
((= key (config 'ps 'kill-key))
|
||||
(let ((infos
|
||||
(select-list-get-selection select-list)))
|
||||
|
@ -112,7 +174,7 @@
|
|||
(map process-info-pid infos)))
|
||||
self)
|
||||
((= key (config 'ps 'refresh-key))
|
||||
(set-processes! (pps))
|
||||
(send self 'set-processes! (pps))
|
||||
self)
|
||||
((select-list-key? key)
|
||||
(set! select-list
|
||||
|
@ -127,7 +189,19 @@
|
|||
|
||||
((get-selection-as-ref)
|
||||
(make-get-selection-as-ref-method select-list))
|
||||
|
||||
|
||||
((set-entries!)
|
||||
(lambda (self processes)
|
||||
(send self 'set-processes! processes)))
|
||||
|
||||
((set-processes!)
|
||||
(lambda (self new-processes)
|
||||
(set! processes new-processes)
|
||||
(set! select-list
|
||||
(make-process-selection-list
|
||||
(result-buffer-num-cols buffer)
|
||||
(- (result-buffer-num-lines buffer) 1)
|
||||
new-processes))))
|
||||
(else
|
||||
(error "pps-viewer unknown message" message))))))
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
(define-record-type element :element
|
||||
(make-element markable? marked? value painter)
|
||||
element?
|
||||
(markable? element-markable?)
|
||||
(marked? element-marked?)
|
||||
(value element-value)
|
||||
(painter element-painter))
|
||||
|
||||
(define-record-discloser :element
|
||||
(lambda (r)
|
||||
`(element ,(element-marked? r) ,(element-value r))))
|
||||
|
||||
(define (make-unmarked-element value markable? painter)
|
||||
(make-element markable? #f value painter))
|
||||
|
||||
(define (make-marked-element value markable? painter)
|
||||
(make-element markable? #t value painter))
|
||||
|
||||
(define (make-unmarked-text-element value markable? text)
|
||||
(make-unmarked-element value markable? (make-text-painter text)))
|
||||
|
||||
(define (make-marked-text-element value markable? text)
|
||||
(make-marked-element value markable? (make-text-painter text)))
|
||||
|
||||
(define (make-text-painter text)
|
||||
(lambda (win x y width at-cursor? marked?)
|
||||
(if at-cursor?
|
||||
(wattron win (A-REVERSE)))
|
||||
(if marked?
|
||||
(wattron win (A-BOLD)))
|
||||
(mvwaddstr win y x text)
|
||||
(if (or at-cursor? marked?)
|
||||
(wattrset win (A-NORMAL)))
|
||||
(+ x (string-length text))))
|
||||
|
Loading…
Reference in New Issue