From f198c139787965648f6d2a81fb60219c124ea077 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 28 Oct 2019 10:50:57 +0200 Subject: Add locate by pid function Press 'L' to activate --- src/ui/components/processes.rs | 113 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 5 deletions(-) diff --git a/src/ui/components/processes.rs b/src/ui/components/processes.rs index 79988b6..8b7c14f 100644 --- a/src/ui/components/processes.rs +++ b/src/ui/components/processes.rs @@ -181,6 +181,7 @@ pub struct ProcessList { enum ProcessListMode { Normal, Follow(Pid), + Locate(Pid), Kill(u16), } @@ -195,6 +196,13 @@ impl ProcessListMode { _ => false, } } + + fn is_locate(&self) -> bool { + match self { + Locate(_) => true, + _ => false, + } + } } use ProcessListMode::*; @@ -415,6 +423,12 @@ impl ProcessList { { let (fg_color, bg_color) = if pages * height + y_offset == self.cursor { (Color::White, Color::Byte(235)) + } else if let Locate(highlighted_pid) = self.mode { + if highlighted_pid == *pid { + (Color::Red, Color::Yellow) + } else { + (Color::Default, Color::Default) + } } else { (Color::Default, Color::Default) }; @@ -615,6 +629,20 @@ impl Component for ProcessList { pos_inc(upper_left!(area), (0, 1)), set_y(bottom_right!(area), y), )); + } else if let Locate(ref pid) = self.mode { + let (_, y) = write_string_to_grid( + &format!("Highlighting PID == {pid}", pid = pid), + grid, + Color::Default, + Color::Default, + Attr::Bold, + (pos_inc(upper_left!(area), (1, 1)), bottom_right!(area)), + false, + ); + dirty_areas.push_back(( + pos_inc(upper_left!(area), (0, 1)), + set_y(bottom_right!(area), y), + )); } return; @@ -667,6 +695,20 @@ impl Component for ProcessList { pos_inc(upper_left!(area), (0, 1)), set_y(bottom_right!(area), y), )); + } else if let Locate(ref pid) = self.mode { + let (_, y) = write_string_to_grid( + &format!("Highlighting PID == {pid}", pid = pid), + grid, + Color::Default, + Color::Default, + Attr::Bold, + (pos_inc(upper_left!(area), (0, 1)), bottom_right!(area)), + false, + ); + dirty_areas.push_back(( + pos_inc(upper_left!(area), (0, 1)), + set_y(bottom_right!(area), y), + )); } /* Nothing to update */ return; @@ -716,6 +758,18 @@ impl Component for ProcessList { false, ); + upper_left = pos_inc(upper_left, (0, 2)); + } else if let Locate(ref pid) = self.mode { + write_string_to_grid( + &format!("Highlighting PID == {pid}", pid = pid), + grid, + Color::Default, + Color::Default, + Attr::Bold, + (pos_inc(upper_left, (0, 1)), bottom_right), + false, + ); + upper_left = pos_inc(upper_left, (0, 2)); } let cmd_header = self @@ -791,6 +845,12 @@ impl Component for ProcessList { for p in processes.iter().skip(pages * height).take(height) { let (fg_color, bg_color) = if pages * height + y_offset == self.cursor { (Color::White, Color::Byte(235)) + } else if let Locate(highlighted_pid) = self.mode { + if highlighted_pid == p.i { + (Color::Red, Color::Yellow) + } else { + (Color::Default, Color::Default) + } } else { (Color::Default, Color::Default) }; @@ -967,6 +1027,19 @@ impl Component for ProcessList { ); dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right!(area), y))); + upper_left = pos_inc(upper_left, (0, 2)); + } else if let Locate(ref pid) = self.mode { + let (_, y) = write_string_to_grid( + &format!("Highlighting PID == {pid}", pid = pid), + grid, + Color::Default, + Color::Default, + Attr::Bold, + (pos_inc(upper_left, (0, 1)), bottom_right), + false, + ); + dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right!(area), y))); + upper_left = pos_inc(upper_left, (0, 2)); } @@ -977,6 +1050,17 @@ impl Component for ProcessList { get_y(upper_left) + self.cursor + 2 - pages * height, ), ); + let old_pid = self.get_pid_under_cursor(old_cursor); + change_colors(grid, new_area, None, Some(Color::Byte(235))); + let bg_color = if let Locate(highlighted_pid) = self.mode { + if highlighted_pid == old_pid { + Color::Yellow + } else { + Color::Default + } + } else { + Color::Default + }; let old_area = ( pos_inc(upper_left, (0, old_cursor + 2 - old_pages * height)), set_y( @@ -984,8 +1068,7 @@ impl Component for ProcessList { get_y(upper_left) + old_cursor + 2 - old_pages * height, ), ); - change_colors(grid, new_area, None, Some(Color::Byte(235))); - change_colors(grid, old_area, None, Some(Color::Default)); + change_colors(grid, old_area, None, Some(bg_color)); dirty_areas.push_back(old_area); dirty_areas.push_back(new_area); } else if let Follow(ref pid) = self.mode { @@ -999,6 +1082,17 @@ impl Component for ProcessList { false, ); dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); + } else if let Locate(ref pid) = self.mode { + let (_, y) = write_string_to_grid( + &format!("Highlighting PID == {pid}", pid = pid), + grid, + Color::Default, + Color::Default, + Attr::Bold, + (pos_inc(upper_left, (0, 1)), bottom_right), + false, + ); + dirty_areas.push_back((pos_inc(upper_left, (0, 1)), set_y(bottom_right, y))); } if let Kill(ref n) = self.mode { @@ -1149,12 +1243,20 @@ impl Component for ProcessList { } UIEvent::Input(k) if *k == map["freeze updates"] - && (self.mode.is_normal() || self.mode.is_follow()) => + && (self.mode.is_normal() + || self.mode.is_follow() + || self.mode.is_locate()) => { self.freeze = !self.freeze; self.force_redraw = true; self.dirty = true; } + UIEvent::Input(k) if *k == map["locate process by pid"] && self.mode.is_normal() => { + self.mode = Locate(0); + self.freeze = true; + self.dirty = true; + self.force_redraw = true; + } UIEvent::Input(k) if *k == map["kill process"] => { self.mode = Kill(0); self.freeze = true; @@ -1188,7 +1290,7 @@ impl Component for ProcessList { .checked_add(f.to_digit(10).unwrap() as u16) .unwrap_or(*n); } - } else if let Follow(ref mut p) = self.mode { + } else if let Locate(ref mut p) = self.mode { if let Some(add) = (*p).checked_mul(10) { *p = add .checked_add(f.to_digit(10).unwrap() as i32) @@ -1200,7 +1302,7 @@ impl Component for ProcessList { UIEvent::Input(Key::Backspace) if self.mode != Normal => { if let Kill(ref mut n) = self.mode { *n = *n / 10; - } else if let Follow(ref mut p) = self.mode { + } else if let Locate(ref mut p) = self.mode { *p = *p / 10; } self.dirty = true; @@ -1244,6 +1346,7 @@ impl Component for ProcessList { fn get_shortcuts(&self) -> ShortcutMaps { let mut map: ShortcutMap = Default::default(); map.insert("follow process group", Key::Char('F')); + map.insert("locate process by pid", Key::Char('L')); map.insert("freeze updates", Key::Char('f')); map.insert("toggle tree view", Key::Char('t')); map.insert("kill process", Key::Char('k')); -- cgit v1.2.3