66use crate :: header:: Header ;
77use crate :: platform:: get_numa_nodes;
88use crate :: tui:: stat:: { CpuValueMode , TuiStat } ;
9- use crate :: { selected_fields, ProcList , Settings } ;
9+ use crate :: Filter :: { EUser , User } ;
10+ use crate :: { selected_fields, try_into_uid, ProcList , Settings } ;
1011use ratatui:: crossterm:: event:: { Event , KeyCode , KeyEvent , KeyModifiers } ;
1112use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1213use std:: sync:: RwLock ;
@@ -20,6 +21,8 @@ pub(crate) enum InputMode {
2021pub ( crate ) enum InputEvent {
2122 MaxListDisplay ,
2223 NumaNode ,
24+ FilterUser ,
25+ FilterEUser ,
2326}
2427
2528macro_rules! char {
@@ -106,6 +109,22 @@ pub fn handle_input(
106109 stat. cpu_graph_mode = stat. cpu_graph_mode . next ( ) ;
107110 should_update. store ( true , Ordering :: Relaxed ) ;
108111 }
112+ char !( 'U' ) => {
113+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
114+ stat. input_label = "Which user (blank for all) " . into ( ) ;
115+ stat. input_value . clear ( ) ;
116+ stat. input_mode = InputMode :: Input ( InputEvent :: FilterUser ) ;
117+
118+ should_update. store ( true , Ordering :: Relaxed ) ;
119+ }
120+ char !( 'u' ) => {
121+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
122+ stat. input_label = "Which user (blank for all) " . into ( ) ;
123+ stat. input_value . clear ( ) ;
124+ stat. input_mode = InputMode :: Input ( InputEvent :: FilterEUser ) ;
125+
126+ should_update. store ( true , Ordering :: Relaxed ) ;
127+ }
109128 char !( 'x' ) => {
110129 let mut stat = tui_stat. write ( ) . unwrap ( ) ;
111130 stat. highlight_sorted = !stat. highlight_sorted ;
@@ -246,7 +265,7 @@ pub fn handle_input(
246265 if let Event :: Key ( key) = e {
247266 match key. code {
248267 KeyCode :: Enter => {
249- handle_input_value ( input_event, tui_stat, data, should_update) ;
268+ handle_input_value ( input_event, settings , tui_stat, data, should_update) ;
250269 }
251270 KeyCode :: Esc => {
252271 let mut stat = tui_stat. write ( ) . unwrap ( ) ;
@@ -273,6 +292,7 @@ pub fn handle_input(
273292
274293fn handle_input_value (
275294 input_event : InputEvent ,
295+ settings : & Settings ,
276296 tui_stat : & RwLock < TuiStat > ,
277297 data : & RwLock < ( Header , ProcList ) > ,
278298 should_update : & AtomicBool ,
@@ -315,5 +335,40 @@ fn handle_input_value(
315335 data. write ( ) . unwrap ( ) . 0 . update_cpu ( & stat) ;
316336 should_update. store ( true , Ordering :: Relaxed ) ;
317337 }
338+ InputEvent :: FilterUser | InputEvent :: FilterEUser => {
339+ let input_value = { tui_stat. read ( ) . unwrap ( ) . input_value . clone ( ) } ;
340+ if input_value. is_empty ( ) {
341+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
342+ stat. filter = None ;
343+ data. write ( ) . unwrap ( ) . 1 = ProcList :: new ( settings, & stat) ;
344+ stat. reset_input ( ) ;
345+ should_update. store ( true , Ordering :: Relaxed ) ;
346+ return ;
347+ }
348+ let user = match try_into_uid ( & input_value) {
349+ Ok ( user) => user,
350+ Err ( _) => {
351+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
352+ stat. reset_input ( ) ;
353+ stat. input_error = Some ( " invalid user " . into ( ) ) ;
354+ should_update. store ( true , Ordering :: Relaxed ) ;
355+ return ;
356+ }
357+ } ;
358+
359+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
360+ match input_event {
361+ InputEvent :: FilterUser => {
362+ stat. filter = Some ( User ( user) ) ;
363+ }
364+ InputEvent :: FilterEUser => {
365+ stat. filter = Some ( EUser ( user) ) ;
366+ }
367+ _ => { }
368+ }
369+ data. write ( ) . unwrap ( ) . 1 = ProcList :: new ( settings, & stat) ;
370+ stat. reset_input ( ) ;
371+ should_update. store ( true , Ordering :: Relaxed ) ;
372+ }
318373 }
319374}
0 commit comments