#!/usr/bin/env bash ## Copyright (C) 2020-2024 Aditya Shakya ## ## Script To Apply Themes ## Theme ------------------------------------ TDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" THEME="${TDIR##*/}" source "$HOME"/.config/openbox/themes/"$THEME"/theme.bash altbackground="`pastel color $background | pastel darken $dark_value | pastel format hex`" altforeground="`pastel color $foreground | pastel lighten $light_value | pastel format hex`" ## Directories ------------------------------ PATH_CONF="$HOME/.config" PATH_TERM="$PATH_CONF/alacritty" PATH_DUNST="$PATH_CONF/dunst" PATH_GEANY="$PATH_CONF/geany" PATH_OBOX="$PATH_CONF/openbox" PATH_PBAR="$PATH_OBOX/themes/$THEME/polybar" PATH_ROFI="$PATH_OBOX/themes/$THEME/rofi" PATH_XFCE="$PATH_CONF/xfce4/terminal" ## Wallpaper --------------------------------- apply_wallpaper() { for head in {0..10}; do nitrogen --head=$head --save --set-zoom-fill "$wallpaper" &>/dev/null done } ## Polybar ----------------------------------- apply_polybar() { # modify polybar launch script sed -i -e "s/STYLE=.*/STYLE=\"$THEME\"/g" ${PATH_OBOX}/themes/polybar.sh # apply default theme fonts sed -i -e "s/font-0 = .*/font-0 = \"$polybar_font\"/g" ${PATH_PBAR}/config.ini # rewrite colors file cat > ${PATH_PBAR}/colors.ini <<- EOF [color] BACKGROUND = ${background} FOREGROUND = ${foreground} ALTBACKGROUND = ${altbackground} ALTFOREGROUND = ${altforeground} ACCENT = ${accent} BLACK = ${color0} RED = ${color1} GREEN = ${color2} YELLOW = ${color3} BLUE = ${color4} MAGENTA = ${color5} CYAN = ${color6} WHITE = ${color7} ALTBLACK = ${color8} ALTRED = ${color9} ALTGREEN = ${color10} ALTYELLOW = ${color11} ALTBLUE = ${color12} ALTMAGENTA = ${color13} ALTCYAN = ${color14} ALTWHITE = ${color15} EOF } ## Tint2 ----------------------------------- apply_tint2() { # modify tint2 launch script sed -i -e "s/STYLE=.*/STYLE=\"$THEME\"/g" ${PATH_OBOX}/themes/tint2.sh } # Rofi -------------------------------------- apply_rofi() { # modify rofi scripts sed -i -e "s/STYLE=.*/STYLE=\"$THEME\"/g" \ ${PATH_OBOX}/scripts/rofi-askpass \ ${PATH_OBOX}/scripts/rofi-bluetooth \ ${PATH_OBOX}/scripts/rofi-launcher \ ${PATH_OBOX}/scripts/rofi-music \ ${PATH_OBOX}/scripts/rofi-powermenu \ ${PATH_OBOX}/scripts/rofi-runner \ ${PATH_OBOX}/scripts/rofi-screenshot # apply default theme fonts sed -i -e "s/font:.*/font: \"$rofi_font\";/g" ${PATH_ROFI}/shared/fonts.rasi # rewrite colors file cat > ${PATH_ROFI}/shared/colors.rasi <<- EOF * { background: ${background}; background-alt: ${altbackground}; foreground: ${foreground}; selected: ${accent}; active: ${color2}; urgent: ${color1}; } EOF # modify icon theme if [[ -f "$PATH_CONF"/rofi/config.rasi ]]; then sed -i -e "s/icon-theme:.*/icon-theme: \"$rofi_icon\";/g" ${PATH_CONF}/rofi/config.rasi fi } # Network Menu ------------------------------ apply_netmenu() { if [[ -f "$PATH_CONF"/networkmanager-dmenu/config.ini ]]; then sed -i -e "s#dmenu_command = .*#dmenu_command = rofi -dmenu -theme $PATH_ROFI/networkmenu.rasi#g" ${PATH_CONF}/networkmanager-dmenu/config.ini fi } # Terminal ---------------------------------- apply_terminal() { # alacritty : fonts sed -i ${PATH_TERM}/fonts.toml \ -e "s/family = .*/family = \"$terminal_font_name\"/g" \ -e "s/size = .*/size = $terminal_font_size/g" # alacritty : colors cat > ${PATH_TERM}/colors.toml <<- _EOF_ ## Colors configuration [colors.primary] background = "${background}" foreground = "${foreground}" [colors.normal] black = "${color0}" red = "${color1}" green = "${color2}" yellow = "${color3}" blue = "${color4}" magenta = "${color5}" cyan = "${color6}" white = "${color7}" [colors.bright] black = "${color8}" red = "${color9}" green = "${color10}" yellow = "${color11}" blue = "${color12}" magenta = "${color13}" cyan = "${color14}" white = "${color15}" _EOF_ # xfce terminal : fonts & colors sed -i ${PATH_XFCE}/terminalrc \ -e "s/FontName=.*/FontName=$terminal_font_name $terminal_font_size/g" \ -e "s/ColorBackground=.*/ColorBackground=${background}/g" \ -e "s/ColorForeground=.*/ColorForeground=${foreground}/g" \ -e "s/ColorCursor=.*/ColorCursor=${foreground}/g" \ -e "s/ColorPalette=.*/ColorPalette=${color0};${color1};${color2};${color3};${color4};${color5};${color6};${color7};${color8};${color9};${color10};${color11};${color12};${color13};${color14};${color15}/g" } # Geany ------------------------------------- apply_geany() { sed -i ${PATH_GEANY}/geany.conf \ -e "s/color_scheme=.*/color_scheme=$geany_colors/g" \ -e "s/editor_font=.*/editor_font=$geany_font/g" } # Appearance -------------------------------- apply_appearance() { # apply gtk theme, icons, cursor & fonts xfconf-query -c xsettings -p /Gtk/FontName -s "$gtk_font" xfconf-query -c xsettings -p /Net/ThemeName -s "$gtk_theme" xfconf-query -c xsettings -p /Net/IconThemeName -s "$icon_theme" xfconf-query -c xsettings -p /Gtk/CursorThemeName -s "$cursor_theme" # inherit cursor theme if [[ -f "$HOME"/.icons/default/index.theme ]]; then sed -i -e "s/Inherits=.*/Inherits=$cursor_theme/g" "$HOME"/.icons/default/index.theme fi } # Openbox ----------------------------------- apply_obconfig () { namespace="http://openbox.org/3.4/rc" config="$PATH_OBOX/rc.xml" # Theme xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:name' -v "$ob_theme" "$config" # Title xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:titleLayout' -v "$ob_layout" "$config" # Fonts xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:weight' -v Bold "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveWindow"]/a:slant' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:weight' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveWindow"]/a:slant' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:weight' -v Bold "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuHeader"]/a:slant' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:weight' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="MenuItem"]/a:slant' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:weight' -v Bold "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="ActiveOnScreenDisplay"]/a:slant' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:name' -v "$ob_font" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:size' -v "$ob_font_size" "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:weight' -v Normal "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:theme/a:font[@place="InactiveOnScreenDisplay"]/a:slant' -v Normal "$config" # Openbox Menu Style xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:menu/a:file' -v "$ob_menu" "$config" # Margins xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:margins/a:top' -v ${ob_margin_t} "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:margins/a:bottom' -v ${ob_margin_b} "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:margins/a:left' -v ${ob_margin_l} "$config" xmlstarlet ed -L -N a="$namespace" -u '/a:openbox_config/a:margins/a:right' -v ${ob_margin_r} "$config" # Reload Openbox Config openbox --reconfigure } # Dunst ------------------------------------- apply_dunst() { # modify dunst config sed -i ${PATH_DUNST}/dunstrc \ -e "s/width = .*/width = $dunst_width/g" \ -e "s/height = .*/height = $dunst_height/g" \ -e "s/offset = .*/offset = $dunst_offset/g" \ -e "s/origin = .*/origin = $dunst_origin/g" \ -e "s/font = .*/font = $dunst_font/g" \ -e "s/frame_width = .*/frame_width = $dunst_border/g" \ -e "s/separator_height = .*/separator_height = $dunst_separator/g" \ -e "s/line_height = .*/line_height = $dunst_separator/g" # modify colors sed -i '/urgency_low/Q' ${PATH_DUNST}/dunstrc cat >> ${PATH_DUNST}/dunstrc <<- _EOF_ [urgency_low] timeout = 2 background = "${background}" foreground = "${foreground}" frame_color = "${altbackground}" [urgency_normal] timeout = 5 background = "${background}" foreground = "${foreground}" frame_color = "${altbackground}" [urgency_critical] timeout = 0 background = "${background}" foreground = "${color1}" frame_color = "${color1}" _EOF_ # restart dunst pkill dunst && dunst & } # Plank ------------------------------------- apply_plank() { # create temporary config file cat > "$HOME"/.cache/plank.conf <<- _EOF_ [dock1] alignment='center' auto-pinning=true current-workspace-only=false dock-items=['xfce-settings-manager.dockitem', 'Alacritty.dockitem', 'thunar.dockitem', 'firefox.dockitem', 'geany.dockitem'] hide-delay=0 hide-mode='$plank_hmode' icon-size=$plank_icon_size items-alignment='center' lock-items=false monitor='' offset=$plank_offset pinned-only=false position='$plank_position' pressure-reveal=false show-dock-item=false theme='$plank_theme' tooltips-enabled=true unhide-delay=0 zoom-enabled=true zoom-percent=$plank_zoom_percent _EOF_ # apply config and reload plank cat "$HOME"/.cache/plank.conf | dconf load /net/launchpad/plank/docks/ } # Compositor -------------------------------- apply_compositor() { picom_cfg="$PATH_CONF/picom.conf" # modify picom config sed -i "$picom_cfg" \ -e "s/backend = .*/backend = \"$picom_backend\";/g" \ -e "s/corner-radius = .*/corner-radius = $picom_corner;/g" \ -e "s/shadow-radius = .*/shadow-radius = $picom_shadow_r;/g" \ -e "s/shadow-opacity = .*/shadow-opacity = $picom_shadow_o;/g" \ -e "s/shadow-offset-x = .*/shadow-offset-x = $picom_shadow_x;/g" \ -e "s/shadow-offset-y = .*/shadow-offset-y = $picom_shadow_y;/g" \ -e "s/method = .*/method = \"$picom_blur_method\";/g" \ -e "s/strength = .*/strength = $picom_blur_strength;/g" } # Create Theme File ------------------------- create_file() { theme_file="$PATH_OBOX/themes/.current" if [[ ! -f "$theme_file" ]]; then touch ${theme_file} fi echo "$THEME" > ${theme_file} } # Notify User ------------------------------- notify_user() { dunstify -u normal -h string:x-dunst-stack-tag:applytheme -i /usr/share/archcraft/icons/dunst/themes.png "Applying Style : $THEME" } ## Execute Script --------------------------- notify_user create_file apply_wallpaper apply_polybar apply_tint2 apply_rofi apply_netmenu apply_terminal apply_geany apply_appearance apply_obconfig apply_dunst apply_plank apply_compositor # launch polybar / tint2 bash ${PATH_OBOX}/themes/launch-bar.sh # fix cursor theme (run it in the end) xsetroot -cursor_name left_ptr