@@ -30,6 +30,10 @@ pub(crate) enum InputEvent {
3030 ReniceProc ,
3131 #[ cfg( target_os = "linux" ) ]
3232 ReniceValue ,
33+ #[ cfg( unix) ]
34+ KillProc ,
35+ #[ cfg( unix) ]
36+ KillSignal ,
3337}
3438
3539macro_rules! char {
@@ -169,6 +173,25 @@ pub fn handle_input(
169173 }
170174 should_update. store ( true , Ordering :: Relaxed ) ;
171175 }
176+ #[ cfg( unix) ]
177+ char !( 'k' ) => {
178+ let data = data. read ( ) . unwrap ( ) ;
179+ let mut tui_stat = tui_stat. write ( ) . unwrap ( ) ;
180+ let mut nth = tui_stat. list_offset ;
181+ if data. 1 . collected . is_empty ( ) {
182+ return false ;
183+ }
184+ if data. 1 . collected . len ( ) <= nth {
185+ nth = data. 1 . collected . len ( ) - 1 ;
186+ }
187+ let pid = data. 1 . collected [ nth] . 0 ;
188+ tui_stat. input_value . clear ( ) ;
189+ tui_stat. input_label = format ! ( "PID to signal/kill [default pid = {}]" , pid) ;
190+ tui_stat. selected_process = Some ( pid) ;
191+ tui_stat. input_mode = InputMode :: Input ( InputEvent :: KillProc ) ;
192+
193+ should_update. store ( true , Ordering :: Relaxed ) ;
194+ }
172195 char !( 'l' ) => {
173196 let mut stat = tui_stat. write ( ) . unwrap ( ) ;
174197 stat. show_load_avg = !stat. show_load_avg ;
@@ -607,5 +630,52 @@ fn handle_input_value(
607630 }
608631 should_update. store ( true , Ordering :: Relaxed ) ;
609632 }
633+ #[ cfg( unix) ]
634+ InputEvent :: KillProc => {
635+ let input_value = { tui_stat. read ( ) . unwrap ( ) . input_value . parse :: < u32 > ( ) } ;
636+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
637+ if let Ok ( pid) = input_value {
638+ stat. selected_process = Some ( pid) ;
639+ } else {
640+ let is_empty = stat. input_value . trim ( ) . is_empty ( ) ;
641+ stat. reset_input ( ) ;
642+ if !is_empty {
643+ stat. input_message = Some ( " Unacceptable integer " . into ( ) ) ;
644+ should_update. store ( true , Ordering :: Relaxed ) ;
645+ return ;
646+ }
647+ } ;
648+ stat. input_value . clear ( ) ;
649+ stat. input_label = format ! (
650+ "Send pid {} signal [15/sigterm]" ,
651+ stat. selected_process. unwrap( )
652+ ) ;
653+ stat. input_mode = InputMode :: Input ( InputEvent :: KillSignal ) ;
654+ should_update. store ( true , Ordering :: Relaxed ) ;
655+ }
656+ #[ cfg( unix) ]
657+ InputEvent :: KillSignal => {
658+ use uucore:: signals:: signal_by_name_or_value;
659+ let mut stat = tui_stat. write ( ) . unwrap ( ) ;
660+ stat. input_mode = InputMode :: Command ;
661+ stat. reset_input ( ) ;
662+ let signal = if stat. input_value . is_empty ( ) {
663+ 15
664+ } else if let Some ( sig) = signal_by_name_or_value ( & stat. input_value ) {
665+ sig
666+ } else {
667+ stat. input_message = Some ( " Unacceptable signal value" . into ( ) ) ;
668+ should_update. store ( true , Ordering :: Relaxed ) ;
669+ return ;
670+ } ;
671+ let pid = stat. selected_process . unwrap ( ) ;
672+ if let Err ( e) = crate :: action:: kill_process ( pid, signal) {
673+ stat. input_message = Some ( format ! (
674+ " Failed signal pid {} with {}: {} " ,
675+ pid, signal, e
676+ ) ) ;
677+ }
678+ should_update. store ( true , Ordering :: Relaxed ) ;
679+ }
610680 }
611681}
0 commit comments