#!/usr/bin/env bash source ~/.config/herbstluftwm/common_config hc() { herbstclient "$@" } hc emit_hook reload xsetroot -solid '#5A8E3A' TERMINAL="alacritty" BROWSER="qutebrowser" # Autostart apps {{{ ## Start a terminal if [ $(command -v "${TERMINAL}") ] && [ ! $(pidof -x "${TERMINAL}") ] ; then "${TERMINAL}" & fi ## Start a web browser if [ $(command -v "${BROWSER}") ] && [ ! $(pidof -x "${BROWSER}") ] ; then "${BROWSER}" & fi ## Start a Mattermost if [ $(command -v "mattermost-desktop") ] && [ ! $(pidof -x "mattermost-desktop") ] ; then "mattermost-desktop" & fi ## Load correct keyboard configuration keyboard.sh # }}} ################### ### Keybindings ### ################### # remove all existing keybindings hc keyunbind --all # change var # Mod1: Alt_L # Mod4: Super_L Mod=Mod1 s=Shift c=Control a=Mod1 h=Mod4 # hl management hc keybind $Mod-Shift-q quit hc keybind $h-r reload hc keybind $Mod-x close # screen management hc keybind $Mod-Shift-y spawn zsh -c 'sleep 3; xset dpms force off' # turn off the screens hc keybind $Mod-Shift-x spawn ~/bin/veille.sh # screen locker hc keybind $h-F1 spawn ~/bin/ecran primary # Keep only the main screen output hc keybind $h-F2 spawn ~/bin/ecran leftof # Set second output left of the main screen hc keybind $h-F3 spawn ~/bin/ecran rightof # Set second output right of the main screen hc keybind $h-F4 spawn ~/bin/ecran primary_off # Disable primary screen hc keybind $h-F5 spawn ~/bin/ecran second # External display only (videos, games,…) hc keybind $h-F6 spawn ~/bin/ecran above # Set second output above of the main screen # basic movement in tiling and floating mode # focusing clients ## Manage arrows with Mod4 hc keybind $h-Left or , focus left , focus_edge right hc keybind $h-Down or , focus down , focus_edge up hc keybind $h-Up or , focus up , focus_edge down hc keybind $h-Right or , focus right , focus_edge left ## movement with bepo hc keybind $Mod-c or , focus left , focus_edge right hc keybind $Mod-t or , focus down , focus_edge up hc keybind $Mod-s or , focus up , focus_edge down hc keybind $Mod-r or , focus right , focus_edge left ## movement with azerty {{{ #hc keybind $Mod-h or , focus left , focus_edge right #hc keybind $Mod-j or , focus down , focus_edge up #hc keybind $Mod-k or , focus up , focus_edge down #hc keybind $Mod-l or , focus right , focus_edge left ## }}} # moving clients in tiling and floating mode ## Manage arrows with Mod4 hc keybind $h-Shift-Left or , shift left , shift_edge right hc keybind $h-Shift-Down or , shift down , shift_edge up hc keybind $h-Shift-Up or , shift up , shift_edge down hc keybind $h-Shift-Right or , shift right , shift_edge left ## moving with bepo hc keybind $Mod-Shift-c or , shift left , shift_edge right hc keybind $Mod-Shift-t or , shift down , shift_edge up hc keybind $Mod-Shift-s or , shift up , shift_edge down hc keybind $Mod-Shift-r or , shift right , shift_edge left ## moving with azerty {{{ #hc keybind $Mod-Shift-h or , shift left , shift_edge right #hc keybind $Mod-Shift-j or , shift down , shift_edge up #hc keybind $Mod-Shift-k or , shift up , shift_edge down #hc keybind $Mod-Shift-l or , shift right , shift_edge left ## }}} # splitting frames # create an empty frame at the specified direction ## space : down or up ## return : right or left hc keybind $Mod-space and , split bottom 0.5 , focus down hc keybind $Mod-Shift-space and , split top 0.5 , focus up hc keybind $Mod-Return and , split right 0.5 , focus right hc keybind $Mod-Shift-Return and , split left 0.5 , focus left # keep the focus in the current frame hc keybind $h-space split bottom 0.5 hc keybind $h-Shift-space split top 0.5 hc keybind $h-Return split right 0.5 hc keybind $h-Shift-Return split left 0.5 # let the current frame explode into subframes hc keybind $Mod-Control-space split explode # resizing frames and floating clients resizestep=0.02 ## arrows direction resizing with Mod4 hc keybind $h-Control-Left resize left +$resizestep hc keybind $h-Control-Down resize down +$resizestep hc keybind $h-Control-Up resize up +$resizestep hc keybind $h-Control-Right resize right +$resizestep ## resizing with bepo hc keybind $Mod-Control-c resize left +$resizestep hc keybind $Mod-Control-t resize down +$resizestep hc keybind $Mod-Control-s resize up +$resizestep hc keybind $Mod-Control-r resize right +$resizestep ## resizing with azerty {{{ #hc keybind $Mod-Control-h resize left +$resizestep #hc keybind $Mod-Control-j resize down +$resizestep #hc keybind $Mod-Control-k resize up +$resizestep #hc keybind $Mod-Control-l resize right +$resizestep ## }}} # tags #tag_names=( {1..9} ) #tag_keys=( {1..9} 0 ) # Bind key to tag_name #KEY:"TAG_NAME" tag_binds=( a:" >_ " u:" web " i:" msg " e:"office" b:" mul " eacute:" oth " ) hc silent attr tags.by-name.default && hc rename default " >_ " for i in "${tag_binds[@]}" ; do key="${i%%:*}" tag="${i#*:}" hc add "$tag" hc keybind "$Mod-$key" or . and , compare tags.focus.name = "$tag" , try use_previous . use "$tag" hc keybind "$Mod-Shift-$key" move "$tag" done # cycle through tags ## Only with arrows and default Mod #hc keybind $Mod-Right use_index +1 --skip-visible #hc keybind $Mod-Left use_index -1 --skip-visible hc keybind $Mod-apostrophe use_previous # layouting hc keybind $Mod-d remove hc keybind $Mod-Shift-s floating toggle hc keybind $Mod-f fullscreen toggle hc keybind $Mod-Shift-p pseudotile toggle hc keybind $Mod-Shift-f set_attr clients.focus.floating toggle # The following cycles through the available layouts within a frame, but skips # layouts, if the layout change wouldn't affect the actual window positions. # I.e. if there are two windows within a frame, the grid layout is skipped. hc keybind $Mod-period \ or , and . compare tags.focus.curframe_wcount = 2 \ . cycle_layout +1 vertical horizontal max vertical grid \ , cycle_layout +1 # mouse hc mouseunbind --all hc mousebind $Mod-Button1 move hc mousebind $Mod-Button2 zoom hc mousebind $Mod-Button3 resize # focus ## Mod4 shortcuts hc keybind $h-Tab cycle_monitor ## $Mod-u already use to move to web tag hc keybind $h-u jumpto urgent ## $Mod-c already use to change focus (to the left) hc keybind $h-c cycle ## Cycle between all visible windows and frames hc keybind $Mod-Tab cycle_all +1 hc keybind $Mod-Shift-Tab cycle_all -1 # apps hc keybind $Mod-BackSpace spawn ${TERMINAL:-xterm} # use your $TERMINAL with xterm as fallback hc keybind $Mod-dead_circumflex spawn ~/.dmenu # Open dmenu/rofi launcher hc keybind $Mod-p spawn ~/.dmenu # Open dmenu/rofi launcher hc keybind XF86HomePage spawn firefox-esr hc keybind XF86Mail spawn thunderbird hc keybind XF86Calculator spawn gnome-calculator hc keybind Print spawn screenshot # Screenshot tool hc keybind Shift-Print spawn screen.to.0x0 # Take and send screenshot to 0x0 service (URL in paste) hc keybind $Mod-v spawn vlc hc keybind $Mod-Escape spawn ~/bin/bepo_azerty.sh # Switch between bépo and azerty hc keybind $Mod-o spawn qb # Qutebrowser content parser hc keybind $Mod-q spawn qb # Qutebrowser content parser hc keybind $Mod-w spawn rofi-task.sh # Taskwarrior launcher hc keybind $Mod-agrave spawn ~/bin/rofi-pass # Password manager hc keybind $h-e spawn bemoji --type --clip --noline # Display emoji picker (1. try to type it, 2. add to clipboard, 3. without newline caracter) # for some unknown reasons, it fails on first call in vim,… # sound hc keybind XF86AudioRaiseVolume spawn pulsemixer --change-volume +5 hc keybind XF86AudioLowerVolume spawn pulsemixer --change-volume -5 hc keybind XF86AudioMute spawn pulsemixer --toggle-mute ## Rofi script to choose output sink hc keybind $h-XF86AudioMute spawn ~/bin/rofi-pulse-sink.sh ## See for Kodi actions/functions : ## https://kodi.wiki/view/List_of_built-in_functions#List_of_functions hc keybind XF86AudioPlay spawn ~/bin/multimedia.controller.sh --command toggle hc keybind $s-XF86AudioPlay spawn ~/bin/multimedia.controller.sh --command partymode hc keybind XF86AudioNext spawn ~/bin/multimedia.controller.sh --command next hc keybind XF86AudioPrev spawn ~/bin/multimedia.controller.sh --command previous hc keybind $s-XF86AudioNext spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $s-XF86AudioPrev spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $c-XF86AudioNext spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $c-XF86AudioPrev spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $h-XF86AudioNext spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $h-XF86AudioPrev spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $a-XF86AudioNext spawn ~/bin/multimedia.controller.sh --command rofi hc keybind $a-XF86AudioPrev spawn ~/bin/multimedia.controller.sh --command rofi # brightness hc keybind XF86MonBrightnessUp spawn light -A 10 hc keybind XF86MonBrightnessDown spawn light -U 10 ################### ### theme ### ################### hc attr theme.tiling.reset 1 hc attr theme.floating.reset 1 #hc set frame_border_active_color '#222222' hc set frame_border_active_color ${darkgrey} #hc set frame_border_normal_color '#101010' hc set frame_border_normal_color ${lightblack} #hc set frame_bg_active_color '#345F0C' hc set frame_bg_normal_color ${darkgrey} hc set frame_bg_active_color ${debianred} hc set frame_border_width 1 hc set always_show_frame 1 #hc set frame_bg_transparent 1 hc set frame_bg_transparent 0 hc set frame_transparent_width 5 hc set frame_gap 4 hc set window_border_normal_color ${darkgrey} hc set window_border_active_color ${debianred} hc attr theme.active.color ${debianred} hc attr theme.normal.color ${grey} hc attr theme.urgent.color orange hc attr theme.inner_width 1 hc attr theme.inner_color ${grey} hc attr theme.border_width 3 hc attr theme.floating.border_width 4 hc attr theme.floating.outer_width 1 hc attr theme.floating.outer_color black hc attr theme.active.inner_color ${debianred} hc attr theme.active.outer_color ${debianred} hc attr theme.background_color ${debianred} hc set window_gap 0 hc set frame_padding 0 hc set smart_window_surroundings off hc set smart_frame_surroundings on hc set mouse_recenter_gap 0 ################### ### Rules ### ################### hc unrule -F hc rule focus=on # normally focus new clients hc rule floatplacement=smart #hc rule focus=off # normally do not focus new clients hc rule windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY)' floating=on hc rule windowtype='_NET_WM_WINDOW_TYPE_DIALOG' focus=on hc rule windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off # Move splash windows to tag " oth " hc rule windowtype~'_NET_WM_WINDOW_TYPE_SPLASH' pseudotile=on tag=" oth " # Use xprop, xwinfo or wmctrl -l # To get informations (class,…) about X windows # tag: web or related hc rule class~'.irefox' tag=" web " hc rule class~'.irefox-esr' tag=" web " hc rule class=qutebrowser tag=" web " hc rule class=Midori tag=" oth " # tag : msg # Thunderbird hc rule class~'.*.hunderbird.*' tag=" msg " focus=on hc rule class~'.*.hunderbird.*' windowrole=Msgcompose focus=on hc rule class~'.*.hunderbird.*' windowrole=AlarmWindow tag=" msg " focus=off # OpenPGP passphrase hc rule class=Gcr-prompter tag=" msg " focus=on # Messaging clients hc rule class~'.ocket..hat.*' tag=" msg " focus=on hc rule class~'.elegram.*' tag=" msg " focus=on hc rule class~'.lement' tag=" msg " focus=on hc rule class~'.ignal' tag=" msg " focus=on hc rule class~'.iscord' tag=" msg " focus=on hc rule class~'.attermost.*' tag=" msg " focus=on # tag : office ## Default layout {{{ # | 50 | 50 | # | 50 | −−−| # | 50 | 50 | hc load "office" ' (split horizontal:0.450000:0 (clients vertical:0) (split vertical:0.550000:1 (clients vertical:0) (clients vertical:0))) ' ## }}} ## LibreOffice suite hc rule class~'.ibre.ffice.*' tag="office" index=00 focus=off pseudotile=off ## cloud sync clients hc rule class~'.wn.loud' tag="office" index=10 focus=on hc rule class~'.ext.loud' tag="office" index=10 focus=on ## Mumble client hc rule class~'.umble' tag="office" index=11 focus=off pseudotile=off hc rule title~'.umble' windowtype='_NET_WM_WINDOW_TYPE_DIALOG' tag="office" index=11 focus=on pseudotile=off # tag : mul ## Gimp now works in a single window ## so no longer needs a specific layout ## Gimp hc rule class=Gimp tag=" mul " pseudotile=on hc rule class=Gimp windowrole~'gimp-(image-window|toolbox|dock)' \ pseudotile=off ## Kodi hc rule class=Kodi tag=" mul " focus=on ## VLC hc rule class~'.lc' tag=" mul " focus=on ## Steam hc rule class~'.team' tag=" mul " hc rule class~'.teamwebhelper' tag=" mul " hc rule title=Steam tag=" mul " hc rule title="Sign in to Steam" tag=" mul " # tag : oth hc rule class=KeePass2 tag=" oth " hc rule class~'.ee.ass..' tag=" oth " hc set tree_style '╾│ ├└╼─┐' # unlock, just to be sure hc unlock # do multi monitor setup here, e.g.: # hc set_monitors 1280x1024+0+0 1280x1024+1280+0 # or simply: # hc detect_monitors # find the panel panel=~/.config/herbstluftwm/panel.sh [ -x "$panel" ] || panel=/etc/xdg/herbstluftwm/panel.sh for monitor in $(hc list_monitors | cut -d: -f1) ; do # start it on each monitor "$panel" "$monitor" & done