mirror of
https://github.com/Steve-Tech/YAFI.git
synced 2026-04-19 16:50:36 +00:00
Make hardware page interactive
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
<!-- interface-description The Hardware page for YAFI -->
|
<!-- interface-description The Hardware page for YAFI -->
|
||||||
<!-- interface-copyright Steve-Tech -->
|
<!-- interface-copyright Steve-Tech -->
|
||||||
<requires lib="gtk" version="4.12"/>
|
<requires lib="gtk" version="4.12"/>
|
||||||
<requires lib="libadwaita" version="1.4"/>
|
<requires lib="libadwaita" version="1.3"/>
|
||||||
<object class="GtkBox" id="hardware-root">
|
<object class="GtkBox" id="hardware-root">
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -18,20 +18,15 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow">
|
<object class="AdwActionRow" id="hw-chassis">
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="subtitle">Currently Closed</property>
|
|
||||||
<property name="title">Chassis Open Count</property>
|
<property name="title">Chassis Open Count</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel">
|
<object class="GtkLabel" id="hw-chassis-label"/>
|
||||||
<property name="label">0</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow">
|
<object class="AdwActionRow" id="hw-priv-cam">
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="subtitle">Use Privacy Switch</property>
|
<property name="subtitle">Use Privacy Switch</property>
|
||||||
<property name="title">Camera Enabled</property>
|
<property name="title">Camera Enabled</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -40,7 +35,7 @@
|
|||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSwitch">
|
<object class="GtkSwitch" id="hw-priv-cam-sw">
|
||||||
<property name="active">True</property>
|
<property name="active">True</property>
|
||||||
<property name="sensitive">False</property>
|
<property name="sensitive">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -50,8 +45,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwActionRow">
|
<object class="AdwActionRow" id="hw-priv-mic">
|
||||||
<property name="selectable">False</property>
|
|
||||||
<property name="subtitle">Use Privacy Switch</property>
|
<property name="subtitle">Use Privacy Switch</property>
|
||||||
<property name="title">Microphone Enabled</property>
|
<property name="title">Microphone Enabled</property>
|
||||||
<child>
|
<child>
|
||||||
@@ -60,7 +54,7 @@
|
|||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSwitch">
|
<object class="GtkSwitch" id="hw-priv-mic-sw">
|
||||||
<property name="active">True</property>
|
<property name="active">True</property>
|
||||||
<property name="sensitive">False</property>
|
<property name="sensitive">False</property>
|
||||||
</object>
|
</object>
|
||||||
@@ -70,9 +64,27 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="AdwSwitchRow">
|
<object class="AdwActionRow" id="hw-fp-pwr">
|
||||||
<property name="active">True</property>
|
<property name="title">Fingerprint</property>
|
||||||
<property name="title">Fingerprint Enabled</property>
|
<property name="visible">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkBox">
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
<property name="spacing">5</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="hw-fp-pwr-en">
|
||||||
|
<property name="label">Enable</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="hw-fp-pwr-dis">
|
||||||
|
<property name="label">Disable</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -82,15 +82,18 @@
|
|||||||
(5,1,"GtkBox","hardware-root",None,None,None,None,0,None,None),
|
(5,1,"GtkBox","hardware-root",None,None,None,None,0,None,None),
|
||||||
(5,2,"GtkListBox",None,1,None,None,None,0,None,None),
|
(5,2,"GtkListBox",None,1,None,None,None,0,None,None),
|
||||||
(5,3,"AdwActionRow",None,2,None,None,None,0,None,None),
|
(5,3,"AdwActionRow",None,2,None,None,None,0,None,None),
|
||||||
(5,4,"AdwActionRow",None,2,None,None,None,1,None,None),
|
(5,4,"AdwActionRow","hw-chassis",2,None,None,None,1,None,None),
|
||||||
(5,5,"GtkLabel",None,4,None,None,None,0,None,None),
|
(5,5,"GtkLabel","hw-chassis-label",4,None,None,None,0,None,None),
|
||||||
(5,6,"AdwActionRow",None,2,None,None,None,2,None,None),
|
(5,6,"AdwActionRow","hw-priv-cam",2,None,None,None,2,None,None),
|
||||||
(5,9,"AdwActionRow",None,2,None,None,None,3,None,None),
|
(5,9,"AdwActionRow","hw-priv-mic",2,None,None,None,3,None,None),
|
||||||
(5,11,"GtkSwitch",None,13,None,None,None,0,None,None),
|
(5,11,"GtkSwitch","hw-priv-mic-sw",13,None,None,None,0,None,None),
|
||||||
(5,12,"AdwSwitchRow",None,2,None,None,None,4,None,None),
|
|
||||||
(5,13,"GtkBox",None,9,None,None,None,0,None,None),
|
(5,13,"GtkBox",None,9,None,None,None,0,None,None),
|
||||||
(5,14,"GtkBox",None,6,None,None,None,0,None,None),
|
(5,14,"GtkBox",None,6,None,None,None,0,None,None),
|
||||||
(5,15,"GtkSwitch",None,14,None,None,None,0,None,None),
|
(5,15,"GtkSwitch","hw-priv-cam-sw",14,None,None,None,0,None,None),
|
||||||
|
(5,16,"AdwActionRow","hw-fp-pwr",2,None,None,None,4,None,None),
|
||||||
|
(5,17,"GtkBox",None,16,None,None,None,0,None,None),
|
||||||
|
(5,18,"GtkButton","hw-fp-pwr-en",17,None,None,None,0,None,None),
|
||||||
|
(5,19,"GtkButton","hw-fp-pwr-dis",17,None,None,None,1,None,None),
|
||||||
(6,1,"AdwAboutWindow","about-root",None,None,None,None,0,None,None)
|
(6,1,"AdwAboutWindow","about-root",None,None,None,None,0,None,None)
|
||||||
</object>
|
</object>
|
||||||
<object_property>
|
<object_property>
|
||||||
@@ -240,20 +243,13 @@
|
|||||||
(5,2,"GtkWidget","margin-start","10",0,None,None,None,None,None,None,None,None),
|
(5,2,"GtkWidget","margin-start","10",0,None,None,None,None,None,None,None,None),
|
||||||
(5,3,"AdwPreferencesRow","title","Hardware Status",0,None,None,None,None,None,None,None,None),
|
(5,3,"AdwPreferencesRow","title","Hardware Status",0,None,None,None,None,None,None,None,None),
|
||||||
(5,3,"GtkListBoxRow","selectable","False",0,None,None,None,None,None,None,None,None),
|
(5,3,"GtkListBoxRow","selectable","False",0,None,None,None,None,None,None,None,None),
|
||||||
(5,4,"AdwActionRow","subtitle","Currently Closed",None,None,None,None,None,None,None,None,None),
|
|
||||||
(5,4,"AdwPreferencesRow","title","Chassis Open Count",0,None,None,None,None,None,None,None,None),
|
(5,4,"AdwPreferencesRow","title","Chassis Open Count",0,None,None,None,None,None,None,None,None),
|
||||||
(5,4,"GtkListBoxRow","selectable","False",0,None,None,None,None,None,None,None,None),
|
|
||||||
(5,5,"GtkLabel","label","0",None,None,None,None,None,None,None,None,None),
|
|
||||||
(5,6,"AdwActionRow","subtitle","Use Privacy Switch",None,None,None,None,None,None,None,None,None),
|
(5,6,"AdwActionRow","subtitle","Use Privacy Switch",None,None,None,None,None,None,None,None,None),
|
||||||
(5,6,"AdwPreferencesRow","title","Camera Enabled",0,None,None,None,None,None,None,None,None),
|
(5,6,"AdwPreferencesRow","title","Camera Enabled",0,None,None,None,None,None,None,None,None),
|
||||||
(5,6,"GtkListBoxRow","selectable","False",0,None,None,None,None,None,None,None,None),
|
|
||||||
(5,9,"AdwActionRow","subtitle","Use Privacy Switch",None,None,None,None,None,None,None,None,None),
|
(5,9,"AdwActionRow","subtitle","Use Privacy Switch",None,None,None,None,None,None,None,None,None),
|
||||||
(5,9,"AdwPreferencesRow","title","Microphone Enabled",0,None,None,None,None,None,None,None,None),
|
(5,9,"AdwPreferencesRow","title","Microphone Enabled",0,None,None,None,None,None,None,None,None),
|
||||||
(5,9,"GtkListBoxRow","selectable","False",0,None,None,None,None,None,None,None,None),
|
|
||||||
(5,11,"GtkSwitch","active","True",0,None,None,None,None,None,None,None,None),
|
(5,11,"GtkSwitch","active","True",0,None,None,None,None,None,None,None,None),
|
||||||
(5,11,"GtkWidget","sensitive","False",0,None,None,None,None,None,None,None,None),
|
(5,11,"GtkWidget","sensitive","False",0,None,None,None,None,None,None,None,None),
|
||||||
(5,12,"AdwPreferencesRow","title","Fingerprint Enabled",None,None,None,None,None,None,None,None,None),
|
|
||||||
(5,12,"AdwSwitchRow","active","True",None,None,None,None,None,None,None,None,None),
|
|
||||||
(5,13,"GtkBox","homogeneous","True",None,None,None,None,None,None,None,None,None),
|
(5,13,"GtkBox","homogeneous","True",None,None,None,None,None,None,None,None,None),
|
||||||
(5,13,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
(5,13,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||||
(5,13,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
(5,13,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||||
@@ -262,6 +258,14 @@
|
|||||||
(5,14,"GtkWidget","valign","center",0,None,None,None,None,None,None,None,None),
|
(5,14,"GtkWidget","valign","center",0,None,None,None,None,None,None,None,None),
|
||||||
(5,15,"GtkSwitch","active","True",0,None,None,None,None,None,None,None,None),
|
(5,15,"GtkSwitch","active","True",0,None,None,None,None,None,None,None,None),
|
||||||
(5,15,"GtkWidget","sensitive","False",0,None,None,None,None,None,None,None,None),
|
(5,15,"GtkWidget","sensitive","False",0,None,None,None,None,None,None,None,None),
|
||||||
|
(5,16,"AdwPreferencesRow","title","Fingerprint",0,None,None,None,None,None,None,None,None),
|
||||||
|
(5,16,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
|
||||||
|
(5,17,"GtkBox","homogeneous","True",0,None,None,None,None,None,None,None,None),
|
||||||
|
(5,17,"GtkBox","spacing","5",None,None,None,None,None,None,None,None,None),
|
||||||
|
(5,17,"GtkWidget","halign","end",0,None,None,None,None,None,None,None,None),
|
||||||
|
(5,17,"GtkWidget","valign","center",0,None,None,None,None,None,None,None,None),
|
||||||
|
(5,18,"GtkButton","label","Enable",None,None,None,None,None,None,None,None,None),
|
||||||
|
(5,19,"GtkButton","label","Disable",None,None,None,None,None,None,None,None,None),
|
||||||
(6,1,"AdwAboutWindow","application-icon","application-default-icon",None,None,None,None,None,None,None,None,None),
|
(6,1,"AdwAboutWindow","application-icon","application-default-icon",None,None,None,None,None,None,None,None,None),
|
||||||
(6,1,"AdwAboutWindow","application-name","Yet Another Framework Interface",None,None,None,None,None,None,None,None,None),
|
(6,1,"AdwAboutWindow","application-name","Yet Another Framework Interface",None,None,None,None,None,None,None,None,None),
|
||||||
(6,1,"AdwAboutWindow","comments","YAFI is another GUI for the Framework Laptop Embedded Controller.\nIt is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.",None,None,None,None,None,None,None,None,None),
|
(6,1,"AdwAboutWindow","comments","YAFI is another GUI for the Framework Laptop Embedded Controller.\nIt is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.",None,None,None,None,None,None,None,None,None),
|
||||||
|
|||||||
88
yafi/yafi.py
88
yafi/yafi.py
@@ -8,6 +8,7 @@ from gi.repository import Gtk, Adw, GLib
|
|||||||
|
|
||||||
from cros_ec_python import get_cros_ec
|
from cros_ec_python import get_cros_ec
|
||||||
import cros_ec_python.commands as ec_commands
|
import cros_ec_python.commands as ec_commands
|
||||||
|
import cros_ec_python.exceptions as ec_exceptions
|
||||||
|
|
||||||
|
|
||||||
class YAFI(Adw.Application):
|
class YAFI(Adw.Application):
|
||||||
@@ -15,6 +16,7 @@ class YAFI(Adw.Application):
|
|||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.connect("activate", self.on_activate)
|
self.connect("activate", self.on_activate)
|
||||||
self.script_dir = os.path.dirname(os.path.abspath(__file__))
|
self.script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
self.no_support = []
|
||||||
self.cros_ec = get_cros_ec()
|
self.cros_ec = get_cros_ec()
|
||||||
|
|
||||||
def _change_page(self, builder, page):
|
def _change_page(self, builder, page):
|
||||||
@@ -366,6 +368,66 @@ class YAFI(Adw.Application):
|
|||||||
bat_ext_reset_time,
|
bat_ext_reset_time,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _update_hardware(self, hardware_builder):
|
||||||
|
success = False
|
||||||
|
# Chassis
|
||||||
|
if not ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION in self.no_support:
|
||||||
|
hw_chassis = hardware_builder.get_object("hw-chassis")
|
||||||
|
hw_chassis_label = hardware_builder.get_object("hw-chassis-label")
|
||||||
|
try:
|
||||||
|
ec_chassis = ec_commands.framework_laptop.get_chassis_intrusion(
|
||||||
|
self.cros_ec
|
||||||
|
)
|
||||||
|
|
||||||
|
hw_chassis_label.set_label(str(ec_chassis["total_open_count"]))
|
||||||
|
|
||||||
|
ec_chassis_open = ec_commands.framework_laptop.get_chassis_open_check(
|
||||||
|
self.cros_ec
|
||||||
|
)
|
||||||
|
hw_chassis.set_subtitle(
|
||||||
|
"Currently " + ("Open" if ec_chassis_open else "Closed")
|
||||||
|
)
|
||||||
|
|
||||||
|
success = True
|
||||||
|
except ec_exceptions.ECError as e:
|
||||||
|
if e.status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND.value:
|
||||||
|
self.no_support.append(
|
||||||
|
ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION
|
||||||
|
)
|
||||||
|
hw_chassis.set_visible(False)
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
# Privacy Switches
|
||||||
|
if (
|
||||||
|
not ec_commands.framework_laptop.EC_CMD_PRIVACY_SWITCHES_CHECK_MODE
|
||||||
|
in self.no_support
|
||||||
|
):
|
||||||
|
hw_priv_cam = hardware_builder.get_object("hw-priv-cam")
|
||||||
|
hw_priv_mic = hardware_builder.get_object("hw-priv-mic")
|
||||||
|
hw_priv_cam_sw = hardware_builder.get_object("hw-priv-cam-sw")
|
||||||
|
hw_priv_mic_sw = hardware_builder.get_object("hw-priv-mic-sw")
|
||||||
|
|
||||||
|
try:
|
||||||
|
ec_privacy = ec_commands.framework_laptop.get_privacy_switches(
|
||||||
|
self.cros_ec
|
||||||
|
)
|
||||||
|
hw_priv_cam_sw.set_active(ec_privacy["camera"])
|
||||||
|
hw_priv_mic_sw.set_active(ec_privacy["microphone"])
|
||||||
|
|
||||||
|
success = True
|
||||||
|
except ec_exceptions.ECError as e:
|
||||||
|
if e.status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND.value:
|
||||||
|
self.no_support.append(
|
||||||
|
ec_commands.framework_laptop.EC_CMD_PRIVACY_SWITCHES_CHECK_MODE
|
||||||
|
)
|
||||||
|
hw_priv_cam.set_visible(False)
|
||||||
|
hw_priv_mic.set_visible(False)
|
||||||
|
else:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
return self.current_page == 3 and success
|
||||||
|
|
||||||
def _hardware_page(self, builder):
|
def _hardware_page(self, builder):
|
||||||
# Load the hardware.ui file
|
# Load the hardware.ui file
|
||||||
hardware_builder = Gtk.Builder()
|
hardware_builder = Gtk.Builder()
|
||||||
@@ -376,6 +438,32 @@ class YAFI(Adw.Application):
|
|||||||
|
|
||||||
self._change_page(builder, hardware_root)
|
self._change_page(builder, hardware_root)
|
||||||
|
|
||||||
|
self._update_hardware(hardware_builder)
|
||||||
|
|
||||||
|
# Fingerprint Power
|
||||||
|
hw_fp_pwr = hardware_builder.get_object("hw-fp-pwr")
|
||||||
|
if ec_commands.general.get_cmd_versions(
|
||||||
|
self.cros_ec, ec_commands.framework_laptop.EC_CMD_FP_CONTROL
|
||||||
|
):
|
||||||
|
hw_fp_pwr_en = hardware_builder.get_object("hw-fp-pwr-en")
|
||||||
|
hw_fp_pwr_dis = hardware_builder.get_object("hw-fp-pwr-dis")
|
||||||
|
|
||||||
|
hw_fp_pwr_en.connect(
|
||||||
|
"clicked",
|
||||||
|
lambda _: ec_commands.framework_laptop.fp_control(self.cros_ec, True),
|
||||||
|
)
|
||||||
|
|
||||||
|
hw_fp_pwr_dis.connect(
|
||||||
|
"clicked",
|
||||||
|
lambda _: ec_commands.framework_laptop.fp_control(self.cros_ec, False),
|
||||||
|
)
|
||||||
|
hw_fp_pwr.set_visible(True)
|
||||||
|
else:
|
||||||
|
hw_fp_pwr.set_visible(False)
|
||||||
|
|
||||||
|
# Schedule _update_hardware to run every second
|
||||||
|
GLib.timeout_add_seconds(1, self._update_hardware, hardware_builder)
|
||||||
|
|
||||||
def _about_page(self, app_builder):
|
def _about_page(self, app_builder):
|
||||||
# Open About dialog
|
# Open About dialog
|
||||||
builder = Gtk.Builder()
|
builder = Gtk.Builder()
|
||||||
|
|||||||
Reference in New Issue
Block a user