1802 lines
45 KiB
Bash
1802 lines
45 KiB
Bash
#!/bin/bash
|
|
#DEV TEST
|
|
# nano /tmp/install.sh && chmod +x /tmp/install.sh && . /tmp/install.sh
|
|
|
|
# Set Echo colors
|
|
# for c in {0..255}; do tput setaf $c; tput setaf $c | cat -v; echo =$c; done
|
|
NC="\033[0m"
|
|
RED="\033[0;31m"
|
|
RED2="\033[38;5;196m"
|
|
GREEN="\033[0;32m"
|
|
YELLOW="\033[0;33m"
|
|
BLUE="\033[0;94m"
|
|
|
|
FULLUSERNAME=$(awk -v user="$USER" -F":" 'user==$1{print $5}' /etc/passwd | rev | cut -c 4- | rev)
|
|
|
|
clear
|
|
|
|
if [ -f /etc/debian_version ]; then
|
|
echo "The system is running on Debian Linux, everything is fine..."
|
|
else
|
|
echo "This installation should only be run on a Debian Linux System."
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# Function to echo, handle errors - Stop the entire installation if an error occurs during the installation
|
|
error_handler() {
|
|
echo -e "${RED} An error occurred during installation and has been stopped. ${NC}"
|
|
exit 1
|
|
}
|
|
|
|
# Set the error handler to be called on any error
|
|
trap error_handler ERR
|
|
|
|
# Exit immediately if a command exits with a non-zero status
|
|
set -e
|
|
|
|
# ------------------- > > >
|
|
|
|
clear
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} "
|
|
echo -e "${RED} Starting the installation..."
|
|
echo -e "${RED} Enter your user password, to continue if necessary"
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} ${NC}"
|
|
|
|
if [ -f /etc/apt/sources.list ]; then
|
|
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date +'%d-%m-%Y_%H%M%S')
|
|
else
|
|
echo "No Debian repositories sources.list"
|
|
sudo cp /usr/share/doc/apt/examples/sources.list /etc/apt/sources.list
|
|
sudo sed -i '/^deb cdrom:/s/^/#/' /etc/apt/sources.list
|
|
fi
|
|
|
|
|
|
# APT Add "contrib non-free" to the sources list
|
|
if [ -f /etc/apt/sources.list.d/debian.sources ]; then
|
|
if ! grep -q "Components:.* contrib non-free non-free-firmware" /etc/apt/sources.list.d/debian.sources; then
|
|
sudo sed -i 's/^Components:* main/& contrib non-free non-free-firmware/g' /etc/apt/sources.list.d/debian.sources
|
|
else
|
|
echo "contrib non-free non-free-firmware is already present in /etc/apt/sources.list.d/debian.sources"
|
|
fi
|
|
else
|
|
if ! grep -q "deb .* contrib non-free" /etc/apt/sources.list; then
|
|
sudo sed -i 's/^deb.* main/& contrib non-free/g' /etc/apt/sources.list
|
|
else
|
|
echo "contrib non-free is already present in /etc/apt/sources.list"
|
|
fi
|
|
fi
|
|
|
|
|
|
if ! dpkg -s apt-transport-https >/dev/null 2>&1; then
|
|
sudo apt -y install apt-transport-https
|
|
sudo sed -i 's+http:+https:+g' /etc/apt/sources.list
|
|
else
|
|
echo "apt-transport-https is already installed."
|
|
fi
|
|
|
|
clear
|
|
|
|
sudo sed -i 's/bookworm main/sid main/g' /etc/apt/sources.list
|
|
|
|
sudo sed -i 's/bookworm-security/testing-security/g' /etc/apt/sources.list
|
|
|
|
sudo sed -i 's/bookworm-updates/testing-updates/g' /etc/apt/sources.list
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
|
|
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
|
|
|
|
sudo apt -y install sddm --no-install-recommends
|
|
|
|
sudo apt install -y git wget curl fastfetch kitty wayland-protocols wayland-utils waybar wlogout hyprland hyprland-protocols xdg-desktop-portal-wlr xdg-desktop-portal-hyprland libinput-bin libinput-dev swaybg swayidle xwayland
|
|
|
|
sudo apt install -y dbus acpi nwg-look xdg-utils xdp-tools qt6-wayland xsensors flameshot speedcrunch mc gparted mpd mpc ncmpcpp fzf ccrypt xarchiver notepadqq htop
|
|
|
|
sudo apt install -y thunar gvfs-backends xarchiver rofi dunst libnotify-bin notify-osd brightnessctl usbutils
|
|
|
|
# May be deleted in the future
|
|
# wlr-randr --dryrun
|
|
sudo apt install -y wlr-randr
|
|
|
|
# Network
|
|
sudo apt install -y network-manager
|
|
|
|
# Printer
|
|
sudo apt install -y printer-driver-all cups cups-client cups-filters cups-pdf system-config-printer
|
|
|
|
#sudo apt install -y linux-headers-$(uname -r)
|
|
|
|
sudo apt install -y mate-polkit --no-install-recommends
|
|
#sudo apt install -y polkit-kde-agent-1 --no-install-recommends
|
|
|
|
# Audio
|
|
sudo apt install -y pipewire wireplumber pavucontrol pipewire-alsa pipewire-pulse pipewire-jack
|
|
|
|
# PipeWire Sound Server "Audio" - https://pipewire.org/
|
|
systemctl enable --user --now pipewire.socket pipewire-pulse.socket wireplumber.service
|
|
|
|
# Bluetooth
|
|
sudo apt install -y bluetooth bluez-firmware blueman bluez bluez-tools bluez-cups bluez-obexd bluez-meshd pulseaudio-module-bluetooth libspa-0.2-bluetooth libspa-0.2-jack
|
|
|
|
|
|
echo -e "${GREEN} CPU Microcode install ${NC}"
|
|
export LC_ALL=C # All subsequent command output will be in English
|
|
CPUVENDOR=$(lscpu | grep "Vendor ID:" | awk '{print $3}')
|
|
|
|
if [ "$CPUVENDOR" == "GenuineIntel" ]; then
|
|
if ! dpkg -s intel-microcode >/dev/null 2>&1; then
|
|
sudo apt install -y intel-microcode
|
|
fi
|
|
else
|
|
echo -e "${GREEN} Intel Microcode OK ${NC}"
|
|
fi
|
|
|
|
if [ "$CPUVENDOR" == "AuthenticAMD" ]; then
|
|
if ! dpkg -s amd64-microcode >/dev/null 2>&1; then
|
|
sudo apt -y install amd64-microcode
|
|
fi
|
|
else
|
|
echo -e "${GREEN} Amd64 Microcode OK ${NC}"
|
|
fi
|
|
unset LC_ALL # unset the LC_ALL=C
|
|
|
|
|
|
# Install GPU drivers
|
|
install_gpu_driver() {
|
|
gpu_driver=""
|
|
case "$(lspci | grep -E 'VGA|3D')" in
|
|
*Intel*) gpu_driver="intel-media-va-driver intel-media-va-driver-non-free" ;;
|
|
*AMD*) gpu_driver="mesa-va-drivers libvdpau-va-gl1" ;;
|
|
*NVIDIA*)gpu_driver="mesa-va-drivers nvidia-driver libvdpau-va-gl1 nvidia-vdpau-driver libnvcuvid1 libnvidia-encode1" ;;
|
|
esac
|
|
for pkg in $gpu_driver; do
|
|
[ -n "$pkg" ] && sudo apt install --no-install-recommends -y "$pkg"
|
|
done
|
|
}
|
|
|
|
install_gpu_driver
|
|
|
|
sleep 1
|
|
#clear
|
|
|
|
cd /tmp/ && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && sudo apt install -y /tmp/google-chrome-stable_current_amd64.deb && rm google-chrome-stable_current_amd64.deb
|
|
|
|
echo -e "${GREEN} Set User folders via xdg-user-dirs-update & xdg-mime default. ${NC}"
|
|
# ls /usr/share/applications/ Find The Default run.: "xdg-mime query default inode/directory"
|
|
|
|
xdg-user-dirs-update
|
|
|
|
xdg-mime default kitty.desktop text/x-shellscript
|
|
#xdg-mime default nsxiv.desktop image/jpeg
|
|
#xdg-mime default nsxiv.desktop image/png
|
|
xdg-mime default thunar.desktop inode/directory
|
|
|
|
sleep 1
|
|
#clear
|
|
|
|
echo -e "${GREEN}Settings GRUB TIMEOUT to 1 second. ${NC}"
|
|
sudo sed -i 's+GRUB_TIMEOUT=5+GRUB_TIMEOUT=1+g' /etc/default/grub && sudo update-grub
|
|
|
|
|
|
echo -e "${GREEN} Alias echo to ~/.bashrc ${NC}"
|
|
|
|
echo 'alias ls="ls --color=auto --group-directories-first -v -lah"' >> ~/.bashrc
|
|
echo 'alias upup="sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y"' >> ~/.bashrc
|
|
echo 'bind '"'"'"\C-f":"open "$(fzf)"\n"'"'" >> ~/.bashrc
|
|
|
|
|
|
# Config folders & files
|
|
|
|
echo -e "${GREEN} Hyprland config file START ${NC}"
|
|
|
|
if [ ! -f ~/.config/hypr/hyprland.conf ]; then
|
|
mkdir -p ~/.config/hypr
|
|
cat << "HYPRLANDCONFIG" > ~/.config/hypr/hyprland.conf
|
|
# Hyprland Configuring File.
|
|
# Refer to the wiki for more information.
|
|
# https://wiki.hyprland.org/Configuring/Configuring-Hyprland/
|
|
|
|
# Please note not all available settings / options are set here.
|
|
# For a full list, see the wiki at https://wiki.hyprland.org
|
|
|
|
# Split configuration into multiple files and source them.
|
|
# source = ~/.config/hypr/ColorsHyprland.conf
|
|
|
|
|
|
################
|
|
### MONITORS ###
|
|
################
|
|
|
|
# https://wiki.hyprland.org/Configuring/Monitors/
|
|
# list all available monitors - hyprctl monitors all
|
|
# monitor = name, resolution, position, scale
|
|
|
|
monitor=,preferred,auto,1
|
|
|
|
# unscale XWayland
|
|
xwayland {
|
|
force_zero_scaling = true
|
|
}
|
|
|
|
####################
|
|
# Default Programs #
|
|
####################
|
|
|
|
# https://wiki.hyprland.org/Configuring/Keywords/
|
|
|
|
# Set programs that you use
|
|
$terminal = kitty
|
|
$filemanager = thunar
|
|
$runmenu = rofi -modi "drun,run,window,filebrowser" -show drun # Switch between -modi... Default key CTRL+TAB
|
|
$browser = google-chrome
|
|
|
|
|
|
#################
|
|
### AUTOSTART ###
|
|
#################
|
|
|
|
# Autostart necessary processes (like notifications daemons, status bars, etc.)
|
|
# Or execute your favorite apps at launch like this:
|
|
|
|
#exec-once = dbus-update-activation-environment --systemd --all
|
|
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=Hyprland
|
|
|
|
|
|
exec = swaybg -m fill -i $(find $HOME/Wallpapers -type f | shuf -n 1)
|
|
exec-once = ~/.config/waybar/auto-reload-waybar.sh
|
|
exec-once = dunst
|
|
|
|
# exec-once = nm-applet
|
|
# exec-once = blueman-applet
|
|
|
|
exec-once = [workspace special silent] kitty
|
|
|
|
|
|
#############################
|
|
### ENVIRONMENT VARIABLES ###
|
|
#############################
|
|
|
|
# https://wiki.hyprland.org/Configuring/Environment-variables/
|
|
|
|
env = XCURSOR_SIZE,24
|
|
env = HYPRCURSOR_SIZE,24
|
|
env = XDG_CURRENT_DESKTOP,Hyprland
|
|
|
|
|
|
#####################
|
|
### LOOK AND FEEL ###
|
|
#####################
|
|
|
|
# Refer to https://wiki.hyprland.org/Configuring/Variables/
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#general
|
|
general {
|
|
gaps_in = 4
|
|
gaps_out = 8
|
|
|
|
border_size = 1
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#variable-types
|
|
col.active_border = rgba(195896c4)
|
|
#col.active_border = rgba(216bb7cc) rgba(388abecc) 45deg
|
|
col.inactive_border = rgba(3e4c55c9)
|
|
|
|
# Set to true or false to enable resizing windows by clicking and dragging on borders and gaps
|
|
resize_on_border = true
|
|
|
|
# https://wiki.hyprland.org/Configuring/Tearing/
|
|
allow_tearing = false
|
|
|
|
# https://wiki.hyprland.org/Configuring/Dwindle-Layout/
|
|
layout = dwindle
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#decoration
|
|
decoration {
|
|
rounding = 0
|
|
|
|
# Change transparency of focused and unfocused windows
|
|
active_opacity = 1.0
|
|
inactive_opacity = 1.0
|
|
|
|
drop_shadow = true
|
|
shadow_range = 4
|
|
shadow_render_power = 3
|
|
col.shadow = rgba(1a1a1aee)
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#blur
|
|
blur {
|
|
enabled = true
|
|
size = 3
|
|
passes = 2
|
|
|
|
vibrancy = 0.1696
|
|
}
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#animations
|
|
animations {
|
|
enabled = true
|
|
|
|
# Default animations, for more see https://wiki.hyprland.org/Configuring/Animations/
|
|
|
|
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
|
|
|
|
animation = windows, 1, 7, myBezier
|
|
animation = windowsOut, 1, 7, default, popin 80%
|
|
animation = border, 1, 10, default
|
|
animation = borderangle, 1, 8, default
|
|
animation = fade, 1, 7, default
|
|
animation = workspaces, 1, 6, default
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Dwindle-Layout/
|
|
dwindle {
|
|
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
|
|
preserve_split = true # You probably want this
|
|
default_split_ratio = 1.2
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Master-Layout/
|
|
master {
|
|
new_status = master
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#misc
|
|
misc {
|
|
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
|
|
disable_hyprland_logo = true # (true or false) If true disables the random hyprland logo / anime girl background. :(
|
|
}
|
|
|
|
|
|
#############
|
|
### INPUT ###
|
|
#############
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#input
|
|
input {
|
|
kb_layout = dk
|
|
kb_variant =
|
|
kb_model =
|
|
kb_options = nodeadkeys
|
|
kb_rules =
|
|
numlock_by_default = true
|
|
|
|
follow_mouse = 1
|
|
|
|
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
|
|
|
|
touchpad {
|
|
tap-to-click = true
|
|
disable_while_typing = true
|
|
clickfinger_behavior = false
|
|
natural_scroll = false
|
|
scroll_factor = 1
|
|
}
|
|
}
|
|
|
|
# https://wiki.hyprland.org/Configuring/Variables/#gestures
|
|
gestures {
|
|
workspace_swipe = false
|
|
}
|
|
|
|
# Example per-device config
|
|
# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more
|
|
device {
|
|
name = epic-mouse-v1
|
|
sensitivity = -0.5
|
|
}
|
|
|
|
|
|
####################
|
|
### KEYBINDINGSS ###
|
|
####################
|
|
# https://wiki.hyprland.org/Configuring/Keywords/
|
|
# https://wiki.hyprland.org/Configuring/Binds/
|
|
# Mod list - SHIFT, CAPS, CTRL/CONTROL, ALT, MOD2, MOD3, SUPER/WIN/LOGO/MOD4, MOD5, Return,
|
|
|
|
# Sets the modifier keys
|
|
$mainMod = SUPER
|
|
$secondMod = SHIFT
|
|
$thirdMod = ALT
|
|
$fourthdMod = CTRL
|
|
|
|
# https://wiki.hyprland.org/Configuring/Binds/
|
|
bind = $mainMod, Return, exec, $terminal
|
|
bind = $mainMod, B, exec, $browser
|
|
bind = $mainMod, E, exec, $filemanager
|
|
bind = $mainMod, R, exec, $runmenu
|
|
|
|
bind = $mainMod, W, killactive,
|
|
bind = $mainMod, F, togglefloating,
|
|
|
|
bind = $mainMod, P, pseudo, # dwindle
|
|
bind = $mainMod, J, togglesplit, # dwindle
|
|
|
|
# Move focus with mainMod + arrow keys
|
|
bind = $mainMod, left, movefocus, l
|
|
bind = $mainMod, right, movefocus, r
|
|
bind = $mainMod, up, movefocus, u
|
|
bind = $mainMod, down, movefocus, d
|
|
|
|
# Move focus window with mainMod + secondMod + arrow keys
|
|
bind = $mainMod $secondMod, left, movewindow, l
|
|
bind = $mainMod $secondMod, right, movewindow, r
|
|
bind = $mainMod $secondMod, up, movewindow, u
|
|
bind = $mainMod $secondMod, down, movewindow, d
|
|
|
|
bind = $mainMod, minus, centerwindow
|
|
|
|
bind = $mainMod $secondMod $thirdMod, left, movetoworkspace,-1
|
|
bind = $mainMod $secondMod $thirdMod, right, movetoworkspace,+1
|
|
|
|
# Switch workspaces with mainMod + [0-9]
|
|
bind = $mainMod, 1, workspace, 1
|
|
bind = $mainMod, 2, workspace, 2
|
|
bind = $mainMod, 3, workspace, 3
|
|
bind = $mainMod, 4, workspace, 4
|
|
bind = $mainMod, 5, workspace, 5
|
|
bind = $mainMod, 6, workspace, 6
|
|
bind = $mainMod, 7, workspace, 7
|
|
bind = $mainMod, 8, workspace, 8
|
|
bind = $mainMod, 9, workspace, 9
|
|
bind = $mainMod, 0, workspace, 10
|
|
|
|
# Move active window to a workspace with mainMod + SHIFT + [0-9]
|
|
bind = $mainMod $secondMod, 1, movetoworkspace, 1
|
|
bind = $mainMod $secondMod, 2, movetoworkspace, 2
|
|
bind = $mainMod $secondMod, 3, movetoworkspace, 3
|
|
bind = $mainMod $secondMod, 4, movetoworkspace, 4
|
|
bind = $mainMod $secondMod, 5, movetoworkspace, 5
|
|
bind = $mainMod $secondMod, 6, movetoworkspace, 6
|
|
bind = $mainMod $secondMod, 7, movetoworkspace, 7
|
|
bind = $mainMod $secondMod, 8, movetoworkspace, 8
|
|
bind = $mainMod $secondMod, 9, movetoworkspace, 9
|
|
bind = $mainMod $secondMod, 0, movetoworkspace, 10
|
|
|
|
# Special Workspaces (ScratchPad)
|
|
bind = $mainMod, S, togglespecialworkspace, magic
|
|
bind = $mainMod $secondMod, S, movetoworkspace, special:magic
|
|
|
|
bind = $secondMod, X, togglespecialworkspace
|
|
|
|
# Scroll through existing workspaces with mainMod + scroll
|
|
bind = $mainMod, mouse_down, workspace, e+1
|
|
bind = $mainMod, mouse_up, workspace, e-1
|
|
|
|
# Move/resize windows with mainMod + LMB/RMB and dragging
|
|
bindm = $mainMod, mouse:272, movewindow
|
|
bindm = $mainMod, mouse:273, resizewindow
|
|
|
|
# Audio
|
|
binde = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 1%+
|
|
binde = , XF86AudioLowerVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-
|
|
binde = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle || notify-send -u low "Audio muted" " "
|
|
|
|
bind = $mainMod $thirdMod, up, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 1%+
|
|
bind = $mainMod $thirdMod, down, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-
|
|
bind = $mainMod $thirdMod, M, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
|
|
|
# XF86 Audio & Brightness keys
|
|
bind = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 1%+
|
|
bind = , XF86AudioLowerVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-
|
|
bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
|
bind = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle
|
|
|
|
bind = , XF86AudioPlay, exec, playerctl play-pause
|
|
bind = , XF86AudioPause, exec, playerctl pause
|
|
bind = , XF86AudioNext, exec, playerctl next
|
|
bind = , XF86AudioPrev, exec, playerctl previous
|
|
|
|
bind = , XF86MonBrightnessUp, exec, brightnessctl -q s +10%
|
|
bind = , XF86MonBrightnessDown, exec, brightnessctl -q s 10%-
|
|
|
|
# Lockdown / Screenlock
|
|
bind = , XF86Lock, exec, hyprlock
|
|
bind = $mainMod, l, exec, hyprlock
|
|
|
|
# Open Programs
|
|
|
|
|
|
#############################################
|
|
### RULES - WINDOWS, LAYER AND WORKSPACES ###
|
|
#############################################
|
|
|
|
# https://wiki.hyprland.org/Configuring/Window-Rules/
|
|
# https://wiki.hyprland.org/Configuring/Workspace-Rules/
|
|
|
|
#windowrulev2 = suppressevent maximize, class:.*
|
|
|
|
|
|
# Float Windowrules
|
|
windowrulev2 = float,size 30% 50%,floatpos center,noborder,norounding,class:^(rofi|Rofi)
|
|
windowrulev2 = float,floatpos center,noborder,norounding,class:^(nwg-look)
|
|
windowrulev2 = float,floatpos center,noborder,norounding,class:(org.pulseaudio.pavucontrol)
|
|
windowrulev2 = size 50% 40%, class:(org.pulseaudio.pavucontrol)
|
|
windowrulev2 = float,class:(blueman-manager)
|
|
|
|
|
|
|
|
# Special Windowrules
|
|
windowrulev2 = idleinhibit fullscreen, class:.* # if a window is fullscreen, don't idle
|
|
windowrulev2=move 0 0,title:^(flameshot)
|
|
windowrulev2=nofullscreenrequest,title:^(flameshot)
|
|
|
|
##############
|
|
# Layerrules #
|
|
##############
|
|
# https://wiki.hyprland.org/Configuring/Window-Rules/#layer-rules
|
|
layerrule = noanim, rofi
|
|
|
|
#######################
|
|
# Windowrule Examples #
|
|
#######################
|
|
|
|
# Example windowrule v1
|
|
# windowrule = float, ^(kitty)$
|
|
|
|
# Example windowrule v2
|
|
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
|
|
|
|
|
|
|
|
HYPRLANDCONFIG
|
|
|
|
else
|
|
echo "Hyprland config already exists."
|
|
fi
|
|
|
|
# Waybar Configuring File
|
|
if [ ! -f ~/.config/waybar/config.jsonc ]; then
|
|
mkdir -p ~/.config/waybar
|
|
cat << "WAYBARCONFIG" > ~/.config/waybar/config.jsonc
|
|
//# Waybar Configuring File.
|
|
//# https://github.com/Alexays/Waybar
|
|
|
|
// -*- mode: jsonc -*-
|
|
{
|
|
// "layer": "top", // Waybar at top layer
|
|
"position": "bottom", // Waybar position (top|bottom|left|right)
|
|
"height": 28, // Waybar height (to be removed for auto height)
|
|
//"width": 980, // Waybar width
|
|
"spacing": 5, // Gaps between modules (5px)
|
|
"margin-top": 0,
|
|
"margin-bottom": 10,
|
|
"margin-left": 10,
|
|
"margin-right": 10,
|
|
// Choose the order of the modules
|
|
"modules-left": [
|
|
"hyprland/workspaces",
|
|
"hyprland/mode"
|
|
],
|
|
"modules-center": [
|
|
"hyprland/window"
|
|
],
|
|
"modules-right": [
|
|
"mpd",
|
|
"pulseaudio",
|
|
"network",
|
|
"cpu",
|
|
"memory",
|
|
"temperature",
|
|
"backlight",
|
|
"keyboard-state",
|
|
"battery",
|
|
"battery#bat2",
|
|
"tray",
|
|
"clock"
|
|
],
|
|
"keyboard-state": {
|
|
"numlock": true,
|
|
"capslock": true,
|
|
"format": "{name} {icon}",
|
|
"format-icons": {
|
|
"locked": "",
|
|
"unlocked": ""
|
|
}
|
|
},
|
|
"hyprland/workspaces": {
|
|
"format": "{icon}",
|
|
"on-click": "activate",
|
|
"format-icons": {
|
|
"urgent": "",
|
|
"active": "",
|
|
"default": ""
|
|
},
|
|
"tooltip": false,
|
|
},
|
|
"hyprland/mode": {
|
|
"format": "<span style=\"italic\">{}</span>"
|
|
},
|
|
"hyprland/scratchpad": {
|
|
"format": "{icon} {count}",
|
|
"show-empty": false,
|
|
"format-icons": ["", ""],
|
|
"tooltip": true,
|
|
"tooltip-format": "{app}: {title}"
|
|
},
|
|
"mpd": {
|
|
"format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ",
|
|
"format-disconnected": "Disconnected ",
|
|
"format-stopped": "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ",
|
|
"unknown-tag": "N/A",
|
|
"interval": 5,
|
|
"consume-icons": {
|
|
"on": " "
|
|
},
|
|
"random-icons": {
|
|
"off": "<span color=\"#f53c3c\"></span> ",
|
|
"on": " "
|
|
},
|
|
"repeat-icons": {
|
|
"on": " "
|
|
},
|
|
"single-icons": {
|
|
"on": "1 "
|
|
},
|
|
"state-icons": {
|
|
"paused": "",
|
|
"playing": ""
|
|
},
|
|
"tooltip-format": "MPD (connected)",
|
|
"tooltip-format-disconnected": "MPD (disconnected)"
|
|
},
|
|
"idle_inhibitor": {
|
|
"format": "{icon}",
|
|
"format-icons": {
|
|
"activated": "",
|
|
"deactivated": ""
|
|
}
|
|
},
|
|
"tray": {
|
|
// "icon-size": 18,
|
|
"spacing": 10
|
|
},
|
|
"clock": {
|
|
// "timezone": "Europe/Copenhagen",
|
|
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
|
|
"format-alt": "{:%d-%m-%Y}"
|
|
},
|
|
"cpu": {
|
|
"format": "{usage}% ",
|
|
"tooltip": false
|
|
},
|
|
"memory": {
|
|
"format": "{}% "
|
|
},
|
|
"temperature": {
|
|
// "thermal-zone": 2,
|
|
// "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
|
|
"critical-threshold": 80,
|
|
// "format-critical": "{temperatureC}°C {icon}",
|
|
"format": "{temperatureC}°C {icon}",
|
|
"format-icons": ["", "", ""]
|
|
"tooltip": false
|
|
},
|
|
"backlight": {
|
|
// "device": "acpi_video1",
|
|
"format": "{percent}% {icon}",
|
|
"format-icons": ["", "", "", "", "", "", "", "", ""]
|
|
"tooltip": false
|
|
},
|
|
"battery": {
|
|
"states": {
|
|
// "good": 95,
|
|
"warning": 30,
|
|
"critical": 15
|
|
},
|
|
"format": "{capacity}% {icon}",
|
|
"format-full": "{capacity}% {icon}",
|
|
"format-charging": "{capacity}% ",
|
|
"format-plugged": "{capacity}% ",
|
|
"format-alt": "{time} {icon}",
|
|
// "format-good": "", // An empty format will hide the module
|
|
// "format-full": "",
|
|
"format-icons": ["", "", "", "", ""]
|
|
"tooltip": false
|
|
},
|
|
"battery#bat2": {
|
|
"bat": "BAT2"
|
|
},
|
|
"power-profiles-daemon": {
|
|
"format": "{icon}",
|
|
"tooltip-format": "Power profile: {profile}\nDriver: {driver}",
|
|
"tooltip": true,
|
|
"format-icons": {
|
|
"default": "",
|
|
"performance": "",
|
|
"balanced": "",
|
|
"power-saver": ""
|
|
}
|
|
},
|
|
"network": {
|
|
// "interface": "wlp2*", // (Optional) To force the use of this interface
|
|
"format-wifi": "{essid} ({signalStrength}%) ",
|
|
"format-ethernet": "{ipaddr}/{cidr} ",
|
|
"tooltip-format": "{ifname} via {gwaddr} ",
|
|
"format-linked": "{ifname} (No IP) ",
|
|
"format-disconnected": "Disconnected ⚠",
|
|
"format-alt": "{ifname}: {ipaddr}/{cidr}"
|
|
"tooltip": false
|
|
},
|
|
"pulseaudio": {
|
|
"scroll-step": 5,
|
|
"format": "<span color='#fab387'>{icon}</span> {volume}%",
|
|
"format-icons": {
|
|
"default": ["", "", ""]
|
|
},
|
|
"on-click": "pavucontrol",
|
|
"tooltip": false
|
|
},
|
|
"custom/media": {
|
|
"format": "{icon} {text}",
|
|
"return-type": "json",
|
|
"max-length": 40,
|
|
"format-icons": {
|
|
"spotify": "",
|
|
"default": "🎜"
|
|
},
|
|
"escape": true,
|
|
"exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder
|
|
// "exec": "$HOME/.config/waybar/mediaplayer.py --player spotify 2> /dev/null" // Filter player based on name
|
|
},
|
|
"custom/power": {
|
|
"format" : "⏻ ",
|
|
"tooltip": false,
|
|
"menu": "on-click",
|
|
"menu-file": "$HOME/.config/waybar/power_menu.xml", // Menu file in resources folder
|
|
"menu-actions": {
|
|
"shutdown": "shutdown",
|
|
"reboot": "reboot",
|
|
"suspend": "systemctl suspend",
|
|
"hibernate": "systemctl hibernate"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
WAYBARCONFIG
|
|
|
|
else
|
|
echo "Waybar config already exists."
|
|
fi
|
|
|
|
# Waybar Style File
|
|
if [ ! -f ~/.config/waybar/style.css ]; then
|
|
mkdir -p ~/.config/waybar
|
|
cat << "WAYBARCONFIGSTYLE" > ~/.config/waybar/style.css
|
|
/* Waybar Sytle Configuring File.
|
|
https://github.com/Alexays/Waybar
|
|
*/
|
|
|
|
* {
|
|
/* `otf-font-awesome` is required to be installed for icons */
|
|
font-family: IBMPlexMono, FontAwesome, Roboto, Helvetica, Arial, sans-serif;
|
|
font-size: 13px;
|
|
}
|
|
|
|
window#waybar {
|
|
background-color: rgba(23, 36, 45, 0.8);
|
|
border-bottom: 0px solid rgba(23, 36, 45, 0.55);
|
|
color: #ffffff;
|
|
transition-property: background-color;
|
|
transition-duration: .5s;
|
|
}
|
|
|
|
window#waybar.hidden {
|
|
opacity: 0.2;
|
|
}
|
|
|
|
/*
|
|
window#waybar.empty {
|
|
background-color: transparent;
|
|
}
|
|
window#waybar.solo {
|
|
background-color: #FFFFFF;
|
|
}
|
|
*/
|
|
|
|
window#waybar.termite {
|
|
background-color: #3F3F3F;
|
|
}
|
|
|
|
window#waybar.chromium {
|
|
background-color: #000000;
|
|
border: none;
|
|
}
|
|
|
|
button {
|
|
/* Use box-shadow instead of border so the text isn't offset */
|
|
box-shadow: inset 0 -3px transparent;
|
|
/* Avoid rounded borders under each button name */
|
|
border: none;
|
|
border-radius: 0;
|
|
}
|
|
|
|
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
|
|
button:hover {
|
|
background: inherit;
|
|
box-shadow: inset 0 -3px #ffffff;
|
|
}
|
|
|
|
/* you can set a style on hover for any module like this */
|
|
#pulseaudio:hover {
|
|
background-color: #a37800;
|
|
}
|
|
|
|
#workspaces button {
|
|
padding: 0 5px;
|
|
background-color: transparent;
|
|
color: #ffffff;
|
|
}
|
|
|
|
#workspaces button:hover {
|
|
background: rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
#workspaces button.focused {
|
|
background-color: #64727D;
|
|
box-shadow: inset 0 -3px #ffffff;
|
|
}
|
|
|
|
#workspaces button.urgent {
|
|
background-color: #eb4d4b;
|
|
}
|
|
|
|
#mode {
|
|
background-color: #64727D;
|
|
box-shadow: inset 0 -3px #ffffff;
|
|
}
|
|
|
|
#clock,
|
|
#battery,
|
|
#cpu,
|
|
#memory,
|
|
#disk,
|
|
#temperature,
|
|
#backlight,
|
|
#network,
|
|
#pulseaudio,
|
|
#wireplumber,
|
|
#custom-media,
|
|
#tray,
|
|
#mode,
|
|
#idle_inhibitor,
|
|
#scratchpad,
|
|
#power-profiles-daemon,
|
|
#mpd {
|
|
padding: 0 10px;
|
|
color: #ffffff;
|
|
}
|
|
|
|
#window,
|
|
#workspaces {
|
|
margin: 0 4px;
|
|
}
|
|
|
|
/* If workspaces is the leftmost module, omit left margin */
|
|
.modules-left > widget:first-child > #workspaces {
|
|
margin-left: 0;
|
|
}
|
|
|
|
/* If workspaces is the rightmost module, omit right margin */
|
|
.modules-right > widget:last-child > #workspaces {
|
|
margin-right: 0;
|
|
}
|
|
|
|
#clock {
|
|
background-color: #64727D;
|
|
}
|
|
|
|
#battery {
|
|
background-color: #ffffff;
|
|
color: #000000;
|
|
}
|
|
|
|
#battery.charging, #battery.plugged {
|
|
color: #ffffff;
|
|
background-color: #26A65B;
|
|
}
|
|
|
|
@keyframes blink {
|
|
to {
|
|
background-color: #ffffff;
|
|
color: #000000;
|
|
}
|
|
}
|
|
|
|
/* Using steps() instead of linear as a timing function to limit cpu usage */
|
|
#battery.critical:not(.charging) {
|
|
background-color: #f53c3c;
|
|
color: #ffffff;
|
|
animation-name: blink;
|
|
animation-duration: 0.5s;
|
|
animation-timing-function: steps(12);
|
|
animation-iteration-count: infinite;
|
|
animation-direction: alternate;
|
|
}
|
|
|
|
#power-profiles-daemon {
|
|
padding-right: 15px;
|
|
}
|
|
|
|
#power-profiles-daemon.performance {
|
|
background-color: #f53c3c;
|
|
color: #ffffff;
|
|
}
|
|
|
|
#power-profiles-daemon.balanced {
|
|
background-color: #2980b9;
|
|
color: #ffffff;
|
|
}
|
|
|
|
#power-profiles-daemon.power-saver {
|
|
background-color: #2ecc71;
|
|
color: #000000;
|
|
}
|
|
|
|
label:focus {
|
|
background-color: #000000;
|
|
}
|
|
|
|
#cpu {
|
|
background-color: #2ecc71;
|
|
color: #000000;
|
|
}
|
|
|
|
#memory {
|
|
background-color: #9b59b6;
|
|
}
|
|
|
|
#disk {
|
|
background-color: #964B00;
|
|
}
|
|
|
|
#backlight {
|
|
background-color: #90b1b1;
|
|
}
|
|
|
|
#network {
|
|
background-color: #2980b9;
|
|
}
|
|
|
|
#network.disconnected {
|
|
background-color: #f53c3c;
|
|
}
|
|
|
|
#pulseaudio {
|
|
background-color: #f1c40f;
|
|
color: #000000;
|
|
}
|
|
|
|
#pulseaudio.muted {
|
|
background-color: #90b1b1;
|
|
color: #2a5c45;
|
|
}
|
|
|
|
#wireplumber {
|
|
background-color: #fff0f5;
|
|
color: #000000;
|
|
}
|
|
|
|
#wireplumber.muted {
|
|
background-color: #f53c3c;
|
|
}
|
|
|
|
#custom-media {
|
|
background-color: #66cc99;
|
|
color: #2a5c45;
|
|
min-width: 100px;
|
|
}
|
|
|
|
#custom-media.custom-spotify {
|
|
background-color: #66cc99;
|
|
}
|
|
|
|
#custom-media.custom-vlc {
|
|
background-color: #ffa000;
|
|
}
|
|
|
|
#temperature {
|
|
background-color: #f0932b;
|
|
}
|
|
|
|
#temperature.critical {
|
|
background-color: #eb4d4b;
|
|
}
|
|
|
|
#tray {
|
|
background-color: #2980b9;
|
|
}
|
|
|
|
#tray > .passive {
|
|
-gtk-icon-effect: dim;
|
|
}
|
|
|
|
#tray > .needs-attention {
|
|
-gtk-icon-effect: highlight;
|
|
background-color: #eb4d4b;
|
|
}
|
|
|
|
#idle_inhibitor {
|
|
background-color: #2d3436;
|
|
}
|
|
|
|
#idle_inhibitor.activated {
|
|
background-color: #ecf0f1;
|
|
color: #2d3436;
|
|
}
|
|
|
|
#mpd {
|
|
background-color: #66cc99;
|
|
color: #2a5c45;
|
|
}
|
|
|
|
#mpd.disconnected {
|
|
background-color: #f53c3c;
|
|
}
|
|
|
|
#mpd.stopped {
|
|
background-color: #90b1b1;
|
|
}
|
|
|
|
#mpd.paused {
|
|
background-color: #51a37a;
|
|
}
|
|
|
|
#language {
|
|
background: #00b093;
|
|
color: #740864;
|
|
padding: 0 5px;
|
|
margin: 0 5px;
|
|
min-width: 16px;
|
|
}
|
|
|
|
#keyboard-state {
|
|
background: #97e1ad;
|
|
color: #000000;
|
|
padding: 0 0px;
|
|
margin: 0 5px;
|
|
min-width: 16px;
|
|
}
|
|
|
|
#keyboard-state > label {
|
|
padding: 0 5px;
|
|
}
|
|
|
|
#keyboard-state > label.locked {
|
|
background: rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
#scratchpad {
|
|
background: rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
#scratchpad.empty {
|
|
background-color: transparent;
|
|
}
|
|
|
|
#privacy {
|
|
padding: 0;
|
|
}
|
|
|
|
#privacy-item {
|
|
padding: 0 5px;
|
|
color: white;
|
|
}
|
|
|
|
#privacy-item.screenshare {
|
|
background-color: #cf5700;
|
|
}
|
|
|
|
#privacy-item.audio-in {
|
|
background-color: #1ca000;
|
|
}
|
|
|
|
#privacy-item.audio-out {
|
|
background-color: #0069d4;
|
|
}
|
|
|
|
WAYBARCONFIGSTYLE
|
|
|
|
else
|
|
echo "Waybar style.css already exists."
|
|
fi
|
|
|
|
# Waybar Style File
|
|
if [ ! -f ~/.config/waybar/auto-reload-waybar.sh ]; then
|
|
mkdir -p ~/.config/waybar
|
|
cat << "WAYBARAUTORELOAD" > ~/.config/waybar/auto-reload-waybar.sh
|
|
#!/bin/bash
|
|
|
|
# start waybar if not started
|
|
if ! pgrep -x "waybar" > /dev/null; then
|
|
waybar &
|
|
fi
|
|
|
|
# current checksums
|
|
current_checksum_config=$(md5sum ~/.config/waybar/config.jsonc)
|
|
current_checksum_style=$(md5sum ~/.config/waybar/style.css)
|
|
|
|
# loop forever
|
|
while true; do
|
|
# new checksums
|
|
new_checksum_config=$(md5sum ~/.config/waybar/config.jsonc)
|
|
new_checksum_style=$(md5sum ~/.config/waybar/style.css)
|
|
|
|
# if checksums are different
|
|
if [ "$current_checksum_config" != "$new_checksum_config" ] || [ "$current_checksum_style" != "$new_checksum_style" ]; then
|
|
# kill waybar
|
|
killall waybar
|
|
|
|
# start waybar
|
|
waybar &
|
|
|
|
# update checksums
|
|
current_checksum_config=$new_checksum_config
|
|
current_checksum_style=$new_checksum_style
|
|
fi
|
|
done
|
|
|
|
WAYBARAUTORELOAD
|
|
|
|
chmod +x ~/.config/waybar/auto-reload-waybar.sh
|
|
|
|
else
|
|
echo "Waybar auto reload already exists."
|
|
fi
|
|
|
|
echo -e "${GREEN} Kitty config file START ${NC}"
|
|
|
|
if [ ! -f ~/.config/kitty/kitty.conf ]; then
|
|
mkdir -p ~/.config/kitty/themes
|
|
cat << "KITTYCONFIG" > ~/.config/kitty/kitty.conf
|
|
# A default configuration file can also be generated by running:
|
|
# kitty +runpy 'from kitty.config import *; print(commented_out_default_config())'
|
|
#
|
|
# The following command will bring up the interactive terminal GUI
|
|
# kitty +kitten themes
|
|
#
|
|
# kitty +kitten themes Catppuccin-Mocha
|
|
# kitty +kitten themes --reload-in=all Catppuccin-Mocha
|
|
|
|
background_opacity 0.98
|
|
|
|
font_family monospace
|
|
bold_font auto
|
|
italic_font auto
|
|
bold_italic_font auto
|
|
|
|
font_size 12
|
|
force_ltr no
|
|
|
|
adjust_line_height 0
|
|
adjust_column_width 0
|
|
|
|
adjust_baseline 0
|
|
|
|
disable_ligatures never
|
|
|
|
box_drawing_scale 0.001, 1, 1.5, 2
|
|
|
|
cursor #f2f2f2
|
|
|
|
cursor_text_color #f2f2f2
|
|
|
|
cursor_shape underline
|
|
|
|
cursor_beam_thickness 1.5
|
|
|
|
cursor_underline_thickness 2.0
|
|
|
|
cursor_blink_interval -1
|
|
|
|
cursor_stop_blinking_after 99.0
|
|
|
|
scrollback_lines 5000
|
|
|
|
scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER
|
|
|
|
scrollback_pager_history_size 0
|
|
|
|
scrollback_fill_enlarged_window no
|
|
|
|
wheel_scroll_multiplier 5.0
|
|
|
|
touch_scroll_multiplier 1.0
|
|
|
|
mouse_hide_wait 3.0
|
|
|
|
mouse_map right click paste_from_clipboard
|
|
|
|
url_color #0087bd
|
|
url_style curly
|
|
|
|
open_url_with default
|
|
|
|
url_prefixes http https file ftp gemini irc gopher mailto news git
|
|
|
|
detect_urls yes
|
|
|
|
url_excluded_characters
|
|
|
|
copy_on_select yes
|
|
|
|
strip_trailing_spaces never
|
|
|
|
select_by_word_characters @-./_~?&=%+#
|
|
|
|
click_interval -1.0
|
|
|
|
focus_follows_mouse no
|
|
|
|
pointer_shape_when_grabbed arrow
|
|
|
|
default_pointer_shape beam
|
|
|
|
pointer_shape_when_dragging beam
|
|
|
|
mouse_map left click ungrabbed mouse_click_url_or_select
|
|
mouse_map shift+left click grabbed,ungrabbed mouse_click_url_or_select
|
|
mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_click_url
|
|
|
|
mouse_map ctrl+shift+left press grabbed discard_event
|
|
|
|
mouse_map middle release ungrabbed paste_from_selection
|
|
mouse_map left press ungrabbed mouse_selection normal
|
|
mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle
|
|
mouse_map left doublepress ungrabbed mouse_selection word
|
|
mouse_map left triplepress ungrabbed mouse_selection line
|
|
|
|
mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point
|
|
|
|
#mouse_map right press ungrabbed mouse_selection extend
|
|
mouse_map shift+middle release ungrabbed,grabbed paste_selection
|
|
mouse_map shift+left press ungrabbed,grabbed mouse_selection normal
|
|
mouse_map shift+ctrl+alt+left press ungrabbed,grabbed mouse_selection rectangle
|
|
mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word
|
|
mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line
|
|
|
|
mouse_map shift+ctrl+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point
|
|
|
|
repaint_delay 10
|
|
|
|
input_delay 5
|
|
|
|
sync_to_monitor yes
|
|
|
|
enable_audio_bell no
|
|
|
|
visual_bell_duration 0.0
|
|
|
|
window_alert_on_bell no
|
|
|
|
bell_on_tab no
|
|
|
|
command_on_bell none
|
|
|
|
remember_window_size yes
|
|
initial_window_width 800
|
|
initial_window_height 500
|
|
|
|
enabled_layouts *
|
|
|
|
window_resize_step_cells 2
|
|
window_resize_step_lines 2
|
|
|
|
window_border_width 0.0pt
|
|
|
|
draw_minimal_borders yes
|
|
|
|
window_margin_width 0
|
|
|
|
single_window_margin_width -1
|
|
|
|
window_padding_width 3
|
|
|
|
placement_strategy center
|
|
|
|
active_border_color #f2f2f2
|
|
|
|
inactive_border_color #cccccc
|
|
|
|
bell_border_color #ff5a00
|
|
|
|
inactive_text_alpha 1.0
|
|
|
|
hide_window_decorations no
|
|
|
|
resize_debounce_time 0.1
|
|
|
|
resize_draw_strategy static
|
|
|
|
resize_in_steps no
|
|
|
|
confirm_os_window_close 0
|
|
|
|
tab_bar_edge bottom
|
|
|
|
tab_bar_margin_width 0.0
|
|
|
|
tab_bar_margin_height 0.0 0.0
|
|
|
|
tab_bar_style fade
|
|
|
|
tab_bar_min_tabs 2
|
|
|
|
tab_switch_strategy previous
|
|
|
|
tab_fade 0.25 0.5 0.75 1
|
|
|
|
tab_separator " |"
|
|
|
|
tab_powerline_style angled
|
|
|
|
tab_activity_symbol none
|
|
|
|
tab_title_template "{title}"
|
|
|
|
active_tab_title_template none
|
|
|
|
active_tab_foreground #000
|
|
active_tab_background #eee
|
|
active_tab_font_style bold-italic
|
|
inactive_tab_foreground #444
|
|
inactive_tab_background #999
|
|
inactive_tab_font_style normal
|
|
|
|
tab_bar_background none
|
|
|
|
background_image none
|
|
|
|
background_image_layout tiled
|
|
|
|
background_image_linear no
|
|
|
|
dynamic_background_opacity no
|
|
|
|
background_tint 0.0
|
|
|
|
dim_opacity 0.75
|
|
|
|
selection_foreground #000000
|
|
|
|
selection_background #fffacd
|
|
|
|
mark1_foreground black
|
|
|
|
mark1_background #98d3cb
|
|
|
|
mark2_foreground black
|
|
|
|
mark2_background #f2dcd3
|
|
|
|
mark3_foreground black
|
|
|
|
mark3_background #f274bc
|
|
|
|
shell .
|
|
|
|
editor .
|
|
|
|
close_on_child_death no
|
|
|
|
allow_remote_control yes
|
|
|
|
listen_on none
|
|
|
|
update_check_interval 0
|
|
|
|
startup_session none
|
|
|
|
clipboard_control write-clipboard write-primary
|
|
|
|
allow_hyperlinks yes
|
|
|
|
term xterm-kitty
|
|
|
|
wayland_titlebar_color system
|
|
|
|
macos_titlebar_color system
|
|
|
|
macos_option_as_alt no
|
|
|
|
macos_hide_from_tasks no
|
|
|
|
macos_quit_when_last_window_closed no
|
|
|
|
macos_window_resizable yes
|
|
|
|
macos_thicken_font 0
|
|
|
|
macos_traditional_fullscreen no
|
|
|
|
macos_show_window_title_in all
|
|
|
|
macos_custom_beam_cursor no
|
|
|
|
linux_display_server auto
|
|
|
|
kitty_mod ctrl+shift
|
|
|
|
clear_all_shortcuts no
|
|
map kitty_mod+c copy_to_clipboard
|
|
map kitty_mod+v paste_from_clipboard
|
|
map kitty_mod+up scroll_line_up
|
|
map kitty_mod+down scroll_line_down
|
|
map kitty_mod+page_up scroll_page_up
|
|
map kitty_mod+page_down scroll_page_down
|
|
map kitty_mod+home scroll_home
|
|
map kitty_mod+end scroll_end
|
|
map kitty_mod+h show_scrollback
|
|
map kitty_mod+w close_window
|
|
map kitty_mod+] next_window
|
|
map kitty_mod+[ previous_window
|
|
map kitty_mod+f move_window_forward
|
|
map kitty_mod+b move_window_backward
|
|
map kitty_mod+` move_window_to_top
|
|
map kitty_mod+r start_resizing_window
|
|
map kitty_mod+1 first_window
|
|
map kitty_mod+2 second_window
|
|
map kitty_mod+3 third_window
|
|
map kitty_mod+4 fourth_window
|
|
map kitty_mod+5 fifth_window
|
|
map kitty_mod+6 sixth_window
|
|
map kitty_mod+7 seventh_window
|
|
map kitty_mod+8 eighth_window
|
|
map kitty_mod+9 ninth_window
|
|
map kitty_mod+0 tenth_window
|
|
map kitty_mod+right next_tab
|
|
map kitty_mod+left previous_tab
|
|
map kitty_mod+t new_tab
|
|
map kitty_mod+q close_tab
|
|
map shift+cmd+w close_os_window
|
|
map kitty_mod+. move_tab_forward
|
|
map kitty_mod+, move_tab_backward
|
|
map kitty_mod+alt+t set_tab_title
|
|
map kitty_mod+l next_layout
|
|
map kitty_mod+equal change_font_size all +2.0
|
|
map kitty_mod+minus change_font_size all -2.0
|
|
map kitty_mod+backspace change_font_size all 0
|
|
map kitty_mod+e kitten hints
|
|
map kitty_mod+p>f kitten hints --type path --program -
|
|
map kitty_mod+p>shift+f kitten hints --type path
|
|
map kitty_mod+p>l kitten hints --type line --program -
|
|
map kitty_mod+p>w kitten hints --type word --program -
|
|
map kitty_mod+p>h kitten hints --type hash --program -
|
|
map kitty_mod+p>n kitten hints --type linenum
|
|
map kitty_mod+p>y kitten hints --type hyperlink
|
|
map kitty_mod+f11 toggle_fullscreen
|
|
map kitty_mod+f10 toggle_maximized
|
|
map kitty_mod+u kitten unicode_input
|
|
map kitty_mod+f2 edit_config_file
|
|
map kitty_mod+escape kitty_shell window
|
|
map kitty_mod+a>m set_background_opacity +0.1
|
|
map kitty_mod+a>l set_background_opacity -0.1
|
|
map kitty_mod+a>1 set_background_opacity 1
|
|
map kitty_mod+a>d set_background_opacity default
|
|
map kitty_mod+delete clear_terminal reset active
|
|
map kitty_mod+f5 load_config_file
|
|
map kitty_mod+f6 debug_config
|
|
|
|
include ~/.config/kitty/themes/kittytheme.conf
|
|
|
|
KITTYCONFIG
|
|
|
|
else
|
|
echo "Kitty config already exists."
|
|
fi
|
|
|
|
echo -e "${GREEN}Kitty Theme.conf Start${NC}"
|
|
|
|
if [ ! -f $HOME/.config/kitty/themes/kittytheme.conf ]; then
|
|
mkdir -p $HOME/.config/kitty/themes
|
|
cat << "KITTYTHEMECONF" > $HOME/.config/kitty/themes/kittytheme.conf
|
|
# vim:ft=kitty
|
|
|
|
## name: Catppuccin Kitty Mocha
|
|
## author: Catppuccin Org
|
|
## license: MIT
|
|
## upstream: https://github.com/catppuccin/kitty/blob/main/themes/mocha.conf
|
|
## blurb: Soothing pastel theme for the high-spirited!
|
|
|
|
|
|
|
|
# The basic colors
|
|
foreground #cdd6f4
|
|
background #1e1e2e
|
|
selection_foreground #1e1e2e
|
|
selection_background #f5e0dc
|
|
|
|
# Cursor colors
|
|
cursor #f5e0dc
|
|
cursor_text_color #1e1e2e
|
|
|
|
# URL underline color when hovering with mouse
|
|
url_color #f5e0dc
|
|
|
|
# Kitty window border colors
|
|
active_border_color #b4befe
|
|
inactive_border_color #6c7086
|
|
bell_border_color #f9e2af
|
|
|
|
# OS Window titlebar colors
|
|
wayland_titlebar_color system
|
|
macos_titlebar_color system
|
|
|
|
# Tab bar colors
|
|
active_tab_foreground #11111b
|
|
active_tab_background #cba6f7
|
|
inactive_tab_foreground #cdd6f4
|
|
inactive_tab_background #181825
|
|
tab_bar_background #11111b
|
|
|
|
# Colors for marks (marked text in the terminal)
|
|
mark1_foreground #1e1e2e
|
|
mark1_background #b4befe
|
|
mark2_foreground #1e1e2e
|
|
mark2_background #cba6f7
|
|
mark3_foreground #1e1e2e
|
|
mark3_background #74c7ec
|
|
|
|
# The 16 terminal colors
|
|
|
|
# black
|
|
color0 #45475a
|
|
color8 #585b70
|
|
|
|
# red
|
|
color1 #f38ba8
|
|
color9 #f38ba8
|
|
|
|
# green
|
|
color2 #a6e3a1
|
|
color10 #a6e3a1
|
|
|
|
# yellow
|
|
color3 #f9e2af
|
|
color11 #f9e2af
|
|
|
|
# blue
|
|
color4 #89b4fa
|
|
color12 #89b4fa
|
|
|
|
# magenta
|
|
color5 #f5c2e7
|
|
color13 #f5c2e7
|
|
|
|
# cyan
|
|
color6 #94e2d5
|
|
color14 #94e2d5
|
|
|
|
# white
|
|
color7 #bac2de
|
|
color15 #a6adc8
|
|
|
|
|
|
KITTYTHEMECONF
|
|
|
|
else
|
|
echo "kittytheme.conf file already exists."
|
|
fi
|
|
|
|
echo -e "${GREEN}Kitty config file END${NC}"
|
|
|
|
# Add User NOPASSWD to shutdown now and reboot
|
|
echo "$USER ALL=(ALL) NOPASSWD: /sbin/shutdown now, /sbin/reboot" | sudo tee /etc/sudoers.d/$USER && sudo visudo -c -f /etc/sudoers.d/$USER
|
|
|
|
|
|
echo -e "${GREEN}Wallpapers${NC}"
|
|
|
|
if [ ! -d ~/Wallpapers ]; then
|
|
mkdir -p ~/Wallpapers
|
|
wget -O ~/Wallpapers/default_wallpaper.jpg https://github.com/ITmail-dk/qmade/blob/main/default_wallpaper_by_natalia-y_on_unsplash.jpg?raw=true
|
|
|
|
else
|
|
echo "Wallpapers folder already exists."
|
|
fi
|
|
|
|
#if [ -f ~/.fehbg ]; then
|
|
# . ~/.fehbg
|
|
#else
|
|
# feh --bg-scale ~/Wallpapers/default_wallpaper.jpg
|
|
#fi
|
|
|
|
echo -e "${YELLOW} auto-new-wallpaper-and-colors BIN START ${NC}"
|
|
sudo bash -c 'cat << "AUTONEWWALLPAPERANDCOLORSBIN" >> /usr/local/bin/auto-new-wallpaper-and-colors
|
|
#!/bin/bash
|
|
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$HOME/.local/bin
|
|
|
|
if [ ! -f "$HOME/.config/extract_colors.py" ]; then
|
|
echo "$HOME/.config/extract_colors.py not found! Please ensure the Python script is in the same directory."
|
|
exit 1
|
|
fi
|
|
|
|
RWALLP="$(find $HOME/Wallpapers -type f | shuf -n 1)"
|
|
|
|
notify-send -u low "Automatically new background and color theme" "Please wait while we find a new background image and some colors to match"
|
|
|
|
python3 $HOME/.config/extract_colors.py $RWALLP
|
|
feh --bg-scale $RWALLP
|
|
qtile cmd-obj -o cmd -f reload_config
|
|
kitty +kitten themes --reload-in=all Kittytheme
|
|
|
|
notify-send -u low "Automatically new background and color theme" "The background image and colors has been updated."
|
|
|
|
AUTONEWWALLPAPERANDCOLORSBIN'
|
|
|
|
sudo chmod +x /usr/local/bin/auto-new-wallpaper-and-colors
|
|
|
|
echo -e "${YELLOW} auto-new-wallpaper-and-colors BIN END ${NC}"
|
|
|
|
|
|
# Extract New-Colors file
|
|
if [ ! -f ~/.config/extract_colors.py ]; then
|
|
cat << "EXTRACTCOLORS" > ~/.config/extract_colors.py
|
|
import sys
|
|
import os
|
|
import colorgram
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
def rgb_to_hex(rgb):
|
|
return '#{:02x}{:02x}{:02x}'.format(rgb[0], rgb[1], rgb[2])
|
|
|
|
def luminance(rgb):
|
|
r, g, b = rgb[0]/255.0, rgb[1]/255.0, rgb[2]/255.0
|
|
a = [r, g, b]
|
|
for i in range(len(a)):
|
|
if a[i] <= 0.03928:
|
|
a[i] = a[i] / 12.92
|
|
else:
|
|
a[i] = ((a[i] + 0.055) / 1.055) ** 2.4
|
|
return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]
|
|
|
|
def choose_text_color(background_color):
|
|
if luminance(background_color) > 0.5:
|
|
return (0, 0, 0) # dark text for light background
|
|
else:
|
|
return (255, 255, 255) # light text for dark background
|
|
|
|
def create_color_grid(colors, base16_colors, filename='color_grid.png'):
|
|
grid_size = 4 # 4x4 grid
|
|
square_size = 150 # Size of each small square
|
|
img_size = square_size * grid_size # Calculate total image size
|
|
|
|
img = Image.new('RGB', (img_size, img_size))
|
|
draw = ImageDraw.Draw(img)
|
|
|
|
# Load a font
|
|
try:
|
|
font = ImageFont.truetype("arial.ttf", 30)
|
|
except IOError:
|
|
font = ImageFont.load_default()
|
|
|
|
# Fill the grid with colors and add text labels
|
|
for i, (key, value) in enumerate(base16_colors.items()):
|
|
x = (i % grid_size) * square_size
|
|
y = (i // grid_size) * square_size
|
|
draw.rectangle([x, y, x + square_size, y + square_size], fill=value)
|
|
# Choose text color based on background color luminance
|
|
text_color = choose_text_color(tuple(int(value[i:i+2], 16) for i in (1, 3, 5)))
|
|
# Add text label
|
|
text_position = (x + 10, y + 10)
|
|
draw.text(text_position, key, fill=text_color, font=font)
|
|
|
|
img.save(filename)
|
|
|
|
|
|
def main(image_path):
|
|
colors = colorgram.extract(image_path, 16)
|
|
|
|
# Ensure there are exactly 16 colors by duplicating if necessary
|
|
while len(colors) < 16:
|
|
colors.append(colors[len(colors) % len(colors)])
|
|
|
|
# Sort colors by luminance
|
|
colors.sort(key=lambda col: luminance(col.rgb))
|
|
|
|
# Assign colors to Base16 scheme slots ensuring the tonal range
|
|
base16_colors = {
|
|
'base00': rgb_to_hex(colors[0].rgb),
|
|
'base01': rgb_to_hex(colors[5].rgb),
|
|
'base02': rgb_to_hex(colors[12].rgb),
|
|
'base03': rgb_to_hex(colors[9].rgb),
|
|
'base04': rgb_to_hex(colors[4].rgb),
|
|
'base05': rgb_to_hex(colors[10].rgb),
|
|
'base06': rgb_to_hex(colors[6].rgb),
|
|
'base07': rgb_to_hex(colors[14].rgb),
|
|
'base08': rgb_to_hex(colors[2].rgb),
|
|
'base09': rgb_to_hex(colors[3].rgb),
|
|
'base0A': rgb_to_hex(colors[1].rgb),
|
|
'base0B': rgb_to_hex(colors[11].rgb),
|
|
'base0C': rgb_to_hex(colors[8].rgb),
|
|
'base0D': rgb_to_hex(colors[13].rgb),
|
|
'base0E': rgb_to_hex(colors[7].rgb),
|
|
'base0F': rgb_to_hex(colors[15].rgb),
|
|
}
|
|
|
|
descriptions = [
|
|
"Default Background",
|
|
"Lighter Background (Used for status bars, line number and folding marks)",
|
|
"Selection Background",
|
|
"Comments, Invisibles, Line Highlighting",
|
|
"Dark Foreground (Used for status bars)",
|
|
"Default Foreground, Caret, Delimiters, Operators",
|
|
"Light Foreground (Not often used)",
|
|
"Light Background (Not often used)",
|
|
"Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted",
|
|
"Integers, Boolean, Constants, XML Attributes, Markup Link Url",
|
|
"Classes, Markup Bold, Search Text Background",
|
|
"Strings, Inherited Class, Markup Code, Diff Inserted",
|
|
"Support, Regular Expressions, Escape Characters, Markup Quotes",
|
|
"Functions, Methods, Attribute IDs, Headings",
|
|
"Keywords, Storage, Selector, Markup Italic, Diff Changed",
|
|
"Deprecated, Opening/Closing Embedded Language Tags",
|
|
]
|
|
|
|
# Ensure the directory exists
|
|
qtile_config_dir = os.path.expanduser('~/.config/qtile/')
|
|
os.makedirs(qtile_config_dir, exist_ok=True)
|
|
|
|
# Path to the output file
|
|
output_file_path = os.path.join(qtile_config_dir, 'qtile_colors.py')
|
|
|
|
# Write the colors to the Python file
|
|
with open(output_file_path, 'w') as f:
|
|
f.write("colors = {\n")
|
|
for key, value in base16_colors.items():
|
|
description = descriptions.pop(0)
|
|
f.write(f' "{key}": "{value}", # {description}\n')
|
|
f.write("}\n")
|
|
|
|
# Ensure the directory exists
|
|
kitty_config_dir = os.path.expanduser('~/.config/kitty/themes/')
|
|
os.makedirs(kitty_config_dir, exist_ok=True)
|
|
|
|
# Path to the output file
|
|
output_file_path = os.path.join(kitty_config_dir, 'kittytheme.conf')
|
|
|
|
with open(output_file_path, 'w') as f:
|
|
f.write(f'background {base16_colors["base00"]}\n')
|
|
f.write(f'foreground {base16_colors["base0F"]}\n')
|
|
for index, (_, value) in enumerate(base16_colors.items()):
|
|
f.write(f'color{index} {value}\n')
|
|
# Create a PNG file with the extracted colors and labels
|
|
create_color_grid(colors, base16_colors)
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 2:
|
|
print("Usage: extract_colors.py <image_path>")
|
|
else:
|
|
main(sys.argv[1])
|
|
|
|
EXTRACTCOLORS
|
|
|
|
else
|
|
echo "File ~/.config/extract_colors.py already exists."
|
|
fi
|
|
|
|
|
|
# Fonts - https://www.nerdfonts.com/font-downloads
|
|
|
|
# IBM Plex Mono
|
|
|
|
font_name=IBMPlexMono
|
|
curl -OL "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/$font_name.zip"
|
|
mkdir -p "$HOME/.fonts"
|
|
unzip "$font_name.zip" -d "$HOME/.fonts/$font_name/"
|
|
fc-cache -fv
|
|
rm $font_name.zip
|
|
|
|
|
|
|
|
# END
|
|
cd ~
|
|
|
|
echo -e "${GREEN}Installation complete ready to restart.${NC}"
|