Compare commits
24 Commits
0.6
...
aa8e05f676
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa8e05f676 | ||
|
|
f45cb3db36 | ||
|
|
a91556e3e6 | ||
|
|
f8f043cf48 | ||
|
|
8453f41914 | ||
|
|
a0ba66ab99 | ||
|
|
7c89b4197f | ||
|
|
c9b659e22a | ||
|
|
3e7873de8f | ||
|
|
988aabea07 | ||
|
|
804ae3fcb6 | ||
|
|
a97148f7a5 | ||
|
|
8b10c49ed4 | ||
|
|
f31054c18b | ||
|
|
2b50f0816f | ||
|
|
1fc4b94237 | ||
|
|
90a994a685 | ||
|
|
7b123da001 | ||
|
|
c8fd626446 | ||
|
|
0f6fee40ae | ||
|
|
4a788c2395 | ||
|
|
d2f34c9b5a | ||
|
|
4958722edd | ||
|
|
23b54ee397 |
2
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
github: [Steve-Tech]
|
||||
thanks_dev: u/gh/steve-tech
|
||||
4
.github/workflows/flatpak.yml
vendored
@@ -8,10 +8,10 @@ jobs:
|
||||
flatpak:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-49
|
||||
image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-50
|
||||
options: --privileged
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Build Flatpak
|
||||
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||
with:
|
||||
|
||||
4
.github/workflows/pyinstaller-linux.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
pyinstaller-linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
# We shouldn't use actions/setup-python since PyGObject is compiled against the system Python
|
||||
- name: Install System Dependencies
|
||||
uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec -- --onefile
|
||||
working-directory: pyinstaller
|
||||
- name: Upload PyInstaller Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
path: pyinstaller/dist/YAFI
|
||||
name: yafi-linux-${{ github.sha }}
|
||||
|
||||
16
.github/workflows/pyinstaller-windows.yml
vendored
@@ -8,22 +8,22 @@ jobs:
|
||||
pyinstaller-windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.13'
|
||||
python-version: '3.14'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Cache GTK4
|
||||
id: cache-gtk4
|
||||
uses: actions/cache@v4
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: C:\gtk
|
||||
key: Gvsbuild_2025.9.0
|
||||
key: Gvsbuild_2026.2.0
|
||||
|
||||
- name: Download GTK4 Gvsbuild zip
|
||||
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
||||
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.9.0/GTK4_Gvsbuild_2025.9.0_x64.zip -Destination Gvsbuild.zip
|
||||
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2026.2.0/GTK4_Gvsbuild_2026.2.0_x64.zip -Destination Gvsbuild.zip
|
||||
|
||||
- name: Extract Gvsbuild zip
|
||||
if: steps.cache-gtk4.outputs.cache-hit != 'true'
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
working-directory: pyinstaller
|
||||
|
||||
- name: Upload PyInstaller Artifact (ZIP)
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
path: pyinstaller/dist/YAFI/*
|
||||
name: yafi-windows-${{ github.sha }}
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
working-directory: pyinstaller
|
||||
|
||||
- name: Upload PyInstaller Artifact (Standalone)
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
path: pyinstaller/dist/YAFI.exe
|
||||
name: yafi-windows-standalone-${{ github.sha }}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
# CrOS_EC_Python udev rules
|
||||
|
||||
# LPC Access
|
||||
KERNEL=="port", TAG+="uaccess"
|
||||
|
||||
# /dev/cros_ec Access
|
||||
KERNEL=="cros_ec", TAG+="uaccess"
|
||||
16
README.md
@@ -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.
|
||||
|
||||
YAFI is also available on [Flathub](https://flathub.org/en/apps/au.stevetech.yafi): `flatpak install flathub au.stevetech.yafi`.
|
||||
|
||||
### 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 -Lfs yafi.stevetech.au/udev.sh | sudo sh` which will run the [`add-udev-rules.sh`](add-udev-rules.sh) script.
|
||||
|
||||
### 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.
|
||||
|
||||
Currently the PawnIO driver does not support Framework 13 mainboards with 11th, 12th, or 13th Gen Intel CPUs.
|
||||
|
||||
## Building
|
||||
|
||||
### 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'`
|
||||
|
||||
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.`
|
||||
|
||||
@@ -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.
|
||||
|
||||
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
@@ -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.
|
||||
@@ -7,7 +7,21 @@
|
||||
<name>Yet Another Framework Interface</name>
|
||||
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
|
||||
<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 -Lfs 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>
|
||||
|
||||
<developer id="au.stevetech">
|
||||
@@ -74,6 +88,12 @@
|
||||
</screenshots>
|
||||
|
||||
<releases>
|
||||
<release version="0.7" date="2025-12-25">
|
||||
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.7</url>
|
||||
<description>
|
||||
<p>YAFI now supports modifying fan set points.</p>
|
||||
</description>
|
||||
</release>
|
||||
<release version="0.6" date="2025-09-28">
|
||||
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.6</url>
|
||||
<description>
|
||||
|
||||
@@ -1,92 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="128"
|
||||
height="128"
|
||||
viewBox="0 0 128 128"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs1" /><g
|
||||
id="layer1"><g
|
||||
id="icon"><g
|
||||
id="chip"
|
||||
style="stroke-width:0;stroke-dasharray:none"><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 34,8 v 8"
|
||||
id="pin1" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 54,8.0000019 V 16.000002"
|
||||
id="pin2" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 74.000009,8.0000019 V 16.000002"
|
||||
id="pin3" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 93.999992,8 v 8"
|
||||
id="pin4" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 120,34.000001 h -8"
|
||||
id="pin5" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 120,54.000001 h -8"
|
||||
id="pin6" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 120,74.000009 h -8"
|
||||
id="pin7" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 120,93.999992 h -8"
|
||||
id="pin8" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 94.000009,112 v 8"
|
||||
id="pin9" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 74.000026,112 v 8"
|
||||
id="pin10" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 54.000017,112 v 8"
|
||||
id="pin11" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 34.000017,112 v 8"
|
||||
id="pin12" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 16.000002,93.999992 H 8.0000019"
|
||||
id="pin13" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 16.000002,74.000009 H 8.0000019"
|
||||
id="pin14" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 16.000002,54.000001 H 8.0000019"
|
||||
id="pin15" /><path
|
||||
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="M 16.000002,34.000001 H 8.0000019"
|
||||
id="pin16" /><rect
|
||||
style="fill:#000000;fill-opacity:0.5;stroke-width:0;stroke-dasharray:none"
|
||||
id="shadow"
|
||||
width="104"
|
||||
height="104"
|
||||
x="16"
|
||||
y="16"
|
||||
rx="16.000002"
|
||||
ry="16.000002" /><rect
|
||||
style="fill:#808080;stroke-width:0;stroke-dasharray:none"
|
||||
id="package"
|
||||
width="104"
|
||||
height="104"
|
||||
x="12.000001"
|
||||
y="12.000001"
|
||||
rx="16.000002"
|
||||
ry="16.000002" /><circle
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
id="dot"
|
||||
cx="22"
|
||||
cy="22"
|
||||
r="2" /></g><path
|
||||
id="cog"
|
||||
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.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"
|
||||
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>
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="12" y="92" width="104" height="24" rx="8" fill="url(#paint0_linear_293_18)"/>
|
||||
<rect x="12" y="88" width="104" height="24" rx="8" fill="#328361"/>
|
||||
<rect x="12" y="88" width="104" height="24" rx="8" fill="url(#paint1_linear_293_18)" fill-opacity="0.5" style="mix-blend-mode:multiply"/>
|
||||
<path d="M108 12H20C15.5817 12 12 15.5817 12 20V24V33V102C12 106.418 15.5817 110 20 110H108C112.418 110 116 106.418 116 102V20C116 15.5817 112.418 12 108 12Z" fill="#3FB182"/>
|
||||
<path d="M34 25H38V18C38 17.4477 37.5523 17 37 17H35C34.4477 17 34 17.4477 34 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M42 25H46V18C46 17.4477 45.5523 17 45 17H43C42.4477 17 42 17.4477 42 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M50 25H54V18C54 17.4477 53.5523 17 53 17H51C50.4477 17 50 17.4477 50 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M58 25H62V18C62 17.4477 61.5523 17 61 17H59C58.4477 17 58 17.4477 58 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M66 25H70V18C70 17.4477 69.5523 17 69 17H67C66.4477 17 66 17.4477 66 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M74 25H78V18C78 17.4477 77.5523 17 77 17H75C74.4477 17 74 17.4477 74 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M82 25H86V18C86 17.4477 85.5523 17 85 17H83C82.4477 17 82 17.4477 82 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M90 25H94V18C94 17.4477 93.5523 17 93 17H91C90.4477 17 90 17.4477 90 18V25Z" fill="#FFE11D"/>
|
||||
<rect x="24" y="27" width="80" height="74" rx="8" fill="url(#paint2_linear_293_18)"/>
|
||||
<rect x="24" y="27" width="80" height="74" rx="8" fill="black" fill-opacity="0.1"/>
|
||||
<rect x="24" y="21" width="80" height="72" rx="8" fill="#EAEAEA"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98V105C38 105.552 37.5523 106 37 106H35C34.4477 106 34 105.552 34 105V98Z" fill="#939A00"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98V105C46 105.552 45.5523 106 45 106H43C42.4477 106 42 105.552 42 105V98Z" fill="#939A00"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98V105C54 105.552 53.5523 106 53 106H51C50.4477 106 50 105.552 50 105V98Z" fill="#939A00"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98V105C62 105.552 61.5523 106 61 106H59C58.4477 106 58 105.552 58 105V98Z" fill="#939A00"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98V105C70 105.552 69.5523 106 69 106H67C66.4477 106 66 105.552 66 105V98Z" fill="#939A00"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98V105C78 105.552 77.5523 106 77 106H75C74.4477 106 74 105.552 74 105V98Z" fill="#939A00"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98V105C86 105.552 85.5523 106 85 106H83C82.4477 106 82 105.552 82 105V98Z" fill="#939A00"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98V105C94 105.552 93.5523 106 93 106H91C90.4477 106 90 105.552 90 105V98Z" fill="#939A00"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98V104H34V98Z" fill="#FFE11D"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98V104H42V98Z" fill="#FFE11D"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98V104H50V98Z" fill="#FFE11D"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98V104H58V98Z" fill="#FFE11D"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98V104H66V98Z" fill="#FFE11D"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98V104H74V98Z" fill="#FFE11D"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98V104H82V98Z" fill="#FFE11D"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98V104H90V98Z" fill="#FFE11D"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98H34Z" fill="#808080"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98H42Z" fill="#808080"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98H50Z" fill="#808080"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98H58Z" fill="#808080"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98H66Z" fill="#808080"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98H74Z" fill="#808080"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98H82Z" fill="#808080"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98H90Z" fill="#808080"/>
|
||||
<g filter="url(#filter0_i_293_18)">
|
||||
<path d="M48.8658 38.6343C49.4695 35.7019 52.4974 33.9536 55.3388 34.8971L57.6974 35.6803C61.7893 37.039 66.2107 37.039 70.3026 35.6803L72.6612 34.8971C75.5026 33.9536 78.5305 35.7018 79.1342 38.6343L79.6352 41.0684C80.5045 45.2915 82.7152 49.1206 85.9378 51.9849L87.7953 53.6359C90.0331 55.6249 90.0331 59.1213 87.7953 61.1103L85.9378 62.7612C82.7152 65.6256 80.5045 69.4546 79.6352 73.6777L79.1342 76.1118C78.5305 79.0443 75.5026 80.7925 72.6612 79.849L70.3026 79.0659C66.2107 77.7071 61.7893 77.7071 57.6974 79.0659L55.3388 79.849C52.4974 80.7925 49.4695 79.0443 48.8658 76.1118L48.3648 73.6777C47.4955 69.4547 45.2848 65.6256 42.0622 62.7612L40.2047 61.1103C37.9669 59.1213 37.9669 55.6249 40.2047 53.6359L42.0622 51.9849C45.2848 49.1206 47.4955 45.2915 48.3648 41.0684L48.8658 38.6343Z" fill="#D9D9D9"/>
|
||||
<path d="M48.8658 38.6343C49.4695 35.7019 52.4974 33.9536 55.3388 34.8971L57.6974 35.6803C61.7893 37.039 66.2107 37.039 70.3026 35.6803L72.6612 34.8971C75.5026 33.9536 78.5305 35.7018 79.1342 38.6343L79.6352 41.0684C80.5045 45.2915 82.7152 49.1206 85.9378 51.9849L87.7953 53.6359C90.0331 55.6249 90.0331 59.1213 87.7953 61.1103L85.9378 62.7612C82.7152 65.6256 80.5045 69.4546 79.6352 73.6777L79.1342 76.1118C78.5305 79.0443 75.5026 80.7925 72.6612 79.849L70.3026 79.0659C66.2107 77.7071 61.7893 77.7071 57.6974 79.0659L55.3388 79.849C52.4974 80.7925 49.4695 79.0443 48.8658 76.1118L48.3648 73.6777C47.4955 69.4547 45.2848 65.6256 42.0622 62.7612L40.2047 61.1103C37.9669 59.1213 37.9669 55.6249 40.2047 53.6359L42.0622 51.9849C45.2848 49.1206 47.4955 45.2915 48.3648 41.0684L48.8658 38.6343Z" fill="#202020"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_d_293_18)">
|
||||
<path d="M64 70C56.8216 70 51 64.1761 51 57C51 49.8194 56.8216 44 64 44C71.1784 44 77 49.8239 77 57C77 64.1761 71.1784 70 64 70Z" fill="#EAEAEA"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_i_293_18" x="38.5264" y="34.6403" width="50.9473" height="45.4655" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="2"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_293_18"/>
|
||||
</filter>
|
||||
<filter id="filter1_d_293_18" x="51" y="44" width="26" height="28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="2"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_293_18"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_293_18" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_293_18" x1="116" y1="116" x2="12" y2="116" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404040"/>
|
||||
<stop offset="0.03" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.06" stop-color="#606060"/>
|
||||
<stop offset="0.94" stop-color="#606060"/>
|
||||
<stop offset="0.97" stop-color="#D0D0D0"/>
|
||||
<stop offset="1" stop-color="#404040"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_293_18" x1="116" y1="112" x2="12" y2="112" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404040"/>
|
||||
<stop offset="0.03" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.06" stop-color="#606060"/>
|
||||
<stop offset="0.94" stop-color="#606060"/>
|
||||
<stop offset="0.97" stop-color="#D0D0D0"/>
|
||||
<stop offset="1" stop-color="#404040"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_293_18" x1="24" y1="85.8476" x2="103.999" y2="85.6325" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#AFAFAF"/>
|
||||
<stop offset="0.04" stop-color="#F6F5F4"/>
|
||||
<stop offset="0.08" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.92" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.96" stop-color="#F6F5F4"/>
|
||||
<stop offset="1" stop-color="#AFAFAF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 8.6 KiB |
@@ -1,21 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="96"
|
||||
height="96"
|
||||
viewBox="0 0 96 96"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs1" /><g
|
||||
id="layer1"><g
|
||||
id="icon"><path
|
||||
id="cog"
|
||||
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
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"
|
||||
style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
|
||||
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>
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8 10C6.89563 10 6 9.10402 6 8C6 6.8953 6.89563 6 8 6C9.10437 6 10 6.89598 10 8C10 9.10402 9.10437 10 8 10Z" fill="black"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2C0 0.895431 0.895431 0 2 0H3V1C3 1.55228 3.44772 2 4 2C4.55228 2 5 1.55228 5 1V0H7V1C7 1.55228 7.44772 2 8 2C8.55228 2 9 1.55228 9 1V0H11V1C11 1.55228 11.4477 2 12 2C12.5523 2 13 1.55228 13 1V0H14C15.1046 0 16 0.895431 16 2V14C16 15.1046 15.1046 16 14 16H13V15C13 14.4477 12.5523 14 12 14C11.4477 14 11 14.4477 11 15V16H9V15C9 14.4477 8.55228 14 8 14C7.44772 14 7 14.4477 7 15V16H5V15C5 14.4477 4.55228 14 4 14C3.44772 14 3 14.4477 3 15V16H2C0.895431 16 0 15.1046 0 14V2ZM5.23026 4.85673C5.04181 5.76259 4.56253 6.58395 3.86386 7.19836C3.37871 7.625 3.37871 8.375 3.86386 8.80164C4.56253 9.41605 5.04181 10.2374 5.23026 11.1433C5.36113 11.7723 6.01759 12.1473 6.6336 11.9449C7.52072 11.6535 8.47928 11.6535 9.3664 11.9449C9.98241 12.1473 10.6389 11.7723 10.7697 11.1433C10.9582 10.2374 11.4375 9.41605 12.1361 8.80164C12.6213 8.375 12.6213 7.625 12.1361 7.19836C11.4375 6.58395 10.9582 5.76259 10.7697 4.85673C10.6389 4.2277 9.98241 3.85271 9.3664 4.05509C8.47928 4.34654 7.52072 4.34654 6.6336 4.05509C6.01759 3.85271 5.36113 4.2277 5.23026 4.85673ZM8 10C6.89563 10 6 9.10402 6 8C6 6.8953 6.89563 6 8 6C9.10437 6 10 6.89598 10 8C10 9.10402 9.10437 10 8 10Z" fill="black"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 161 KiB |
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"only-arches": ["x86_64"]
|
||||
}
|
||||
}
|
||||
|
||||
254
logo.svg
@@ -1,162 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="128"
|
||||
height="128"
|
||||
viewBox="0 0 128 128"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xml:space="preserve"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
sodipodi:docname="logo.svg"
|
||||
inkscape:export-filename="logo-plain.svg"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="5.6568542"
|
||||
inkscape:cx="38.802485"
|
||||
inkscape:cy="83.261824"
|
||||
inkscape:window-width="1876"
|
||||
inkscape:window-height="1025"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="icon" /><defs
|
||||
id="defs1" /><g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"><g
|
||||
id="icon"
|
||||
inkscape:label="icon"
|
||||
inkscape:export-filename="icon.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"><g
|
||||
id="chip"
|
||||
inkscape:label="chip"
|
||||
style="stroke-width:0;stroke-dasharray:none"><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 34,8 v 8"
|
||||
id="pin1"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin1" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 54,8.0000019 V 16.000002"
|
||||
id="pin2"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin2" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 74.000009,8.0000019 V 16.000002"
|
||||
id="pin3"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin3" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 93.999992,8 v 8"
|
||||
id="pin4"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin4" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 120,34.000001 h -8"
|
||||
id="pin5"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin5" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 120,54.000001 h -8"
|
||||
id="pin6"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin6" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 120,74.000009 h -8"
|
||||
id="pin7"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin7" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 120,93.999992 h -8"
|
||||
id="pin8"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin8" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 94.000009,112 v 8"
|
||||
id="pin9"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin9" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 74.000026,112 v 8"
|
||||
id="pin10"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin10" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 54.000017,112 v 8"
|
||||
id="pin11"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin11" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="m 34.000017,112 v 8"
|
||||
id="pin12"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin12" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 16.000002,93.999992 H 8.0000019"
|
||||
id="pin13"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin13" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 16.000002,74.000009 H 8.0000019"
|
||||
id="pin14"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin14" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 16.000002,54.000001 H 8.0000019"
|
||||
id="pin15"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin15" /><path
|
||||
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
|
||||
d="M 16.000002,34.000001 H 8.0000019"
|
||||
id="pin16"
|
||||
sodipodi:nodetypes="cc"
|
||||
inkscape:label="pin16" /><rect
|
||||
style="fill:#000000;stroke-width:0;stroke-dasharray:none;fill-opacity:0.5"
|
||||
id="shadow"
|
||||
width="104"
|
||||
height="104"
|
||||
x="16"
|
||||
y="16"
|
||||
rx="16.000002"
|
||||
ry="16.000002"
|
||||
inkscape:label="shadow" /><rect
|
||||
style="fill:#808080;stroke-width:0;stroke-dasharray:none"
|
||||
id="package"
|
||||
width="104"
|
||||
height="104"
|
||||
x="12.000001"
|
||||
y="12.000001"
|
||||
rx="16.000002"
|
||||
ry="16.000002"
|
||||
inkscape:label="package" /><circle
|
||||
style="fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
id="dot"
|
||||
cx="22"
|
||||
cy="22"
|
||||
r="2"
|
||||
inkscape:label="dot" /></g><path
|
||||
id="cog"
|
||||
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
inkscape:label="cog"
|
||||
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"
|
||||
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"
|
||||
inkscape:label="Y"
|
||||
sodipodi:nodetypes="cccccccc" /></g></g></svg>
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="12" y="92" width="104" height="24" rx="8" fill="url(#paint0_linear_293_18)"/>
|
||||
<rect x="12" y="88" width="104" height="24" rx="8" fill="#328361"/>
|
||||
<rect x="12" y="88" width="104" height="24" rx="8" fill="url(#paint1_linear_293_18)" fill-opacity="0.5" style="mix-blend-mode:multiply"/>
|
||||
<path d="M108 12H20C15.5817 12 12 15.5817 12 20V24V33V102C12 106.418 15.5817 110 20 110H108C112.418 110 116 106.418 116 102V20C116 15.5817 112.418 12 108 12Z" fill="#3FB182"/>
|
||||
<path d="M34 25H38V18C38 17.4477 37.5523 17 37 17H35C34.4477 17 34 17.4477 34 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M42 25H46V18C46 17.4477 45.5523 17 45 17H43C42.4477 17 42 17.4477 42 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M50 25H54V18C54 17.4477 53.5523 17 53 17H51C50.4477 17 50 17.4477 50 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M58 25H62V18C62 17.4477 61.5523 17 61 17H59C58.4477 17 58 17.4477 58 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M66 25H70V18C70 17.4477 69.5523 17 69 17H67C66.4477 17 66 17.4477 66 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M74 25H78V18C78 17.4477 77.5523 17 77 17H75C74.4477 17 74 17.4477 74 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M82 25H86V18C86 17.4477 85.5523 17 85 17H83C82.4477 17 82 17.4477 82 18V25Z" fill="#FFE11D"/>
|
||||
<path d="M90 25H94V18C94 17.4477 93.5523 17 93 17H91C90.4477 17 90 17.4477 90 18V25Z" fill="#FFE11D"/>
|
||||
<rect x="24" y="27" width="80" height="74" rx="8" fill="url(#paint2_linear_293_18)"/>
|
||||
<rect x="24" y="27" width="80" height="74" rx="8" fill="black" fill-opacity="0.1"/>
|
||||
<rect x="24" y="21" width="80" height="72" rx="8" fill="#EAEAEA"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98V105C38 105.552 37.5523 106 37 106H35C34.4477 106 34 105.552 34 105V98Z" fill="#939A00"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98V105C46 105.552 45.5523 106 45 106H43C42.4477 106 42 105.552 42 105V98Z" fill="#939A00"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98V105C54 105.552 53.5523 106 53 106H51C50.4477 106 50 105.552 50 105V98Z" fill="#939A00"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98V105C62 105.552 61.5523 106 61 106H59C58.4477 106 58 105.552 58 105V98Z" fill="#939A00"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98V105C70 105.552 69.5523 106 69 106H67C66.4477 106 66 105.552 66 105V98Z" fill="#939A00"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98V105C78 105.552 77.5523 106 77 106H75C74.4477 106 74 105.552 74 105V98Z" fill="#939A00"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98V105C86 105.552 85.5523 106 85 106H83C82.4477 106 82 105.552 82 105V98Z" fill="#939A00"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98V105C94 105.552 93.5523 106 93 106H91C90.4477 106 90 105.552 90 105V98Z" fill="#939A00"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98V104H34V98Z" fill="#FFE11D"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98V104H42V98Z" fill="#FFE11D"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98V104H50V98Z" fill="#FFE11D"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98V104H58V98Z" fill="#FFE11D"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98V104H66V98Z" fill="#FFE11D"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98V104H74V98Z" fill="#FFE11D"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98V104H82V98Z" fill="#FFE11D"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98V104H90V98Z" fill="#FFE11D"/>
|
||||
<path d="M34 98C34 96.8954 34.8954 96 36 96C37.1046 96 38 96.8954 38 98H34Z" fill="#808080"/>
|
||||
<path d="M42 98C42 96.8954 42.8954 96 44 96C45.1046 96 46 96.8954 46 98H42Z" fill="#808080"/>
|
||||
<path d="M50 98C50 96.8954 50.8954 96 52 96C53.1046 96 54 96.8954 54 98H50Z" fill="#808080"/>
|
||||
<path d="M58 98C58 96.8954 58.8954 96 60 96C61.1046 96 62 96.8954 62 98H58Z" fill="#808080"/>
|
||||
<path d="M66 98C66 96.8954 66.8954 96 68 96C69.1046 96 70 96.8954 70 98H66Z" fill="#808080"/>
|
||||
<path d="M74 98C74 96.8954 74.8954 96 76 96C77.1046 96 78 96.8954 78 98H74Z" fill="#808080"/>
|
||||
<path d="M82 98C82 96.8954 82.8954 96 84 96C85.1046 96 86 96.8954 86 98H82Z" fill="#808080"/>
|
||||
<path d="M90 98C90 96.8954 90.8954 96 92 96C93.1046 96 94 96.8954 94 98H90Z" fill="#808080"/>
|
||||
<g filter="url(#filter0_i_293_18)">
|
||||
<path d="M48.8658 38.6343C49.4695 35.7019 52.4974 33.9536 55.3388 34.8971L57.6974 35.6803C61.7893 37.039 66.2107 37.039 70.3026 35.6803L72.6612 34.8971C75.5026 33.9536 78.5305 35.7018 79.1342 38.6343L79.6352 41.0684C80.5045 45.2915 82.7152 49.1206 85.9378 51.9849L87.7953 53.6359C90.0331 55.6249 90.0331 59.1213 87.7953 61.1103L85.9378 62.7612C82.7152 65.6256 80.5045 69.4546 79.6352 73.6777L79.1342 76.1118C78.5305 79.0443 75.5026 80.7925 72.6612 79.849L70.3026 79.0659C66.2107 77.7071 61.7893 77.7071 57.6974 79.0659L55.3388 79.849C52.4974 80.7925 49.4695 79.0443 48.8658 76.1118L48.3648 73.6777C47.4955 69.4547 45.2848 65.6256 42.0622 62.7612L40.2047 61.1103C37.9669 59.1213 37.9669 55.6249 40.2047 53.6359L42.0622 51.9849C45.2848 49.1206 47.4955 45.2915 48.3648 41.0684L48.8658 38.6343Z" fill="#D9D9D9"/>
|
||||
<path d="M48.8658 38.6343C49.4695 35.7019 52.4974 33.9536 55.3388 34.8971L57.6974 35.6803C61.7893 37.039 66.2107 37.039 70.3026 35.6803L72.6612 34.8971C75.5026 33.9536 78.5305 35.7018 79.1342 38.6343L79.6352 41.0684C80.5045 45.2915 82.7152 49.1206 85.9378 51.9849L87.7953 53.6359C90.0331 55.6249 90.0331 59.1213 87.7953 61.1103L85.9378 62.7612C82.7152 65.6256 80.5045 69.4546 79.6352 73.6777L79.1342 76.1118C78.5305 79.0443 75.5026 80.7925 72.6612 79.849L70.3026 79.0659C66.2107 77.7071 61.7893 77.7071 57.6974 79.0659L55.3388 79.849C52.4974 80.7925 49.4695 79.0443 48.8658 76.1118L48.3648 73.6777C47.4955 69.4547 45.2848 65.6256 42.0622 62.7612L40.2047 61.1103C37.9669 59.1213 37.9669 55.6249 40.2047 53.6359L42.0622 51.9849C45.2848 49.1206 47.4955 45.2915 48.3648 41.0684L48.8658 38.6343Z" fill="#202020"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_d_293_18)">
|
||||
<path d="M64 70C56.8216 70 51 64.1761 51 57C51 49.8194 56.8216 44 64 44C71.1784 44 77 49.8239 77 57C77 64.1761 71.1784 70 64 70Z" fill="#EAEAEA"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_i_293_18" x="38.5264" y="34.6403" width="50.9473" height="45.4655" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="2"/>
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_293_18"/>
|
||||
</filter>
|
||||
<filter id="filter1_d_293_18" x="51" y="44" width="26" height="28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||
<feOffset dy="2"/>
|
||||
<feComposite in2="hardAlpha" operator="out"/>
|
||||
<feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 1 0"/>
|
||||
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_293_18"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_293_18" result="shape"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear_293_18" x1="116" y1="116" x2="12" y2="116" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404040"/>
|
||||
<stop offset="0.03" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.06" stop-color="#606060"/>
|
||||
<stop offset="0.94" stop-color="#606060"/>
|
||||
<stop offset="0.97" stop-color="#D0D0D0"/>
|
||||
<stop offset="1" stop-color="#404040"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_293_18" x1="116" y1="112" x2="12" y2="112" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#404040"/>
|
||||
<stop offset="0.03" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.06" stop-color="#606060"/>
|
||||
<stop offset="0.94" stop-color="#606060"/>
|
||||
<stop offset="0.97" stop-color="#D0D0D0"/>
|
||||
<stop offset="1" stop-color="#404040"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear_293_18" x1="24" y1="85.8476" x2="103.999" y2="85.6325" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#AFAFAF"/>
|
||||
<stop offset="0.04" stop-color="#F6F5F4"/>
|
||||
<stop offset="0.08" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.92" stop-color="#D0D0D0"/>
|
||||
<stop offset="0.96" stop-color="#F6F5F4"/>
|
||||
<stop offset="1" stop-color="#AFAFAF"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 8.6 KiB |
@@ -1,5 +1,5 @@
|
||||
project('yafi',
|
||||
version: '0.6',
|
||||
version: '0.7',
|
||||
meson_version: '>= 1.0.0',
|
||||
default_options: [ 'warning_level=2', 'werror=false', ],
|
||||
)
|
||||
|
||||
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 48 KiB |
BIN
pyinstaller/yafi.ico
Executable file → Normal file
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 398 KiB |
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "yafi"
|
||||
version = "0.6"
|
||||
version = "0.7"
|
||||
authors = [
|
||||
{ name="Steve-Tech" }
|
||||
]
|
||||
@@ -8,7 +8,7 @@ description = "Yet Another Framework Interface"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.10"
|
||||
dependencies = [
|
||||
"cros_ec_python >= 0.2.0",
|
||||
"cros_ec_python >= 0.3.0",
|
||||
"PyGObject"
|
||||
]
|
||||
classifiers = [
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
"sources": [
|
||||
{
|
||||
"type": "file",
|
||||
"url": "https://files.pythonhosted.org/packages/33/11/c23a7acaa333589921a2f524517eb719dfb72628153ae22fcdf2e9052ac6/cros_ec_python-0.2.0-py3-none-any.whl",
|
||||
"sha256": "d38e493fbcaf23bc4b613d1342a036cecc6506284afc74f37013a3eac85a01b9"
|
||||
"url": "https://files.pythonhosted.org/packages/6c/7a/10d978a02bbe37530490cfd14e0994c433dc29c81b3afcdbde453d512528/cros_ec_python-0.3.0-py3-none-any.whl",
|
||||
"sha256": "aeb14ebdbd60ec6d6a4b11df1482a295466da4a908a468d168efd4cc141e7e3d"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -50,6 +50,9 @@ class BatteryPage(Gtk.Box):
|
||||
|
||||
def setup(self, app):
|
||||
battery = ec_commands.memmap.get_battery_values(app.cros_ec)
|
||||
if not battery:
|
||||
self.batt_status.set_subtitle("No data")
|
||||
return
|
||||
self.batt_manu.set_subtitle(battery["manufacturer"])
|
||||
self.batt_model.set_subtitle(battery["model"])
|
||||
self.batt_serial.set_subtitle(battery["serial"])
|
||||
|
||||
@@ -34,8 +34,6 @@ class BatteryLimiterPage(Gtk.Box):
|
||||
bat_limit = Gtk.Template.Child()
|
||||
bat_limit_label = Gtk.Template.Child()
|
||||
bat_limit_scale = Gtk.Template.Child()
|
||||
chg_limit_override = Gtk.Template.Child()
|
||||
chg_limit_override_btn = Gtk.Template.Child()
|
||||
|
||||
bat_ext_group = Gtk.Template.Child()
|
||||
bat_ext_enable = Gtk.Template.Child()
|
||||
@@ -61,7 +59,6 @@ class BatteryLimiterPage(Gtk.Box):
|
||||
self.bat_limit_label.set_label(f"{ec_limit[1]}%")
|
||||
self.chg_limit.set_sensitive(True)
|
||||
self.bat_limit.set_sensitive(True)
|
||||
self.chg_limit_override.set_sensitive(True)
|
||||
|
||||
def handle_chg_limit_change(min, max):
|
||||
ec_commands.framework_laptop.set_charge_limit(
|
||||
@@ -79,7 +76,6 @@ class BatteryLimiterPage(Gtk.Box):
|
||||
|
||||
self.chg_limit.set_sensitive(active)
|
||||
self.bat_limit.set_sensitive(active)
|
||||
self.chg_limit_override.set_sensitive(active)
|
||||
|
||||
self.chg_limit_enable.connect(
|
||||
"notify::active", lambda switch, _: handle_chg_limit_enable(switch)
|
||||
@@ -97,12 +93,6 @@ class BatteryLimiterPage(Gtk.Box):
|
||||
),
|
||||
)
|
||||
|
||||
self.chg_limit_override_btn.connect(
|
||||
"clicked",
|
||||
lambda _: ec_commands.framework_laptop.override_charge_limit(
|
||||
app.cros_ec
|
||||
),
|
||||
)
|
||||
except ec_exceptions.ECError as e:
|
||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||
app.no_support.append(ec_commands.framework_laptop.EC_CMD_CHARGE_LIMIT_CONTROL)
|
||||
|
||||
21
yafi/leds.py
@@ -48,11 +48,19 @@ class LedsPage(Gtk.Box):
|
||||
ec_commands.framework_laptop.set_fp_led_level(app.cros_ec, value)
|
||||
self.led_pwr.set_subtitle(["High", "Medium", "Low"][value])
|
||||
|
||||
current_fp_level = ec_commands.framework_laptop.get_fp_led_level(
|
||||
app.cros_ec
|
||||
).value
|
||||
self.led_pwr_scale.set_value(abs(current_fp_level - 2))
|
||||
self.led_pwr.set_subtitle(["High", "Medium", "Low"][current_fp_level])
|
||||
try:
|
||||
current_fp_level = ec_commands.framework_laptop.get_fp_led_level(
|
||||
app.cros_ec
|
||||
).value
|
||||
self.led_pwr_scale.set_value(abs(current_fp_level - 2))
|
||||
self.led_pwr.set_subtitle(["High", "Medium", "Low"][current_fp_level])
|
||||
except ValueError:
|
||||
# LED isn't a normal value
|
||||
current_fp_level = ec_commands.framework_laptop.get_fp_led_level_int(
|
||||
app.cros_ec
|
||||
)
|
||||
self.led_pwr.set_subtitle(f"Custom ({current_fp_level}%)")
|
||||
|
||||
self.led_pwr_scale.connect("value-changed", handle_led_pwr)
|
||||
except ec_exceptions.ECError as e:
|
||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||
@@ -110,6 +118,9 @@ class LedsPage(Gtk.Box):
|
||||
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):
|
||||
colour = combobox.get_selected() - 2
|
||||
|
||||
@@ -121,6 +121,7 @@ class YafiApplication(Adw.Application):
|
||||
self.current_page = page
|
||||
self.change_page(self.win.content, pages[page][1])
|
||||
else:
|
||||
self.win.navbar.select_row(self.win.navbar.get_row_at_index(self.current_page))
|
||||
self.on_about_action()
|
||||
|
||||
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
|
||||
@@ -135,14 +136,16 @@ class YafiApplication(Adw.Application):
|
||||
about = Adw.AboutDialog(
|
||||
application_icon="au.stevetech.yafi",
|
||||
application_name="Yet Another Framework Interface",
|
||||
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n"
|
||||
+ "It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.",
|
||||
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n\n"
|
||||
+ "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",
|
||||
developer_name="Stephen Horvath",
|
||||
developers=["Stephen Horvath https://github.com/Steve-Tech"],
|
||||
artists=["Mirabelle SALLES https://github.com/oiimrosabel"],
|
||||
issue_url="https://github.com/Steve-Tech/YAFI/issues",
|
||||
license_type=Gtk.License.GPL_2_0,
|
||||
version="0.6",
|
||||
version="0.7",
|
||||
website="https://github.com/Steve-Tech/YAFI",
|
||||
)
|
||||
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])
|
||||
|
||||
127
yafi/thermals.py
@@ -27,11 +27,17 @@ import cros_ec_python.exceptions as ec_exceptions
|
||||
class ThermalsPage(Gtk.Box):
|
||||
__gtype_name__ = 'ThermalsPage'
|
||||
|
||||
first_run = True
|
||||
|
||||
fan_rpm = Gtk.Template.Child()
|
||||
fan_mode = Gtk.Template.Child()
|
||||
fan_set_rpm = Gtk.Template.Child()
|
||||
fan_set_percent = Gtk.Template.Child()
|
||||
fan_percent_scale = Gtk.Template.Child()
|
||||
fan_set_points = Gtk.Template.Child()
|
||||
set_points = []
|
||||
ec_set_points_supported = False
|
||||
ec_set_points = []
|
||||
|
||||
temperatures = Gtk.Template.Child()
|
||||
temp_items = []
|
||||
@@ -40,10 +46,40 @@ class ThermalsPage(Gtk.Box):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
def setup(self, app):
|
||||
# Temperature sensors
|
||||
while temp_child := self.temperatures.get_last_child():
|
||||
self.temperatures.remove(temp_child)
|
||||
self.temp_items.clear()
|
||||
|
||||
try:
|
||||
ec_temp_sensors = ec_commands.thermal.get_temp_sensors(app.cros_ec)
|
||||
except ec_exceptions.ECError as e:
|
||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||
# Generate some labels if the command is not supported
|
||||
ec_temp_sensors = {}
|
||||
temps = ec_commands.memmap.get_temps(app.cros_ec)
|
||||
for i, temp in enumerate(temps):
|
||||
ec_temp_sensors[f"Sensor {i}"] = (temp, None)
|
||||
else:
|
||||
raise e
|
||||
|
||||
for key, value in ec_temp_sensors.items():
|
||||
off_row = Adw.ActionRow(title=key, subtitle=f"{value[0]}°C" if value[0] is not None else "Error")
|
||||
off_row.add_css_class("property")
|
||||
self.temperatures.append(off_row)
|
||||
self.temp_items.append(off_row)
|
||||
|
||||
self._update_thermals(app)
|
||||
|
||||
# Don't let the user change the fans if they can't get back to auto
|
||||
if ec_commands.general.get_cmd_versions(
|
||||
app.cros_ec, ec_commands.thermal.EC_CMD_THERMAL_AUTO_FAN_CTRL
|
||||
):
|
||||
self.ec_set_points_supported = ec_commands.general.check_cmd_version(
|
||||
app.cros_ec, ec_commands.thermal.EC_CMD_THERMAL_GET_THRESHOLD, 1
|
||||
) and ec_commands.general.check_cmd_version(
|
||||
app.cros_ec, ec_commands.thermal.EC_CMD_THERMAL_SET_THRESHOLD, 1
|
||||
)
|
||||
|
||||
def handle_fan_mode(mode):
|
||||
match mode:
|
||||
@@ -51,13 +87,18 @@ class ThermalsPage(Gtk.Box):
|
||||
self.fan_set_rpm.set_visible(False)
|
||||
self.fan_set_percent.set_visible(False)
|
||||
ec_commands.thermal.thermal_auto_fan_ctrl(app.cros_ec)
|
||||
self.fan_set_points.set_visible(self.ec_set_points_supported)
|
||||
case 1: # Percent
|
||||
self.fan_set_points.set_visible(False)
|
||||
self.fan_set_rpm.set_visible(False)
|
||||
self.fan_set_percent.set_visible(True)
|
||||
case 2: # RPM
|
||||
self.fan_set_points.set_visible(False)
|
||||
self.fan_set_rpm.set_visible(True)
|
||||
self.fan_set_percent.set_visible(False)
|
||||
|
||||
handle_fan_mode(self.fan_mode.get_selected())
|
||||
|
||||
self.fan_mode.connect(
|
||||
"notify::selected",
|
||||
lambda combo, _: handle_fan_mode(combo.get_selected()),
|
||||
@@ -81,41 +122,77 @@ class ThermalsPage(Gtk.Box):
|
||||
):
|
||||
|
||||
def handle_fan_rpm(entry):
|
||||
rpm = int(entry.get_text())
|
||||
rpm = int(entry.get_value())
|
||||
ec_commands.pwm.pwm_set_fan_rpm(app.cros_ec, rpm)
|
||||
|
||||
self.fan_set_rpm.connect(
|
||||
"notify::text", lambda entry, _: handle_fan_rpm(entry)
|
||||
"notify::value", lambda entry, _: handle_fan_rpm(entry)
|
||||
)
|
||||
else:
|
||||
self.fan_set_rpm.set_sensitive(False)
|
||||
else:
|
||||
self.fan_mode.set_sensitive(False)
|
||||
|
||||
# Temperature sensors
|
||||
while temp_child := self.temperatures.get_last_child():
|
||||
self.temperatures.remove(temp_child)
|
||||
self.temp_items.clear()
|
||||
# Set points
|
||||
if self.ec_set_points_supported and self.first_run:
|
||||
def handle_set_point(entry, key):
|
||||
index = entry.ec_index
|
||||
temp = int(entry.get_value())
|
||||
# Don't allow an off temp higher than max temp and vice versa
|
||||
match key:
|
||||
case "temp_fan_off":
|
||||
if temp > self.ec_set_points[index]["temp_fan_max"]:
|
||||
entry.set_value(self.ec_set_points[index]["temp_fan_off"])
|
||||
return
|
||||
case "temp_fan_max":
|
||||
if temp < self.ec_set_points[index]["temp_fan_off"]:
|
||||
entry.set_value(self.ec_set_points[index]["temp_fan_max"])
|
||||
return
|
||||
self.ec_set_points[entry.ec_index][key] = temp
|
||||
ec_commands.thermal.thermal_set_thresholds(
|
||||
app.cros_ec, index,
|
||||
self.ec_set_points[index]
|
||||
)
|
||||
|
||||
try:
|
||||
ec_temp_sensors = ec_commands.thermal.get_temp_sensors(app.cros_ec)
|
||||
except ec_exceptions.ECError as e:
|
||||
if e.ec_status == ec_exceptions.EcStatus.EC_RES_INVALID_COMMAND:
|
||||
# Generate some labels if the command is not supported
|
||||
ec_temp_sensors = {}
|
||||
temps = ec_commands.memmap.get_temps(app.cros_ec)
|
||||
for i, temp in enumerate(temps):
|
||||
ec_temp_sensors[f"Sensor {i}"] = (temp, None)
|
||||
else:
|
||||
raise e
|
||||
for i, sensor in enumerate(ec_temp_sensors):
|
||||
ec_set_point = ec_commands.thermal.thermal_get_thresholds(app.cros_ec, i)
|
||||
self.ec_set_points.append(ec_set_point)
|
||||
off_row = Adw.SpinRow(
|
||||
title=f"Fan On - {sensor}",
|
||||
subtitle=f"Turn fan on when above temp (°C)",
|
||||
)
|
||||
off_row.ec_index = i
|
||||
# 0K to 65535K for 16bit unsigned range
|
||||
# Actually the EC takes 32bits, but let's keep it like this for sanity
|
||||
off_row.set_adjustment(Gtk.Adjustment(
|
||||
lower=-273,
|
||||
upper=65_262,
|
||||
page_increment=10,
|
||||
step_increment=1,
|
||||
value=ec_set_point["temp_fan_off"],
|
||||
))
|
||||
off_row.connect(
|
||||
"notify::value", lambda entry, _: handle_set_point(entry, "temp_fan_off")
|
||||
)
|
||||
max_row = Adw.SpinRow(
|
||||
title=f"Fan Max - {sensor}",
|
||||
subtitle=f"Max fan speed when above temp (°C)",
|
||||
)
|
||||
max_row.ec_index = i
|
||||
max_row.set_adjustment(Gtk.Adjustment(
|
||||
lower=-273,
|
||||
upper=65_262,
|
||||
page_increment=10,
|
||||
step_increment=1,
|
||||
value=ec_set_point["temp_fan_max"],
|
||||
))
|
||||
max_row.connect(
|
||||
"notify::value", lambda entry, _: handle_set_point(entry, "temp_fan_max")
|
||||
)
|
||||
self.fan_set_points.add_row(off_row)
|
||||
self.fan_set_points.add_row(max_row)
|
||||
|
||||
for key, value in ec_temp_sensors.items():
|
||||
new_row = Adw.ActionRow(title=key, subtitle=f"{value[0]}°C")
|
||||
new_row.add_css_class("property")
|
||||
self.temperatures.append(new_row)
|
||||
self.temp_items.append(new_row)
|
||||
|
||||
self._update_thermals(app)
|
||||
self.first_run = False
|
||||
|
||||
# Schedule _update_thermals to run every second
|
||||
GLib.timeout_add_seconds(1, self._update_thermals, app)
|
||||
@@ -128,7 +205,7 @@ class ThermalsPage(Gtk.Box):
|
||||
ec_temp_sensors = ec_commands.memmap.get_temps(app.cros_ec)
|
||||
# The temp sensors disappear sometimes, so we need to handle that
|
||||
for i in range(min(len(self.temp_items), len(ec_temp_sensors))):
|
||||
self.temp_items[i].set_subtitle(f"{ec_temp_sensors[i]}°C")
|
||||
self.temp_items[i].set_subtitle(f"{ec_temp_sensors[i]}°C" if ec_temp_sensors[i] is not None else "Error")
|
||||
|
||||
# Check if this has already failed and skip if it has
|
||||
if not ec_commands.pwm.EC_CMD_PWM_GET_FAN_TARGET_RPM in app.no_support:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Cambalache 0.96.1 -->
|
||||
<!-- Created with Cambalache 0.96.3 -->
|
||||
<interface>
|
||||
<!-- interface-name battery-limiter.ui -->
|
||||
<!-- interface-description The Battery page for YAFI -->
|
||||
@@ -79,25 +79,6 @@
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwActionRow" id="chg_limit_override">
|
||||
<property name="sensitive">False</property>
|
||||
<property name="subtitle">Disables the limiter for one charge</property>
|
||||
<property name="title">Override Charge Limiter</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="halign">end</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="valign">center</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="chg_limit_override_btn">
|
||||
<property name="label">Override</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwPreferencesGroup" id="bat_ext_group">
|
||||
<property name="description">Preserve the battery lifespan by gradually lowering battery charge voltage automatically if the system is connected to AC for more than the set day limit.</property>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Created with Cambalache 0.96.1 -->
|
||||
<!-- Created with Cambalache 0.96.3 -->
|
||||
<interface>
|
||||
<!-- interface-name thermals.ui -->
|
||||
<!-- interface-description The Thermals page for YAFI -->
|
||||
@@ -92,6 +92,12 @@
|
||||
<property name="visible">False</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwExpanderRow" id="fan_set_points">
|
||||
<property name="selectable">False</property>
|
||||
<property name="title">Fan Set Points</property>
|
||||
</object>
|
||||
</child>
|
||||
<style>
|
||||
<class name="boxed-list"/>
|
||||
</style>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
||||
<!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd">
|
||||
<!-- Created with Cambalache 0.96.1 -->
|
||||
<!-- Created with Cambalache 0.96.3 -->
|
||||
<cambalache-project version="0.96.0" target_tk="gtk-4.0">
|
||||
<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="89f5b68da04abad587d8b949d18357cd956313680e663b10e5d42697f9bfbf6e"/>
|
||||
<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="3a50b0dea08b9acbaa389d7d7a38bd94970fdc79207ef10638f722f52d9425cd"/>
|
||||
<ui template-class="HardwarePage" filename="hardware.ui" sha256="37ea282198d9f60435f80e4adf8256cd2249e590dcad4b63af634d828673f1bf"/>
|
||||
<ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/>
|
||||
</cambalache-project>
|
||||
|
||||