phosh-arch/gnome-usage-mobile/0002-Add-initial-thermal-view.patch
2024-08-13 08:17:11 -07:00

1048 lines
36 KiB
Diff

From f3c54d6ac42c7131c095205c7a46ccce375f8d18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Mon, 28 Oct 2019 11:05:50 +0100
Subject: [PATCH 2/2] Add initial thermal view
Just thermal zone temperature for now, no cooling devices
---
data/meson.build | 1 +
data/org.gnome.Usage.gresource.xml | 3 +
data/ui/no-gthd-view.ui | 41 +++++++++++
data/ui/thermal-row.ui | 60 +++++++++++++++
data/ui/thermal-view.ui | 60 +++++++++++++++
src/graph-switcher-button.vala | 6 ++
src/meson.build | 9 +++
src/no-gthd-view.vala | 23 ++++++
src/system-monitor.vala | 14 ++++
src/thermal-graph-model.vala | 57 ++++++++++++++
src/thermal-graph-stack-switcher.vala | 96 ++++++++++++++++++++++++
src/thermal-graph.vala | 63 ++++++++++++++++
src/thermal-list-box.vala | 102 ++++++++++++++++++++++++++
src/thermal-monitor.vala | 69 +++++++++++++++++
src/thermal-row.vala | 53 +++++++++++++
src/thermal-sub-view.vala | 85 +++++++++++++++++++++
src/thermal-view.vala | 59 +++++++++++++++
src/window.vala | 1 +
18 files changed, 802 insertions(+)
create mode 100644 data/ui/no-gthd-view.ui
create mode 100644 data/ui/thermal-row.ui
create mode 100644 data/ui/thermal-view.ui
create mode 100644 src/no-gthd-view.vala
create mode 100644 src/thermal-graph-model.vala
create mode 100644 src/thermal-graph-stack-switcher.vala
create mode 100644 src/thermal-graph.vala
create mode 100644 src/thermal-list-box.vala
create mode 100644 src/thermal-monitor.vala
create mode 100644 src/thermal-row.vala
create mode 100644 src/thermal-sub-view.vala
create mode 100644 src/thermal-view.vala
diff --git a/data/meson.build b/data/meson.build
index 03b5f3c..e0a99b9 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -2,6 +2,7 @@ resource_data = files(
'interface/adwaita.css',
'ui/primary-menu.ui',
'ui/memory-speedometer.ui',
+ 'ui/no-gthd-view.ui',
'ui/no-results-found-view.ui',
'ui/performance-view.ui',
'ui/process-row.ui',
diff --git a/data/org.gnome.Usage.gresource.xml b/data/org.gnome.Usage.gresource.xml
index d980239..d7449af 100644
--- a/data/org.gnome.Usage.gresource.xml
+++ b/data/org.gnome.Usage.gresource.xml
@@ -6,6 +6,7 @@
<file preprocess="xml-stripblanks">ui/primary-menu.ui</file>
<file preprocess="xml-stripblanks">ui/loading-notification.ui</file>
<file preprocess="xml-stripblanks">ui/memory-speedometer.ui</file>
+ <file preprocess="xml-stripblanks">ui/no-gthd-view.ui</file>
<file preprocess="xml-stripblanks">ui/no-results-found-view.ui</file>
<file preprocess="xml-stripblanks">ui/performance-view.ui</file>
<file preprocess="xml-stripblanks">ui/quit-process-dialog.ui</file>
@@ -17,5 +18,7 @@
<file preprocess="xml-stripblanks">ui/process-row.ui</file>
<file preprocess="xml-stripblanks">ui/swap-speedometer.ui</file>
<file preprocess="xml-stripblanks">ui/window.ui</file>
+ <file preprocess="xml-stripblanks">ui/thermal-row.ui</file>
+ <file preprocess="xml-stripblanks">ui/thermal-view.ui</file>
</gresource>
</gresources>
diff --git a/data/ui/no-gthd-view.ui b/data/ui/no-gthd-view.ui
new file mode 100644
index 0000000..d6d0a25
--- /dev/null
+++ b/data/ui/no-gthd-view.ui
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.9 -->
+ <template class="UsageNoGthdView" parent="UsageView">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">40</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkImage">
+ <property name="margin">10</property>
+ <property name="icon-name">system-run-symbolic</property>
+ <property name="pixel-size">72</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <attributes>
+ <attribute name="font-desc" value="16"/>
+ <attribute name="weight" value="PANGO_WEIGHT_BOLD"/>
+ </attributes>
+ <property name="label" translatable="yes">Thermal daemon is not running</property>
+ <property name="margin">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <attributes>
+ <attribute name="font-desc" value="12"/>
+ </attributes>
+ <property name="label" translatable="yes">Please start gthd</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/thermal-row.ui b/data/ui/thermal-row.ui
new file mode 100644
index 0000000..b6c4202
--- /dev/null
+++ b/data/ui/thermal-row.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <template class="UsageThermalZoneRow" parent="GtkListBoxRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel" id="type_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">6</property>
+ <property name="wrap">True</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">60</property>
+ <attributes>
+ <attribute name="scale" value="1"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="temp_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_right">10</property>
+ <property name="ellipsize">end</property>
+ <property name="max_width_chars">30</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/data/ui/thermal-view.ui b/data/ui/thermal-view.ui
new file mode 100644
index 0000000..7df8e00
--- /dev/null
+++ b/data/ui/thermal-view.ui
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.9 -->
+
+ <template class="UsageThermalView" parent="UsageView">
+ <property name="visible">True</property>
+
+ <child>
+
+ <object class="HdyLeaflet" id="leaflet">
+ <property name="visible">True</property>
+ <property name="orientation">horizontal</property>
+ <property name="visible-child">content_box</property>
+
+ <child>
+ <object class="GtkBox" id="switcher_box">
+ <property name="hexpand">False</property>
+ <property name="hexpand-set">True</property>
+ <property name="width-request">200</property>
+ <style>
+ <class name="sidebar"/>
+ </style>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkBox" id="content_box">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="width-request">360</property>
+
+ <child>
+ <object class="UsageAnimatedScrolledWindow" id="scrolled_window">
+ <property name="visible">True</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">600</property>
+ <property name="tightening-threshold">400</property>
+ <child>
+ <object class="GtkBox" id="thermal_content">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">30</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/graph-switcher-button.vala b/src/graph-switcher-button.vala
index f0863c4..798786d 100644
--- a/src/graph-switcher-button.vala
+++ b/src/graph-switcher-button.vala
@@ -36,6 +36,12 @@ namespace Usage
child = createContent(memory_graph, label);
}
+ public GraphSwitcherButton.temperature(string label)
+ {
+ var thermal_graph = new ThermalGraph();
+ child = createContent(thermal_graph, label);
+ }
+
private Gtk.Box createContent(Dazzle.GraphView graph, string label_text)
{
graph.height_request = 80;
diff --git a/src/meson.build b/src/meson.build
index 0c29986..712841e 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -20,6 +20,7 @@ vala_sources = [
'memory-speedometer.vala',
'memory-sub-view.vala',
'monitor.vala',
+ 'no-gthd-view.vala',
'no-results-found-view.vala',
'notification-bar.vala',
'performance-view.vala',
@@ -42,6 +43,14 @@ vala_sources = [
'storage/tracker-worker.vala',
'swap-speedometer.vala',
'system-monitor.vala',
+ 'thermal-list-box.vala',
+ 'thermal-row.vala',
+ 'thermal-graph.vala',
+ 'thermal-graph-stack-switcher.vala',
+ 'thermal-graph-model.vala',
+ 'thermal-monitor.vala',
+ 'thermal-view.vala',
+ 'thermal-sub-view.vala',
'utils.vala',
'view.vala',
'window.vala'
diff --git a/src/no-gthd-view.vala b/src/no-gthd-view.vala
new file mode 100644
index 0000000..23bac1a
--- /dev/null
+++ b/src/no-gthd-view.vala
@@ -0,0 +1,23 @@
+/* no-results-found-box.vala
+ *
+ * Copyright (C) 2020 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+namespace Usage
+{
+ [GtkTemplate (ui = "/org/gnome/Usage/ui/no-gthd-view.ui")]
+ public class NoGthdView : View { }
+}
diff --git a/src/system-monitor.vala b/src/system-monitor.vala
index aa8cd88..c406a27 100644
--- a/src/system-monitor.vala
+++ b/src/system-monitor.vala
@@ -23,6 +23,7 @@ namespace Usage
public class SystemMonitor : Object
{
public bool process_list_ready { get; private set; default = false; }
+ public bool thermal_list_ready { get; private set; default = false; }
public double cpu_load { get; private set; }
public double[] x_cpu_load { get; private set; }
public uint64 ram_usage { get; private set; }
@@ -30,10 +31,12 @@ namespace Usage
public uint64 swap_usage { get; private set; }
public uint64 swap_total { get; private set; }
public bool group_system_apps { get; set; default = true; }
+ public double[] x_temp { get; private set; }
private CpuMonitor cpu_monitor;
private MemoryMonitor memory_monitor;
private GameMode.PidList gamemode_pids;
+ private ThermalMonitor thermal_monitor;
private HashTable<string, AppItem> app_table;
private HashTable<GLib.Pid, Process> process_table;
@@ -58,6 +61,12 @@ namespace Usage
return app_table.get(name);
}
+ public GLib.GenericArray<Gth.ThermalZone> get_thermal_zones()
+ {
+ return thermal_monitor.get_thermal_zones ();
+ }
+
+
public SystemMonitor()
{
GTop.init();
@@ -66,6 +75,7 @@ namespace Usage
cpu_monitor = new CpuMonitor();
memory_monitor = new MemoryMonitor();
gamemode_pids = new GameMode.PidList();
+ thermal_monitor = new ThermalMonitor();
app_table = new HashTable<string, AppItem>(str_hash, str_equal);
process_table = new HashTable<GLib.Pid, Process>(direct_hash, direct_equal);
@@ -84,6 +94,7 @@ namespace Usage
var settings = Settings.get_default();
app_table.remove_all();
process_list_ready = false;
+ thermal_list_ready = false;
if(group_system_apps) {
var system = new AppItem.system();
@@ -98,6 +109,7 @@ namespace Usage
Timeout.add(settings.data_update_interval, () =>
{
process_list_ready = true;
+ thermal_list_ready = true;
return false;
});
}
@@ -106,6 +118,7 @@ namespace Usage
{
cpu_monitor.update();
memory_monitor.update();
+ thermal_monitor.update();
cpu_load = cpu_monitor.get_cpu_load();
x_cpu_load = cpu_monitor.get_x_cpu_load();
@@ -113,6 +126,7 @@ namespace Usage
ram_total = memory_monitor.get_ram_total();
swap_usage = memory_monitor.get_swap_usage();
swap_total = memory_monitor.get_swap_total();
+ x_temp = thermal_monitor.get_x_temp();
foreach (var app in app_table.get_values ())
app.mark_as_not_updated();
diff --git a/src/thermal-graph-model.vala b/src/thermal-graph-model.vala
new file mode 100644
index 0000000..c325048
--- /dev/null
+++ b/src/thermal-graph-model.vala
@@ -0,0 +1,57 @@
+/* thermal-graph-model.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+using Dazzle;
+
+namespace Usage {
+
+ public class ThermalGraphModel : GraphModel {
+ public int num_zones;
+
+ public ThermalGraphModel () {
+ var settings = Settings.get_default();
+ SystemMonitor monitor = SystemMonitor.get_default();
+ set_timespan (settings.graph_timespan * 1000);
+ set_max_samples (settings.graph_max_samples);
+ num_zones = monitor.x_temp.length;
+
+ for (int i = 0; i < num_zones; i++) {
+ /* TODO: use correct zone numbers */
+ var column_x_temp = new GraphColumn("ThermalZone: " + i.to_string(), Type.from_name("gdouble"));
+ add_column(column_x_temp);
+ }
+
+ Timeout.add(settings.graph_update_interval, update_data);
+ }
+
+ bool update_data() {
+ GraphModelIter iter;
+ push (out iter, get_monotonic_time ());
+
+ SystemMonitor monitor = SystemMonitor.get_default();
+
+ for (int i = 0; i < num_zones; i++) {
+ iter_set_value(iter, i, monitor.x_temp[i]);
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/thermal-graph-stack-switcher.vala b/src/thermal-graph-stack-switcher.vala
new file mode 100644
index 0000000..11da822
--- /dev/null
+++ b/src/thermal-graph-stack-switcher.vala
@@ -0,0 +1,96 @@
+/* graph-stack-switcher.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+namespace Usage
+{
+ public class ThermalGraphStackSwitcher : Gtk.Box
+ {
+ View[] sub_views;
+ AnimatedScrolledWindow scrolled_window;
+
+ GraphSwitcherButton[] buttons;
+
+ class construct
+ {
+ set_css_name("graph-stack-switcher");
+ }
+
+ public ThermalGraphStackSwitcher(AnimatedScrolledWindow scrolled_window, View[] sub_views)
+ {
+ Object(orientation: Gtk.Orientation.VERTICAL, spacing: 0);
+
+ this.sub_views = sub_views;
+ this.scrolled_window = scrolled_window;
+
+ scrolled_window.scroll_changed.connect(on_scroll_changed);
+
+ buttons = {
+ new GraphSwitcherButton.temperature(_("Temperature")),
+ };
+
+ foreach(GraphSwitcherButton button in buttons)
+ {
+ this.pack_start(button, false, true, 0);
+
+ button.button_release_event.connect(() => {
+ var button_number = get_button_number(button);
+ scroll_to_view(button_number);
+
+ return false;
+ });
+ }
+ }
+
+ private int get_button_number(Gtk.Button button)
+ {
+ for(int i = 0; i < buttons.length; i++)
+ {
+ if(buttons[i] == button)
+ return i;
+ }
+
+ return 0;
+ }
+
+ private void scroll_to_view(int button_number)
+ {
+ Gtk.Allocation alloc;
+
+ this.sub_views[button_number].get_allocation(out alloc);
+ scrolled_window.animated_scroll_vertically(alloc.y);
+ }
+
+ private void on_scroll_changed(double y)
+ {
+ Gtk.Allocation alloc;
+
+ var button_number = 0;
+ for(int i = 1; i < buttons.length; i++)
+ {
+ this.sub_views[i].get_allocation(out alloc);
+ if(y < alloc.y)
+ break;
+ button_number = i;
+ }
+
+ buttons[button_number].set_active(true);
+ }
+ }
+}
diff --git a/src/thermal-graph.vala b/src/thermal-graph.vala
new file mode 100644
index 0000000..02e0c65
--- /dev/null
+++ b/src/thermal-graph.vala
@@ -0,0 +1,63 @@
+/* thermal-graph.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+using Dazzle;
+
+namespace Usage
+{
+ public class ThermalGraph : GraphView
+ {
+ private static ThermalGraphModel graph_model;
+ private GraphLineRenderer[] renderers;
+ private Gdk.RGBA line_color_max;
+ private Gdk.RGBA line_color_normal;
+
+ class construct
+ {
+ set_css_name("rg-graph");
+ }
+
+ public ThermalGraph()
+ {
+ get_style_context().add_class("line_max");
+ line_color_max = get_style_context().get_color(get_style_context().get_state());
+ get_style_context().remove_class("line_max");
+ get_style_context().add_class("line");
+ line_color_normal = get_style_context().get_color(get_style_context().get_state());
+ get_style_context().remove_class("line");
+ get_style_context().add_class("big");
+
+ if(graph_model == null)
+ graph_model = new ThermalGraphModel();
+
+ set_model(graph_model);
+
+ renderers = new GraphLineRenderer[graph_model.num_zones];
+ for(int i = 0; i < graph_model.num_zones; i++)
+ {
+ renderers[i] = new GraphLineRenderer();
+ renderers[i].column = i;
+ renderers[i].stroke_color_rgba = line_color_normal;
+ renderers[i].line_width = 1.5;
+ add_renderer(renderers[i]);
+ }
+ }
+ }
+}
diff --git a/src/thermal-list-box.vala b/src/thermal-list-box.vala
new file mode 100644
index 0000000..78c0c9d
--- /dev/null
+++ b/src/thermal-list-box.vala
@@ -0,0 +1,102 @@
+/* cooling-list-box.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+using Gth;
+
+namespace Usage
+{
+ public class ThermalListBox : Gtk.ListBox
+ {
+ public bool empty { get; set; default = true; }
+ public string search_text { get; set; default = ""; }
+
+ private ListStore model;
+
+ public ThermalListBox()
+ {
+ set_selection_mode (Gtk.SelectionMode.NONE);
+ set_header_func (update_header);
+
+ model = new ListStore(typeof(ThermalZone));
+ bind_model(model, on_row_created);
+
+ row_activated.connect((row) => {
+ var thermal_row = (ThermalZoneRow) row;
+ thermal_row.activate();
+ });
+
+ this.notify["search-text"].connect ((sender, property) => {
+ update();
+ });
+
+ var system_monitor = SystemMonitor.get_default();
+
+ system_monitor.notify["thermal-list-ready"].connect (() => {
+ if(system_monitor.thermal_list_ready)
+ update();
+ });
+
+ var settings = Settings.get_default();
+ Timeout.add(settings.list_update_interval_UI, update);
+
+ bind_property ("empty", this, "visible", BindingFlags.INVERT_BOOLEAN);
+ }
+
+ private bool update()
+ {
+ CompareDataFunc<ThermalZone> zone_cmp = (a, b) => {
+ ThermalZone zone_a = (ThermalZone) a;
+ ThermalZone zone_b = (ThermalZone) b;
+
+ return (int) (zone_a.temperature < zone_b.temperature) - (int) (zone_a.temperature > zone_b.temperature);
+ };
+
+ model.remove_all();
+
+ var system_monitor = SystemMonitor.get_default();
+ var zones = system_monitor.get_thermal_zones();
+
+ if(search_text == "") {
+ for (int i = 0; i < zones.length; i++) {
+ var z = zones.get(i);
+ model.insert_sorted(z, zone_cmp);
+ }
+ }
+
+ empty = (model.get_n_items() == 0);
+ return true;
+ }
+
+ private Gtk.Widget on_row_created (Object item) {
+ return new ThermalZoneRow((ThermalZone) item);
+ }
+
+ private void update_header(Gtk.ListBoxRow row, Gtk.ListBoxRow? before_row) {
+ if(before_row == null)
+ row.set_header(null);
+ else {
+ var separator = new Gtk.Separator (Gtk.Orientation.HORIZONTAL);
+ separator.get_style_context().add_class("list");
+ separator.show();
+ row.set_header(separator);
+ }
+ }
+ }
+}
diff --git a/src/thermal-monitor.vala b/src/thermal-monitor.vala
new file mode 100644
index 0000000..0eec651
--- /dev/null
+++ b/src/thermal-monitor.vala
@@ -0,0 +1,69 @@
+/* cpu-monitor.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+using GLib;
+using Gth;
+
+namespace Usage
+{
+ public class ThermalMonitor : Monitor
+ {
+ private double[] x_temp;
+ private GLib.DBusConnection con;
+ private Gth.Manager therm_manager;
+ private GLib.GenericArray<Gth.ThermalZone> thermal_zones;
+
+ public ThermalMonitor()
+ {
+ try {
+ con = GLib.Bus.get_sync(GLib.BusType.SESSION);
+ therm_manager = new Gth.Manager.sync(con, 0);
+ thermal_zones = therm_manager.get_thermal_zones();
+ } catch(IOError e) {
+ warning("GThermal Proxy creation failed: %s", e.message);
+ } catch(GLib.Error e) {
+ warning("GThermal D-Bus error: %s", e.message);
+ }
+ x_temp = new double[thermal_zones.length];
+ }
+
+ public GLib.GenericArray<Gth.ThermalZone> get_thermal_zones()
+ {
+ return thermal_zones;
+ }
+
+ public void update()
+ {
+ for (int i = 0; i < x_temp.length; i++)
+ {
+ x_temp[i] = thermal_zones.get(i).temperature / 1000.0;
+ }
+ }
+
+ public double[] get_x_temp()
+ {
+ return x_temp;
+ }
+
+ public void update_process(ref Process process)
+ {
+ /* todo: empty since we inherited form monitor */
+ }
+ }
+}
diff --git a/src/thermal-row.vala b/src/thermal-row.vala
new file mode 100644
index 0000000..df3b079
--- /dev/null
+++ b/src/thermal-row.vala
@@ -0,0 +1,53 @@
+/* process-row.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+using Gth;
+
+namespace Usage
+{
+ [GtkTemplate (ui = "/org/gnome/Usage/ui/thermal-row.ui")]
+ public class ThermalZoneRow : Gtk.ListBoxRow
+ {
+ public ThermalZone zone;
+
+ [GtkChild]
+ private Gtk.Label type_label;
+
+ [GtkChild]
+ private Gtk.Label temp_label;
+
+ public ThermalZoneRow(ThermalZone zone)
+ {
+ this.zone = zone;
+ update();
+ }
+
+ private void update()
+ {
+ type_label.label = zone.type;
+ temp_label.label = "%.2f ⁰C".printf(zone.temperature / 1000.0);
+ /* todo: add cooling devs */
+ }
+
+ public new void activate()
+ {
+ }
+ }
+}
diff --git a/src/thermal-sub-view.vala b/src/thermal-sub-view.vala
new file mode 100644
index 0000000..b354548
--- /dev/null
+++ b/src/thermal-sub-view.vala
@@ -0,0 +1,85 @@
+/* thermal-sub-view.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+namespace Usage
+{
+ public class ThermalSubView : View, SubView
+ {
+ private ThermalListBox thermal_list_box;
+ private NoGthdView no_thermal_view;
+
+ public ThermalSubView()
+ {
+ name = "THERMAL";
+
+ var label = new Gtk.Label("<span font_desc=\"14.0\">" + _("Thermal Zones") + "</span>");
+ label.set_use_markup(true);
+ label.margin_top = 25;
+ label.margin_bottom = 15;
+
+ thermal_list_box = new ThermalListBox();
+ thermal_list_box.margin_bottom = 20;
+ thermal_list_box.margin_top = 30;
+
+ var spinner = new Gtk.Spinner();
+ spinner.active = true;
+ spinner.margin_top = 30;
+ spinner.height_request = 250;
+
+ no_thermal_view = new NoGthdView();
+
+ var thermal_graph = new ThermalGraph();
+ thermal_graph.hexpand = true;
+ var thermal_graph_box = new GraphBox(thermal_graph);
+ thermal_graph_box.height_request = 225;
+ thermal_graph_box.valign = Gtk.Align.START;
+
+ var thermal_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ thermal_box.pack_start(label, false, false, 0);
+ thermal_box.pack_start(thermal_graph_box, false, false, 0);
+
+ thermal_box.add(no_thermal_view);
+
+ var system_monitor = SystemMonitor.get_default();
+ system_monitor.notify["thermal-list-ready"].connect ((sender, property) => {
+ if(system_monitor.thermal_list_ready) {
+ thermal_box.pack_start(thermal_list_box, false, false, 0);
+ thermal_box.remove(spinner);
+ } else {
+ thermal_box.pack_start(spinner, true, true, 0);
+ thermal_box.remove(thermal_list_box);
+ }
+ });
+
+ thermal_list_box.bind_property ("empty", no_thermal_view, "visible", BindingFlags.BIDIRECTIONAL);
+ add(thermal_box);
+ }
+
+ public override void show_all() {
+ base.show_all();
+ this.no_thermal_view.hide();
+ }
+
+ public void search_in_processes(string text)
+ {
+ /* tbd */
+ }
+ }
+}
diff --git a/src/thermal-view.vala b/src/thermal-view.vala
new file mode 100644
index 0000000..c2fadb5
--- /dev/null
+++ b/src/thermal-view.vala
@@ -0,0 +1,59 @@
+/* performance-view.vala
+ *
+ * Copyright (C) 2019 Purism SPC
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Guido Guenther <agx@sigxcpu.org>
+ */
+
+using Gtk;
+
+namespace Usage
+{
+ [GtkTemplate (ui = "/org/gnome/Usage/ui/thermal-view.ui")]
+ public class ThermalView : View
+ {
+ [GtkChild]
+ private Gtk.Box switcher_box;
+
+ [GtkChild]
+ private Gtk.Box thermal_content;
+
+ [GtkChild]
+ private AnimatedScrolledWindow scrolled_window;
+
+ View[] sub_views;
+
+ public ThermalView ()
+ {
+ name = "THERMAL";
+ title = _("Thermal");
+ icon_name = "weather-clear-symbolic";
+
+ sub_views = new View[]
+ {
+ new ThermalSubView(),
+ };
+
+ foreach(var sub_view in sub_views)
+ thermal_content.pack_start(sub_view, true, true, 0);
+
+ var stackSwitcher = new ThermalGraphStackSwitcher(scrolled_window, sub_views);
+ switcher_box.add (stackSwitcher);
+
+ show_all ();
+ }
+ }
+}
diff --git a/src/window.vala b/src/window.vala
index 819162a..0fda7b3 100644
--- a/src/window.vala
+++ b/src/window.vala
@@ -80,6 +80,7 @@ namespace Usage
{
new PerformanceView(),
new StorageView(),
+ new ThermalView(),
};
foreach(var view in views) {
--
2.30.0