mirror of
https://github.com/SqrtMinusOne/dotfiles.git
synced 2025-12-10 19:23:03 +03:00
1063 lines
30 KiB
Org Mode
1063 lines
30 KiB
Org Mode
#+TITLE: Desktop
|
|
#+TODO: TODO(t) CHECK(s) | OFF(o)
|
|
#+PROPERTY: header-args :mkdirp yes
|
|
#+PROPERTY: header-args:conf-space :comments link
|
|
#+PROPERTY: header-args:conf-windows :comments link
|
|
#+PROPERTY: header-args:sh :tangle-mode (identity #o755) :comments link :shebang "#!/bin/sh"
|
|
#+PROPERTY: header-args:bash :tangle-mode (identity #o755) :comments link :shebang "#!/bin/bash"
|
|
|
|
My general desktop environment configuration.
|
|
|
|
Parts prefexed with [OFF] are not used, but kept for historic purposes. For some reason GitHub's org renderer ignores TODO status, hence such a prefix.
|
|
|
|
Most of the colors are from the Palenight theme. Colorcodes are taken from [[https://github.com/JonathanSpeek/palenight-iterm2][this repo]]:
|
|
|
|
| Color | Default | Lighter |
|
|
|---------+---------+---------|
|
|
| Black | #292d3e | #434758 |
|
|
| Red | #f07178 | #ff8b92 |
|
|
| Green | #c3e88d | #ddffa7 |
|
|
| Yellow | #ffcb6b | #ffe585 |
|
|
| Blue | #82aaff | #9cc4ff |
|
|
| Magenta | #c792ea | #e1acff |
|
|
| Cyan | #89ddff | #a3f7ff |
|
|
| White | #d0d0d0 | #ffffff |
|
|
|
|
* i3wm
|
|
:PROPERTIES:
|
|
:header-args+: :tangle ./.config/i3/config
|
|
:END:
|
|
|
|
[[https://i3wm.org/][i3wm]] is a manual tiling window manager, which is currently my window manager of choice. I've tried several alternatives, including [[https://xmonad.org/][xmonad]] & [[https://github.com/ch11ng/exwm][EXWM]], but i3 seems to fit my workflow best.
|
|
|
|
[[https://github.com/Airblader/i3][i3-gaps]] is a i3 fork with a few features like window gaps. I like to enable inner gaps when there is at least one container in a workspace.
|
|
|
|
References:
|
|
- [[https://i3wm.org/docs/][i3wm docs]]
|
|
- [[https://github.com/Airblader/i3/wiki][i3-gaps wiki]]
|
|
|
|
** General settings
|
|
#+begin_src conf-space
|
|
set $mod Mod4
|
|
font pango:monospace 10
|
|
|
|
# Use Mouse+$mod to drag floating windows to their wanted position
|
|
floating_modifier $mod
|
|
|
|
# Move cursor between monitors
|
|
mouse_warping output
|
|
|
|
# Apply XFCE Settings
|
|
exec xfsettingsd
|
|
exec xiccd
|
|
|
|
# Most needed keybindigs
|
|
# reload the configuration file
|
|
bindsym $mod+Shift+c reload
|
|
|
|
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
|
bindsym $mod+Shift+r restart
|
|
|
|
# exit i3 (logs you out of your X session)
|
|
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
|
|
#+end_src
|
|
** Managing windows
|
|
#+begin_src conf-space
|
|
# kill focused window
|
|
bindsym $mod+Shift+q kill
|
|
|
|
# change focus
|
|
bindsym $mod+h focus left
|
|
bindsym $mod+j focus down
|
|
bindsym $mod+k focus up
|
|
bindsym $mod+l focus right
|
|
|
|
# alternatively, you can use the cursor keys:
|
|
bindsym $mod+Left focus left
|
|
bindsym $mod+Down focus down
|
|
bindsym $mod+Up focus up
|
|
bindsym $mod+Right focus right
|
|
|
|
# move focused window
|
|
bindsym $mod+Shift+h move left
|
|
bindsym $mod+Shift+j move down
|
|
bindsym $mod+Shift+k move up
|
|
bindsym $mod+Shift+l move right
|
|
|
|
# alternatively, you can use the cursor keys:
|
|
bindsym $mod+Shift+Left move left
|
|
bindsym $mod+Shift+Down move down
|
|
bindsym $mod+Shift+Up move up
|
|
bindsym $mod+Shift+Right move right
|
|
|
|
# split in horizontal orientation
|
|
bindsym $mod+s split h
|
|
|
|
# split in vertical orientation
|
|
bindsym $mod+v split v
|
|
|
|
# enter fullscreen mode for the focused container
|
|
bindsym $mod+f fullscreen toggle
|
|
|
|
# change container layout (stacked, tabbed, toggle split)
|
|
bindsym $mod+w layout stacking
|
|
bindsym $mod+t layout tabbed
|
|
bindsym $mod+e layout toggle split
|
|
|
|
# toggle tiling / floating
|
|
bindsym $mod+Shift+f floating toggle
|
|
|
|
bindsym $mod+Tab move workspace to output right
|
|
bindsym $mod+q focus output right
|
|
|
|
# change focus between tiling / floating windows
|
|
# bindsym $mod+space focus mode_toggle
|
|
|
|
# focus the parent container
|
|
bindsym $mod+a focus parent
|
|
|
|
# focus the child container
|
|
bindsym $mod+Shift+A focus child
|
|
#+end_src
|
|
|
|
** Workspaces
|
|
#+begin_src conf-space
|
|
set $w1 "1 🚀"
|
|
set $w2 "2 🌍"
|
|
set $w3 "3 💬"
|
|
set $w4 "4 🛠️️"
|
|
set $w7 "7 🛰️"
|
|
set $w8 "8 📝"
|
|
set $w9 "9 🎵"
|
|
set $w10 "10 📦"
|
|
|
|
bindsym $mod+1 workspace $w1
|
|
bindsym $mod+2 workspace $w2
|
|
bindsym $mod+3 workspace $w3
|
|
bindsym $mod+4 workspace $w4
|
|
bindsym $mod+5 workspace 5
|
|
bindsym $mod+6 workspace 6
|
|
bindsym $mod+7 workspace $w7
|
|
bindsym $mod+8 workspace $w8
|
|
bindsym $mod+9 workspace $w9
|
|
bindsym $mod+0 workspace $w10
|
|
|
|
# move focused container to workspace
|
|
bindsym $mod+Shift+1 move container to workspace $w1
|
|
bindsym $mod+Shift+2 move container to workspace $w2
|
|
bindsym $mod+Shift+3 move container to workspace $w3
|
|
bindsym $mod+Shift+4 move container to workspace $w4
|
|
bindsym $mod+Shift+5 move container to workspace 5
|
|
bindsym $mod+Shift+6 move container to workspace 6
|
|
bindsym $mod+Shift+7 move container to workspace $w7
|
|
bindsym $mod+Shift+8 move container to workspace $w8
|
|
bindsym $mod+Shift+9 move container to workspace $w9
|
|
bindsym $mod+Shift+0 move container to workspace $w10
|
|
|
|
# Cycle workspaces
|
|
bindsym $mod+comma workspace prev
|
|
bindsym $mod+period workspace next
|
|
#+end_src
|
|
|
|
** Rules
|
|
Rules to automatically assign applications to workspaces and do other stuff, like enable floating.
|
|
|
|
Most apps can be distinguished by a WM class (you can get one with [[https://www.x.org/releases/X11R7.5/doc/man/man1/xprop.1.html][xprop]]), but in some cases it doesn't work, e.g. for terminal applications. In that case rules can be based on a window title, for instance.
|
|
|
|
However, watch out for the following: rule such as ~for_window [title="ncmpcpp.*"] move to workspace $w9~ will move *any* windows with a title, starting with =ncmpcpp= to workspace =$w9=, which, for instance, may move your browser there if you google "ncmpcpp".
|
|
|
|
#+begin_src conf-space
|
|
assign [class="Emacs"] $w1
|
|
assign [class="qutebrowser"] $w2
|
|
assign [class="firefox"] $w2
|
|
assign [class="VK"] $w3
|
|
assign [class="Slack"] $w3
|
|
assign [class="discord"] $w3
|
|
assign [class="TelegramDesktop"] $w3
|
|
assign [class="Postman"] $w4
|
|
assign [class="Chromium-browse"] $w4
|
|
assign [class="chromium"] $w4
|
|
assign [class="google-chrome"] $w4
|
|
assign [title="Vue Developer Tools"] $w4
|
|
assign [class="Google Play Music Desktop Player"] $w9
|
|
assign [class="jetbrains-datagrip"] $w4
|
|
assign [class="zoom"] $w7
|
|
assign [class="skype"] $w7
|
|
assign [class="Mailspring"] $w8
|
|
assign [class="Thunderbird"] $w8
|
|
assign [class="Joplin"] $w8
|
|
assign [class="keepassxc"] $w10
|
|
|
|
for_window [title="VirtScreen"] floating enable
|
|
|
|
for_window [title="ncmpcpp.*"] move to workspace $w9
|
|
for_window [title="newsboat.*"] move to workspace $w9
|
|
for_window [title=".*run_wego"] move to workspace $w9
|
|
for_window [class="cinnamon-settings*"] floating enable
|
|
for_window [title="Picture-in-Picture"] sticky enable
|
|
#+end_src
|
|
** Scratchpad
|
|
Scratch terminal, inspired by [[https://www.youtube.com/watch?v=q-l7DnDbiiU][this Luke Smith's video]].
|
|
*** Launch script
|
|
First of all, we have to distinguish scratchpad terminal from a normal one. To do that, one can create st with a required classname.
|
|
|
|
Then, it would be cool not to duplicate scratchpads, so the following script first looks for a window with a created classname. If it exists, the script just toggles the scratchpad visibilty. Otherwise, a new instance of a window is created.
|
|
#+begin_src bash :tangle ./bin/scripts/dropdown
|
|
CLASSNAME="dropdown_tmux"
|
|
COMMAND="st -n $CLASSNAME -e tmux new-session -s $CLASSNAME"
|
|
pid=$(xdotool search --classname "dropdown_tmux")
|
|
if [[ ! -z $pid ]]; then
|
|
i3-msg scratchpad show
|
|
else
|
|
setsid -f ${COMMAND}
|
|
fi
|
|
#+end_src
|
|
*** i3 config
|
|
#+begin_src conf-space
|
|
# Scratchpad
|
|
for_window [instance="dropdown_*"] floating enable
|
|
for_window [instance="dropdown_*"] move scratchpad
|
|
for_window [instance="dropdown_*"] sticky enable
|
|
for_window [instance="dropdown_*"] scratchpad show
|
|
for_window [instance="dropdown_*"] move position center
|
|
|
|
bindsym $mod+u exec ~/bin/scripts/dropdown
|
|
#+end_src
|
|
** Gaps & borders
|
|
The main reason to use i3-gaps
|
|
#+begin_src conf-space
|
|
# Borders
|
|
# for_window [class=".*"] border pixel 0
|
|
default_border pixel 3
|
|
hide_edge_borders both
|
|
|
|
# Gaps
|
|
set $default_inner 10
|
|
set $default_outer 0
|
|
|
|
gaps inner $default_inner
|
|
gaps outer $default_outer
|
|
|
|
smart_gaps on
|
|
#+end_src
|
|
*** Keybindings
|
|
#+begin_src conf-space
|
|
mode "inner gaps" {
|
|
bindsym plus gaps inner current plus 5
|
|
bindsym minus gaps inner current minus 5
|
|
bindsym Shift+plus gaps inner all plus 5
|
|
bindsym Shift+minus gaps inner all minus 5
|
|
bindsym 0 gaps inner current set 0
|
|
bindsym Shift+0 gaps inner all set 0
|
|
|
|
bindsym r gaps inner current set $default_inner
|
|
bindsym Shift+r gaps inner all set $default_inner
|
|
|
|
bindsym Return mode "default"
|
|
bindsym Escape mode "default"
|
|
}
|
|
|
|
mode "outer gaps" {
|
|
bindsym plus gaps outer current plus 5
|
|
bindsym minus gaps outer current minus 5
|
|
bindsym Shift+plus gaps outer all plus 5
|
|
bindsym Shift+minus gaps outer all minus 5
|
|
bindsym 0 gaps outer current set 0
|
|
bindsym Shift+0 gaps outer all set 0
|
|
|
|
bindsym r gaps outer current set $default_outer
|
|
bindsym Shift+r gaps outer all set $default_outer
|
|
|
|
bindsym Return mode "default"
|
|
bindsym Escape mode "default"
|
|
}
|
|
|
|
bindsym $mod+g mode "inner gaps"
|
|
bindsym $mod+Shift+g mode "outer gaps"
|
|
#+end_src
|
|
** Move & resize windows
|
|
More or less standard set of keybindings to move & resize floating windows.
|
|
|
|
Just be careful to always make a way to return from these new modes, otherwise you'd end up in a rather precarious position.
|
|
#+begin_src conf-space
|
|
# resize window (you can also use the mouse for that)
|
|
mode "resize" {
|
|
# These bindings trigger as soon as you enter the resize mode
|
|
|
|
bindsym h resize shrink width 10 px or 10 ppt
|
|
bindsym j resize grow height 10 px or 10 ppt
|
|
bindsym k resize shrink height 10 px or 10 ppt
|
|
bindsym l resize grow width 10 px or 10 ppt
|
|
|
|
bindsym Shift+h resize shrink width 100 px or 100 ppt
|
|
bindsym Shift+j resize grow height 100 px or 100 ppt
|
|
bindsym Shift+k resize shrink height 100 px or 100 ppt
|
|
bindsym Shift+l resize grow width 100 px or 100 ppt
|
|
|
|
# same bindings, but for the arrow keys
|
|
bindsym Left resize shrink width 10 px or 10 ppt
|
|
bindsym Down resize grow height 10 px or 10 ppt
|
|
bindsym Up resize shrink height 10 px or 10 ppt
|
|
bindsym Right resize grow width 10 px or 10 ppt
|
|
|
|
bindsym Shift+Left resize shrink width 100 px or 100 ppt
|
|
bindsym Shift+Down resize grow height 100 px or 100 ppt
|
|
bindsym Shift+Up resize shrink height 100 px or 100 ppt
|
|
bindsym Shift+Right resize grow width 100 px or 100 ppt
|
|
|
|
# back to normal: Enter or Escape
|
|
bindsym Return mode "default"
|
|
bindsym Escape mode "default"
|
|
}
|
|
|
|
bindsym $mod+r mode "resize"
|
|
|
|
mode "move" {
|
|
bindsym $mod+Tab focus right
|
|
|
|
bindsym Left move left
|
|
bindsym Down move down
|
|
bindsym Up move up
|
|
bindsym Right move right
|
|
|
|
bindsym h move left
|
|
bindsym j move down
|
|
bindsym k move up
|
|
bindsym l move right
|
|
|
|
# back to normal: Enter or Escape
|
|
bindsym Return mode "default"
|
|
bindsym Escape mode "default"
|
|
}
|
|
|
|
bindsym $mod+m mode "move" focus floating
|
|
#+end_src
|
|
** OFF [OFF] Intergration with dmenu
|
|
[[https://tools.suckless.org/dmenu/][dmenu]] is a dynamic menu program for X. I've opted out of using in favour of rofi, but here is a relevant bit of config.
|
|
|
|
Scripts are located in the =bin/scripts= folder.
|
|
#+begin_src conf-space :tangle no
|
|
# dmenu
|
|
bindsym $mod+d exec i3-dmenu-desktop --dmenu="dmenu -l 10"
|
|
bindsym $mod+apostrophe mode "dmenu"
|
|
|
|
mode "dmenu" {
|
|
bindsym d exec i3-dmenu-desktop --dmenu="dmenu -l 10"; mode default
|
|
bindsym p exec dmenu_run -l 10; mode default
|
|
bindsym m exec dmenu-man; mode default
|
|
bindsym b exec dmenu-buku; mode default
|
|
bindsym f exec dmenu-explore; mode default
|
|
bindsym t exec dmenu-tmuxp; mode default
|
|
bindsym Escape mode "default"
|
|
}
|
|
|
|
bindsym $mod+b exec --no-startup-id dmenu-buku
|
|
#+end_src
|
|
** Integration with rofi
|
|
Keybindings to launch [[https://github.com/davatorium/rofi][rofi]]. For more detail, look the [[*Rofi]] section.
|
|
#+begin_src conf-space
|
|
bindsym $mod+d exec "rofi -modi 'drun,run' -show drun"
|
|
bindsym $mod+b exec --no-startup-id rofi-buku-mine
|
|
|
|
bindsym $mod+apostrophe mode "rofi"
|
|
|
|
mode "rofi" {
|
|
bindsym d exec "rofi -modi 'drun,run' -show drun"
|
|
bindsym m exec rofi-man; mode default
|
|
bindsym b exec rofi-buku-mine; mode default
|
|
bindsym k exec rofi-keepassxc -d ~/MEGAsync/Passwords.kdbx; mode default
|
|
bindsym Escape mode "default"
|
|
}
|
|
#+end_src
|
|
** Launching apps & misc keybindings
|
|
I prefer to use a separate mode to launch most of my apps, with some exceptions.
|
|
*** Apps
|
|
#+begin_src conf-space
|
|
# Launch apps
|
|
# start a terminal at workspace 1
|
|
bindsym $mod+Return exec "i3-msg 'workspace 1 🚀; exec st'"
|
|
|
|
bindsym $mod+p exec "copyq menu"
|
|
bindsym $mod+Shift+x exec "i3lock -f -i /home/pavel/Pictures/lock-wallpaper-2-1.png"
|
|
|
|
bindsym $mod+semicolon mode "apps"
|
|
|
|
mode "apps" {
|
|
bindsym Escape mode "default"
|
|
bindsym b exec firefox; mode default
|
|
bindsym v exec vk-messenger; mode default
|
|
bindsym s exec slack; mode default;
|
|
bindsym m exec "st -e ncmpcpp"; mode default
|
|
bindsym c exec "copyq toggle"; mode default
|
|
bindsym k exec "keepassxc"; mode default
|
|
# bindsym e exec mailspring; mode default
|
|
bindsym a exec "bash /home/pavel/bin/emacs.sh"; mode default
|
|
bindsym n exec "st -e newsboat"; mode default
|
|
bindsym w exec "st /home/pavel/bin/scripts/run_wego"; mode default
|
|
# bindsym a exec emacsclient -c; mode default
|
|
# bindsym Shift+a exec emacs; mode default
|
|
}
|
|
#+end_src
|
|
*** Media controls & brightness
|
|
#+begin_src conf-space
|
|
# Pulse Audio controls
|
|
bindsym XF86AudioRaiseVolume exec --no-startup-id "pactl set-sink-volume @DEFAULT_SINK@ +5%"
|
|
bindsym XF86AudioLowerVolume exec --no-startup-id "pactl set-sink-volume @DEFAULT_SINK@ -5%"
|
|
bindsym XF86AudioMute exec --no-startup-id "pactl set-sink-mute @DEFAULT_SINK@ toggle"
|
|
|
|
# Media player controls
|
|
bindsym XF86AudioPlay exec mpc toggle
|
|
bindsym XF86AudioPause exec mpc pause
|
|
bindsym XF86AudioNext exec mpc next
|
|
bindsym XF86AudioPrev exec mpc prev
|
|
|
|
# Screen brightness
|
|
bindsym XF86MonBrightnessUp exec xbacklight -inc 5
|
|
bindsym XF86MonBrightnessDown exec xbacklight -dec 5
|
|
|
|
#+end_src
|
|
*** Screenshots
|
|
#+begin_src conf-space
|
|
# Screenshots
|
|
bindsym --release Print exec "flameshot gui"
|
|
bindsym --release Shift+Print exec "xfce4-screenshooter"
|
|
#+end_src
|
|
** Colors
|
|
Application of the palenight theme to the WM.
|
|
#+begin_src conf-space
|
|
# Colors
|
|
set $bg-color #292d3e
|
|
set $active-color #82aaff
|
|
set $inactive-bg-color #434758
|
|
set $text-color #f3f4f5
|
|
set $inactive-text-color #aaaaaa
|
|
set $urgent-bg-color #f07178
|
|
set $urgent-text-color #000000
|
|
|
|
# window colors
|
|
# border background text indicator child border
|
|
client.focused $active-color $bg-color $text-color $bg-color $active-color
|
|
client.unfocused $bg-color $inactive-bg-color $inactive-text-color $bg-color $bg-color
|
|
client.focused_inactive $active-color $inactive-bg-color $inactive-text-color $bg-color $bg-color
|
|
client.urgent $urgent-bg-color $urgent-bg-color $urgent-text-color $bg-color $urgent-bg-color
|
|
#+end_src
|
|
** OFF [OFF] i3blocks
|
|
I've opted out of i3bar & [[https://github.com/vivien/i3blocks][i3blocks]] for [[https://github.com/polybar/polybar][polybar]]
|
|
#+begin_src conf-space :tangle no
|
|
bar {
|
|
status_command i3blocks -c ~/.config/i3/i3blocks.conf
|
|
i3bar_command i3bar
|
|
font pango:monospace 12
|
|
output HDMI-A-0
|
|
tray_output none
|
|
colors {
|
|
background $bg-color
|
|
separator #757575
|
|
# border background text
|
|
focused_workspace $bg-color $bg-color $text-color
|
|
inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
|
|
urgent_workspace $urgent-bg-color $urgent-bg-color $urgent-text-color
|
|
}
|
|
}
|
|
|
|
bar {
|
|
status_command i3blocks -c ~/.config/i3/i3blocks.conf
|
|
i3bar_command i3bar
|
|
font pango:monospace 10
|
|
output DVI-D-0
|
|
colors {
|
|
background $bg-color
|
|
separator #757575
|
|
# border background text
|
|
focused_workspace $bg-color $bg-color $text-color
|
|
inactive_workspace $inactive-bg-color $inactive-bg-color $inactive-text-color
|
|
urgent_workspace $urgent-bg-color $urgent-bg-color $urgent-text-color
|
|
}
|
|
}
|
|
#+end_src
|
|
** Keyboard Layout
|
|
A script to set Russian-English keyboard layout:
|
|
#+begin_src bash :tangle ./bin/scripts/set_layout
|
|
setxkbmap -layout us,ru
|
|
setxkbmap -model pc105 -option 'grp:win_space_toggle' -option 'grp:alt_shift_toggle'
|
|
#+end_src
|
|
|
|
A script to toggle the layout
|
|
#+begin_src bash :tangle ./bin/scripts/toggle_layout
|
|
if setxkbmap -query | grep -q us,ru; then
|
|
setxkbmap -layout us
|
|
setxkbmap -option
|
|
else
|
|
setxkbmap -layout us,ru
|
|
setxkbmap -model pc105 -option 'grp:win_space_toggle' -option 'grp:alt_shift_toggle'
|
|
fi
|
|
#+end_src
|
|
|
|
And the relevant i3 settings:
|
|
#+begin_src conf-space
|
|
# Layout
|
|
exec_always --no-startup-id set_layout
|
|
bindsym $mod+slash exec toggle_layout
|
|
#+end_src
|
|
** Autostart
|
|
#+begin_src conf-space
|
|
# Polybar
|
|
exec_always --no-startup-id "bash /home/pavel/bin/polybar.sh"
|
|
|
|
# PulseEffects
|
|
exec --no-startup-id pulseeffects --gapplication-service
|
|
|
|
# Sudo
|
|
exec --no-startup-id /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
|
|
|
|
# Wallpaper
|
|
exec_always "feh --bg-fill ~/Pictures/wallpaper-2.jpg"
|
|
|
|
# Picom
|
|
exec picom
|
|
|
|
# Keynav
|
|
exec keynav
|
|
|
|
# Applets
|
|
exec --no-startup-id /usr/bin/nm-applet
|
|
exec --no-startup-id /usr/bin/blueman-applet
|
|
|
|
# MPD
|
|
exec --no-startup-id mpd
|
|
|
|
# Stuff
|
|
exec aw-qt
|
|
exec "vnstatd -d"
|
|
exec dunst
|
|
exec kde-connect-indicator
|
|
exec copyq
|
|
exec "xmodmap ~/.Xmodmap"
|
|
exec "bash ~/bin/autostart.sh"
|
|
#+end_src
|
|
* Polybar
|
|
:PROPERTIES:
|
|
:header-args+: :tangle ./.config/polybar/config
|
|
:END:
|
|
|
|
[[https://github.com/polybar/polybar][Polybar]] is a nice looking, WM-agnostic statusbar program.
|
|
|
|
I switched to polybar because I wanted to try out some WMs other that i3, but decided to stick with i3 for now.
|
|
|
|
References:
|
|
- [[https://github.com/polybar/polybar/wiki][polybar docs]]
|
|
** Launching
|
|
The script below allows me to:
|
|
- have different blocks on my two different-sized monitors and my laptop;
|
|
- have different settings on my desktop PC and laptop;
|
|
|
|
#+begin_src bash :tangle ./bin/polybar.sh
|
|
hostname=$(hostname)
|
|
# Settings varying on the hostname
|
|
if [ "$hostname" = "pntk" ]; then
|
|
TRAY_MONITOR="eDP1"
|
|
export WLAN_INTERFACE="wlp3s0"
|
|
else
|
|
TRAY_MONITOR="HDMI-A-0"
|
|
export WLAN_INTERFACE="wlp35s0f3u2"
|
|
fi
|
|
|
|
# Setting varying on the monitor
|
|
declare -A FONT_SIZES=(
|
|
["eDP1"]="13"
|
|
["DVI-D-0"]="11"
|
|
["HDMI-A-0"]="13"
|
|
)
|
|
declare -A EMOJI_SCALE=(
|
|
["eDP1"]="9"
|
|
["DVI-D-0"]="10"
|
|
["HDMI-A-0"]="10"
|
|
)
|
|
declare -A BAR_HEIGHT=(
|
|
["eDP1"]="29"
|
|
["DVI-D-0"]="23"
|
|
["HDMI-A-0"]="29"
|
|
)
|
|
declare -A BLOCKS=(
|
|
["DVI-D-0"]="pulseaudio SEP cpu ram-memory swap-memory SEP network ipstack-vpn SEP xkeyboard SEP weather SEP sun aw-afk date TSEP"
|
|
["HDMI-A-0"]="pulseaudio mpd SEP cpu ram-memory swap-memory SEP network ipstack-vpn SEP xkeyboard SEP weather SEP sun aw-afk date TSEP"
|
|
["eDP1"]="pulseaudio mpd SEP cpu ram-memory swap-memory SEP network ipstack-vpn SEP xkeyboard SEP battery SEP sun aw-afk date TSEP"
|
|
)
|
|
|
|
# Geolocation for some modules
|
|
export LOC="SPB"
|
|
|
|
pkill polybar
|
|
for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do
|
|
export MONITOR=$m
|
|
if [ "$MONITOR" = "$TRAY_MONITOR" ]; then
|
|
export TRAY="right"
|
|
else
|
|
export TRAY="none"
|
|
fi
|
|
SIZE=${FONT_SIZES[$MONITOR]}
|
|
SCALE=${EMOJI_SCALE[$MONITOR]}
|
|
if [[ -z "$SCALE" ]]; then
|
|
continue
|
|
fi
|
|
export FONT0="pango:monospace:size=$SIZE;1"
|
|
export FONT1="NotoEmoji:scale=$SCALE:antialias=false;1"
|
|
export FONT2="fontawesome:pixelsize=$SIZE;1"
|
|
export FONT3="JetBrains Mono Nerd Font:monospace:size=$SIZE;1"
|
|
export HEIGHT=${BAR_HEIGHT[$MONITOR]}
|
|
export RIGHT_BLOCKS=${BLOCKS[$MONITOR]}
|
|
polybar mybar &
|
|
done
|
|
#+end_src
|
|
** General settings
|
|
*** Colors
|
|
#+begin_src conf-windows
|
|
[colors]
|
|
; Palenight colorscheme https://github.com/JonathanSpeek/palenight-iterm2
|
|
black = #292d3e
|
|
red = #f07178
|
|
green = #c3e88d
|
|
yellow = #ffcb6b
|
|
blue = #82aaff
|
|
magenta = #c792ea
|
|
cyan = #89ddff
|
|
white = #d0d0d0
|
|
|
|
black-lighter = #434758
|
|
red-lighter = #ff8b92
|
|
green-lighter = #ddffa7
|
|
yellow-lighter = #ffe585
|
|
blue-lighter = #9cc4ff
|
|
magenta-lighter = #9cc4ff
|
|
cyan-lighter = #9cc4ff
|
|
white-lighter = ffffff
|
|
|
|
background = ${colors.black}
|
|
; background = #ee292d3e
|
|
foreground = ${colors.white}
|
|
#+end_src
|
|
*** Bar config
|
|
#+begin_src conf-windows
|
|
[bar/mybar]
|
|
monitor = ${env:MONITOR:}
|
|
width = 100%
|
|
height = ${env:HEIGHT:27}
|
|
offset-x = 0
|
|
offset-y = 0
|
|
radius = 0.0
|
|
fixed-center = false
|
|
bottom=true
|
|
|
|
background = ${colors.background}
|
|
foreground = ${colors.foreground}
|
|
|
|
line-size = 3
|
|
line-color = #f00
|
|
|
|
padding-left = 0
|
|
padding-right = 0
|
|
|
|
module-margin-left = 1
|
|
module-margin-right = 1
|
|
|
|
font-0 = ${env:FONT0:pango:monospace:size=10;1}
|
|
font-1 = ${env:FONT1:NotoEmoji:scale=10:antialias=false;0}
|
|
font-2 = ${env:FONT2:fontawesome:pixelsize=10;1}
|
|
font-3 = ${env:FONT3:JetBrains Mono Nerd Font:monospace:size=10;1}
|
|
|
|
modules-left = i3
|
|
; modules-center = test
|
|
modules-right = ${env:RIGHT_BLOCKS}
|
|
|
|
tray-position = ${env:TRAY:right}
|
|
tray-padding = 0
|
|
tray-maxsize = 16
|
|
;tray-background = #0063ff
|
|
|
|
wm-restack = i3
|
|
; override-redirect = true
|
|
|
|
scroll-up = i3wm-wsnext
|
|
scroll-down = i3wm-wsprev
|
|
|
|
; cursor-click = pointer
|
|
; cursor-scroll = ns-resize
|
|
|
|
[settings]
|
|
screenchange-reload = true
|
|
;compositing-background = xor
|
|
;compositing-background = screen
|
|
;compositing-foreground = source
|
|
;compositing-border = over
|
|
;pseudo-transparency = false
|
|
|
|
[global/wm]
|
|
margin-top = 0
|
|
margin-bottom = 0
|
|
#+end_src
|
|
** Modules
|
|
*** ipstack-vpn
|
|
A module to get a country of the current IP and openvpn status. Uses [[https://ipstack.com/][ipstack]] API.
|
|
|
|
#+begin_src bash :tangle ./bin/polybar/ipstack-vpn.sh
|
|
ip=$(dig +short +timeout=1 myip.opendns.com @resolver1.opendns.com 2> /dev/null)
|
|
API_KEY="$(cat ~/secrets/ipstack-api-key)"
|
|
if [[ -z $ip || $ip == *"timed out"* ]]; then
|
|
echo "%{u#f07178}%{+u} ?? %{u-}"
|
|
exit
|
|
fi
|
|
ip_info=$(curl -s http://api.ipstack.com/${ip}?access_key=${API_KEY})
|
|
# emoji=$(echo $ip_info | jq -r '.location.country_flag_emoji')
|
|
code=$(echo $ip_info | jq -r '.country_code')
|
|
vpn=$(pgrep -a openvpn$ | head -n 1 | awk '{print $NF }' | cut -d '.' -f 1)
|
|
|
|
if [ -n "$vpn" ]; then
|
|
echo "%{u#9cc4ff}%{+u} $code %{u-}"
|
|
else
|
|
echo "%{u#f07178}%{+u} $code %{u-}"
|
|
fi
|
|
#+end_src
|
|
|
|
#+begin_src conf-windows
|
|
[module/ipstack-vpn]
|
|
type = custom/script
|
|
exec = /home/pavel/bin/polybar/ipstack-vpn.sh
|
|
interval = 1200
|
|
#+end_src
|
|
*** weather
|
|
Gets current weather from [[http://wttr.in/][wttr.in]]
|
|
#+begin_src bash :tangle ./bin/polybar/weather.sh
|
|
bar_format="${BAR_FORMAT:-"%t"}"
|
|
location="${LOCATION:-"Saint-Petersburg"}"
|
|
format_1=${FORMAT_1:-"qF"}
|
|
format_2=${FORMAT_1:-"format=v2n"}
|
|
|
|
bar_weather=$(curl -s wttr.in/${location}?format=${bar_format} || echo "??")
|
|
if [ -z "$bar_weather" ]; then
|
|
exit 1
|
|
elif [[ "$bar_weather" == *"Unknown"* || "$bar_weather" == *"Sorry"* || "$bar_weather" == *"Bad Gateway"* ]]; then
|
|
echo "??"
|
|
exit 1
|
|
else
|
|
echo ${bar_weather}
|
|
fi
|
|
#+end_src
|
|
|
|
#+begin_src conf-windows
|
|
[module/weather]
|
|
type = custom/script
|
|
exec = /home/pavel/bin/polybar/weather.sh
|
|
format-underline = ${colors.red}
|
|
interval = 1200
|
|
#+end_src
|
|
*** aw-afk
|
|
Prints out a current uptime and non-AFK time from [[https://github.com/ActivityWatch][ActivityWatch]] server
|
|
|
|
| Type | Note |
|
|
|------+---------------------------|
|
|
| TODO | Fix crash on uptime > 99h |
|
|
|
|
#+begin_src bash :tangle ./bin/polybar/aw_afk.sh
|
|
afk_event=$(curl -s -X GET "http://localhost:5600/api/0/buckets/aw-watcher-afk_$(hostname)/events?limit=1" -H "accept: application/json")
|
|
status=$(echo ${afk_event} | jq -r '.[0].data.status')
|
|
afk_time=$(echo "${afk_event}" | jq -r '.[0].duration' | xargs -I ! date -u -d @! +"%H:%M")
|
|
|
|
uptime=$(datediff "$(uptime -s | xargs -I ! date -d ! -Iseconds)" "$(date -Iseconds)" -f '%H:%M' | xargs -I ! date -d ! +"%H:%M")
|
|
res="${afk_time} / ${uptime}"
|
|
if [[ $status == 'afk' ]]; then
|
|
echo "%{u#f07178}%{+u} [AFK] $res %{u-}"
|
|
else
|
|
echo "%{u#82aaff}%{+u} $res %{u-}"
|
|
fi
|
|
#+end_src
|
|
|
|
#+begin_src conf-windows
|
|
[module/aw-afk]
|
|
type = custom/script
|
|
exec = /home/pavel/bin/polybar/aw_afk.sh
|
|
interval = 60
|
|
#+end_src
|
|
*** sun
|
|
Prints out the time of sunrise/sunset. Uses [[https://github.com/risacher/sunwait][sunwait]]
|
|
|
|
#+begin_src bash :tangle ./bin/polybar/sun.sh
|
|
declare -A LAT_DATA=(
|
|
["TMN"]="57.15N"
|
|
["SPB"]="59.9375N"
|
|
)
|
|
declare -A LON_DATA=(
|
|
["TMN"]="65.533333E"
|
|
["SPB"]="30.308611E"
|
|
)
|
|
if [ -z "$LOC" ]; then
|
|
echo "LOC?"
|
|
exit -1
|
|
fi
|
|
LAT=${LAT_DATA[$LOC]}
|
|
LON=${LON_DATA[$LOC]}
|
|
|
|
time=$(sunwait poll daylight rise ${LAT} $LON)
|
|
|
|
if [[ ${time} == 'DAY' ]]; then
|
|
sunset=$(sunwait list daylight set ${LAT} ${LON})
|
|
echo "%{u#ffcb6b}%{+u} $sunset %{u-}"
|
|
else
|
|
sunrise=$(sunwait list daylight rise ${LAT} ${LON})
|
|
echo "%{u#f07178}%{+u} $sunrise %{u-}"
|
|
fi
|
|
#+end_src
|
|
|
|
#+begin_src conf-windows
|
|
[module/sun]
|
|
type = custom/script
|
|
exec = /home/pavel/bin/polybar/sun.sh
|
|
interval = 60
|
|
#+end_src
|
|
*** SEP
|
|
A simple separator
|
|
#+begin_src conf-windows
|
|
[module/SEP]
|
|
type = custom/text
|
|
content = "|"
|
|
content-foreground = ${colors.magenta}
|
|
content-padding = 0
|
|
content-margin = 0
|
|
interval = 0
|
|
#+end_src
|
|
*** TSEP
|
|
A separator, which appears only if monitor is set to have a tray in the launch script
|
|
#+begin_src bash :tangle ./bin/polybar/tray-sep.sh
|
|
if [ ! -z "$TRAY" ] && [ "$TRAY" != "none" ]; then
|
|
echo "| "
|
|
fi
|
|
#+end_src
|
|
|
|
#+begin_src conf-windows
|
|
[module/TSEP]
|
|
type = custom/script
|
|
exec = /home/pavel/bin/polybar/tray-sep.sh
|
|
format-foreground = ${colors.magenta}
|
|
interval = 0
|
|
#+end_src
|
|
|
|
*** i3
|
|
Show i3wm workspaces
|
|
#+begin_src conf-windows
|
|
[module/i3]
|
|
type = internal/i3
|
|
format = <label-state> <label-mode>
|
|
index-sort = true
|
|
wrapping-scroll = false
|
|
|
|
; Only show workspaces on the same output as the bar
|
|
pin-workspaces = true
|
|
|
|
label-mode-padding = 1
|
|
label-mode-foreground = #000
|
|
label-mode-background = ${colors.blue}
|
|
|
|
; focused = Active workspace on focused monitor
|
|
label-focused = %name%
|
|
; label-focused-background = ${colors.background-alt}
|
|
label-focused-underline= ${colors.blue}
|
|
label-focused-padding = 1
|
|
|
|
; unfocused = Inactive workspace on any monitor
|
|
label-unfocused = %name%
|
|
label-unfocused-padding = 1
|
|
|
|
; visible = Active workspace on unfocused monitor
|
|
label-visible = %name%
|
|
; label-visible-background = ${self.label-focused-background}
|
|
label-visible-underline = ${self.label-focused-underline}
|
|
label-visible-padding = ${self.label-focused-padding}
|
|
|
|
; urgent = Workspace with urgency hint set
|
|
label-urgent = %name%
|
|
label-urgent-background = ${colors.red}
|
|
label-urgent-foreground = ${colors.black}
|
|
label-urgent-padding = 1
|
|
#+end_src
|
|
|
|
*** xkeyboard
|
|
Current keyboard layout
|
|
#+begin_src conf-windows
|
|
[module/xkeyboard]
|
|
type = internal/xkeyboard
|
|
format = <label-layout>
|
|
|
|
format-underline = ${colors.magenta}
|
|
label-layout = %icon%
|
|
layout-icon-0 = ru;RU
|
|
layout-icon-1 = us;US
|
|
#+end_src
|
|
|
|
*** mpd
|
|
[[https://www.musicpd.org/][Music Player Daemon]] status
|
|
#+begin_src conf-windows
|
|
[module/mpd]
|
|
type = internal/mpd
|
|
|
|
format-playing = <toggle> <label-time> <label-song>
|
|
format-paused = <toggle> <label-time> <label-song>
|
|
format-stopped =
|
|
label-song = [%album-artist%] %title%
|
|
label-time = %elapsed%/%total%
|
|
|
|
label-song-maxlen = 30
|
|
label-song-ellipsis = true
|
|
|
|
format-playing-underline = ${colors.yellow}
|
|
format-paused-underline = ${colors.yellow}
|
|
format-stopped-underline = ${colors.yellow}
|
|
|
|
label-separator = 0
|
|
separator-foreground = ${colors.red}
|
|
|
|
icon-pause =
|
|
icon-play =
|
|
icon-stop =
|
|
icon-prev = 1
|
|
icon-next = 2
|
|
#+end_src
|
|
|
|
*** pulseaudio
|
|
PulseAudio status
|
|
#+begin_src conf-windows
|
|
[module/pulseaudio]
|
|
type = internal/pulseaudio
|
|
use-ui-max = true
|
|
|
|
bar-volume-width = 7
|
|
bar-volume-foreground-0 = ${colors.white}
|
|
bar-volume-foreground-1 = ${colors.yellow}
|
|
bar-volume-foreground-2 = ${colors.yellow}
|
|
bar-volume-foreground-3 = ${colors.blue}
|
|
bar-volume-foreground-4 = ${colors.blue}
|
|
bar-volume-foreground-5 = ${colors.green}
|
|
bar-volume-foreground-6 = ${colors.green}
|
|
bar-volume-gradient = false
|
|
bar-volume-indicator = |
|
|
bar-volume-indicator-font = 2
|
|
bar-volume-fill = ─
|
|
bar-volume-fill-font = 2
|
|
bar-volume-empty = ─
|
|
bar-volume-empty-font = 2
|
|
bar-volume-empty-foreground = ${colors.white-lighter}
|
|
|
|
format-volume = ♪ <bar-volume> <label-volume>
|
|
label-volume = %percentage%%
|
|
|
|
format-mute = ♪ <label-muted>
|
|
label-muted = MUTE
|
|
|
|
format-volume-underline = ${colors.white}
|
|
format-muted-underline = ${colors.black-lighter}
|
|
#+end_src
|
|
|
|
*** cpu
|
|
CPU usage
|
|
#+begin_src conf-windows
|
|
[module/cpu]
|
|
type = internal/cpu
|
|
format = <label>
|
|
label = %percentage%%
|
|
format-underline = ${colors.green-lighter}
|
|
#+end_src
|
|
|
|
*** ram-memory
|
|
RAM usage
|
|
#+begin_src conf-windows
|
|
[module/ram-memory]
|
|
type = internal/memory
|
|
interval = 10
|
|
|
|
ramp-used-0 = ▁
|
|
ramp-used-1 = ▂
|
|
ramp-used-2 = ▃
|
|
ramp-used-3 = ▄
|
|
ramp-used-4 = ▅
|
|
ramp-used-5 = ▆
|
|
ramp-used-6 = ▇
|
|
ramp-used-7 = █
|
|
|
|
format = <label>
|
|
label=%gb_used:.1f%
|
|
|
|
format-underline = ${colors.blue}
|
|
#+end_src
|
|
|
|
*** swap-memory
|
|
Swap usage
|
|
#+begin_src conf-windows
|
|
[module/swap-memory]
|
|
type = internal/memory
|
|
interval = 10
|
|
|
|
label= %gb_swap_used:.1f%
|
|
format-underline = ${colors.yellow}
|
|
#+end_src
|
|
|
|
*** network
|
|
Upload/download speed
|
|
#+begin_src conf-windows
|
|
[module/network]
|
|
type = internal/network
|
|
interval = 1
|
|
|
|
interface = ${env:WLAN_INTERFACE}
|
|
|
|
; format-connected = [<ramp-signal>] <label-connected>
|
|
|
|
label-connected = ↓ %downspeed% ↑ %upspeed%
|
|
label-disconnected = X
|
|
|
|
format-connected-underline = ${colors.green}
|
|
format-disconnected-underline = ${colors.red}
|
|
|
|
ramp-signal-0 = 0
|
|
ramp-signal-1 = 1
|
|
ramp-signal-2 = 2
|
|
ramp-signal-3 = 3
|
|
ramp-signal-4 = 4
|
|
ramp-signal-5 = 5
|
|
#+end_src
|
|
|
|
*** date
|
|
Current date
|
|
#+begin_src conf-windows
|
|
[module/date]
|
|
type = internal/date
|
|
interval = 5
|
|
|
|
date =
|
|
date-alt = "%Y-%m-%d"
|
|
|
|
time = %H:%M
|
|
time-alt = %H:%M:%S
|
|
|
|
format-underline = ${colors.cyan}
|
|
label = "%date% %time%"
|
|
#+end_src
|
|
|
|
*** battery
|
|
#+begin_src conf-windows
|
|
[module/battery]
|
|
type = internal/battery
|
|
battery = BAT0
|
|
adapter = ADP0
|
|
|
|
time-format = %H:%M
|
|
format-discharging = <ramp-capacity> <label-discharging>
|
|
format-discharging-underline = ${colors.cyan}
|
|
format-charging-underline = ${colors.yellow}
|
|
format-full-underline = ${colors.green}
|
|
label-discharging = %percentage%% %time%
|
|
label-charging = %percentage%% %time%
|
|
|
|
ramp-capacity-0 =
|
|
ramp-capacity-1 =
|
|
ramp-capacity-2 =
|
|
ramp-capacity-3 =
|
|
ramp-capacity-4 =
|
|
#+end_src
|