diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b55f9226..bf5223146 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: run: | apt update apt install -y libgala-dev libgee-0.8-dev libglib2.0-dev libgranite-7-dev libgtk-4-dev libadwaita-1-dev \ - libdbus-glib-1-dev libgtop2-dev libwingpanel-9-dev libudisks2-dev \ + libdbus-glib-1-dev libgtop2-dev libgudev-1.0-dev libwingpanel-9-dev libudisks2-dev \ libxnvctrl0 libxnvctrl-dev libcurl4-gnutls-dev libflatpak-dev libjson-glib-dev \ liblivechart-2-dev libsystemd-dev libpci-dev \ meson valac sassc git diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2323f76c3..24d717480 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,7 @@ jobs: run: | apt update apt install -y libgala-dev libgee-0.8-dev libglib2.0-dev libgranite-7-dev libgtk-4-dev libadwaita-1-dev \ - libdbus-glib-1-dev libgtop2-dev libwingpanel-9-dev libudisks2-dev \ + libdbus-glib-1-dev libgtop2-dev libgudev-1.0-dev libwingpanel-9-dev libudisks2-dev \ libxnvctrl0 libxnvctrl-dev libcurl4-gnutls-dev libflatpak-dev libjson-glib-dev \ liblivechart-2-dev libpci-dev \ meson valac sassc git \ diff --git a/README.md b/README.md index 2b7cf5066..a4af19750 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ libgtk-4-dev libgee-0.8-dev libgranite-7-dev libgtop2-dev +libgudev-1.0-dev libadwaita-1-dev libudisks2-dev libjson-glib-dev diff --git a/meson.build b/meson.build index 5d7297372..be0995f08 100644 --- a/meson.build +++ b/meson.build @@ -34,6 +34,7 @@ app_dependencies = [ dependency('gio-2.0'), dependency('gobject-2.0'), dependency('libgtop-2.0'), + dependency('gudev-1.0'), dependency('libadwaita-1', version: '>=1.0.0'), dependency('libsystemd'), dependency('gtk4-x11'), diff --git a/src/Resources/Memory.vala b/src/Resources/Memory.vala index bbe4ecb95..ad6906762 100644 --- a/src/Resources/Memory.vala +++ b/src/Resources/Memory.vala @@ -46,7 +46,8 @@ namespace Monitor { public void update () { GTop.get_mem (out mem); - total = (double) (mem.total); + var total_physical_memory = get_total_physical_memory (); + total = (double) (total_physical_memory > 0 ? total_physical_memory : mem.total); used = (double) mem.user; shared = (double) (mem.shared); buffer = (double) (mem.buffer); @@ -54,5 +55,20 @@ namespace Monitor { locked = (double) (mem.locked); } + private uint64 get_total_physical_memory () { + uint64 mem_total = 0; + + GUdev.Client client = new GUdev.Client ({"dmi"}); + GUdev.Device? device = client.query_by_sysfs_path ("/sys/devices/virtual/dmi/id"); + + if (device != null) { + uint64 devices = device.get_property_as_uint64 ("MEMORY_ARRAY_NUM_DEVICES"); + for (int item = 0; item < devices; item++) { + mem_total += device.get_property_as_uint64 ("MEMORY_DEVICE_%d_SIZE".printf (item)); + } + } + + return mem_total; + } } } diff --git a/src/Utils.vala b/src/Utils.vala index e1bb59859..c3e012430 100644 --- a/src/Utils.vala +++ b/src/Utils.vala @@ -6,6 +6,8 @@ namespace Monitor.Utils { const int BITS_IN_BYTES = 8; const int MHZ_IN_GHZ = 1000; + const int IEC_UNIT_BASE = 1024; + const int NON_IEC_UNIT_BASE = 1000; const string NOT_AVAILABLE = (_("N/A")); const string NO_DATA = "\u2014"; @@ -74,6 +76,31 @@ public class Monitor.Utils.Strings { format_size (speed_in_bytes_per_second * BITS_IN_BYTES, BITS | ONLY_UNIT) ); } + + public static string format_memory_size (uint64 size_in_bytes) { + uint64 unit = 1; + while (size_in_bytes >= unit * IEC_UNIT_BASE) { + unit *= IEC_UNIT_BASE; + } + + var size_adjusted_for_non_iec_units = size_in_bytes * NON_IEC_UNIT_BASE / IEC_UNIT_BASE; + + if (size_in_bytes % unit == 0) { + ///TRANSLATORS: The first param is the numeric value of memory size. + ///The second param is the memory size such as "MB" or "GB" for megabytes or gigabytes. + return _("%llu %s").printf ( + size_in_bytes / unit, + format_size (size_adjusted_for_non_iec_units, ONLY_UNIT) + ); + } + + ///TRANSLATORS: The first param is the numeric value (as string) of memory size. + ///The second param is the memory size such as "MB" or "GB" for megabytes or gigabytes. + return _("%s %s").printf ( + format_size (size_in_bytes, IEC_UNITS | ONLY_VALUE), + format_size (size_adjusted_for_non_iec_units, ONLY_UNIT) + ); + } } public class Monitor.Utils.Colors : Object { diff --git a/src/Views/ProcessView/ProcessTreeView/ProcessTreeView.vala b/src/Views/ProcessView/ProcessTreeView/ProcessTreeView.vala index dc790d1d8..71e7eb0ab 100644 --- a/src/Views/ProcessView/ProcessTreeView/ProcessTreeView.vala +++ b/src/Views/ProcessView/ProcessTreeView/ProcessTreeView.vala @@ -130,7 +130,7 @@ public class Monitor.ProcessTreeView : Granite.Bin { var label = (Gtk.Label) cell.child; var item = (ProcessRowData) cell.item; var binding_memory = item.bind_property ("memory", label, "label", SYNC_CREATE, (_, from_val, ref to_val) => { - to_val.set_string (format_size (from_val.get_uint64 () * 1024, IEC_UNITS)); + to_val.set_string (Utils.Strings.format_memory_size (from_val.get_uint64 () * 1024)); return true; }); item.bindings.set ("memory", binding_memory); diff --git a/src/Views/SystemView/SystemMemoryView.vala b/src/Views/SystemView/SystemMemoryView.vala index ce568151e..57925ecf0 100644 --- a/src/Views/SystemView/SystemMemoryView.vala +++ b/src/Views/SystemView/SystemMemoryView.vala @@ -64,16 +64,16 @@ public class Monitor.SystemMemoryView : Monitor.WidgetResource { // memory_chart.update (3, memory.shared_percentage + memory.buffer_percentage + memory.cached_percentage); // memory_chart.update (3, memory.shared_percentage + memory.buffer_percentage + memory.cached_percentage + memory.locked_percentage); - memory_total_label.text = format_size ((uint64) memory.total, IEC_UNITS); - memory_used_label.text = format_size ((uint64) memory.used, IEC_UNITS); - memory_buffered_label.text = format_size ((uint64) memory.buffer, IEC_UNITS); - memory_cached_label.text = format_size ((uint64) memory.cached, IEC_UNITS); - memory_locked_label.text = format_size ((uint64) memory.locked, IEC_UNITS); + memory_total_label.text = Utils.Strings.format_memory_size ((uint64) memory.total); + memory_used_label.text = Utils.Strings.format_memory_size ((uint64) memory.used); + memory_buffered_label.text = Utils.Strings.format_memory_size ((uint64) memory.buffer); + memory_cached_label.text = Utils.Strings.format_memory_size ((uint64) memory.cached); + memory_locked_label.text = Utils.Strings.format_memory_size ((uint64) memory.locked); - memory_shared_label.text = format_size ((uint64) memory.shared, IEC_UNITS); + memory_shared_label.text = Utils.Strings.format_memory_size ((uint64) memory.shared); - swap_total_label.text = format_size ((uint64) swap.total, IEC_UNITS); - swap_used_label.text = format_size ((uint64) swap.used, IEC_UNITS); + swap_total_label.text = Utils.Strings.format_memory_size ((uint64) swap.total); + swap_used_label.text = Utils.Strings.format_memory_size ((uint64) swap.used); } }