2023 lines
67 KiB
Bash
2023 lines
67 KiB
Bash
#!/bin/bash
|
|
# Qtile Martin Andersen Desktop Environment, Qmade for short.! install - ITmail.dk
|
|
|
|
# bash -c "$(wget -O- https://raw.githubusercontent.com/ITmail-dk/qmade/main/install.sh)"
|
|
# sudo DEBIAN_FRONTEND=noninteractive apt install -y git && git clone https://github.com/ITmail-dk/qmade && cd qmade && . install.sh
|
|
|
|
# Resource links to source
|
|
# https://qtile.org
|
|
|
|
# Rofi - Run menu
|
|
# https://github.com/ericmurphyxyz/rofi-wifi-menu
|
|
|
|
# autorandr
|
|
# Autorandr “fingerprints” displays connected to the system and associate them
|
|
# with their current X11 server settings in “profiles” which are automatically applied each time a fingerprint is matched.
|
|
# Use "arandr" to set the Screens as you want them and then save them to a profile with "autorandr --save PROFILENAME"
|
|
|
|
# autorandr --save PROFILENAME
|
|
# autorandr --remove PROFILENAME
|
|
# autorandr --default PROFILENAME
|
|
|
|
# fwupd "Firmware update daemon" - https://github.com/fwupd/fwupd
|
|
# fwupdmgr get-devices && fwupdmgr refresh
|
|
# fwupdmgr get-updates && fwupdmgr update
|
|
|
|
# fzf "general-purpose command-line fuzzy finder"
|
|
# https://github.com/junegunn/fzf
|
|
# nano $(fzf --preview='cat {}')
|
|
|
|
# nsxiv "Neo (or New or Not) Simple (or Small or Suckless) X Image Viewer" - https://github.com/nsxiv/nsxiv
|
|
|
|
# Neovim (nvim) - https://neovim.io/ - https://neovim.io/doc/user/vimindex.html
|
|
# Vim commands you NEED TO KNOW https://www.youtube.com/watch?v=RSlrxE21l_k
|
|
|
|
# LazyVim - Can be used after Neovim >= 0.9.0 - https://github.com/LazyVim/LazyVim
|
|
# https://github.com/folke/lazy.nvim
|
|
|
|
|
|
|
|
# Start the install *_:*:_*:*:_*_*:*:_*::*_*::*_*:_*::*_*:*:_:*:*_*:*:_*:*_:*:#
|
|
|
|
# Whiptail colors
|
|
export NEWT_COLORS='
|
|
root=white,gray
|
|
window=white,lightgray
|
|
border=black,lightgray
|
|
shadow=white,black
|
|
button=white,blue
|
|
actbutton=black,red
|
|
compactbutton=black,
|
|
title=black,
|
|
roottext=black,magenta
|
|
textbox=black,lightgray
|
|
acttextbox=gray,white
|
|
entry=lightgray,gray
|
|
disentry=gray,lightgray
|
|
checkbox=black,lightgray
|
|
actcheckbox=white,blue
|
|
emptyscale=,black
|
|
fullscale=,red
|
|
listbox=black,lightgray
|
|
actlistbox=lightgray,gray
|
|
actsellistbox=white,blue'
|
|
|
|
# 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"
|
|
|
|
clear
|
|
|
|
# Check User Sudo Access
|
|
#check_sudo_access() {
|
|
# if sudo -n true 2>/dev/null; then
|
|
# return 0
|
|
# else
|
|
# return 1
|
|
# fi
|
|
#}
|
|
|
|
#if check_sudo_access; then
|
|
# echo "User has SUDO Access, installation continues..."
|
|
#else
|
|
# echo -e "${RED} ${NC}"
|
|
# echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'- ${NC}"
|
|
# echo -e "${RED} ${NC}"
|
|
# echo -e "${RED} ERROR: This installation must be run by a normal user with SUDO Access. ${NC}"
|
|
# echo -e "${RED} ${NC}"
|
|
# echo -e "${RED} So Add your user to sudo with this Command,from a user who has sudo access ${NC}"
|
|
# echo -e "${RED} sudo usermod -aG sudo USERNAME ${NC}"
|
|
# echo -e "${RED} ${NC}"
|
|
# echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'- ${NC}"
|
|
# echo -e "${RED} ${NC}"
|
|
# exit 1
|
|
#fi
|
|
# Check User Sudo Access Done
|
|
clear
|
|
|
|
if ! dpkg -s whiptail >/dev/null 2>&1; then
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} "
|
|
echo -e "${RED} Preparation before starting the installation..."
|
|
echo -e "${RED} Enter your user password, to continue if necessary"
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} ${NC}"
|
|
sudo apt update
|
|
sudo apt install -y whiptail
|
|
else
|
|
echo -e "${YELLOW} Preparation before starting the installation... done ;-) ${NC}"
|
|
fi
|
|
|
|
clear
|
|
|
|
|
|
# Installation start screen
|
|
FULLUSERNAME=$(awk -v user="$USER" -F":" 'user==$1{print $5}' /etc/passwd | rev | cut -c 4- | rev)
|
|
|
|
if (whiptail --title "Installation of the Martin Qtile Desktop" --yesno "Hi $FULLUSERNAME do you want to start \nthe installation of Qtile Martin Andersen Desktop Environment, Qmade for short.! \n \nRemember you user must have sudo \naccess to run the installation." 13 50); then
|
|
echo -e "${GREEN} Okay, let's start the installation"
|
|
else
|
|
exit 1
|
|
fi
|
|
|
|
|
|
echo -e "${YELLOW} Install selection choose what to install Start ${NC}"
|
|
|
|
PROGRAMS=$(whiptail --title "The Install selection" --checklist --separate-output \
|
|
"Choose what to install:" 20 78 15 \
|
|
"1" "Do you want to install Libre Office" OFF \
|
|
"2" "Is this a laptop we are installing on!" OFF \
|
|
"3" "Install XRDP Server" OFF \
|
|
"4" "Install XfreeRDP Client" OFF \
|
|
"5" "Install Google Chrome Webbrowser" ON \
|
|
"6" "Install Firefox Webbrowser" OFF \
|
|
"7" "Install SMB/CIFS Storage Client" ON \
|
|
"8" "Install NFS Storage Client" OFF \
|
|
"9" "Install Ceph Storage Client" OFF \
|
|
"10" "Install VS Code Editor" OFF \
|
|
"11" "Install Neovim Text Editor" ON 3>&1 1>&2 2>&3)
|
|
|
|
# See the actual installation below - Install selection choose what to install End
|
|
|
|
PROGRAMS_EXIT_STATUS=$?
|
|
clear
|
|
|
|
if [ $PROGRAMS_EXIT_STATUS != 0 ]; then
|
|
echo -e "${RED} Installation Cancel - You have now stopped the installation. ${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
|
|
clear
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} "
|
|
echo -e "${RED} Preparation before 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 ! dpkg -s apt-transport-https >/dev/null 2>&1; then
|
|
sudo apt install -y apt-transport-https
|
|
sudo sed -i 's+http:+https:+g' /etc/apt/sources.list
|
|
else
|
|
echo "apt-transport-https is already installed."
|
|
fi
|
|
|
|
# APT Add "contrib non-free" to the sources list
|
|
if [ -f /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
|
|
sudo sed -i 's/^deb.* main/& contrib non-free/g' /etc/apt/sources.list
|
|
fi
|
|
|
|
clear
|
|
sudo apt update
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# 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 "${YELLOW} Core System APT install ${NC}"
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install apt -y --ignore-missing install xserver-xorg x11-utils xinit arandr autorandr picom fwupd mesa-utils htop wget curl git tmux numlockx kitty cups xsensors xbacklight brightnessctl unzip network-manager dunst libnotify-bin notify-osd xautolock xsecurelock pm-utils rofi imagemagick nitrogen nsxiv mpv flameshot speedcrunch mc thunar gvfs-backends parted gparted mpd mpc ncmpcpp fzf ccrypt xarchiver notepadqq fontconfig fontconfig-config fonts-liberation fonts-dejavu-core fonts-freefont-ttf fonts-noto-core libfontconfig1 fonts-arkpandora pipewire pipewire-pulse wireplumber pipewire-alsa libspa-0.2-bluetooth pavucontrol alsa-utils qpwgraph sddm-theme-maui ffmpeg
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install apt -y install linux-headers-$(uname -r)
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install apt -y install sddm --no-install-recommends
|
|
|
|
clear
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Audio Start - https://alsa.opensrc.org - https://wiki.debian.org/ALSA ${NC}"
|
|
# See hardware run: "pacmd list-sinks" or "lspci | grep -i audio" or... sudo dmesg | grep 'snd\|firmware\|audio'
|
|
# Run.: "pw-cli info" provides detailed information about the PipeWire nodes and devices, including ALSA devices.
|
|
# Test file run: "aplay /usr/share/sounds/alsa/Front_Center.wav"
|
|
# sudo adduser $USER audio
|
|
|
|
|
|
# PipeWire Sound Server "Audio" - https://pipewire.org/
|
|
systemctl enable --user --now pipewire.socket pipewire-pulse.socket wireplumber.service
|
|
|
|
# More Audio tools
|
|
# sudo DEBIAN_FRONTEND=noninteractive apt install -y alsa-tools
|
|
|
|
# PulseAudio
|
|
# sudo DEBIAN_FRONTEND=noninteractive apt install -y pulseaudio
|
|
# systemctl --user enable pulseaudio
|
|
|
|
# sudo alsactl init
|
|
|
|
echo -e "${YELLOW} Audio End ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} 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 DEBIAN_FRONTEND=noninteractive 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 DEBIAN_FRONTEND=noninteractive apt install apt install -y amd64-microcode
|
|
fi
|
|
else
|
|
echo -e "${GREEN} Amd64 Microcode OK ${NC}"
|
|
fi
|
|
unset LC_ALL # unset the LC_ALL=C
|
|
echo -e "${YELLOW} CPU Microcode install END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
echo -e "${YELLOW} 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 clean && sudo apt autoremove -y"' >> ~/.bashrc
|
|
echo 'bind '"'"'"\C-f":"open "$(fzf)"\n"'"'" >> ~/.bashrc
|
|
echo 'alias qtileconfig="nano ~/.config/qtile/config.py"' >> ~/.bashrc
|
|
echo 'alias qtileconfig-test="python3 .config/qtile/config.py"' >> ~/.bashrc
|
|
echo 'alias qtileconfig-test-venv="source .local/src/qtile_venv/bin/activate && python3 .config/qtile/config.py && deactivate"' >> ~/.bashrc
|
|
#echo "bind 'set show-all-if-ambiguous on'" >> ~/.bashrc
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
echo -e "${YELLOW} 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
|
|
|
|
# Picom (Yshui) install
|
|
#sudo DEBIAN_FRONTEND=noninteractive apt install -y libconfig-dev libdbus-1-dev libegl-dev libev-dev libgl-dev libepoxy-dev libpcre2-dev libpixman-1-dev libx11-xcb-dev libxcb1-dev libxcb-composite0-dev libxcb-damage0-dev libxcb-dpms0-dev libxcb-glx0-dev libxcb-image0-dev libxcb-present-dev libxcb-randr0-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-util-dev libxcb-xfixes0-dev libxext-dev meson ninja-build uthash-dev
|
|
#cd /tmp/
|
|
#git clone https://github.com/yshui/picom
|
|
#cd picom
|
|
#meson setup --buildtype=release build && ninja -C build && sudo ninja -C build install
|
|
|
|
#mkdir -p ~/.config/picom
|
|
#cp picom.sample.conf ~/.config/picom/picom.conf
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Qtile Core Dependencies apt install ${NC}"
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y feh python3-full python3-pip python3-venv libxkbcommon-dev libxkbcommon-x11-dev libcairo2-dev pkg-config
|
|
|
|
# Colorgram for auto-generated color themes
|
|
pip install colorgram.py --break-system-packages
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Install Qtile from source via github and Pip ${NC}"
|
|
cd ~
|
|
mkdir -p ~/.local/bin
|
|
mkdir -p ~/.local/src && cd ~/.local/src
|
|
|
|
# Git src install ----------------------------------------------------------
|
|
#if [ -d qtile ]; then
|
|
# rm -rf qtile
|
|
#fi
|
|
|
|
#git clone https://github.com/qtile/qtile.git
|
|
#cd qtile
|
|
|
|
#pip install dbus-next psutil wheel --break-system-packages
|
|
#pip install -r ~/.local/src/qtile/requirements.txt --break-system-packages
|
|
|
|
#pip install . --break-system-packages --no-warn-script-location
|
|
|
|
|
|
# Python3 venv install -----------------------------------------------------
|
|
|
|
python3 -m venv qtile_venv && cd qtile_venv
|
|
|
|
if [ -d qtile ]; then
|
|
rm -rf qtile
|
|
fi
|
|
|
|
git clone https://github.com/qtile/qtile.git
|
|
|
|
source bin/activate
|
|
pip install dbus-next psutil wheel
|
|
pip install -r qtile/requirements.txt
|
|
bin/pip install qtile/.
|
|
deactivate
|
|
|
|
cp ~/.local/src/qtile_venv/bin/qtile ~/.local/bin/
|
|
|
|
# ------------------------------------------------------------------------
|
|
|
|
sudo mkdir -p /usr/share/xsessions/
|
|
sudo bash -c 'cat << "QTILEDESKTOP" >> /usr/share/xsessions/qtile.desktop
|
|
[Desktop Entry]
|
|
Name=Qtile
|
|
Comment=Qtile Session
|
|
Exec=qtile start
|
|
Type=Application
|
|
Keywords=wm;tiling
|
|
QTILEDESKTOP'
|
|
|
|
# Add .xsession
|
|
touch ~/.xsession && echo "qtile start" > ~/.xsession
|
|
|
|
# Qtile Autostart.sh file
|
|
mkdir -p ~/.config/qtile/
|
|
if [ ! -f ~/.config/qtile/autostart.sh ]; then
|
|
cat << "QTILEAUTOSTART" > ~/.config/qtile/autostart.sh
|
|
#!/bin/sh
|
|
pgrep -x picom > /dev/null || picom -b &
|
|
autorandr --change &&
|
|
|
|
# This here if statement sets your background image, with feh...
|
|
# and is also used for the auto-generation of the background image and colors.
|
|
if [ -f ~/.fehbg ]; then
|
|
. ~/.fehbg
|
|
else
|
|
feh --bg-scale ~/Wallpapers/default_wallpaper_by_natalia-y_on_unsplash.jpg
|
|
fi
|
|
|
|
wpctl set-volume @DEFAULT_AUDIO_SINK@ 10% &
|
|
dunst &
|
|
numlockx on &
|
|
mpd &
|
|
xrdb ~/.Xresources &
|
|
#nitrogen --restore &
|
|
|
|
# lock computer automatically after X time of minutes.
|
|
xautolock -time 120 -locker "xsecurelock" -detectsleep -secure &
|
|
|
|
QTILEAUTOSTART
|
|
|
|
chmod +x ~/.config/qtile/autostart.sh
|
|
|
|
else
|
|
echo "File autostart.sh already exists."
|
|
fi
|
|
|
|
# Qtile Colors.sh file
|
|
if [ ! -f ~/.config/qtile/qtile_colors.py ]; then
|
|
cat << "QTILECOLORS" > ~/.config/qtile/qtile_colors.py
|
|
colors = {
|
|
"base00": "#1b0200", # Default Background
|
|
"base01": "#240002", # Lighter Background (Used for status bars, line number and folding marks)
|
|
"base02": "#d74d00", # Selection Background
|
|
"base03": "#d74d00", # Comments, Invisibles, Line Highlighting
|
|
"base04": "#9c2101", # Dark Foreground (Used for status bars)
|
|
"base05": "#d74d00", # Default Foreground, Caret, Delimiters, Operators
|
|
"base06": "#d74d00", # Light Foreground (Not often used)
|
|
"base07": "#d74d00", # Light Background (Not often used)
|
|
"base08": "#d74d00", # Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
|
|
"base09": "#830508", # Integers, Boolean, Constants, XML Attributes, Markup Link Url
|
|
"base0A": "#d74d00", # Classes, Markup Bold, Search Text Background
|
|
"base0B": "#d74d00", # Strings, Inherited Class, Markup Code, Diff Inserted
|
|
"base0C": "#9a292f", # Support, Regular Expressions, Escape Characters, Markup Quotes
|
|
"base0D": "#e46324", # Functions, Methods, Attribute IDs, Headings
|
|
"base0E": "#ea6f10", # Keywords, Storage, Selector, Markup Italic, Diff Changed
|
|
"base0F": "#ee712d", # Deprecated, Opening/Closing Embedded Language Tags
|
|
}
|
|
QTILECOLORS
|
|
|
|
else
|
|
echo "File qtile_colors.py already exists."
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# 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 "${YELLOW} MPD Setup & config START ${NC}"
|
|
|
|
mkdir -p ~/.config/mpd/playlists
|
|
mkdir -p ~/.local/state/mpd
|
|
if [ ! -f ~/.config/mpd/mpd.conf ]; then
|
|
touch ~/.config/mpd/database
|
|
cat << MPDCONFIG > ~/.config/mpd/mpd.conf
|
|
# ~/.config/mpd/mpd.conf or /etc/mpd.conf
|
|
# Example: /usr/share/doc/mpd/mpdconf.example
|
|
|
|
# Recommended location for database
|
|
db_file "~/.config/mpd/database"
|
|
|
|
# If running mpd using systemd, delete this line to log directly to systemd.
|
|
# syslog or ~/.config/mpd/log
|
|
log_file "~/.config/mpd/log"
|
|
|
|
# The music directory is by default the XDG directory, uncomment to amend and choose a different directory
|
|
#music_directory "~/Music"
|
|
|
|
# MPD Server network
|
|
bind_to_address "127.0.0.1"
|
|
port "6600"
|
|
|
|
# Suppress all messages below the given threshold. Use "verbose" for
|
|
# troubleshooting. Available setting arguments are "notice", "info", "verbose", "warning" and "error".
|
|
log_level "error"
|
|
|
|
# Setting "restore_paused" to "yes" puts MPD into pause mode instead of starting playback after startup.
|
|
restore_paused "yes"
|
|
|
|
# Uncomment to refresh the database whenever files in the music_directory are changed
|
|
auto_update "yes"
|
|
|
|
# Uncomment to enable the functionalities
|
|
playlist_directory "~/.config/mpd/playlists"
|
|
pid_file "~/.config/mpd/pid"
|
|
state_file "~/.local/state/mpd/state"
|
|
sticker_file "~/.config/mpd/sticker.sql"
|
|
follow_inside_symlinks "yes"
|
|
# save_absolute_paths_in_playlists "no"
|
|
|
|
|
|
decoder {
|
|
plugin "wildmidi"
|
|
config_file "/etc/timidity/timidity.cfg"
|
|
enabled "no"
|
|
}
|
|
|
|
# Audio output
|
|
|
|
audio_output {
|
|
type "pipewire"
|
|
name "PipeWire Sound Server"
|
|
enabled "yes"
|
|
}
|
|
audio_output {
|
|
type "pulse"
|
|
name "Local PulseAudio Server"
|
|
enabled "no"
|
|
}
|
|
|
|
MPDCONFIG
|
|
|
|
else
|
|
echo "mpd.conf already exists."
|
|
fi
|
|
|
|
# sudo systemctl enable mpd
|
|
#systemctl enable --now --user mpd.service
|
|
#systemctl enable --now --user mpd
|
|
# systemctl status mpd.service
|
|
|
|
#systemctl enable --now --user mpd.socket
|
|
#systemctl enable --now --user mpd.service
|
|
|
|
# mpd --version
|
|
# mpd --stderr --no-daemon --verbose
|
|
# aplay --list-pcm
|
|
|
|
echo -e "${YELLOW} MPD END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
echo -e "${YELLOW} Nano config START ${NC}"
|
|
if [ ! -f ~/.nanorc ]; then
|
|
cp /etc/nanorc ~/.nanorc
|
|
sed -i 's/^# set linenumbers/set linenumbers/' ~/.nanorc
|
|
sed -i 's/^# set minibar/set minibar/' ~/.nanorc
|
|
sed -i 's/^# set softwrap/set softwrap/' ~/.nanorc
|
|
sed -i 's/^# set atblanks/set atblanks/' ~/.nanorc
|
|
else
|
|
echo "File .nanorc already exists."
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Wallpapers START ${NC}"
|
|
|
|
if [ ! -d ~/Wallpapers ]; then
|
|
mkdir -p ~/Wallpapers
|
|
echo -e "${GREEN} Download some wallpapers, Please wait..."
|
|
|
|
wget -O ~/Wallpapers/default_wallpaper_by_natalia-y_on_unsplash.jpg https://github.com/ITmail-dk/qmade/blob/main/default_wallpaper_by_natalia-y_on_unsplash.jpg?raw=true
|
|
|
|
# Download random wallpapers from https://unsplash.com
|
|
# Set the desired number of wallpapers to download
|
|
#count="9"
|
|
|
|
# Categories topics for the wallpapers like, minimalist-wallpapers "Remember to put a hyphen between the words"
|
|
#query="cool-colors-wallpapers"
|
|
|
|
# Downloading random wallpapers to ~/Wallpapers folder
|
|
#for ((i = 1; i <= count; i++)); do
|
|
# wget -qO "$HOME/Wallpapers/unsplash_${query}_${i}.jpg" "https://source.unsplash.com/random/3440x1440/?$query"
|
|
# done
|
|
|
|
#echo "Wallpapers downloaded successfully."
|
|
|
|
else
|
|
echo "Wallpapers folder already exists."
|
|
fi
|
|
|
|
# Nitrogen - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
# Download some wallpapers from https://unsplash.com/wallpapers
|
|
|
|
mkdir -p ~/.config/nitrogen
|
|
|
|
if [ ! -f ~/.config/nitrogen/bg-saved.cfg ]; then
|
|
touch ~/.config/nitrogen/bg-saved.cfg
|
|
echo "[xin_-1]" >> ~/.config/nitrogen/bg-saved.cfg
|
|
echo "file=$HOME/Wallpapers/default-wallpaper.jpg" >> ~/.config/nitrogen/bg-saved.cfg
|
|
echo "mode=5" >> ~/.config/nitrogen/bg-saved.cfg
|
|
echo "bgcolor=#2E3440" >> ~/.config/nitrogen/bg-saved.cfg
|
|
else
|
|
echo "Nitrogen config file already exists."
|
|
fi
|
|
|
|
if [ ! -f ~/.config/nitrogen/nitrogen.cfg ]; then
|
|
cat << "NITROGENCONFIG" > ~/.config/nitrogen/nitrogen.cfg
|
|
[geometry]
|
|
posx=5
|
|
posy=36
|
|
sizex=1908
|
|
sizey=1037
|
|
|
|
[nitrogen]
|
|
view=icon
|
|
recurse=true
|
|
sort=alpha
|
|
icon_caps=false
|
|
NITROGENCONFIG
|
|
|
|
echo "dirs=$HOME/Wallpapers/;" >> ~/.config/nitrogen/nitrogen.cfg
|
|
|
|
else
|
|
echo "Nitrogen config file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Wallpapers END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Neovim config Start ${NC}"
|
|
|
|
if [ ! -f ~/.config/nvim/init.vim ]; then
|
|
mkdir -p ~/.config/nvim
|
|
cat << "NEOVIMCONFIG" > ~/.config/nvim/init.vim
|
|
syntax on
|
|
set number
|
|
set numberwidth=5
|
|
set relativenumber
|
|
set ignorecase
|
|
NEOVIMCONFIG
|
|
|
|
else
|
|
echo "Neovim config file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Neovim config END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} 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
|
|
background #1b0200
|
|
foreground #ee712d
|
|
color0 #1b0200
|
|
color1 #240002
|
|
color2 #d74d00
|
|
color3 #d74d00
|
|
color4 #9c2101
|
|
color5 #d74d00
|
|
color6 #d74d00
|
|
color7 #d74d00
|
|
color8 #d74d00
|
|
color9 #830508
|
|
color10 #d74d00
|
|
color11 #d74d00
|
|
color12 #9a292f
|
|
color13 #e46324
|
|
color14 #ea6f10
|
|
color15 #ee712d
|
|
|
|
KITTYTHEMECONF
|
|
|
|
else
|
|
echo "kittytheme.conf file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Kitty theme.conf END ${NC}"
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Tmux config Start ${NC}"
|
|
|
|
if [ ! -f ~/.config/tmux/tmux.conf ]; then
|
|
mkdir -p ~/.config/tmux
|
|
cat << "TMUXCONFIG" > ~/.config/tmux/tmux.conf
|
|
unbind r
|
|
bind r source-file ~/.config/tmux/tmux.conf
|
|
|
|
TMUXCONFIG
|
|
|
|
else
|
|
echo "Tmux config file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Tmux config END ${NC}"
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
#echo -e "${YELLOW} Xresources config Start ${NC}"
|
|
|
|
#if [ ! -f ~/.Xresources ]; then
|
|
|
|
#cat << "XRCONFIG" > ~/.Xresources
|
|
|
|
#XRCONFIG
|
|
|
|
#else
|
|
# echo ".Xresources config file already exists."
|
|
#fi
|
|
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Themes START ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Nerd Fonts START - https://www.nerdfonts.com/font-downloads - https://www.nerdfonts.com/cheat-sheet - - - ${NC}"
|
|
if [ ! -d ~/.fonts ]; then
|
|
mkdir -p ~/.fonts
|
|
|
|
else
|
|
echo ".fonts already exists."
|
|
fi
|
|
|
|
# DejaVu Sans Mono font
|
|
wget -P /tmp/ https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/DejaVuSansMono.zip
|
|
unzip -q -n /tmp/DejaVuSansMono.zip -d ~/.fonts
|
|
|
|
# Space Mono
|
|
#wget -P /tmp/ https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/SpaceMono.zip
|
|
#unzip -q -n /tmp/SpaceMono.zip -d ~/.fonts
|
|
|
|
# Roboto Mono
|
|
#wget -P /tmp/ https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/RobotoMono.zip
|
|
#unzip -q -n /tmp/RobotoMono.zip -d ~/.fonts
|
|
|
|
# Fira Mono
|
|
#wget -P /tmp/ https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/FiraMono.zip
|
|
#unzip -q -n /tmp/FiraMono.zip -d ~/.fonts
|
|
|
|
rm -f ~/.fonts/*.md
|
|
rm -f ~/.fonts/*.txt
|
|
|
|
echo -e "${YELLOW} Nerd Fonts END - https://www.nerdfonts.com/font-downloads "
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# ls -d /usr/share/themes/*
|
|
# ls -d /usr/share/icons/*
|
|
# ls -d /usr/share/
|
|
# sudo nano /etc/gtk-3.0/settings.ini
|
|
# sudo nano /etc/gtk-2.0/gtkrc
|
|
|
|
# https://github.com/EliverLara/Nordic
|
|
|
|
sudo rm -rf /tmp/EliverLara-Nordic
|
|
sudo git clone https://github.com/EliverLara/Nordic /tmp/EliverLara-Nordic
|
|
sudo cp -r /tmp/EliverLara-Nordic /usr/share/themes/
|
|
|
|
#sudo mkdir -p /usr/share/sddm/themes/debian-theme/
|
|
#sudo cp -r /tmp/EliverLara-Nordic/kde/sddm/Nordic-darker/* /usr/share/sddm/themes/debian-theme/
|
|
|
|
# Nordzy-cursors --------------------------------------------------------
|
|
|
|
# https://github.com/alvatip/Nordzy-cursors
|
|
|
|
cd /tmp/
|
|
if [ -d Nordzy-cursors ]; then
|
|
sudo rm -rf Nordzy-cursors
|
|
fi
|
|
|
|
git clone https://github.com/alvatip/Nordzy-cursors
|
|
cd Nordzy-cursors
|
|
sudo ./install.sh
|
|
cd /tmp/
|
|
|
|
# .Xresources
|
|
# Xcursor.theme: Nordzy-cursors
|
|
# Xcursor.size: 22
|
|
|
|
# Nordzy-icon --------------------------------------------------------
|
|
# https://github.com/alvatip/Nordzy-icon
|
|
|
|
cd /tmp/
|
|
|
|
if [ -d Nordzy-icon ]; then
|
|
sudo rm -rf Nordzy-icon
|
|
fi
|
|
|
|
git clone https://github.com/alvatip/Nordzy-icon
|
|
cd Nordzy-icon/
|
|
sudo ./install.sh
|
|
cd /tmp/
|
|
|
|
|
|
# GTK Settings START --------------------------------------------------------
|
|
# /etc/gtk-3.0/settings.ini
|
|
# https://docs.gtk.org/gtk4/property.Settings.gtk-cursor-theme-name.html
|
|
if [ ! -d /etc/gtk-3.0 ]; then
|
|
sudo kdir -p /etc/gtk-3.0
|
|
|
|
else
|
|
echo "/etc/gtk-3.0 already exists."
|
|
fi
|
|
|
|
sudo bash -c 'cat << "GTK3SETTINGS" >> /etc/gtk-3.0/settings.ini
|
|
[Settings]
|
|
gtk-theme-name=EliverLara-Nordic
|
|
gtk-fallback-icon-theme=default
|
|
gtk-toolbar-style=GTK_TOOLBAR_BOTH
|
|
gtk-font-name=DejaVu Sans Mono 10
|
|
gtk-application-prefer-dark-theme=1
|
|
gtk-cursor-theme-name=Nordzy-cursors
|
|
gtk-cursor-theme-size=0
|
|
gtk-icon-theme-name=Nordzy-icon
|
|
gtk-enable-event-sounds=0
|
|
gtk-enable-input-feedback-sounds=0
|
|
GTK3SETTINGS'
|
|
|
|
if [ ! -d /etc/gtk-4.0 ]; then
|
|
sudo mkdir -p /etc/gtk-4.0
|
|
|
|
else
|
|
echo "/etc/gtk-4.0 already exists."
|
|
fi
|
|
|
|
sudo bash -c 'cat << "GTK4SETTINGS" >> /etc/gtk-4.0/settings.ini
|
|
[Settings]
|
|
gtk-theme-name=EliverLara-Nordic
|
|
gtk-fallback-icon-theme=default
|
|
gtk-toolbar-style=GTK_TOOLBAR_BOTH
|
|
gtk-font-name=DejaVu Sans Mono 10
|
|
gtk-application-prefer-dark-theme=1
|
|
gtk-cursor-theme-name=Nordzy-cursors
|
|
gtk-cursor-theme-size=0
|
|
gtk-icon-theme-name=Nordzy-icon
|
|
gtk-enable-event-sounds=0
|
|
gtk-enable-input-feedback-sounds=0
|
|
GTK4SETTINGS'
|
|
|
|
|
|
sudo sed -i 's/Adwaita/Nordzy-cursors/g' /usr/share/icons/default/index.theme
|
|
|
|
# GTK Settings END --------------------------
|
|
|
|
sudo fc-cache -fv
|
|
|
|
echo -e "${YELLOW} Themes END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} xrandr-set-max + Xsession START ${NC}"
|
|
|
|
if [ ! -f /usr/local/bin/xrandr-set-max ]; then
|
|
# Define the content of the script
|
|
xrandrsetmaxcontent=$(cat << "XRANDRSETMAX"
|
|
#!/bin/bash
|
|
|
|
# Get the names of all connected displays
|
|
displays=$(xrandr | awk '/ connected/{print $1}')
|
|
|
|
# Loop through each connected display and set its resolution to the maximum supported resolution
|
|
for display in $displays; do
|
|
# Get the maximum supported resolution for the current display
|
|
max_resolution=$(xrandr | awk '/'"$display"'/ && / connected/{getline; print $1}')
|
|
|
|
# Set the screen resolution to the maximum supported resolution for the current display
|
|
xrandr --output "$display" --mode "$max_resolution"
|
|
done
|
|
XRANDRSETMAX
|
|
)
|
|
|
|
# Write the script content to the target file using sudo
|
|
echo "$xrandrsetmaxcontent" | sudo tee /usr/local/bin/xrandr-set-max >/dev/null
|
|
|
|
# SDDM Before Login - /usr/share/sddm/scripts/Xsetup and After Login - /usr/share/sddm/scripts/Xsession
|
|
sudo sed -i '$a\. /usr/local/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsetup
|
|
#sudo sed -i '$a\. /usr/local/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsession
|
|
|
|
sudo chmod +x /usr/local/bin/xrandr-set-max
|
|
|
|
else
|
|
echo "xrandr-set-max already exists."
|
|
fi
|
|
|
|
#if [ ! -f /etc/X11/Xsession.d/90_xrandr-set-max ]; then
|
|
# sudo cp /usr/local/bin/xrandr-set-max /etc/X11/Xsession.d/90_xrandr-set-max
|
|
# # Run at Login /etc/X11/Xsession.d/FILENAME
|
|
#else
|
|
# echo "/etc/X11/Xsession.d/90_xrandr-set-max already exists."
|
|
#fi
|
|
|
|
echo -e "${YELLOW} xrandr-set-max + Xsession END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Download Unsplash Wallpapers BIN START ${NC}"
|
|
sudo bash -c 'cat << "UNSPLASHDOWNLOADBIN" >> /usr/local/bin/unsplash-download-wallpapers
|
|
#!/bin/bash
|
|
|
|
# Function to download wallpapers
|
|
download_wallpapers() {
|
|
# Set the desired number of wallpapers to download
|
|
count="$2"
|
|
|
|
# Categories topics for the wallpapers like, minimalist-wallpapers "Remember to put a hyphen between the words"
|
|
query="$1"
|
|
|
|
echo "Wallpapers are being downloaded, Please wait..."
|
|
|
|
# Download images
|
|
for ((i = 1; i <= count; i++)); do
|
|
wget -qO "$HOME/Wallpapers/unsplash_${query}_${i}.jpg" "https://source.unsplash.com/random/3440x1440/?$query"
|
|
done
|
|
|
|
echo "Wallpapers downloaded successfully."
|
|
}
|
|
|
|
if [ -z "$1" ] || [ -z "$2" ]; then
|
|
echo "Usage: unsplash-download-wallpapers <query> <count>"
|
|
echo "Example: unsplash-download-wallpapers hd-nature-landscape 15"
|
|
exit 1
|
|
fi
|
|
|
|
query="$1"
|
|
count="$2"
|
|
|
|
download_wallpapers "$query" "$count"
|
|
UNSPLASHDOWNLOADBIN'
|
|
|
|
sudo chmod +x /usr/local/bin/unsplash-download-wallpapers
|
|
|
|
echo -e "${YELLOW} Download Unsplash Wallpapers BIN END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
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/qtile/extract_colors.py" ]; then
|
|
echo "$HOME/.config/qtile/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/qtile/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/qtile/extract_colors.py ]; then
|
|
cat << "EXTRACTCOLORS" > ~/.config/qtile/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/qtile/extract_colors.py already exists."
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Rofi Run menu START ${NC}"
|
|
if [ ! -d ~/.config/rofi ]; then
|
|
mkdir -p ~/.config/rofi
|
|
|
|
else
|
|
echo "Rofi folder already exists."
|
|
fi
|
|
|
|
if [ ! -f ~/.config/rofi/config.rasi ]; then
|
|
#touch ~/.config/rofi/config.rasi
|
|
cat << "ROFICONFIG" > ~/.config/rofi/config.rasi
|
|
configuration {
|
|
display-drun: "Applications:";
|
|
display-window: "Windows:";
|
|
drun-display-format: "{name}";
|
|
font: "DejaVuSansMono Nerd Font Book 10";
|
|
modi: "window,run,drun";
|
|
}
|
|
|
|
/* The Theme */
|
|
@theme "~/.config/rofi/rofi-colors.rasi"
|
|
|
|
// Theme location is "/usr/share/rofi/themes/name.rasi"
|
|
//@theme "/usr/share/rofi/themes/Arc-Dark.rasi"
|
|
|
|
ROFICONFIG
|
|
|
|
else
|
|
echo "Rofi rofi-colors file already exists."
|
|
fi
|
|
|
|
if [ ! -f ~/.config/rofi/rofi-colors.rasi ]; then
|
|
#touch ~/.config/rofi/config.rasi
|
|
cat << "ROFITHEMECONFIG" > ~/.config/rofi/rofi-colors.rasi
|
|
* {
|
|
bg: #10171c;
|
|
bg-alt: #344959;
|
|
|
|
fg: #EBEBEB;
|
|
fg-alt: #768ca3;
|
|
|
|
background-color: @bg;
|
|
|
|
border: 0;
|
|
margin: 0;
|
|
padding: 0;
|
|
spacing: 0;
|
|
}
|
|
|
|
@import "rofi-common.rasi"
|
|
|
|
ROFITHEMECONFIG
|
|
|
|
else
|
|
echo "Rofi config file already exists."
|
|
fi
|
|
|
|
if [ ! -f ~/.config/rofi/rofi-common.rasi ]; then
|
|
cat << "ROFITHEMECOMMONCONFIG" > ~/.config/rofi/rofi-common.rasi
|
|
window {
|
|
width: 30%;
|
|
}
|
|
|
|
element {
|
|
padding: 8 0;
|
|
text-color: @fg-alt;
|
|
}
|
|
|
|
element selected {
|
|
text-color: @fg;
|
|
}
|
|
|
|
element-text {
|
|
background-color: inherit;
|
|
text-color: inherit;
|
|
vertical-align: 0.5;
|
|
}
|
|
|
|
element-icon {
|
|
size: 30;
|
|
}
|
|
|
|
entry {
|
|
background-color: @bg-alt;
|
|
padding: 12;
|
|
text-color: @fg;
|
|
}
|
|
|
|
inputbar {
|
|
children: [prompt, entry];
|
|
}
|
|
|
|
listview {
|
|
padding: 8 12;
|
|
background-color: @bg;
|
|
columns: 1;
|
|
lines: 8;
|
|
}
|
|
|
|
mainbox {
|
|
background-color: @bg;
|
|
children: [inputbar, listview];
|
|
}
|
|
|
|
prompt {
|
|
background-color: @bg-alt;
|
|
enabled: true;
|
|
padding: 12 0 0 12;
|
|
text-color: @fg;
|
|
}
|
|
|
|
ROFITHEMECOMMONCONFIG
|
|
|
|
else
|
|
echo "Rofi rofi-common file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Rofi Run menu END ${NC}"
|
|
|
|
# Rofi Wifi menu
|
|
# https://github.com/ericmurphyxyz/rofi-wifi-menu/tree/master
|
|
echo -e "${YELLOW} Rofi Wifi menu Start ${NC}"
|
|
if [ ! -f ~/.config/rofi/rofi-wifi-menu.sh ]; then
|
|
cat << "ROFIWIFI" > ~/.config/rofi/rofi-wifi-menu.sh
|
|
#!/usr/bin/env bash
|
|
|
|
notify-send "Getting list of available Wi-Fi networks..."
|
|
# Get a list of available wifi connections and morph it into a nice-looking list
|
|
wifi_list=$(nmcli --fields "SECURITY,SSID" device wifi list | sed 1d | sed 's/ */ /g' | sed -E "s/WPA*.?\S/ /g" | sed "s/^--/ /g" | sed "s/ //g" | sed "/--/d")
|
|
|
|
connected=$(nmcli -fields WIFI g)
|
|
if [[ "$connected" =~ "enabled" ]]; then
|
|
toggle=" Disable Wi-Fi"
|
|
elif [[ "$connected" =~ "disabled" ]]; then
|
|
toggle=" Enable Wi-Fi"
|
|
fi
|
|
|
|
# Use rofi to select wifi network
|
|
chosen_network=$(echo -e "$toggle\n$wifi_list" | uniq -u | rofi -dmenu -i -selected-row 1 -p "Wi-Fi SSID: " )
|
|
# Get name of connection
|
|
read -r chosen_id <<< "${chosen_network:3}"
|
|
|
|
if [ "$chosen_network" = "" ]; then
|
|
exit
|
|
elif [ "$chosen_network" = " Enable Wi-Fi" ]; then
|
|
nmcli radio wifi on
|
|
elif [ "$chosen_network" = " Disable Wi-Fi" ]; then
|
|
nmcli radio wifi off
|
|
else
|
|
# Message to show when connection is activated successfully
|
|
success_message="You are now connected to the Wi-Fi network \"$chosen_id\"."
|
|
# Get saved connections
|
|
saved_connections=$(nmcli -g NAME connection)
|
|
if [[ $(echo "$saved_connections" | grep -w "$chosen_id") = "$chosen_id" ]]; then
|
|
nmcli connection up id "$chosen_id" | grep "successfully" && notify-send "Connection Established" "$success_message"
|
|
else
|
|
if [[ "$chosen_network" =~ "" ]]; then
|
|
wifi_password=$(rofi -dmenu -p "Password: " )
|
|
fi
|
|
nmcli device wifi connect "$chosen_id" password "$wifi_password" | grep "successfully" && notify-send "Connection Established" "$success_message"
|
|
fi
|
|
fi
|
|
|
|
ROFIWIFI
|
|
|
|
chmod +x ~/.config/rofi/rofi-wifi-menu.sh
|
|
|
|
else
|
|
echo "Rofi WiFi menu file already exists."
|
|
fi
|
|
|
|
echo -e "${YELLOW} Rofi Wifi menu END ${NC}"
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
#if [ -f /etc/NetworkManager/NetworkManager.conf ]; then
|
|
#sudo sed -i 's/managed=false/managed=true/' /etc/NetworkManager/NetworkManager.conf
|
|
#sudo systemctl restart NetworkManager
|
|
|
|
#else
|
|
# echo "NetworkManager.conf file does not exist."
|
|
#fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} 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 "${YELLOW} Kitty config file END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Edit GRUB BOOT TIMEOUT START ${NC}"
|
|
sudo sed -i 's+GRUB_TIMEOUT=5+GRUB_TIMEOUT=1+g' /etc/default/grub && sudo update-grub
|
|
echo -e "${YELLOW} Edit GRUB BOOT TIMEOUT END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
echo -e "${YELLOW} Install selection choose what to install Start ${NC}"
|
|
for PROGRAM in $PROGRAMS
|
|
do
|
|
case $PROGRAM in
|
|
"1")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y libreoffice
|
|
;;
|
|
"2")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y tlp tlp-rdw bluetooth bluez bluez-cups bluez-obexd bluez-meshd pulseaudio-module-bluetooth bluez-firmware blueman acpi
|
|
;;
|
|
"3")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y xrdp && sudo systemctl restart xrdp.service
|
|
;;
|
|
"4")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y freerdp2-x11 libfreerdp-client2-2 libfreerdp2-2 libwinpr2-2
|
|
;;
|
|
"5")
|
|
cd /tmp/ && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && sudo DEBIAN_FRONTEND=noninteractive apt install -y /tmp/google-chrome-stable_current_amd64.deb && rm google-chrome-stable_current_amd64.deb
|
|
;;
|
|
"6")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y firefox-esr
|
|
;;
|
|
"7")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y smbclient
|
|
;;
|
|
"8")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y nfs-common
|
|
;;
|
|
"9")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y ceph-common
|
|
;;
|
|
"10")
|
|
cd /tmp/ && wget -O vscode_amd64.deb 'https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64' && sudo DEBIAN_FRONTEND=noninteractive apt install -y /tmp/vscode_amd64.deb && rm vscode_amd64.deb
|
|
;;
|
|
"11")
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y neovim
|
|
;;
|
|
esac
|
|
done
|
|
echo -e "${YELLOW} Install selection choose what to install End ${NC}"
|
|
|
|
|
|
# Check for Nvidia graphics card and install drivers ----------------------------------------------
|
|
|
|
if lspci | grep -i nvidia; then
|
|
echo "Nvidia graphics card detected. Installing drivers..."
|
|
sudo DEBIAN_FRONTEND=noninteractive apt install -y --install-recommends --install-suggests nvidia-driver
|
|
echo 'nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"' >> ~/.config/qtile/autostart.sh
|
|
else
|
|
echo "No Nvidia graphics card detected."
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Qtile Config file START ${NC}"
|
|
|
|
if [ ! -f ~/.config/qtile/config.py ]; then
|
|
|
|
cat << "QTILECONFIG" > ~/.config/qtile/config.py
|
|
# Qtile Config - Start
|
|
# https://docs.qtile.org/en/latest/index.html
|
|
# -',.-'-,.'-,'.-',.-',-.'-,.'-,.'-,.'-,'.-',.-'-
|
|
#
|
|
import os
|
|
import subprocess
|
|
from libqtile import bar, layout, qtile, widget, hook
|
|
from libqtile.config import Click, Drag, Group, Key, Match, Screen, ScratchPad, DropDown, re
|
|
from libqtile.lazy import lazy
|
|
from libqtile.utils import guess_terminal # terminal = guess_terminal()
|
|
from qtile_colors import colors
|
|
#from libqtile.dgroups import simple_key_binder
|
|
|
|
|
|
# Custom code start ----------------------------------------------------
|
|
|
|
def guess_browser():
|
|
"""Guess the default web browser."""
|
|
# Define a list of common web browsers
|
|
browsers = ["google-chrome", "firefox", "chromium", "vivaldi", "opera", "brave-browser", "safari"]
|
|
|
|
# Loop through the list of browsers and check if they exist in PATH
|
|
for browser in browsers:
|
|
try:
|
|
subprocess.run(["which", browser], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
return browser
|
|
except subprocess.CalledProcessError:
|
|
continue
|
|
|
|
# If no browser is found, return None
|
|
return None
|
|
|
|
|
|
|
|
# Custom code end ------------------------------------------------------
|
|
|
|
# Colors use example active=colors["3"],
|
|
|
|
|
|
mod = "mod4"
|
|
terminal = guess_terminal()
|
|
browser = guess_browser()
|
|
fileexplorer = "thunar"
|
|
runmenu = 'rofi -modi "drun,run,window,filebrowser" -show drun' # Switch between -modi... Default key CTRL+TAB
|
|
|
|
|
|
keys = [
|
|
# A list of available commands that can be bound to keys can be found
|
|
# at https://docs.qtile.org/en/latest/manual/config/lazy.html
|
|
#
|
|
# Examples:
|
|
# a key binding that can run an external Script or Command
|
|
# Key([mod], "l", lazy.spawn(os.path.expanduser("xsecurelock")), desc='Computer Lockdown'),
|
|
#
|
|
# a normal key binding that pulls from a variable
|
|
# Key([mod], "Return", lazy.spawn(terminal), desc="Launch Terminal"),
|
|
|
|
# Keybindings
|
|
Key([mod], "Return", lazy.spawn(terminal), desc="Terminal"),
|
|
Key([mod], "b", lazy.spawn(browser), desc="Web Browser"),
|
|
Key([mod], "e", lazy.spawn(fileexplorer), desc="File Explorer"),
|
|
Key([mod], "r", lazy.spawn(runmenu), desc="Run Menu"),
|
|
Key([mod, "shift"], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
|
|
Key([mod, "control", "mod1"], "l", lazy.spawn(os.path.expanduser("xsecurelock")), desc="Computer Lockdown"),
|
|
Key([mod, "control", "mod1"], "t", lazy.spawn(os.path.expanduser("auto-new-wallpaper-and-colors")), desc="Random Theme"),
|
|
Key([mod, "control", "mod1"], "w", lazy.spawn(os.path.expanduser("~/.config/rofi/rofi-wifi-menu.sh")), desc="WiFi Manager"),
|
|
Key([mod, "control", "mod1"], "n", lazy.spawn(os.path.expanduser("kitty -e sudo nmtui")), desc="Network Manager"),
|
|
|
|
# Default
|
|
Key([mod], "h", lazy.layout.left(), desc="Move focus to left"),
|
|
Key([mod], "l", lazy.layout.right(), desc="Move focus to right"),
|
|
Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
|
|
Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
|
|
Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"),
|
|
|
|
# Move windows between left/right columns or move up/down in current stack.
|
|
# Moving out of range in Columns layout will create new column.
|
|
Key([mod, "shift"], "h", lazy.layout.shuffle_left(), desc="Move window to the left"),
|
|
Key([mod, "shift"], "l", lazy.layout.shuffle_right(), desc="Move window to the right"),
|
|
Key([mod, "shift"], "j", lazy.layout.shuffle_down(), desc="Move window down"),
|
|
Key([mod, "shift"], "k", lazy.layout.shuffle_up(), desc="Move window up"),
|
|
|
|
# Grow windows. If current window is on the edge of screen and direction
|
|
# will be to screen edge - window would shrink.
|
|
Key([mod, "control"], "h", lazy.layout.grow_left(), lazy.layout.grow(), desc="Grow window to the left"),
|
|
Key([mod, "control"], "l", lazy.layout.grow_right(), lazy.layout.shrink(), desc="Grow window to the right"),
|
|
Key([mod, "control"], "j", lazy.layout.grow_down(), desc="Grow window down"),
|
|
Key([mod, "control"], "k", lazy.layout.grow_up(), desc="Grow window up"),
|
|
Key([mod, "control"], "n", lazy.layout.normalize(), lazy.layout.reset(), desc="Reset all window sizes"),
|
|
|
|
# Toggle between split and unsplit sides of stack.
|
|
# Split = all windows displayed
|
|
# Unsplit = 1 window displayed, like Max layout, but still with
|
|
# multiple stack panes
|
|
Key(
|
|
[mod, "shift"],
|
|
"Return",
|
|
lazy.layout.toggle_split(),
|
|
desc="Toggle between split and unsplit sides of stack",
|
|
),
|
|
|
|
# Toggle between different layouts as defined below
|
|
Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
|
|
Key([mod], "w", lazy.window.kill(), desc="Kill focused window"),
|
|
Key(
|
|
[mod],
|
|
"f",
|
|
lazy.window.toggle_fullscreen(),
|
|
desc="Toggle fullscreen on the focused window",
|
|
),
|
|
Key([mod], "t", lazy.window.toggle_floating(), desc="Toggle floating on the focused window"),
|
|
Key([mod, "mod1", "control"], "r", lazy.reload_config(), desc="Reload the config"),
|
|
Key([mod, "mod1", "control"], "q", lazy.shutdown(), desc="Shutdown Qtile"),
|
|
|
|
# Audio
|
|
Key([mod, "mod1"], "Up", lazy.spawn("wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+"), desc='Volume Up'),
|
|
Key([mod, "mod1"], "Down", lazy.spawn("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), desc='Volume Down'),
|
|
Key([mod, "mod1"], "m", lazy.spawn("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), desc='Volume Mute Toggle'),
|
|
|
|
# XF86 Audio & Brightness keys
|
|
Key([], "XF86AudioRaiseVolume", lazy.spawn("wpctl set-volume @DEFAULT_AUDIO_SINK@ 1%+"), desc='Volume Up'),
|
|
Key([], "XF86AudioLowerVolume", lazy.spawn("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), desc='Volume Down'),
|
|
Key([], "XF86AudioMute", lazy.spawn("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), desc='Volume Mute Toggle'),
|
|
# mute/unmute the microphone - wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
|
|
# Show volume level - wpctl get-volume @DEFAULT_AUDIO_SINK@
|
|
|
|
Key([], "XF86AudioPlay", lazy.spawn("playerctl play-pause"), desc='Play-Pause'),
|
|
Key([], "XF86AudioPrev", lazy.spawn("playerctl previous"), desc='Previous'),
|
|
Key([], "XF86AudioNext", lazy.spawn("playerctl next"), desc='Next'),
|
|
Key([], "XF86MonBrightnessUp", lazy.spawn("brightnessctl set +10%"), desc='Brightness UP'),
|
|
Key([], "XF86MonBrightnessDown", lazy.spawn("brightnessctl set 10%-"), desc='Brightness Down'),
|
|
Key([], "Print", lazy.spawn("bash -c 'flameshot gui --path ~/Screenshots'"), desc='Screenshot'),
|
|
]
|
|
|
|
# Add key bindings to switch VTs in Wayland.
|
|
# We can't check qtile.core.name in default config as it is loaded before qtile is started
|
|
# We therefore defer the check until the key binding is run by using .when(func=...)
|
|
for vt in range(1, 8):
|
|
keys.append(
|
|
Key(
|
|
["control", "mod1"],
|
|
f"f{vt}",
|
|
lazy.core.change_vt(vt).when(func=lambda: qtile.core.name == "wayland"),
|
|
desc=f"Switch to VT{vt}",
|
|
)
|
|
)
|
|
|
|
|
|
# Create labels for groups and assign them a default layout.
|
|
# Find icons here - https://www.nerdfonts.com/cheat-sheet
|
|
# nf-linux-debian nf-md-rocket_launch nf-cod-rocket nf-cod-settings nf-dev-android nf-dev-chrome nf-dev-terminal
|
|
# nf-dev-prolog nf-fa-apple nf-fa-earlybirds nf-fa-egg nf-fa-grav nf-fa-linux nf-fa-snapchat
|
|
# nf-fa-steam nf-fa-terminal nf-fa-wifi nf-fae-pi nf-md-recycle nf-md-symbol nf-fa-mug_hot
|
|
# nf-fa-thermometer_2 nf-md-battery_medium nf-md-battery_charging
|
|
# nf-fa-volume_high nf-fa-volume_low nf-fa-volume_xmark
|
|
# nf-md-pac_man nf-md-ghost nf-fa-circle nf-cod-circle_large nf-cod-circle_filled nf-md-circle_small nf-md-circle_medium
|
|
|
|
groups = [
|
|
Group("1", label="", layout="monadtall", matches=[Match(wm_class=re.compile(r"^(Google\-chrome)$"))]),
|
|
Group("2", label="", layout="monadtall"),
|
|
Group("3", label="", layout="monadtall"),
|
|
Group("4", label="", layout="monadtall"),
|
|
Group("5", label="", layout="monadtall"),
|
|
Group("6", label="", layout="monadtall"),
|
|
Group("7", label="", layout="monadtall"),
|
|
Group("8", label="", layout="monadtall"),
|
|
Group("9", label="", layout="monadtall", matches=[Match(wm_class=re.compile(r"^(Firefox\-esr)$"))]),
|
|
Group("0", label="", layout="bsp"),
|
|
]
|
|
|
|
for i in groups:
|
|
keys.extend(
|
|
[
|
|
# mod + group number = switch to group
|
|
Key(
|
|
[mod],
|
|
i.name,
|
|
lazy.group[i.name].toscreen(),
|
|
desc="Switch to group {}".format(i.name),
|
|
),
|
|
# mod + shift + group number = switch to & move focused window to group
|
|
Key(
|
|
[mod, "shift"],
|
|
i.name,
|
|
lazy.window.togroup(i.name, switch_group=True),
|
|
desc="Switch to & move focused window to group {}".format(i.name),
|
|
),
|
|
# Or, use below if you prefer not to switch to that group.
|
|
# # mod + shift + group number = move focused window to group
|
|
# Key([mod, "shift"], i.name, lazy.window.togroup(i.name),
|
|
# desc="move focused window to group {}".format(i.name)),
|
|
]
|
|
)
|
|
|
|
# ScratchPad Keybindings
|
|
keys.extend([
|
|
Key([mod, "shift"], "Return", lazy.group['scratchpad'].dropdown_toggle('term')),
|
|
Key([mod, "shift"], "e", lazy.group['scratchpad'].dropdown_toggle('mc')),
|
|
Key([mod, "shift"], "a", lazy.group['scratchpad'].dropdown_toggle('audio')),
|
|
Key([mod, "shift"], "n", lazy.group['scratchpad'].dropdown_toggle('notes')),
|
|
Key([mod, "shift"], "m", lazy.group['scratchpad'].dropdown_toggle('music')),
|
|
])
|
|
|
|
# ScratchPads
|
|
groups.append(ScratchPad("scratchpad", [
|
|
DropDown("term", "kitty --class=scratch", width=0.8, height=0.8, x=0.1, y=0.1, opacity=1),
|
|
DropDown("mc", "kitty --class=mc -e mc", width=0.8, height=0.8, x=0.1, y=0.1, opacity=1),
|
|
DropDown("audio", "kitty --class=volume -e alsamixer", width=0.8, height=0.8, x=0.1, y=0.1, opacity=1),
|
|
DropDown("notes", "notepadqq", width=0.6, height=0.6, x=0.2, y=0.2, opacity=1),
|
|
DropDown("music", "kitty --class=music -e ncmpcpp", width=0.8, height=0.8, x=0.1, y=0.1, opacity=1),
|
|
]))
|
|
|
|
# Define layouts and layout themes
|
|
def init_layout_theme():
|
|
return {"margin":5,
|
|
"border_width":1,
|
|
"border_focus": colors["base06"],
|
|
"border_normal": colors["base02"]
|
|
}
|
|
|
|
layout_theme = init_layout_theme()
|
|
|
|
layouts = [
|
|
layout.MonadTall(**layout_theme),
|
|
layout.Max(**layout_theme),
|
|
#layout.Bsp(**layout_theme),
|
|
#layout.Columns(**layout_theme),
|
|
#layout.Stack(num_stacks=2),
|
|
#layout.Matrix(**layout_theme),
|
|
#layout.MonadWide(**layout_theme),
|
|
#layout.RatioTile(**layout_theme),
|
|
#layout.Tile(**layout_theme),
|
|
#layout.TreeTab(**layout_theme),
|
|
#layout.VerticalTile(**layout_theme),
|
|
#layout.Zoomy(**layout_theme),
|
|
]
|
|
|
|
widget_defaults = dict(
|
|
font="DejaVu Sans Mono, sans",
|
|
fontsize=14,
|
|
padding=5,
|
|
)
|
|
extension_defaults = widget_defaults.copy()
|
|
|
|
# Bar widgets - https://docs.qtile.org/en/latest/manual/ref/widgets.html
|
|
|
|
screens = [
|
|
Screen(
|
|
top=bar.Bar(
|
|
[
|
|
widget.CurrentLayoutIcon(scale=0.7, padding=10),
|
|
widget.Spacer(length=5),
|
|
widget.GroupBox(fontsize=18, highlight_method="text", this_current_screen_border="#f7f7f7", highlight_color=colors["base0B"], this_screen_border=colors["base04"], urgent_border=colors["base03"], active=colors["base05"], inactive=colors["base03"], rounded="False", borderwidth=0), widget.Spacer(length=9),
|
|
widget.Prompt(),
|
|
widget.Spacer(),
|
|
widget.WindowName(width=bar.CALCULATED, max_chars=120),
|
|
widget.Spacer(),
|
|
widget.Systray(fmt=" {}", icon_size=20),
|
|
# NB Wayland is incompatible with Systray, consider using StatusNotifier
|
|
# widget.StatusNotifier(),
|
|
#widget.Wallpaper(directory="~/Wallpapers/", label="", random_selection="True"),
|
|
#widget.NetGraph(type='line', line_width=1),
|
|
#widget.Net(prefix='M'),
|
|
widget.ThermalSensor(format='CPU: {temp:.0f}{unit}'),
|
|
widget.Volume(fmt=" {}"),
|
|
widget.Spacer(length=5),
|
|
widget.Clock(fmt=" {}",format="%H:%M %A %d-%m-%Y %p"),
|
|
#widget.QuickExit(default_text="LOGOUT", countdown_format=" {} "),
|
|
widget.Spacer(length=20),
|
|
], 30, # Define bar height
|
|
background=colors["base00"], opacity=0.95, # Bar background color can also take transparency with "hex color code" or .75
|
|
margin=[5, 5, 0, 5], # Space around bar as int or list of ints [N E S W]
|
|
border_width=[0, 0, 0, 0], # Width of border as int of list of ints [N E S W]
|
|
border_color=["f7f7f7", "f7f7f7", "f7f7f7", "f7f7f7"] # Border colour as str or list of str [N E S W]
|
|
),
|
|
# You can uncomment this variable if you see that on X11 floating resize/moving is laggy
|
|
# By default we handle these events delayed to already improve performance, however your system might still be struggling
|
|
# This variable is set to None (no cap) by default, but you can set it to 60 to indicate that you limit it to 60 events per second
|
|
# x11_drag_polling_rate = 60,
|
|
#wallpaper="~/Wallpapers/default-wallpaper.jpg",
|
|
#wallpaper_mode="fill"
|
|
),
|
|
]
|
|
|
|
# Drag floating layouts.
|
|
mouse = [
|
|
Drag([mod], "Button1", lazy.window.set_position_floating(), start=lazy.window.get_position()),
|
|
Drag([mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()),
|
|
Click([mod], "Button2", lazy.window.bring_to_front()),
|
|
]
|
|
|
|
dgroups_key_binder = None
|
|
dgroups_app_rules = [] # type: list
|
|
follow_mouse_focus = True
|
|
bring_front_click = False
|
|
floats_kept_above = True
|
|
cursor_warp = False
|
|
floating_layout = layout.Floating(**layout_theme,
|
|
float_rules=[
|
|
# Run the utility xprop to see the wm class and name of an X client.
|
|
*layout.Floating.default_float_rules,
|
|
Match(wm_class="confirmreset"), # gitk
|
|
Match(wm_class="makebranch"), # gitk
|
|
Match(wm_class="maketag"), # gitk
|
|
Match(wm_class="ssh-askpass"), # ssh-askpass
|
|
Match(title="branchdialog"), # gitk
|
|
Match(title="pinentry"), # GPG key password entry
|
|
]
|
|
)
|
|
auto_fullscreen = True
|
|
focus_on_window_activation = "smart"
|
|
reconfigure_screens = True
|
|
|
|
# If things like steam games want to auto-minimize themselves when losing
|
|
# focus, should we respect this or not?
|
|
auto_minimize = True
|
|
|
|
# Remember to add, "hook" "import os" "import subprocess" "Match"
|
|
@hook.subscribe.startup_once
|
|
def autostart():
|
|
autostartscript = os.path.expanduser("~/.config/qtile/autostart.sh")
|
|
subprocess.run([autostartscript])
|
|
|
|
@hook.subscribe.client_new
|
|
def move_window_to_group(client):
|
|
for group in groups:
|
|
if any(client.match(match) for match in group.matches):
|
|
client.togroup(group.name)
|
|
client.qtile.groups_map[group.name].toscreen()
|
|
break
|
|
|
|
|
|
# When using the Wayland backend, this can be used to configure input devices.
|
|
wl_input_rules = None
|
|
|
|
wmname = "Qtile"
|
|
|
|
QTILECONFIG
|
|
|
|
else
|
|
echo "Qtile config file already exists."
|
|
fi
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
echo -e "${YELLOW} Qtile Config file END ${NC}"
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
|
|
# Install closing screen ##### ##### ##### ##### ##### ##### ##### ##### ##### ####
|
|
clear
|
|
if (whiptail --title "Installation Complete" --yesno "Qmade Installation is complete. \nDo you want to restart the computer ?\n\nSome practical information. \nWindows key + Enter opens a terminal \nWindows key + B opens a web browser \nWindows key + W closes the active window" 15 60); then
|
|
cd ~
|
|
clear
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} "
|
|
echo -e "${RED} Enter your user password, to continue if necessary"
|
|
echo -e "${RED} "
|
|
echo -e "${RED}-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${RED} ${NC}"
|
|
sudo reboot
|
|
echo -e "${GREEN}See you later alligator..."
|
|
echo -e "${GREEN} "
|
|
echo -e "${GREEN} ${NC}"
|
|
else
|
|
cd ~
|
|
clear
|
|
echo -e "${GREEN} -'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-"
|
|
echo -e "${GREEN} "
|
|
echo -e "${GREEN} You chose not to restart the computer, Installation complete."
|
|
echo -e "${GREEN} Run startx to get to the login screen"
|
|
echo -e "${GREEN} "
|
|
echo -e "${GREEN} -'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'-'- ${NC}"
|
|
fi
|
|
|
|
# Install Done ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##
|
|
|
|
# Test Qtile config file.
|
|
# python3 ~/.config/qtile/config.py
|