#!/bin/sh # $USER_HOME to $USER_HOME and $NEW_USERNAME to $NEW_USERNAME USER_HOME=$(grep ":1000:" /etc/passwd | cut -d: -f6) NEW_USERNAME=$(grep ":1000:" /etc/passwd | cut -d: -f1) # REMOVE all '' and '' and 'check_error "GRUB BOOT TIMEOUT"' # Check and Copy Default APT Sources List if [ ! -f /etc/apt/sources.list ]; then cp /usr/share/doc/apt/examples/sources.list /etc/apt/sources.list fi # Sudoers ------------------------------------------------------------------------------------------------------------------------------------ # Add User NOPASSWD to shutdown now and reboot echo "$NEW_USERNAME ALL=(ALL) NOPASSWD: /sbin/shutdown now, /sbin/reboot" | tee -a /etc/sudoers.d/$NEW_USERNAME && vi-c -f /etc/sudoers.d/$NEW_USERNAME # Set password timeout echo "Defaults timestamp_timeout=25" | tee -a /etc/sudoers.d/$NEW_USERNAME && vi-c -f /etc/sudoers.d/$NEW_USERNAME # ----------------------------------------------------------------------------------------------------------------------------------------- # APT Add - contrib non-free" to the sources list if [ -f /etc/apt/sources.list ]; then if ! grep -q "deb .* contrib non-free" /etc/apt/sources.list; then 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 [ -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 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 fi # APT Add - apt-transport-https if ! dpkg -s apt-transport-https >/dev/null 2>&1; then DEBIAN_FRONTEND=noninteractive apt install -y apt-transport-https sed -i 's+http:+https:+g' /etc/apt/sources.list fi # APT Git install if ! dpkg -s git >/dev/null 2>&1; then DEBIAN_FRONTEND=noninteractive apt install -y git fi apt update # ------------------------------------------------------------------------------------------------- # Core System APT install for i in bash-completion xserver-xorg x11-utils xinit acl arandr autorandr picom fwupd colord mesa-utils htop wget curl git tmux numlockx kitty neovim xdg-utils cups cups-common lm-sensors fancontrol xbacklight brightnessctl unzip network-manager dnsutils dunst libnotify-bin notify-osd xsecurelock pm-utils rofi 7zip jq poppler-utils fd-find ripgrep zoxide imagemagick nsxiv mpv flameshot mc thunar gvfs gvfs-backends parted gparted mpd mpc ncmpcpp fzf ccrypt xarchiver notepadqq font-manager fontconfig fontconfig-config fonts-recommended fonts-liberation fonts-freefont-ttf fonts-noto-core libfontconfig1 pipewire pipewire-audio pipewire-alsa pipewire-pulse pipewire-jack wireplumber libspa-0.2-bluetooth pavucontrol alsa-utils qpwgraph sddm-theme-breeze sddm-theme-maui ffmpeg cmake policykit-1 policykit-1-gnome remmina libreoffice keynav; do DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install $i done DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install linux-headers-$(uname -r) DEBIAN_FRONTEND=noninteractive apt -y install sddm --no-install-recommends # APT install extra packages # Google Chrome install. cd /tmp/ && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && DEBIAN_FRONTEND=noninteractive apt install -y /tmp/google-chrome-stable_current_amd64.deb && rm google-chrome-stable_current_amd64.deb # Network Share Components DEBIAN_FRONTEND=noninteractive apt install -y ceph-common smbclient nfs-common && echo "# CEPH" | tee -a /etc/fstab && echo "#:/ /mnt/cephfs ceph name=clientNAME,noatime,_netdev 0 0" | tee -a /etc/fstab # Check if the CPU is a QEMU Virtual CPU using lscpu if lscpu | grep -iq "QEMU"; then echo "QEMU Virtual CPU detected. Installing xrdp and restarting service..." apt update DEBIAN_FRONTEND=noninteractive apt install -y xrdp systemctl restart xrdp.service fi # Check for Bluetooth hardware using lsusb if lsusb | grep -iq bluetooth; then echo "Bluetooth detected, Installing required packages..." DEBIAN_FRONTEND=noninteractive apt install -y bluetooth bluez bluez-cups bluez-obexd bluez-meshd pulseaudio-module-bluetooth bluez-firmware blueman fi # Check for Logitech hardware using lsusb # Solaar - Logitech Unifying Receiver - Accessory management for Linux. if lsusb | grep -iq Logitech; then echo "Logitech detected, Installing required packages..." DEBIAN_FRONTEND=noninteractive apt install -y solaar fi # CPU Microcode install 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 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 DEBIAN_FRONTEND=noninteractive apt install -y amd64-microcode fi else echo -e "${GREEN} Amd64 Microcode OK ${NC}" fi unset LC_ALL # unset the LC_ALL=C # Alias echo to $USER_HOME/.bashrc or $USER_HOME/.bash_aliases BASHALIASFILE=$USER_HOME/.bashrc echo 'alias ls="ls --color=auto --group-directories-first -v -lah"' >> $BASHALIASFILE echo 'alias ll="ls --color=auto --group-directories-first -v -lah"' >> $BASHALIASFILE echo 'alias df="df -h"' >> $BASHALIASFILE echo 'alias neofetch="fastfetch"' >> $BASHALIASFILE echo 'alias upup="sudo apt update && sudo apt upgrade -y && sudo apt clean && sudo apt autoremove -y"' >> $BASHALIASFILE echo 'bind '"'"'"\C-f":"open "$(fzf)"\n"'"'" >> $BASHALIASFILE echo 'alias lsman="compgen -c | fzf | xargs man"' >> $BASHALIASFILE echo 'alias qtileconfig="nano ~/.config/qtile/config.py"' >> $BASHALIASFILE echo 'alias qtileconfig-test="python3 ~/.config/qtile/config.py"' >> $BASHALIASFILE echo 'alias qtileconfig-test-venv="source /opt/qtile_venv/bin/activate && python3 ~/.config/qtile/config.py && deactivate"' >> $BASHALIASFILE echo 'alias autostart-edit="nano ~/.config/qtile/autostart.sh"' >> $BASHALIASFILE echo 'alias vi="nvim"' >> $BASHALIASFILE # Set User folders via xdg-user-dirs-update & xdg-mime default. # ls /usr/share/applications/ Find The Default run.: "xdg-mime query default inode/directory" rm /usr/share/sddm/faces/.face.icon rm /usr/share/sddm/faces/root.face.icon wget -O /usr/share/sddm/faces/root.face.icon https://github.com/ITmail-dk/qmade/blob/main/root.face.icon?raw=true wget -O /usr/share/sddm/faces/.face.icon https://github.com/ITmail-dk/qmade/blob/main/.face.icon?raw=true wget -O $USER_HOME/.face.icon https://github.com/ITmail-dk/qmade/blob/main/.face.icon?raw=true setfacl -m u:sddm:x $USER_HOME/ setfacl -m u:sddm:r $USER_HOME/.face.icon setfacl -m u:sddm:x /usr/share/sddm/faces/ setfacl -m u:sddm:r /usr/share/sddm/faces/.face.icon setfacl -m u:sddm:r /usr/share/sddm/faces/root.face.icon mkdir -p /etc/sddm.conf.d bash -c 'cat << "SDDMCONFIG" >> /etc/sddm.conf.d/default.conf [Theme] # Set Current theme "name" breeze, maui Current=breeze [Wayland] EnableHiDPI=true [X11] EnableHiDPI=true SDDMCONFIG' # Set login wallpape under background=/ in /usr/share/sddm/themes/breeze/theme.conf #/usr/share/wallpapers/login-wallpape.jpg # Midnight-Commander ini file mkdir -p $USER_HOME/.config/mc cat << "MCINI" > $USER_HOME/.config/mc/ini [Midnight-Commander] skin=nicedark MCINI # Qtile Core Dependencies apt install DEBIAN_FRONTEND=noninteractive apt install -y feh python3-full python3-pip python3-venv pipx libxkbcommon-dev libxkbcommon-x11-dev libcairo2-dev pkg-config # Install Qtile from source via github and Pip cd $USER_HOME mkdir -p $USER_HOME/.local/bin mkdir -p $USER_HOME/.local/src mkdir -p $USER_HOME/.cache/pip chmod -R 777 $USER_HOME/.cache/pip mkdir -p $USER_HOME/.cache/wal chmod -R 777 $USER_HOME/.cache/wal # Python3 venv Qtile install # Upgrade run: python3 -m venv --upgrade qtile_venv cd /opt/ python3 -m venv qtile_venv chmod -R 777 /opt/qtile_venv cd /opt/qtile_venv if [ -d qtile ]; then rm -rf qtile fi git clone https://github.com/qtile/qtile.git source /opt/qtile_venv/bin/activate pip install dbus-next psutil wheel pyxdg pip install -r qtile/requirements.txt bin/pip install qtile/. # PyWAL install via pip3 for auto-generated color themes pip3 install pywal16[all] --break-system-packages deactivate cp bin/qtile /usr/bin/ cp bin/wal /usr/bin/ mkdir -p $USER_HOME/.cache/wal cat << "PYWALCOLORSJSON" > $USER_HOME/.cache/wal/colors.json { "checksum": "85abc768e55abc92396e0c76280093cc", "wallpaper": "/home/mara/Wallpapers/default_wallpaper.jpg", "alpha": "100", "special": { "background": "#06090c", "foreground": "#c0c1c2", "cursor": "#c0c1c2" }, "colors": { "color0": "#06090c", "color1": "#1f384b", "color2": "#304d5c", "color3": "#375d6e", "color4": "#4e5b61", "color5": "#526870", "color6": "#66767a", "color7": "#899195", "color8": "#555f68", "color9": "#2a4b64", "color10": "#40677b", "color11": "#4a7d93", "color12": "#687a82", "color13": "#6e8b96", "color14": "#889ea3", "color15": "#c0c1c2" } } PYWALCOLORSJSON mkdir -p $USER_HOME/.config/kitty/themes mkdir -p $USER_HOME/.cache/wal/ cat << "PYWALCOLORSKITTY" > $USER_HOME/.cache/wal/colors-kitty.conf foreground #c0c1c2 background #06080b background_opacity 0.98 cursor #c0c1c2 active_tab_foreground #06080b active_tab_background #c0c1c2 inactive_tab_foreground #c0c1c2 inactive_tab_background #06080b active_border_color #c0c1c2 inactive_border_color #06080b bell_border_color #1b394e color0 #06080b color8 #555b67 color1 #1b394e color9 #244d68 color2 #245067 color10 #306b8a color3 #33667f color11 #4589aa color4 #4e606e color12 #698193 color5 #557384 color13 #729ab0 color6 #6c818e color14 #91adbe color7 #898d95 color15 #c0c1c2 PYWALCOLORSKITTY ln -s $USER_HOME/.cache/wal/colors-kitty.conf $USER_HOME/.config/kitty/themes/current-theme.conf # PyWal kitty template mkdir -p $USER_HOME/.config/wal/templates/ cat << "PYWALCOLORSTEMPALETKITTY" > $USER_HOME/.config/wal/templates/colors-kitty.conf foreground {foreground} background {background} background_opacity 0.98 cursor {cursor} active_tab_foreground {background} active_tab_background {foreground} inactive_tab_foreground {foreground} inactive_tab_background {background} active_border_color {foreground} inactive_border_color {background} bell_border_color {color1} color0 {color0} color8 {color8} color1 {color1} color9 {color9} color2 {color2} color10 {color10} color3 {color3} color11 {color11} color4 {color4} color12 {color12} color5 {color5} color13 {color13} color6 {color6} color14 {color14} color7 {color7} color15 {color15} PYWALCOLORSTEMPALETKITTY cat << "PYWALCOLORSTEMPALETROFI" > $USER_HOME/.config/wal/templates/colors-rofi-dark.rasi * {{ active-background: {color2}; active-foreground: @foreground; normal-background: @background; normal-foreground: @foreground; urgent-background: {color1}; urgent-foreground: @foreground; alternate-active-background: @background; alternate-active-foreground: @foreground; alternate-normal-background: @background; alternate-normal-foreground: @foreground; alternate-urgent-background: @background; alternate-urgent-foreground: @foreground; selected-active-background: {color1}; selected-active-foreground: @foreground; selected-normal-background: {color2}; selected-normal-foreground: @foreground; selected-urgent-background: {color3}; selected-urgent-foreground: @foreground; background-color: @background; background: {background}; foreground: {foreground}; border-color: @background; spacing: 2; }} #window {{ width: 30%; background-color: @background; border: 0; padding: 2.5ch; }} #mainbox {{ border: 0; padding: 0; background-color: @background; children: [inputbar, listview]; }} #message {{ border: 2px 0px 0px; border-color: @border-color; padding: 1px; }} #textbox {{ text-color: @foreground; }} #inputbar {{ children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; }} #textbox-prompt-colon {{ expand: false; str: ":"; margin: 0px 0.3em 0em 0em; text-color: @normal-foreground; }} #listview {{ fixed-height: 0; border: 2px 0px 0px; border-color: @border-color; spacing: 2px; scrollbar: true; padding: 2px 0px 0px; }} #element {{ border: 0; padding: 8 0; }} #element-text {{ background-color: inherit; text-color: inherit; }} #element-icon {{ size: 30; }} #element.normal.normal {{ background-color: @normal-background; text-color: @normal-foreground; }} #element.normal.urgent {{ background-color: @urgent-background; text-color: @urgent-foreground; }} #element.normal.active {{ background-color: @active-background; text-color: @active-foreground; }} #element.selected.normal {{ background-color: @selected-normal-background; text-color: @selected-normal-foreground; }} #element.selected.urgent {{ background-color: @selected-urgent-background; text-color: @selected-urgent-foreground; }} #element.selected.active {{ background-color: @selected-active-background; text-color: @selected-active-foreground; }} #element.alternate.normal {{ background-color: @alternate-normal-background; text-color: @alternate-normal-foreground; }} #element.alternate.urgent {{ background-color: @alternate-urgent-background; text-color: @alternate-urgent-foreground; }} #element.alternate.active {{ background-color: @alternate-active-background; text-color: @alternate-active-foreground; }} #scrollbar {{ width: 4px; border: 0; handle-width: 8px; padding: 0; }} #sidebar {{ border: 2px 0px 0px; border-color: @border-color; }} #button {{ text-color: @normal-foreground; }} #button.selected {{ background-color: @selected-normal-background; text-color: @selected-normal-foreground; }} #inputbar {{ spacing: 0; text-color: @normal-foreground; padding: 1px; }} #case-indicator {{ spacing: 0; text-color: @normal-foreground; }} #entry {{ spacing: 0; text-color: @normal-foreground; }} #prompt {{ spacing: 0; text-color: @normal-foreground; }} PYWALCOLORSTEMPALETROFI # auto-new-wallpaper-and-colors BIN bash -c 'cat << "AUTONEWWALLPAPERANDCOLORSBIN" >> /usr/bin/auto-new-wallpaper-and-colors #!/usr/bin/env bash if command -v wal > /dev/null 2>&1; then wal --cols16 darken -q -i ~/Wallpapers --backend haishoku; else pip3 install pywal16[all] --break-system-packages && wal --cols16 darken -q -i ~/Wallpapers --backend haishoku; fi #wal --cols16 darken -q -i ~/Wallpapers --backend haishoku # Backends: colorz, colorthief, fast_colorthief, okthief, schemer2, haishoku, modern_colorthief, wal notify-send -u low "Automatically new background and color theme" "Please wait while i find a new background image and some colors to match" qtile cmd-obj -o cmd -f reload_config kitty +kitten themes --reload-in=all Current-theme cp $(cat "$HOME/.cache/wal/wal") /usr/share/wallpapers/login-wallpape.jpg notify-send -u low "Automatically new background and color theme" "The background image and colors has been updated." AUTONEWWALLPAPERANDCOLORSBIN' chmod +x /usr/bin/auto-new-wallpaper-and-colors #Midnight Commander mkdir -p $USER_HOME/.config/mc echo "skin=dark" >> $USER_HOME/.config/mc/ini # ------------------------------------------------------------------------ mkdir -p /usr/share/xsessions/ bash -c 'cat << "QTILEDESKTOP" >> /usr/share/xsessions/qtile.desktop [Desktop Entry] Name=Qtile Comment=Qtile Session Exec=/etc/sddm/Xsession Type=Application Keywords=wm;tiling QTILEDESKTOP' # Add to user .xsession echo "exec /usr/bin/qtile start" > $USER_HOME/.xsession echo "exec /usr/bin/qtile start" | tee -a "/etc/skel/.xsession" > /dev/null # Qtile Autostart.sh file mkdir -p $USER_HOME/.config/qtile/ if [ ! -f $USER_HOME/.config/qtile/autostart.sh ]; then cat << "QTILEAUTOSTART" > $USER_HOME/.config/qtile/autostart.sh #!/usr/bin/env bash # Picom - https://manpages.debian.org/stable/picom/picom.1.en.html pgrep -x picom > /dev/null || picom --backend xrender --vsync --no-fading-openclose --no-fading-destroyed-argb & # Picom use... --backend glx or xrender, --vsync --no-vsync --no-fading-openclose --no-fading-destroyed-argb etc. exec /usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1 & # Graphical authentication agent 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 auto-new-wallpaper-and-colors #feh --bg-scale $(find ~/Wallpapers -type f | shuf -n 1) fi wpctl set-volume @DEFAULT_AUDIO_SINK@ 10% & dunst & numlockx on & mpd & xrdb ~/.Xresources & xset r rate 200 35 & xset b off & keynav & # This if statement can be removed if you don't intend to make more users on this computer if [ -f ~/.first-login ]; then 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 gsettings set org.gnome.desktop.interface color-scheme prefer-dark rm ~/.first-login fi QTILEAUTOSTART chmod +x $USER_HOME/.config/qtile/autostart.sh else echo "File autostart.sh already exists." fi # Synaptics devices if grep -iq 'synaptics|synap' /proc/bus/input/devices; then echo "Synaptics touchpad detected. Installing xserver-xorg-input-synaptics and configuring autostart..." DEBIAN_FRONTEND=noninteractive apt install -y xserver-xorg-input-synaptics cat << EOF | tee -a "$USER_HOME/.config/qtile/autostart.sh" > /dev/null # Synaptics - Touchpad left click and right click. synclient TapButton1=1 TapButton2=3 & EOF fi # APT install under Unstable and Testing if [[ "$VERSION_CODENAME" == "$VERSION_CODENAME_SHOULD_NOT_BE" ]]; then echo "Your version of Debian is not compatible with This package" else DEBIAN_FRONTEND=noninteractive apt install -y freerdp2-x11 libfreerdp-client2-2 libfreerdp2-2 libwinpr2-2 DEBIAN_FRONTEND=noninteractive apt -y --ignore-missing install xautolock speedcrunch fonts-arkpandora echo "# Lock the computer automatically after X time of minutes, using xautolock and xsecurelock." | tee -a $USER_HOME/.config/qtile/autostart.sh echo 'xautolock -time 120 -locker "xsecurelock" -detectsleep -secure &' | tee -a $USER_HOME/.config/qtile/autostart.sh fi # MPD Setup & config START mkdir -p $USER_HOME/.config/mpd/playlists mkdir -p $USER_HOME/.local/state/mpd if [ ! -f $USER_HOME/.config/mpd/mpd.conf ]; then touch $USER_HOME/.config/mpd/database cat << MPDCONFIG > $USER_HOME/.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 # 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 # Nano config START if [ ! -f $USER_HOME/.nanorc ]; then cp /etc/nanorc $USER_HOME/.nanorc #sed -i 's/^# set linenumbers/set linenumbers/' $USER_HOME/.nanorc sed -i 's/^# set minibar/set minibar/' $USER_HOME/.nanorc sed -i 's/^# set softwrap/set softwrap/' $USER_HOME/.nanorc sed -i 's/^# set atblanks/set atblanks/' $USER_HOME/.nanorc else echo "File .nanorc already exists." fi # Neovim config Start if [ ! -f $USER_HOME/.config/nvim/init.vim ]; then mkdir -p $USER_HOME/.config/nvim cat << "NEOVIMCONFIG" > $USER_HOME/.config/nvim/init.vim syntax on set number set numberwidth=5 set relativenumber set ignorecase NEOVIMCONFIG else echo "Neovim config file already exists." fi # Kitty theme.conf Start if [ ! -f $USER_HOME/.cache/wal/colors-kitty.conf ]; then mkdir -p $USER_HOME/.cache/wal cat << "KITTYTHEMECONF" > $USER_HOME/.cache/wal/colors-kitty.conf background #1e3143 foreground #cec7bc color0 #1e3143 color1 #708191 color2 #bcc2be color3 #9ea5a3 color4 #717c7a color5 #a9a5a8 color6 #788483 color7 #c1c6c3 color8 #254657 color9 #496c80 color10 #28415a color11 #b1aea6 color12 #849aa3 color13 #c6c0b6 color14 #648896 color15 #cec7bc KITTYTHEMECONF else echo "kittytheme.conf file already exists." fi # Tmux config Start if [ ! -f $USER_HOME/.config/tmux/tmux.conf ]; then mkdir -p $USER_HOME/.config/tmux cat << "TMUXCONFIG" > $USER_HOME/.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} Xresources config Start ${NC}" #if [ ! -f $USER_HOME/.Xresources ]; then #cat << "XRCONFIG" > $USER_HOME/.Xresources #XRCONFIG #else # echo ".Xresources config file already exists." #fi # Themes START # Nerd Fonts - https://www.nerdfonts.com/font-downloads - https://www.nerdfonts.com/cheat-sheet # RUN "fc-list" to list the fonts install on the system. if [ ! -d /usr/share/fonts ]; then mkdir -p /usr/share/fonts else echo "fonts folder already exists." fi #JetBrainsMono (The default front in the configuration) curl -OL "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/JetBrainsMono.zip" unzip -n "JetBrainsMono.zip" -d "/usr/share/fonts/JetBrainsMono/" rm JetBrainsMono.zip rm -f /usr/share/fonts/JetBrainsMono/*.md rm -f /usr/share/fonts/JetBrainsMono/*.txt rm -f /usr/share/fonts/JetBrainsMono/LICENSE #RobotoMono curl -OL "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/RobotoMono.zip" unzip -n "RobotoMono.zip" -d "/usr/share/fonts/RobotoMono/" rm RobotoMono.zip rm -f /usr/share/fonts/RobotoMono/*.md rm -f /usr/share/fonts/RobotoMono/*.txt rm -f /usr/share/fonts/RobotoMono/LICENSE rm -f /usr/share/fonts/*.md rm -f /usr/share/fonts/*.txt rm -f /usr/share/fonts/LICENSE # Set the default font family to Noto in the /etc/fonts/local.conf file. if [ ! -f /etc/fonts/local.conf ]; then mkdir -p /etc/fonts bash -c 'cat << "FONTSLOCALCONFIG" >> /etc/fonts/local.conf Noto Sans serif Noto Serif sans-serif Noto Sans monospace Noto Mono Source Code Pro false FONTSLOCALCONFIG' else echo "fonts local.conf file already exists." fi if [ -d /usr/share/xsessions/ ]; then find /usr/share/xsessions/ -name plasma* -exec sudo rm -f {} \; sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 fi if [ -d /usr/share/wayland-sessions/ ]; then find /usr/share/wayland-sessions/ -name plasma* -exec sudo rm -f {} \; sudo update-alternatives --remove x-session-manager /usr/bin/startplasma-x11 fi rm -rf /tmp/EliverLara-Nordic git clone https://github.com/EliverLara/Nordic /tmp/EliverLara-Nordic cp -r /tmp/EliverLara-Nordic /usr/share/themes/ mkdir -p /usr/share/sddm/themes/Nordic-darker/ cp -r /tmp/EliverLara-Nordic/kde/sddm/Nordic-darker/* /usr/share/sddm/themes/Nordic-darker/ # Nordzy-cursors -------------------------------------------------------- # https://github.com/alvatip/Nordzy-cursors cd /tmp/ if [ -d Nordzy-cursors ]; then rm -rf Nordzy-cursors fi git clone https://github.com/alvatip/Nordzy-cursors cd Nordzy-cursors ./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 rm -rf Nordzy-icon fi git clone https://github.com/alvatip/Nordzy-icon cd Nordzy-icon/ ./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 kdir -p /etc/gtk-3.0 else echo "/etc/gtk-3.0 already exists." fi 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=JetBrainsMono Nerd Font 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 mkdir -p /etc/gtk-4.0 else echo "/etc/gtk-4.0 already exists." fi 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=JetBrainsMono Nerd Font 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' sed -i 's/Adwaita/Nordzy-cursors/g' /usr/share/icons/default/index.theme # GTK Settings END -------------------------- fc-cache -fv # ------------------------------------------------------------------------------------------------- # xrandr-set-max + Xsession START if [ ! -f /usr/bin/xrandr-set-max ]; then # Define the content of the script xrandrsetmaxcontent=$(cat << "XRANDRSETMAX" #!/usr/bin/env 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" | tee /usr/bin/xrandr-set-max >/dev/null # SDDM Before Login - /usr/share/sddm/scripts/Xsetup and After Login - /usr/share/sddm/scripts/Xsession sed -i '$a\. /usr/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsetup #sed -i '$a\. /usr/bin/xrandr-set-max' /usr/share/sddm/scripts/Xsession chmod +x /usr/bin/xrandr-set-max else echo "xrandr-set-max already exists." fi #if [ ! -f /etc/X11/Xsession.d/90_xrandr-set-max ]; then # cp /usr/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 # ------------------------------------------------------------------------------------------------- # Rofi Run menu START if [ ! -d $USER_HOME/.config/rofi ]; then mkdir -p $USER_HOME/.config/rofi else echo "Rofi folder already exists." fi if [ ! -f $USER_HOME/.config/rofi/config.rasi ]; then #touch $USER_HOME/.config/rofi/config.rasi cat << "ROFICONFIG" > $USER_HOME/.config/rofi/config.rasi configuration { display-drun: "Applications:"; display-window: "Windows:"; drun-display-format: "{name}"; font: "JetBrainsMono Nerd Font Propo 11"; modi: "window,run,drun"; } /* The Theme */ @import "~/.cache/wal/colors-rofi-dark.rasi" // Theme location is "/usr/share/rofi/themes/name.rasi" //@theme "/usr/share/rofi/themes/Arc-Dark.rasi" ROFICONFIG else echo "Rofi config file already exists." fi # Rofi Wifi menu # https://github.com/ericmurphyxyz/rofi-wifi-menu/tree/master if [ ! -f $USER_HOME/.config/rofi/rofi-wifi-menu.sh ]; then cat << "ROFIWIFI" > $USER_HOME/.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 $USER_HOME/.config/rofi/rofi-wifi-menu.sh else echo "Rofi WiFi menu file already exists." fi if [ ! -f /location/powermenu.sh ]; then mkdir -p $USER_HOME/.config/rofi cat << "ROFIPOWERMENU" > $USER_HOME/.config/rofi/powermenu.sh #!/usr/bin/env bash chosen=$(printf "󰒲 Suspend System\n System Shutdown\n󰤄 Hibernate System\n Lockdown Mode\n Reboot" | rofi -dmenu -i -theme-str '@import "powermenu.rasi"') case "$chosen" in "󰒲 Suspend System") sudo systemctl suspend ;; " System Shutdown") sudo shutdown now ;; "󰤄 Hibernate System") sudo systemctl hibernate ;; " Lockdown Mode") xsecurelock ;; " Reboot") sudo reboot ;; *) exit 1 ;; esac ROFIPOWERMENU else echo "powermenu.sh file already exists." fi chmod +x $USER_HOME/.config/rofi/powermenu.sh if [ ! -f $USER_HOME/.config/rofi/powermenu.rasi ]; then mkdir -p $USER_HOME/.config/rofi cat << "ROFIPOWERMENURASI" > $USER_HOME/.config/rofi/powermenu.rasi inputbar { children: [entry]; } listview { lines: 5; } ROFIPOWERMENURASI else echo "powermenu.rasi file already exists." fi # Add xfce4 file helpers if [ ! -f $USER_HOME/.config/xfce4/helpers.rc ]; then mkdir -p $USER_HOME/.config/xfce4 cat << "XFCE4HELPER" > $USER_HOME/.config/xfce4/helpers.rc FileManager=Thunar TerminalEmulator=kitty WebBrowser=google-chrome MailReader= XFCE4HELPER else echo "xfce4 helper config file already exists." fi # Add kitty to open nvim and vim. if [ -f /usr/share/applications/nvim.desktop ]; then sed -i 's/Exec=nvim %F/Exec=kitty -e nvim %F/' /usr/share/applications/nvim.desktop else echo "no nvim.desktop file" fi if [ -f /usr/share/applications/vim.desktop ]; then sed -i 's/Exec=vim %F/Exec=kitty -e vim %F/' /usr/share/applications/vim.desktop else echo "no vim.desktop file" fi # # # # # # # # # # # # Kitty config file. if [ ! -f $USER_HOME/.config/kitty/kitty.conf ]; then mkdir -p $USER_HOME/.config/kitty/themes cat << "KITTYCONFIG" > $USER_HOME/.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 JetBrainsMono Nerd Font Mono bold_font auto italic_font auto bold_italic_font auto font_size 14 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 ~/.cache/wal/colors-kitty.conf KITTYCONFIG else echo "Kitty config already exists." fi # ------------------------------------------------------------------------------------------------- # Check for Nvidia graphics card and install drivers ---------------------------------------------- if lspci | grep -i nvidia; then echo "Installing required packages..." apt -y install linux-headers-$(uname -r) apt -y install gcc make acpid dkms libglvnd-core-dev libglvnd0 libglvnd-dev echo "Blacklisting nouveau..." BLACKLIST_CONF="/etc/modprobe.d/blacklist.conf" echo "blacklist nouveau" | tee -a $BLACKLIST_CONF echo "Removing old NVIDIA drivers..." apt remove -y nvidia-* && apt autoremove -y $(dpkg -l nvidia-driver* | grep ii | awk '{print $2}') echo "Enabling i386 architecture and installing 32-bit libraries..." dpkg --add-architecture i386 && apt update && apt install -y libc6:i386 echo "Updating GRUB configuration..." GRUB_CONF="/etc/default/grub" sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/"$/ rd.driver.blacklist=nouveau"/' $GRUB_CONF update-grub #NVIDIAGETVERSION=570.133.07 NVIDIAGETVERSION="$(curl -s "https://www.nvidia.com/en-us/drivers/unix/" | grep "Latest Production Branch Version:" | awk -F'"> ' '{print $2}' | cut -d'<' -f1 | awk 'NR==1')" echo "Downloading and installing NVIDIA $NVIDIAGETVERSION driver..." wget https://us.download.nvidia.com/XFree86/Linux-x86_64/$NVIDIAGETVERSION/NVIDIA-Linux-x86_64-$NVIDIAGETVERSION.run chmod +x NVIDIA-Linux-x86_64-$NVIDIAGETVERSION.run ./NVIDIA-Linux-x86_64-$NVIDIAGETVERSION.run --no-questions --run-nvidia-xconfig echo 'nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"' >> $USER_HOME/.config/qtile/autostart.sh fi # Qtile Config file if [ ! -f $USER_HOME/.config/qtile/config.py ]; then cat << "QTILECONFIG" > $USER_HOME/.config/qtile/config.py # Qtile Config - Start # https://docs.qtile.org/en/latest/index.html # -',.-'-,.'-,'.-',.-',-.'-,.'-,.'-,.'-,'.-',.-'- import os import subprocess import json 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() # 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 ------------------------------------------------------ #Pywal Colors colors = os.path.expanduser("~/.cache/wal/colors.json") colordict = json.load(open(colors)) Color0 = colordict["colors"]["color0"] Color1 = colordict["colors"]["color1"] Color2 = colordict["colors"]["color2"] Color3 = colordict["colors"]["color3"] Color4 = colordict["colors"]["color4"] Color5 = colordict["colors"]["color5"] Color6 = colordict["colors"]["color6"] Color7 = colordict["colors"]["color7"] Color8 = colordict["colors"]["color8"] Color9 = colordict["colors"]["color9"] Color10 = colordict["colors"]["color10"] Color11 = colordict["colors"]["color11"] Color12 = colordict["colors"]["color12"] Color13 = colordict["colors"]["color13"] Color14 = colordict["colors"]["color14"] Color15 = colordict["colors"]["color15"] # Colors use example active=Color1, mod = "mod4" terminal = "kitty -o background_opacity=0.95" 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, "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 Color Theme from Wallpapers"), Key([mod, "control", "mod1"], "w", lazy.spawn(os.path.expanduser("~/.config/rofi/rofi-wifi-menu.sh")), desc="WiFi Manager"), Key([mod, "control", "mod1"], "p", lazy.spawn(os.path.expanduser("~/.config/rofi/powermenu.sh")), desc="Power Menu"), Key([mod, "control", "mod1"], "n", lazy.spawn(os.path.expanduser("kitty -e 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 󰧞 # Group Match example: # Group("1", label="", layout="monadtall", matches=[Match(wm_class=re.compile(r"^(Google\-chrome)$"))]), groups = [ Group("1", label="", layout="monadtall"), 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"), Group("0", label="", layout="monadtall"), ] 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": Color6, "border_normal": Color2 } layout_theme = init_layout_theme() layouts = [ layout.MonadTall(ratio=0.65, **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="JetBrainsMono Nerd Font", 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=Color14, this_screen_border=Color3, urgent_border=Color7, active=Color5, inactive=Color8, 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=16), # NB Wayland is incompatible with Systray, consider using StatusNotifier # widget.StatusNotifier(icon_size=16), #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.ThermalSensor(tag_sensor="CPU", update_interval=10), widget.Volume(fmt=" {}"), widget.Spacer(length=5), widget.Clock(fmt=" {}",format="%A %d-%m-%Y %H:%M %p"), widget.QuickExit(default_text='', countdown_format='{}', fontsize=16), widget.Spacer(length=20), ], 30, # Define bar height background=Color0, opacity=0.90, # Bar background color can also take transparency with "hex color code" or 0.XX 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=[Color2, Color2, Color2, Color2] # 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.png", #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 ], no_reposition_rules=[ Match(wm_class="pavucontrol"), ], ) 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 # --------------------------------------------------------------------------------------- cd /tmp/ # QMADE Git clone install git clone https://github.com/ITmail-dk/qmade # Add Wallpapers if [ ! -d $USER_HOME/Wallpapers ]; then mkdir -p $USER_HOME/Wallpapers cp qmade/wallpapers/* $USER_HOME/Wallpapers/ else echo "Wallpapers folder already exists." fi chmod 777 /usr/share/wallpapers cp $(find qmade/wallpapers -type f -name "*.jpg" | shuf -n 1) /usr/share/wallpapers/login-wallpape.jpg chmod 777 /usr/share/wallpapers/login-wallpape.jpg # SDDM New login wallpaper chmod 777 /usr/share/sddm/themes/breeze chmod 777 /usr/share/sddm/themes/breeze/theme.conf NEW_LOGIN_WALLPAPER="/usr/share/wallpapers/login-wallpape.jpg" # Check if the file exists if [ -f "/usr/share/sddm/themes/breeze/theme.conf" ]; then # Use sed to replace the background line sed -i "s|background=.*$|background=$NEW_LOGIN_WALLPAPER|" "/usr/share/sddm/themes/breeze/theme.conf" echo "Updated background image in /usr/share/sddm/themes/breeze/theme.conf" else echo "Error: File /usr/share/sddm/themes/breeze/theme.conf not found" fi # FastFetch Install. FASTFETCH_VERSION=2.40.3 wget https://github.com/fastfetch-cli/fastfetch/releases/download/$FASTFETCH_VERSION/fastfetch-linux-amd64.deb && dpkg -i fastfetch-linux-amd64.deb && rm fastfetch-linux-amd64.deb # WaterFox install - https://www.waterfox.net/download/ WATERFOX_VERSION=6.5.7 wget -O waterfox.tar.bz2 https://cdn1.waterfox.net/waterfox/releases/$WATERFOX_VERSION/Linux_x86_64/waterfox-$WATERFOX_VERSION.tar.bz2 tar -xvf waterfox.tar.bz2 mv waterfox /opt/ chown -R root:root /opt/waterfox/ cat << EOF | tee "/usr/share/applications/waterfox.desktop" > /dev/null [Desktop Entry] Name=Waterfox Exec=/opt/waterfox/waterfox Icon=/opt/waterfox/browser/chrome/icons/default/default128.png Type=Application Categories=Network;WebBrowser; EOF ln -s /opt/waterfox/waterfox /usr/bin/waterfox # Yazi File Manager # https://github.com/sxyazi/yazi/releases/latest YAZI_VERSION=v25.4.8 wget https://github.com/sxyazi/yazi/releases/download/$YAZI_VERSION/yazi-x86_64-unknown-linux-musl.zip unzip yazi-x86_64-unknown-linux-musl.zip cp yazi-x86_64-unknown-linux-musl/yazi /usr/bin/ chown root:root /usr/bin/yazi chmod +x /usr/bin/yazi # LM-Sensors config sensors-detect --auto # Systemctl enable --user # See list run: systemctl list-unit-files --state=enabled if [ $(whoami) != "root" ]; then # Sound systemctl enable --user systemctl enable --user --now pipewire.socket pipewire-pulse.socket wireplumber.service else echo "User is root" fi # chown new user files and folders chown -R $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.config chown -R $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.cache chown -R $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.local chown -R $NEW_USERNAME:$NEW_USERNAME $USER_HOME/Wallpapers chown $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.face.icon chown $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.nanorc chown $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.xsession chown $NEW_USERNAME:$NEW_USERNAME $USER_HOME/.first-login # Edit GRUB BOOT TIMEOUT ---------------------------------------------------------------- sed -i 's+GRUB_TIMEOUT=5+GRUB_TIMEOUT=1+g' /etc/default/grub && update-grub # --------------------------------------------------------------------------------------- # Install Done ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ##### ## # ---------------------------------------------------------------------------------------