kernel still breaking. updated name which may have been issue

This commit is contained in:
tumillanino
2026-04-09 15:58:55 +10:00
parent 1c59f8a718
commit c6ffa3591f
155 changed files with 6219 additions and 1 deletions

View File

@@ -0,0 +1,24 @@
# README.md
This folder contains
# gschema-overrides/
gschema-overrides files for all images
# scripts/
Scripts for from-scratch images (`base/`), images regardless of base (`shared/`), and for `solarizzed`.
# shared/
Files that will be transferred into all images' /.
# solarpowered/
Files that will be transferred into /. Only for `solarpowered` and `autosolarpowered`. Device-specific. Contains T480/s config files.
# solarpowered-ex/
Files that will be transferred into /. Only for `solarpowered-ex` and `autosolarpowered-ex`. Device-specific. Contains `B550-suspend-fix.service`.

View File

@@ -0,0 +1,8 @@
[gitlab.com_paulcarroty_vscodium_repo]
name=gitlab.com_paulcarroty_vscodium_repo
baseurl=https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/rpms/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg
metadata_expire=1h

View File

@@ -0,0 +1,3 @@
# README.md
This folder contains gschema-overrides files.

View File

@@ -0,0 +1,5 @@
[org.gnome.desktop.app-folders.folders.Waydroid]
apps=['Waydroid.desktop']
categories=['X-WayDroid-App']
name='Waydroid'
translate=false

View File

@@ -0,0 +1,4 @@
[org.gnome.shell]
disable-user-extensions=false
enabled-extensions=['nightthemeswitcher@romainvigier.fr', 'do-not-disturb-while-screen-sharing-or-recording@marcinjahn.com', 'caffeine@patapon.info', 'Bluetooth-Battery-Meter@maniacx.github.com', 'light-style@gnome-shell-extensions.gcampax.github.com', 'hibernate-status@dromi', 'gsconnect@andyholmes.github.io']

View File

@@ -0,0 +1,5 @@
[org.gnome.desktop.background]
color-shading-type='solid'
picture-options='zoom'
primary-color='#000000'
secondary-color='#000000'

View File

@@ -0,0 +1,11 @@
[org.gnome.desktop.interface]
accent-color='purple'
enable-hot-corners=false
clock-format='24h'
clock-show-weekday=false
show-battery-percentage=true
font-antialiasing='rgba'
font-hinting='none'
font-rendering='automatic'
gtk-theme='adw-gtk3'

View File

@@ -0,0 +1,3 @@
[org.gnome.desktop.peripherals.touchpad]
tap-to-click=true
two-finger-scrolling-enabled=true

View File

@@ -0,0 +1,3 @@
[org.gnome.desktop.wm.preferences]
action-double-click-titlebar='toggle-maximize'
titlebar-uses-system-font=true

View File

@@ -0,0 +1,3 @@
[org.gnome.mutter]
center-new-windows=true
check-alive-timeout=30000

View File

@@ -0,0 +1,4 @@
[org.gnome.nautilus.preferences]
default-sort-order='type'
show-create-link=true
show-delete-permanently=true

View File

@@ -0,0 +1,15 @@
# README.md
This folder contains
## base/
Scripts for use with DIY images, based on vanilla Fedora Silverblue as opposed to UBlue's `silverblue-main`
# shared/
Scripts for use with all images regardless of base
# solarizzed/
Scripts for use with `solarizzed` only, mainly contains KDE Plasma-related scripts

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Tell this script to exit if there are any errors.
# You should have this in every custom script, to ensure that your completed
# builds actually ran successfully without any errors!
set -oue pipefail
# Your code goes here.
echo 'This is an example shell script'
echo 'Scripts here will run during build if specified in recipe.yml'

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -ouex pipefail
OS_VERSION=$(rpm -E %fedora)
VER=$(basename $(curl -Ls -o /dev/null -w %{url_effective} https://github.com/bazzite-org/kernel-bazzite/releases/latest))
dnf -y remove kernel-* && rm -drf /usr/lib/modules/*
echo 'Installing Bazzite kernel...'
dnf install -y \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-common-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-akmods-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-internal-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-libs-$VER.fc$OS_VERSION.x86_64.rpm

View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
# Remove Fedora kernel & remove leftover files
dnf -y remove \
kernel \
kernel-* && \
rm -r -f /usr/lib/modules/*
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Configure exclusion
dnf -y config-manager setopt "fedora*".exclude=" \
kernel \
kernel-core \
kernel-modules \
kernel-modules-core \
kernel-modules-extra \
kernel-devel \
kernel-headers \
"
# Enable repos for kernel-blu and akmods
dnf -y copr enable sentry/kernel-blu
# dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
dnf -y config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
# Install akmods, kernel, and modules
dnf -y install --setopt=install_weak_deps=False \
kernel \
kernel-devel \
kernel-modules-extra \
akmods \
akmod-evdi \
help2man \
v4l2loopback \
zenergy
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) &&
akmods --force --kernels $VER --kmod v4l2loopback &&
akmods --force --kernels $VER --kmod zenergy &&
depmod -a $VER &&
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*terra*,*multimedia*}.repo

View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# Remove Fedora kernel & remove leftover files
dnf -y remove \
kernel \
kernel-* && \
rm -r -f /usr/lib/modules/*
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Enable repos
dnf -y copr enable bieszczaders/kernel-cachyos-lto
dnf -y copr enable bieszczaders/kernel-cachyos-addons
# dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
# Handles kernel post-transaction scriptlet
# mv /usr/lib/kernel/install.d/05-rpmostree.install /usr/lib/kernel/install.d/05-rpmostree.install.bak
# mv /usr/lib/kernel/install.d/50-dracut.install /usr/lib/kernel/install.d/50-dracut.install.bak
# printf '%s\n' '#!/bin/sh' 'exit 0' > /usr/lib/kernel/install.d/05-rpmostree.install
# printf '%s\n' '#!/bin/sh' 'exit 0' > /usr/lib/kernel/install.d/50-dracut.install
# chmod +x \
# /usr/lib/kernel/install.d/05-rpmostree.install \
# /usr/lib/kernel/install.d/50-dracut.install
# Install CachyOS LTO kernel & akmods
dnf -y install --setopt=install_weak_deps=False \
kernel-cachyos-lto \
kernel-cachyos-lto-devel \
akmods \
akmod-evdi \
zenergy \
scx-scheds \
scx-tools \
scx-manager
dnf -y swap zram-generator-defaults cachyos-settings
# Handles kernel post-transaction scriptlet
# rm -f /usr/lib/kernel/install.d/05-rpmostree.install \
# /usr/lib/kernel/install.d/50-dracut.install
# mv /usr/lib/kernel/install.d/05-rpmostree.install.bak /usr/lib/kernel/install.d/05-rpmostree.install
# mv /usr/lib/kernel/install.d/50-dracut.install.bak /usr/lib/kernel/install.d/50-dracut.install
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) && \
akmods --force --kernels $VER --kmod zenergy && \
akmods --force --kernels $VER --kmod evdi && \
depmod -a $VER && \
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*multimedia*,*terra*}.repo

View File

@@ -0,0 +1,31 @@
#!/usr/bin/env bash
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Enable repos for akmods
dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
dnf config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
# Install akmods, kernel, and modules
dnf -y install --setopt=install_weak_deps=False \
kernel-devel \
kernel-modules-extra \
akmods \
akmod-evdi \
help2man \
v4l2loopback \
zenergy
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) &&
akmods --force --kernels $VER --kmod v4l2loopback &&
akmods --force --kernels $VER --kmod zenergy &&
depmod -a $VER &&
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*terra*,*multimedia*}.repo

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/Adwaita-colors/
cd /tmp/clone/Adwaita-colors/
echo 'Directory created.'
git clone https://github.com/dpejoh/Adwaita-colors
echo 'Repo cloned. Copying files...'
cp -r ./Adwaita-colors/* /usr/share/icons/
echo 'Folders copied. Cleaning up!'
rm -r Adwaita-colors/
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
VER=$(basename $(curl -Ls -o /dev/null -w %{url_effective} https://github.com/pkgforge-dev/android-tools-AppImage/releases/latest))
curl -fLs --create-dirs https://github.com/pkgforge-dev/android-tools-AppImage/releases/download/${VER}/Android_Tools-${VER%@*}-anylinux-x86_64.AppImage -o /usr/bin/android-tools
chmod +x /usr/bin/android-tools
mkdir -p /tmp/android-tmp/
(
cd /tmp/android-tmp/
/usr/bin/android-tools --appimage-extract
)
readarray -t BINS < <(find /tmp/android-tmp/AppDir/bin/ -type f -printf "%f\n")
rm -rf /tmp/android-tmp/
for bin in "${BINS[@]}"; do
case "$bin" in
*xdg-open|*.hook|*.conf) continue;;
esac
ln -fs /usr/bin/android-tools /usr/bin/"$bin"
done

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Colloid-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -d /usr/share/icons -s default -t default -b
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -euox pipefail
tee "/etc/dracut.conf.d/00-dp-2.conf" > /dev/null << 'EOF'
install_items+=" /lib/firmware/edid/edid.bin "
EOF

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/somepaulo/MoreWaita"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh"
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."
# ---
# echo 'Preparing directory for cloning...'
# mkdir -p /tmp/clone/MoreWaita/
# cd /tmp/clone/MoreWaita/
# echo 'Directory created.'
# git clone https://github.com/somepaulo/MoreWaita.git
# echo 'Repo cloned. Running install script...'
# MoreWaita/install.sh
# cho 'Install script finished. Removing cloned repo...'
# rm -r MoreWaita
# echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/nautilus-copy-path/
cd /tmp/clone/nautilus-copy-path/
echo 'Directory created.'
git clone https://github.com/chr314/nautilus-copy-path.git
echo 'Repo cloned. Copying files...'
mkdir -p /usr/share/nautilus-python/extensions/nautilus-copy-path
cp ./nautilus-copy-path/nautilus-copy-path.py /usr/share/nautilus-python/extensions
cp ./nautilus-copy-path/nautilus_copy_path.py ./nautilus-copy-path/translation.py ./nautilus-copy-path/config.json /usr/share/nautilus-python/extensions/nautilus-copy-path
cp -rf ./nautilus-copy-path/translations /usr/share/nautilus-python/extensions/nautilus-copy-path
echo 'Install script finished. Removing cloned repo...'
rm -r nautilus-copy-path
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Qogir-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -t default -c standard
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Tela-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -d /usr/share/icons
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,68 @@
# Arch Linux box for CLI use
[box]
image=ghcr.io/askpng/box
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox"
exported_bins="bat btop eza glow pingu tldr"
# Arch Linux box for gaming use
[gamebox]
image=ghcr.io/askpng/gamebox:latest
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox celluloid hatt lutris megabasterd steam vesktop"
# BlueBuild-CLI
[bluebuild-cli]
image=ghcr.io/blue-build/cli:latest-alpine
additional_packages="nano bat fish git"
replace=true
# Debian
[debian]
image=quay.io/toolbx-images/debian-toolbox:unstable
additional_packages="nano bat fish"
replace=true
[fedora]
image=ghcr.io/ublue-os/fedora-distrobox:latest
additional_packages="nano bat fish"
#[bluefin-cli]
#image=ghcr.io/ublue-os/bluefin-cli
#nvidia=true
#[opensuse]
#image=quay.io/toolbx-images/opensuse-toolbox:tumbleweed
#nvidia=true
#[ubuntu]
#image=ghcr.io/ublue-os/ubuntu-toolbox:latest
#nvidia=true
#[alma]
#image=quay.io/toolbx-images/almalinux-toolbox:latest
#nvidia=true
#[centos]
#image=quay.io/toolbx-images/centos-toolbox:latest
#nvidia=true
#[wolfi]
#image=ghcr.io/ublue-os/wolfi-toolbox
#nvidia=true
#[wolfi-dx]
#image=ghcr.io/ublue-os/wolfi-dx-toolbox
#nvidia=true

View File

@@ -0,0 +1,4 @@
container_always_pull="1"
container_generate_entry=1
container_manager="podman"
non_interactive="1"

View File

@@ -0,0 +1,7 @@
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# For option meanings, see rpm-ostreed.conf(5).
[Daemon]
AutomaticUpdatePolicy=stage
#IdleExitTimeout=60

View File

@@ -0,0 +1,50 @@
################### File Generated by Goverlay ###################
legacy_layout=false
background_alpha=0.0
round_corners=0
background_alpha=0.0
background_color=000000
font_size=14
text_color=FFFFFF
position=top-left
toggle_hud=Shift_R+F12
pci_dev=0:08:00.0
table_columns=3
gpu_text=GPU
gpu_stats
gpu_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_temp
cpu_color=2E97CB
vram
vram_color=AD64C1
ram
ram_color=C26693
fps
fps_limit_method=late
toggle_fps_limit=Shift_L+F1
fps_limit=90
fps_color_change
fps_color=B22222,F9F06B,99C1F1
fps_value=30,90
#offset=0
output_folder=/var/home/mel
log_duration=30
autostart_log=0
log_interval=100
toggle_logging=Shift_L+F2

View File

@@ -0,0 +1,42 @@
## GENERAL ##
## profile ##
profile=fast
## hardware acceleration ##
# vo=gpu-next
# hwdec=auto
gpu-context=wayland,auto
vo=dmabuf-wayland,gpu-next
hwdec=auto-safe
# others #
save-position-on-quit=yes
keep-open=yes
border=yes
screenshot-directory="~/Pictures/mpv/"
screenshot-template="%F - [%P]v%#01n"
screenshot-format=webp
screenshot-webp-quality=90
slang=eng,en,enUS,en-US,English,jpn,jp,jap,Japanese
sub-font-size=32
volume-max=100
## INPUT ##
## OSD ##
osd-duration=2000
osd-playing-msg='${filename}'
# osc-seekbarstyle=bar
# osd-font-size=20
## resize window ##
autofit-larger=75%x75%
## yt-dlp ##
[protocol.https]
prefetch-playlist=yes
cache-secs=10
osd-playing-msg='${media-title}'
ytdl-format="bestvideo[height<=1080]+bestaudio"
ytdl-raw-options=cookies-from-browser=firefox

View File

@@ -0,0 +1,333 @@
-- Copyright (c) 2021, Eisa AlAwadhi
-- License: BSD 2-Clause License
-- Creator: Eisa AlAwadhi
-- Project: SmartCopyPaste
-- Version: 2.4.1
local utils = require 'mp.utils'
local msg = require 'mp.msg'
local protocols
local extensions
local pasted = false
----------------------------USER CUSTOMIZATION SETTINGS-----------------------------------
--These settings are for users to manually change some options in the script.
--Keybinds can be defined in the bottom of the script.
local device = nil --nil is for automatic device detection, or manually change to: 'windows' or 'mac' or 'linux'
local linux_copy = 'wl-copy' --copy command that will be used in Linux. OR write a different command
local linux_paste = 'wl-paste' --paste command that will be used in Linux. OR write a different command
local mac_copy = 'pbcopy' --copy command that will be used in MAC. OR write a different command
local mac_paste = 'pbpaste' --paste command that will be used in MAC. OR write a different command
local windows_copy = 'powershell' --'powershell' is for using windows powershell to copy. OR write the copy command, e.g: ' clip'
local windows_paste = 'powershell' --'powershell' is for using windows powershell to paste. OR write the paste command
local offset = -0.65 --change to 0 so that pasting resumes from the exact position, or decrease the value so that it gives you a little preview before reaching the exact pasted position
local paste_anything = false --false is for specific paste based on the specified extensions and protocols. Change to true so paste accepts anything (not recommended to change this).
if not paste_anything then
protocols = { --add below (after a comma) any protocol you want SmartCopyPaste to work with; e.g: ,'ftp://'
'https?://' ,'magnet:'
}
extensions = { --add below (after a comma) any extension you want SmartCopyPaste to work with; e.g: ,'pdf'
--video & audio
'ac3', 'a52', 'eac3', 'mlp', 'dts', 'dts-hd', 'dtshd', 'true-hd', 'thd', 'truehd', 'thd+ac3', 'tta', 'pcm', 'wav', 'aiff', 'aif', 'aifc', 'amr', 'awb', 'au', 'snd', 'lpcm', 'yuv', 'y4m', 'ape', 'wv', 'shn', 'm2ts', 'm2t', 'mts', 'mtv', 'ts', 'tsv', 'tsa', 'tts', 'trp', 'adts', 'adt', 'mpa', 'm1a', 'm2a', 'mp1', 'mp2', 'mp3', 'mpeg', 'mpg', 'mpe', 'mpeg2', 'm1v', 'm2v', 'mp2v', 'mpv', 'mpv2', 'mod', 'tod', 'vob', 'vro', 'evob', 'evo', 'mpeg4', 'm4v', 'mp4', 'mp4v', 'mpg4', 'm4a', 'aac', 'h264', 'avc', 'x264', '264', 'hevc', 'h265', 'x265', '265', 'flac', 'oga', 'ogg', 'opus', 'spx', 'ogv', 'ogm', 'ogx', 'mkv', 'mk3d', 'mka', 'webm', 'weba', 'avi', 'vfw', 'divx', '3iv', 'xvid', 'nut', 'flic', 'fli', 'flc', 'nsv', 'gxf', 'mxf', 'wma', 'wm', 'wmv', 'asf', 'dvr-ms', 'dvr', 'wtv', 'dv', 'hdv', 'flv','f4v', 'f4a', 'qt', 'mov', 'hdmov', 'rm', 'rmvb', 'ra', 'ram', '3ga', '3ga2', '3gpp', '3gp', '3gp2', '3g2', 'ay', 'gbs', 'gym', 'hes', 'kss', 'nsf', 'nsfe', 'sap', 'spc', 'vgm', 'vgz', 'm3u', 'm3u8', 'pls', 'cue',
--images
"ase", "art", "bmp", "blp", "cd5", "cit", "cpt", "cr2", "cut", "dds", "dib", "djvu", "egt", "exif", "gif", "gpl", "grf", "icns", "ico", "iff", "jng", "jpeg", "jpg", "jfif", "jp2", "jps", "lbm", "max", "miff", "mng", "msp", "nitf", "ota", "pbm", "pc1", "pc2", "pc3", "pcf", "pcx", "pdn", "pgm", "PI1", "PI2", "PI3", "pict", "pct", "pnm", "pns", "ppm", "psb", "psd", "pdd", "psp", "px", "pxm", "pxr", "qfx", "raw", "rle", "sct", "sgi", "rgb", "int", "bw", "tga", "tiff", "tif", "vtf", "xbm", "xcf", "xpm", "3dv", "amf", "ai", "awg", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "gbr", "odg", "svg", "stl", "vrml", "x3d", "sxd", "v2d", "vnd", "wmf", "emf", "art", "xar", "png", "webp", "jxr", "hdp", "wdp", "cur", "ecw", "iff", "lbm", "liff", "nrrd", "pam", "pcx", "pgf", "sgi", "rgb", "rgba", "bw", "int", "inta", "sid", "ras", "sun", "tga",
--other types
'torrent'
}
---------------------------END OF USER CUSTOMIZATION SETTINGS------------------------
else
protocols = {''}
extensions = {''}
end
if not device then
if os.getenv('windir') ~= nil then
device = 'windows'
elseif os.execute '[ -d "/Applications" ]' == 0 and os.execute '[ -d "/Library" ]' == 0 or os.execute '[ -d "/Applications" ]' == true and os.execute '[ -d "/Library" ]' == true then
device = 'mac'
else
device = 'linux'
end
end
function handleres(res, args)
if not res.error and res.status == 0 then
return res.stdout
else
msg.error("There was an error getting "..device.." clipboard: ")
msg.error(" Status: "..(res.status or ""))
msg.error(" Error: "..(res.error or ""))
msg.error(" stdout: "..(res.stdout or ""))
msg.error("args: "..utils.to_string(args))
return ''
end
end
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local function get_extension(path)
match = string.match(path, '%.([^%.]+)$' )
if match == nil then
return 'nomatch'
else
return match
end
end
local function get_extentionpath(path)
match = string.match(path,'(.*)%.([^%.]+)$')
if match == nil then
return 'nomatch'
else
return match
end
end
local function has_extension (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
local function starts_protocol (tab, val)
for index, value in ipairs(tab) do
if (val:find(value) == 1) then
return true
end
end
return false
end
function get_clipboard()
local clip
if device == 'linux' then
clip = os.capture(linux_paste, false)
return clip
elseif device == 'windows' then
if windows_paste == 'powershell' then
local args = {
'powershell', '-NoProfile', '-Command', [[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
$clip = Get-Clipboard -Raw -Format Text -TextFormatType UnicodeText
if ($clip) {
$clip = $clip
}
else {
$clip = Get-Clipboard -Raw -Format FileDropList
}
$u8clip = [System.Text.Encoding]::UTF8.GetBytes($clip)
[Console]::OpenStandardOutput().Write($u8clip, 0, $u8clip.Length)
}]]
}
return handleres(utils.subprocess({ args = args, cancellable = false }), args)
else
clip = os.capture(windows_paste, false)
return clip
end
elseif device == 'mac' then
clip = os.capture(mac_paste, false)
return clip
end
return ''
end
function set_clipboard(text)
local pipe
if device == 'linux' then
pipe = io.popen(linux_copy, 'w')
pipe:write(text)
pipe:close()
elseif device == 'windows' then
if windows_copy == 'powershell' then
local res = utils.subprocess({ args = {
'powershell', '-NoProfile', '-Command', string.format([[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
Add-Type -AssemblyName PresentationCore
[System.Windows.Clipboard]::SetText('%s')
}]], text)
} })
else
pipe = io.popen(windows_copy,'w')
pipe:write(text)
pipe:close()
end
elseif device == 'mac' then
pipe = io.popen(mac_copy,'w')
pipe:write(text)
pipe:close()
end
return ''
end
local function copy()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
local time = math.floor(mp.get_property_number('time-pos'))
mp.osd_message("Copied:\n"..filePath..' |time='..tostring(time))
set_clipboard(filePath..' |time='..tostring(time))
else
mp.osd_message('Failed to Copy\nNo Video Found')
end
end
local function copy_path()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
mp.osd_message("Copied Video Only:\n"..filePath)
set_clipboard(filePath)
else
return false
end
end
function paste()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
local time
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
time = string.match(clip, ' |time=(.*)')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
local seekTime
if (filePath == nil) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath == nil) and (starts_protocol(protocols, videoFile)) then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath ~= nil) and (filePath ~= videoFile) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) and (filePath ~= videoFile) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
elseif (filePath == videoFile) and (time == nil) then
mp.osd_message('Same file is already running:\n'..clip)
elseif (filePath == videoFile) and (time ~= nil) then
mp.osd_message('Resumed to Copied Time')
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
else
mp.osd_message('Failed to Paste\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
function paste_playlist()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
if has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
else
mp.osd_message('Failed to Add Into Playlist\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
mp.register_event('end-file', function()
pasted = false
end)
mp.register_event('file-loaded', function()
if (pasted == true) then
local clip = get_clipboard()
local time = string.match(clip, ' |time=(.*)')
local videoFile = string.match(clip, '(.*) |time=')
local filePath = mp.get_property_native('path')
local seekTime
if (filePath == videoFile) and (time ~= nil) then
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
end
else
return false
end
end)
---------------------------KEYBINDS CUSTOMIZATION SETTINGS---------------------------------
if device == 'mac' then --MAC OS Keybinds
mp.add_key_binding('Meta+alt+c', 'copy-path', copy_path)
mp.add_key_binding('Meta+alt+C', 'copy-pathCaps', copy_path)
mp.add_key_binding('Meta+alt+v', 'paste-playlist', paste_playlist)
mp.add_key_binding('Meta+alt+V', 'paste-playlistCaps', paste_playlist)
else --Windows and Linux Keybinds
mp.add_key_binding('ctrl+c', 'copy-path', copy_path)
mp.add_key_binding('ctrl+v', 'paste-playlist', paste_playlist)
end
---------------------END OF KEYBINDS CUSTOMIZATION SETTINGS---------------------------------

View File

@@ -0,0 +1,56 @@
---@class ClipshotOptions
---@field name string
---@field type string
local o = {
name = 'mpv-screenshot.jpeg',
type = '' -- defaults to jpeg
}
require('mp.options').read_options(o, 'clipshot')
local file, cmd
local lib = package.cpath:match('%p[\\|/]?%p(%a+)')
if lib == 'so' then -- Linux/BSD
file = '/tmp/'..o.name
if os.getenv('XDG_SESSION_TYPE') == 'wayland' then -- Wayland
cmd = {'sh', '-c', ('wl-copy < %q'):format(image)}
else -- Xorg
local type = o.type ~= '' and o.type or 'image/jpeg'
cmd = {'xclip', '-sel', 'c', '-t', type, '-i', file}
end
elseif lib == 'dll' then -- Windows
file = os.getenv('TEMP')..'\\'..o.name
cmd = {
'powershell', '-NoProfile', '-Command', ([[& {
Add-Type -Assembly System.Windows.Forms;
Add-Type -Assembly System.Drawing;
$shot = [Drawing.Image]::FromFile(%q);
[Windows.Forms.Clipboard]::SetImage($shot);
}]]):format(file)
}
else -- MacOS
file = os.getenv('TMPDIR')..'/'..o.name
-- png: «class PNGf»
local type = o.type ~= '' and o.type or 'JPEG picture'
cmd = {
'osascript', '-e', ([[
set the clipboard to ( ¬
read (POSIX file %q) as %s)
]]):format(file, type)
}
end
---@param arg string
---@return fun()
local function clipshot(arg)
return function()
mp.commandv('screenshot-to-file', file, arg)
mp.command_native_async({'run', unpack(cmd)}, function(suc, _, err)
mp.osd_message(suc and 'Copied screenshot to clipboard' or err, 1)
end)
end
end
mp.add_key_binding('c', 'clipshot-subs', clipshot('subtitles'))
mp.add_key_binding('C', 'clipshot-video', clipshot('video'))
mp.add_key_binding('Alt+c', 'clipshot-window', clipshot('window'))

View File

@@ -0,0 +1,418 @@
-- reload.lua
--
-- When an online video is stuck buffering or got very slow CDN
-- source, restarting often helps. This script provides automatic
-- reloading of videos that doesn't have buffering progress for some
-- time while keeping the current time position. It also adds `Ctrl+r`
-- keybinding to reload video manually.
--
-- SETTINGS
--
-- To override default setting put the `lua-settings/reload.conf` file in
-- mpv user folder, on linux it is `~/.config/mpv`. NOTE: config file
-- name should match the name of the script.
--
-- Default `reload.conf` settings:
--
-- ```
-- # enable automatic reload on timeout
-- # when paused-for-cache event fired, we will wait
-- # paused_for_cache_timer_timeout sedonds and then reload the video
-- paused_for_cache_timer_enabled=yes
--
-- # checking paused_for_cache property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- paused_for_cache_timer_interval=1
--
-- # time in seconds to wait until reload
-- paused_for_cache_timer_timeout=10
--
-- # enable automatic reload based on demuxer cache
-- # if demuxer-cache-time property didn't change in demuxer_cache_timer_timeout
-- # time interval, the video will be reloaded as soon as demuxer cache depleated
-- demuxer_cache_timer_enabled=yes
--
-- # checking demuxer-cache-time property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- demuxer_cache_timer_interval=2
--
-- # if demuxer cache didn't receive any data during demuxer_cache_timer_timeout
-- # we decide that it has no progress and will reload the stream when
-- # paused_for_cache event happens
-- demuxer_cache_timer_timeout=20
--
-- # when the end-of-file is reached, reload the stream to check
-- # if there is more content available.
-- reload_eof_enabled=no
--
-- # keybinding to reload stream from current time position
-- # you can disable keybinding by setting it to empty value
-- # reload_key_binding=
-- reload_key_binding=Ctrl+r
-- ```
--
-- DEBUGGING
--
-- Debug messages will be printed to stdout with mpv command line option
-- `--msg-level='reload=debug'`. You may also need to add the `--no-msg-color`
-- option to make the debug logs visible if you are using a dark colorscheme
-- in terminal.
local msg = require 'mp.msg'
local options = require 'mp.options'
local utils = require 'mp.utils'
local settings = {
paused_for_cache_timer_enabled = true,
paused_for_cache_timer_interval = 1,
paused_for_cache_timer_timeout = 10,
demuxer_cache_timer_enabled = true,
demuxer_cache_timer_interval = 2,
demuxer_cache_timer_timeout = 20,
reload_eof_enabled = false,
reload_key_binding = "Ctrl+r",
}
-- global state stores properties between reloads
local property_path = nil
local property_time_pos = 0
local property_keep_open = nil
-- FSM managing the demuxer cache.
--
-- States:
--
-- * fetch - fetching new data
-- * stale - unable to fetch new data for time < 'demuxer_cache_timer_timeout'
-- * stuck - unable to fetch new data for time >= 'demuxer_cache_timer_timeout'
--
-- State transitions:
--
-- +---------------------------+
-- v |
-- +-------+ +-------+ +-------+
-- + fetch +<--->+ stale +---->+ stuck |
-- +-------+ +-------+ +-------+
-- | ^ | ^ | ^
-- +---+ +---+ +---+
local demuxer_cache = {
timer = nil,
state = {
name = 'uninitialized',
demuxer_cache_time = 0,
in_state_time = 0,
},
events = {
continue_fetch = { name = 'continue_fetch', from = 'fetch', to = 'fetch' },
continue_stale = { name = 'continue_stale', from = 'stale', to = 'stale' },
continue_stuck = { name = 'continue_stuck', from = 'stuck', to = 'stuck' },
fetch_to_stale = { name = 'fetch_to_stale', from = 'fetch', to = 'stale' },
stale_to_fetch = { name = 'stale_to_fetch', from = 'stale', to = 'fetch' },
stale_to_stuck = { name = 'stale_to_stuck', from = 'stale', to = 'stuck' },
stuck_to_fetch = { name = 'stuck_to_fetch', from = 'stuck', to = 'fetch' },
},
}
-- Always start with 'fetch' state
function demuxer_cache.reset_state()
demuxer_cache.state = {
name = demuxer_cache.events.continue_fetch.to,
demuxer_cache_time = 0,
in_state_time = 0,
}
end
-- Has 'demuxer_cache_time' changed
function demuxer_cache.has_progress_since(t)
return demuxer_cache.state.demuxer_cache_time ~= t
end
function demuxer_cache.is_state_fetch()
return demuxer_cache.state.name == demuxer_cache.events.continue_fetch.to
end
function demuxer_cache.is_state_stale()
return demuxer_cache.state.name == demuxer_cache.events.continue_stale.to
end
function demuxer_cache.is_state_stuck()
return demuxer_cache.state.name == demuxer_cache.events.continue_stuck.to
end
function demuxer_cache.transition(event)
if demuxer_cache.state.name == event.from then
-- state setup
demuxer_cache.state.demuxer_cache_time = event.demuxer_cache_time
if event.name == 'continue_fetch' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stale' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stuck' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'fetch_to_stale' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_fetch' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_stuck' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stuck_to_fetch' then
demuxer_cache.state.in_state_time = 0
end
-- state transition
demuxer_cache.state.name = event.to
msg.debug('demuxer_cache.transition', event.name, utils.to_string(demuxer_cache.state))
else
msg.error(
'demuxer_cache.transition',
'illegal transition', event.name,
'from state', demuxer_cache.state.name)
end
end
function demuxer_cache.initialize(demuxer_cache_timer_interval)
demuxer_cache.reset_state()
demuxer_cache.timer = mp.add_periodic_timer(
demuxer_cache_timer_interval,
function()
demuxer_cache.demuxer_cache_timer_tick(
mp.get_property_native('demuxer-cache-time'),
demuxer_cache_timer_interval)
end
)
end
-- If there is no progress of demuxer_cache_time in
-- settings.demuxer_cache_timer_timeout time interval switch state to
-- 'stuck' and switch back to 'fetch' as soon as any progress is made
function demuxer_cache.demuxer_cache_timer_tick(demuxer_cache_time, demuxer_cache_timer_interval)
local event = nil
local cache_has_progress = demuxer_cache.has_progress_since(demuxer_cache_time)
-- I miss pattern matching so much
if demuxer_cache.is_state_fetch() then
if cache_has_progress then
event = demuxer_cache.events.continue_fetch
else
event = demuxer_cache.events.fetch_to_stale
end
elseif demuxer_cache.is_state_stale() then
if cache_has_progress then
event = demuxer_cache.events.stale_to_fetch
elseif demuxer_cache.state.in_state_time < settings.demuxer_cache_timer_timeout then
event = demuxer_cache.events.continue_stale
else
event = demuxer_cache.events.stale_to_stuck
end
elseif demuxer_cache.is_state_stuck() then
if cache_has_progress then
event = demuxer_cache.events.stuck_to_fetch
else
event = demuxer_cache.events.continue_stuck
end
end
event.demuxer_cache_time = demuxer_cache_time
event.interval = demuxer_cache_timer_interval
demuxer_cache.transition(event)
end
local paused_for_cache = {
timer = nil,
time = 0,
}
function paused_for_cache.reset_timer()
msg.debug('paused_for_cache.reset_timer', paused_for_cache.time)
if paused_for_cache.timer then
paused_for_cache.timer:kill()
paused_for_cache.timer = nil
paused_for_cache.time = 0
end
end
function paused_for_cache.start_timer(interval_seconds, timeout_seconds)
msg.debug('paused_for_cache.start_timer', paused_for_cache.time)
if not paused_for_cache.timer then
paused_for_cache.timer = mp.add_periodic_timer(
interval_seconds,
function()
paused_for_cache.time = paused_for_cache.time + interval_seconds
if paused_for_cache.time >= timeout_seconds then
paused_for_cache.reset_timer()
reload_resume()
end
msg.debug('paused_for_cache', 'tick', paused_for_cache.time)
end
)
end
end
function paused_for_cache.handler(property, is_paused)
if is_paused then
if demuxer_cache.is_state_stuck() then
msg.info("demuxer cache has no progress")
-- reset demuxer state to avoid immediate reload if
-- paused_for_cache event triggered right after reload
demuxer_cache.reset_state()
reload_resume()
end
paused_for_cache.start_timer(
settings.paused_for_cache_timer_interval,
settings.paused_for_cache_timer_timeout)
else
paused_for_cache.reset_timer()
end
end
function read_settings()
options.read_options(settings, mp.get_script_name())
msg.debug(utils.to_string(settings))
end
function reload(path, time_pos)
msg.debug("reload", path, time_pos)
if time_pos == nil then
mp.commandv("loadfile", path, "replace")
else
mp.commandv("loadfile", path, "replace", "start=+" .. time_pos)
end
end
function reload_resume()
local path = mp.get_property("path", property_path)
local time_pos = mp.get_property("time-pos")
local reload_duration = mp.get_property_native("duration")
local playlist_count = mp.get_property_number("playlist/count")
local playlist_pos = mp.get_property_number("playlist-pos")
local playlist = {}
for i = 0, playlist_count-1 do
playlist[i] = mp.get_property("playlist/" .. i .. "/filename")
end
-- Tries to determine live stream vs. pre-recordered VOD. VOD has non-zero
-- duration property. When reloading VOD, to keep the current time position
-- we should provide offset from the start. Stream doesn't have fixed start.
-- Decent choice would be to reload stream from it's current 'live' positon.
-- That's the reason we don't pass the offset when reloading streams.
if reload_duration and reload_duration > 0 then
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
-- VODs get stuck when reload is called without a time_pos
-- this is most noticeable in youtube videos whenever download gets stuck in the first frames
-- video would stay paused without being actually paused
-- issue surfaced in mpv 0.33, afaik
elseif reload_duration and reload_duration == 0 then
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
else
msg.info("reloading stream")
reload(path, nil)
end
msg.info("file ", playlist_pos+1, "of", playlist_count, "in playlist")
for i = 0, playlist_pos-1 do
mp.commandv("loadfile", playlist[i], "append")
end
mp.commandv("playlist-move", 0, playlist_pos+1)
for i = playlist_pos+1, playlist_count-1 do
mp.commandv("loadfile", playlist[i], "append")
end
end
function reload_eof(property, eof_reached)
msg.debug("reload_eof", property, eof_reached)
local time_pos = mp.get_property_number("time-pos")
local duration = mp.get_property_number("duration")
if eof_reached and math.floor(time_pos) == math.floor(duration) then
msg.debug("property_time_pos", property_time_pos, "time_pos", time_pos)
-- Check that playback time_pos made progress after the last reload. When
-- eof is reached we try to reload video, in case there is more content
-- available. If time_pos stayed the same after reload, it means that vidkk
-- to avoid infinite reload loop when playback ended
-- math.floor function rounds time_pos to a second, to avoid inane reloads
if math.floor(property_time_pos) == math.floor(time_pos) then
msg.info("eof reached, playback ended")
mp.set_property("keep-open", property_keep_open)
else
msg.info("eof reached, checking if more content available")
reload_resume()
mp.set_property_bool("pause", false)
property_time_pos = time_pos
end
end
end
function on_file_loaded(event)
local debug_info = {
event = event,
time_pos = mp.get_property("time-pos"),
stream_pos = mp.get_property("stream-pos"),
stream_end = mp.get_property("stream-end"),
duration = mp.get_property("duration"),
seekable = mp.get_property("seekable"),
pause = mp.get_property("pause"),
paused_for_cache = mp.get_property("paused-for-cache"),
cache_buffering_state = mp.get_property("cache-buffering-state"),
}
msg.debug("debug_info", utils.to_string(debug_info))
-- When the video is reloaded after being paused for cache, it won't start
-- playing again while all properties looks fine:
-- `pause=no`, `paused-for-cache=no` and `cache-buffering-state=100`.
-- As a workaround, we cycle through the paused state by sending two SPACE
-- keypresses.
-- What didn't work:
-- - Cycling through the `pause` property.
-- - Run the `playlist-play-index current` command.
mp.commandv("keypress", 'SPACE')
mp.commandv("keypress", 'SPACE')
end
-- main
read_settings()
if settings.reload_key_binding ~= "" then
mp.add_key_binding(settings.reload_key_binding, "reload_resume", reload_resume)
end
if settings.paused_for_cache_timer_enabled then
mp.observe_property("paused-for-cache", "bool", paused_for_cache.handler)
end
if settings.demuxer_cache_timer_enabled then
demuxer_cache.initialize(settings.demuxer_cache_timer_interval)
end
if settings.reload_eof_enabled then
-- vo-configured == video output created && its configuration went ok
mp.observe_property(
"vo-configured",
"bool",
function(name, vo_configured)
msg.debug(name, vo_configured)
if vo_configured then
property_path = mp.get_property("path")
property_keep_open = mp.get_property("keep-open")
mp.set_property("keep-open", "yes")
mp.set_property("keep-open-pause", "no")
end
end
)
mp.observe_property("eof-reached", "bool", reload_eof)
end
mp.register_event("file-loaded", on_file_loaded)

View File

@@ -0,0 +1,5 @@
if grep -q "Arch Linux" /etc/os-release
function bat --wraps=glow --description 'alias bat glow'
glow $argv
end
end

View File

@@ -0,0 +1,9 @@
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
if grep -q "Arch Linux" /etc/os-release
function cat --wraps=glow --description 'alias cat glow'
glow $argv
end
end

View File

@@ -0,0 +1,3 @@
function deployments
rpm-ostree status $argv
end

View File

@@ -0,0 +1,7 @@
function fish_greeting
fastfetch -c ~/.config/fastfetch/startup.jsonc
## atuin
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
end

View File

@@ -0,0 +1,4 @@
function m4a --description 'alias m4a yt-dlp -x --audio-format m4a'
yt-dlp -x --audio-format m4a $argv
end

View File

@@ -0,0 +1,3 @@
function pin-deployment
sudo ostree admin pin $argv
end

View File

@@ -0,0 +1,3 @@
function remove-deployment
sudo ostree admin undeploy $argv
end

View File

@@ -0,0 +1,3 @@
function unpin-deployment
sudo ostree admin pin -u $argv
end

View File

@@ -0,0 +1,5 @@
-N 5
--embed-thumbnail
--embed-metadata
--cookies-from-browser firefox
-o ~/Downloads/%(fulltitle)s.%(ext)s

View File

@@ -0,0 +1,7 @@
--ozone-platform-hint=auto
--enable-gpu-rasterization
--ignore-gpu-blocklist
--enable-zero-copy
--use-gl=angle
--use-angle=vulkan
--enable-features=Vulkan,DefaultANGLEVulkan,VulkanFromANGLE,VaapiVideoDecodeLinuxGL,VaapiIgnoreDriverChecks,VaapiVideoEncoder,VaapiVideoDecoder

View File

@@ -0,0 +1,221 @@
# Include any additional configuration file(s)
# [include] sections are processed in the order you write them
# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file
[include]
# paths = ["/etc/topgrade.toml"]
[misc]
# Run `sudo -v` to cache credentials at the start of the run
# This avoids a blocking password prompt in the middle of an unattended run
# (default: false)
# pre_sudo = false
# Sudo command to be used
# sudo_command = "sudo"
# Disable specific steps - same options as the command line flag
disable = ["system", "containers"]
# Ignore failures for these steps
# ignore_failures = ["toolbx", "distrobox"]
# List of remote machines with Topgrade installed on them
# remote_topgrades = ["toothless", "pi", "parnas"]
# Path to Topgrade executable on remote machines
# remote_topgrade_path = ".cargo/bin/topgrade"
# Arguments to pass to SSH when upgrading remote systems
# ssh_arguments = "-o ConnectTimeout=2"
# Arguments to pass tmux when pulling Repositories
# tmux_arguments = "-S /var/tmux.sock"
# Do not set the terminal title (default: true)
# set_title = true
# Display the time in step titles (default: true)
# display_time = true
# Don't ask for confirmations (no default value)
assume_yes = true
# Do not ask to retry failed steps (default: false)
# no_retry = true
# Run inside tmux (default: false)
# run_in_tmux = true
# Cleanup temporary or old files (default: false)
cleanup = true
# Send a notification for every step (default: false)
# notify_each_step = false
# Skip sending a notification at the end of a run (default: false)
# skip_notify = true
# The Bash-it branch to update (default: "stable")
# bashit_branch = "stable"
# Run specific steps - same options as the command line flag
# only = ["system", "emacs"]
# Whether to self update
#
# this will be ignored if the binary is built without self update support
#
# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE)
# no_self_update = true
# Extra tracing filter directives
# These are prepended to the `--log-filter` argument
# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
# log_filters = ["topgrade::command=debug", "warn"]
# Commands to run before anything
[pre_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Commands to run after anything
[post_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Custom commands
[commands]
# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter"
# "Custom command using interactive shell (unix)" = "-i vim_upgrade"
[python]
# enable_pip_review = true ###disabled by default
# enable_pip_review_local = true ###disabled by default
# enable_pipupgrade = true ###disabled by default
# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default
[composer]
# self_update = true
[brew]
# For the BrewCask step
# If `Repo Cask Upgrade` exists, then use the `-a` option.
# Otherwise, use the `--greedy` option.
# greedy_cask = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewFormula step
# Execute `brew autoremove` after the step.
# autoremove = true
# For the BrewFormula step
# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD`
# fetch_head = true
[linux]
# Arch Package Manager to use.
# Allowed values:
# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay
# arch_package_manager = "pacman"
# Arguments to pass yay (or paru) when updating packages
# yay_arguments = "--nodevel"
# Arguments to pass dnf when updating packages
# dnf_arguments = "--refresh"
# aura_aur_arguments = "-kx"
# aura_pacman_arguments = ""
# garuda_update_arguments = ""
# show_arch_news = true
# trizen_arguments = "--devel"
# pikaur_arguments = ""
# pamac_arguments = "--no-devel"
# enable_tlmgr = true
# emerge_sync_flags = "-q"
# emerge_update_flags = "-uDNa --with-bdeps=y world"
# redhat_distro_sync = false
# suse_dup = false
# rpm_ostree = false
# nix_arguments = "--flake"
# nix_env_arguments = "--prebuilt-only"
# Extra Home Manager arguments
# home_manager_arguments = ["--flake", "file"]
[git]
# How many repos to pull at max in parallel
# max_concurrency = 5
# Additional git repositories to pull
repos = [
"$HOME/*/",
"$HOME/git/*/",
]
# Don't pull the predefined git repos
# pull_predefined = false
# Arguments to pass Git when pulling Repositories
# arguments = "--rebase --autostash"
[windows]
# Manually select Windows updates
# accept_all_updates = false
# open_remotes_in_new_terminal = true
# wsl_update_pre_release = true
# wsl_update_use_web_download = true
# Causes Topgrade to rename itself during the run to allow package managers
# to upgrade it. Use this only if you installed Topgrade by using a package
# manager such as Scoop or Cargo
# self_rename = true
[npm]
# Use sudo if the NPM directory isn't owned by the current user
# use_sudo = true
[yarn]
# Run `yarn global upgrade` with `sudo`
# use_sudo = true
[vim]
# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate`
# force_plug_update = true
[firmware]
# Offer to update firmware; if false just check for and display available updates
upgrade = false
[vagrant]
# Vagrant directories
# directories = []
# power on vagrant boxes if needed
# power_on = true
# Always suspend vagrant boxes instead of powering off
# always_suspend = true
[flatpak]
# Use sudo for updating the system-wide installation
# use_sudo = true
[distrobox]
use_root = false
# containers = ["archlinux-latest"]
[containers]
# Specify the containers to ignore while updating (Wildcard supported)
# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"]
[lensfun]
# If disabled, Topgrade invokes `lensfunupdatedata` without root priviledge,
# then the update will be only available to you. Otherwise, `sudo` is required,
# and the update will be installed system-wide, i.e., available to all users.
# (default: false)
# use_sudo = false

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
/usr/bin/just --justfile /usr/share/appends/00-master.just "${@}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run net.kuribo64.melonDS "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run net.kuribo64.melonDS
fi

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
IGNORE_MANUAL="wheel|root|sudo|nobody"
for manually_created_user in $(grep -E -e ".*:[1-3][[:digit:]]{3}:.*" "$1") ; do
# `grep` matched on a group with GID [1-3]000 or so
if [ ! -z "$(cut -f4 -d: <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1,3 -d: --output-delimiter="|" <<< "${manually_created_user}")|${IGNORE_MANUAL:-}"
for related_group in $(grep "$(cut -f1 -d: <<< ${manually_created_user})" "$1"); do
# Deduplicates matches for the same group/user
if [ "$(cut -f1 <<< "${related_group}")" == "$(cut -f1 <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1 -d: <<< "${related_group}")|${IGNORE_MANUAL:-}"
done
done
grep --no-filename -e "^g" /usr/lib/sysusers.d/*.conf | grep -v -E -e "${IGNORE_MANUAL}" | tr -s " " | cut -d" " -f2 | uniq | xargs -I{} sed -i "/{}/d" "${1}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run io.github.ryubing.Ryujinx "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run io.github.ryubing.Ryujinx
fi

View File

@@ -0,0 +1,27 @@
#!/bin/sh
export XDG_RUNTIME_DIR=/run/user/$(id -u)
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
eval $(dbus-launch --sh-syntax)
fi
mutter --wayland &
MUTTER_PID=$!
sleep 5
export DISPLAY=:1
# Start Waydroid in the background
waydroid show-full-ui &
WAYDROID_PID=$!
# Wait for Waydroid exit event in the log
tail -f -n0 /var/lib/waydroid/waydroid.log | grep -m1 run_buffer
# Cleanup and logout
kill $WAYDROID_PID
kill $MUTTER_PID
# Use loginctl to end the session gracefully
loginctl terminate-session "$XDG_SESSION_ID"
exit 0

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Define directory & target filename
directory="$1"
filename="$2"
# Check if the filename already has .tar.zst; if not, append it
if [[ ! "$filename" =~ \.tar\.zst$ ]]; then
archive="$filename.tar.zst"
else
archive="$filename"
fi
# Make sure the directory exists
if [[ ! -d "$directory" ]]; then
echo "Directory '$directory' not found."
return 1
fi
# Create the archive with tar and pipe it to zstd
tar -cvf - "$directory" | zstd -9 -T0 -o "$archive"
# Check for errors during compression
if [[ $? -ne 0 ]]; then
echo "Error during compression."
return 1
fi

View File

@@ -0,0 +1,27 @@
# We have this script so that people using images with `nss-altfiles` (`/usr/lib/g{roup,shadow}`)
# do not break their systems when rebasing to an image without that
# This usually happens when using https://github.com/hhd-dev/rechunk then rebasing to an image without it.
# Please DO NOT remove this unless this is fully, completely obsolete.
# This is exactly what is making it break: https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e99afbdc2eb06788ae28e157a88b03d70/1_prune.sh#L41-L47
# Users WILL experience black screens and systems will NOT boot if this script malfunctions. Please test this properly and always make sure this works
# Relevant issues:
# - https://github.com/bootc-dev/bootc/issues/1179#issuecomment-2708305926
# - https://github.com/ublue-os/main/issues/759
# - https://github.com/ublue-os/bluefin-lts/issues/918
# - https://github.com/ublue-os/image-template/issues/177
# - https://github.com/ublue-os/aurora/issues/1468
# - https://github.com/ublue-os/bluefin/issues/3852
# This got created on Tue, 16 Dec 2025 00:44:58 -0300
[Unit]
Description=Fix groups for Legacy rechunker
Wants=local-fs.target
After=local-fs.target
[Service]
Type=oneshot
ExecStart=rechunker-group-fix /etc/group
ExecStart=rechunker-group-fix /etc/gshadow
ExecStart=systemd-sysusers
[Install]
WantedBy=default.target multi-user.target

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Topgrade update service
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecCondition=/bin/bash -c '[[ "$(busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered | cut -c 3-)" == @(2|4) ]]'
ExecStart=/usr/bin/topgrade --no-retry --cleanup --yes

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Topgrade update service timer
[Timer]
RandomizedDelaySec=5m
OnBootSec=2m
OnUnitActiveSec=12h
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1 @@
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"

View File

@@ -0,0 +1 @@
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sudo waydroid container restart

View File

@@ -0,0 +1,9 @@
set allow-duplicate-recipes := true
set ignore-comments := true
import "/usr/share/appends/01-system.just"
import "/usr/share/appends/10-apps.just"
import? "/usr/share/appends/99-solarpowered-ex.just"
import? "/usr/share/appends/99-solarpowered.just"
import? "$HOME/.justfile"
import? "$HOME/Justfile"

View File

@@ -0,0 +1,124 @@
# Boot into this device's BIOS/UEFI screen
bios:
#!/usr/bin/bash
if [ -d /sys/firmware/efi ]; then
systemctl reboot --firmware-setup
else
echo "Rebooting to legacy BIOS from OS is not supported."
fi
# Regenerate GRUB config
regenerate-grub:
#!/usr/bin/env bash
if [ -d /sys/firmware/efi ]; then
sudo grub2-mkconfig -o /etc/grub2-efi.cfg
else
sudo grub2-mkconfig -o /etc/grub2.cfg
fi
# Check for local overrides
check-local-overrides:
#!/usr/bin/env bash
diff -r \
--suppress-common-lines \
--color="always" \
--exclude "passwd*" \
--exclude "group*" \
--exclude="subgid*" \
--exclude="subuid*" \
--exclude="machine-id" \
--exclude="adjtime" \
--exclude="fstab" \
--exclude="system-connections" \
--exclude="shadow*" \
--exclude="gshadow*" \
--exclude="ssh_host*" \
--exclude="cmdline" \
--exclude="crypttab" \
--exclude="hostname" \
--exclude="localtime" \
--exclude="locale*" \
--exclude="*lock" \
--exclude=".updated" \
--exclude="*LOCK" \
--exclude="vconsole*" \
--exclude="00-keyboard.conf" \
--exclude="grub" \
--exclude="system.control*" \
--exclude="cdi" \
--exclude="default.target" \
/usr/etc /etc 2>/dev/null | sed '/Binary\ files\ /d'
# Show changelog between deployments
changelogs:
rpm-ostree db diff --changelogs
# Clean up old up unused podman images, volumes, flatpak packages and rpm-ostree content
clean-system:
podman image prune -af
podman volume prune -f
flatpak uninstall --unused
rpm-ostree cleanup -bm
# Renew IP & flush DNS
reset-address:
sudo nmcli device disconnect enp4s0
sudo nmcli device connect enp4s0
sudo systemctl restart systemd-resolved
systemd-resolve --status
# Enable iwd, disable wpa_supplicant
enable-iwd:
#!/usr/bin/env bash
sudo systemctl disable --now wpa_supplicant
sudo systemctl mask wpa_supplicant
mkdir -Z /etc/NetworkManager/conf.d
sudo cat > /etc/NetworkManager/conf.d/iwd.conf <<EOF
[device]
wifi.backend=iwd
EOF
restorecon -R /etc/NetworkManager
sudo systemctl restart NetworkManager
# Disable iwd, reenable wpa_supplicant
disable-iwd:
sudo mv "/etc/NetworkManager/conf.d/iwd.conf" "/etc/NetworkManager/conf.d/iwd.conf.off"
sudo systemctl disable --now iwd
sudo systemctl unmask wpa_supplicant
sudo systemctl enable --now wpa_supplicant
sudo systemctl restart NetworkManager
# Disable Zram and enable Zswap. Requires reboot
enable-zswap: disable-zram
sudo rpm-ostree kargs --append-if-missing=zswap.enabled=1 --append-if-missing=zswap.compressor=lz4 --append-if-missing=zswap.max_pool_percent=25
echo "Zswap is enabled and changes will reflect upon reboot."
# Enable Zram and disable zswap. Requires reboot
disable-zswap: enable-zram
sudo rpm-ostree kargs --delete-if-present=zswap.enabled=1 --delete-if-present=zswap.compressor=lz4 --delete-if-present=zswap.max_pool_percent=25
echo "Zswap is disabled and changes will reflect upon reboot."
# Disable Zram. Requires reboot
disable-zram:
#!/usr/bin/env bash
if [[ -e /etc/systemd/zram-generator.conf ]]; then
sudo mv /etc/zram-generator.conf /etc/zram-generator.conf.bak
fi
sudo touch /etc/systemd/zram-generator.conf
if [[ -e /etc/udev/rules.d/30-zram.rules ]]; then
sudo mv /etc/udev/rules.d/30-zram.rules /etc/udev/rules.d/30-zram.rules.bak
fi
sudo touch /etc/udev/rules.d/30-zram.rules
sudo systemctl daemon-reload
sudo udevadm control --reload-rules
sudo udevadm trigger
echo "Zram is disabled and changes will reflect upon reboot."
# Enable Zram. Requires reboot
enable-zram:
sudo rm /etc/systemd/zram-generator.conf
sudo rm /etc/udev/rules.d/30-zram.rules
sudo systemctl daemon-reload
sudo udevadm control --reload-rules
sudo udevadm trigger
echo "Zram is enabled and changes will reflect upon reboot."

View File

@@ -0,0 +1,96 @@
# Setup box
box:
distrobox-assemble create --file https://raw.githubusercontent.com/askpng/box/refs/heads/main/box.ini
distrobox-start boxit
# set junction as default for browsers
setup-junction:
xdg-settings set default-web-browser re.sonny.Junction.desktop
# install flameshot and grant screenshot permission
setup-flameshot:
flatpak install --noninteractive --assumeyes org.flameshot.Flameshot
flatpak permission-set screenshot screenshot org.flameshot.Flameshot yes
# Scripts to initialize, configure, integrate & reset Waydroid
setup-waydroid:
#!/usr/bin/env bash
set -e
if [ "$OPTION" == "" ]; then
echo "${bold}Waydroid utilities${normal}"
PS3="Please select an option: "
select OPTION in "Initialize Waydroid" "Configure Waydroid" "Enable fake touch" "Set as Nicole" "Install APKCombo installer and Material Files" "Logs, clean version" "Reset Waydroid (also removes waydroid-related files from user folder)"; do
if [[ -n "$OPTION" ]]; then
break
else
echo "Invalid option, please try again."
fi
done
fi
if [[ "${OPTION,,}" =~ ^init ]]; then
echo "sudo systemctl enable --now waydroid-container.service"
sudo systemctl enable --now waydroid-container.service
echo "waydroid init -s VANILLA -c 'https://ota.waydro.id/system' -v 'https://ota.waydro.id/vendor'"
sudo waydroid init -s VANILLA -c 'https://ota.waydro.id/system' -v 'https://ota.waydro.id/vendor'
echo "sudo restorecon -R /var/lib/waydroid"
sudo restorecon -R /var/lib/waydroid
echo "cp /usr/share/applications/waydroid-container-restart.desktop ~/.local/share/applications"
cp /usr/share/applications/waydroid-container-restart.desktop ~/.local/share/applications
echo "Waydroid has been initialized. Before continuing, run 'waydroid session start' and ensure it is up and running well."
elif [[ "${OPTION,,}" =~ ^configure ]]; then
echo "git clone https://github.com/askpng/waydroid_script.git --depth 1 /tmp/waydroid_script"
git clone https://github.com/askpng/waydroid_script.git --depth 1 /tmp/waydroid_script
echo "python3 -m venv /tmp/waydroid_script/venv"
python3 -m venv /tmp/waydroid_script/venv
echo "source /tmp/waydroid_script/venv/bin/activate"
source /tmp/waydroid_script/venv/bin/activate
echo "sudo /tmp/waydroid_script/venv/bin/pip install -r /tmp/waydroid_script/requirements.txt"
sudo /tmp/waydroid_script/venv/bin/pip install -r /tmp/waydroid_script/requirements.txt
echo "/tmp/waydroid_script/venv/bin/python3 /tmp/waydroid_script/main.py"
sudo /tmp/waydroid_script/venv/bin/python3 /tmp/waydroid_script/main.py
echo "deactivate"
deactivate
echo "sudo rm -rf /tmp/waydroid_script"
sudo rm -rf /tmp/waydroid_script ~/.cache/waydroid_script
elif [[ "${OPTION,,}" =~ ^enable ]]; then
echo "Setting fake touch for Aniplex apps..."
waydroid prop set persist.waydroid.fake_touch "com.aniplex.*"
elif [[ "${OPTION,,}" =~ ^set ]]; then
echo "curl -L 'https://raw.githubusercontent.com/askpng/waydroid_script/refs/heads/main/scripts/nicole.sh' -o /tmp/nicole.sh"
curl -L 'https://raw.githubusercontent.com/askpng/waydroid_script/refs/heads/main/scripts/nicole.sh' -o /tmp/nicole.sh
echo "chmod +x /tmp/nicole.sh"
chmod +x /tmp/nicole.sh
echo "sudo bash -c /tmp/nicole.sh"
sudo bash -c /tmp/nicole.sh
echo "rm -f /tmp/nicole.sh"
rm -f /tmp/nicole.sh
elif [[ "${OPTION,,}" =~ ^install ]]; then
echo "Installing APKCombo Installer"
curl -L "https://static.apkflash.com/files/com.apkcombo.app/apkcombo-installer.apk" -o /tmp/apkcombo-installer.apk
waydroid app install /tmp/apkcombo-installer.apk
echo "Installing Material Files"
curl -L "https://f-droid.org/repo/me.zhanghai.android.files_39.apk" -o /tmp/material-files.apk
waydroid app install /tmp/material-files.apk
echo "Removing .APK files"
rm /tmp/apkcombo-installer.apk /tmp/material-files.apk
echo "Success!"
elif [[ "${OPTION,,}" =~ ^logs ]]; then
echo "Grabbing clean logs..."
sudo waydroid logcat | grep -vi controller | grep -vi mantis | grep -vi gamepad | grep -v lowmemorykiller | grep -v libprocessgroup
elif [[ "${OPTION,,}" =~ ^reset ]]; then
echo "Resetting Waydroid"
echo "bash -c 'sudo rm -rf /var/lib/waydroid /home/.waydroid ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid'"
bash -c 'sudo rm -rf /var/lib/waydroid /home/.waydroid ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid'
echo "sudo systemctl disable --now waydroid-container.service"
sudo systemctl disable --now waydroid-container.service
echo "Waydroid has been reset! Re-initialize to get it back up and running."
fi

View File

@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Force Restart Waydroid
Exec=pkexec /usr/libexec/waydroid-container-restart
Categories=X-WayDroid-App;
X-Purism-FormFactor=Workstation;Mobile;
Icon=waydroid
NoDisplay=false

View File

@@ -0,0 +1,5 @@
[Desktop Entry]
Name=WayDroid on Mutter
Comment=LineageOS in a container
Exec=/usr/bin/waydroid-session
Type=Application

View File

@@ -0,0 +1,19 @@
[main]
# The default PPD profile
# use balanced profile with balance_performance EPP
# configured under /usr/lib/tuned/profiles/balanced/tuned.conf
default=balanced
# battery_detection=true
sysfs_acpi_monitor=true
[profiles]
# PPD = TuneD
# use powersave profile with balance_power EPP
# configured under /usr/lib/tuned/profiles/powersave/tuned.conf
power-saver=powersave
balanced=balanced
performance=throughput-performance
# [battery]
# PPD = TuneD
# balanced=powersave

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# User-configurable Gamescope options
GAMESCOPE_SESSION_CONFIG="$HOME/.config/default/gamescope-session-config"
if [ -f $GAMESCOPE_SESSION_CONFIG ];
then
source $GAMESCOPE_SESSION_CONFIG
fi
gamescope \
$GAMESCOPE_SESSION_OPTIONS \
-e -- steam -steamdeck -steamos3

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
if [[ "$XDG_SESSION_TYPE" == "wayland" ]]; then
# https://github.com/Supreeeme/extest
# Extest is a drop in replacement for the X11 XTEST extension.
# It creates a virtual device with the uinput kernel module.
# It's been primarily developed for allowing the desktop functionality
# on the Steam Controller to work while Steam is open on Wayland.
# Also supports Steam Input as a whole.
env LD_PRELOAD=/usr/lib/extest/libextest.so /usr/bin/steam "$@"
else
/usr/bin/steam "$@"
fi

View File

@@ -0,0 +1,8 @@
[Unit]
Description=B550 boards suspend fix
[Service]
ExecStart=/bin/sh -c "/bin/echo GPP0 > /proc/acpi/wakeup"
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,34 @@
# tuned config
[main]
summary=Balanced (balance_performance)
[modules]
cpufreq_conservative=+r
[cpu]
priority=10
governor=schedutil|conservative|powersave
energy_perf_bias=normal
energy_preference_performance=balance_performance
boost=1
[acpi]
platform_profile=balanced
[audio]
timeout=0
[sysctl]
vm.swappiness = 180
[video]
radeon_powersave=dpm-balanced, auto
panel_power_savings=0
# [disk]
# Comma separated list of devices, all devices if commented out.
# devices=sda
[scsi_host]
alpm=medium_power

View File

@@ -0,0 +1,40 @@
# tuned configuration
[main]
summary=Balanced (balance_power)
[cpu]
governor=schedutil|conservative|powersave
energy_perf_bias=powersave|power
energy_performance_preference=balance_power
boost=0
[acpi]
platform_profile=low-power|quiet
[eeepc_she]
[vm]
[audio]
timeout=0
[video]
radeon_powersave=dpm-battery, auto
panel_power_savings=3
[disk]
# Comma separated list of devices, all devices if commented out.
# devices=sda
[net]
# Comma separated list of devices, all devices if commented out.
# devices=eth0
[scsi_host]
alpm=min_power
[sysctl]
vm.laptop_mode=5
vm.dirty_writeback_centisecs=1500
kernel.nmi_watchdog=0

View File

@@ -0,0 +1,10 @@
# AMDPC setup in one go
solarpowered-ex-setup:
sudo systemctl enable --now b550-suspend-fix.service
rpm-ostree kargs \
--append-if-missing=amd_pstate=active \
--append-if-missing=$(printf 'amdgpu.ppfeaturemask=0x%x\n' "$(($(cat /sys/module/amdgpu/parameters/ppfeaturemask) | 0x4000))") \
--append-if-missing="sysrq_always_enabled=1" \
--append-if-missing="page_alloc.shuffle=1" \
--append-if-missing="hid_apple.fnmode=0"
echo 'Remember to reboot!'

View File

@@ -0,0 +1,61 @@
[GENERAL]
# Enable or disable the script execution
Enabled: True
# SYSFS path for checking if the system is running on AC power
Sysfs_Power_Path: /sys/class/power_supply/AC*/online
# Auto reload config on changes
Autoreload: True
## Settings to apply while connected to Battery power
[BATTERY]
# Update the registers every this many seconds
Update_Rate_s: 30
# Max package power for time window #1
PL1_Tdp_W: 29
# Time window #1 duration
PL1_Duration_s: 28
# Max package power for time window #2
PL2_Tdp_W: 44
# Time window #2 duration
PL2_Duration_S: 0.002
# Max allowed temperature before throttling
Trip_Temp_C: 85
# Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL)
cTDP: 0
# Disable BDPROCHOT (EXPERIMENTAL)
Disable_BDPROCHOT: False
## Settings to apply while connected to AC power
[AC]
# Update the registers every this many seconds
Update_Rate_s: 5
# Max package power for time window #1
PL1_Tdp_W: 44
# Time window #1 duration
PL1_Duration_s: 28
# Max package power for time window #2
PL2_Tdp_W: 44
# Time window #2 duration
PL2_Duration_S: 0.002
# Max allowed temperature before throttling
Trip_Temp_C: 95
# Set HWP energy performance hints to 'performance' on high load (EXPERIMENTAL)
# Uncomment only if you really want to use it
# HWP_Mode: False
# Set cTDP to normal=0, down=1 or up=2 (EXPERIMENTAL)
cTDP: 0
# Disable BDPROCHOT (EXPERIMENTAL)
Disable_BDPROCHOT: False
# All voltage values are expressed in mV and *MUST* be negative (i.e. undervolt)!
[UNDERVOLT]
# CPU core voltage offset (mV)
CORE: 0
# Integrated GPU voltage offset (mV)
GPU: 0
# CPU cache voltage offset (mV)
CACHE: 0
# System Agent voltage offset (mV)
UNCORE: 0
# Analog I/O voltage offset (mV)
ANALOGIO: 0

View File

@@ -0,0 +1,626 @@
# ------------------------------------------------------------------------------
# solarpowered defaults
# ------------------------------------------------------------------------------
TLP_ENABLE="1"
TLP_WARN_LEVEL="3"
TLP_PERSISTENT_DEFAULT="0"
DISK_IDLE_SECS_ON_AC="0"
DISK_IDLE_SECS_ON_BAT="2"
MAX_LOST_WORK_SECS_ON_AC="15"
MAX_LOST_WORK_SECS_ON_BAT="60"
CPU_ENERGY_PERF_POLICY_ON_AC="balance_performance"
CPU_ENERGY_PERF_POLICY_ON_BAT="balance_power"
NMI_WATCHDOG="0"
DISK_APM_LEVEL_ON_AC="254 254"
DISK_APM_LEVEL_ON_BAT="128 128"
DISK_IOSCHED="keep keep"
SATA_LINKPWR_ON_AC="med_power_with_dipm"
SATA_LINKPWR_ON_BAT="med_power_with_dipm"
AHCI_RUNTIME_PM_ON_AC="on"
AHCI_RUNTIME_PM_ON_BAT="auto"
AHCI_RUNTIME_PM_TIMEOUT="15"
PCIE_ASPM_ON_AC="default"
PCIE_ASPM_ON_BAT="default"
RADEON_DPM_PERF_LEVEL_ON_AC="auto"
RADEON_DPM_PERF_LEVEL_ON_BAT="auto"
RADEON_POWER_PROFILE_ON_AC="default"
RADEON_POWER_PROFILE_ON_BAT="default"
WIFI_PWR_ON_AC="off"
WIFI_PWR_ON_BAT="on"
WOL_DISABLE="Y"
SOUND_POWER_SAVE_ON_AC="1"
SOUND_POWER_SAVE_ON_BAT="1"
SOUND_POWER_SAVE_CONTROLLER="Y"
BAY_POWEROFF_ON_AC="0"
BAY_POWEROFF_ON_BAT="0"
BAY_DEVICE="sr0"
RUNTIME_PM_ON_AC="on"
RUNTIME_PM_ON_BAT="auto"
RUNTIME_PM_DRIVER_DENYLIST="mei_me nouveau radeon"
USB_AUTOSUSPEND="1"
USB_EXCLUDE_AUDIO="1"
USB_EXCLUDE_BTUSB="0"
USB_EXCLUDE_PHONE="0"
USB_EXCLUDE_PRINTER="1"
USB_EXCLUDE_WWAN="0"
RESTORE_DEVICE_STATE_ON_STARTUP="1"
RESTORE_THRESHOLDS_ON_BAT="1"
NATACPI_ENABLE="1"
TPACPI_ENABLE="1"
TPSMAPI_ENABLE="1"
CPU_MAX_PERF_ON_AC="99"
CPU_MAX_PERF_ON_BAT="89"
CPU_BOOST_ON_AC="1"
START_CHARGE_THRESH_BAT0="55"
STOP_CHARGE_THRESH_BAT0="60"
DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
# ------------------------------------------------------------------------------
# /etc/tlp.conf - TLP user configuration (version @TLPVER@)
# See full explanation: https://linrunner.de/tlp/settings
#
# Copyright (c) 2024 Thomas Koch <linrunner at gmx.net> and others.
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Settings are read in the following order:
#
# 1. Intrinsic defaults
# 2. /etc/tlp.d/*.conf - Drop-in customization snippets
# 3. /etc/tlp.conf - User configuration (this file)
#
# Notes:
# - In case of identical parameters, the last occurence has precedence
# - This also means, parameters enabled here will override anything else
# - However you may append values to a parameter already defined as intrinsic
# default or in a previously read file: use PARAMETER+="add values"
# - IMPORTANT: all parameters here are disabled; remove the leading '#' if you
# like to enable a feature without default or have a value different from the
# default
# - Default *: intrinsic default that is effective when the parameter is missing
# or disabled by a leading '#'; use PARAM="" to disable an intrinsic default
# - Default <none>: do nothing or use kernel/hardware defaults
# - IMPORTANT: parameters must always be specified pairwise i.e. for
# both AC and BAT. Omitting one of the two makes the set value effective for
# both power sources, since a change only occurs when different values are
# defined.
# ------------------------------------------------------------------------------
# tlp - Parameters for power saving
# Set to 0 to disable, 1 to enable TLP.
# Default: 1
#TLP_ENABLE=1
# Control how warnings about invalid settings are issued:
# 0=disabled,
# 1=background tasks (boot, resume, change of power source) report to syslog,
# 2=shell commands report to the terminal (stderr),
# 3=combination of 1 and 2
# Default: 3
#TLP_WARN_LEVEL=3
# Operation mode when no power supply can be detected: AC, BAT.
# Concerns some desktop and embedded hardware only.
# Default: <none>
#TLP_DEFAULT_MODE=AC
# Operation mode select: 0=depend on power source, 1=always use TLP_DEFAULT_MODE
# Note: use in conjunction with TLP_DEFAULT_MODE=BAT for BAT settings on AC.
# Default: 0
#TLP_PERSISTENT_DEFAULT=0
# Power supply classes to ignore when determining operation mode: AC, USB, BAT.
# Separate multiple classes with spaces.
# Note: try on laptops where operation mode AC/BAT is incorrectly detected.
# Default: <none>
#TLP_PS_IGNORE="BAT"
# Seconds laptop mode has to wait after the disk goes idle before doing a sync.
# Non-zero value enables, zero disables laptop mode.
# Default: 0 (AC), 2 (BAT)
#DISK_IDLE_SECS_ON_AC=0
#DISK_IDLE_SECS_ON_BAT=2
# Dirty page values (timeouts in secs).
# Default: 15 (AC), 60 (BAT)
#MAX_LOST_WORK_SECS_ON_AC=15
#MAX_LOST_WORK_SECS_ON_BAT=60
# Select a CPU scaling driver operation mode.
# Intel CPU with intel_pstate driver:
# active, passive.
# AMD Zen 2 or newer CPU with amd-pstate_driver as of kernel 6.3/6.4(*):
# active, passive, guided(*).
# Default: <none>
#CPU_DRIVER_OPMODE_ON_AC=active
#CPU_DRIVER_OPMODE_ON_BAT=active
# Select a CPU frequency scaling governor.
# Intel CPU with intel_pstate driver or
# AMD CPU with amd-pstate driver in active mode ('amd-pstate-epp'):
# performance, powersave(*).
# Intel CPU with intel_pstate driver in passive mode ('intel_cpufreq') or
# AMD CPU with amd-pstate driver in passive or guided mode ('amd-pstate') or
# Intel, AMD and other CPU brands with acpi-cpufreq driver:
# conservative, ondemand(*), userspace, powersave, performance, schedutil(*).
# Use tlp-stat -p to show the active driver and available governors.
# Important:
# Governors marked (*) above are power efficient for *almost all* workloads
# and therefore kernel and most distributions have chosen them as defaults.
# You should have done your research about advantages/disadvantages *before*
# changing the governor.
# Default: <none>
#CPU_SCALING_GOVERNOR_ON_AC=powersave
#CPU_SCALING_GOVERNOR_ON_BAT=powersave
# Set the min/max frequency available for the scaling governor.
# Possible values depend on your CPU. For available frequencies see
# the output of tlp-stat -p.
# Notes:
# - Min/max frequencies must always be specified for both AC *and* BAT
# - Not recommended for use with the intel_pstate driver, use
# CPU_MIN/MAX_PERF_ON_AC/BAT below instead
# Default: <none>
#CPU_SCALING_MIN_FREQ_ON_AC=0
#CPU_SCALING_MAX_FREQ_ON_AC=0
#CPU_SCALING_MIN_FREQ_ON_BAT=0
#CPU_SCALING_MAX_FREQ_ON_BAT=0
# Set CPU energy/performance policies EPP and EPB:
# performance, balance_performance, default, balance_power, power.
# Values are given in order of increasing power saving.
# Requires:
# * Intel CPU
# EPP: Intel Core i 6th gen. or newer CPU with intel_pstate driver
# EPB: Intel Core i 2nd gen. or newer CPU with intel_pstate driver
# as of kernel 5.2; alternatively module msr and
# x86_energy_perf_policy from linux-tools
# EPP and EPB are mutually exclusive: when EPP is available, Intel CPUs
# will not honor EPB. Only the matching feature will be applied by TLP.
# * AMD Zen 2 or newer CPU
# EPP: amd-pstate driver in active mode ('amd-pstate-epp') as of kernel 6.3
# Default: balance_performance (AC), balance_power (BAT)
#CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
#CPU_ENERGY_PERF_POLICY_ON_BAT=balance_power
# Set Intel CPU P-state performance: 0..100 (%).
# Limit the max/min P-state to control the power dissipation of the CPU.
# Values are stated as a percentage of the available performance.
# Requires Intel Core i 2nd gen. or newer CPU with intel_pstate driver.
# Default: <none>
#CPU_MIN_PERF_ON_AC=0
#CPU_MAX_PERF_ON_AC=100
#CPU_MIN_PERF_ON_BAT=0
#CPU_MAX_PERF_ON_BAT=30
# Set the CPU "turbo boost" (Intel) or "turbo core" (AMD) feature:
# 0=disable, 1=allow.
# Allows to raise the maximum frequency/P-state of some cores if the
# CPU chip is not fully utilized and below it's intended thermal budget.
# Note: a value of 1 does *not* activate boosting, it just allows it.
# Default: <none>
#CPU_BOOST_ON_AC=1
#CPU_BOOST_ON_BAT=0
# Set Intel/AMD CPU dynamic boost feature:
# 0=disable, 1=enable.
# Improve performance by increasing minimum P-state limit dynamically
# whenever a task previously waiting on I/O is selected to run.
# Requires:
# * Intel Core i 6th gen. or newer CPU: intel_pstate driver in active mode
# * AMD Zen 2 or newer CPU: amd-pstate driver in active mode ('amd-pstate-epp')
# provided by a yet unreleased kernel 6.x
# Default: <none>
#CPU_HWP_DYN_BOOST_ON_AC=1
#CPU_HWP_DYN_BOOST_ON_BAT=0
# Kernel NMI Watchdog:
# 0=disable (default, saves power), 1=enable (for kernel debugging only).
# Default: 0
#NMI_WATCHDOG=0
# Select platform profile:
# performance, balanced, low-power.
# Controls system operating characteristics around power/performance levels,
# thermal and fan speed. Values are given in order of increasing power saving.
# Note: check the output of tlp-stat -p to determine availability on your
# hardware and additional profiles such as: balanced-performance, quiet, cool.
# Default: <none>
#PLATFORM_PROFILE_ON_AC=performance
#PLATFORM_PROFILE_ON_BAT=low-power
# System suspend mode:
# s2idle: Idle standby - a pure software, light-weight, system sleep state,
# deep: Suspend to RAM - the whole system is put into a low-power state,
# except for memory, usually resulting in higher savings than s2idle.
# CAUTION: changing suspend mode may lead to system instability and even
# data loss. As for the availability of different modes on your system,
# check the output of tlp-stat -s. If unsure, stick with the system default
# by not enabling this.
# Default: <none>
#MEM_SLEEP_ON_AC=s2idle
#MEM_SLEEP_ON_BAT=deep
# Define disk devices on which the following DISK/AHCI_RUNTIME parameters act.
# Separate multiple devices with spaces.
# Devices can be specified by disk ID also (lookup with: tlp diskid).
# Default: "nvme0n1 sda"
#DISK_DEVICES="nvme0n1 sda"
# Disk advanced power management level: 1..254, 255 (max saving, min, off).
# Levels 1..127 may spin down the disk; 255 allowable on most drives.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the hardware default for the particular disk.
# Default: 254 (AC), 128 (BAT)
#DISK_APM_LEVEL_ON_AC="254 254"
#DISK_APM_LEVEL_ON_BAT="128 128"
# Exclude disk classes from advanced power management (APM):
# sata, ata, usb, ieee1394.
# Separate multiple classes with spaces.
# CAUTION: USB and IEEE1394 disks may fail to mount or data may get corrupted
# with APM enabled. Be careful and make sure you have backups of all affected
# media before removing 'usb' or 'ieee1394' from the denylist!
# Default: "usb ieee1394"
#DISK_APM_CLASS_DENYLIST="usb ieee1394"
# Hard disk spin down timeout:
# 0: spin down disabled
# 1..240: timeouts from 5s to 20min (in units of 5s)
# 241..251: timeouts from 30min to 5.5 hours (in units of 30min)
# See 'man hdparm' for details.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the hardware default for the particular disk.
# Default: <none>
#DISK_SPINDOWN_TIMEOUT_ON_AC="0 0"
#DISK_SPINDOWN_TIMEOUT_ON_BAT="0 0"
# Select I/O scheduler for the disk devices.
# Multi queue (blk-mq) schedulers:
# mq-deadline(*), none, kyber, bfq
# Single queue schedulers:
# deadline(*), cfq, bfq, noop
# (*) recommended.
# Separate values for multiple disks with spaces. Use the special value 'keep'
# to keep the kernel default scheduler for the particular disk.
# Notes:
# - Multi queue (blk-mq) may need kernel boot option 'scsi_mod.use_blk_mq=1'
# and 'modprobe mq-deadline-iosched|kyber|bfq' on kernels < 5.0
# - Single queue schedulers are legacy now and were removed together with
# the old block layer in kernel 5.0
# Default: keep
#DISK_IOSCHED="mq-deadline mq-deadline"
# AHCI link power management (ALPM) for SATA disks:
# min_power, med_power_with_dipm(*), medium_power, max_performance.
# (*) recommended.
# Multiple values separated with spaces are tried sequentially until success.
# Default: med_power_with_dipm (AC & BAT)
#SATA_LINKPWR_ON_AC="med_power_with_dipm"
#SATA_LINKPWR_ON_BAT="med_power_with_dipm"
# Exclude SATA links from AHCI link power management (ALPM).
# SATA links are specified by their host. Refer to the output of
# tlp-stat -d to determine the host; the format is "hostX".
# Separate multiple hosts with spaces.
# Default: <none>
#SATA_LINKPWR_DENYLIST="host1"
# Runtime Power Management for NVMe, SATA, ATA and USB disks
# as well as SATA ports:
# on=disable, auto=enable.
# Note: SATA controllers are PCIe bus devices and handled by RUNTIME_PM further
# down.
# Default: on (AC), auto (BAT)
#AHCI_RUNTIME_PM_ON_AC=on
#AHCI_RUNTIME_PM_ON_BAT=auto
# Seconds of inactivity before disk is suspended.
# Note: effective only when AHCI_RUNTIME_PM_ON_AC/BAT is activated.
# Default: 15
#AHCI_RUNTIME_PM_TIMEOUT=15
# Power off optical drive in UltraBay/MediaBay: 0=disable, 1=enable.
# Drive can be powered on again by releasing (and reinserting) the eject lever
# or by pressing the disc eject button on newer models.
# Note: an UltraBay/MediaBay hard disk is never powered off.
# Default: 0
#BAY_POWEROFF_ON_AC=0
#BAY_POWEROFF_ON_BAT=0
# Optical drive device to power off
# Default: sr0
#BAY_DEVICE="sr0"
# Set the min/max/turbo frequency for the Intel GPU.
# Possible values depend on your hardware. For available frequencies see
# the output of tlp-stat -g.
# Default: <none>
#INTEL_GPU_MIN_FREQ_ON_AC=0
#INTEL_GPU_MIN_FREQ_ON_BAT=0
#INTEL_GPU_MAX_FREQ_ON_AC=0
#INTEL_GPU_MAX_FREQ_ON_BAT=0
#INTEL_GPU_BOOST_FREQ_ON_AC=0
#INTEL_GPU_BOOST_FREQ_ON_BAT=0
# AMD GPU power management.
# Performance level (DPM): auto, low, high; auto is recommended.
# Note: requires amdgpu or radeon driver.
# Default: auto
#RADEON_DPM_PERF_LEVEL_ON_AC=auto
#RADEON_DPM_PERF_LEVEL_ON_BAT=auto
# Dynamic power management method (DPM): balanced, battery, performance.
# Note: radeon driver only.
# Default: <none>
#RADEON_DPM_STATE_ON_AC=performance
#RADEON_DPM_STATE_ON_BAT=battery
# Graphics clock speed (profile method): low, mid, high, auto, default;
# auto = mid on BAT, high on AC.
# Note: radeon driver on legacy ATI hardware only (where DPM is not available).
# Default: default
#RADEON_POWER_PROFILE_ON_AC=default
#RADEON_POWER_PROFILE_ON_BAT=default
# Wi-Fi power saving mode: on=enable, off=disable.
# Default: off (AC), on (BAT)
#WIFI_PWR_ON_AC=off
#WIFI_PWR_ON_BAT=on
# Disable Wake-on-LAN: Y/N.
# Default: Y
#WOL_DISABLE=Y
# Enable audio power saving for Intel HDA, AC97 devices (timeout in secs).
# A value of 0 disables, >= 1 enables power saving.
# Note: 1 is recommended for Linux desktop environments with PulseAudio,
# systems without PulseAudio may require 10.
# Default: 1
#SOUND_POWER_SAVE_ON_AC=1
#SOUND_POWER_SAVE_ON_BAT=1
# Disable controller too (HDA only): Y/N.
# Note: effective only when SOUND_POWER_SAVE_ON_AC/BAT is activated.
# Default: Y
#SOUND_POWER_SAVE_CONTROLLER=Y
# PCIe Active State Power Management (ASPM):
# default(*), performance, powersave, powersupersave.
# (*) keeps BIOS ASPM defaults (recommended)
# Default: <none>
#PCIE_ASPM_ON_AC=default
#PCIE_ASPM_ON_BAT=default
# Runtime Power Management for PCIe bus devices: on=disable, auto=enable.
# Default: on (AC), auto (BAT)
#RUNTIME_PM_ON_AC=on
#RUNTIME_PM_ON_BAT=auto
# Exclude listed PCIe device adresses from Runtime PM.
# Note: this preserves the kernel driver default, to force a certain state
# use RUNTIME_PM_ENABLE/DISABLE instead.
# Separate multiple addresses with spaces.
# Use lspci to get the adresses (1st column).
# Default: <none>
#RUNTIME_PM_DENYLIST="11:22.3 44:55.6"
# Exclude PCIe devices assigned to the listed drivers from Runtime PM.
# Note: this preserves the kernel driver default, to force a certain state
# use RUNTIME_PM_ENABLE/DISABLE instead.
# Separate multiple drivers with spaces.
# Default: "mei_me nouveau radeon xhci_hcd", use "" to disable completely.
#RUNTIME_PM_DRIVER_DENYLIST="mei_me nouveau radeon xhci_hcd"
# Permanently enable/disable Runtime PM for listed PCIe device addresses
# (independent of the power source). This has priority over all preceding
# Runtime PM settings. Separate multiple addresses with spaces.
# Use lspci to get the adresses (1st column).
# Default: <none>
#RUNTIME_PM_ENABLE="11:22.3"
#RUNTIME_PM_DISABLE="44:55.6"
# Set to 0 to disable, 1 to enable USB autosuspend feature.
# Default: 1
#USB_AUTOSUSPEND=1
# Exclude listed devices from USB autosuspend (separate with spaces).
# Use lsusb to get the ids.
# Note: input devices (usbhid) and libsane-supported scanners are excluded
# automatically.
# Default: <none>
#USB_DENYLIST="1111:2222 3333:4444"
# Exclude audio devices from USB autosuspend:
# 0=do not exclude, 1=exclude.
# Default: 1
#USB_EXCLUDE_AUDIO=1
# Exclude bluetooth devices from USB autosuspend:
# 0=do not exclude, 1=exclude.
# Default: 0
#USB_EXCLUDE_BTUSB=0
# Exclude phone devices from USB autosuspend:
# 0=do not exclude, 1=exclude (enable charging).
# Default: 0
#USB_EXCLUDE_PHONE=0
# Exclude printers from USB autosuspend:
# 0=do not exclude, 1=exclude.
# Default: 1
#USB_EXCLUDE_PRINTER=1
# Exclude WWAN devices from USB autosuspend:
# 0=do not exclude, 1=exclude.
# Default: 0
#USB_EXCLUDE_WWAN=0
# Allow USB autosuspend for listed devices even if already denylisted or
# excluded above (separate with spaces). Use lsusb to get the ids.
# Default: 0
#USB_ALLOWLIST="1111:2222 3333:4444"
# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown
# on system startup: 0=disable, 1=enable.
# Note: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below
# are ignored when this is enabled.
# Default: 0
#RESTORE_DEVICE_STATE_ON_STARTUP=0
# Radio devices to disable on startup: bluetooth, nfc, wifi, wwan.
# Separate multiple devices with spaces.
# Default: <none>
#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth nfc wifi wwan"
# Radio devices to enable on startup: bluetooth, nfc, wifi, wwan.
# Separate multiple devices with spaces.
# Default: <none>
#DEVICES_TO_ENABLE_ON_STARTUP="wifi"
# Radio devices to enable on AC: bluetooth, nfc, wifi, wwan.
# Default: <none>
#DEVICES_TO_ENABLE_ON_AC="bluetooth nfc wifi wwan"
# Radio devices to disable on battery: bluetooth, nfc, wifi, wwan.
# Default: <none>
#DEVICES_TO_DISABLE_ON_BAT="bluetooth nfc wifi wwan"
# Radio devices to disable on battery when not in use (not connected):
# bluetooth, nfc, wifi, wwan.
# Default: <none>
#DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE="bluetooth nfc wifi wwan"
# Battery Care -- Charge thresholds
# Charging starts when the charger is connected and the charge level
# is below the start threshold. Charging stops when the charge level
# is above the stop threshold.
# Required hardware: Lenovo ThinkPads and select other laptop brands
# are driven via specific plugins
# - Active plugin and support status are shown by tlp-stat -b
# - Vendor specific threshold levels are shown by tlp-stat -b, some
# laptops support only 1 (on)/ 0 (off) instead of a percentage level
# - When your hardware supports a start *and* a stop threshold, you must
# specify both, otherwise TLP will refuse to apply the single threshold
# - When your hardware supports only a stop threshold, set the start
# value to 0
# - Older ThinkPads may require an external kernel module, refer to the
# output of tlp-stat -b
# For further explanation and vendor specific details refer to
# - https://linrunner.de/tlp/settings/battery.html
# - https://linrunner.de/tlp/settings/bc-vendors.html
# BAT0: Primary / Main / Internal battery
# Note: also use for batteries BATC, BATT and CMB0
# Default: <none>
# Battery charge level below which charging will begin.
#START_CHARGE_THRESH_BAT0=75
# Battery charge level above which charging will stop.
#STOP_CHARGE_THRESH_BAT0=80
# BAT1: Secondary / Ultrabay / Slice / Replaceable battery
# Note: primary on some laptops
# Default: <none>
# Battery charge level below which charging will begin.
#START_CHARGE_THRESH_BAT1=75
# Battery charge level above which charging will stop.
#STOP_CHARGE_THRESH_BAT1=80
# Restore charge thresholds when AC is unplugged: 0=disable, 1=enable.
# Default: 0
#RESTORE_THRESHOLDS_ON_BAT=1
# Control battery care drivers: 0=disable, 1=enable.
# Default: 1 (all)
#NATACPI_ENABLE=1
#TPACPI_ENABLE=1
#TPSMAPI_ENABLE=1
# ------------------------------------------------------------------------------
# tlp-rdw - Parameters for the radio device wizard
# Possible devices: bluetooth, wifi, wwan.
# Separate multiple radio devices with spaces.
# Default: <none> (for all parameters below)
# Radio devices to disable on connect.
#DEVICES_TO_DISABLE_ON_LAN_CONNECT="wifi wwan"
#DEVICES_TO_DISABLE_ON_WIFI_CONNECT="wwan"
#DEVICES_TO_DISABLE_ON_WWAN_CONNECT="wifi"
# Radio devices to enable on disconnect.
#DEVICES_TO_ENABLE_ON_LAN_DISCONNECT="wifi wwan"
#DEVICES_TO_ENABLE_ON_WIFI_DISCONNECT=""
#DEVICES_TO_ENABLE_ON_WWAN_DISCONNECT=""
# Radio devices to enable/disable when docked.
#DEVICES_TO_ENABLE_ON_DOCK=""
#DEVICES_TO_DISABLE_ON_DOCK=""
# Radio devices to enable/disable when undocked.
#DEVICES_TO_ENABLE_ON_UNDOCK="wifi"
#DEVICES_TO_DISABLE_ON_UNDOCK=""

View File

@@ -0,0 +1,4 @@
max_temp 85
med_temp 75
low_temp 60
temp_hysteresis 10

View File

@@ -0,0 +1,2 @@
# Stem Darkening
FREETYPE_PROPERTIES="cff:no-stem-darkening=0 autofitter:no-stem-darkening=0"

View File

@@ -0,0 +1 @@
GSK_RENDERER=vulkan

View File

@@ -0,0 +1,4 @@
# Use non-free iHD drivers
LIBVA_DRIVERS_PATH=/usr/lib64/dri-nonfree
LIBVA_DRIVER_NAME=iHD

View File

@@ -0,0 +1,21 @@
[Unit]
Description=Zero-configuration fan control for ThinkPad
Conflicts=thinkfan.service
#
[Service]
ExecStart=/bin/zcfan
Restart=always
RestartSec=500ms
#
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
ProtectControlGroups=yes
RestrictAddressFamilies=
RestrictRealtime=yes
# We don't need to do any substantial clean up, so if something hangs it's
# going to stay that way. Just forcefully kill and get it over with.
TimeoutStopSec=2
[Install]
WantedBy=default.target

View File

@@ -0,0 +1,18 @@
# T480s setup in one go
solarpowered-setup:
flatpak install --system flathub --noninteractive --assumeyes com.github.d4nj1.tlpui
rpm-ostree kargs \
--append-if-missing="thinkpad_acpi.fan_control=1" \
--append-if-missing="i915.enable_guc=2" \
--append-if-missing="i915.enable_fbc=1" \
--append-if-missing="sysrq_always_enabled=1" \
--append-if-missing="page_alloc.shuffle=1" \
--append-if-missing="hid_apple.fnmode=0"
sudo systemctl enable zcfan.service
sudo systemctl start python3-validity.service
sudo systemctl start open-fprintd.service
sudo systemctl enable open-fprintd-resume.service open-fprintd-suspend.service open-fprintd.service python3-validity.service
sudo authselect enable-feature with-fingerprint
sudo authselect apply-changes
sudo authselect current
echo 'Remember to reboot!'