diff --git a/.config/bspwm/autostart b/.config/bspwm/autostart new file mode 100755 index 0000000..5f9f987 --- /dev/null +++ b/.config/bspwm/autostart @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +killall bspc + +# Splashscreen +pgrep sxhkd || mpv --fullscreen --no-input-default-bindings --no-config --on-all-workspaces ~/Videos/Renders/splash.mp4 + +# Compositor +picom -b --config $HOME/.xmonad/scripts/picom.conf & + +# cursor +xsetroot -cursor_name left_ptr & + +# apply colorscheme to spotify +#~/.ricing/wal-spotify.sh > /dev/null& + +# Source the colorscheme +#echo alpha="ff" >> "${HOME}/.cache/wal/colors.sh" +#source "${HOME}/.cache/wal/colors.sh" + +# Walllpaper +~/scripts/random_wallpaper.sh + +# Authentication agent +#/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1& + +# mapcheck +#killall osucheck.sh +#killall inotifywait +#~/.osuthings/osucheck.sh "/home/$USER/.osutmp"& +#~/.osuthings/osucheck.sh "/home/$USER/Downloads"& + +# Tablet drivers +#otd& + +# Statusbar +#eww -c ~/.config/eww/eww-bar open bar +eww -c ~/.config/eww/mybar open bar_right +eww -c ~/.config/eww/mybar open bar_center +eww -c ~/.config/eww/mybar open bar_left +#killall polybar +#polybar -c ~/.config/eww/mybar/polybar_tray.ini tray& + +#Applets +#killall blueman-applet +#killall pa-applet +#killall nm-applet +#killall flameshot +#blueman-applet& +#pa-applet --disable-key-grabbing --disable-notifications& +#nm-applet& +#flameshot& + +# daemons +#killall dunst +#dunst -lf $foreground \ +# -lb $color0$alpha \ +# -lfr $color9\ +# -nf $foreground \ +# -nb $color0$alpha \ +# -nfr $color9 \ +# -cf $foreground \ +# -cb $color0$alpha \ +# -cfr $color9 > /dev/null 2>&1 & +#thunar --daemon& + + +# Master layout +#for (( i=1; i < 10; i++));do +# #bsp-layout set tiled $i +# true +#done + +# Sounds +#~/.bscripts/sounds.sh& + +# idle +#killall idle.sh +#pgrep idle.sh || ~/.bscripts/idle.sh > /dev/null 2> /dev/null& + +# borders +#.bscripts/borders.sh& + +# Emacs Daemon +emacs --daemon + +# Launch keybinding daemon +killall sxhkd +sxhkd -c ~/.config/bspwm/sxhkdrc > /dev/null 2> /dev/null& diff --git a/.config/bspwm/bspwmrc b/.config/bspwm/bspwmrc new file mode 100755 index 0000000..0bc171b --- /dev/null +++ b/.config/bspwm/bspwmrc @@ -0,0 +1,72 @@ +#!/bin/sh + +# wgtk stuff +#wpg -R wallpaper.png +#wpg -s wallpaper.png +#source "${HOME}/.cache/wal/colors.sh" + +# Set environment +export BSPWM_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/bspwm" + +bspc monitor -d 1 2 3 4 5 + +bspc config border_width 5 +bspc config window_gap 20 +#bspc config border_radius 2 +bspc config focus_follows_pointer true +bspc config gapless_monocle true +#bspc config pointer_follows_focus true +#bspc config single_monocle true +bspc config top_monocle_padding 20 +bspc config left_monocle_padding 20 +bspc config right_monocle_padding 20 +bspc config bottom_monocle_padding 20 +#bspc config ignore_ewmh_fullscreen enter + +bspc rule --add Blueman-manager state=floating rectangle=610x610+650+235 +bspc rule --add Surf layer=above border=off rectangle=415x1100+0+0 +bspc rule --add Surfdload state=floating layer=above border=off rectangle=415x75+0+0 sticky=on focus=off +bspc rule --add Brave-browser rectangle=1130x800+395+140 +bspc rule --add Polkit-gnome-authentication-agent-1 rectangle=810x280+555+399 +bspc rule --add Polybar layer=below manage=off +bspc rule --add kozu state=floating rectangle=1910x200+0+870 layer=above +bspc rule --add cava state=floating manage=off rectangle=1920x1050+0+50 border=off sticky=on locked=on layer=below focus=off +#bspc rule --add Pqiv manage=off border=off #rectangle=110x50+260+20 +bspc rule --add Nautilus state=floating +bspc rule --add mpv state=floating border=off +bspc rule --add Rofi manage=off +bspc rule --add Pavucontrol state=floating rectangle=610x610+650+235 +bspc rule --add Yad state=floating +bspc rule --add Thunar rectangle=650x500+635+290 +bspc rule --add flameshot state=floating border=off + + +# Colors +bspc config focused_border_color "$color9" +bspc config active_border_color "$color9" +bspc config normal_border_color "$color1" +bspc config urgent_border_color "$color1" +bspc config presel_feedback_color "$color1" +bspc config focused_locked_border_color "$color1" +bspc config active_locked_border_color "$color1" +bspc config normal_locked_border_color "$color1" +bspc config focused_sticky_border_color "$color1" +bspc config active_sticky_border_color "$color1" +bspc config normal_sticky_border_color "$color1" +bspc config focused_private_border_color "$color1" +bspc config active_private_border_color "$color1" +bspc config normal_private_border_color "$color1" + +# Load session +# shellcheck source=/dev/null +#. "$BSPWM_CONFIG/restore.cfg" +#if [ -e "$BSPWM_STATE" ] ; then +# bspc wm --load-state "$BSPWM_STATE" +# bspc wm --adopt-orphans +# rm "$BSPWM_STATE" +#fi + +#Move thumbnails +#xdotool search "pqiv: /tmp/thumbnail.png" windowmove 256 20 +# Autostart +"$BSPWM_CONFIG/autostart" & diff --git a/.config/bspwm/sxhkdrc b/.config/bspwm/sxhkdrc new file mode 100644 index 0000000..5006710 --- /dev/null +++ b/.config/bspwm/sxhkdrc @@ -0,0 +1,202 @@ +#Config file for simple X hotkey daemon + +#"Pausing" sxhkd +super+Return + alacritty +#Apps and programs +super+e + emacsclient -c -a 'emacs' +super+b + qutebrowser +super+f + firefox +# workspace +super + {1,2,3,4,5} + bspc desktop -f {1,2,3,4,5} +super + shift + {1-5} + bspc node -d '^{1-5}' + +#control+alt+w +# brave +#control+alt+t +# kitty +##control+alt+g +## lutris +#control+alt+f +# thunar +#super+shift+c +# /home/kz87/.bscripts/wc.sh +# +##rofi things +##Launch apps +#super+shift+e +# ~/.bscripts/rofi.sh drun +# +##Window switcher +#alt+Tab +# ~/.bscripts/rofi.sh window +# +##Configuration launcher +#super+shift+s +# ~/.bscripts/rofi.sh config +# +##Resolution switcher +##control+shift+p +# #bash -c "~/.bscripts/rofi.sh resolution" +# +##Screenshot +#Print +# ~/.bscripts/ss.sh +##Delayed screenshot +#super+Print +# sleep 3 && ~/.bscripts/ss.sh +# +##Color picker +#control+alt+c +# colorpicker --short --one-shot | xclip -selection "clipboard" +# +##Suspend the pc +#super+o +# ~/.bscripts/lock.sh +# +##Osu stuff +#control+alt+o +# xsetwacom --set "HUION 420 Pen stylus" Area 1000 0 5000 3700 +#shift+control+o +# xsetwacom set "HUION 420 Pen stylus" ResetArea +##super+x +## ~/.osuthings/surfdirect.sh raise +##super+z +## ~/.osuthings/surfdirect.sh lower +# +##Window and workspace shenanigans +#super+c +# wmctrl -c `xdotool getwindowfocus` -i +#alt+F4 +# xdotool getwindowfocus windowclose +#control+period +# ~/.bscripts/wpm_reports.sh move +1 +#control+comma +# ~/.bscripts/wpm_reports.sh move -1 +#control+alt+period +# ~/.bscripts/wpm_reports.sh select +1 +#control+alt+comma +# ~/.bscripts/wpm_reports.sh select -1 +#super+{1,2,3,4,5} +# ~/.bscripts/wpm_reports.sh jump {0,1,2,3,4} +# +##Weeb +#control+alt+b +# ~/.mangaread +# +##Display stuff +#super+control+p +# xrandr --output HDMI1 --auto --left-of eDP1 +#super+shift+p +# xrandr -s 0 +# +## Toggle picom +super+p + [[ `pgrep -c picom` -eq 0 ]] && picom -b --config $HOME/.xmonad/scripts/picom.conf || killall picom + +##Keyboard layouts +#super+space +# ~/.config/eww/mybar/scripts/kb_layouts cycle es us +# +##Media controls +#alt+period +# ~/.bscripts/volume.sh up #&& pkill -RTMIN+2 i3blocks +#alt+comma +# ~/.bscripts/volume.sh down #&& pkill -RTMIN+2 i3blocks +#alt+m +# ~/.bscripts/volume.sh mute +#XF86AudioRaiseVolume +# ~/.bscripts/volume.sh up #&& pkill -RTMIN+2 i3blocks +#XF86AudioLowerVolume +# ~/.bscripts/volume.sh down#&& pkill -RTMIN+2 i3blocks +#XF86AudioMute +# ~/.bscripts/volume.sh mute #&& pkill -RTMIN+2 i3blocks +#alt+shift+period +# ~/.bscripts/brightness.sh up +#alt+shift+comma +# ~/.bscripts/brightness.sh down +#Pause +# playerctl play-pause +#XF86AudioPlay +# playerctl play-pause +#XF86AudioPause +# playerctl play-pause +#XF86AudioNext +# playerctl next +#XF86AudioPrev +# playerctl previous +# +##Open-close eww +#control+alt+e +# ~/.config/eww/dashboard/launch_dashboard +#super+m +# ~/.config/eww/mybar/scripts/popup_music +# +##bspwm stuff +#super+s +# bspc desktop focused --layout next && polybar-msg hook layout 1 +#super+shift+q +# ~/.bscripts/rofi.sh outopts +#XF86PowerOff +# ~/.bscripts/rofi.sh outopts +##super+shift+r +## bspc wm -r +#control+alt+space +# ~/.bscripts/toggle_float.sh +#super+shift+{k,j,h,l} +# play -v 0.4 ~/Documents/Sounds/tile.wav& ~/.bscripts/bsmove.sh {north,south,west,east} +#super+{k,j,h,l} +# ~/.bscripts/bselect.sh {north,south,west,east} +# +#super+alt+l +# bspc node focused -z right 15 0 +#super+alt+h +# bspc node focused -z left -15 0 +#super+alt+k +# bspc node focused -z top 0 -15 +#super+alt+j +# bspc node focused -z bottom 0 15 +#super+{d,a} +# play -v 0.4 ~/Documents/Sounds/tile.wav& bspc node @/ -C {forward,backward} +#alt+{d,a} +# play -v 0.4 ~/Documents/Sounds/tile.wav& bspc node first_ancestor -R {90,270} +#super+e +# play -v 0.4 ~/Documents/Sounds/tile.wav& bspc node first_ancestor --balance +# +#control+shift+h +# bspc node focused -z right -15 0 +#control+shift+l +# bspc node focused -z left 15 0 +#control+shift+j +# bspc node focused -z top 0 15 +#control+shift+k +# bspc node focused -z bottom 0 -15 +# +super+space + if [ -z "$(bspc query -N -n focused.fullscreen)" ]; then \ + bspc node focused -t fullscreen; \ + else \ + bspc node focused -t tiled; \ + fi; +#super+KP_Add +# bspc config window_gap $(( 5 + `bspc config window_gap` )) +#super+KP_Subtract +# bspc config window_gap $(( -5 + `bspc config window_gap` )) +# +#control+alt+{k,j,h,l} +# bspc node --presel-dir ~{north,south,west,east} +# +#control+alt+a +# if [[ ! -z "$(bspc query -N -n focused.normal)" ]]; then \ +# bspc node focused -l above; \ +# elif [[ ! -z "$(bspc query -N -n focused.above)" ]]; then \ +# bspc node focused -l below; \ +# else \ +# bspc node focused -l normal; \ +# fi; +# diff --git a/.config/eww/eww-bar/eww-bar.png b/.config/eww/eww-bar/eww-bar.png new file mode 100644 index 0000000..e6de6a8 Binary files /dev/null and b/.config/eww/eww-bar/eww-bar.png differ diff --git a/.config/eww/eww-bar/eww.scss b/.config/eww/eww-bar/eww.scss new file mode 100644 index 0000000..efa2a50 --- /dev/null +++ b/.config/eww/eww-bar/eww.scss @@ -0,0 +1,55 @@ +* { + all: unset; //Unsets everything so you can style everything from scratch +} + +//Global Styles +.bar { + background-color: #3a3a3a; + color: #b0b4bc; + padding: 10px; +} + +// Styles on classes (see eww.yuck for more information) + +.sidestuff slider { + all: unset; + color: #ffd5cd; +} + +.metric scale trough highlight { + all: unset; + background-color: #D35D6E; + color: #000000; + border-radius: 10px; +} +.metric scale trough { + all: unset; + background-color: #4e4e4e; + border-radius: 50px; + min-height: 3px; + min-width: 50px; + margin-left: 10px; + margin-right: 20px; +} +.metric scale trough highlight { + all: unset; + background-color: #D35D6E; + color: #000000; + border-radius: 10px; +} +.metric scale trough { + all: unset; + background-color: #4e4e4e; + border-radius: 50px; + min-height: 3px; + min-width: 50px; + margin-left: 10px; + margin-right: 20px; +} +.label-ram { + font-size: large; +} +.workspaces button:hover { + color: #D35D6E; +} + diff --git a/.config/eww/eww-bar/eww.yuck b/.config/eww/eww-bar/eww.yuck new file mode 100644 index 0000000..a4a27d2 --- /dev/null +++ b/.config/eww/eww-bar/eww.yuck @@ -0,0 +1,75 @@ +(defwidget bar [] + (centerbox :orientation "h" + (workspaces) + (music) + (sidestuff))) + +(defwidget sidestuff [] + (box :class "sidestuff" :orientation "h" :space-evenly false :halign "end" + (metric :label "🔊" + :value volume + :onchange "amixer -D pulse sset Master {}%") + (metric :label "" + :value {EWW_RAM.used_mem_perc} + :onchange "") + (metric :label "💾" + :value {round((1 - (EWW_DISK["/"].free / EWW_DISK["/"].total)) * 100, 0)} + :onchange "") + time)) + +(defwidget workspaces [] + (box :class "workspaces" + :orientation "h" + :space-evenly true + :halign "start" + :spacing 10 + (button :onclick "wmctrl -s 0" 1) + (button :onclick "wmctrl -s 1" 2) + (button :onclick "wmctrl -s 2" 3) + (button :onclick "wmctrl -s 3" 4) + (button :onclick "wmctrl -s 4" 5) + (button :onclick "wmctrl -s 5" 6) + (button :onclick "wmctrl -s 6" 7) + (button :onclick "wmctrl -s 7" 8) + (button :onclick "wmctrl -s 8" 9))) + +(defwidget music [] + (box :class "music" + :orientation "h" + :space-evenly false + :halign "center" + {music != "" ? "🎵${music}" : ""})) + + +(defwidget metric [label value onchange] + (box :orientation "h" + :class "metric" + :space-evenly false + (box :class "label" label) + (scale :min 0 + :max 101 + :active {onchange != ""} + :value value + :onchange onchange))) + + + +(deflisten music :initial "" + "playerctl --follow metadata --format '{{ artist }} - {{ title }}' || true") + +(defpoll volume :interval "1s" + "scripts/getvol") + +(defpoll time :interval "10s" + "date '+%H:%M %b %d, %Y'") + +(defwindow bar + :monitor 0 + :windowtype "dock" + :geometry (geometry :x "0%" + :y "0%" + :width "90%" + :height "10px" + :anchor "top center") + :reserve (struts :side "top" :distance "4%") + (bar)) diff --git a/.config/eww/eww-bar/scripts/getram b/.config/eww/eww-bar/scripts/getram new file mode 100755 index 0000000..791a5a5 --- /dev/null +++ b/.config/eww/eww-bar/scripts/getram @@ -0,0 +1,2 @@ +#!/bin/sh +printf "%.0f\n" $(free -m | grep Mem | awk '{print ($3/$2)*100}') diff --git a/.config/eww/eww-bar/scripts/getvol b/.config/eww/eww-bar/scripts/getvol new file mode 100755 index 0000000..6a95077 --- /dev/null +++ b/.config/eww/eww-bar/scripts/getvol @@ -0,0 +1,2 @@ +#!/bin/sh +amixer -D pulse sget Master | grep 'Left:' | awk -F'[][]' '{ print $2 }' | tr -d '%' | head -1 diff --git a/.config/eww/mybar/eww.scss b/.config/eww/mybar/eww.scss new file mode 100644 index 0000000..9bcf83f --- /dev/null +++ b/.config/eww/mybar/eww.scss @@ -0,0 +1,107 @@ +// EWW.SCSS +// GLOBALS +*{ + all: unset; + font-family: "Ubuntu Mono"; + font-weight: 400; +} + +.bars { + background-image: url("images/background.png"); + background-color: #120010; + border: 3px solid #ff1475; + border-radius: 20px; +} + + +// LEFT MODULES +// Workspaces +.workspaces { + margin-left: 5px; + margin-top: -2px; +} +.workspace_buttons { + font-family: Hack; + font-size: 15px; + margin: 0 2 0 1; + color: #e6dafc; +} + + +// CENTER MODULES +.center_icons { + margin-right: 3px; + margin-left: 15px; +} +.center_labels { + font-size: 15px; + margin-bottom: -3px; + margin-top: 1px; + color: #e6dafc; +} +.center_revealers { + border-radius: 5px; + background-color: rgba(18,0,16, 1); + min-height: 32px; + border: solid 2px #ffff01; + color: #3081c6; +} +.center_info scale trough highlight { + all: unset; + background: #FFCD01; + border-radius: 10px; + border: solid 2px #ffff01; +} +.center_info scale trough { + all: unset; + background-color: rgba(230,218,252, 0.4); + border-radius: 10px; + min-width: 110px; + min-height: 10px; +} + + +// RIGHT MODULES +.power_button { + color: #ff4c5f; + font-size: 20px; + margin: -10 15 -10 15; +} +.time_box { + margin-top: -10px; + margin-bottom: -10px; +} +.time { + color: #e6dafc; + font-size: 25px; + margin-bottom: -20px; + margin-top: -20px; +} +.date { + color: #e6dafc; + font-size: 25px; + margin-top: 8px; +} +.kb_box { + color: #e6dafc; + font-size: 15px; + margin-left: 2px; + margin-right: 10px; +} +.kb_button_us { + font-size: 15px; + margin-bottom: -3px; +} +.kb_button_es { + font-size: 15px; + margin-top: -2px; +} +.cal { + font-size: 16px; + background-color: #120010; + background-image: url("images/background.png"); + color: #e6dafc; + border: 5px solid #ff1475; + border-radius: 0 0 20 20; + padding: 10px; +} diff --git a/.config/eww/mybar/eww.yuck b/.config/eww/mybar/eww.yuck new file mode 100644 index 0000000..50c8049 --- /dev/null +++ b/.config/eww/mybar/eww.yuck @@ -0,0 +1,813 @@ +;; VARS +(defvar eww "eww -c $HOME/.config/eww/mybar") +(defvar music_reveal false) +(defvar cover "images/music.png") +(defvar cpu_reveal false) +(defvar disk_reveal false) +(defvar temperature_reveal false) +(defvar ram_reveal false) +(defvar date_reveal false) +(defvar battery_reveal false) +(defvar left_bg "#120010") +(defvar center_bg "#120010") +(defvar right_bg "#120010") +(defvar media_bar_class "bar_normal") +(defvar media_bar_class_popup "bar_normal_popup") +(defvar battery_image "images/battery_normal.png") +(defvar us_color "rgba(230,218,252,1)") +(defvar es_color "rgba(230,218,252,0.4)") +(defvar day "0") +(defvar month "0") +(defvar year "0") +(defvar wp1 "●") +(defvar wp2 "○") +(defvar wp3 "○") +(defvar wp4 "○") +(defvar wp5 "○") +(defvar layout_button "") +(defvar media_status "") +(defvar artist "No artist") +(defvar artist_parsed "No artist") +(defvar title "No title") +(defvar title_parsed "No title") +(defvar length 100) +(defvar position 0) + +(deflisten launch1 "scripts/workspaces") +(deflisten launch2 "scripts/layout") +(deflisten launch3 "scripts/media_info") + +(defpoll cpu_percent :interval "1s" "scripts/cpu_info") +(defpoll disk_all :interval "10s" "scripts/disk_info --all") +(defpoll disk_used :interval "10s" "scripts/disk_info --used") +(defpoll disk_free :interval "10s" "scripts/disk_info --free") +(defpoll temperature :interval "2s" "scripts/temperature_info") +(defpoll ram_used :interval "2s" "scripts/ram_info --used") +(defpoll ram_all :interval "2s" "scripts/ram_info --all") +(defpoll ram_parsed :interval "2s" "scripts/ram_info --parsed") +(defpoll battery_percent :interval "3s" "scripts/battery_info --percentage") +(defpoll battery_time :interval "3s" "scripts/battery_info --time") +(defpoll hour :interval "1s" "scripts/time_info --hour") +(defpoll minutes :interval "1s" "scripts/time_info --minutes") +(defpoll type :interval "1s" "scripts/time_info --type") +(defpoll date :interval "1s" "scripts/time_info --date") + +;; WINDOWS +;; Left bar +(defwindow bar_left + :geometry + (geometry + :x "10px" + :y "10px" + :width "150px" + :height "25px") + :stacking "bg" + :reserve + (struts + :distance "70px" + :side "top") + :windowtype "dock" + :wm-ignore "false" +(widgets_left)) + +;; Central bar +(defwindow bar_center + :geometry + (geometry + :x "180px" + :y "10px" + :width "930px" + :height "50px") + :stacking "bg" + :reserve + (struts + :distance "70px" + :side "top") + :windowtype "dock" + :wm-ignore "false" + (widgets_center)) + +;; Right bar +(defwindow bar_right + :geometry + (geometry + :x "1130px" + :y "10px" + :width "455px" + :height "50px") + :stacking "bg" + :reserve + (struts + :distance "70px" + :side "top") + :windowtype "dock" + :wm-ignore "false" +(widgets_right)) + +;; Calendar window +(defwindow calendar + :geometry + (geometry + :x "1465px" + :y "65px" + :width "415px" + :height "100px") + :stacking "fg" + :windowtype "dock" + :wm-ignore "false" + (box + :class "cal" + :orientation "h" + :valign "fill" + :halign "fill" + (calendar + :day day + :month month + :year year + :show-details "true" + :show-heading "true" + :show-day-names "true"))) + +;; Music window +(defwindow music + :geometry + (geometry + :x "40px" + :y "65px" + :width "415px" + :height "200px") + :stacking "fg" + :windowtype "dock" + :wm-ignore "false" + (box + :orientation "v" + :valign "fill" + :halign "fill" + :space-evenly "false" + :class "music_box_popup" + (box + :orientation "h" + :valign "fill" + :halign "fill" + :space-evenly "false" + (box + :valign "center" + :halign "start" + (image + :halign "start" + :class "media_art_popup" + :tooltip "${title} by ${artist}" + :path cover + :image-height 130 + :image-width 130)) + (box + :valign "center" + :halign "fill" + :orientation "v" + :class "media_data_popup" + :spacing 20 + (label + :class "media_title_popup" + :markup title_parsed + :halign "center") + (label + :class "media_artist_popup" + :markup artist_parsed + :halign "center") + (box + :orientation "h" + :halign "fill" + :valign "fill" + :class "media_buttons_box_popup" + (eventbox + :cursor "pointer" + (button + :onclick "scripts/media_control --prev" + :class "nextprev_popup" + :tooltip "Previous" + "")) + (eventbox + :cursor "pointer" + (button + :onclick "scripts/media_control --move -5" + :class "move_popup" + :tooltip "-5 seconds" + "")) + (eventbox + :cursor "pointer" + (button + :onclick "scripts/media_control --toggle" + :class "playpause_popup" + :tooltip "Play/Pause" + media_status)) + (eventbox + :cursor "pointer" + (button + :onclick "scripts/media_control --move +5" + :class "move_popup" + :tooltip "+5 seconds" + "")) + (eventbox + :cursor "pointer" + (button + :onclick "scripts/media_control --next" + :class "nextprev_popup" + :tooltip "Next" + "")) + + ))) + (eventbox + :cursor "pointer" + :onhover "${eww} update media_bar_class_popup=\"bar_highlighted_popup\"" + :onhoverlost "${eww} update media_bar_class_popup=\"bar_normal_popup\"" + (box + :orienttion "h" + :valign "fill" + :halign "fill" + :class media_bar_class_popup + (scale + :min 0 + :max length + :value position + :orientation "h" + :onchange "scripts/media_control --seek {}" + ))) + )) + + + + +;; WIDGETS +;; Left widgets +(defwidget widgets_left [] + (eventbox + :onhover "${eww} update left_bg=\"#43013b\"" + :onhoverlost "${eww} update left_bg=\"#120010\"" + (box + :spacing 0 + :space-evenly "false" + :class "bars" + :orientation "h" + :valign "fill" + :hexpand "false" + :style "background-color: ${left_bg}" + (workspaces) + (layout)))) + + + (defwidget workspaces [] + (box + :orientation "h" + :halign "start" + :class "workspaces" + (box + :orientation "h" + :spacing 5 + :space-evenly "false" + :class "${launch1}, ${launch2}, ${launch3}" + (eventbox + :cursor "pointer" + (button + :tooltip "Switch to workspace 1" + :onclick "bspc desktop -f 1" + (label + :markup wp1 + :class "workspace_buttons"))) + (eventbox + :cursor "pointer" + (button + :tooltip "Switch to workspace 2" + :onclick "bspc desktop -f 2" + (label + :markup wp2 + :class "workspace_buttons"))) + (eventbox + :cursor "pointer" + (button + :tooltip "Switch to workspace 3" + :onclick "bspc desktop -f 3" + (label + :markup wp3 + :class "workspace_buttons"))) + (eventbox + :cursor "pointer" + (button + :tooltip "Switch to workspace 4" + :onclick "bspc desktop -f 4" + (label + :markup wp4 + :class "workspace_buttons"))) + (eventbox + :cursor "pointer" + (button + :tooltip "Switch to workspace 5" + :onclick "bspc desktop -f 5" + (label + :markup wp5 + :class "workspace_buttons"))) + ))) + + (defwidget layout [] + (box + :orientation "h" + :halign "start" + (box + :orientation "h" + :space-evenly "false" + (eventbox + :cursor "pointer" + (button + :tooltip "Change current layout" + :onclick "bspc desktop focused --layout next" + (label + :class "layout" + :text layout_button))) + ))) + + (defwidget music [] + (eventbox + :onhover "${eww} update music_reveal=true" + :onhoverlost "${eww} update music_reveal=false" + (box + :class "music_box" + :orientation "h" + :spacing 0 + :space-evenly "false" + :halign "start" + (eventbox + :cursor "pointer" + (box + :space_evenly "false" + :halign "start" + :tooltip "${title} by ${artist}" + (button + :onclick "scripts/popup_music" + (image + :class "media_art" + :path cover + :image-height 40 + :image-width 40)))) + (box + :class "media_data" + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "end" + :halign "start" + (label + :class "media_title" + :halign "center" + :markup title_parsed + :limit-width 15 + :wrap "true" + :show_truncated "true") + (revealer + :reveal music_reveal + :transition "slideup" + :duration "350ms" + (box + :orientation "h" + :halign "center" + :space-evenly "false" + :class "media_buttons" + :space-evenly "false" + (eventbox + :cursor "pointer" + (button + :class "prev_button" + :onclick "scripts/media_control --prev" + :tooltip "Previous" + "")) + (eventbox + :cursor "pointer" + (button + :class "toggle_button" + :onclick "scripts/media_control --toggle" + :tooltip "Play/Pause" + "${media_status}")) + (eventbox + :cursor "pointer" + (button + :class "next_button" + :onclick "scripts/media_control --next" + :tooltip "Next" + "")))) + (box + :space-evenly "false" + :class media_bar_class + :halign "center" + :vexpand "false" + :hexpand "false" + (eventbox + ;;:cursor "pointer" + ;; :onhover "${eww} update media_bar_class=bar_highlighted" + ;; :onhoverlost "${eww} update media_bar_class=bar_normal" + (scale + :active "false" + :min 0 + :max length + :value position + :orientation "h" + :tooltip "Seek" + ;; :onchange "scripts/media_control --seek {}" + ))))))) + +;; Central widgets +(defwidget widgets_center [] + (eventbox + :onhover "${eww} update center_bg=\"#43013b\"" + :onhoverlost "${eww} update center_bg=\"#120010\"" + (box + :spacing 0 + :space-evenly "true" + :class "bars" + :orientation "h" + :valign "fill" + :halign "fill" + :hexpand "false" + :style "background-color: ${center_bg}" + (box + :space-evenly "true" + :orientation "h" + :valign "center" + :halign "fill" + (cpu_status) + (ram_status) + (temperature_status) + (disk_status) + (battery_status) + )))) + + +(defwidget cpu_status [] + (eventbox + :onhover "${eww} update cpu_reveal=\"true\"" + :onhoverlost "${eww} update cpu_reveal=\"false\"" + :tooltip "CPU usage" + (box + :orientation "h" + :space-evenly "false" + :class "cpu_box" + :vexpand "false" + :hexpand "false" + (image + :class "center_icons" + :path "images/cpu.png" + :image-width 30 + :image-height 30) + (box + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "center" + :class "center_boxes" + (revealer + :reveal "${!cpu_reveal}" + :transition "slidedown" + :duration "350ms" + (box + :orientation "v" + :class "center_info" + :valign "start" + (label + :class "center_labels" + :text "${cpu_percent}%" + :halign "center") + (scale + :min 0 + :max 100 + :value cpu_percent + :orientation "h"))) + (revealer + :reveal cpu_reveal + :transition "slideup" + :duration "350ms" + :valign "center" + (box + :valign "center" + :class "center_revealers" + (graph + :thickness 3 + :value cpu_percent + :time-range "20s" + :min 0 + :max 100 + :dynamic "true" + :line-style "round")) + ))))) + +(defwidget disk_status [] + (eventbox + :onhover "${eww} update disk_reveal=\"true\"" + :onhoverlost "${eww} update disk_reveal=\"false\"" + :tooltip "Disk usage" + (box + :orientation "h" + :space-evenly "false" + :class "disk_box" + :vexpand "false" + :hexpand "false" + (image + :class "center_icons" + :path "images/disk.png" + :image-width 30 + :image-height 30) + (box + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "center" + :class "center_boxes" + (revealer + :reveal "${!disk_reveal}" + :transition "slidedown" + :duration "350ms" + (box + :orientation "v" + :class "center_info" + :valign "start" + (label + :class "center_labels" + :text "${disk_used}G/${disk_all}G" + :halign "center") + (scale + :min 0 + :max disk_all + :value disk_used + :orientation "h"))) + (revealer + :reveal disk_reveal + :transition "slideup" + :duration "350ms" + :valign "center" + (box + :valign "center" + :halign "fill" + :class "center_revealers" + (label + :halign "center" + :text "${disk_free}G free")) + ))))) +(defwidget temperature_status [] + (eventbox + :onhover "${eww} update temperature_reveal=\"true\"" + :onhoverlost "${eww} update temperature_reveal=\"false\"" + :tooltip "Internal temperature" + (box + :orientation "h" + :space-evenly "false" + :class "temperature_box" + :vexpand "false" + :hexpand "false" + (image + :class "center_icons" + :path "images/temperature.png" + :image-width 30 + :image-height 30) + (box + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "center" + :class "center_boxes" + (revealer + :reveal "${!temperature_reveal}" + :transition "slidedown" + :duration "350ms" + (box + :orientation "v" + :class "center_info" + :valign "start" + (label + :class "center_labels" + :text "${temperature}°C" + :halign "center") + (scale + :min 0 + :max 100 + :value temperature + :orientation "h"))) + (revealer + :reveal temperature_reveal + :transition "slideup" + :duration "350ms" + :valign "center" + (box + :valign "center" + :class "center_revealers" + (graph + :thickness 3 + :value temperature + :time-range "20s" + :min 0 + :max 100 + :dynamic "true" + :line-style "round")) + ))))) + +(defwidget ram_status [] + (eventbox + :onhover "${eww} update ram_reveal=\"true\"" + :onhoverlost "${eww} update ram_reveal=\"false\"" + :tooltip "RAM usage" + (box + :orientation "h" + :space-evenly "false" + :class "ram_box" + :vexpand "false" + :hexpand "false" + (image + :class "center_icons" + :path "images/ram.png" + :image-width 30 + :image-height 30) + (box + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "center" + :class "center_boxes" + (revealer + :reveal "${!ram_reveal}" + :transition "slidedown" + :duration "350ms" + (box + :orientation "v" + :class "center_info" + :valign "start" + (label + :class "center_labels" + :text "${ram_parsed}" + :halign "center") + (scale + :min 0 + :max ram_all + :value ram_used + :orientation "h"))) + (revealer + :reveal ram_reveal + :transition "slideup" + :duration "350ms" + :valign "center" + (box + :valign "center" + :class "center_revealers" + (graph + :thickness 3 + :value ram_used + :time-range "20s" + :min 0 + :max ram_all + :dynamic "true" + :line-style "round")) + ))))) + +(defwidget battery_status [] + (eventbox + :onhover "${eww} update battery_reveal=\"true\"" + :onhoverlost "${eww} update battery_reveal=\"false\"" + :tooltip "Battery" + (box + :orientation "h" + :space-evenly "false" + :class "battery_box" + :vexpand "false" + :hexpand "false" + (image + :class "center_icons" + :path battery_image + :image-width 30 + :image-height 30) + (box + :orientation "v" + :space-evenly "false" + :vexpand "false" + :hexpand "false" + :valign "center" + :class "center_boxes" + (revealer + :reveal "${!battery_reveal}" + :transition "slidedown" + :duration "350ms" + (box + :orientation "v" + :class "center_info" + :valign "start" + (label + :class "center_labels" + :text "${battery_percent}%" + :halign "center") + (scale + :min 0 + :max 100 + :value battery_percent + :orientation "h"))) + (revealer + :reveal battery_reveal + :transition "slideup" + :duration "350ms" + :valign "center" + (box + :valign "center" + :class "center_revealers" + (label + :halign "center" + :text battery_time)) + ))))) + + + + + ;; Right widgets +(defwidget widgets_right [] + (eventbox + :onhover "${eww} update right_bg=\"#43013b\"" + :onhoverlost "${eww} update right_bg=\"#120010\"" + (box + :spacing 0 + :space-evenly "false" + :class "bars" + :orientation "h" + :valign "fill" + :hexpand "false" + :style "background-color: ${right_bg}" + (power_button) + (time) + (keyboard) + ))) + +(defwidget power_button [] + (eventbox + :cursor "pointer" + :tooltip "Logout options" + (button + :class "power_button" + :valign "center" + :onclick "~/.bscripts/rofi.sh outopts" + ""))) + +(defwidget time [] + (eventbox + :tooltip "Current time" + :onhover "${eww} update date_reveal=true" + :onhoverlost "${eww} update date_reveal=false" + :cursor "pointer" + (button + :onclick "scripts/popup_calendar" + (box + :class "time_box" + :space-evenly "false" + :orientation "h" + :valign "center" + :halign "fill" + (label + :valign "center" + :class "time" + :markup "${hour}:${minutes}${type}" ) + (revealer + :reveal date_reveal + :transition "slideright" + :duration "350ms" + :valign "fill" + (label + :valign "fill" + :class "date" + :markup "${date}" + )))))) + +(defwidget keyboard [] + (box + :class "kb_box" + :orientation "h" + :valign "fill" + :halign "center" + "|" + (box + :orientation "v" + :space-evenly "false" + :valign "fill" + :halign "center" + (eventbox + :cursor "pointer" + :tooltip "Change layout to US english" + (button + :class "kb_button_us" + :onclick "scripts/kb_layouts set us" + :style "color: ${us_color}" + :valign "center" + "US")) + (eventbox + :cursor "pointer" + :tooltip "Change layout to US spanish" + (button + :class "kb_button_es" + :onclick "scripts/kb_layouts set es" + :style "color: ${es_color}" + :valign "center" + "ES") + )))) diff --git a/.config/eww/mybar/images/background.png b/.config/eww/mybar/images/background.png new file mode 100644 index 0000000..112c24b Binary files /dev/null and b/.config/eww/mybar/images/background.png differ diff --git a/.config/eww/mybar/images/battery_0.png b/.config/eww/mybar/images/battery_0.png new file mode 100644 index 0000000..514554b Binary files /dev/null and b/.config/eww/mybar/images/battery_0.png differ diff --git a/.config/eww/mybar/images/battery_10.png b/.config/eww/mybar/images/battery_10.png new file mode 100644 index 0000000..33dee3d Binary files /dev/null and b/.config/eww/mybar/images/battery_10.png differ diff --git a/.config/eww/mybar/images/battery_100.png b/.config/eww/mybar/images/battery_100.png new file mode 100644 index 0000000..b454554 Binary files /dev/null and b/.config/eww/mybar/images/battery_100.png differ diff --git a/.config/eww/mybar/images/battery_20.png b/.config/eww/mybar/images/battery_20.png new file mode 100644 index 0000000..842654a Binary files /dev/null and b/.config/eww/mybar/images/battery_20.png differ diff --git a/.config/eww/mybar/images/battery_30.png b/.config/eww/mybar/images/battery_30.png new file mode 100644 index 0000000..364e76b Binary files /dev/null and b/.config/eww/mybar/images/battery_30.png differ diff --git a/.config/eww/mybar/images/battery_40.png b/.config/eww/mybar/images/battery_40.png new file mode 100644 index 0000000..032ab47 Binary files /dev/null and b/.config/eww/mybar/images/battery_40.png differ diff --git a/.config/eww/mybar/images/battery_50.png b/.config/eww/mybar/images/battery_50.png new file mode 100644 index 0000000..46a6ad1 Binary files /dev/null and b/.config/eww/mybar/images/battery_50.png differ diff --git a/.config/eww/mybar/images/battery_60.png b/.config/eww/mybar/images/battery_60.png new file mode 100644 index 0000000..4fe6472 Binary files /dev/null and b/.config/eww/mybar/images/battery_60.png differ diff --git a/.config/eww/mybar/images/battery_70.png b/.config/eww/mybar/images/battery_70.png new file mode 100644 index 0000000..804bc10 Binary files /dev/null and b/.config/eww/mybar/images/battery_70.png differ diff --git a/.config/eww/mybar/images/battery_80.png b/.config/eww/mybar/images/battery_80.png new file mode 100644 index 0000000..898a144 Binary files /dev/null and b/.config/eww/mybar/images/battery_80.png differ diff --git a/.config/eww/mybar/images/battery_90.png b/.config/eww/mybar/images/battery_90.png new file mode 100644 index 0000000..44bd3e1 Binary files /dev/null and b/.config/eww/mybar/images/battery_90.png differ diff --git a/.config/eww/mybar/images/battery_charging.png b/.config/eww/mybar/images/battery_charging.png new file mode 100644 index 0000000..6021eb5 Binary files /dev/null and b/.config/eww/mybar/images/battery_charging.png differ diff --git a/.config/eww/mybar/images/cpu.png b/.config/eww/mybar/images/cpu.png new file mode 100644 index 0000000..4c30da3 Binary files /dev/null and b/.config/eww/mybar/images/cpu.png differ diff --git a/.config/eww/mybar/images/currmedia.png b/.config/eww/mybar/images/currmedia.png new file mode 100644 index 0000000..86be125 Binary files /dev/null and b/.config/eww/mybar/images/currmedia.png differ diff --git a/.config/eww/mybar/images/disk.png b/.config/eww/mybar/images/disk.png new file mode 100644 index 0000000..bdf9cbf Binary files /dev/null and b/.config/eww/mybar/images/disk.png differ diff --git a/.config/eww/mybar/images/music.png b/.config/eww/mybar/images/music.png new file mode 100644 index 0000000..3ded333 Binary files /dev/null and b/.config/eww/mybar/images/music.png differ diff --git a/.config/eww/mybar/images/ram.png b/.config/eww/mybar/images/ram.png new file mode 100644 index 0000000..37b71bf Binary files /dev/null and b/.config/eww/mybar/images/ram.png differ diff --git a/.config/eww/mybar/images/temperature.png b/.config/eww/mybar/images/temperature.png new file mode 100644 index 0000000..1a8a406 Binary files /dev/null and b/.config/eww/mybar/images/temperature.png differ diff --git a/.config/eww/mybar/polybar_tray.ini b/.config/eww/mybar/polybar_tray.ini new file mode 100644 index 0000000..d73058f --- /dev/null +++ b/.config/eww/mybar/polybar_tray.ini @@ -0,0 +1,17 @@ +;tray +[bar/tray] +width = 10 +height = 40 +offset-x = 1865 +offset-y = 25 +tray-position = right +tray-detached = true +tray-offset-x = 20 +background = ${xrdb:color8:#222} + +modules-right = filler + +[module/filler] +type = custom/text +format = " " + diff --git a/.config/eww/mybar/scripts/battery_info b/.config/eww/mybar/scripts/battery_info new file mode 100644 index 0000000..0dc254f --- /dev/null +++ b/.config/eww/mybar/scripts/battery_info @@ -0,0 +1,100 @@ +#!/bin/bash +notify() +{ + case $1 in + charging) + if [[ $lstate -ne 3 ]] + then + echo 3 > /tmp/batstate + pop_report -d 800 -m "Charging$icon" -t battery_charging -o "font-size: 70px" "font-family: CaskaydiaCoveNerdFont" "padding-right: 30px" + fi; + ;; + high) + echo 2 > /tmp/batstate + ;; + mid) + if [[ $lstate -gt 1 ]] + then + echo 1 > /tmp/batstate + ~/.ricing/notify-send.sh "Warning: $bat_level% Battery left" -i "~/Pictures/Important/icons/other/battery_mid.png" -t 10000 --replace=550 -u critical + fi; + ;; + low) + if [[ $lstate -gt 0 ]] + then + echo 0 > /tmp/batstate + pop_report -m "Battery is critically low" -d 5000 -t battery_low + fi; + ;; + esac +} + +# Set necessary info +eww="eww -c $HOME/.config/eww/mybar" +lstate=`cat /tmp/batstate` +acpi=`acpi -b` +bat_level_all=`echo "$acpi" | grep -v "unavailable" | grep -E -o "[0-9][0-9]?[0-9]?%"` +bat_level=`echo "$bat_level_all" | awk -F"%" 'BEGIN{tot=0;i=0} {i++; tot+=$1} END{printf("%d%%\n", tot/i)}'` +bat_level=`printf ${bat_level%?}` +discharging=`echo "$acpi" | grep -w 0: | grep -c Discharging` +time=`echo "$acpi" | awk '{printf $5}'` +time=${time::-3} + +if [[ $discharging -eq 0 ]] +then + notify charging > /dev/null + $eww update battery_image="images/battery_charging.png" +else + if [[ $bat_level -le 10 ]] + then + $eww update battery_image="images/battery_10.png" + notify low > /dev/null + elif [[ $bat_level -le 20 ]] + then + $eww update battery_image="images/battery_20.png" + notify mid > /dev/null + elif [[ $bat_level -le 30 ]] + then + $eww update battery_image="images/battery_30.png" + notify high > /dev/null + elif [[ $bat_level -le 40 ]] + then + $eww update battery_image="images/battery_40.png" + notify high > /dev/null + elif [[ $bat_level -le 50 ]] + then + $eww update battery_image="images/battery_50.png" + notify high > /dev/null + elif [[ $bat_level -le 60 ]] + then + $eww update battery_image="images/battery_60.png" + notify high > /dev/null + elif [[ $bat_level -le 70 ]] + then + $eww update battery_image="images/battery_70.png" + notify high > /dev/null + elif [[ $bat_level -le 80 ]] + then + $eww update battery_image="images/battery_80.png" + notify high > /dev/null + elif [[ $bat_level -le 90 ]] + then + $eww update battery_image="images/battery_90.png" + notify high > /dev/null + else + $eww update battery_image="images/battery_100.png" + notify high > /dev/null + fi; +fi; + +case $1 in + "--time") + [[ $time != "" && $time != "discharg" ]] && echo "$time" || echo "00:00" + ;; + "--percentage") + echo "$bat_level" + ;; + *) + true + ;; +esac diff --git a/.config/eww/mybar/scripts/cpu_info b/.config/eww/mybar/scripts/cpu_info new file mode 100644 index 0000000..ef70894 --- /dev/null +++ b/.config/eww/mybar/scripts/cpu_info @@ -0,0 +1,21 @@ +#!/bin/sh +cpu_usage=$(mpstat 1 1 | awk '/Average:/ {printf("%s\n", $(NF-9))}') + +cpu_whole=`printf ${cpu_usage%.*}` + +if [[ $cpuwhole -ge 80 ]] +then + true + #update var +elif [[ $cpuwhole -ge 70 ]] +then + true + #update var +else + true + #update var +fi; + +echo $cpu_usage + + diff --git a/.config/eww/mybar/scripts/disk_info b/.config/eww/mybar/scripts/disk_info new file mode 100644 index 0000000..d0d39af --- /dev/null +++ b/.config/eww/mybar/scripts/disk_info @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +raw=`df -h / | grep /dev/` + +case $1 in + "--used" ) + value=`echo $raw | awk '{printf $3}'` + ;; + "--all" ) + value=`echo $raw | awk '{printf $2}'` + ;; + "--free" ) + value=`echo $raw | awk '{printf $4}'` + ;; + * ) + true + ;; +esac +value=${value::-1} +echo $value diff --git a/.config/eww/mybar/scripts/kb_layouts b/.config/eww/mybar/scripts/kb_layouts new file mode 100644 index 0000000..a3ae141 --- /dev/null +++ b/.config/eww/mybar/scripts/kb_layouts @@ -0,0 +1,53 @@ +#!/bin/bash + +eww="eww -c $HOME/.config/eww/mybar" +set -e + +get_kbdlayout() { + layout=$(setxkbmap -query | grep -oP 'layout:\s*\K([\w,]+)') + variant=$(setxkbmap -query | grep -oP 'variant:\s*\K(\w+)') + echo "$layout" "$variant" +} + +set_kbdlayout() { + eval "array=($1)" + setxkbmap "${array[@]}" + if [[ "${array[@]}" == "us" ]] + then + $eww update us_color="rgba(230,218,252,1)" + $eww update es_color="rgba(230,218,252,0.4)" + else + $eww update us_color="rgba(230,218,252,0.4)" + $eww update es_color="rgba(230,218,252,1)" + fi; +} + +cycle() { + current_layout=$(get_kbdlayout | xargs) + layouts=("$@" "$1") # add the first one at the end so that it cycles + index=0 + while [ "${layouts[$index]}" != "$current_layout" ] && [ $index -lt "${#layouts[@]}" ]; do index=$[index +1]; done + next_index=$[index +1] + next_layout=${layouts[$next_index]} + set_kbdlayout "$next_layout" + upper=$(echo $next_layout | tr '[:lower:]' '[:upper:]') + + pop_report -m $upper -t keyboard > /dev/null +} + + +subcommand="$1" +shift || (echo "Please specify one of: get, set , cycle ... , i3status" && exit) + +case $subcommand in + "get") + echo -n $(get_kbdlayout) + ;; + "set") + set_kbdlayout "$1" + ;; + "cycle") + cycle "$@" + ;; +esac + diff --git a/.config/eww/mybar/scripts/layout b/.config/eww/mybar/scripts/layout new file mode 100644 index 0000000..46ac1fb --- /dev/null +++ b/.config/eww/mybar/scripts/layout @@ -0,0 +1,25 @@ +#!/bin/bash +eww="eww -c $HOME/.config/eww/mybar" + +bspc subscribe desktop_focus desktop_layout | while read line; do + case `bspc query -T -d | jq -r .layout` in + tall) + echo "Tall" + ;; + tiled) + $eww update layout_button= + ;; + grid) + echo "Grid" + ;; + monocle) + $eww update layout_button= + ;; + even) + echo "Even" + ;; + *) + echo "?" + ;; +esac; +done diff --git a/.config/eww/mybar/scripts/media_control b/.config/eww/mybar/scripts/media_control new file mode 100644 index 0000000..7301733 --- /dev/null +++ b/.config/eww/mybar/scripts/media_control @@ -0,0 +1,76 @@ +#!/usr/bin/env bash + +# Selects player based on if they're playing or if they have a cover +# Note: Being played takes priority +select_player () { + playingplayer="" + coverplayer="" + totalplayer="" + for player in "$player"s + do + art=`playerctl --player="$player" metadata mpris:artUrl 2> /dev/null` + status=`playerctl --player="$player" status 2> /dev/null` + [[ $status == "Playing" ]] && playingplayer="$player" + [[ $art != "" ]] && coverplayer="$player" + [[ $status == "Playing" && $art != "" ]] && totalplayer="$player" + done; + player="" + [[ ! -z $coverplayer ]] && player=$coverplayer + [[ ! -z $playingplayer ]] && player=$playingplayer + [[ ! -z $totalplayer ]] && player=$totalplayer +} + +# Get general info +eww="eww -c $HOME/.config/eww/mybar" +players=`playerctl -l` +select_player +status=`playerctl --player="$player" status` +[[ $status == "" ]] && exit + +# Toggle play pause and update status accordingly +toggle () { + [[ $status == "Playing" ]] && $eww update media_status=""|| $eww update media_status="" + playerctl --player="$player" play-pause +} + +# Seek to an specific time +seek () { + seekt="$1" + position=`playerctl --player=$player position` + if [[ $? -eq 0 ]] && [[ `python -c "print(round(abs($seekt-$position)))"` -gt 3 ]] + then + playerctl --player=$player position $seekt + fi; +} + +# Rewind or fast forward 5 seconds +move () { + move="$1" + startpos=`playerctl --player=$player position` + length=`playerctl --player="$player" metadata mpris:length` + length=`python -c "print($length/1000000)"` + if [[ $? -eq 0 ]] + then + endpos=`python -c "print(min($length, max(0, $startpos $move)))"` + playerctl --player=$player position $endpos + fi; +} + + +case $1 in + --toggle ) + toggle + ;; + --seek ) + seek $2 + ;; + --move ) + move $2 + ;; + --next ) + playerctl --player=$player next + ;; + --prev ) + playerctl --player=$player previous + ;; +esac diff --git a/.config/eww/mybar/scripts/media_info b/.config/eww/mybar/scripts/media_info new file mode 100644 index 0000000..ffb0194 --- /dev/null +++ b/.config/eww/mybar/scripts/media_info @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +# Selects player based on if they're playing or if they have a cover +# Note: Being played takes priority +select_player () { + playingplayer="" + coverplayer="" + totalplayer="" + playerctl -l | while read -r player; + do + art=`playerctl --player="$player" metadata mpris:artUrl 2> /dev/null` + status=`playerctl --player="$player" status 2> /dev/null` + [[ $status == "Playing" ]] && playingplayer="$player" + [[ $art != "" ]] && coverplayer="$player" + [[ $status == "Playing" && $art != "" ]] && totalplayer="$player" + [[ ! -z $coverplayer ]] && player="$coverplayer" + [[ ! -z $playingplayer ]] && player="$playingplayer" + [[ ! -z $totalplayer ]] && player="$totalplayer" + echo "$player" + done; +} + +update_cover () { + if [[ -z $newimg ]] + then + newimg="$imgdir/music.png" + cp "$newimg" "$imgdir/currmedia.png" + echo "Image is unknown, using template" + elif [[ `echo $newimg | grep -c "file://"` -gt 0 ]] + then + cp "`echo $newimg | sed 's/file:\/\///g'`" "$imgdir/currmedia.png" + echo "Image is a file, succesfully coppied" + else + curl "$newimg" -o "$imgdir/currmedia.png" -s + echo "Image is an url, succesfully downloaded" + fi; + $eww update cover="$imgdir/currmedia.png" +} + + +imgdir="$HOME/.config/eww/mybar/images" +lastimg="none" +eww="eww -c $HOME/.config/eww/mybar" + +while true; do + if [[ ! -z `playerctl status` ]] + then + player=`select_player | tail -1` + status="" + status=`playerctl --player="$player" status` + echo "Selected $player as player" + + # Update status button + if [[ $status == "Playing" ]] + then + $eww update media_status="" + else + $eww update media_status="" + fi; + + # Update title and artist + title=`playerctl --player="$player" metadata xesam:title` + [[ -z $title ]] && title="No title" + title_parsed=`$HOME/.config/eww/mybar/scripts/parse_jp "$title"` + $eww update title="$title" + $eww update title_parsed="$title_parsed" + + artist=`playerctl --player="$player" metadata xesam:artist` + [[ -z $artist ]] && artist="No artist" + artist_parsed=`$HOME/.config/eww/mybar/scripts/parse_jp "$artist"` + $eww update artist="$artist" + $eww update artist_parsed="$artist_parsed" + + # Update length and position + position=`playerctl --player="$player" position` + [[ -z $position ]] && position=0 + $eww update position="$position" + length=`playerctl --player="$player" metadata mpris:length` + length=`python -c "print($length/1000000)"` + [[ -z $length ]] && length=100 + $eww update length="$length" + + newimg=`playerctl --player="$player" metadata mpris:artUrl 2> /dev/null\ + | sed "s/https:\/\/i.ytimg.com\/vi\//https:\/\/img.youtube.com\/vi\//g"\ + | sed "s/hq/maxres/g"` + + if [[ "$newimg" != "$lastimg" ]] + then + echo "New image $newimg detected" + lastimg=$newimg + update_cover& + fi; + else + # Update everything to default values + $eww update media_status="" + $eww update title_parsed="No title" + $eww update title="No title" + $eww update artist="No artist" + $eww update artist_parsed="No artist" + $eww update position=0 + $eww update length=100 + $eww update cover="images/music.png" + lastimg="" + fi; + sleep 1 + echo "" +done; diff --git a/.config/eww/mybar/scripts/parse_jp b/.config/eww/mybar/scripts/parse_jp new file mode 100644 index 0000000..fede1b9 --- /dev/null +++ b/.config/eww/mybar/scripts/parse_jp @@ -0,0 +1,44 @@ +#!/bin/python3 + +import sys +# -*- coding:utf-8 -*- + +ranges = [ + {"from": ord(u"\u3300"), "to": ord(u"\u33ff")}, # compatibility ideographs + {"from": ord(u"\ufe30"), "to": ord(u"\ufe4f")}, # compatibility ideographs + {"from": ord(u"\uf900"), "to": ord(u"\ufaff")}, # compatibility ideographs + {"from": ord(u"\U0002F800"), "to": ord(u"\U0002fa1f")}, # compatibility ideographs + {'from': ord(u'\u3040'), 'to': ord(u'\u309f')}, # Japanese Hiragana + {"from": ord(u"\u30a0"), "to": ord(u"\u30ff")}, # Japanese Katakana + {"from": ord(u"\u2e80"), "to": ord(u"\u2eff")}, # cjk radicals supplement + {"from": ord(u"\u4e00"), "to": ord(u"\u9fff")}, + {"from": ord(u"\u3400"), "to": ord(u"\u4dbf")}, + {"from": ord(u"\U00020000"), "to": ord(u"\U0002a6df")}, + {"from": ord(u"\U0002a700"), "to": ord(u"\U0002b73f")}, + {"from": ord(u"\U0002b740"), "to": ord(u"\U0002b81f")}, + {"from": ord(u"\U0002b820"), "to": ord(u"\U0002ceaf")} # included as of Unicode 8.0 +] + +def is_cjk(char): + return any([range["from"] <= ord(char) <= range["to"] for range in ranges]) + +def cjk_substrings(string): + i = 0 + while i len(string): + string = string + "…" +for sub in cjk_substrings(string): + string = string.replace(sub, "" + sub + "") +print(string) + diff --git a/.config/eww/mybar/scripts/popup_calendar b/.config/eww/mybar/scripts/popup_calendar new file mode 100644 index 0000000..808eb69 --- /dev/null +++ b/.config/eww/mybar/scripts/popup_calendar @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +eww="eww -c $HOME/.config/eww/mybar" + +$eww close calendar || (\ + $eww update day="`scripts/time_info --day`"; \ + $eww update month="`scripts/time_info --month`"; \ + $eww update year="`scripts/time_info --year`"; \ + $eww open calendar ) diff --git a/.config/eww/mybar/scripts/popup_music b/.config/eww/mybar/scripts/popup_music new file mode 100644 index 0000000..909e424 --- /dev/null +++ b/.config/eww/mybar/scripts/popup_music @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +eww="eww -c $HOME/.config/eww/mybar" + +$eww close music || (\ + $eww open music ) diff --git a/.config/eww/mybar/scripts/ram_info b/.config/eww/mybar/scripts/ram_info new file mode 100644 index 0000000..771d1a4 --- /dev/null +++ b/.config/eww/mybar/scripts/ram_info @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +case $1 in + "--used") + free -m | grep Mem | awk '{printf $3/100}' + ;; + "--all") + free -m | grep Mem | awk '{printf $2/100}' + ;; + "--parsed") + free -h | grep Mem | awk '{printf $3 "/" $2}' + ;; + *) + true + ;; +esac diff --git a/.config/eww/mybar/scripts/temperature_info b/.config/eww/mybar/scripts/temperature_info new file mode 100644 index 0000000..0d6e35f --- /dev/null +++ b/.config/eww/mybar/scripts/temperature_info @@ -0,0 +1,4 @@ +#!/bin/sh +temp=$(sensors | grep 'Package id 0:\|Tdie' | grep ':[ ]*+[0-9]*.[0-9]*°C' -o | grep '[0-9]*.[0-9]*°C' -o) +temp=${temp::-4} +echo "$temp" diff --git a/.config/eww/mybar/scripts/time_info b/.config/eww/mybar/scripts/time_info new file mode 100644 index 0000000..d97ee41 --- /dev/null +++ b/.config/eww/mybar/scripts/time_info @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +case $1 in + "--hour") + date "+%I" + ;; + "--minutes") + date "+%M" + ;; + "--type") + date "+%p" + ;; + "--date") + date "+ %a, %b %d" + ;; + "--day") + date "+%d" + ;; + "--month") + $(( `date "+%m"` -1 )) + ;; + "--year") + date "+%y" + ;; + *) + true + ;; +esac + diff --git a/.config/eww/mybar/scripts/workspaces b/.config/eww/mybar/scripts/workspaces new file mode 100644 index 0000000..9e3ccf6 --- /dev/null +++ b/.config/eww/mybar/scripts/workspaces @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +total=`xdotool get_num_desktops` +icon1=○ +icon2=◎ +icon3=● +eww="eww -c $HOME/.config/eww/mybar/" + +bspc subscribe desktop_focus node_add node_remove 2> /dev/null | while read line; do + currwp=$((`xdotool get_desktop`)) + for (( i = 0; i < $total; i++)); + do + if [[ $i -eq $currwp ]] + then + $eww update wp$i=$icon3 + else + [[ `bspc query -N -d $i | wc -l` -gt 0 ]] && $eww update wp$i=$icon2 || $eww update wp$i=$icon1 + fi; + done + echo cycle +done diff --git a/.xmonad/scripts/autostart.sh b/.xmonad/scripts/autostart.sh index e359f6c..3249139 100755 --- a/.xmonad/scripts/autostart.sh +++ b/.xmonad/scripts/autostart.sh @@ -14,24 +14,27 @@ xsetroot -cursor_name left_ptr & # background #feh --bg-fill /usr/share/backgrounds/arcolinux/arco-wallpaper.jpg & -dwall -p -s firewatch +#dwall -p -s firewatch +~/scripts/random_wallpaper.sh # other apps -run variety & +#run variety & run nm-applet & -run pamac-tray & -run xfce4-power-manager & +#run pamac-tray & +#run xfce4-power-manager & run volumeicon & -run bitwarden-desktop & -numlockx on & -blueberry-tray & +#run bitwarden-desktop & +#numlockx on & +#blueberry-tray & +run lxsession & fcitx & picom -b --config $HOME/.xmonad/scripts/picom.conf & -/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & -/usr/lib/xfce4/notifyd/xfce4-notifyd & +#/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & +#/usr/lib/xfce4/notifyd/xfce4-notifyd & #seadrive-gui & -trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 0 --transparent true --alpha 0 --tint 0x282c34 --height 16 & - emacs --daemon & + +sleep 2 +trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 0 --transparent true --alpha 0 --tint 0x282c34 --height 16 & diff --git a/.xmonad/xmonad.hs b/.xmonad/xmonad.hs index 7adfc8e..dc9cafc 100644 --- a/.xmonad/xmonad.hs +++ b/.xmonad/xmonad.hs @@ -1,7 +1,7 @@ --- Base + -- Base import XMonad import System.Directory -import System.IO (hPutStrLn) +import System.IO (hClose, hPutStr, hPutStrLn) import System.Exit (exitSuccess) import qualified XMonad.StackSet as W @@ -27,10 +27,13 @@ import qualified Data.Map as M -- Hooks import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..)) import XMonad.Hooks.EwmhDesktops -- for some fullscreen events, also for xcomposite in obs. -import XMonad.Hooks.ManageDocks (avoidStruts, docksEventHook, manageDocks, ToggleStruts(..)) -import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat) +import XMonad.Hooks.ManageDocks (avoidStruts, docks, manageDocks, ToggleStruts(..)) +import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat, doCenterFloat) import XMonad.Hooks.ServerMode import XMonad.Hooks.SetWMName +import XMonad.Hooks.StatusBar +import XMonad.Hooks.StatusBar.PP +import XMonad.Hooks.WindowSwallowing import XMonad.Hooks.WorkspaceHistory -- Layouts @@ -45,7 +48,6 @@ import XMonad.Layout.ThreeColumns -- Layouts modifiers import XMonad.Layout.LayoutModifier import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit) -import XMonad.Layout.Magnifier import XMonad.Layout.MultiToggle (mkToggle, single, EOT(EOT), (??)) import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS)) import XMonad.Layout.NoBorders @@ -55,16 +57,56 @@ import XMonad.Layout.Simplest import XMonad.Layout.Spacing import XMonad.Layout.SubLayouts import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..)) +import XMonad.Layout.WindowNavigation import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle)) import qualified XMonad.Layout.MultiToggle as MT (Toggle(..)) -- Utilities import XMonad.Util.Dmenu -import XMonad.Util.EZConfig (additionalKeysP) +import XMonad.Util.EZConfig (additionalKeysP, mkNamedKeymap) +import XMonad.Util.NamedActions import XMonad.Util.NamedScratchpad import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe) import XMonad.Util.SpawnOnce + -- ColorScheme module (SET ONLY ONE!) + -- Possible choice are: + -- DoomOne + -- Dracula + -- GruvboxDark + -- MonokaiPro + -- Nord + -- OceanicNext + -- Palenight + -- SolarizedDark + -- SolarizedLight + -- TomorrowNight + +colorScheme = "doom-one" + +colorBack = "#282c34" +colorFore = "#bbc2cf" + +color01 = "#1c1f24" +color02 = "#ff6c6b" +color03 = "#98be65" +color04 = "#da8548" +color05 = "#51afef" +color06 = "#c678dd" +color07 = "#5699af" +color08 = "#202328" +color09 = "#5b6268" +color10 = "#da8548" +color11 = "#4db5bd" +color12 = "#ecbe7b" +color13 = "#3071db" +color14 = "#a9a1e1" +color15 = "#46d9ff" +color16 = "#dfdfdf" + +colorTrayer :: String +colorTrayer = "--tint 0x282c34" + myFont :: String myFont = "xft:NanumGothic:regular:size=9:antialias=true:hinting=true" @@ -130,83 +172,7 @@ myStartupHook = do -- spawnOnce "nitrogen --restore &" -- if you prefer nitrogen to feh setWMName "LG3D" -myColorizer :: Window -> Bool -> X (String, String) -myColorizer = colorRangeFromClassName - (0x28,0x2c,0x34) -- lowest inactive bg - (0x28,0x2c,0x34) -- highest inactive bg - (0xc7,0x92,0xea) -- active bg - (0xc0,0xa7,0x9a) -- inactive fg - (0x28,0x2c,0x34) -- active fg - --- gridSelect menu layout -mygridConfig :: p -> GSConfig Window -mygridConfig colorizer = (buildDefaultGSConfig myColorizer) - { gs_cellheight = 40 - , gs_cellwidth = 200 - , gs_cellpadding = 6 - , gs_originFractX = 0.5 - , gs_originFractY = 0.5 - , gs_font = myFont - } - -spawnSelected' :: [(String, String)] -> X () -spawnSelected' lst = gridselect conf lst >>= flip whenJust spawn - where conf = def - { gs_cellheight = 40 - , gs_cellwidth = 200 - , gs_cellpadding = 6 - , gs_originFractX = 0.5 - , gs_originFractY = 0.5 - , gs_font = myFont - } - -myAppGrid = [ --("Audacity", "audacity") - --, ("Deadbeef", "deadbeef") - ("Vivaldi", "vivaldi-stable") - , ("Emacs", "emacsclient -c -a emacs") - , ("Firefox", "firefox") - , ("Vivaldi", "vivaldi-stable") - --, ("Geany", "geany") - --, ("Geary", "geary") - , ("Gimp", "gimp") - , ("Kdenlive", "kdenlive") - , ("LibreOffice Impress", "loimpress") - , ("LibreOffice Writer", "lowriter") - --, ("OBS", "obs") - , ("PCManFM", "pcmanfm") - ] - -myScratchPads :: [NamedScratchpad] -myScratchPads = [ NS "terminal" spawnTerm findTerm manageTerm - , NS "mocp" spawnMocp findMocp manageMocp - , NS "calculator" spawnCalc findCalc manageCalc - ] - where - spawnTerm = myTerminal ++ " -t scratchpad" - findTerm = title =? "scratchpad" - manageTerm = customFloating $ W.RationalRect l t w h - where - h = 0.9 - w = 0.9 - t = 0.95 -h - l = 0.95 -w - spawnMocp = myTerminal ++ " -t mocp -e mocp" - findMocp = title =? "mocp" - manageMocp = customFloating $ W.RationalRect l t w h - where - h = 0.9 - w = 0.9 - t = 0.95 -h - l = 0.95 -w - spawnCalc = "qalculate-gtk" - findCalc = className =? "Qalculate-gtk" - manageCalc = customFloating $ W.RationalRect l t w h - where - h = 0.5 - w = 0.4 - t = 0.75 -h - l = 0.70 -w - +-- Theme for showWName which prints current workspace when you change workspaces. --Makes setting the spacingRaw simpler to write. The spacingRaw module adds a configurable amount of space around windows. mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a mySpacing i = spacingRaw False (Border i i i i) True (Border i i i i) True @@ -220,53 +186,52 @@ mySpacing' i = spacingRaw True (Border i i i i) True (Border i i i i) True -- limitWindows n sets maximum number of windows displayed for layout. -- mySpacing n sets the gap size around the windows. tall = renamed [Replace "tall"] + $ limitWindows 5 $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) - $ limitWindows 12 - $ mySpacing 8 - $ ResizableTall 1 (3/100) (1/2) [] -magnify = renamed [Replace "magnify"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ magnifier - $ limitWindows 12 $ mySpacing 8 $ ResizableTall 1 (3/100) (1/2) [] monocle = renamed [Replace "monocle"] $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) - $ limitWindows 20 Full + $ Full floats = renamed [Replace "floats"] $ smartBorders - $ limitWindows 20 simplestFloat + $ simplestFloat grid = renamed [Replace "grid"] + $ limitWindows 9 $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) - $ limitWindows 12 $ mySpacing 8 $ mkToggle (single MIRROR) $ Grid (16/10) spirals = renamed [Replace "spirals"] + $ limitWindows 9 $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) $ mySpacing' 8 $ spiral (6/7) threeCol = renamed [Replace "threeCol"] + $ limitWindows 7 $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) - $ limitWindows 7 $ ThreeCol 1 (3/100) (1/2) threeRow = renamed [Replace "threeRow"] + $ limitWindows 7 $ smartBorders + $ windowNavigation $ addTabs shrinkText myTabTheme $ subLayout [] (smartBorders Simplest) - $ limitWindows 7 -- Mirror takes a layout and rotates it by 90 degrees. -- So we are applying Mirror to the ThreeCol layout. $ Mirror @@ -282,38 +247,40 @@ wideAccordion = renamed [Replace "wideAccordion"] -- setting colors for tabs layout and tabs sublayout. myTabTheme = def { fontName = myFont - , activeColor = "#46d9ff" - , inactiveColor = "#313846" - , activeBorderColor = "#46d9ff" - , inactiveBorderColor = "#282c34" - , activeTextColor = "#282c34" - , inactiveTextColor = "#d0d0d0" + , activeColor = color15 + , inactiveColor = color08 + , activeBorderColor = color15 + , inactiveBorderColor = colorBack + , activeTextColor = colorBack + , inactiveTextColor = color16 } -- Theme for showWName which prints current workspace when you change workspaces. myShowWNameTheme :: SWNConfig myShowWNameTheme = def - { swn_font = "xft:Ubuntu:bold:size=60" - , swn_fade = 1.0 - , swn_bgcolor = "#1c1f24" - , swn_color = "#ffffff" - } + { swn_font = "xft:Ubuntu:bold:size=60" + , swn_fade = 1.0 + , swn_bgcolor = "#1c1f24" + , swn_color = "#ffffff" + } -- The layout hook -myLayoutHook = avoidStruts $ mouseResize $ windowArrange $ T.toggleLayouts floats +myLayoutHook = avoidStruts + $ mouseResize + $ windowArrange + $ T.toggleLayouts floats $ mkToggle (NBFULL ?? NOBORDERS ?? EOT) myDefaultLayout - where - myDefaultLayout = withBorder myBorderWidth tall - ||| magnify - ||| noBorders monocle - ||| floats - ||| noBorders tabs - ||| grid - ||| spirals - ||| threeCol - ||| threeRow - ||| tallAccordion - ||| wideAccordion + where + myDefaultLayout = withBorder myBorderWidth tall + ||| noBorders monocle + ||| floats + ||| noBorders tabs + ||| grid + ||| spirals + ||| threeCol + ||| threeRow + ||| tallAccordion + ||| wideAccordion myWorkspaces = [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "] -- myWorkspaces = [" dev ", " www ", " sys ", " doc ", " vbox ", " chat ", " mus ", " vid ", " gfx "] @@ -347,7 +314,7 @@ myManageHook = composeAll --, className =? "VirtualBox Manager" --> doShift ( myWorkspaces !! 4 ) , (className =? "firefox" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog , (className =? "steam" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog - ] <+> namedScratchpadManageHook myScratchPads + ] myKeys :: [(String, X ())] myKeys = @@ -397,8 +364,8 @@ myKeys = --, ("M-S-i", incScreenSpacing 4) -- Increase screen spacing -- Grid Select (CTR-g followed by a key) - , ("M-g g", spawnSelected' myAppGrid) -- grid select favorite apps - , ("M-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window + --, ("M-g g", spawnSelected' myAppGrid) -- grid select favorite apps + --, ("M-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window --, ("C-g b", bringSelected $ mygridConfig myColorizer) -- bring selected window -- Windows navigation @@ -495,8 +462,7 @@ main = do , handleEventHook = serverModeEventHookCmd <+> serverModeEventHook <+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn) - <+> docksEventHook - <+> fullscreenEventHook -- this does NOT work right if using multi-monitors! + -- <+> fullscreenEventHook -- this does NOT work right if using multi-monitors! , modMask = myModMask , terminal = myTerminal , startupHook = myStartupHook @@ -505,7 +471,7 @@ main = do , borderWidth = myBorderWidth , normalBorderColor = myNormColor , focusedBorderColor = myFocusColor - , logHook = dynamicLogWithPP $ namedScratchpadFilterOutWorkspacePP $ xmobarPP + , logHook = dynamicLogWithPP $ xmobarPP -- the following variables beginning with 'pp' are settings for xmobar. { ppOutput = \x -> hPutStrLn xmproc0 x -- xmobar on monitor 1 -- >> hPutStrLn xmproc1 x -- xmobar on monitor 2 diff --git a/.xmonad/xmonad.org b/.xmonad/xmonad.org index a131505..c77a462 100644 --- a/.xmonad/xmonad.org +++ b/.xmonad/xmonad.org @@ -3,546 +3,511 @@ * Xmonad ** Import #+begin_src haskell :tangle ./xmonad.hs - -- Base - import XMonad - import System.Directory - import System.IO (hPutStrLn) - import System.Exit (exitSuccess) - import qualified XMonad.StackSet as W + -- Base +import XMonad +import System.Directory +import System.IO (hClose, hPutStr, hPutStrLn) +import System.Exit (exitSuccess) +import qualified XMonad.StackSet as W - -- Actions - import XMonad.Actions.CopyWindow (kill1) - import XMonad.Actions.CycleWS (Direction1D(..), moveTo, shiftTo, WSType(..), nextScreen, prevScreen) - import XMonad.Actions.GridSelect - import XMonad.Actions.MouseResize - import XMonad.Actions.Promote - import XMonad.Actions.RotSlaves (rotSlavesDown, rotAllDown) - import XMonad.Actions.WindowGo (runOrRaise) - import XMonad.Actions.WithAll (sinkAll, killAll) - import qualified XMonad.Actions.Search as S + -- Actions +import XMonad.Actions.CopyWindow (kill1) +import XMonad.Actions.CycleWS (Direction1D(..), moveTo, shiftTo, WSType(..), nextScreen, prevScreen) +import XMonad.Actions.GridSelect +import XMonad.Actions.MouseResize +import XMonad.Actions.Promote +import XMonad.Actions.RotSlaves (rotSlavesDown, rotAllDown) +import XMonad.Actions.WindowGo (runOrRaise) +import XMonad.Actions.WithAll (sinkAll, killAll) +import qualified XMonad.Actions.Search as S - -- Data - import Data.Char (isSpace, toUpper) - import Data.Maybe (fromJust) - import Data.Monoid - import Data.Maybe (isJust) - import Data.Tree - import qualified Data.Map as M + -- Data +import Data.Char (isSpace, toUpper) +import Data.Maybe (fromJust) +import Data.Monoid +import Data.Maybe (isJust) +import Data.Tree +import qualified Data.Map as M - -- Hooks - import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..)) - import XMonad.Hooks.EwmhDesktops -- for some fullscreen events, also for xcomposite in obs. - import XMonad.Hooks.ManageDocks (avoidStruts, docksEventHook, manageDocks, ToggleStruts(..)) - import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat) - import XMonad.Hooks.ServerMode - import XMonad.Hooks.SetWMName - import XMonad.Hooks.WorkspaceHistory + -- Hooks +import XMonad.Hooks.DynamicLog (dynamicLogWithPP, wrap, xmobarPP, xmobarColor, shorten, PP(..)) +import XMonad.Hooks.EwmhDesktops -- for some fullscreen events, also for xcomposite in obs. +import XMonad.Hooks.ManageDocks (avoidStruts, docks, manageDocks, ToggleStruts(..)) +import XMonad.Hooks.ManageHelpers (isFullscreen, doFullFloat, doCenterFloat) +import XMonad.Hooks.ServerMode +import XMonad.Hooks.SetWMName +import XMonad.Hooks.StatusBar +import XMonad.Hooks.StatusBar.PP +import XMonad.Hooks.WindowSwallowing +import XMonad.Hooks.WorkspaceHistory - -- Layouts - import XMonad.Layout.Accordion - import XMonad.Layout.GridVariants (Grid(Grid)) - import XMonad.Layout.SimplestFloat - import XMonad.Layout.Spiral - import XMonad.Layout.ResizableTile - import XMonad.Layout.Tabbed - import XMonad.Layout.ThreeColumns + -- Layouts +import XMonad.Layout.Accordion +import XMonad.Layout.GridVariants (Grid(Grid)) +import XMonad.Layout.SimplestFloat +import XMonad.Layout.Spiral +import XMonad.Layout.ResizableTile +import XMonad.Layout.Tabbed +import XMonad.Layout.ThreeColumns - -- Layouts modifiers - import XMonad.Layout.LayoutModifier - import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit) - import XMonad.Layout.Magnifier - import XMonad.Layout.MultiToggle (mkToggle, single, EOT(EOT), (??)) - import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS)) - import XMonad.Layout.NoBorders - import XMonad.Layout.Renamed - import XMonad.Layout.ShowWName - import XMonad.Layout.Simplest - import XMonad.Layout.Spacing - import XMonad.Layout.SubLayouts - import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..)) - import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle)) - import qualified XMonad.Layout.MultiToggle as MT (Toggle(..)) + -- Layouts modifiers +import XMonad.Layout.LayoutModifier +import XMonad.Layout.LimitWindows (limitWindows, increaseLimit, decreaseLimit) +import XMonad.Layout.MultiToggle (mkToggle, single, EOT(EOT), (??)) +import XMonad.Layout.MultiToggle.Instances (StdTransformers(NBFULL, MIRROR, NOBORDERS)) +import XMonad.Layout.NoBorders +import XMonad.Layout.Renamed +import XMonad.Layout.ShowWName +import XMonad.Layout.Simplest +import XMonad.Layout.Spacing +import XMonad.Layout.SubLayouts +import XMonad.Layout.WindowArranger (windowArrange, WindowArrangerMsg(..)) +import XMonad.Layout.WindowNavigation +import qualified XMonad.Layout.ToggleLayouts as T (toggleLayouts, ToggleLayout(Toggle)) +import qualified XMonad.Layout.MultiToggle as MT (Toggle(..)) - -- Utilities - import XMonad.Util.Dmenu - import XMonad.Util.EZConfig (additionalKeysP) - import XMonad.Util.NamedScratchpad - import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe) - import XMonad.Util.SpawnOnce + -- Utilities +import XMonad.Util.Dmenu +import XMonad.Util.EZConfig (additionalKeysP, mkNamedKeymap) +import XMonad.Util.NamedActions +import XMonad.Util.NamedScratchpad +import XMonad.Util.Run (runProcessWithInput, safeSpawn, spawnPipe) +import XMonad.Util.SpawnOnce + + -- ColorScheme module (SET ONLY ONE!) + -- Possible choice are: + -- DoomOne + -- Dracula + -- GruvboxDark + -- MonokaiPro + -- Nord + -- OceanicNext + -- Palenight + -- SolarizedDark + -- SolarizedLight + -- TomorrowNight +#+end_src +** Color Definition +#+begin_src haskell :tangle ./xmonad.hs +colorScheme = "doom-one" + +colorBack = "#282c34" +colorFore = "#bbc2cf" + +color01 = "#1c1f24" +color02 = "#ff6c6b" +color03 = "#98be65" +color04 = "#da8548" +color05 = "#51afef" +color06 = "#c678dd" +color07 = "#5699af" +color08 = "#202328" +color09 = "#5b6268" +color10 = "#da8548" +color11 = "#4db5bd" +color12 = "#ecbe7b" +color13 = "#3071db" +color14 = "#a9a1e1" +color15 = "#46d9ff" +color16 = "#dfdfdf" + +colorTrayer :: String +colorTrayer = "--tint 0x282c34" #+end_src ** Gobal Variable #+begin_src haskell :tangle ./xmonad.hs - myFont :: String - myFont = "xft:NanumGothic:regular:size=9:antialias=true:hinting=true" +myFont :: String +myFont = "xft:NanumGothic:regular:size=9:antialias=true:hinting=true" - myEmojiFont :: String - myEmojiFont = "xft:Noto Fonts Emoji:regular:size=9:antialias=true:hinting=true" +myEmojiFont :: String +myEmojiFont = "xft:Noto Fonts Emoji:regular:size=9:antialias=true:hinting=true" - myModMask :: KeyMask - myModMask = mod4Mask -- Sets modkey to super/windows key +myModMask :: KeyMask +myModMask = mod4Mask -- Sets modkey to super/windows key - myTerminal :: String - myTerminal = "alacritty" -- Sets default terminal +myTerminal :: String +myTerminal = "alacritty" -- Sets default terminal - myBrowser :: String - myBrowser = "qutebrowser " -- Sets qutebrowser as browser +myBrowser :: String +myBrowser = "qutebrowser " -- Sets qutebrowser as browser - myEmacs :: String - myEmacs = "emacsclient -c -a 'emacs' " -- Makes emacs keybindings easier to type +myEmacs :: String +myEmacs = "emacsclient -c -a 'emacs' " -- Makes emacs keybindings easier to type - myEditor :: String - myEditor = "emacsclient -c -a 'emacs' " -- Sets emacs as editor - -- myEditor = myTerminal ++ " -e vim " -- Sets vim as editor +myEditor :: String +myEditor = "emacsclient -c -a 'emacs' " -- Sets emacs as editor +-- myEditor = myTerminal ++ " -e vim " -- Sets vim as editor - myBorderWidth :: Dimension - myBorderWidth = 2 -- Sets border width for windows +myBorderWidth :: Dimension +myBorderWidth = 2 -- Sets border width for windows - myNormColor :: String - myNormColor = "#282c34" -- Border color of normal windows +myNormColor :: String +myNormColor = "#282c34" -- Border color of normal windows - myFocusColor :: String - myFocusColor = "#46d9ff" -- Border color of focused windows +myFocusColor :: String +myFocusColor = "#46d9ff" -- Border color of focused windows - altMask :: KeyMask - altMask = mod1Mask -- Setting this for use in xprompts +altMask :: KeyMask +altMask = mod1Mask -- Setting this for use in xprompts - windowCount :: X (Maybe String) - windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset +windowCount :: X (Maybe String) +windowCount = gets $ Just . show . length . W.integrate' . W.stack . W.workspace . W.current . windowset #+end_src ** StartupHook #+begin_src haskell :tangle ./xmonad.hs - myStartupHook :: X () - myStartupHook = do - --spawnOnce "xrandr --output DP-4 --primary --mode 2560x1440 --pos 0x0 --rotate normal --output HDMI-0 --mode 1920x1080 --pos 2560x0 --rotate normal" - spawn "$HOME/.xmonad/scripts/autostart.sh" - --spawnOnce "nm-applet &" - --spawnOnce "picom -b --config ~/.xmonad/picom.conf &" - --spawnOnce "picom --experimental-backends -b --config ~/.xmonad/picom.conf &" - --spawnOnce "dwall -s firewatch &" - --spawnOnce "fcitx &" - --spawnOnce "seafile-applet &" - --spawnOnce "seadrive-gui &" - --spawnOnce "blueberry-tray &" - --spawnOnce "volumeicon &" - --spawnOnce "enpass" - --spawnOnce "green-tunnel -s &" - --spawnOnce "trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 0 --transparent true --alpha 0 --tint 0x282c34 --height 24 &" - --spawnOnce "/usr/bin/emacs --daemon &" - -- spawnOnce "/usr/bin/emacs --daemon &" -- emacs daemon for the emacsclient - -- spawnOnce "kak -d -s mysession &" -- kakoune daemon for better performance - -- spawnOnce "urxvtd -q -o -f &" -- urxvt daemon for better performance - - --spawnOnce "xargs xwallpaper --stretch < ~/.xwallpaper" -- set last saved with xwallpaper - -- spawnOnce "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch" -- set random xwallpaper - -- spawnOnce "~/.fehbg &" -- set last saved feh wallpaper - -- spawnOnce "feh --randomize --bg-fill ~/wallpapers/*" -- feh set random wallpaper - -- spawnOnce "nitrogen --restore &" -- if you prefer nitrogen to feh - setWMName "LG3D" +myStartupHook :: X () +myStartupHook = do + --spawnOnce "xrandr --output DP-4 --primary --mode 2560x1440 --pos 0x0 --rotate normal --output HDMI-0 --mode 1920x1080 --pos 2560x0 --rotate normal" + spawn "$HOME/.xmonad/scripts/autostart.sh" + --spawnOnce "nm-applet &" + --spawnOnce "picom -b --config ~/.xmonad/picom.conf &" + --spawnOnce "picom --experimental-backends -b --config ~/.xmonad/picom.conf &" + --spawnOnce "dwall -s firewatch &" + --spawnOnce "fcitx &" + --spawnOnce "seafile-applet &" + --spawnOnce "seadrive-gui &" + --spawnOnce "blueberry-tray &" + --spawnOnce "volumeicon &" + --spawnOnce "enpass" + --spawnOnce "green-tunnel -s &" + --spawnOnce "trayer --edge top --align right --widthtype request --padding 6 --SetDockType true --SetPartialStrut true --expand true --monitor 0 --transparent true --alpha 0 --tint 0x282c34 --height 24 &" + --spawnOnce "/usr/bin/emacs --daemon &" + -- spawnOnce "/usr/bin/emacs --daemon &" -- emacs daemon for the emacsclient + -- spawnOnce "kak -d -s mysession &" -- kakoune daemon for better performance + -- spawnOnce "urxvtd -q -o -f &" -- urxvt daemon for better performance + --spawnOnce "xargs xwallpaper --stretch < ~/.xwallpaper" -- set last saved with xwallpaper + -- spawnOnce "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch" -- set random xwallpaper + -- spawnOnce "~/.fehbg &" -- set last saved feh wallpaper + -- spawnOnce "feh --randomize --bg-fill ~/wallpapers/*" -- feh set random wallpaper + -- spawnOnce "nitrogen --restore &" -- if you prefer nitrogen to feh + setWMName "LG3D" #+end_src ** Layout #+begin_src haskell :tangle ./xmonad.hs +-- Theme for showWName which prints current workspace when you change workspaces. +--Makes setting the spacingRaw simpler to write. The spacingRaw module adds a configurable amount of space around windows. +mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a +mySpacing i = spacingRaw False (Border i i i i) True (Border i i i i) True - myColorizer :: Window -> Bool -> X (String, String) - myColorizer = colorRangeFromClassName - (0x28,0x2c,0x34) -- lowest inactive bg - (0x28,0x2c,0x34) -- highest inactive bg - (0xc7,0x92,0xea) -- active bg - (0xc0,0xa7,0x9a) -- inactive fg - (0x28,0x2c,0x34) -- active fg +-- Below is a variation of the above except no borders are applied +-- if fewer than two windows. So a single window has no gaps. +mySpacing' :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a +mySpacing' i = spacingRaw True (Border i i i i) True (Border i i i i) True - -- gridSelect menu layout - mygridConfig :: p -> GSConfig Window - mygridConfig colorizer = (buildDefaultGSConfig myColorizer) - { gs_cellheight = 40 - , gs_cellwidth = 200 - , gs_cellpadding = 6 - , gs_originFractX = 0.5 - , gs_originFractY = 0.5 - , gs_font = myFont - } +-- Defining a bunch of layouts, many that I don't use. +-- limitWindows n sets maximum number of windows displayed for layout. +-- mySpacing n sets the gap size around the windows. +tall = renamed [Replace "tall"] + $ limitWindows 5 + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + $ mySpacing 8 + $ ResizableTall 1 (3/100) (1/2) [] +monocle = renamed [Replace "monocle"] + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + $ Full +floats = renamed [Replace "floats"] + $ smartBorders + $ simplestFloat +grid = renamed [Replace "grid"] + $ limitWindows 9 + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + $ mySpacing 8 + $ mkToggle (single MIRROR) + $ Grid (16/10) +spirals = renamed [Replace "spirals"] + $ limitWindows 9 + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + $ mySpacing' 8 + $ spiral (6/7) +threeCol = renamed [Replace "threeCol"] + $ limitWindows 7 + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + $ ThreeCol 1 (3/100) (1/2) +threeRow = renamed [Replace "threeRow"] + $ limitWindows 7 + $ smartBorders + $ windowNavigation + $ addTabs shrinkText myTabTheme + $ subLayout [] (smartBorders Simplest) + -- Mirror takes a layout and rotates it by 90 degrees. + -- So we are applying Mirror to the ThreeCol layout. + $ Mirror + $ ThreeCol 1 (3/100) (1/2) +tabs = renamed [Replace "tabs"] + -- I cannot add spacing to this layout because it will + -- add spacing between window and tabs which looks bad. + $ tabbed shrinkText myTabTheme +tallAccordion = renamed [Replace "tallAccordion"] + $ Accordion +wideAccordion = renamed [Replace "wideAccordion"] + $ Mirror Accordion - spawnSelected' :: [(String, String)] -> X () - spawnSelected' lst = gridselect conf lst >>= flip whenJust spawn - where conf = def - { gs_cellheight = 40 - , gs_cellwidth = 200 - , gs_cellpadding = 6 - , gs_originFractX = 0.5 - , gs_originFractY = 0.5 - , gs_font = myFont - } +-- setting colors for tabs layout and tabs sublayout. +myTabTheme = def { fontName = myFont + , activeColor = color15 + , inactiveColor = color08 + , activeBorderColor = color15 + , inactiveBorderColor = colorBack + , activeTextColor = colorBack + , inactiveTextColor = color16 + } - myAppGrid = [ --("Audacity", "audacity") - --, ("Deadbeef", "deadbeef") - ("Vivaldi", "vivaldi-stable") - , ("Emacs", "emacsclient -c -a emacs") - , ("Firefox", "firefox") - , ("Vivaldi", "vivaldi-stable") - --, ("Geany", "geany") - --, ("Geary", "geary") - , ("Gimp", "gimp") - , ("Kdenlive", "kdenlive") - , ("LibreOffice Impress", "loimpress") - , ("LibreOffice Writer", "lowriter") - --, ("OBS", "obs") - , ("PCManFM", "pcmanfm") - ] - - myScratchPads :: [NamedScratchpad] - myScratchPads = [ NS "terminal" spawnTerm findTerm manageTerm - , NS "mocp" spawnMocp findMocp manageMocp - , NS "calculator" spawnCalc findCalc manageCalc - ] - where - spawnTerm = myTerminal ++ " -t scratchpad" - findTerm = title =? "scratchpad" - manageTerm = customFloating $ W.RationalRect l t w h - where - h = 0.9 - w = 0.9 - t = 0.95 -h - l = 0.95 -w - spawnMocp = myTerminal ++ " -t mocp -e mocp" - findMocp = title =? "mocp" - manageMocp = customFloating $ W.RationalRect l t w h - where - h = 0.9 - w = 0.9 - t = 0.95 -h - l = 0.95 -w - spawnCalc = "qalculate-gtk" - findCalc = className =? "Qalculate-gtk" - manageCalc = customFloating $ W.RationalRect l t w h - where - h = 0.5 - w = 0.4 - t = 0.75 -h - l = 0.70 -w - - --Makes setting the spacingRaw simpler to write. The spacingRaw module adds a configurable amount of space around windows. - mySpacing :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a - mySpacing i = spacingRaw False (Border i i i i) True (Border i i i i) True - - -- Below is a variation of the above except no borders are applied - -- if fewer than two windows. So a single window has no gaps. - mySpacing' :: Integer -> l a -> XMonad.Layout.LayoutModifier.ModifiedLayout Spacing l a - mySpacing' i = spacingRaw True (Border i i i i) True (Border i i i i) True - - -- Defining a bunch of layouts, many that I don't use. - -- limitWindows n sets maximum number of windows displayed for layout. - -- mySpacing n sets the gap size around the windows. - tall = renamed [Replace "tall"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ limitWindows 12 - $ mySpacing 8 - $ ResizableTall 1 (3/100) (1/2) [] - magnify = renamed [Replace "magnify"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ magnifier - $ limitWindows 12 - $ mySpacing 8 - $ ResizableTall 1 (3/100) (1/2) [] - monocle = renamed [Replace "monocle"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ limitWindows 20 Full - floats = renamed [Replace "floats"] - $ smartBorders - $ limitWindows 20 simplestFloat - grid = renamed [Replace "grid"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ limitWindows 12 - $ mySpacing 8 - $ mkToggle (single MIRROR) - $ Grid (16/10) - spirals = renamed [Replace "spirals"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ mySpacing' 8 - $ spiral (6/7) - threeCol = renamed [Replace "threeCol"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ limitWindows 7 - $ ThreeCol 1 (3/100) (1/2) - threeRow = renamed [Replace "threeRow"] - $ smartBorders - $ addTabs shrinkText myTabTheme - $ subLayout [] (smartBorders Simplest) - $ limitWindows 7 - -- Mirror takes a layout and rotates it by 90 degrees. - -- So we are applying Mirror to the ThreeCol layout. - $ Mirror - $ ThreeCol 1 (3/100) (1/2) - tabs = renamed [Replace "tabs"] - -- I cannot add spacing to this layout because it will - -- add spacing between window and tabs which looks bad. - $ tabbed shrinkText myTabTheme - tallAccordion = renamed [Replace "tallAccordion"] - $ Accordion - wideAccordion = renamed [Replace "wideAccordion"] - $ Mirror Accordion - - -- setting colors for tabs layout and tabs sublayout. - myTabTheme = def { fontName = myFont - , activeColor = "#46d9ff" - , inactiveColor = "#313846" - , activeBorderColor = "#46d9ff" - , inactiveBorderColor = "#282c34" - , activeTextColor = "#282c34" - , inactiveTextColor = "#d0d0d0" - } - - -- Theme for showWName which prints current workspace when you change workspaces. - myShowWNameTheme :: SWNConfig - myShowWNameTheme = def - { swn_font = "xft:Ubuntu:bold:size=60" - , swn_fade = 1.0 - , swn_bgcolor = "#1c1f24" - , swn_color = "#ffffff" - } - - -- The layout hook - myLayoutHook = avoidStruts $ mouseResize $ windowArrange $ T.toggleLayouts floats - $ mkToggle (NBFULL ?? NOBORDERS ?? EOT) myDefaultLayout - where - myDefaultLayout = withBorder myBorderWidth tall - ||| magnify - ||| noBorders monocle - ||| floats - ||| noBorders tabs - ||| grid - ||| spirals - ||| threeCol - ||| threeRow - ||| tallAccordion - ||| wideAccordion +-- Theme for showWName which prints current workspace when you change workspaces. +myShowWNameTheme :: SWNConfig +myShowWNameTheme = def + { swn_font = "xft:Ubuntu:bold:size=60" + , swn_fade = 1.0 + , swn_bgcolor = "#1c1f24" + , swn_color = "#ffffff" + } +-- The layout hook +myLayoutHook = avoidStruts + $ mouseResize + $ windowArrange + $ T.toggleLayouts floats + $ mkToggle (NBFULL ?? NOBORDERS ?? EOT) myDefaultLayout + where + myDefaultLayout = withBorder myBorderWidth tall + ||| noBorders monocle + ||| floats + ||| noBorders tabs + ||| grid + ||| spirals + ||| threeCol + ||| threeRow + ||| tallAccordion + ||| wideAccordion #+end_src ** Workspace #+begin_src haskell :tangle ./xmonad.hs - myWorkspaces = [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "] - -- myWorkspaces = [" dev ", " www ", " sys ", " doc ", " vbox ", " chat ", " mus ", " vid ", " gfx "] - myWorkspaceIndices = M.fromList $ zipWith (,) myWorkspaces [1..] -- (,) == \x y -> (x,y) +myWorkspaces = [" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "] +-- myWorkspaces = [" dev ", " www ", " sys ", " doc ", " vbox ", " chat ", " mus ", " vid ", " gfx "] +myWorkspaceIndices = M.fromList $ zipWith (,) myWorkspaces [1..] -- (,) == \x y -> (x,y) - clickable ws = ""++ws++"" - where i = fromJust $ M.lookup ws myWorkspaceIndices +clickable ws = ""++ws++"" + where i = fromJust $ M.lookup ws myWorkspaceIndices - myManageHook :: XMonad.Query (Data.Monoid.Endo WindowSet) - myManageHook = composeAll - -- 'doFloat' forces a window to float. Useful for dialog boxes and such. - -- using 'doShift ( myWorkspaces !! 7)' sends program to workspace 8! - -- I'm doing it this way because otherwise I would have to write out the full - -- name of my workspaces and the names would be very long if using clickable workspaces. - [ className =? "confirm" --> doFloat - , className =? "file_progress" --> doFloat - , className =? "dialog" --> doFloat - , className =? "download" --> doFloat - , className =? "error" --> doFloat - , className =? "Gimp" --> doFloat - , className =? "notification" --> doFloat - , className =? "pinentry-gtk-2" --> doFloat - , className =? "splash" --> doFloat - , className =? "toolbar" --> doFloat - --, title =? "Oracle VM VirtualBox Manager" --> doFloat - --, title =? "Mozilla Firefox" --> doShift ( myWorkspaces !! 1 ) - --, className =? "brave-browser" --> doShift ( myWorkspaces !! 1 ) - --, className =? "qutebrowser" --> doShift ( myWorkspaces !! 1 ) - --, className =? "mpv" --> doShift ( myWorkspaces !! 7 ) - --, className =? "Gimp" --> doShift ( myWorkspaces !! 8 ) - --, className =? "VirtualBox Manager" --> doShift ( myWorkspaces !! 4 ) - , (className =? "firefox" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog - , (className =? "steam" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog - ] <+> namedScratchpadManageHook myScratchPads +myManageHook :: XMonad.Query (Data.Monoid.Endo WindowSet) +myManageHook = composeAll + -- 'doFloat' forces a window to float. Useful for dialog boxes and such. + -- using 'doShift ( myWorkspaces !! 7)' sends program to workspace 8! + -- I'm doing it this way because otherwise I would have to write out the full + -- name of my workspaces and the names would be very long if using clickable workspaces. + [ className =? "confirm" --> doFloat + , className =? "file_progress" --> doFloat + , className =? "dialog" --> doFloat + , className =? "download" --> doFloat + , className =? "error" --> doFloat + , className =? "Gimp" --> doFloat + , className =? "notification" --> doFloat + , className =? "pinentry-gtk-2" --> doFloat + , className =? "splash" --> doFloat + , className =? "toolbar" --> doFloat + --, title =? "Oracle VM VirtualBox Manager" --> doFloat + --, title =? "Mozilla Firefox" --> doShift ( myWorkspaces !! 1 ) + --, className =? "brave-browser" --> doShift ( myWorkspaces !! 1 ) + --, className =? "qutebrowser" --> doShift ( myWorkspaces !! 1 ) + --, className =? "mpv" --> doShift ( myWorkspaces !! 7 ) + --, className =? "Gimp" --> doShift ( myWorkspaces !! 8 ) + --, className =? "VirtualBox Manager" --> doShift ( myWorkspaces !! 4 ) + , (className =? "firefox" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog + , (className =? "steam" <&&> resource =? "Dialog") --> doFloat -- Float Firefox Dialog + ] #+end_src ** Key bindings #+begin_src haskell :tangle ./xmonad.hs - myKeys :: [(String, X ())] - myKeys = - -- Xmonad - [ ("M-C-r", spawn "xmonad --recompile") -- Recompiles xmonad - , ("M-S-r", spawn "xmonad --restart") -- Restarts xmonad - , ("M-S-q", io exitSuccess) -- Quits xmonad +myKeys :: [(String, X ())] +myKeys = + -- Xmonad + [ ("M-C-r", spawn "xmonad --recompile") -- Recompiles xmonad + , ("M-S-r", spawn "xmonad --restart") -- Restarts xmonad + , ("M-S-q", io exitSuccess) -- Quits xmonad - -- Run Prompt - -- M-p was the default keybinding. I've changed it to M-S-RET because I will use - -- M-p as part of the keychord for the other dmenu script bindings. - , ("M-S-", spawn "dmenu_run -i -p \"Run: \"") -- Dmenu + -- Run Prompt + -- M-p was the default keybinding. I've changed it to M-S-RET because I will use + -- M-p as part of the keychord for the other dmenu script bindings. + , ("M-S-", spawn "dmenu_run -i -p \"Run: \"") -- Dmenu - -- Launch Apps - , ("M-f", spawn "firefox") - , ("M-v", spawn "vivaldi-stable") - , ("M-t", spawn "thunar") - , ("M-p", spawn "bitwarden-desktop") - --, ("M-e", spawn "emacs") - , ("M-e", spawn myEmacs) - , ("M-l", spawn "arcolinux-logout") + -- Launch Apps + , ("M-f", spawn "firefox") + , ("M-v", spawn "vivaldi-stable") + , ("M-t", spawn "thunar") + , ("M-p", spawn "bitwarden-desktop") + --, ("M-e", spawn "emacs") + , ("M-e", spawn myEmacs) + , ("M-l", spawn "arcolinux-logout") - -- Useful programs to have a keybinding for launch - , ("M-", spawn (myTerminal)) - --, ("M-b", spawn (myBrowser ++ " www.youtube.com/c/DistroTube/")) - --, ("M-M1-h", spawn (myTerminal ++ " -e htop")) + -- Useful programs to have a keybinding for launch + , ("M-", spawn (myTerminal)) + --, ("M-b", spawn (myBrowser ++ " www.youtube.com/c/DistroTube/")) + --, ("M-M1-h", spawn (myTerminal ++ " -e htop")) - -- Kill windows - , ("M-S-c", kill1) -- Kill the currently focused client - --, ("M-S-a", killAll) -- Kill all windows on current workspace + -- Kill windows + , ("M-S-c", kill1) -- Kill the currently focused client + --, ("M-S-a", killAll) -- Kill all windows on current workspace - -- Workspaces - --, ("M-.", nextScreen) -- Switch focus to next monitor - --, ("M-,", prevScreen) -- Switch focus to prev monitor - --, ("M-S-", shiftTo Next nonNSP >> moveTo Next nonNSP) -- Shifts focused window to next ws - --, ("M-S-", shiftTo Prev nonNSP >> moveTo Prev nonNSP) -- Shifts focused window to prev ws + -- Workspaces + --, ("M-.", nextScreen) -- Switch focus to next monitor + --, ("M-,", prevScreen) -- Switch focus to prev monitor + --, ("M-S-", shiftTo Next nonNSP >> moveTo Next nonNSP) -- Shifts focused window to next ws + --, ("M-S-", shiftTo Prev nonNSP >> moveTo Prev nonNSP) -- Shifts focused window to prev ws - -- Floating windows - --, ("M-f", sendMessage (T.Toggle "floats")) -- Toggles my 'floats' layout - --, ("M-t", withFocused $ windows . W.sink) -- Push floating window back to tile - --, ("M-S-t", sinkAll) -- Push ALL floating windows to tile + -- Floating windows + --, ("M-f", sendMessage (T.Toggle "floats")) -- Toggles my 'floats' layout + --, ("M-t", withFocused $ windows . W.sink) -- Push floating window back to tile + --, ("M-S-t", sinkAll) -- Push ALL floating windows to tile - -- Increase/decrease spacing (gaps) - --, ("M-d", decWindowSpacing 4) -- Decrease window spacing - --, ("M-i", incWindowSpacing 4) -- Increase window spacing - --, ("M-S-d", decScreenSpacing 4) -- Decrease screen spacing - --, ("M-S-i", incScreenSpacing 4) -- Increase screen spacing + -- Increase/decrease spacing (gaps) + --, ("M-d", decWindowSpacing 4) -- Decrease window spacing + --, ("M-i", incWindowSpacing 4) -- Increase window spacing + --, ("M-S-d", decScreenSpacing 4) -- Decrease screen spacing + --, ("M-S-i", incScreenSpacing 4) -- Increase screen spacing - -- Grid Select (CTR-g followed by a key) - , ("M-g g", spawnSelected' myAppGrid) -- grid select favorite apps - , ("M-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window - --, ("C-g b", bringSelected $ mygridConfig myColorizer) -- bring selected window + -- Grid Select (CTR-g followed by a key) + --, ("M-g g", spawnSelected' myAppGrid) -- grid select favorite apps + --, ("M-g t", goToSelected $ mygridConfig myColorizer) -- goto selected window + --, ("C-g b", bringSelected $ mygridConfig myColorizer) -- bring selected window - -- Windows navigation - --, ("M-m", windows W.focusMaster) -- Move focus to the master window - , ("M-j", windows W.focusDown) -- Move focus to the next window - , ("M-k", windows W.focusUp) -- Move focus to the prev window - --, ("M-S-m", windows W.swapMaster) -- Swap the focused window and the master window - --, ("M-S-j", windows W.swapDown) -- Swap focused window with next window - --, ("M-S-k", windows W.swapUp) -- Swap focused window with prev window - --, ("M-", promote) -- Moves focused window to master, others maintain order - --, ("M-S-", rotSlavesDown) -- Rotate all windows except master and keep focus in place - , ("M-C-", rotAllDown) -- Rotate all the windows in the current stack + -- Windows navigation + --, ("M-m", windows W.focusMaster) -- Move focus to the master window + , ("M-j", windows W.focusDown) -- Move focus to the next window + , ("M-k", windows W.focusUp) -- Move focus to the prev window + --, ("M-S-m", windows W.swapMaster) -- Swap the focused window and the master window + --, ("M-S-j", windows W.swapDown) -- Swap focused window with next window + --, ("M-S-k", windows W.swapUp) -- Swap focused window with prev window + --, ("M-", promote) -- Moves focused window to master, others maintain order + --, ("M-S-", rotSlavesDown) -- Rotate all windows except master and keep focus in place + , ("M-C-", rotAllDown) -- Rotate all the windows in the current stack - -- Layouts - --, ("M-", sendMessage NextLayout) -- Switch to next layout - --, ("M-C-M1-", sendMessage Arrange) - --, ("M-C-M1-", sendMessage DeArrange) - --, ("M-S-", sendMessage ToggleStruts) -- Toggles struts - --, ("M-S-n", sendMessage $ MT.Toggle NOBORDERS) -- Toggles noborder - , ("M-", sendMessage (MT.Toggle NBFULL) >> sendMessage ToggleStruts) -- Toggles noborder/full + -- Layouts + --, ("M-", sendMessage NextLayout) -- Switch to next layout + --, ("M-C-M1-", sendMessage Arrange) + --, ("M-C-M1-", sendMessage DeArrange) + --, ("M-S-", sendMessage ToggleStruts) -- Toggles struts + --, ("M-S-n", sendMessage $ MT.Toggle NOBORDERS) -- Toggles noborder + , ("M-", sendMessage (MT.Toggle NBFULL) >> sendMessage ToggleStruts) -- Toggles noborder/full - -- Increase/decrease windows in the master pane or the stack - --, ("M-S-", sendMessage (IncMasterN 1)) -- Increase # of clients master pane - --, ("M-S-", sendMessage (IncMasterN (-1))) -- Decrease # of clients master pane - --, ("M-C-", increaseLimit) -- Increase # of windows - --, ("M-C-", decreaseLimit) -- Decrease # of windows + -- Increase/decrease windows in the master pane or the stack + --, ("M-S-", sendMessage (IncMasterN 1)) -- Increase # of clients master pane + --, ("M-S-", sendMessage (IncMasterN (-1))) -- Decrease # of clients master pane + --, ("M-C-", increaseLimit) -- Increase # of windows + --, ("M-C-", decreaseLimit) -- Decrease # of windows - -- Window resizing - --, ("M-h", sendMessage Shrink) -- Shrink horiz window width - --, ("M-l", sendMessage Expand) -- Expand horiz window width - --, ("M-M1-j", sendMessage MirrorShrink) -- Shrink vert window width - --, ("M-M1-k", sendMessage MirrorExpand) -- Expand vert window width + -- Window resizing + --, ("M-h", sendMessage Shrink) -- Shrink horiz window width + --, ("M-l", sendMessage Expand) -- Expand horiz window width + --, ("M-M1-j", sendMessage MirrorShrink) -- Shrink vert window width + --, ("M-M1-k", sendMessage MirrorExpand) -- Expand vert window width - -- Systemwise - , ("C-S-", spawn $ "xfce4-taskmanager") - -- Sublayouts - -- This is used to push windows to tabbed sublayouts, or pull them out of it. - --, ("M-C-h", sendMessage $ pullGroup L) - --, ("M-C-l", sendMessage $ pullGroup R) - --, ("M-C-k", sendMessage $ pullGroup U) - --, ("M-C-j", sendMessage $ pullGroup D) - --, ("M-C-m", withFocused (sendMessage . MergeAll)) - ---- , ("M-C-u", withFocused (sendMessage . UnMerge)) - --, ("M-C-/", withFocused (sendMessage . UnMergeAll)) - --, ("M-C-.", onGroup W.focusUp') -- Switch focus to next tab - --, ("M-C-,", onGroup W.focusDown') -- Switch focus to prev tab + -- Systemwise + , ("C-S-", spawn $ "xfce4-taskmanager") + -- Sublayouts + -- This is used to push windows to tabbed sublayouts, or pull them out of it. + --, ("M-C-h", sendMessage $ pullGroup L) + --, ("M-C-l", sendMessage $ pullGroup R) + --, ("M-C-k", sendMessage $ pullGroup U) + --, ("M-C-j", sendMessage $ pullGroup D) + --, ("M-C-m", withFocused (sendMessage . MergeAll)) + ---- , ("M-C-u", withFocused (sendMessage . UnMerge)) + --, ("M-C-/", withFocused (sendMessage . UnMergeAll)) + --, ("M-C-.", onGroup W.focusUp') -- Switch focus to next tab + --, ("M-C-,", onGroup W.focusDown') -- Switch focus to prev tab - -- Scratchpads - -- Toggle show/hide these programs. They run on a hidden workspace. - -- When you toggle them to show, it brings them to your current workspace. - -- Toggle them to hide and it sends them back to hidden workspace (NSP). - --, ("C-s t", namedScratchpadAction myScratchPads "terminal") - --, ("C-s m", namedScratchpadAction myScratchPads "mocp") - --, ("C-s c", namedScratchpadAction myScratchPads "calculator") + -- Scratchpads + -- Toggle show/hide these programs. They run on a hidden workspace. + -- When you toggle them to show, it brings them to your current workspace. + -- Toggle them to hide and it sends them back to hidden workspace (NSP). + --, ("C-s t", namedScratchpadAction myScratchPads "terminal") + --, ("C-s m", namedScratchpadAction myScratchPads "mocp") + --, ("C-s c", namedScratchpadAction myScratchPads "calculator") - -- Set wallpaper with 'feh'. Type 'SUPER+F1' to launch sxiv in the wallpapers directory. - -- Then in sxiv, type 'C-x w' to set the wallpaper that you choose. - --, ("M-", spawn "sxiv -r -q -t -o ~/wallpapers/*") - --, ("M-", spawn "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch") - --, ("M-", spawn "feh --randomize --bg-fill ~/wallpapers/*") + -- Set wallpaper with 'feh'. Type 'SUPER+F1' to launch sxiv in the wallpapers directory. + -- Then in sxiv, type 'C-x w' to set the wallpaper that you choose. + --, ("M-", spawn "sxiv -r -q -t -o ~/wallpapers/*") + --, ("M-", spawn "/bin/ls ~/wallpapers | shuf -n 1 | xargs xwallpaper --stretch") + --, ("M-", spawn "feh --randomize --bg-fill ~/wallpapers/*") - -- Multimedia Keys - --, ("", spawn (myTerminal ++ "mocp --play")) - --, ("", spawn (myTerminal ++ "mocp --previous")) - --, ("", spawn (myTerminal ++ "mocp --next")) - --, ("", spawn "amixer set Master toggle") - --, ("", spawn "amixer set Master 5%- unmute") - --, ("", spawn "amixer set Master 5%+ unmute") - --, ("", spawn "firefox") - --, ("", safeSpawn "firefox" ["https://www.duckduckgo.com/"]) - --, ("", runOrRaise "thunderbird" (resource =? "thunderbird")) - --, ("", runOrRaise "qalculate-gtk" (resource =? "qalculate-gtk")) - --, ("", spawn "toggleeject") - --, ("", spawn "scrotd 0") - ] - -- The following lines are needed for named scratchpads. - where nonNSP = WSIs (return (\ws -> W.tag ws /= "NSP")) - nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "NSP")) + -- Multimedia Keys + --, ("", spawn (myTerminal ++ "mocp --play")) + --, ("", spawn (myTerminal ++ "mocp --previous")) + --, ("", spawn (myTerminal ++ "mocp --next")) + --, ("", spawn "amixer set Master toggle") + --, ("", spawn "amixer set Master 5%- unmute") + --, ("", spawn "amixer set Master 5%+ unmute") + --, ("", spawn "firefox") + --, ("", safeSpawn "firefox" ["https://www.duckduckgo.com/"]) + --, ("", runOrRaise "thunderbird" (resource =? "thunderbird")) + --, ("", runOrRaise "qalculate-gtk" (resource =? "qalculate-gtk")) + --, ("", spawn "toggleeject") + --, ("", spawn "scrotd 0") + ] + -- The following lines are needed for named scratchpads. + where nonNSP = WSIs (return (\ws -> W.tag ws /= "NSP")) + nonEmptyNonNSP = WSIs (return (\ws -> isJust (W.stack ws) && W.tag ws /= "NSP")) #+end_src ** Main #+begin_src haskell :tangle ./xmonad.hs - main :: IO () - main = do - -- Launching three instances of xmobar on their monitors. - -- xmproc0 <- spawnPipe "xmobar -x 0 $HOME/.config/xmobar/xmobarrc_desktop_qhd" - -- xmproc1 <- spawnPipe "xmobar -x 1 $HOME/.config/xmobar/xmobarrc_desktop_fhd" - xmproc0 <- spawnPipe "xmobar -x 0 $HOME/.config/xmobar/xmobarrc_labtop_fhd" - -- the xmonad, ya know...what the WM is named after! - xmonad $ ewmh def - { manageHook = ( isFullscreen --> doFullFloat ) <+> myManageHook <+> manageDocks - -- Run xmonad commands from command line with "xmonadctl command". Commands include: - -- shrink, expand, next-layout, default-layout, restart-wm, xterm, kill, refresh, run, - -- focus-up, focus-down, swap-up, swap-down, swap-master, sink, quit-wm. You can run - -- "xmonadctl 0" to generate full list of commands written to ~/.xsession-errors. - -- To compile xmonadctl: ghc -dynamic xmonadctl.hs - , handleEventHook = serverModeEventHookCmd - <+> serverModeEventHook - <+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn) - <+> docksEventHook - <+> fullscreenEventHook -- this does NOT work right if using multi-monitors! - , modMask = myModMask - , terminal = myTerminal - , startupHook = myStartupHook - , layoutHook = showWName' myShowWNameTheme $ myLayoutHook - , workspaces = myWorkspaces - , borderWidth = myBorderWidth - , normalBorderColor = myNormColor - , focusedBorderColor = myFocusColor - , logHook = dynamicLogWithPP $ namedScratchpadFilterOutWorkspacePP $ xmobarPP - -- the following variables beginning with 'pp' are settings for xmobar. - { ppOutput = \x -> hPutStrLn xmproc0 x -- xmobar on monitor 1 - -- >> hPutStrLn xmproc1 x -- xmobar on monitor 2 - -- >> hPutStrLn xmproc2 x -- xmobar on monitor 3 - , ppCurrent = xmobarColor "#FFFFFF" "" . wrap "●" "" -- Current workspace - , ppVisible = xmobarColor "#c0a79a" "" . wrap "♼" "" . clickable -- Visible but not current workspace - , ppHidden = xmobarColor "#c0a79a" "" . wrap "○" "" . clickable -- Hidden workspaces - , ppHiddenNoWindows = xmobarColor "#c792ea" "" . \s -> "" -- Hidden workspaces (no windows) - , ppTitle = xmobarColor "#b3afc2" "" . shorten 60 -- Title of active window - , ppSep = " | " -- Separator character - , ppUrgent = xmobarColor "#C45500" "" . wrap "!" "!" -- Urgent workspace - , ppExtras = [windowCount] -- # of windows current workspace - , ppOrder = \(ws:l:t:ex) -> [ws,l]++ex++[t] -- order of things in xmobar - } - } `additionalKeysP` myKeys +main :: IO () +main = do + -- Launching three instances of xmobar on their monitors. + -- xmproc0 <- spawnPipe "xmobar -x 0 $HOME/.config/xmobar/xmobarrc_desktop_qhd" + -- xmproc1 <- spawnPipe "xmobar -x 1 $HOME/.config/xmobar/xmobarrc_desktop_fhd" + xmproc0 <- spawnPipe "xmobar -x 0 $HOME/.config/xmobar/xmobarrc_labtop_fhd" + -- the xmonad, ya know...what the WM is named after! + xmonad $ ewmh def + { manageHook = ( isFullscreen --> doFullFloat ) <+> myManageHook <+> manageDocks + -- Run xmonad commands from command line with "xmonadctl command". Commands include: + -- shrink, expand, next-layout, default-layout, restart-wm, xterm, kill, refresh, run, + -- focus-up, focus-down, swap-up, swap-down, swap-master, sink, quit-wm. You can run + -- "xmonadctl 0" to generate full list of commands written to ~/.xsession-errors. + -- To compile xmonadctl: ghc -dynamic xmonadctl.hs + , handleEventHook = serverModeEventHookCmd + <+> serverModeEventHook + <+> serverModeEventHookF "XMONAD_PRINT" (io . putStrLn) + -- <+> fullscreenEventHook -- this does NOT work right if using multi-monitors! + , modMask = myModMask + , terminal = myTerminal + , startupHook = myStartupHook + , layoutHook = showWName' myShowWNameTheme $ myLayoutHook + , workspaces = myWorkspaces + , borderWidth = myBorderWidth + , normalBorderColor = myNormColor + , focusedBorderColor = myFocusColor + , logHook = dynamicLogWithPP $ xmobarPP + -- the following variables beginning with 'pp' are settings for xmobar. + { ppOutput = \x -> hPutStrLn xmproc0 x -- xmobar on monitor 1 + -- >> hPutStrLn xmproc1 x -- xmobar on monitor 2 + -- >> hPutStrLn xmproc2 x -- xmobar on monitor 3 + , ppCurrent = xmobarColor "#FFFFFF" "" . wrap "●" "" -- Current workspace + , ppVisible = xmobarColor "#c0a79a" "" . wrap "♼" "" . clickable -- Visible but not current workspace + , ppHidden = xmobarColor "#c0a79a" "" . wrap "○" "" . clickable -- Hidden workspaces + , ppHiddenNoWindows = xmobarColor "#c792ea" "" . \s -> "" -- Hidden workspaces (no windows) + , ppTitle = xmobarColor "#b3afc2" "" . shorten 60 -- Title of active window + , ppSep = " | " -- Separator character + , ppUrgent = xmobarColor "#C45500" "" . wrap "!" "!" -- Urgent workspace + , ppExtras = [windowCount] -- # of windows current workspace + , ppOrder = \(ws:l:t:ex) -> [ws,l]++ex++[t] -- order of things in xmobar + } + } `additionalKeysP` myKeys #+end_src