@@ -86,6 +86,33 @@ fn get_gpu_process_memory() -> std::collections::HashMap<u32, f64> {
8686 map
8787}
8888
89+ fn friendly_name ( raw : & str ) -> String {
90+ let name = raw. strip_suffix ( ".exe" ) . unwrap_or ( raw) ;
91+ match name. to_lowercase ( ) . as_str ( ) {
92+ "code" => "VS Code" . into ( ) ,
93+ "msedgewebview2" | "msedge" => "Edge" . into ( ) ,
94+ "chrome" => "Chrome" . into ( ) ,
95+ "firefox" => "Firefox" . into ( ) ,
96+ "discord" => "Discord" . into ( ) ,
97+ "slack" => "Slack" . into ( ) ,
98+ "spotify" => "Spotify" . into ( ) ,
99+ "explorer" => "Explorer" . into ( ) ,
100+ "dwm" => "Desktop Window Mgr" . into ( ) ,
101+ "searchhost" => "Windows Search" . into ( ) ,
102+ "runtimebroker" => "Runtime Broker" . into ( ) ,
103+ "memory compression" => "Mem Compression" . into ( ) ,
104+ "windowsterminal" => "Terminal" . into ( ) ,
105+ "powershell" => "PowerShell" . into ( ) ,
106+ "cmd" => "CMD" . into ( ) ,
107+ "claude" => "Claude" . into ( ) ,
108+ "teams" => "Teams" . into ( ) ,
109+ "notion" => "Notion" . into ( ) ,
110+ "obs64" | "obs" => "OBS" . into ( ) ,
111+ "steam" | "steamwebhelper" => "Steam" . into ( ) ,
112+ _ => name. to_string ( ) ,
113+ }
114+ }
115+
89116#[ tauri:: command]
90117fn get_top_processes ( state : State < AppState > , sort_by : String ) -> Vec < ProcessInfo > {
91118 let mut sys = state. sys . lock ( ) . unwrap ( ) ;
@@ -96,18 +123,26 @@ fn get_top_processes(state: State<AppState>, sort_by: String) -> Vec<ProcessInfo
96123 #[ cfg( not( windows) ) ]
97124 let gpu_mem: std:: collections:: HashMap < u32 , f64 > = std:: collections:: HashMap :: new ( ) ;
98125
99- let mut procs: Vec < _ > = sys
100- . processes ( )
101- . values ( )
102- . map ( |p| {
103- let pid = p. pid ( ) . as_u32 ( ) ;
104- ProcessInfo {
105- name : p. name ( ) . to_string_lossy ( ) . to_string ( ) ,
106- cpu_usage : p. cpu_usage ( ) ,
107- memory_mb : p. memory ( ) as f64 / 1_048_576.0 ,
108- gpu_memory_mb : gpu_mem. get ( & pid) . copied ( ) . unwrap_or ( 0.0 ) ,
109- pid,
110- }
126+ // Aggregate by friendly name
127+ let mut aggregated: std:: collections:: HashMap < String , ( f32 , f64 , f64 ) > =
128+ std:: collections:: HashMap :: new ( ) ;
129+ for p in sys. processes ( ) . values ( ) {
130+ let pid = p. pid ( ) . as_u32 ( ) ;
131+ let name = friendly_name ( & p. name ( ) . to_string_lossy ( ) ) ;
132+ let entry = aggregated. entry ( name) . or_insert ( ( 0.0 , 0.0 , 0.0 ) ) ;
133+ entry. 0 += p. cpu_usage ( ) ;
134+ entry. 1 += p. memory ( ) as f64 / 1_048_576.0 ;
135+ entry. 2 += gpu_mem. get ( & pid) . copied ( ) . unwrap_or ( 0.0 ) ;
136+ }
137+
138+ let mut procs: Vec < _ > = aggregated
139+ . into_iter ( )
140+ . map ( |( name, ( cpu, mem, gpu) ) | ProcessInfo {
141+ name,
142+ cpu_usage : cpu,
143+ memory_mb : mem,
144+ gpu_memory_mb : gpu,
145+ pid : 0 ,
111146 } )
112147 . collect ( ) ;
113148
0 commit comments