Há quatro anos atrás, quando comecei a usar o linux integralmente, passei a me interessar muito pelo sistema principalmente pelos comandos bash. Então comecei a fazer meus primeiros shell scripts e fiquei muito empolgado com o resultado, realmente me sentia entrando em um novo “universo”.
Depois de tirar proveito dos shell scripts e ver que inúmeras coisas poderiam ser feitas através deles, senti a necessidade de aprender uma nova linguagem e escolhi o python. Então comecei a integrar meus códigos bash dentro dos scripts python e, naquele momento, percebi que eu tinha a possibilidade de desenvolver aplicativos mais complexos, por onde minha criatividade me levasse.
Consequentemente, os códigos que comecei a escrever estavam muito relacionados a manipulação do Linux o que ajudou muito na curva de aprendizado.
Nos últimos dias desenvolvi um programa que exemplifica o que estou querendo dizer (que é aprender linux enquanto programa). O programa (hypr-conf.py) tem a função de personalizar a aparência de todos os elementos do sistema que está com o gerenciador de janelas Hyprland:
Usando o sed e o awk para alterar elementos da waybar
No programa python (hypr-conf.py) existe uma função que captura a cor hexadecimal que o usuário escolhe para ser a cor de destaque do sistema, grava em um arquivo o valor hexadecimal, e chama um segundo script python que importa a cor do arquivo e com o valor hexadecimal gera mais uma cor mais escura para gerar o gradiente dos elementos da waybar. Agora com as duas cores hexadecimais ele executa um shell script com as cores como argumentos e o shell script usa as cores para fazer as alterações:
#!/bin/bash
COR1="$1"
COR2="$2"
CSS_PATH="$HOME/.config/waybar/hypr.css"
# Altera o gradiente apenas para o seletor '#workspaces button.visible'
awk -v c1="$COR1" -v c2="$COR2" '
BEGIN { inside_block = 0 }
/#workspaces button\.visible {/ { inside_block = 1 }
inside_block && /background: *linear-gradient/ {
sub(/linear-gradient\(to right, [^)]*\)/, "linear-gradient(to right, " c1 ", " c2 ")")
}
{ print }
/}/ { inside_block = 0 }
' "$CSS_PATH" > "$CSS_PATH.tmp" && mv "$CSS_PATH.tmp" "$CSS_PATH"
# Altera o background do elemento #custom-power:hover
sed -i "/#custom-config:hover {/!b;n;s/background: linear-gradient(to right, .*, .*)/background: linear-gradient(to right, $COR1, $COR2)/" "$CSS_PATH"
# Altera a cor do texto do elemento #workspaces button
sed -i "/#workspaces button {/!b;n;s/color: .*/color: $COR1;/" "$CSS_PATH"
# Ajuste para garantir que o seletor '#custom-launcher' seja modificado corretamente
sed -i "/#custom-launcher *{/!b;n;s/background: *.*;/background:linear-gradient(to right, $COR1, $COR2);/" "$CSS_PATH"
# Altera o estilo hover do #custom-launcher
sed -i "/#custom-launcher:hover {/!b;n;s/background: *.*;/background:linear-gradient(to right, $COR1, $COR1);/" "$CSS_PATH"
# Altera outros elementos com gradiente
sed -i "/#custom-blackboard:hover {/!b;n;s/background: linear-gradient(to right, .*, .*)/background: linear-gradient(to right, $COR1, $COR2)/" "$CSS_PATH"
sed -i "/#custom-colorpicker:hover {/!b;n;s/background: linear-gradient(to right, .*, .*)/background: linear-gradient(to right, $COR1, $COR2)/" "$CSS_PATH"
sed -i "/#custom-wallpaper:hover {/!b;n;s/background: linear-gradient(to right, .*, .*)/background: linear-gradient(to right, $COR1, $COR2)/" "$CSS_PATH"
sed -i "/#custom-upgrade:hover {/!b;n;s/background: linear-gradient(to right, .*, .*)/background: linear-gradient(to right, $COR1, $COR2)/" "$CSS_PATH"
Usando o echo para aplicar as alterações no Hyprland.
O Hyprland suporta múltiplos arquivos de configurção o que facilita a configurção de diversos elementos do sistema. Por exemplo existe um arquivo.conf que armazena o valor da espessura da borda. Então, caso eu queria mudar a espessura da borda, só preciso alterar o conteúdo do arquivo. Como o arquivo só armazena apenas uma variável a função do programa hypr-conf.py fica assim:
def apply_size_border_f(self):
#Captura o valor definido no slider (border_size_slider)
size = self.sizeborder_slider.value()
#Altera o arquivo de configuração do Hyprland
os.system(f'echo "\$bs={size}" > /home/sob/.config/hypr/conf.d/border_size.conf')
#Registra no log o novo valor da borda para que o programa ao iniciar possa colocar o valor real da borda.
self.save_current_config()
Usando links simbólicos para mudar tema de programas QT/Python.
Gosto de usar o módulo python PyQt5 para criar interfaces gráficas dos programas no qt designer. No qt designer você cria a interface gráfica e o salva em um arquivo.ui. No script python (hypr-conf.py) eu importo o arquivo.ui e a interface está pronta. Então o que eu criei 5 esquemas de cores (Adwaita-dark, Adwaita-Light, Everforest, Catppuccin e Dracula) e quando quero mudar o tema de um aplicativo python/qt uso um shell-script.sh nome-do-tema
que é acionado pelo programa (hypr-conf.py). O shell script remove o link simbólico do arquivo.ui e cria um novo link simbólico baseado na variável $THEME:
#/bin/bash
THEME=$1
#Alterar a cor do /home/sob/.scripts/hypr-configs/hypr-conf.py
rm $HOME/.scripts/hypr-configs/hypr-qtconfig.ui;
ln -s $HOME/.scripts/hypr-configs/themes/$THEME.ui $HOME/.scripts/hypr-configs/hypr-qtconfig.ui
#Alterar a cor do ~/.scripts/system-menu/power.py
rm $HOME/.scripts/system-menu/power.ui;
ln -s $HOME/.scripts/system-menu/sthemes/$THEME.ui $HOME/.scripts/system-menu/power.ui
#Alterar a cor do Quadro Negro
rm $HOME/Projetos/Aplicativos/BlackBoard/black-board.ui
ln -s $HOME/Projetos/Aplicativos/BlackBoard/themes/$THEME.ui $HOME/Projetos/Aplicativos/BlackBoard/black-board.ui
Mais um exemplo do echo: Temas aplicativos tkinter
Para os programas python que usam tkinter criei uma função para todos os aplicativos importem as cores do background e foreground sempre do mesmos arquivos. Dessa forma, quando esses arquivos são alterados todos os programas que usam tkinter tem seus temas de cores atualizados.
Função Python para ler o valor hexadecimal das cores no arquivos:
def read_color_file(file_path):
try:
with open(file_path, 'r') as file:
color = file.readline().strip()
return color
except FileNotFoundError:
print(f"Erro: Arquivo {file_path} não encontrado.")
Depois de criada a função read_color_file(file_path), é só criar as variáveis para o background e foreground no script Python:
bkg_file = '/home/sob/Projetos/Aplicativos/background.txt'
frg_file = '/home/sob/Projetos/Aplicativos/foreground.txt'
bkg = read_color_file(bkg_file)
frg = read_color_file(frg_file)
Como cada aplicativo tkinter ao iniciar vai ler os dois arquivos das cores, agora uma simples função em Python usando echo
aplicará as alterações em todos os aplicativos que tiverem a função read_color_file(file_path).
def set_everforest(self):
# Altera o valor da cor hexadecimal do background
os.system('echo "#1e2623" > /home/sob/Projetos/Aplicativos/background.txt')
# Altera o valor da cor hexadecimal do foreground
os.system('echo "#FFF" > /home/sob/Projetos/Aplicativos/foreground.txt')
Mudando o Wallpaper com echo
Na algorítimo dos wallpapers funcionam da seguinte forma:
O botão Recarregar Imagens do programa hypr-conf.py executa uma função de redimensionar todas as imagens dos wallpapers em uma pasta de thumbnails. Isso serve para otimização do programa, para abrir rápido. Se toda vez que ele iniciasse tivesse que redimensionar todas as imagens do diretório de wallpapers o programa ia demorar sempre alguns segundos para abrir.
Então todas as thumbnails são relacionadas as imagens originais, para que o caminho da imagem original se torne o argumento ($1) que servirá para definir o novo wallpaper alterando o arquivo do hyprpaper:
#!/usr/bin/env bash
NEW_WP=$1
# Limpar o arquivo de configuração do hyprpaper
echo '' > $HOME/.config/hypr/hyprpaper.conf
# Mudar o conteúdo: hyprpaper.conf
echo "preload = $NEW_WP" >> $HOME/.config/hypr/hyprpaper.conf
echo "wallpaper = eDP-1,$NEW_WP" >> $HOME/.config/hypr/hyprpaper.conf
echo "splash = false" >> $HOME/.config/hypr/hyprpaper.conf
killall hyprpaper
hyprpaper & disown
O motivo de criar esse programa (hypr-conf.py)
Antes quando queria fazer uma customização “radical” no Hyprland tinha que alterar diversas linhas de diversos arquivos de configuração como:
- ~/.config/hypr/hyprland.conf
- ~/.config/hypr/hyprpaper.conf
- ~/waybar/style.css
- ~/.local/share/rofi/themes/tema.rasi
- ~/.config/alacritty/alacritty.toml
- ~/.config/dunst/dunstrc
- ~/.config/cava/config
- Todos os aplicativos que fiz em tkinter
- Todos os aplicativos que fiz em QT
Agora, com poucos cliques consigo mudar dessa aparência…
Para everforest…
Ou para catppuccin talvez…
OBS: Percebi que ainda faltou colocar a configuração das sombras das janelas. Se você também personaliza o hyprland e acha que há mais algo a acrescentar, por favor me diga.
Minha jornada com o Linux abriu portas para um universo de conhecimento. Ainda tenho muito a aprender, e isso é o que torna tudo tão empolgante. A cada nova descoberta, seja ao explorar uma tecnologia ou desenvolver um programa, sentir a “mágica” de um algoritmo funcionando é sempre uma experiência recompensadora — a dopamina é garantida, .
Foi assim que aprendi e continuo aprendendo sobre esse sistema incrível que é o Linux. Sei que nem todos vão se interessar por programação, mas compartilho minha experiência aqui, e digo que é uma ótima forma de aprendizado, mesmo que seja apenas um hobby, como é para mim.