18 Commits

Author SHA1 Message Date
Stephen Horvath
8810aa01e5 Add FP LED v1 support 2025-11-06 14:09:50 +10:00
Stephen Horvath
1fc4b94237 Streamline udev rules 2025-11-06 13:58:51 +10:00
Stephen Horvath
90a994a685 Disable blue power button colour
Early Intel models report that their power button LED supports blue
colour, but in reality it just turns it off.
2025-10-20 15:07:37 +10:00
Stephen Horvath
7b123da001 Handle custom power LED brightness levels 2025-10-16 22:45:23 +10:00
Stephen Horvath
c8fd626446 Update about text to match README 2025-10-04 10:32:09 +10:00
Stephen Horvath
0f6fee40ae Add disclaimer to README 2025-10-04 10:29:23 +10:00
Stephen Horvath
4a788c2395 Merge pull request #11 from OrioleNix/patch-1
Change title from gtk3 to gtk4
2025-10-04 07:05:08 +10:00
OrioleNix
d2f34c9b5a Update main.py 2025-10-03 11:22:34 -04:00
Stephen Horvath
4958722edd Update README.md 2025-09-28 23:26:39 +10:00
Stephen Horvath
23b54ee397 Add FUNDING.yml 2025-09-28 23:24:51 +10:00
Stephen Horvath
73bb7abf6e Release 0.6 2025-09-28 13:35:13 +10:00
Stephen Horvath
9f0fabb91f Fix metainfo screenshots 2025-09-28 12:55:28 +10:00
Stephen Horvath
a31f851707 More changes for Flathub submission 2025-09-27 18:21:11 +10:00
Stephen Horvath
70d3788dd6 Add sensors to Hardware/Sensors page 2025-09-23 12:54:51 +10:00
Stephen Horvath
f3b74ccc02 Rework advanced LEDs 2025-09-21 22:30:24 +10:00
Stephen Horvath
335a0881b3 Preparation for Flathub publishing 2025-09-21 13:37:35 +10:00
Stephen Horvath
c39a88b7db Remove hard edges from logo 2025-09-19 13:36:33 +10:00
Stephen Horvath
ba78392b24 Add Windows ZIP build 2025-09-18 15:15:55 +10:00
35 changed files with 414 additions and 235 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
github: [Steve-Tech]
thanks_dev: u/gh/steve-tech

View File

@@ -8,7 +8,7 @@ jobs:
flatpak: flatpak:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-48 image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-49
options: --privileged options: --privileged
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View File

@@ -21,7 +21,7 @@ jobs:
run: pip install . run: pip install .
- name: Build with PyInstaller - name: Build with PyInstaller
# pyinstaller doesn't find the GTK libraries after caching? # pyinstaller doesn't find the GTK libraries after caching?
run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec -- --onefile
working-directory: pyinstaller working-directory: pyinstaller
- name: Upload PyInstaller Artifact - name: Upload PyInstaller Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -19,11 +19,11 @@ jobs:
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: C:\gtk path: C:\gtk
key: Gvsbuild_2025.8.0 key: Gvsbuild_2025.9.0
- name: Download GTK4 Gvsbuild zip - name: Download GTK4 Gvsbuild zip
if: steps.cache-gtk4.outputs.cache-hit != 'true' if: steps.cache-gtk4.outputs.cache-hit != 'true'
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.8.0/GTK4_Gvsbuild_2025.8.0_x64.zip -Destination Gvsbuild.zip run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.9.0/GTK4_Gvsbuild_2025.9.0_x64.zip -Destination Gvsbuild.zip
- name: Extract Gvsbuild zip - name: Extract Gvsbuild zip
if: steps.cache-gtk4.outputs.cache-hit != 'true' if: steps.cache-gtk4.outputs.cache-hit != 'true'
@@ -41,12 +41,22 @@ jobs:
- name: Build YAFI via Pip - name: Build YAFI via Pip
run: pip install . run: pip install .
- name: Build with PyInstaller - name: Build with PyInstaller (ZIP)
run: python -m PyInstaller yafi.spec run: python -m PyInstaller yafi.spec
working-directory: pyinstaller working-directory: pyinstaller
- name: Upload PyInstaller Artifact - name: Upload PyInstaller Artifact (ZIP)
uses: actions/upload-artifact@v4
with:
path: pyinstaller/dist/YAFI/*
name: yafi-windows-${{ github.sha }}
- name: Build with PyInstaller (Standalone)
run: python -m PyInstaller yafi.spec --noconfirm -- --onefile
working-directory: pyinstaller
- name: Upload PyInstaller Artifact (Standalone)
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: pyinstaller/dist/YAFI.exe path: pyinstaller/dist/YAFI.exe
name: yafi-windows-${{ github.sha }} name: yafi-windows-standalone-${{ github.sha }}

View File

@@ -1,7 +0,0 @@
# CrOS_EC_Python udev rules
# LPC Access
KERNEL=="port", TAG+="uaccess"
# /dev/cros_ec Access
KERNEL=="cros_ec", TAG+="uaccess"

View File

@@ -11,9 +11,13 @@ You can download the latest release from the [Releases page](https://github.com/
There are builds for Flatpak, and PyInstaller for portable execution on Linux or Windows. There are builds for Flatpak, and PyInstaller for portable execution on Linux or Windows.
YAFI is also available on [Flathub](https://flathub.org/en/apps/au.stevetech.yafi): `flatpak install flathub au.stevetech.yafi`.
### Linux ### Linux
To allow YAFI to communicate with the EC, you need to copy the [`60-cros_ec_python.rules`](60-cros_ec_python.rules) file to `/etc/udev/rules.d/` and reload the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`. To allow YAFI to communicate with the EC, you will need to enable user access to the `/dev/cros_ec` device. You can do this by running `echo KERNEL=="cros_ec", TAG+="uaccess" | sudo tee /etc/udev/rules.d/60-yafi.rules`, and then reload the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`.
You can also do this by running `curl -fL yafi.stevetech.au/udev.sh | sudo sh` which will run the [`add-udev-rules.sh`](add-udev-rules.sh) script.
### Windows ### Windows
@@ -21,6 +25,8 @@ If your Laptop's BIOS supports Framework's EC driver, there is no need to instal
Otherwise, YAFI supports the [PawnIO](https://pawnio.eu/) driver, and will be automatically used if installed and there is no Framework driver available. YAFI will need to be run as administrator to communicate with the driver. Otherwise, YAFI supports the [PawnIO](https://pawnio.eu/) driver, and will be automatically used if installed and there is no Framework driver available. YAFI will need to be run as administrator to communicate with the driver.
Currently the PawnIO driver does not support Framework 13 mainboards with 11th, 12th, or 13th Gen Intel CPUs.
## Building ## Building
### Flatpak ### Flatpak
@@ -80,7 +86,7 @@ It is possible to run YAFI on Windows using [gvsbuild](https://github.com/wingtk
### `[Errno 13] Permission denied: '/dev/cros_ec'` ### `[Errno 13] Permission denied: '/dev/cros_ec'`
This error occurs when the udev rules are not installed or not working. Make sure you have copied the `60-cros_ec_python.rules` file to `/etc/udev/rules.d/` and reloaded the rules with `sudo udevadm control --reload-rules && sudo udevadm trigger`. This error occurs when the udev rules are not installed or not working. Make sure you have installed the udev rules as described in the [Linux Installation](#linux) section.
### `Could not auto detect device, check you have the required permissions, or specify manually.` ### `Could not auto detect device, check you have the required permissions, or specify manually.`
@@ -88,3 +94,9 @@ This error occurs when `/dev/cros_ec` is not found, and the `CrOS_EC_Python` lib
You can either update your kernel to have a working `cros_ec_dev` driver, or run YAFI as root. You can either update your kernel to have a working `cros_ec_dev` driver, or run YAFI as root.
It can also occur if you do not have a CrOS EC, like on non Framework laptops. It can also occur if you do not have a CrOS EC, like on non Framework laptops.
## Disclaimer
YAFI is not affiliated with Framework Computer Inc. in any way.
YAFI is licensed under the [GPL-2.0-or-later license](COPYING), and comes with no warranty or guarantee of any kind. Use at your own risk.

7
add-udev-rules.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
set -e
echo Installing udev rules for YAFI to /etc/udev/rules.d/60-yafi.rules
echo KERNEL=="cros_ec", TAG+="uaccess" > /etc/udev/rules.d/60-yafi.rules
udevadm control --reload-rules
udevadm trigger
echo udev rules installed successfully.

View File

@@ -1,13 +1,14 @@
{ {
"id" : "au.stevetech.yafi", "id" : "au.stevetech.yafi",
"runtime" : "org.gnome.Platform", "runtime" : "org.gnome.Platform",
"runtime-version" : "48", "runtime-version" : "49",
"sdk" : "org.gnome.Sdk", "sdk" : "org.gnome.Sdk",
"command" : "yafi", "command" : "yafi",
"finish-args" : [ "finish-args" : [
"--device=all", "--device=all",
"--socket=fallback-x11", "--socket=fallback-x11",
"--socket=wayland" "--socket=wayland",
"--share=ipc"
], ],
"cleanup" : [ "cleanup" : [
"/include", "/include",
@@ -21,6 +22,7 @@
"*.a" "*.a"
], ],
"modules" : [ "modules" : [
"python3-cros_ec_python.json",
{ {
"name" : "yafi", "name" : "yafi",
"builddir" : true, "builddir" : true,
@@ -31,18 +33,6 @@
"path" : "." "path" : "."
} }
] ]
},
{
"name": "cros_ec_python",
"buildsystem": "simple",
"build-options": {
"build-args": [
"--share=network"
]
},
"build-commands": [
"pip3 install --prefix=${FLATPAK_DEST} --no-cache-dir \"cros_ec_python>=0.2.0\""
]
} }
] ]
} }

View File

@@ -6,6 +6,6 @@ Comment=Yet Another Framework Interface
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Utility; Categories=Utility;
Keywords=GTK; Keywords=Framework;EC;Embedded Controller;
StartupNotify=true StartupNotify=true
DBusActivatable=true DBusActivatable=true

View File

@@ -7,11 +7,25 @@
<name>Yet Another Framework Interface</name> <name>Yet Another Framework Interface</name>
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary> <summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
<description> <description>
<p>It is written in Python with a GTK4 Adwaita theme, and uses the `CrOS_EC_Python` library to communicate with the EC.</p> <p>It is written in Python with a GTK4 Adwaita theme, and uses the CrOS_EC_Python library to communicate with the EC.</p>
<p>YAFI has the capability for the following features:</p>
<ul>
<li>Fan control and temperature monitoring</li>
<li>LED control</li>
<li>Battery statistics</li>
<li>Battery limiting</li>
<li>Hardware information</li>
</ul>
<p>You will need to install the udev rules to allow non-root access to the EC device. See the README for more information.</p>
<p>Alternatively, you can run <code>curl -fL yafi.stevetech.au/udev.sh | sudo sh</code> to install the udev rules.</p>
<p>YAFI is not affiliated with Framework Computer Inc. in any way.</p>
</description> </description>
<developer id="au.stevetech"> <developer id="au.stevetech">
<name>Stephen Horvath</name> <name translate="no">Stephen Horvath</name>
</developer> </developer>
<!-- Required: Should be a link to the upstream homepage for the component --> <!-- Required: Should be a link to the upstream homepage for the component -->
@@ -42,35 +56,86 @@
<!-- Applications should set a brand color in both light and dark variants like so --> <!-- Applications should set a brand color in both light and dark variants like so -->
<branding> <branding>
<color type="primary" scheme_preference="light">#ff00ff</color> <color type="primary" scheme_preference="light">#7c916f</color>
<color type="primary" scheme_preference="dark">#993d3d</color> <color type="primary" scheme_preference="dark">#282000</color>
</branding> </branding>
<screenshots> <screenshots>
<screenshot type="default"> <screenshot type="default">
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermals.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/1-thermals.png</image>
<caption>Fan Control and Temperature Monitoring</caption> <caption>Fan Control and Temperature Monitoring</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/2-leds.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/2-leds.png</image>
<caption>LED Control</caption> <caption>LED Control</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/3-battery.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/3-battery.png</image>
<caption>Battery Statistics</caption> <caption>Battery Statistics</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-battery-limit.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/4-battery-limit.png</image>
<caption>Battery Limiting</caption> <caption>Battery Limiting</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4a-battery-ext.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/4a-battery-ext.png</image>
<caption>Battery Extender</caption> <caption>Battery Extender</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/5-hardware.png</image> <image>https://raw.githubusercontent.com/Steve-Tech/YAFI/refs/heads/main/docs/5-hardware.png</image>
<caption>Hardware Info</caption> <caption>Hardware Info</caption>
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases>
<release version="0.6" date="2025-09-28">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.6</url>
<description>
<p>The following changes have been made:</p>
<ul>
<li>YAFI now has a new logo!</li>
<li>The advanced LED settings now detect available LEDs.</li>
<li>The ALS and lid open sensor has been added.</li>
<li>Stuttering has been reduced when opening the about dialog.</li>
</ul>
</description>
</release>
<release version="0.5" date="2025-09-16">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.5</url>
<description>
<p>The following bugs have been fixed:</p>
<ul>
<li>LED page crashing when encountering unsupported LEDs.</li>
<li>Scaling issues on Windows.</li>
<li>Minimum charge limiter doesn't work.</li>
</ul>
<p>This release also adds a traceback to the debug info, when there is an error during initialisation.</p>
</description>
</release>
<release version="0.4" date="2025-09-06">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.4</url>
<description>
<p>This release also adds a new battery statistics page.</p>
</description>
</release>
<release version="0.3" date="2025-04-13">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.3</url>
<description>
<p>YAFI now shows the battery limiter value.</p>
</description>
</release>
<release version="0.2" date="2025-03-24">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.2</url>
<description>
<p>This fixes an LED list bug.</p>
</description>
</release>
<release version="0.1" date="2025-03-20">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.1</url>
<description>
<p>This is the first release of YAFI.</p>
</description>
</release>
</releases>
</component> </component>

View File

@@ -86,7 +86,7 @@
r="2" /></g><path r="2" /></g><path
id="cog" id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers" style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path d="m 47.818359,18 2.542969,2.630859 c -2.531091,-2.605911 -6.371601,-0.420022 -6.429687,-0.386718 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 C 33.755122,44.16501 31.7167,47.65852 30.302828,51.455131 l -10.679687,2.671875 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 47.818359,110 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 108.37109,73.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 97.697266,51.455078 C 96.283273,47.658406 94.245149,44.164957 91.708984,41.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 80.181641,18 l -2.550782,2.636719 -7.65039,7.912109 C 68.035313,28.223033 66.037713,28.054688 64,28.054688 c -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z M 64,36 A 27.999999,27.999997 0 0 1 92,64 27.999999,27.999997 0 0 1 64,92 27.999999,27.999997 0 0 1 36,64 27.999999,27.999997 0 0 1 64,36 Z" /><path
id="Y" id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none" style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg> d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@@ -2,9 +2,9 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
width="128" width="96"
height="128" height="96"
viewBox="0 0 128 128" viewBox="0 0 96 96"
version="1.1" version="1.1"
id="svg1" id="svg1"
xml:space="preserve" xml:space="preserve"
@@ -15,7 +15,7 @@
id="icon"><path id="icon"><path
id="cog" id="cog"
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers" style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path d="m 31.818314,2 2.542969,2.630859 C 31.830192,2.024948 27.989682,4.210837 27.931596,4.244141 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 c -2.535988,3.065348 -4.57441,6.558858 -5.988282,10.355469 L 3.623096,38.127006 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 31.818314,94 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 92.371045,57.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 81.697221,35.455078 C 80.283228,31.658406 78.245104,28.164957 75.708939,25.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 64.181596,2 l -2.550782,2.636719 -7.65039,7.912109 c -1.945156,-0.325795 -3.942756,-0.49414 -5.980469,-0.49414 -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z m 16.181641,18 a 27.999999,27.999997 0 0 1 28,28 27.999999,27.999997 0 0 1 -28,28 27.999999,27.999997 0 0 1 -28,-28 27.999999,27.999997 0 0 1 28,-28 z" /><path
id="Y" id="Y"
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none" style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg> d="M 48.000002,46.00022 34.000001,32.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 104 KiB

3
flathub.json Normal file
View File

@@ -0,0 +1,3 @@
{
"only-arches": ["x86_64"]
}

View File

@@ -26,21 +26,24 @@
inkscape:pagecheckerboard="0" inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:zoom="2" inkscape:zoom="5.6568542"
inkscape:cx="37.25" inkscape:cx="38.802485"
inkscape:cy="109" inkscape:cy="83.261824"
inkscape:window-width="1876" inkscape:window-width="1876"
inkscape:window-height="1025" inkscape:window-height="1025"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="0" inkscape:window-y="0"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs inkscape:current-layer="icon" /><defs
id="defs1" /><g id="defs1" /><g
inkscape:label="Layer 1" inkscape:label="Layer 1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1"><g id="layer1"><g
id="icon" id="icon"
inkscape:label="icon"><g inkscape:label="icon"
inkscape:export-filename="icon.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><g
id="chip" id="chip"
inkscape:label="chip" inkscape:label="chip"
style="stroke-width:0;stroke-dasharray:none"><path style="stroke-width:0;stroke-dasharray:none"><path
@@ -150,8 +153,8 @@
inkscape:label="dot" /></g><path inkscape:label="dot" /></g><path
id="cog" id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers" style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" inkscape:label="cog"
inkscape:label="cog" /><path d="M 47.818359 18 L 50.361328 20.630859 C 47.830237 18.024948 43.989727 20.210837 43.931641 20.244141 L 43.927734 20.246094 L 36.144531 24.740234 C 36.106488 24.762299 32.281781 26.992617 33.255859 30.486328 L 33.257812 30.498047 L 33.263672 30.513672 L 36.291016 41.099609 C 33.755028 44.164957 31.716606 47.658467 30.302734 51.455078 L 19.623047 54.126953 C 16.073152 55.021138 16.072266 59.507721 16.072266 59.507812 L 16.072266 68.492188 C 16.072266 68.492279 16.073278 72.985361 19.630859 73.875 L 30.302734 76.544922 C 31.716606 80.341412 33.755028 83.833445 36.291016 86.898438 L 33.263672 97.484375 L 33.257812 97.501953 C 33.257633 97.502589 33.257991 97.50327 33.257812 97.503906 C 32.269112 101.02109 36.144531 103.25977 36.144531 103.25977 L 43.927734 107.75391 C 43.927734 107.75391 43.931579 107.75582 43.931641 107.75586 C 43.953413 107.7684 47.82009 109.98943 50.363281 107.36719 L 47.818359 110 L 50.367188 107.36523 L 58.019531 99.451172 C 59.964687 99.777081 61.962283 99.945313 64 99.945312 C 66.037713 99.945312 68.035313 99.777081 69.980469 99.451172 L 77.630859 107.36328 L 77.632812 107.36523 L 80.181641 110 L 77.636719 107.36719 C 80.159522 109.96841 83.985855 107.80302 84.068359 107.75586 L 91.855469 103.25977 C 91.855469 103.25977 95.730889 101.02109 94.742188 97.503906 L 94.742188 97.501953 L 94.736328 97.484375 L 91.708984 86.898438 C 94.245149 83.833445 96.283273 80.341412 97.697266 76.544922 L 108.37109 73.875 C 111.92871 72.985352 111.92773 68.492188 111.92773 68.492188 L 111.92773 59.507812 C 111.92773 59.507813 111.92871 55.014649 108.37109 54.125 L 97.697266 51.455078 C 96.283273 47.658406 94.245149 44.164957 91.708984 41.099609 L 94.736328 30.513672 L 94.742188 30.498047 L 94.744141 30.486328 C 95.720526 26.984137 91.875035 24.751558 91.855469 24.740234 L 84.072266 20.246094 C 84.072175 20.246042 84.068504 20.244224 84.068359 20.244141 C 84.01404 20.212982 80.171032 18.023649 77.638672 20.630859 L 80.181641 18 L 77.630859 20.636719 L 69.980469 28.548828 C 68.035313 28.223033 66.037713 28.054688 64 28.054688 C 61.962283 28.054688 59.964687 28.223025 58.019531 28.548828 L 50.369141 20.636719 L 47.818359 18 z M 64 36 A 27.999999 27.999997 0 0 1 92 64 A 27.999999 27.999997 0 0 1 64 92 A 27.999999 27.999997 0 0 1 36 64 A 27.999999 27.999997 0 0 1 64 36 z " /><path
id="Y" id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none" style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003"

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -1,5 +1,5 @@
project('yafi', project('yafi',
version: '0.5', version: '0.6',
meson_version: '>= 1.0.0', meson_version: '>= 1.0.0',
default_options: [ 'warning_level=2', 'werror=false', ], default_options: [ 'warning_level=2', 'werror=false', ],
) )

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -8,7 +8,7 @@
version="1.1" version="1.1"
id="svg1" id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)" inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="spash.svg" sodipodi:docname="splash.svg"
inkscape:export-filename="splash.png" inkscape:export-filename="splash.png"
inkscape:export-xdpi="180" inkscape:export-xdpi="180"
inkscape:export-ydpi="180" inkscape:export-ydpi="180"
@@ -27,11 +27,11 @@
inkscape:deskcolor="#d1d1d1" inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px" inkscape:document-units="px"
showguides="false" showguides="false"
inkscape:zoom="2" inkscape:zoom="2.8284271"
inkscape:cx="36.25" inkscape:cx="118.26361"
inkscape:cy="178.75" inkscape:cy="131.87541"
inkscape:window-width="1920" inkscape:window-width="1876"
inkscape:window-height="1052" inkscape:window-height="1025"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="0" inkscape:window-y="0"
inkscape:window-maximized="1" inkscape:window-maximized="1"
@@ -127,79 +127,79 @@
x="0" x="0"
y="0" /> y="0" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 0,117.875 H 23.874996 L 43.75,97.999992 H 76" d="M 0,117.875 H 23.874996 L 43.75,97.999992 H 76"
id="path4" id="path4"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 0,97.875016 H 23.874996 L 43.75,78.000008 H 76" d="M 0,97.875016 H 23.874996 L 43.75,78.000008 H 76"
id="path4-4" id="path4-4"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 0,77.875008 H 23.874996 L 43.75,58 H 76" d="M 0,77.875008 H 23.874996 L 43.75,58 H 76"
id="path4-9" id="path4-9"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 0,57.875008 H 23.874996 L 43.75,38 H 76" d="M 0,57.875008 H 23.874996 L 43.75,38 H 76"
id="path4-2" id="path4-2"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 97.999999,0 V 16.000001" d="M 97.999999,0 V 16.000001"
id="path5" id="path5"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 118,0 V 16.000001" d="M 118,0 V 16.000001"
id="path5-8" id="path5-8"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 138.00001,0 V 16.000001" d="M 138.00001,0 V 16.000001"
id="path5-4" id="path5-4"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 157.99999,0 V 16.000001" d="M 157.99999,0 V 16.000001"
id="path5-89" id="path5-89"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 256,117.87502 H 232.125 L 212.25,98.000008 H 180" d="M 256,117.87502 H 232.125 L 212.25,98.000008 H 180"
id="path4-1" id="path4-1"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 255.625,97.875035 H 231.75 L 211.875,78.000023 H 180" d="M 255.625,97.875035 H 231.75 L 211.875,78.000023 H 180"
id="path4-1-5" id="path4-1-5"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 255.625,77.875012 H 231.75 L 211.875,58 H 180" d="M 255.625,77.875012 H 231.75 L 211.875,58 H 180"
id="path4-1-6" id="path4-1-6"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 255.625,57.875012 H 231.75 L 211.875,38 H 180" d="M 255.625,57.875012 H 231.75 L 211.875,38 H 180"
id="path4-1-63" id="path4-1-63"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="m 192.16536,142.16357 -9.15729,-9.15728 H 163.00629 L 158.00001,128 l 0,-8" d="m 192.16536,142.16357 -9.15729,-9.15728 H 163.00629 L 158.00001,128 l 0,-8"
id="path9" /> id="path9" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="m 147.1875,143.0625 v -5.875 L 138.00001,128 l 0,-8" d="m 147.1875,143.0625 v -5.875 L 138.00001,128 l 0,-8"
id="path10" /> id="path10" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="M 119.98796,141.81833 118,139.83037 V 128 120" d="M 119.98796,141.81833 118,139.83037 V 128 120"
id="path11" /> id="path11" />
<path <path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal" style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:normal"
d="m 101,142.125 -3.000001,-3 V 128 120" d="m 101,142.125 -3.000001,-3 V 128 120"
id="path12" /> id="path12" />
<text <text
@@ -232,7 +232,7 @@
<g <g
id="icon" id="icon"
inkscape:label="icon" inkscape:label="icon"
transform="translate(63.999998,4)"> transform="translate(63.999984,4)">
<g <g
id="chip" id="chip"
inkscape:label="chip" inkscape:label="chip"
@@ -364,8 +364,8 @@
<path <path
id="cog" id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers" style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" inkscape:label="cog"
inkscape:label="cog" /> d="m 47.818359,18 2.542969,2.630859 c -2.531091,-2.605911 -6.371601,-0.420022 -6.429687,-0.386718 l -0.0039,0.002 -7.783203,4.49414 c -0.03804,0.02206 -3.86275,2.252383 -2.888672,5.746094 l 0.002,0.01172 0.0059,0.01563 3.027344,10.585937 C 33.755122,44.16501 31.7167,47.65852 30.302828,51.455131 l -10.679687,2.671875 c -3.549895,0.894185 -3.550781,5.380768 -3.550781,5.380859 v 8.984376 c 0,9.1e-5 0.001,4.493173 3.558593,5.382812 l 10.671875,2.669922 c 1.413872,3.79649 3.452294,7.288523 5.988282,10.353516 l -3.027344,10.585937 -0.0059,0.01758 c -1.79e-4,6.36e-4 1.79e-4,0.0013 0,0.002 -0.9887,3.517182 2.886719,5.755862 2.886719,5.755862 l 7.783203,4.49414 c 0,0 0.0038,0.002 0.0039,0.002 0.02177,0.0125 3.888449,2.23357 6.43164,-0.38867 L 47.818359,110 l 2.548829,-2.63477 7.652343,-7.914058 c 1.945156,0.325909 3.942752,0.494141 5.980469,0.49414 2.037713,0 4.035313,-0.168231 5.980469,-0.49414 l 7.65039,7.912108 0.002,0.002 2.548829,2.63477 -2.544922,-2.63281 c 2.522803,2.60122 6.349136,0.43583 6.43164,0.38867 l 7.78711,-4.49609 c 0,0 3.87542,-2.23868 2.886719,-5.755864 v -0.002 l -0.0059,-0.01758 -3.027344,-10.585937 c 2.536165,-3.064993 4.574289,-6.557026 5.988282,-10.353516 L 108.37109,73.875 c 3.55762,-0.889648 3.55664,-5.382812 3.55664,-5.382812 v -8.984376 c 0,10e-7 9.8e-4,-4.493163 -3.55664,-5.382812 L 97.697266,51.455078 C 96.283273,47.658406 94.245149,44.164957 91.708984,41.099609 l 3.027344,-10.585937 0.0059,-0.01563 0.002,-0.01172 c 0.976385,-3.502191 -2.869106,-5.73477 -2.888672,-5.746094 l -7.783203,-4.49414 c -9.1e-5,-5.2e-5 -0.0038,-0.0019 -0.0039,-0.002 -0.05432,-0.03116 -3.897327,-2.220492 -6.429687,0.386718 L 80.181641,18 l -2.550782,2.636719 -7.65039,7.912109 C 68.035313,28.223033 66.037713,28.054688 64,28.054688 c -2.037717,0 -4.035313,0.168337 -5.980469,0.49414 l -7.65039,-7.912109 z M 64,36 A 27.999999,27.999997 0 0 1 92,64 27.999999,27.999997 0 0 1 64,92 27.999999,27.999997 0 0 1 36,64 27.999999,27.999997 0 0 1 64,36 Z" />
<path <path
id="Y" id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none" style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 149 KiB

View File

@@ -1,11 +1,15 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files from PyInstaller.utils.hooks import collect_data_files
import os import os
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--onefile", action="store_true")
options = parser.parse_args()
datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else [] datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else []
datas += collect_data_files('yafi') datas += collect_data_files('yafi')
a = Analysis( a = Analysis(
['entrypoint.py'], ['entrypoint.py'],
pathex=[], pathex=[],
@@ -20,6 +24,8 @@ a = Analysis(
optimize=2, optimize=2,
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
if options.onefile:
splash = Splash( splash = Splash(
'splash.png', 'splash.png',
binaries=a.binaries, binaries=a.binaries,
@@ -31,14 +37,22 @@ splash = Splash(
always_on_top=True, always_on_top=True,
) )
exe = EXE( exe_args = (
pyz, [
a.scripts, a.scripts,
a.binaries, a.binaries,
a.datas, a.datas,
splash, splash,
splash.binaries, splash.binaries,
[], ]
if options.onefile
else [a.scripts]
)
exe = EXE(
pyz,
*exe_args,
exclude_binaries=not options.onefile,
name='YAFI', name='YAFI',
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
@@ -54,3 +68,14 @@ exe = EXE(
entitlements_file=None, entitlements_file=None,
icon=['yafi.ico'], icon=['yafi.ico'],
) )
if not options.onefile:
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='YAFI',
)

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "yafi" name = "yafi"
version = "0.5" version = "0.6"
authors = [ authors = [
{ name="Steve-Tech" } { name="Steve-Tech" }
] ]

View File

@@ -0,0 +1,14 @@
{
"name": "python3-cros_ec_python",
"buildsystem": "simple",
"build-commands": [
"pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"cros_ec_python\" --no-build-isolation"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/33/11/c23a7acaa333589921a2f524517eb719dfb72628153ae22fcdf2e9052ac6/cros_ec_python-0.2.0-py3-none-any.whl",
"sha256": "d38e493fbcaf23bc4b613d1342a036cecc6506284afc74f37013a3eac85a01b9"
}
]
}

View File

@@ -27,17 +27,24 @@ import cros_ec_python.exceptions as ec_exceptions
class HardwarePage(Gtk.Box): class HardwarePage(Gtk.Box):
__gtype_name__ = 'HardwarePage' __gtype_name__ = 'HardwarePage'
hw_als = Gtk.Template.Child()
hw_als_label = Gtk.Template.Child()
hw_chassis = Gtk.Template.Child() hw_chassis = Gtk.Template.Child()
hw_chassis_label = Gtk.Template.Child() hw_chassis_label = Gtk.Template.Child()
hw_fp_pwr = Gtk.Template.Child()
hw_fp_pwr_en = Gtk.Template.Child()
hw_fp_pwr_dis = Gtk.Template.Child()
hw_priv_cam = Gtk.Template.Child() hw_priv_cam = Gtk.Template.Child()
hw_priv_cam_sw = Gtk.Template.Child() hw_priv_cam_sw = Gtk.Template.Child()
hw_priv_mic = Gtk.Template.Child() hw_priv_mic = Gtk.Template.Child()
hw_priv_mic_sw = Gtk.Template.Child() hw_priv_mic_sw = Gtk.Template.Child()
hw_lid_open = Gtk.Template.Child()
hw_fp_pwr = Gtk.Template.Child() hw_lid_open_sw = Gtk.Template.Child()
hw_fp_pwr_en = Gtk.Template.Child() hw_pwr_btn = Gtk.Template.Child()
hw_fp_pwr_dis = Gtk.Template.Child() hw_pwr_btn_sw = Gtk.Template.Child()
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
@@ -66,7 +73,13 @@ class HardwarePage(Gtk.Box):
GLib.timeout_add_seconds(1, self._update_hardware, app) GLib.timeout_add_seconds(1, self._update_hardware, app)
def _update_hardware(self, app): def _update_hardware(self, app):
success = False # Memmap (ALS and Lid Open)
als = ec_commands.memmap.get_als(app.cros_ec)
self.hw_als_label.set_label(f"{als[0]} lux" if als[0] != 65535 else "MAX")
switches = ec_commands.memmap.get_switches(app.cros_ec)
self.hw_lid_open_sw.set_active(switches["lid_open"])
self.hw_pwr_btn_sw.set_active(switches["power_button_pressed"])
# Chassis # Chassis
if not ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION in app.no_support: if not ec_commands.framework_laptop.EC_CMD_CHASSIS_INTRUSION in app.no_support:
try: try:
@@ -82,8 +95,6 @@ class HardwarePage(Gtk.Box):
self.hw_chassis.set_subtitle( self.hw_chassis.set_subtitle(
"Currently " + ("Open" if ec_chassis_open else "Closed") "Currently " + ("Open" if ec_chassis_open else "Closed")
) )
success = True
except ec_exceptions.ECError as e: except ec_exceptions.ECError as e:
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND: if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
app.no_support.append( app.no_support.append(
@@ -104,8 +115,6 @@ class HardwarePage(Gtk.Box):
) )
self.hw_priv_cam_sw.set_active(ec_privacy["camera"]) self.hw_priv_cam_sw.set_active(ec_privacy["camera"])
self.hw_priv_mic_sw.set_active(ec_privacy["microphone"]) self.hw_priv_mic_sw.set_active(ec_privacy["microphone"])
success = True
except ec_exceptions.ECError as e: except ec_exceptions.ECError as e:
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND: if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
app.no_support.append( app.no_support.append(
@@ -116,4 +125,4 @@ class HardwarePage(Gtk.Box):
else: else:
raise e raise e
return app.current_page == 4 and success return app.current_page == 4

View File

@@ -27,35 +27,78 @@ import cros_ec_python.exceptions as ec_exceptions
class LedsPage(Gtk.Box): class LedsPage(Gtk.Box):
__gtype_name__ = 'LedsPage' __gtype_name__ = 'LedsPage'
first_run = True
fp_led_version = 1
led_pwr = Gtk.Template.Child() led_pwr = Gtk.Template.Child()
led_pwr_scale = Gtk.Template.Child() led_pwr_scale = Gtk.Template.Child()
led_pwr_scale_adj = Gtk.Template.Child()
led_kbd = Gtk.Template.Child() led_kbd = Gtk.Template.Child()
led_kbd_scale = Gtk.Template.Child() led_kbd_scale = Gtk.Template.Child()
led_advanced = Gtk.Template.Child() led_advanced = Gtk.Template.Child()
led_pwr_colour = Gtk.Template.Child()
led_chg_colour = Gtk.Template.Child()
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
def setup(self, app): def setup(self, app):
# Power LED # Power LED
fp_led_level_text = ["High", "Medium", "Low", "Ultra Low"]
try: try:
def handle_led_pwr(scale): def handle_led_pwr(scale):
match self.fp_led_version:
case 0:
value = int(abs(scale.get_value() - 2)) value = int(abs(scale.get_value() - 2))
ec_commands.framework_laptop.set_fp_led_level(app.cros_ec, value) ec_commands.framework_laptop.set_fp_led_level(
self.led_pwr.set_subtitle(["High", "Medium", "Low"][value]) app.cros_ec, value
)
self.led_pwr.set_subtitle(fp_led_level_text[value])
case 1:
value = int(scale.get_value())
ec_commands.framework_laptop.set_fp_led_percent(
app.cros_ec, value
)
self.led_pwr.set_subtitle(f"{value}%")
if self.fp_led_version == 1:
try:
current_fp_levels = (
ec_commands.framework_laptop.get_fp_led_levels_v1(
app.cros_ec
).value
)
self.led_pwr_scale.set_value(current_fp_levels["percentage"])
if current_fp_levels["level"] < len(fp_led_level_text):
self.led_pwr.set_subtitle(
f"{fp_led_level_text[current_fp_levels['level']]} ({current_fp_levels['percentage']}%)"
)
else:
self.led_pwr.set_subtitle(f"{current_fp_levels['percentage']}%")
except ec_exceptions.ECError as e:
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_VERSION:
self.fp_led_version = 0
else:
raise e
if self.fp_led_version == 0:
current_fp_level = ec_commands.framework_laptop.get_fp_led_level( current_fp_level = ec_commands.framework_laptop.get_fp_led_level(
app.cros_ec app.cros_ec
).value ).value
if current_fp_level < len(fp_led_level_text):
self.led_pwr_scale_adj.set_upper(2)
self.led_pwr_scale.set_value(abs(current_fp_level - 2)) self.led_pwr_scale.set_value(abs(current_fp_level - 2))
self.led_pwr.set_subtitle(["High", "Medium", "Low"][current_fp_level]) self.led_pwr.set_subtitle(f"{fp_led_level_text[current_fp_level]}")
else:
# Disable if an unsupported level is set
self.led_pwr_scale.set_sensitive(False)
current_fp_percent = (
ec_commands.framework_laptop.get_fp_led_percent(app.cros_ec)
)
self.led_pwr_scale.set_value(current_fp_percent)
self.led_pwr.set_subtitle(f"Custom {current_fp_percent}%")
self.led_pwr_scale.connect("value-changed", handle_led_pwr) self.led_pwr_scale.connect("value-changed", handle_led_pwr)
except ec_exceptions.ECError as e: except ec_exceptions.ECError as e:
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND: if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
@@ -84,31 +127,38 @@ class LedsPage(Gtk.Box):
self.led_kbd.set_visible(False) self.led_kbd.set_visible(False)
# Advanced options # Advanced options
if ec_commands.general.get_cmd_versions( if (
ec_commands.general.get_cmd_versions(
app.cros_ec, ec_commands.leds.EC_CMD_LED_CONTROL app.cros_ec, ec_commands.leds.EC_CMD_LED_CONTROL
)
and self.first_run
): ):
# Advanced: Power LED
led_pwr_colour_strings = self.led_pwr_colour.get_model()
all_colours = ["Red", "Green", "Blue", "Yellow", "White", "Amber"] all_colours = ["Red", "Green", "Blue", "Yellow", "White", "Amber"]
led_names = {
def add_colours(strings, led_id): ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED: "Battery LED",
# Auto and Off should already be present ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED: "Power LED",
if strings.get_n_items() <= 2: ec_commands.leds.EcLedId.EC_LED_ID_ADAPTER_LED: "Adapter LED",
supported_colours = ec_commands.leds.led_control_get_max_values( ec_commands.leds.EcLedId.EC_LED_ID_LEFT_LED: "Left LED",
ec_commands.leds.EcLedId.EC_LED_ID_RIGHT_LED: "Right LED",
ec_commands.leds.EcLedId.EC_LED_ID_RECOVERY_HW_REINIT_LED: "Recovery LED",
ec_commands.leds.EcLedId.EC_LED_ID_SYSRQ_DEBUG_LED: "SysRq LED",
}
leds = {}
for i in range(ec_commands.leds.EcLedId.EC_LED_ID_COUNT.value):
try:
led_id = ec_commands.leds.EcLedId(i)
leds[led_id] = ec_commands.leds.led_control_get_max_values(
app.cros_ec, led_id app.cros_ec, led_id
) )
for i, colour in enumerate(all_colours):
if supported_colours[i]:
strings.append(colour)
try:
add_colours(
led_pwr_colour_strings, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED
)
except ec_exceptions.ECError as e: except ec_exceptions.ECError as e:
self.led_pwr_colour.set_sensitive(False) if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_PARAM:
continue
else:
raise e
# Power LED does not support Blue, even though Intel models think they do
leds[ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED][2] = 0
def handle_led_colour(combobox, led_id): def handle_led_colour(combobox, led_id):
colour = combobox.get_selected() - 2 colour = combobox.get_selected() - 2
@@ -132,30 +182,20 @@ class LedsPage(Gtk.Box):
100, 100,
ec_commands.leds.EcLedColors(colour_idx), ec_commands.leds.EcLedColors(colour_idx),
) )
for led_id, supported_colours in leds.items():
self.led_pwr_colour.connect( if any(supported_colours):
combo = Adw.ComboRow(title=led_names[led_id])
model = Gtk.StringList.new(["Auto", "Off"])
for i, colour in enumerate(all_colours):
if supported_colours[i]:
model.append(colour)
combo.set_model(model)
combo.connect(
"notify::selected", "notify::selected",
lambda combo, _: handle_led_colour( lambda combobox, _, led_id=led_id: handle_led_colour(
combo, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED combobox, led_id
), ),
) )
self.led_advanced.add_row(combo)
# Advanced: Charging LED self.first_run = False
led_chg_colour_strings = self.led_chg_colour.get_model()
try:
add_colours(
led_chg_colour_strings,
ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED,
)
except ec_exceptions.ECError as e:
self.led_chg_colour.set_sensitive(False)
self.led_chg_colour.connect(
"notify::selected",
lambda combo, _: handle_led_colour(
combo, ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED
),
)
else:
self.led_advanced.set_visible(False)

View File

@@ -18,6 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
import os
import sys import sys
import traceback import traceback
import threading import threading
@@ -67,7 +68,8 @@ class YafiApplication(Adw.Application):
self.win = YafiWindow(application=self) self.win = YafiWindow(application=self)
# Update the splash screen # Update the splash screen
if getattr(sys, 'frozen', False): splash = getattr(sys, 'frozen', False) and '_PYI_SPLASH_IPC' in os.environ
if splash:
import pyi_splash import pyi_splash
pyi_splash.update_text("Detecting EC") pyi_splash.update_text("Detecting EC")
@@ -87,13 +89,13 @@ class YafiApplication(Adw.Application):
) )
self.show_error("EC Initalisation Error", message) self.show_error("EC Initalisation Error", message)
if getattr(sys, 'frozen', False): if splash:
pyi_splash.close() pyi_splash.close()
self.win.present() self.win.present()
return return
if getattr(sys, 'frozen', False): if splash:
pyi_splash.update_text("Building Interface") pyi_splash.update_text("Building Interface")
self.change_page(self.win.content, ThermalsPage()) self.change_page(self.win.content, ThermalsPage())
@@ -103,7 +105,7 @@ class YafiApplication(Adw.Application):
("LEDs", LedsPage()), ("LEDs", LedsPage()),
("Battery", BatteryPage()), ("Battery", BatteryPage()),
("Battery Limiter", BatteryLimiterPage()), ("Battery Limiter", BatteryLimiterPage()),
("Hardware", HardwarePage()), ("Sensors", HardwarePage()),
("About", None), ("About", None),
) )
@@ -123,7 +125,7 @@ class YafiApplication(Adw.Application):
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index())) self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
if getattr(sys, 'frozen', False): if splash:
pyi_splash.close() pyi_splash.close()
self.win.present() self.win.present()
@@ -133,14 +135,15 @@ class YafiApplication(Adw.Application):
about = Adw.AboutDialog( about = Adw.AboutDialog(
application_icon="au.stevetech.yafi", application_icon="au.stevetech.yafi",
application_name="Yet Another Framework Interface", application_name="Yet Another Framework Interface",
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n" comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n\n"
+ "It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.", + "It is written in Python with a GTK4 Adwaita theme, and uses the CrOS_EC_Python library to communicate with the EC.\n\n"
+ "YAFI is not affiliated with Framework Computer Inc. in any way.",
copyright="© 2025 Stephen Horvath", copyright="© 2025 Stephen Horvath",
developer_name="Stephen Horvath", developer_name="Stephen Horvath",
developers=["Stephen Horvath https://github.com/Steve-Tech"], developers=["Stephen Horvath https://github.com/Steve-Tech"],
issue_url="https://github.com/Steve-Tech/YAFI/issues", issue_url="https://github.com/Steve-Tech/YAFI/issues",
license_type=Gtk.License.GPL_2_0, license_type=Gtk.License.GPL_2_0,
version="0.5", version="0.6",
website="https://github.com/Steve-Tech/YAFI", website="https://github.com/Steve-Tech/YAFI",
) )
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"]) about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])

View File

@@ -2,7 +2,7 @@
<!-- Created with Cambalache 0.96.1 --> <!-- Created with Cambalache 0.96.1 -->
<interface> <interface>
<!-- interface-name hardware.ui --> <!-- interface-name hardware.ui -->
<!-- interface-description The Hardware page for YAFI --> <!-- interface-description The Sensors page for YAFI -->
<!-- interface-copyright Steve-Tech --> <!-- interface-copyright Steve-Tech -->
<requires lib="gtk" version="4.0"/> <requires lib="gtk" version="4.0"/>
<requires lib="libadwaita" version="1.0"/> <requires lib="libadwaita" version="1.0"/>
@@ -15,7 +15,15 @@
<child> <child>
<object class="AdwActionRow"> <object class="AdwActionRow">
<property name="selectable">False</property> <property name="selectable">False</property>
<property name="title">Hardware Status</property> <property name="title">Sensors</property>
</object>
</child>
<child>
<object class="AdwActionRow" id="hw_als">
<property name="title">Ambient Light Sensor</property>
<child>
<object class="GtkLabel" id="hw_als_label"/>
</child>
</object> </object>
</child> </child>
<child> <child>
@@ -26,6 +34,30 @@
</child> </child>
</object> </object>
</child> </child>
<child>
<object class="AdwActionRow" id="hw_fp_pwr">
<property name="title">Fingerprint</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>
</child>
<child> <child>
<object class="AdwActionRow" id="hw_priv_cam"> <object class="AdwActionRow" id="hw_priv_cam">
<property name="subtitle">Use Privacy Switch</property> <property name="subtitle">Use Privacy Switch</property>
@@ -65,23 +97,35 @@
</object> </object>
</child> </child>
<child> <child>
<object class="AdwActionRow" id="hw_fp_pwr"> <object class="AdwActionRow" id="hw_lid_open">
<property name="title">Fingerprint</property> <property name="title">Lid Open</property>
<property name="visible">False</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="halign">end</property> <property name="halign">end</property>
<property name="homogeneous">True</property> <property name="homogeneous">True</property>
<property name="spacing">5</property>
<property name="valign">center</property> <property name="valign">center</property>
<child> <child>
<object class="GtkButton" id="hw_fp_pwr_en"> <object class="GtkSwitch" id="hw_lid_open_sw">
<property name="label">Enable</property> <property name="active">True</property>
<property name="sensitive">False</property>
</object>
</child>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkButton" id="hw_fp_pwr_dis"> <object class="AdwActionRow" id="hw_pwr_btn">
<property name="label">Disable</property> <property name="title">Power Button Pressed</property>
<child>
<object class="GtkBox">
<property name="halign">end</property>
<property name="homogeneous">True</property>
<property name="valign">center</property>
<child>
<object class="GtkSwitch" id="hw_pwr_btn_sw">
<property name="active">True</property>
<property name="sensitive">False</property>
</object> </object>
</child> </child>
</object> </object>

6
yafi/ui/leds.cmb Normal file
View File

@@ -0,0 +1,6 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd">
<!-- Created with Cambalache 0.96.1 -->
<cambalache-project version="0.96.0" target_tk="gtk-4.0">
<ui template-class="LedsPage" filename="leds.ui" sha256="a52e82a54a64ff7e5ca5a83af2ee096c1be44c379cc286c65fbee8eaf2400324"/>
</cambalache-project>

View File

@@ -26,11 +26,10 @@
<child> <child>
<object class="GtkScale" id="led_pwr_scale"> <object class="GtkScale" id="led_pwr_scale">
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment"> <object class="GtkAdjustment" id="led_pwr_scale_adj">
<property name="page-increment">1.0</property> <property name="page-increment">1.0</property>
<property name="step-increment">1.0</property> <property name="step-increment">1.0</property>
<property name="upper">2.0</property> <property name="upper">100.0</property>
<property name="value">2.0</property>
</object> </object>
</property> </property>
<property name="hexpand">True</property> <property name="hexpand">True</property>
@@ -69,52 +68,6 @@
<property name="selectable">False</property> <property name="selectable">False</property>
<property name="subtitle">These options break normal functionality</property> <property name="subtitle">These options break normal functionality</property>
<property name="title">Advanced Options</property> <property name="title">Advanced Options</property>
<child>
<object class="AdwPreferencesGroup">
<property name="description">When using these options, the power LED may not turn off with the computer.</property>
<property name="margin-bottom">5</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<property name="title">Power Button LED</property>
<child>
<object class="AdwComboRow" id="led_pwr_colour">
<property name="model">
<object class="GtkStringList">
<items>
<item>Auto</item>
<item>Off</item>
</items>
</object>
</property>
<property name="title">Colour</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwPreferencesGroup">
<property name="description">When using these options, the charging indicator will no longer indicate charging.</property>
<property name="margin-bottom">5</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<property name="title">Charging Indicators</property>
<child>
<object class="AdwComboRow" id="led_chg_colour">
<property name="model">
<object class="GtkStringList">
<items>
<item>Auto</item>
<item>Off</item>
</items>
</object>
</property>
<property name="title">Colour</property>
</object>
</child>
</object>
</child>
</object> </object>
</child> </child>
<style> <style>

View File

@@ -4,8 +4,8 @@
<cambalache-project version="0.96.0" target_tk="gtk-4.0"> <cambalache-project version="0.96.0" target_tk="gtk-4.0">
<ui template-class="YafiWindow" filename="yafi.ui" sha256="9d1b2f030e4a816eb0b1aa53ae1d80c5b50a2f4646e32c7a64803eb6f6ed3947"/> <ui template-class="YafiWindow" filename="yafi.ui" sha256="9d1b2f030e4a816eb0b1aa53ae1d80c5b50a2f4646e32c7a64803eb6f6ed3947"/>
<ui template-class="ThermalsPage" filename="thermals.ui" sha256="e301e65649005315ff60d250b60a47f6250ad6feb27db104051fcf0143cde173"/> <ui template-class="ThermalsPage" filename="thermals.ui" sha256="e301e65649005315ff60d250b60a47f6250ad6feb27db104051fcf0143cde173"/>
<ui template-class="LedsPage" filename="leds.ui" sha256="0350d22d570de039d63602ba40925f17fff6680fd5909d2ebf19600f351eb0f2"/> <ui template-class="LedsPage" filename="leds.ui" sha256="abc3ee759974a5c92feb48cc258dbe7271d0402facf71fd5e779f2bb1a277e16"/>
<ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="b5d41b19cb1fb7ca5b4bcfae43244e54111f5e8d8c51d95448d6a92b5185d2c4"/> <ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="b5d41b19cb1fb7ca5b4bcfae43244e54111f5e8d8c51d95448d6a92b5185d2c4"/>
<ui template-class="HardwarePage" filename="hardware.ui" sha256="f4deec4e38e683fde97656802dbfb2a638ab46a0e36af5c9a37f277f49e2aabb"/> <ui template-class="HardwarePage" filename="hardware.ui" sha256="37ea282198d9f60435f80e4adf8256cd2249e590dcad4b63af634d828673f1bf"/>
<ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/> <ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/>
</cambalache-project> </cambalache-project>

Binary file not shown.