From f72c4423d37831cd5e98c21e8e928789d8e37f4b Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Thu, 9 Nov 2017 12:08:06 +0000 Subject: [PATCH 1/9] processes-tagging: add accountsservice dependency --- .gitlab-ci.yml | 2 +- meson.build | 1 + src/meson.build | 3 +- src/vapis/accountsservice.vapi | 132 +++++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 src/vapis/accountsservice.vapi diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05ed1b90..571273a1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ stages: - build before_script: - dnf install -y gcc meson gettext gtk-doc vala gtk3-devel libgtop2-devel - desktop-file-utils + desktop-file-utils accountsservice-devel build-gnome-usage: stage: build script: diff --git a/meson.build b/meson.build index fd39ceaa..e0a9870b 100644 --- a/meson.build +++ b/meson.build @@ -7,6 +7,7 @@ gobject = dependency('gobject-2.0') gio = dependency('gio-2.0') gtk = dependency('gtk+-3.0', version : '>=3.20.10') gtop = dependency('libgtop-2.0', version : '>=2.34.0') +accountsservice = dependency('accountsservice', version: '>= 0.6.40') math = cc.find_library('m') subdir('data') diff --git a/src/meson.build b/src/meson.build index 22a2d8af..82d5f790 100644 --- a/src/meson.build +++ b/src/meson.build @@ -46,6 +46,7 @@ vala_args = [ '--pkg=rg', '--pkg=egg', '--pkg=libgtop-2.0', + '--pkg=accountsservice', '--pkg=config', '--pkg=posix', '--vapidir=' + meson.current_source_dir() + '/vapis'] @@ -56,4 +57,4 @@ usage = executable('gnome-usage', c_args : [ '-DVERSION="' + meson.project_version() + '"', '-DGETTEXT_PACKAGE="gnome-usage"', '-DGNOMELOCALEDIR="' + get_option('prefix') + '/' + get_option('localedir') + '"' ], vala_args: vala_args, install: true, - dependencies : [glib, gobject, gio, gtk, rg, egg, math, gtop]) + dependencies : [glib, gobject, gio, gtk, rg, egg, math, gtop, accountsservice]) diff --git a/src/vapis/accountsservice.vapi b/src/vapis/accountsservice.vapi new file mode 100644 index 00000000..d50e0596 --- /dev/null +++ b/src/vapis/accountsservice.vapi @@ -0,0 +1,132 @@ +/* accountsservice.vapi generated by vapigen, do not modify. */ + +[CCode (cprefix = "Act", gir_namespace = "AccountsService", gir_version = "1.0", lower_case_cprefix = "act_")] +namespace Act { + [CCode (cheader_filename = "act/act.h", type_id = "act_user_get_type ()")] + public class User : GLib.Object { + [CCode (has_construct_function = false)] + protected User (); + public int collate (Act.User user2); + public Act.UserAccountType get_account_type (); + public bool get_automatic_login (); + public unowned string get_email (); + public unowned string get_home_dir (); + public unowned string get_icon_file (); + public unowned string get_language (); + public unowned string get_location (); + public bool get_locked (); + public int get_login_frequency (); + public unowned GLib.Variant get_login_history (); + public int64 get_login_time (); + public uint get_num_sessions (); + public uint get_num_sessions_anywhere (); + public unowned string get_object_path (); + public unowned string get_password_hint (); + public Act.UserPasswordMode get_password_mode (); + public unowned string get_primary_session_id (); + public unowned string get_real_name (); + public unowned string get_shell (); + public uint get_uid (); + public unowned string get_user_name (); + public unowned string get_x_session (); + public bool is_local_account (); + public bool is_logged_in (); + public bool is_logged_in_anywhere (); + public bool is_nonexistent (); + public bool is_system_account (); + public void set_account_type (Act.UserAccountType account_type); + public void set_automatic_login (bool enabled); + public void set_email (string email); + public void set_icon_file (string icon_file); + public void set_language (string language); + public void set_location (string location); + public void set_locked (bool locked); + public void set_password (string password, string hint); + public void set_password_mode (Act.UserPasswordMode password_mode); + public void set_real_name (string real_name); + public void set_user_name (string user_name); + public void set_x_session (string x_session); + public int account_type { get; } + public bool automatic_login { get; } + public string email { get; } + [NoAccessorMethod] + public string home_directory { owned get; } + public string icon_file { get; } + [NoAccessorMethod] + public bool is_loaded { get; } + public string language { get; } + [NoAccessorMethod] + public bool local_account { get; } + public string location { get; } + public bool locked { get; } + public int login_frequency { get; } + public GLib.Variant login_history { get; } + public int64 login_time { get; } + [NoAccessorMethod] + public bool nonexistent { get; } + public string password_hint { get; } + public int password_mode { get; } + public string real_name { get; } + public string shell { get; } + [NoAccessorMethod] + public bool system_account { get; } + public int uid { get; } + public string user_name { get; } + public string x_session { get; } + public signal void changed (); + public signal void sessions_changed (); + } + [CCode (cheader_filename = "act/act.h", type_id = "act_user_manager_get_type ()")] + public class UserManager : GLib.Object { + [CCode (has_construct_function = false)] + protected UserManager (); + public bool activate_user_session (Act.User user); + public Act.User cache_user (string username) throws GLib.Error; + public async Act.User cache_user_async (string username, GLib.Cancellable? cancellable) throws GLib.Error; + public bool can_switch (); + public Act.User create_user (string username, string fullname, Act.UserAccountType accounttype) throws GLib.Error; + public async Act.User create_user_async (string username, string fullname, Act.UserAccountType accounttype, GLib.Cancellable? cancellable) throws GLib.Error; + public bool delete_user (Act.User user, bool remove_files) throws GLib.Error; + public async bool delete_user_async (Act.User user, bool remove_files, GLib.Cancellable? cancellable) throws GLib.Error; + public static unowned Act.UserManager get_default (); + public unowned Act.User get_user (string username); + public unowned Act.User get_user_by_id (uint id); + public bool goto_login_session (); + public GLib.SList list_users (); + public bool no_service (); + public bool uncache_user (string username) throws GLib.Error; + public async bool uncache_user_async (string username, GLib.Cancellable? cancellable) throws GLib.Error; + [NoAccessorMethod] + public void* exclude_usernames_list { get; set; } + [NoAccessorMethod] + public bool has_multiple_users { get; } + [NoAccessorMethod] + public void* include_usernames_list { get; set; } + [NoAccessorMethod] + public bool is_loaded { get; } + public virtual signal void user_added (Act.User user); + public virtual signal void user_changed (Act.User user); + public virtual signal void user_is_logged_in_changed (Act.User user); + public virtual signal void user_removed (Act.User user); + } + [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_ACCOUNT_TYPE_", type_id = "act_user_account_type_get_type ()")] + public enum UserAccountType { + STANDARD, + ADMINISTRATOR + } + [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_PASSWORD_MODE_", type_id = "act_user_password_mode_get_type ()")] + public enum UserPasswordMode { + REGULAR, + SET_AT_LOGIN, + NONE + } + [CCode (cheader_filename = "act/act.h", cprefix = "ACT_USER_MANAGER_ERROR_")] + public errordomain UserManagerError { + FAILED, + USER_EXISTS, + USER_DOES_NOT_EXIST, + PERMISSION_DENIED, + NOT_SUPPORTED; + public static GLib.Quark quark (); + } +} -- GitLab From ae7dd00be63b378a5f59df9c59f0886d31f7aa7b Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Thu, 9 Nov 2017 16:08:00 +0000 Subject: [PATCH 2/9] processes-tagging: introduction of label tags --- data/ui/process-row.ui | 18 ++++++++++++++++++ src/process-row.vala | 9 +++++++++ src/process.vala | 4 +++- src/system-monitor.vala | 27 ++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/data/ui/process-row.ui b/data/ui/process-row.ui index 986adf5c..983436aa 100644 --- a/data/ui/process-row.ui +++ b/data/ui/process-row.ui @@ -55,6 +55,24 @@ 3 + + + True + False + 10 + + + True + + + + + False + True + end + 3 + + False diff --git a/src/process-row.vala b/src/process-row.vala index f8e34ce3..20366b9e 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -31,6 +31,9 @@ namespace Usage [GtkChild] private Gtk.Label title_label; + [GtkChild] + private Gtk.Label user_name_label; + [GtkChild] private Gtk.Label load_label; @@ -66,6 +69,7 @@ namespace Usage show_details(); update_title_label(); + update_user_name_label(); } private void load_icon(string display_name) @@ -112,6 +116,11 @@ namespace Usage update_title_label(); } + private void update_user_name_label() + { + user_name_label.label = process.user_name; + } + private void update_title_label() { if(group) diff --git a/src/process.vala b/src/process.vala index 9dcc6fe5..4ac773d2 100644 --- a/src/process.vala +++ b/src/process.vala @@ -26,6 +26,7 @@ namespace Usage public string cmdline { get; private set; } public string cmdline_parameter { get; private set; } //Isn't parameters as "-p" etc, but parameter for running app, for ex. "--writer' with libreoffice, or "privacy" with gnome-control-center public string display_name { get; private set; } + public string user_name { get; private set; } public double cpu_load { get; set; default = 0; } public double x_cpu_load { get; set; default = 0; } @@ -40,12 +41,13 @@ namespace Usage public bool alive { get; set; default = true; } public ProcessStatus status { get; set; default = ProcessStatus.SLEEPING; } - public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name) + public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name, string user_name) { this.pid = pid; this.cmdline = cmdline; this.cmdline_parameter = cmdline_parameter; this.display_name = display_name; + this.user_name = user_name; } public void update_from_process(Process process) diff --git a/src/system-monitor.vala b/src/system-monitor.vala index 7a37e28e..fd6c667c 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -138,7 +138,8 @@ namespace Usage string cmdline_parameter; string cmdline = get_full_process_cmd(pids[i], out cmdline_parameter); string display_name = get_display_name(cmdline, cmdline_parameter); - var process = new Process(pids[i], cmdline, cmdline_parameter, display_name); + string user_name = get_user_name(pids[i]); + var process = new Process(pids[i], cmdline, cmdline_parameter, display_name, user_name); cpu_monitor.update_process(ref process); process_table.insert (pids[i], (owned) process); } @@ -180,6 +181,18 @@ namespace Usage return true; } + private string get_user_name(Pid pid) + { + GTop.ProcUid procUid; + GTop.get_proc_uid(out procUid, pid); + + Act.UserManager manager = Act.UserManager.get_default(); + + Act.User user = manager.get_user_by_id(procUid.uid); + //return procUid.uid.to_string(); + return user.get_real_name() ?? "UNAVAILABLE"; + } + private string get_display_name(string cmdline, string cmdline_parameter) { AppInfo app_info = null; @@ -333,7 +346,8 @@ namespace Usage } else //add subrow { - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name); + string user_name = get_user_name(process_it.pid); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); process.update_from_process(process_it); to_table[process.cmdline].sub_processes.insert(process.pid, (owned) process); } @@ -350,11 +364,13 @@ namespace Usage to_table[process_it.cmdline].sub_processes = new HashTable(int_hash, int_equal); unowned Process process = to_table[process_it.cmdline]; - var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name); + string user_name = get_user_name(process.pid); + var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, user_name); sub_process_one.update_from_process(process); to_table[process_it.cmdline].sub_processes.insert(sub_process_one.pid, (owned) sub_process_one); - var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name); + user_name = get_user_name(process_it.pid); + var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); sub_process.update_from_process(process_it); to_table[process_it.cmdline].sub_processes.insert(process_it.pid, (owned) sub_process); } @@ -362,7 +378,8 @@ namespace Usage } else //add process { - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name); + string user_name = get_user_name(process_it.pid); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); process.update_from_process(process_it); to_table.insert(process.cmdline, (owned) process); } -- GitLab From bfe611ac047e2f788ab42dc22ef9ee9ee54812e7 Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Fri, 10 Nov 2017 11:57:52 +0000 Subject: [PATCH 3/9] processes-tagging: user entity added --- src/meson.build | 1 + src/process-row.vala | 2 +- src/process.vala | 6 +++--- src/system-monitor.vala | 30 +++++++++++++----------------- src/user.vala | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 src/user.vala diff --git a/src/meson.build b/src/meson.build index 82d5f790..ad761211 100644 --- a/src/meson.build +++ b/src/meson.build @@ -37,6 +37,7 @@ vala_sources = [ 'sub-process-list-box.vala', 'sub-process-sub-row.vala', 'system-monitor.vala', + 'user.vala', 'utils.vala', 'view.vala', 'window.vala'] diff --git a/src/process-row.vala b/src/process-row.vala index 20366b9e..005a9cb4 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -118,7 +118,7 @@ namespace Usage private void update_user_name_label() { - user_name_label.label = process.user_name; + user_name_label.label = process.user.real_name ?? "UNAVAILABLE"; } private void update_title_label() diff --git a/src/process.vala b/src/process.vala index 4ac773d2..b3334bb8 100644 --- a/src/process.vala +++ b/src/process.vala @@ -26,7 +26,7 @@ namespace Usage public string cmdline { get; private set; } public string cmdline_parameter { get; private set; } //Isn't parameters as "-p" etc, but parameter for running app, for ex. "--writer' with libreoffice, or "privacy" with gnome-control-center public string display_name { get; private set; } - public string user_name { get; private set; } + public User user { get; private set; } public double cpu_load { get; set; default = 0; } public double x_cpu_load { get; set; default = 0; } @@ -41,13 +41,13 @@ namespace Usage public bool alive { get; set; default = true; } public ProcessStatus status { get; set; default = ProcessStatus.SLEEPING; } - public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name, string user_name) + public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name, User user) { this.pid = pid; this.cmdline = cmdline; this.cmdline_parameter = cmdline_parameter; this.display_name = display_name; - this.user_name = user_name; + this.user = user; } public void update_from_process(Process process) diff --git a/src/system-monitor.vala b/src/system-monitor.vala index fd6c667c..08be5923 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -138,8 +138,8 @@ namespace Usage string cmdline_parameter; string cmdline = get_full_process_cmd(pids[i], out cmdline_parameter); string display_name = get_display_name(cmdline, cmdline_parameter); - string user_name = get_user_name(pids[i]); - var process = new Process(pids[i], cmdline, cmdline_parameter, display_name, user_name); + User user = get_user(pids[i]); + var process = new Process(pids[i], cmdline, cmdline_parameter, display_name, user); cpu_monitor.update_process(ref process); process_table.insert (pids[i], (owned) process); } @@ -181,16 +181,12 @@ namespace Usage return true; } - private string get_user_name(Pid pid) + private User get_user(Pid pid) { GTop.ProcUid procUid; GTop.get_proc_uid(out procUid, pid); - - Act.UserManager manager = Act.UserManager.get_default(); - - Act.User user = manager.get_user_by_id(procUid.uid); - //return procUid.uid.to_string(); - return user.get_real_name() ?? "UNAVAILABLE"; + Act.User user = Act.UserManager.get_default().get_user_by_id(procUid.uid); + return new User(user.get_uid(), user.get_real_name(), user.is_local_account()); } private string get_display_name(string cmdline, string cmdline_parameter) @@ -346,8 +342,8 @@ namespace Usage } else //add subrow { - string user_name = get_user_name(process_it.pid); - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); + User user = get_user(process_it.pid); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); process.update_from_process(process_it); to_table[process.cmdline].sub_processes.insert(process.pid, (owned) process); } @@ -364,13 +360,13 @@ namespace Usage to_table[process_it.cmdline].sub_processes = new HashTable(int_hash, int_equal); unowned Process process = to_table[process_it.cmdline]; - string user_name = get_user_name(process.pid); - var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, user_name); + User user = get_user(process.pid); + var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, user); sub_process_one.update_from_process(process); to_table[process_it.cmdline].sub_processes.insert(sub_process_one.pid, (owned) sub_process_one); - user_name = get_user_name(process_it.pid); - var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); + user = get_user(process_it.pid); + var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); sub_process.update_from_process(process_it); to_table[process_it.cmdline].sub_processes.insert(process_it.pid, (owned) sub_process); } @@ -378,8 +374,8 @@ namespace Usage } else //add process { - string user_name = get_user_name(process_it.pid); - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user_name); + User user = get_user(process_it.pid); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); process.update_from_process(process_it); to_table.insert(process.cmdline, (owned) process); } diff --git a/src/user.vala b/src/user.vala new file mode 100644 index 00000000..c54fa7c0 --- /dev/null +++ b/src/user.vala @@ -0,0 +1,37 @@ +/* user.vala + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: Lukasz Kolodziejczyk + */ + +namespace Usage +{ + public class User : Object + { + public uint? uid { get; private set; } + public string? real_name { get; private set; } + public bool? is_local_account { get; private set; } + + public User(uint? uid, string? real_name, bool? is_local_account) + { + this.uid = uid; + this.real_name = real_name; + this.is_local_account = is_local_account; + } + + } +} -- GitLab From 2f4cdaa9d9fc0a226db3ced240f7bb3825abc6b8 Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Fri, 10 Nov 2017 12:08:41 +0000 Subject: [PATCH 4/9] processes-tagging: discriminate between users --- src/process-row.vala | 24 +++++++++++++++++++++++- src/system-monitor.vala | 2 +- src/user.vala | 12 +++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/process-row.vala b/src/process-row.vala index 005a9cb4..4ebed985 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -118,7 +118,29 @@ namespace Usage private void update_user_name_label() { - user_name_label.label = process.user.real_name ?? "UNAVAILABLE"; + if(process.user.real_name != null) + { + if(process.user.is_local_account) + { + if(process.user.is_logged_in()) + { + user_name_label.label = "CURRENT USER"; + } + else + { + user_name_label.label = process.user.real_name; + } + } + else + { + //user_name_label.label = process.user.real_name; + user_name_label.label = "ROOT"; + } + } + else + { + user_name_label.label = "UNAVAILABLE"; + } } private void update_title_label() diff --git a/src/system-monitor.vala b/src/system-monitor.vala index 08be5923..9cc15613 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -186,7 +186,7 @@ namespace Usage GTop.ProcUid procUid; GTop.get_proc_uid(out procUid, pid); Act.User user = Act.UserManager.get_default().get_user_by_id(procUid.uid); - return new User(user.get_uid(), user.get_real_name(), user.is_local_account()); + return new User(user.get_uid(), user.get_user_name(), user.get_real_name(), user.is_local_account()); } private string get_display_name(string cmdline, string cmdline_parameter) diff --git a/src/user.vala b/src/user.vala index c54fa7c0..4d1ded69 100644 --- a/src/user.vala +++ b/src/user.vala @@ -23,15 +23,25 @@ namespace Usage public class User : Object { public uint? uid { get; private set; } + public string? user_name { get; private set; } public string? real_name { get; private set; } public bool? is_local_account { get; private set; } - public User(uint? uid, string? real_name, bool? is_local_account) + public User(uint? uid, string? user_name, string? real_name, bool? is_local_account) { this.uid = uid; + this.user_name = user_name; this.real_name = real_name; this.is_local_account = is_local_account; } + public bool is_logged_in() + { + if(user_name != null) + { + return user_name == GLib.Environment.get_user_name(); + } + return false; + } } } -- GitLab From 175daff103475bd26bdda63917d40a74680dba4c Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Fri, 10 Nov 2017 15:22:22 +0000 Subject: [PATCH 5/9] processes-tagging: css styles added --- data/interface/adwaita.css | 19 +++++++++++++++++++ data/ui/process-row.ui | 7 +++++-- src/process-row.vala | 28 ++++++++++++++++++---------- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/data/interface/adwaita.css b/data/interface/adwaita.css index b033dd09..ccdda4bf 100644 --- a/data/interface/adwaita.css +++ b/data/interface/adwaita.css @@ -133,3 +133,22 @@ row.folders, list.folders { box.storage { background-color: #ffffff; } + +.tag { + border-style: none; + border-radius: 3px; + padding: 3px 6px; + color: @theme_base_color; +} + +.tag.tag-root { + background-color: red; +} + +.tag.tag-other-user { + background: alpha(@theme_fg_color, 0.4); +} + +.tag.tag-unavailable { + background-color: orange; +} diff --git a/data/ui/process-row.ui b/data/ui/process-row.ui index 983436aa..bdfced3f 100644 --- a/data/ui/process-row.ui +++ b/data/ui/process-row.ui @@ -56,10 +56,13 @@ - - True + + False False 10 + True diff --git a/src/process-row.vala b/src/process-row.vala index 4ebed985..0d4be7d6 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -31,6 +31,9 @@ namespace Usage [GtkChild] private Gtk.Label title_label; + [GtkChild] + private Gtk.Box user_name_box; + [GtkChild] private Gtk.Label user_name_label; @@ -118,28 +121,33 @@ namespace Usage private void update_user_name_label() { - if(process.user.real_name != null) + if(process.user.real_name != null) // User info available { - if(process.user.is_local_account) + if(process.user.is_local_account) // regular users { - if(process.user.is_logged_in()) + if(process.user.is_logged_in()) // current user { - user_name_label.label = "CURRENT USER"; + user_name_box.visible = false; } - else + else // other regular users { + user_name_box.visible = true; + user_name_box.get_style_context().add_class("tag-other-user"); user_name_label.label = process.user.real_name; } } - else + else // system users (marked as root) { - //user_name_label.label = process.user.real_name; - user_name_label.label = "ROOT"; + user_name_box.visible = true; + user_name_box.get_style_context().add_class("tag-root"); + user_name_label.label = "root"; } } - else + else // User info not available { - user_name_label.label = "UNAVAILABLE"; + user_name_box.visible = true; + user_name_box.get_style_context().add_class("tag-unavailable"); + user_name_label.label = "unavailable"; } } -- GitLab From 0e33330e640bc24dd0399e5981087114bec8f7ab Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Mon, 13 Nov 2017 12:53:46 +0000 Subject: [PATCH 6/9] processes-tagging: bindings added; naming improvement --- data/interface/adwaita.css | 2 +- data/ui/process-row.ui | 4 ++-- src/process-row.vala | 40 +++++++++++++++----------------------- src/user.vala | 19 +++++++++--------- 4 files changed, 29 insertions(+), 36 deletions(-) diff --git a/data/interface/adwaita.css b/data/interface/adwaita.css index ccdda4bf..bc94ca5c 100644 --- a/data/interface/adwaita.css +++ b/data/interface/adwaita.css @@ -145,7 +145,7 @@ box.storage { background-color: red; } -.tag.tag-other-user { +.tag.tag-user { background: alpha(@theme_fg_color, 0.4); } diff --git a/data/ui/process-row.ui b/data/ui/process-row.ui index bdfced3f..0f702776 100644 --- a/data/ui/process-row.ui +++ b/data/ui/process-row.ui @@ -56,7 +56,7 @@ - + False False 10 @@ -64,7 +64,7 @@ - + True diff --git a/src/process-row.vala b/src/process-row.vala index 0d4be7d6..ba3560bd 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -32,10 +32,10 @@ namespace Usage private Gtk.Label title_label; [GtkChild] - private Gtk.Box user_name_box; + private Gtk.Box user_tag_box; [GtkChild] - private Gtk.Label user_name_label; + private Gtk.Label user_tag_label; [GtkChild] private Gtk.Label load_label; @@ -72,7 +72,7 @@ namespace Usage show_details(); update_title_label(); - update_user_name_label(); + update_user_tag(); } private void load_icon(string display_name) @@ -119,35 +119,27 @@ namespace Usage update_title_label(); } - private void update_user_name_label() + private void update_user_tag() { - if(process.user.real_name != null) // User info available + user_tag_box.visible = true; + if(process.user.is_available) // user info available { - if(process.user.is_local_account) // regular users + if(process.user.is_local_account) // regular user { - if(process.user.is_logged_in()) // current user - { - user_name_box.visible = false; - } - else // other regular users - { - user_name_box.visible = true; - user_name_box.get_style_context().add_class("tag-other-user"); - user_name_label.label = process.user.real_name; - } + process.user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); + user_tag_box.get_style_context().add_class("tag-user"); } - else // system users (marked as root) + else // system user { - user_name_box.visible = true; - user_name_box.get_style_context().add_class("tag-root"); - user_name_label.label = "root"; + user_tag_box.get_style_context().add_class("tag-root"); + user_tag_label.label = "root"; } } - else // User info not available + else // user info not available { - user_name_box.visible = true; - user_name_box.get_style_context().add_class("tag-unavailable"); - user_name_label.label = "unavailable"; + user_tag_box.get_style_context().add_class("tag-unavailable"); + user_tag_label.label = "unavailable"; } } diff --git a/src/user.vala b/src/user.vala index 4d1ded69..eea4c9d0 100644 --- a/src/user.vala +++ b/src/user.vala @@ -26,6 +26,16 @@ namespace Usage public string? user_name { get; private set; } public string? real_name { get; private set; } public bool? is_local_account { get; private set; } + public bool is_logged_in { + get { + return user_name != null && user_name == GLib.Environment.get_user_name(); + } + } + public bool is_available { + get { + return real_name != null; + } + } public User(uint? uid, string? user_name, string? real_name, bool? is_local_account) { @@ -34,14 +44,5 @@ namespace Usage this.real_name = real_name; this.is_local_account = is_local_account; } - - public bool is_logged_in() - { - if(user_name != null) - { - return user_name == GLib.Environment.get_user_name(); - } - return false; - } } } -- GitLab From 27e51f8a5f3016716b92bc804767fdf9efea8605 Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Tue, 14 Nov 2017 11:42:20 +0000 Subject: [PATCH 7/9] processes-tagging: User class as decorator; "unavailable" tag removed --- data/interface/adwaita.css | 4 ---- src/process-row.vala | 22 +++++++--------------- src/system-monitor.vala | 14 +++++--------- src/user.vala | 23 ++++++++--------------- 4 files changed, 20 insertions(+), 43 deletions(-) diff --git a/data/interface/adwaita.css b/data/interface/adwaita.css index bc94ca5c..3a94a146 100644 --- a/data/interface/adwaita.css +++ b/data/interface/adwaita.css @@ -148,7 +148,3 @@ box.storage { .tag.tag-user { background: alpha(@theme_fg_color, 0.4); } - -.tag.tag-unavailable { - background-color: orange; -} diff --git a/src/process-row.vala b/src/process-row.vala index ba3560bd..4b64a382 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -122,24 +122,16 @@ namespace Usage private void update_user_tag() { user_tag_box.visible = true; - if(process.user.is_available) // user info available + if(process.user.is_local_account) // regular user { - if(process.user.is_local_account) // regular user - { - process.user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); - process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); - user_tag_box.get_style_context().add_class("tag-user"); - } - else // system user - { - user_tag_box.get_style_context().add_class("tag-root"); - user_tag_label.label = "root"; - } + process.user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); + user_tag_box.get_style_context().add_class("tag-user"); } - else // user info not available + else // system user { - user_tag_box.get_style_context().add_class("tag-unavailable"); - user_tag_label.label = "unavailable"; + user_tag_box.get_style_context().add_class("tag-root"); + user_tag_label.label = "root"; } } diff --git a/src/system-monitor.vala b/src/system-monitor.vala index 9cc15613..8444066b 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -186,7 +186,7 @@ namespace Usage GTop.ProcUid procUid; GTop.get_proc_uid(out procUid, pid); Act.User user = Act.UserManager.get_default().get_user_by_id(procUid.uid); - return new User(user.get_uid(), user.get_user_name(), user.get_real_name(), user.is_local_account()); + return new User(user); } private string get_display_name(string cmdline, string cmdline_parameter) @@ -342,8 +342,7 @@ namespace Usage } else //add subrow { - User user = get_user(process_it.pid); - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); process.update_from_process(process_it); to_table[process.cmdline].sub_processes.insert(process.pid, (owned) process); } @@ -360,13 +359,11 @@ namespace Usage to_table[process_it.cmdline].sub_processes = new HashTable(int_hash, int_equal); unowned Process process = to_table[process_it.cmdline]; - User user = get_user(process.pid); - var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, user); + var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, process.user); sub_process_one.update_from_process(process); to_table[process_it.cmdline].sub_processes.insert(sub_process_one.pid, (owned) sub_process_one); - user = get_user(process_it.pid); - var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); + var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); sub_process.update_from_process(process_it); to_table[process_it.cmdline].sub_processes.insert(process_it.pid, (owned) sub_process); } @@ -374,8 +371,7 @@ namespace Usage } else //add process { - User user = get_user(process_it.pid); - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, user); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); process.update_from_process(process_it); to_table.insert(process.cmdline, (owned) process); } diff --git a/src/user.vala b/src/user.vala index eea4c9d0..b9e3dc17 100644 --- a/src/user.vala +++ b/src/user.vala @@ -22,27 +22,20 @@ namespace Usage { public class User : Object { - public uint? uid { get; private set; } - public string? user_name { get; private set; } - public string? real_name { get; private set; } - public bool? is_local_account { get; private set; } + private Act.User _user; + public uint uid { get { return _user.get_uid(); }} + public string user_name { get { return _user.get_user_name(); }} + public string real_name { get { return _user.get_real_name(); }} + public bool is_local_account { get { return _user.is_local_account(); }} public bool is_logged_in { get { - return user_name != null && user_name == GLib.Environment.get_user_name(); - } - } - public bool is_available { - get { - return real_name != null; + return user_name == GLib.Environment.get_user_name(); } } - public User(uint? uid, string? user_name, string? real_name, bool? is_local_account) + public User(Act.User user) { - this.uid = uid; - this.user_name = user_name; - this.real_name = real_name; - this.is_local_account = is_local_account; + this._user = user; } } } -- GitLab From f3b427406d14b7a2a0d178016a0e753663d709ad Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Tue, 14 Nov 2017 16:21:59 +0000 Subject: [PATCH 8/9] processes-tagging: system tags added; all processes taken into account (GTop.KERN_PROC_ALL) --- data/interface/adwaita.css | 4 ++++ src/process-row.vala | 17 ++++++++++++++--- src/system-monitor.vala | 2 +- src/user.vala | 6 ++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/data/interface/adwaita.css b/data/interface/adwaita.css index 3a94a146..ead82a46 100644 --- a/data/interface/adwaita.css +++ b/data/interface/adwaita.css @@ -145,6 +145,10 @@ box.storage { background-color: red; } +.tag.tag-system { + background-color: orange; +} + .tag.tag-user { background: alpha(@theme_fg_color, 0.4); } diff --git a/src/process-row.vala b/src/process-row.vala index 4b64a382..7079bde3 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -121,17 +121,28 @@ namespace Usage private void update_user_tag() { + if(!process.user.is_loaded) // prevent displaying a tag before user is loaded + { + return; + } + user_tag_box.visible = true; + process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); if(process.user.is_local_account) // regular user { process.user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); - process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); user_tag_box.get_style_context().add_class("tag-user"); } else // system user { - user_tag_box.get_style_context().add_class("tag-root"); - user_tag_label.label = "root"; + if(process.user.is_root) // root user + { + user_tag_box.get_style_context().add_class("tag-root"); + } + else // other system user + { + user_tag_box.get_style_context().add_class("tag-system"); + } } } diff --git a/src/system-monitor.vala b/src/system-monitor.vala index 8444066b..a4783086 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -37,7 +37,7 @@ namespace Usage private HashTable cpu_process_table; private HashTable ram_process_table; - private int process_mode = GTop.EXCLUDE_SYSTEM; + private int process_mode = GTop.KERN_PROC_ALL; private GLib.List apps_info; private static SystemMonitor system_monitor; diff --git a/src/user.vala b/src/user.vala index b9e3dc17..eefa4823 100644 --- a/src/user.vala +++ b/src/user.vala @@ -27,11 +27,17 @@ namespace Usage public string user_name { get { return _user.get_user_name(); }} public string real_name { get { return _user.get_real_name(); }} public bool is_local_account { get { return _user.is_local_account(); }} + public bool is_loaded { get { return _user.is_loaded; }} public bool is_logged_in { get { return user_name == GLib.Environment.get_user_name(); } } + public bool is_root { + get { + return uid == 0; + } + } public User(Act.User user) { -- GitLab From 17ad3102a86569306239dcbef8fd620d05ac0e9c Mon Sep 17 00:00:00 2001 From: Lukasz Kolodziejczyk Date: Wed, 15 Nov 2017 15:40:53 +0000 Subject: [PATCH 9/9] processes-tagging: async users feching moved from system-monitor to User class --- src/process-row.vala | 28 ++++++++++++++++------- src/process.vala | 6 ++--- src/system-monitor.vala | 21 +++++++++--------- src/user.vala | 49 ++++++++++++++++++++++++++++++++--------- 4 files changed, 72 insertions(+), 32 deletions(-) diff --git a/src/process-row.vala b/src/process-row.vala index 7079bde3..26ae4c71 100644 --- a/src/process-row.vala +++ b/src/process-row.vala @@ -46,6 +46,7 @@ namespace Usage [GtkChild] private SubProcessListBox sub_process_list_box; + private User user; public Process process { get; private set; } public bool showing_details { get; private set; } public bool max_usage { get; private set; } @@ -72,7 +73,7 @@ namespace Usage show_details(); update_title_label(); - update_user_tag(); + update_user(); } private void load_icon(string display_name) @@ -119,23 +120,34 @@ namespace Usage update_title_label(); } - private void update_user_tag() + private void update_user() { - if(!process.user.is_loaded) // prevent displaying a tag before user is loaded + user = new User(process.uid); + if(user.available) + { + update_user_tag(); + } + else { - return; + user.notify["available"].connect(() => { + update_user_tag(); + }); } + } + private void update_user_tag() + { user_tag_box.visible = true; - process.user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE); - if(process.user.is_local_account) // regular user + user.bind_property("real_name", user_tag_label, "label", BindingFlags.SYNC_CREATE ); + + if(user.is_local_account) // regular user { - process.user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); + user.bind_property("is_logged_in", user_tag_box, "visible", BindingFlags.SYNC_CREATE | BindingFlags.INVERT_BOOLEAN); user_tag_box.get_style_context().add_class("tag-user"); } else // system user { - if(process.user.is_root) // root user + if(user.is_root) // root user { user_tag_box.get_style_context().add_class("tag-root"); } diff --git a/src/process.vala b/src/process.vala index b3334bb8..478ad334 100644 --- a/src/process.vala +++ b/src/process.vala @@ -26,7 +26,7 @@ namespace Usage public string cmdline { get; private set; } public string cmdline_parameter { get; private set; } //Isn't parameters as "-p" etc, but parameter for running app, for ex. "--writer' with libreoffice, or "privacy" with gnome-control-center public string display_name { get; private set; } - public User user { get; private set; } + public uint uid { get; private set; } public double cpu_load { get; set; default = 0; } public double x_cpu_load { get; set; default = 0; } @@ -41,13 +41,13 @@ namespace Usage public bool alive { get; set; default = true; } public ProcessStatus status { get; set; default = ProcessStatus.SLEEPING; } - public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name, User user) + public Process(Pid pid, string cmdline, string cmdline_parameter, string display_name, uint uid) { this.pid = pid; this.cmdline = cmdline; this.cmdline_parameter = cmdline_parameter; this.display_name = display_name; - this.user = user; + this.uid = uid; } public void update_from_process(Process process) diff --git a/src/system-monitor.vala b/src/system-monitor.vala index a4783086..c968cdc0 100644 --- a/src/system-monitor.vala +++ b/src/system-monitor.vala @@ -138,8 +138,8 @@ namespace Usage string cmdline_parameter; string cmdline = get_full_process_cmd(pids[i], out cmdline_parameter); string display_name = get_display_name(cmdline, cmdline_parameter); - User user = get_user(pids[i]); - var process = new Process(pids[i], cmdline, cmdline_parameter, display_name, user); + uint uid = get_uid(pids[i]); + var process = new Process(pids[i], cmdline, cmdline_parameter, display_name, uid); cpu_monitor.update_process(ref process); process_table.insert (pids[i], (owned) process); } @@ -181,13 +181,12 @@ namespace Usage return true; } - private User get_user(Pid pid) - { + private uint get_uid(Pid pid) + { GTop.ProcUid procUid; GTop.get_proc_uid(out procUid, pid); - Act.User user = Act.UserManager.get_default().get_user_by_id(procUid.uid); - return new User(user); - } + return procUid.uid; + } private string get_display_name(string cmdline, string cmdline_parameter) { @@ -342,7 +341,7 @@ namespace Usage } else //add subrow { - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.uid); process.update_from_process(process_it); to_table[process.cmdline].sub_processes.insert(process.pid, (owned) process); } @@ -359,11 +358,11 @@ namespace Usage to_table[process_it.cmdline].sub_processes = new HashTable(int_hash, int_equal); unowned Process process = to_table[process_it.cmdline]; - var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, process.user); + var sub_process_one = new Process(process.pid, process.cmdline, process.cmdline_parameter, process.display_name, process.uid); sub_process_one.update_from_process(process); to_table[process_it.cmdline].sub_processes.insert(sub_process_one.pid, (owned) sub_process_one); - var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); + var sub_process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.uid); sub_process.update_from_process(process_it); to_table[process_it.cmdline].sub_processes.insert(process_it.pid, (owned) sub_process); } @@ -371,7 +370,7 @@ namespace Usage } else //add process { - var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.user); + var process = new Process(process_it.pid, process_it.cmdline, process_it.cmdline_parameter, process_it.display_name, process_it.uid); process.update_from_process(process_it); to_table.insert(process.cmdline, (owned) process); } diff --git a/src/user.vala b/src/user.vala index eefa4823..cf43de11 100644 --- a/src/user.vala +++ b/src/user.vala @@ -22,26 +22,55 @@ namespace Usage { public class User : Object { + private static Act.UserManager user_manager; + private static bool user_manager_available; + private Act.User _user; - public uint uid { get { return _user.get_uid(); }} + + public bool available { get; private set; } + public uint uid { get; private set; } public string user_name { get { return _user.get_user_name(); }} public string real_name { get { return _user.get_real_name(); }} public bool is_local_account { get { return _user.is_local_account(); }} public bool is_loaded { get { return _user.is_loaded; }} - public bool is_logged_in { - get { - return user_name == GLib.Environment.get_user_name(); + public bool is_logged_in { get { return user_name == GLib.Environment.get_user_name(); }} + public bool is_root { get { return uid == 0; }} + + class construct { + user_manager = Act.UserManager.get_default(); + if(user_manager.is_loaded) + { + User.user_manager_available = true; } - } - public bool is_root { - get { - return uid == 0; + else + { + user_manager.notify["is-loaded"].connect(() => { + User.user_manager_available = true; + }); } } - public User(Act.User user) + public User(uint uid) { - this._user = user; + this.uid = uid; + + if(user_manager_available) + { + _user = user_manager.get_user_by_id(uid); + if(_user.is_loaded) + { + available = true; + } + else + { + _user.notify["is-loaded"].connect(() => { + available = true; + }); + } + } } + + + } } -- GitLab