herbstluftwm/autostart

381 lines
14 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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