| Huge update, sway mostly. - dotfiles - These are my dotfiles. There are many li… | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit f416bf57b40d2678b1d9a32d2e6f72c6d75a38dc | |
| parent 07475f784ba3846094d1545852eac46dd79db095 | |
| Author: Jay Scott <[email protected]> | |
| Date: Wed, 7 Feb 2024 21:39:23 +0000 | |
| Huge update, sway mostly. | |
| Diffstat: | |
| M README | 11 +++++------ | |
| D X11/Xresources | 98 -----------------------------… | |
| D X11/xinitrc | 15 --------------- | |
| D alacritty/alacritty.toml | 33 -----------------------------… | |
| A ashrc | 54 +++++++++++++++++++++++++++++… | |
| D bashrc | 58 ------------------------------ | |
| M bin/game_select.sh | 1 - | |
| M bin/link_handler.sh | 8 ++++---- | |
| A bin/sway-run.sh | 22 ++++++++++++++++++++++ | |
| M bootstrap.sh | 4 ++-- | |
| A foot/foot.ini | 27 +++++++++++++++++++++++++++ | |
| D mpd/mpd.conf | 20 -------------------- | |
| D ncmpcpp/config | 31 -----------------------------… | |
| M newsraft/config | 4 ++-- | |
| M newsraft/feeds | 15 --------------- | |
| D pkg/pkglist-aur.txt | 7 ------- | |
| D pkg/pkglist-repo.txt | 62 -----------------------------… | |
| M profile | 2 +- | |
| D suckless/dmenu/Makefile | 39 -----------------------------… | |
| D suckless/dmenu/config.h | 16 ---------------- | |
| D suckless/dmenu/patches/01-dmenu-bo… | 36 ---------------------------… | |
| D suckless/dmenu/patches/02-dmenu-ce… | 120 ---------------------------… | |
| D suckless/dwm/Makefile | 41 -----------------------------… | |
| D suckless/dwm/config.h | 199 -----------------------------… | |
| D suckless/dwm/patches/01-dwm-systra… | 746 ---------------------------… | |
| D suckless/herbe/Makefile | 40 -----------------------------… | |
| D suckless/herbe/config.h | 19 ------------------- | |
| D suckless/slstatus/Makefile | 35 -----------------------------… | |
| D suckless/slstatus/config.h | 71 -----------------------------… | |
| A sway/config | 87 +++++++++++++++++++++++++++++… | |
| A waybar/config | 65 +++++++++++++++++++++++++++++… | |
| A waybar/style.css | 58 ++++++++++++++++++++++++++++++ | |
| A waybar/waybar_mail.sh | 12 ++++++++++++ | |
| A waybar/waybar_newsboat.sh | 11 +++++++++++ | |
| 34 files changed, 350 insertions(+), 1717 deletions(-) | |
| --- | |
| diff --git a/README b/README | |
| @@ -7,14 +7,13 @@ Privacy is at the forefront of my mind as such some of my bro… | |
| settings maybe too restrictive for some. I also don't use social media | |
| at all, the closest I come is using IRC. | |
| - operating sys : archlinux / alpine linux | |
| - window manager : dwm | |
| - terminal : alacritty | |
| - launcher : dmenu | |
| + operating sys : alpine linux | |
| + window manager : sway | |
| + terminal : foot | |
| + launcher : bemenu | |
| email : mutt / isync | |
| browser : qutebrowser / librewolf | |
| - video : mpv | |
| - music : mpd / ncmcpp | |
| + video / music : mpv | |
| password mgt : pass | |
| vpn : mullvad | |
| news : newsraft | |
| diff --git a/X11/Xresources b/X11/Xresources | |
| @@ -1,98 +0,0 @@ | |
| -! vim:ft=xdefaults | |
| - | |
| -/* COLOURS */ | |
| -#define RED0 #cc0403 | |
| -#define RED1 #f2201f | |
| -#define GREEN0 #19cb00 | |
| -#define GREEN1 #23fd00 | |
| -#define YELLOW0 #cecb00 | |
| -#define YELLOW1 #fffd00 | |
| -#define BLUE0 #0d73cc | |
| -#define BLUE1 #1a8fff | |
| -#define MAGENTA0 #cb1ed1 | |
| -#define MAGENTA1 #fd28ff | |
| -#define CYAN0 #0dcdcd | |
| -#define CYAN1 #14ffff | |
| -#define BLACK #000000 | |
| -#define GREY1 #767676 | |
| -#define GREY2 #dddddd | |
| -#define WHITE #ffffff | |
| - | |
| -#define FONT Hack:size=14 | |
| - | |
| -/* XFT */ | |
| -Xft.dpi: 96 | |
| -Xft.hinting: true | |
| -Xft.rgba: rgb | |
| -Xft.antialias: true | |
| -Xft.autohint: false | |
| -Xft.hintstyle: hintslight | |
| -Xft.lcdfilter: lcddefault | |
| - | |
| -*.foreground: WHITE | |
| -*.background: BLACK | |
| - | |
| -/* NORMAL */ | |
| -*.color0: BLACK | |
| -*.color1: RED0 | |
| -*.color2: GREEN0 | |
| -*.color3: YELLOW0 | |
| -*.color4: BLUE0 | |
| -*.color5: MAGENTA0 | |
| -*.color6: CYAN0 | |
| -*.color7: GREY2 | |
| - | |
| -/* BRIGHT */ | |
| -*.color8: GREY1 | |
| -*.color9: RED1 | |
| -*.color10: GREEN1 | |
| -*.color11: YELLOW1 | |
| -*.color12: BLUE1 | |
| -*.color13: MAGENTA1 | |
| -*.color14: CYAN1 | |
| -*.color15: WHITE | |
| - | |
| -! | |
| -! Generated with : | |
| -! XRDB2Xreources.py | |
| -! | |
| -*.foreground: #e6d4a3 | |
| -*.background: #1e1e1e | |
| -*.cursorColor: #bbbbbb | |
| -! | |
| -! Black | |
| -*.color0: #161819 | |
| -*.color8: #7f7061 | |
| -! | |
| -! Red | |
| -*.color1: #f73028 | |
| -*.color9: #be0f17 | |
| -! | |
| -! Green | |
| -*.color2: #aab01e | |
| -*.color10: #868715 | |
| -! | |
| -! Yellow | |
| -*.color3: #f7b125 | |
| -*.color11: #cc881a | |
| -! | |
| -! Blue | |
| -*.color4: #719586 | |
| -*.color12: #377375 | |
| -! | |
| -! Magenta | |
| -*.color5: #c77089 | |
| -*.color13: #a04b73 | |
| -! | |
| -! Cyan | |
| -*.color6: #7db669 | |
| -*.color14: #578e57 | |
| -! | |
| -! White | |
| -*.color7: #faefbb | |
| -*.color15: #e6d4a3 | |
| -! | |
| -! Bold, Italic, Underline | |
| -*.colorBD: #978771 | |
| -!*.colorIT: | |
| -!*.colorUL: | |
| diff --git a/X11/xinitrc b/X11/xinitrc | |
| @@ -1,15 +0,0 @@ | |
| -# x stuff | |
| -setxkbmap gb | |
| -xset s off -dpms | |
| -xrdb -load ~/.config/X11/Xresources | |
| - | |
| -if [ -z "$XDG_RUNTIME_DIR" ]; then | |
| - mkdir -p /tmp/runtime/jay | |
| - chmod 700 /tmp/runtime/jay | |
| - export XDG_RUNTIME_DIR=/tmp/runtime/jay | |
| -fi | |
| - | |
| -slstatus & | |
| -xrandr --output HDMI-A-0 --auto --output DisplayPort-0 --auto --right-of HDMI-… | |
| -mpd & | |
| -exec dwm | |
| diff --git a/alacritty/alacritty.toml b/alacritty/alacritty.toml | |
| @@ -1,33 +0,0 @@ | |
| -[colors.bright] | |
| -black = "0x928374" | |
| -blue = "0x83a598" | |
| -cyan = "0x8ec07c" | |
| -green = "0xb8bb26" | |
| -magenta = "0xd3869b" | |
| -red = "0xfb4934" | |
| -white = "0xebdbb2" | |
| -yellow = "0xfabd2f" | |
| - | |
| -[colors.normal] | |
| -black = "0x282828" | |
| -blue = "0x458588" | |
| -cyan = "0x689d6a" | |
| -green = "0x98971a" | |
| -magenta = "0xb16286" | |
| -red = "0xcc241d" | |
| -white = "0xa89984" | |
| -yellow = "0xd79921" | |
| - | |
| -[colors.primary] | |
| -background = "0x282828" | |
| -foreground = "0xebdbb2" | |
| - | |
| -[env] | |
| -TERM = "xterm-256color" | |
| - | |
| -[font] | |
| -size = 15 | |
| - | |
| -[font.normal] | |
| -family = "Hack" | |
| -style = "Regular" | |
| diff --git a/ashrc b/ashrc | |
| @@ -0,0 +1,54 @@ | |
| +export XDG_CONFIG_HOME="$HOME/.config" | |
| +export XDG_CACHE_HOME="$HOME/.cache" | |
| +export XDG_DATA_HOME="$HOME/.local/share" | |
| +export XDG_STATE_HOME="$HOME/.local/state" | |
| + | |
| +# cleanup ~/ | |
| +export PASSWORD_STORE_DIR="$XDG_CONFIG_HOME"/pass | |
| +export CARGO_HOME="$XDG_DATA_HOME"/cargo | |
| +alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"' | |
| + | |
| +# common exports | |
| +GPG_TTY=$(tty) | |
| +export GPG_TTY | |
| +export EDITOR="vim" | |
| +export BROWSER="qutebrowser" | |
| +export PATH=$PATH:$HOME/bin:$HOME/.local/bin | |
| + | |
| +export BEMENU_OPTS="-p '> ' --tb '#013220' --tf '#ffffff' --hf '#444444'" | |
| + | |
| +# terraform config | |
| +export TF_CLOUD_ORGANIZATION="jay-scot" | |
| +export TF_WORKSPACE="hetzner" | |
| + | |
| +# lynx | |
| +export LYNX_CFG=$HOME/.config/lynx/config | |
| +export LYNX_LSS=$HOME/.config/lynx/theme.lss | |
| + | |
| +# safety first kids! | |
| +alias cp='cp -i' | |
| +alias mv='mv -i' | |
| +alias rm='rm -i' | |
| + | |
| +# random alias | |
| +alias weather='curl wttr.in/?1QF' | |
| + | |
| +# git alias | |
| +alias ga='git add -A' | |
| +alias gs='git status -s' | |
| +alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset… | |
| +alias gd='git diff' | |
| +alias gma='git commit -am' | |
| + | |
| +# neo | |
| +alias vim='nvim' | |
| +alias mutt='neomutt' | |
| + | |
| +# ash | |
| +export MAILPATH='~/.mail/jay/Inbox/cur/' | |
| +export LANG=en_US.UTF-8 | |
| +export LC_CTYPE="en_US.UTF-8" | |
| +export LC_ALL=en_US.UTF-8 | |
| +export PS1="\[\e[00;34m\]▶▶▶ \W \[\e[0m\]" | |
| + | |
| +source ~/.secret | |
| diff --git a/bashrc b/bashrc | |
| @@ -1,58 +0,0 @@ | |
| -if [[ -r /usr/share/bash-completion/bash_completion ]]; then | |
| - . /usr/share/bash-completion/bash_completion | |
| -fi | |
| - | |
| -export XDG_CONFIG_HOME="$HOME/.config" | |
| -export XDG_CACHE_HOME="$HOME/.cache" | |
| -export XDG_DATA_HOME="$HOME/.local/share" | |
| -export XDG_STATE_HOME="$HOME/.local/state" | |
| - | |
| -# cleanup ~/ | |
| -export PASSWORD_STORE_DIR="$XDG_CONFIG_HOME"/pass | |
| -export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc | |
| -export XAUTHORITY="$XDG_RUNTIME_DIR"/Xauthority | |
| -export CARGO_HOME="$XDG_DATA_HOME"/cargo | |
| -alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"' | |
| - | |
| -# common exports | |
| -GPG_TTY=$(tty) | |
| -export GPG_TTY | |
| -export EDITOR="vim" | |
| -export BROWSER="librewolf" | |
| -export GOPATH="$XDG_DATA_HOME"/go | |
| -export GOPROXY=direct | |
| -export PATH=$PATH:$GOPATH/bin:$HOME/bin:$HOME/.local/bin | |
| -export PS1="[\[$(tput sgr0)\]\[\033[38;5;7m\]\W\[$(tput sgr0)\]] \\$ \[$(tput … | |
| - | |
| -# terraform config | |
| -export TF_CLOUD_ORGANIZATION="jay-scot" | |
| -export TF_WORKSPACE="hetzner" | |
| - | |
| -# lynx | |
| -export LYNX_CFG=$HOME/.config/lynx/config | |
| -export LYNX_LSS=$HOME/.config/lynx/theme.lss | |
| - | |
| -# safety first kids! | |
| -alias cp='cp -i' | |
| -alias mv='mv -i' | |
| -alias rm='rm -i' | |
| - | |
| -# random alias | |
| -alias weather='curl wttr.in/57.66,-2.52?3QF' | |
| -alias ls='ls --color=auto' | |
| -alias voff='mullvad lockdown-mode set off; mullvad disconnect' | |
| -alias von='mullvad lockdown-mode set on; mullvad connect' | |
| -alias vcheck='curl https://am.i.mullvad.net/connected' | |
| - | |
| -# neo | |
| -alias vim='nvim' | |
| -alias mutt='neomutt' | |
| - | |
| -# git alias | |
| -alias ga='git add -A' | |
| -alias gs='git status -s' | |
| -alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset… | |
| -alias gd='git diff --color=always --word-diff=color | less -RFX' | |
| -alias gma='git commit -am' | |
| - | |
| -source ~/.secret | |
| diff --git a/bin/game_select.sh b/bin/game_select.sh | |
| @@ -7,7 +7,6 @@ stellaris_path=$MEDIA_GAMES_DIR/stellaris/start.sh | |
| gibbous_path=$MEDIA_GAMES_DIR/gibbous/start.sh | |
| rimworld_path=$MEDIA_GAMES_DIR/rimworld/start.sh | |
| atomrpg_path=$MEDIA_GAMES_DIR/atomrpg/start.sh | |
| -primordia_path=$MEDIA_GAMES_DIR/primordia/start.sh | |
| steam_command=steam | |
| # Define game list | |
| diff --git a/bin/link_handler.sh b/bin/link_handler.sh | |
| @@ -4,10 +4,10 @@ launcher="setsid" | |
| # apps | |
| player="mpv --really-quiet --no-terminal" | |
| -gemini="alacritty -e amfora" | |
| -gopher="alacritty -e lynx" | |
| +gemini="foot -e amfora" | |
| +gopher="foot -e lynx" | |
| pdf="zathura" | |
| -images="feh" | |
| +images="swayimg" | |
| uri="$1" | |
| uri_lower="$(printf "%s" "$uri" | tr '[:upper:]' '[:lower:]')" | |
| @@ -30,6 +30,6 @@ case "$uri_lower" in | |
| $launcher $images "$uri" | |
| ;; | |
| *) | |
| - $launcher librewolf "$uri" | |
| + $launcher firefox "$uri" | |
| ;; | |
| esac | |
| diff --git a/bin/sway-run.sh b/bin/sway-run.sh | |
| @@ -0,0 +1,22 @@ | |
| +#!/bin/sh | |
| +export TERM=foot | |
| +export _JAVA_AWT_WM_NONREPARENTING=1 | |
| +export XKB_DEFAULT_OPTIONS=caps:escape | |
| +export GDK_BACKEND=wayland | |
| +export XDG_SESSION_TYPE=wayland | |
| +#export XCURSOR_THEME=Adwaita | |
| +export XDG_DESKTOP_DIR="$HOME" | |
| +export XDG_DOWNLOAD_DIR="$HOME/tmp" | |
| +export XDG_DOCUMENTS_DIR="$HOME/tmp" | |
| +export XDG_MUSIC_DIR="$HOME/tmp" | |
| +export XDG_PICTURES_DIR="$HOME/tmp" | |
| +export XDG_VIDEOS_DIR="$HOME/tmp" | |
| +export XDG_CURRENT_DESKTOP=sway | |
| + | |
| +if [ -z "$XDG_RUNTIME_DIR" ]; then | |
| + mkdir -p /tmp/runtime/jay | |
| + chmod 700 /tmp/runtime/jay | |
| + export XDG_RUNTIME_DIR=/tmp/runtime/jay | |
| +fi | |
| + | |
| +exec dbus-run-session sway | |
| diff --git a/bootstrap.sh b/bootstrap.sh | |
| @@ -2,9 +2,9 @@ | |
| DOTFILES=$(pwd) | |
| -FILES='bashrc profile' | |
| +FILES='ashrc profile' | |
| ROOT='bin' | |
| -CONFIG='alacritty git isync lynx mutt newsraft mpd ncmpcpp nvim qutebrowser X1… | |
| +CONFIG='foot git isync lynx mutt newsraft nvim qutebrowser sway waybar' | |
| link() { | |
| for f in $FILES; do ln -sfn "$DOTFILES/$f" "$HOME/.$f"; done | |
| diff --git a/foot/foot.ini b/foot/foot.ini | |
| @@ -0,0 +1,27 @@ | |
| +font=Hack:size=14 | |
| + | |
| +[url] | |
| +launch=link_handler.sh ${url} | |
| + | |
| +[key-bindings] | |
| +show-urls-launch=Control+Shift+p | |
| + | |
| +[colors] | |
| +background=282828 | |
| +foreground=ebdbb2 | |
| +regular0=282828 | |
| +regular1=cc241d | |
| +regular2=98971a | |
| +regular3=d79921 | |
| +regular4=458588 | |
| +regular5=b16286 | |
| +regular6=689d6a | |
| +regular7=a89984 | |
| +bright0=928374 | |
| +bright1=fb4934 | |
| +bright2=b8bb26 | |
| +bright3=fabd2f | |
| +bright4=83a598 | |
| +bright5=d3869b | |
| +bright6=8ec07c | |
| +bright7=ebdbb2 | |
| diff --git a/mpd/mpd.conf b/mpd/mpd.conf | |
| @@ -1,20 +0,0 @@ | |
| -music_directory "/home/jay/media/music" | |
| -playlist_directory "/home/jay/.config/mpd/playlists" | |
| -db_file "/home/jay/.config/mpd/mpd.db" | |
| -log_file "syslog" | |
| -pid_file "/home/jay/.config/mpd/mpd.pid" | |
| -state_file "/home/jay/.config/mpd/mpdstate" | |
| - | |
| -audio_output { | |
| - type "pulse" | |
| - name "pulse audio" | |
| -} | |
| -audio_output { | |
| - type "fifo" | |
| - name "my_fifo" | |
| - path "/tmp/mpd.fifo" | |
| - format "44100:16:2" | |
| -} | |
| - | |
| -bind_to_address "127.0.0.1" | |
| -port "6600" | |
| diff --git a/ncmpcpp/config b/ncmpcpp/config | |
| @@ -1,31 +0,0 @@ | |
| -# visual stuff for 8 | |
| -visualizer_data_source = /tmp/mpd.fifo | |
| -visualizer_output_name = my_fifo | |
| -visualizer_in_stereo = no | |
| -visualizer_type = spectrum | |
| -visualizer_look = ∙▋ | |
| -visualizer_color = 7,5,8,3 | |
| -song_columns_list_format = "(50)[green]{a} (50)[white]{t|f}" | |
| - | |
| -playlist_display_mode = columns | |
| -browser_display_mode = columns | |
| - | |
| -ncmpcpp_directory = ~/.config/ncmpcpp | |
| -lyrics_directory = /tmp | |
| -store_lyrics_in_song_dir = yes | |
| -autocenter_mode = "yes" | |
| -centered_cursor = "yes" | |
| -cyclic_scrolling = "no" | |
| - | |
| -titles_visibility = "no" | |
| -header_visibility = "no" | |
| -statusbar_visibility = "no" | |
| -progressbar_look = "❙❙❙" | |
| -progressbar_color = "white" | |
| - | |
| -user_interface = "classic" | |
| - | |
| -startup_screen = playlist | |
| -startup_slave_screen = visualizer | |
| -startup_slave_screen_focus = no | |
| -locked_screen_width_part = 35 | |
| diff --git a/newsraft/config b/newsraft/config | |
| @@ -3,8 +3,8 @@ set open-in-browser-command ~/bin/link_handler.sh "%l" | |
| set send-user-agent-header true | |
| set clean-database-on-startup true | |
| -set menu-feed-sorting unread-desc | |
| -set menu-item-sorting unread-desc | |
| +#set menu-feed-sorting unread-desc | |
| +#set menu-item-sorting unread-desc | |
| # key bindings | |
| bind f exec "~/bin/link_handler.sh %l" | |
| diff --git a/newsraft/feeds b/newsraft/feeds | |
| @@ -10,17 +10,6 @@ https://goarmy.co.uk/collections/all.atom "GoArmy Disressed" | |
| @ MEDIA | |
| https://showrss.info/other/all.rss "TV Torrents" | |
| -http://feed.rutracker.cc/atom/f/1992.atom "RU Tracker" | |
| - | |
| -@ GAMING | |
| -https://www.gamingonlinux.com/article_rss.php "Gaming On Linux" | |
| - | |
| -@ GEMINI | |
| -$(gemget tilde.team/~tomasino/atom.xml --output -) "[email protected]" | |
| -$(gemget capsule.usebox.net/gemlog/atom.xml --output -) "Juans Gemlog" | |
| -$(gemget foobucket.xyz/gemlog/atom.xml --output -) "Foobucket Gemlog" | |
| -$(gemget midnight.pub/feed.xml --output -) "Midnight Pub" | |
| -$(gemget gemini://warmedal.se/~antenna/atom.xml --output -) "Antenna" | |
| @ PEOPLE | |
| https://codemadness.org/atom.xml "CodeMadness" | |
| @@ -28,8 +17,6 @@ https://drewdevault.com/blog/index.xml "Drew DeVault" | |
| http://joeyh.name/blog/index.rss "Joey H" | |
| https://unixsheikh.com/feed.rss "Unix Sheikh" | |
| https://www.uninformativ.de/blog/feeds/en.atom "Uninformativ" | |
| -$(curl -s gopher://box.matto.nl/0/gopherindex.rss) "Matto" | |
| -$(curl -s gopher://1436.ninja/0phlog.atom) "RPod" | |
| @ ODYSEE | |
| https://odysee.com/$/rss/@AlphaNerd:8 "Mental Outlaws" | |
| @@ -61,7 +48,6 @@ https://www.youtube.com/feeds/videos.xml?channel_id=UCpXwMqnX… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCO8MMsO_XRjO7X4iGCuKdwg "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCpiWxsm9Gt_HK7d-jqkU4MA "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCPqdx8N99fs4IDoK_XA1aew "… | |
| -https://www.youtube.com/feeds/videos.xml?channel_id=UCAN5q-zNsG3zfk0pHI2rXWQ "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCI3mQP0kLxdZKhNtcHhExyA "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCdVEfdWcNwL5jWmwaNWEf1Q "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UC2O6HDtMOZf9FkUAepz9Atg "… | |
| @@ -76,7 +62,6 @@ https://www.youtube.com/feeds/videos.xml?channel_id=UC7McxlM5… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCb31gOY6OD8ES0zP8M0GhAw "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCqWFLuBLPiaeNzYAek6BOmA "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCSnqXeK94-iNmwqGO__eJ5g "… | |
| -https://www.youtube.com/feeds/videos.xml?channel_id=UCQkKf5qwYKyJlyhZPbdAVmw "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UC2SMpy2oZV6BoyJEYShw9bw "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UCDQ9L4eFHxSh0BM6z-SkZMw "… | |
| https://www.youtube.com/feeds/videos.xml?channel_id=UC3Vuq4Q1bKFtAiKYlwRv3oA "… | |
| diff --git a/pkg/pkglist-aur.txt b/pkg/pkglist-aur.txt | |
| @@ -1,7 +0,0 @@ | |
| -gemget | |
| -lib32-gperftools | |
| -librewolf-bin | |
| -mullvad-vpn-bin | |
| -newsraft | |
| -paru | |
| -shellcheck-bin | |
| diff --git a/pkg/pkglist-repo.txt b/pkg/pkglist-repo.txt | |
| @@ -1,62 +0,0 @@ | |
| -alacritty | |
| -amfora | |
| -base | |
| -base-devel | |
| -bash-completion | |
| -chrony | |
| -dhcpcd | |
| -docker | |
| -docker-compose | |
| -efibootmgr | |
| -fzf | |
| -gamemode | |
| -git | |
| -gnu-netcat | |
| -isync | |
| -less | |
| -lf | |
| -lib32-libpng12 | |
| -lib32-pipewire | |
| -linux | |
| -linux-firmware | |
| -lynx | |
| -mpd | |
| -mpv | |
| -ncmpcpp | |
| -neomutt | |
| -neovim | |
| -noto-fonts-emoji | |
| -ntfs-3g | |
| -pamixer | |
| -pass | |
| -pipewire-alsa | |
| -pipewire-pulse | |
| -profanity | |
| -pulsemixer | |
| -python-adblock | |
| -qutebrowser | |
| -rsync | |
| -scrot | |
| -shfmt | |
| -steam | |
| -sudo | |
| -terraform | |
| -ttf-dejavu | |
| -ttf-hack | |
| -ttf-jetbrains-mono-nerd | |
| -ttf-liberation | |
| -unrar | |
| -unzip | |
| -vulkan-radeon | |
| -wayland | |
| -wine-staging | |
| -xclip | |
| -xdg-utils | |
| -xf86-video-amdgpu | |
| -xorg-server | |
| -xorg-xinit | |
| -xorg-xset | |
| -xorg-xsetroot | |
| -yt-dlp | |
| -zathura | |
| -zathura-pdf-mupdf | |
| diff --git a/profile b/profile | |
| @@ -1,2 +1,2 @@ | |
| -export ENV=$HOME/.bashrc | |
| +export ENV=$HOME/.ashrc | |
| . $ENV | |
| diff --git a/suckless/dmenu/Makefile b/suckless/dmenu/Makefile | |
| @@ -1,39 +0,0 @@ | |
| -REPOSITORY = http://git.suckless.org/dmenu | |
| -SRC_DIR = src | |
| -PINNED_REVISION = HEAD | |
| -PATCH_DIR = patches | |
| - | |
| -all: $(SRC_DIR) | |
| - | |
| -clean: reset | |
| - @if test -d $(SRC_DIR); then \ | |
| - $(MAKE) -C "${SRC_DIR}" -s clean; \ | |
| - git -C "${SRC_DIR}" clean -f; \ | |
| - fi | |
| - | |
| -$(SRC_DIR): clone reset patch | |
| - @cp config.h $@ | |
| - $(MAKE) -C "${SRC_DIR}" -s | |
| - | |
| -patch: $(PATCH_DIR)/* | |
| - @for file in $^ ; do \ | |
| - patch -d "${SRC_DIR}" < $${file}; \ | |
| - done | |
| -reset: | |
| - @if [ -n "$(strip $(PINNED_REVISION))" ]; then \ | |
| - git -C "${SRC_DIR}" reset --hard $(PINNED_REVISION); \ | |
| - fi | |
| - | |
| -clone: | |
| - @if ! test -d $(SRC_DIR); then \ | |
| - git clone $(REPOSITORY) $(SRC_DIR); \ | |
| - fi | |
| - | |
| -update: clean | |
| - @git -C "${SRC_DIR}" pull | |
| - | |
| -install: | |
| - $(MAKE) -C "${SRC_DIR}" -s install | |
| - | |
| - | |
| -.PHONY: all clean update install reset clone | |
| diff --git a/suckless/dmenu/config.h b/suckless/dmenu/config.h | |
| @@ -1,16 +0,0 @@ | |
| -static int topbar = 1; | |
| -static const char *fonts[] = { | |
| - "Hack:pixelsize=14" | |
| -}; | |
| -static int centered = 1; | |
| -static const char *prompt = "run »"; | |
| -static const char *colors[SchemeLast][2] = { | |
| - [SchemeNorm] = { "#ebdbb2", "#282828" }, | |
| - [SchemeSel] = { "#ebdbb2", "#98971a" }, | |
| - [SchemeOut] = { "#ebdbb2", "#8ec07c" }, | |
| -}; | |
| - | |
| -static unsigned int lines = 0; | |
| -static const char worddelimiters[] = " "; | |
| -static int min_width = 800; | |
| -static unsigned int border_width = 3; | |
| diff --git a/suckless/dmenu/patches/01-dmenu-border-4.9.diff b/suckless/dmenu/p… | |
| @@ -1,36 +0,0 @@ | |
| -diff --git a/config.def.h b/config.def.h | |
| -index 1edb647..dd3eb31 100644 | |
| ---- a/config.def.h | |
| -+++ b/config.def.h | |
| -@@ -21,3 +21,6 @@ static unsigned int lines = 0; | |
| - * for example: " /?\"&[]" | |
| - */ | |
| - static const char worddelimiters[] = " "; | |
| -+ | |
| -+/* Size of the window border */ | |
| -+static unsigned int border_width = 0; | |
| -diff --git a/dmenu.c b/dmenu.c | |
| -index 27b7a30..7c130fc 100644 | |
| ---- a/dmenu.c | |
| -+++ b/dmenu.c | |
| -@@ -684,9 +684,11 @@ setup(void) | |
| - swa.override_redirect = True; | |
| - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | |
| - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; | |
| -- win = XCreateWindow(dpy, root, x, y, mw, mh, 0, | |
| -+ win = XCreateWindow(dpy, root, x, y, mw, mh, border_width, | |
| - CopyFromParent, CopyFromParent, CopyFromParent, | |
| - CWOverrideRedirect | CWBackPixel | CWEventMask, &… | |
| -+ if (border_width) | |
| -+ XSetWindowBorder(dpy, win, scheme[SchemeSel][ColBg].pixel); | |
| - XSetClassHint(dpy, win, &ch); | |
| - | |
| - | |
| -@@ -757,6 +759,8 @@ main(int argc, char *argv[]) | |
| - colors[SchemeSel][ColFg] = argv[++i]; | |
| - else if (!strcmp(argv[i], "-w")) /* embedding window id */ | |
| - embed = argv[++i]; | |
| -+ else if (!strcmp(argv[i], "-bw")) | |
| -+ border_width = atoi(argv[++i]); /* border width */ | |
| - else | |
| - usage(); | |
| diff --git a/suckless/dmenu/patches/02-dmenu-center-20200111-8cd37e1.diff b/suc… | |
| @@ -1,120 +0,0 @@ | |
| -From 8cd37e1ab9e7cb025224aeb3543f1a5be8bceb93 Mon Sep 17 00:00:00 2001 | |
| -From: Nihal Jere <[email protected]> | |
| -Date: Sat, 11 Jan 2020 21:16:08 -0600 | |
| -Subject: [PATCH] center patch now has adjustable minimum width | |
| - | |
| ---- | |
| - config.def.h | 2 ++ | |
| - dmenu.1 | 3 +++ | |
| - dmenu.c | 39 ++++++++++++++++++++++++++++++++------- | |
| - 3 files changed, 37 insertions(+), 7 deletions(-) | |
| - | |
| -diff --git a/config.def.h b/config.def.h | |
| -index 1edb647..88ef264 100644 | |
| ---- a/config.def.h | |
| -+++ b/config.def.h | |
| -@@ -2,6 +2,8 @@ | |
| - /* Default settings; can be overriden by command line. */ | |
| - | |
| - static int topbar = 1; /* -b option; if 0, dmenu appear… | |
| -+static int centered = 0; /* -c option; centers dmenu on sc… | |
| -+static int min_width = 500; /* minimum width when centered… | |
| - /* -fn option overrides fonts[0]; default X11 font or font set */ | |
| - static const char *fonts[] = { | |
| - "monospace:size=10" | |
| -diff --git a/dmenu.1 b/dmenu.1 | |
| -index 323f93c..c036baa 100644 | |
| ---- a/dmenu.1 | |
| -+++ b/dmenu.1 | |
| -@@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result… | |
| - .B \-b | |
| - dmenu appears at the bottom of the screen. | |
| - .TP | |
| -+.B \-c | |
| -+dmenu appears centered on the screen. | |
| -+.TP | |
| - .B \-f | |
| - dmenu grabs the keyboard before reading stdin if not reading from a tty. This | |
| - is faster, but will lock up X until stdin reaches end\-of\-file. | |
| -diff --git a/dmenu.c b/dmenu.c | |
| -index 65f25ce..041c7f8 100644 | |
| ---- a/dmenu.c | |
| -+++ b/dmenu.c | |
| -@@ -89,6 +89,15 @@ calcoffsets(void) | |
| - break; | |
| - } | |
| - | |
| -+static int | |
| -+max_textw(void) | |
| -+{ | |
| -+ int len = 0; | |
| -+ for (struct item *item = items; item && item->text; item++) | |
| -+ len = MAX(TEXTW(item->text), len); | |
| -+ return len; | |
| -+} | |
| -+ | |
| - static void | |
| - cleanup(void) | |
| - { | |
| -@@ -611,6 +620,7 @@ setup(void) | |
| - bh = drw->fonts->h + 2; | |
| - lines = MAX(lines, 0); | |
| - mh = (lines + 1) * bh; | |
| -+ promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; | |
| - #ifdef XINERAMA | |
| - i = 0; | |
| - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { | |
| -@@ -637,9 +647,16 @@ setup(void) | |
| - if (INTERSECT(x, y, 1, 1, info[i])) | |
| - break; | |
| - | |
| -- x = info[i].x_org; | |
| -- y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | |
| -- mw = info[i].width; | |
| -+ if (centered) { | |
| -+ mw = MIN(MAX(max_textw() + promptw, min_width), info[… | |
| -+ x = info[i].x_org + ((info[i].width - mw) / 2); | |
| -+ y = info[i].y_org + ((info[i].height - mh) / 2); | |
| -+ } else { | |
| -+ x = info[i].x_org; | |
| -+ y = info[i].y_org + (topbar ? 0 : info[i].height - mh… | |
| -+ mw = info[i].width; | |
| -+ } | |
| -+ | |
| - XFree(info); | |
| - } else | |
| - #endif | |
| -@@ -647,11 +664,17 @@ setup(void) | |
| - if (!XGetWindowAttributes(dpy, parentwin, &wa)) | |
| - die("could not get embedding window attributes: 0x%lx… | |
| - parentwin); | |
| -- x = 0; | |
| -- y = topbar ? 0 : wa.height - mh; | |
| -- mw = wa.width; | |
| -+ | |
| -+ if (centered) { | |
| -+ mw = MIN(MAX(max_textw() + promptw, min_width), wa.wi… | |
| -+ x = (wa.width - mw) / 2; | |
| -+ y = (wa.height - mh) / 2; | |
| -+ } else { | |
| -+ x = 0; | |
| -+ y = topbar ? 0 : wa.height - mh; | |
| -+ mw = wa.width; | |
| -+ } | |
| - } | |
| -- promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; | |
| - inputw = MIN(inputw, mw/3); | |
| - match(); | |
| - | |
| -@@ -709,6 +732,8 @@ main(int argc, char *argv[]) | |
| - topbar = 0; | |
| - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before r… | |
| - fast = 1; | |
| -+ else if (!strcmp(argv[i], "-c")) /* centers dmenu on screen… | |
| -+ centered = 1; | |
| - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item m… | |
| - fstrncmp = strncasecmp; | |
| - fstrstr = cistrstr; | |
| --- | |
| -2.24.1 | |
| - | |
| diff --git a/suckless/dwm/Makefile b/suckless/dwm/Makefile | |
| @@ -1,41 +0,0 @@ | |
| -REPOSITORY = http://git.suckless.org/dwm | |
| -SRC_DIR = src | |
| -PINNED_REVISION = HEAD | |
| -PATCH_DIR = patches | |
| - | |
| -all: $(SRC_DIR) | |
| - | |
| -clean: reset | |
| - @if test -d $(SRC_DIR); then \ | |
| - cd $(SRC_DIR); \ | |
| - $(MAKE) -s clean; \ | |
| - git clean -f; \ | |
| - fi | |
| - | |
| -$(SRC_DIR): clone reset patch | |
| - @cp config.h $@ | |
| - @cd $@ && $(MAKE) -s | |
| - | |
| -reset: | |
| - @if [ -n "$(strip $(PINNED_REVISION))" ]; then \ | |
| - cd $(SRC_DIR) && git reset --hard $(PINNED_REVISION); \ | |
| - fi | |
| - | |
| -patch: $(PATCH_DIR)/* | |
| - @for file in $^ ; do \ | |
| - patch -d "${SRC_DIR}" < $${file}; \ | |
| - done | |
| - | |
| -clone: | |
| - @if ! test -d $(SRC_DIR); then \ | |
| - git clone $(REPOSITORY) $(SRC_DIR); \ | |
| - fi | |
| - | |
| -update: clean | |
| - @cd $(SRC_DIR) && git pull | |
| - | |
| -install: | |
| - $(MAKE) -C "${SRC_DIR}" -s install | |
| - | |
| - | |
| -.PHONY: all clean update install reset clone | |
| diff --git a/suckless/dwm/config.h b/suckless/dwm/config.h | |
| @@ -1,199 +0,0 @@ | |
| -/* See LICENSE file for copyright and license details. */ | |
| - | |
| -/* appearance */ | |
| -static const unsigned int borderpx = 3; | |
| -static const unsigned int snap = 32; | |
| -static const int lockfullscreen = 1; | |
| -static const int showbar = 1; | |
| -static const int topbar = 1; | |
| -static const unsigned int systraypinning = 0; | |
| -static const unsigned int systrayonleft = 0; | |
| -static const unsigned int systrayspacing = 2; | |
| -static const int systraypinningfailfirst = 1; | |
| -static const int showsystray = 1; | |
| - | |
| -static const char *fonts[] = { "Hack:size=10" }; | |
| -static const char dmenufont[] = "Hack:size=10"; | |
| -static const char col_gray1[] = "#222222"; | |
| -static const char col_gray2[] = "#98971A"; | |
| -static const char col_gray3[] = "#bbbbbb"; | |
| -static const char col_gray4[] = "#eeeeee"; | |
| -static const char col_cyan[] = "#222222"; | |
| -static const char *colors[][3] = { | |
| - /* fg bg border */ | |
| - [SchemeNorm] = { col_gray3, col_gray1, col_cyan }, | |
| - [SchemeSel] = { col_gray4, col_cyan, col_gray2 }, | |
| -}; | |
| - | |
| - | |
| -/* custom functions */ | |
| -static void togglefullscreen(const Arg *arg); | |
| -static void bstack(Monitor *m); | |
| -static void centeredfloatingmaster(Monitor *m); | |
| - | |
| -/* custom defines for mouse buttons */ | |
| -/* only 1-5 are defined in X11/X.h */ | |
| -#define Button8 8 | |
| -#define Button9 9 | |
| - | |
| -/* tagging */ | |
| -static const char *tags[] = { "1", "2", "3", "4", "5" }; | |
| - | |
| -static Rule rules[] = { | |
| - /* class instance title tags mask isfloating monit… | |
| - { NULL, NULL, NULL, 0, False, -1 }, | |
| -}; | |
| - | |
| -/* layout(s) */ | |
| -static const float mfact = 0.65; | |
| -static const int nmaster = 1; | |
| -static const int resizehints = 0; | |
| - | |
| -static const Layout layouts[] = { | |
| - { "TTT", bstack }, | |
| - { "[]=", tile }, | |
| - { ">M>", centeredfloatingmaster }, | |
| - { "><>", NULL }, | |
| -}; | |
| - | |
| -#define MODKEY Mod1Mask | |
| -#define TAGKEYS(KEY,TAG) \ | |
| -{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \ | |
| -{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ | |
| -{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ | |
| -{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, | |
| - | |
| -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } | |
| - | |
| -/* commands */ | |
| -static char dmenumon[2] = "0"; | |
| -static const char *dmenucmd[] = { "dmenu_run", NULL }; | |
| -static const char *termcmd[] = { "alacritty", NULL }; | |
| -static const char *webcmd[] = { "librewolf", NULL }; | |
| -static const char *gamecmd[] = { "/home/jay/bin/game_select.sh", NULL }; | |
| -static const char *volup[] = { "pamixer", "-i", "5", NULL }; | |
| -static const char *voldown[] = { "pamixer", "-d", "5", NULL }; | |
| - | |
| - | |
| -static Key keys[] = { | |
| - /* modifier key function argument */ | |
| - { MODKEY, XK_p, spawn, {.v = dmenu… | |
| - { MODKEY, XK_space, spawn, {.v = termc… | |
| - { MODKEY, XK_f, spawn, {.v = webcm… | |
| - { MODKEY, XK_g, spawn, {.v = gamec… | |
| - { MODKEY, XK_u, spawn, {.v = volup… | |
| - { MODKEY, XK_d, spawn, {.v = voldo… | |
| - { MODKEY, XK_j, focusstack, {.i = +1 } … | |
| - { MODKEY, XK_k, focusstack, {.i = -1 } … | |
| - { MODKEY, XK_h, setmfact, {.f = -0.05… | |
| - { MODKEY, XK_l, setmfact, {.f = +0.05… | |
| - { MODKEY, XK_Return, zoom, {0} }, | |
| - { MODKEY, XK_Tab, view, {0} }, | |
| - { MODKEY, XK_c, killclient, {0} }, | |
| - { MODKEY, XK_m, togglefullscreen, {0} }, | |
| - { MODKEY, XK_period, focusmon, {.i = +1 } … | |
| - { MODKEY, XK_comma, tagmon, {.i = +1 }… | |
| - { MODKEY, XK_b, togglebar, {0} }, | |
| - { MODKEY, XK_x, setlayout, {.v = &layo… | |
| - { MODKEY|ShiftMask, XK_x, setlayout, {.v = &layo… | |
| - TAGKEYS( XK_1, 0) | |
| - TAGKEYS( XK_2, 1) | |
| - TAGKEYS( XK_3, 2) | |
| - TAGKEYS( XK_4, 3) | |
| - TAGKEYS( XK_5, 4) | |
| - { MODKEY|ShiftMask, XK_q, quit, {0} }, | |
| -}; | |
| - | |
| -/* button definitions */ | |
| -static Button buttons[] = { | |
| - { ClkRootWin, 0, Button8, spawn, … | |
| - { ClkRootWin, 0, Button9, spawn, … | |
| - }; | |
| - | |
| -void | |
| -togglefullscreen(const Arg *arg) | |
| -{ | |
| - if (!selmon->sel) | |
| - return; | |
| - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); | |
| -} | |
| - | |
| -static void | |
| -bstack(Monitor *m) { | |
| - int w, h, mh, mx, tx, ty, tw; | |
| - unsigned int i, n; | |
| - Client *c; | |
| - | |
| - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); | |
| - if (n == 0) | |
| - return; | |
| - if (n > m->nmaster) { | |
| - mh = m->nmaster ? m->mfact * m->wh : 0; | |
| - tw = m->ww / (n - m->nmaster); | |
| - ty = m->wy + mh; | |
| - } else { | |
| - mh = m->wh; | |
| - tw = m->ww; | |
| - ty = m->wy; | |
| - } | |
| - for (i = mx = 0, tx = m->wx, c = nexttiled(m->clients); c; c = nexttil… | |
| - if (i < m->nmaster) { | |
| - w = (m->ww - mx) / (MIN(n, m->nmaster) - i); | |
| - resize(c, m->wx + mx, m->wy, w - (2 * c->bw), mh - (2 … | |
| - mx += WIDTH(c); | |
| - } else { | |
| - h = m->wh - mh; | |
| - resize(c, tx, ty, tw - (2 * c->bw), h - (2 * c->bw), 0… | |
| - if (tw != m->ww) | |
| - tx += WIDTH(c); | |
| - } | |
| - } | |
| -} | |
| - | |
| -void | |
| -centeredfloatingmaster(Monitor *m) | |
| -{ | |
| - unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; | |
| - Client *c; | |
| - | |
| - /* count number of clients in the selected monitor */ | |
| - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); | |
| - if (n == 0) | |
| - return; | |
| - | |
| - /* initialize nmaster area */ | |
| - if (n > m->nmaster) { | |
| - /* go mfact box in the center if more than nmaster clients */ | |
| - if (m->ww > m->wh) { | |
| - mw = m->nmaster ? m->ww * m->mfact : 0; | |
| - mh = m->nmaster ? m->wh * 0.9 : 0; | |
| - } else { | |
| - mh = m->nmaster ? m->wh * m->mfact : 0; | |
| - mw = m->nmaster ? m->ww * 0.9 : 0; | |
| - } | |
| - mx = mxo = (m->ww - mw) / 2; | |
| - my = myo = (m->wh - mh) / 2; | |
| - } else { | |
| - /* go fullscreen if all clients are in the master area */ | |
| - mh = m->wh; | |
| - mw = m->ww; | |
| - mx = mxo = 0; | |
| - my = myo = 0; | |
| - } | |
| - | |
| - for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), … | |
| - if (i < m->nmaster) { | |
| - /* nmaster clients are stacked horizontally, in the center | |
| - * of the screen */ | |
| - w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); | |
| - resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), | |
| - mh - (2*c->bw), 0); | |
| - mx += WIDTH(c); | |
| - } else { | |
| - /* stack clients are stacked horizontally */ | |
| - w = (m->ww - tx) / (n - i); | |
| - resize(c, m->wx + tx, m->wy, w - (2*c->bw), | |
| - m->wh - (2*c->bw), 0); | |
| - tx += WIDTH(c); | |
| - } | |
| -} | |
| diff --git a/suckless/dwm/patches/01-dwm-systray-6.4.diff b/suckless/dwm/patche… | |
| @@ -1,746 +0,0 @@ | |
| -diff --git a/config.def.h b/config.def.h | |
| -index 9efa774..750529d 100644 | |
| ---- a/config.def.h | |
| -+++ b/config.def.h | |
| -@@ -3,6 +3,11 @@ | |
| - /* appearance */ | |
| - static const unsigned int borderpx = 1; /* border pixel of windows */ | |
| - static const unsigned int snap = 32; /* snap pixel */ | |
| -+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows … | |
| -+static const unsigned int systrayonleft = 0; /* 0: systray in the right co… | |
| -+static const unsigned int systrayspacing = 2; /* systray spacing */ | |
| -+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, displ… | |
| -+static const int showsystray = 1; /* 0 means no systray */ | |
| - static const int showbar = 1; /* 0 means no bar */ | |
| - static const int topbar = 1; /* 0 means bottom bar */ | |
| - static const char *fonts[] = { "monospace:size=10" }; | |
| -@@ -101,8 +106,8 @@ static const Key keys[] = { | |
| - /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClient… | |
| - static const Button buttons[] = { | |
| - /* click event mask button function … | |
| -- { ClkLtSymbol, 0, Button1, setlayout, … | |
| -- { ClkLtSymbol, 0, Button3, setlayout, … | |
| -+ { ClkTagBar, MODKEY, Button1, tag, … | |
| -+ { ClkTagBar, MODKEY, Button3, toggletag, … | |
| - { ClkWinTitle, 0, Button2, zoom, … | |
| - { ClkStatusText, 0, Button2, spawn, … | |
| - { ClkClientWin, MODKEY, Button1, movemouse, … | |
| -diff --git a/dwm.c b/dwm.c | |
| -index 03baf42..4611a03 100644 | |
| ---- a/dwm.c | |
| -+++ b/dwm.c | |
| -@@ -57,12 +57,27 @@ | |
| - #define TAGMASK ((1 << LENGTH(tags)) - 1) | |
| - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) | |
| - | |
| -+#define SYSTEM_TRAY_REQUEST_DOCK 0 | |
| -+/* XEMBED messages */ | |
| -+#define XEMBED_EMBEDDED_NOTIFY 0 | |
| -+#define XEMBED_WINDOW_ACTIVATE 1 | |
| -+#define XEMBED_FOCUS_IN 4 | |
| -+#define XEMBED_MODALITY_ON 10 | |
| -+#define XEMBED_MAPPED (1 << 0) | |
| -+#define XEMBED_WINDOW_ACTIVATE 1 | |
| -+#define XEMBED_WINDOW_DEACTIVATE 2 | |
| -+#define VERSION_MAJOR 0 | |
| -+#define VERSION_MINOR 0 | |
| -+#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR | |
| -+ | |
| - /* enums */ | |
| - enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ | |
| - enum { SchemeNorm, SchemeSel }; /* color schemes */ | |
| - enum { NetSupported, NetWMName, NetWMState, NetWMCheck, | |
| -+ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTra… | |
| - NetWMFullscreen, NetActiveWindow, NetWMWindowType, | |
| - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ | |
| -+enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ | |
| - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atom… | |
| - enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, | |
| - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ | |
| -@@ -141,6 +156,12 @@ typedef struct { | |
| - int monitor; | |
| - } Rule; | |
| - | |
| -+typedef struct Systray Systray; | |
| -+struct Systray { | |
| -+ Window win; | |
| -+ Client *icons; | |
| -+}; | |
| -+ | |
| - /* function declarations */ | |
| - static void applyrules(Client *c); | |
| - static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int inte… | |
| -@@ -172,6 +193,7 @@ static void focusstack(const Arg *arg); | |
| - static Atom getatomprop(Client *c, Atom prop); | |
| - static int getrootptr(int *x, int *y); | |
| - static long getstate(Window w); | |
| -+static unsigned int getsystraywidth(); | |
| - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); | |
| - static void grabbuttons(Client *c, int focused); | |
| - static void grabkeys(void); | |
| -@@ -189,13 +211,16 @@ static void pop(Client *c); | |
| - static void propertynotify(XEvent *e); | |
| - static void quit(const Arg *arg); | |
| - static Monitor *recttomon(int x, int y, int w, int h); | |
| -+static void removesystrayicon(Client *i); | |
| - static void resize(Client *c, int x, int y, int w, int h, int interact); | |
| -+static void resizebarwin(Monitor *m); | |
| - static void resizeclient(Client *c, int x, int y, int w, int h); | |
| - static void resizemouse(const Arg *arg); | |
| -+static void resizerequest(XEvent *e); | |
| - static void restack(Monitor *m); | |
| - static void run(void); | |
| - static void scan(void); | |
| --static int sendevent(Client *c, Atom proto); | |
| -+static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, … | |
| - static void sendmon(Client *c, Monitor *m); | |
| - static void setclientstate(Client *c, long state); | |
| - static void setfocus(Client *c); | |
| -@@ -207,6 +232,7 @@ static void seturgent(Client *c, int urg); | |
| - static void showhide(Client *c); | |
| - static void sigchld(int unused); | |
| - static void spawn(const Arg *arg); | |
| -+static Monitor *systraytomon(Monitor *m); | |
| - static void tag(const Arg *arg); | |
| - static void tagmon(const Arg *arg); | |
| - static void tile(Monitor *m); | |
| -@@ -224,18 +250,23 @@ static int updategeom(void); | |
| - static void updatenumlockmask(void); | |
| - static void updatesizehints(Client *c); | |
| - static void updatestatus(void); | |
| -+static void updatesystray(void); | |
| -+static void updatesystrayicongeom(Client *i, int w, int h); | |
| -+static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); | |
| - static void updatetitle(Client *c); | |
| - static void updatewindowtype(Client *c); | |
| - static void updatewmhints(Client *c); | |
| - static void view(const Arg *arg); | |
| - static Client *wintoclient(Window w); | |
| - static Monitor *wintomon(Window w); | |
| -+static Client *wintosystrayicon(Window w); | |
| - static int xerror(Display *dpy, XErrorEvent *ee); | |
| - static int xerrordummy(Display *dpy, XErrorEvent *ee); | |
| - static int xerrorstart(Display *dpy, XErrorEvent *ee); | |
| - static void zoom(const Arg *arg); | |
| - | |
| - /* variables */ | |
| -+static Systray *systray = NULL; | |
| - static const char broken[] = "broken"; | |
| - static char stext[256]; | |
| - static int screen; | |
| -@@ -258,9 +289,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { | |
| - [MapRequest] = maprequest, | |
| - [MotionNotify] = motionnotify, | |
| - [PropertyNotify] = propertynotify, | |
| -+ [ResizeRequest] = resizerequest, | |
| - [UnmapNotify] = unmapnotify | |
| - }; | |
| --static Atom wmatom[WMLast], netatom[NetLast]; | |
| -+static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; | |
| - static int running = 1; | |
| - static Cur *cursor[CurLast]; | |
| - static Clr **scheme; | |
| -@@ -442,7 +474,7 @@ buttonpress(XEvent *e) | |
| - arg.ui = 1 << i; | |
| - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) | |
| - click = ClkLtSymbol; | |
| -- else if (ev->x > selmon->ww - (int)TEXTW(stext)) | |
| -+ else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystrayw… | |
| - click = ClkStatusText; | |
| - else | |
| - click = ClkWinTitle; | |
| -@@ -485,6 +517,13 @@ cleanup(void) | |
| - XUngrabKey(dpy, AnyKey, AnyModifier, root); | |
| - while (mons) | |
| - cleanupmon(mons); | |
| -+ | |
| -+ if (showsystray) { | |
| -+ XUnmapWindow(dpy, systray->win); | |
| -+ XDestroyWindow(dpy, systray->win); | |
| -+ free(systray); | |
| -+ } | |
| -+ | |
| - for (i = 0; i < CurLast; i++) | |
| - drw_cur_free(drw, cursor[i]); | |
| - for (i = 0; i < LENGTH(colors); i++) | |
| -@@ -516,9 +555,58 @@ cleanupmon(Monitor *mon) | |
| - void | |
| - clientmessage(XEvent *e) | |
| - { | |
| -+ XWindowAttributes wa; | |
| -+ XSetWindowAttributes swa; | |
| - XClientMessageEvent *cme = &e->xclient; | |
| - Client *c = wintoclient(cme->window); | |
| - | |
| -+ if (showsystray && cme->window == systray->win && cme->message_type =… | |
| -+ /* add systray icons */ | |
| -+ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { | |
| -+ if (!(c = (Client *)calloc(1, sizeof(Client)))) | |
| -+ die("fatal: could not malloc() %u bytes\n", s… | |
| -+ if (!(c->win = cme->data.l[2])) { | |
| -+ free(c); | |
| -+ return; | |
| -+ } | |
| -+ c->mon = selmon; | |
| -+ c->next = systray->icons; | |
| -+ systray->icons = c; | |
| -+ if (!XGetWindowAttributes(dpy, c->win, &wa)) { | |
| -+ /* use sane defaults */ | |
| -+ wa.width = bh; | |
| -+ wa.height = bh; | |
| -+ wa.border_width = 0; | |
| -+ } | |
| -+ c->x = c->oldx = c->y = c->oldy = 0; | |
| -+ c->w = c->oldw = wa.width; | |
| -+ c->h = c->oldh = wa.height; | |
| -+ c->oldbw = wa.border_width; | |
| -+ c->bw = 0; | |
| -+ c->isfloating = True; | |
| -+ /* reuse tags field as mapped status */ | |
| -+ c->tags = 1; | |
| -+ updatesizehints(c); | |
| -+ updatesystrayicongeom(c, wa.width, wa.height); | |
| -+ XAddToSaveSet(dpy, c->win); | |
| -+ XSelectInput(dpy, c->win, StructureNotifyMask | Prope… | |
| -+ XReparentWindow(dpy, c->win, systray->win, 0, 0); | |
| -+ /* use parents background color */ | |
| -+ swa.background_pixel = scheme[SchemeNorm][ColBg].pix… | |
| -+ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &sw… | |
| -+ sendevent(c->win, netatom[Xembed], StructureNotifyMas… | |
| -+ /* FIXME not sure if I have to send these events, too… | |
| -+ sendevent(c->win, netatom[Xembed], StructureNotifyMas… | |
| -+ sendevent(c->win, netatom[Xembed], StructureNotifyMas… | |
| -+ sendevent(c->win, netatom[Xembed], StructureNotifyMas… | |
| -+ XSync(dpy, False); | |
| -+ resizebarwin(selmon); | |
| -+ updatesystray(); | |
| -+ setclientstate(c, NormalState); | |
| -+ } | |
| -+ return; | |
| -+ } | |
| -+ | |
| - if (!c) | |
| - return; | |
| - if (cme->message_type == netatom[NetWMState]) { | |
| -@@ -571,7 +659,7 @@ configurenotify(XEvent *e) | |
| - for (c = m->clients; c; c = c->next) | |
| - if (c->isfullscreen) | |
| - resizeclient(c, m->mx, m->my,… | |
| -- XMoveResizeWindow(dpy, m->barwin, m->wx, m->b… | |
| -+ resizebarwin(m); | |
| - } | |
| - focus(NULL); | |
| - arrange(NULL); | |
| -@@ -656,6 +744,11 @@ destroynotify(XEvent *e) | |
| - | |
| - if ((c = wintoclient(ev->window))) | |
| - unmanage(c, 1); | |
| -+ else if ((c = wintosystrayicon(ev->window))) { | |
| -+ removesystrayicon(c); | |
| -+ resizebarwin(selmon); | |
| -+ updatesystray(); | |
| -+ } | |
| - } | |
| - | |
| - void | |
| -@@ -699,7 +792,7 @@ dirtomon(int dir) | |
| - void | |
| - drawbar(Monitor *m) | |
| - { | |
| -- int x, w, tw = 0; | |
| -+ int x, w, tw = 0, stw = 0; | |
| - int boxs = drw->fonts->h / 9; | |
| - int boxw = drw->fonts->h / 6 + 2; | |
| - unsigned int i, occ = 0, urg = 0; | |
| -@@ -708,13 +801,17 @@ drawbar(Monitor *m) | |
| - if (!m->showbar) | |
| - return; | |
| - | |
| -+ if(showsystray && m == systraytomon(m) && !systrayonleft) | |
| -+ stw = getsystraywidth(); | |
| -+ | |
| - /* draw status first so it can be overdrawn by tags later */ | |
| - if (m == selmon) { /* status is only drawn on selected monitor */ | |
| - drw_setscheme(drw, scheme[SchemeNorm]); | |
| -- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ | |
| -- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); | |
| -+ tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding… | |
| -+ drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, ste… | |
| - } | |
| - | |
| -+ resizebarwin(m); | |
| - for (c = m->clients; c; c = c->next) { | |
| - occ |= c->tags; | |
| - if (c->isurgent) | |
| -@@ -735,7 +832,7 @@ drawbar(Monitor *m) | |
| - drw_setscheme(drw, scheme[SchemeNorm]); | |
| - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); | |
| - | |
| -- if ((w = m->ww - tw - x) > bh) { | |
| -+ if ((w = m->ww - tw - stw - x) > bh) { | |
| - if (m->sel) { | |
| - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : S… | |
| - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0… | |
| -@@ -746,7 +843,7 @@ drawbar(Monitor *m) | |
| - drw_rect(drw, x, 0, w, bh, 1, 1); | |
| - } | |
| - } | |
| -- drw_map(drw, m->barwin, 0, 0, m->ww, bh); | |
| -+ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); | |
| - } | |
| - | |
| - void | |
| -@@ -783,8 +880,11 @@ expose(XEvent *e) | |
| - Monitor *m; | |
| - XExposeEvent *ev = &e->xexpose; | |
| - | |
| -- if (ev->count == 0 && (m = wintomon(ev->window))) | |
| -+ if (ev->count == 0 && (m = wintomon(ev->window))) { | |
| - drawbar(m); | |
| -+ if (m == selmon) | |
| -+ updatesystray(); | |
| -+ } | |
| - } | |
| - | |
| - void | |
| -@@ -870,14 +970,32 @@ getatomprop(Client *c, Atom prop) | |
| - unsigned char *p = NULL; | |
| - Atom da, atom = None; | |
| - | |
| -- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_… | |
| -+ /* FIXME getatomprop should return the number of items and a pointer … | |
| -+ * the stored data instead of this workaround */ | |
| -+ Atom req = XA_ATOM; | |
| -+ if (prop == xatom[XembedInfo]) | |
| -+ req = xatom[XembedInfo]; | |
| -+ | |
| -+ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, | |
| - &da, &di, &dl, &dl, &p) == Success && p) { | |
| - atom = *(Atom *)p; | |
| -+ if (da == xatom[XembedInfo] && dl == 2) | |
| -+ atom = ((Atom *)p)[1]; | |
| - XFree(p); | |
| - } | |
| - return atom; | |
| - } | |
| - | |
| -+unsigned int | |
| -+getsystraywidth() | |
| -+{ | |
| -+ unsigned int w = 0; | |
| -+ Client *i; | |
| -+ if(showsystray) | |
| -+ for(i = systray->icons; i; w += i->w + systrayspacing, i = i-… | |
| -+ return w ? w + systrayspacing : 1; | |
| -+} | |
| -+ | |
| - int | |
| - getrootptr(int *x, int *y) | |
| - { | |
| -@@ -1018,7 +1136,8 @@ killclient(const Arg *arg) | |
| - { | |
| - if (!selmon->sel) | |
| - return; | |
| -- if (!sendevent(selmon->sel, wmatom[WMDelete])) { | |
| -+ | |
| -+ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmato… | |
| - XGrabServer(dpy); | |
| - XSetErrorHandler(xerrordummy); | |
| - XSetCloseDownMode(dpy, DestroyAll); | |
| -@@ -1105,6 +1224,13 @@ maprequest(XEvent *e) | |
| - static XWindowAttributes wa; | |
| - XMapRequestEvent *ev = &e->xmaprequest; | |
| - | |
| -+ Client *i; | |
| -+ if ((i = wintosystrayicon(ev->window))) { | |
| -+ sendevent(i->win, netatom[Xembed], StructureNotifyMask, Curre… | |
| -+ resizebarwin(selmon); | |
| -+ updatesystray(); | |
| -+ } | |
| -+ | |
| - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redire… | |
| - return; | |
| - if (!wintoclient(ev->window)) | |
| -@@ -1226,6 +1352,17 @@ propertynotify(XEvent *e) | |
| - Window trans; | |
| - XPropertyEvent *ev = &e->xproperty; | |
| - | |
| -+ if ((c = wintosystrayicon(ev->window))) { | |
| -+ if (ev->atom == XA_WM_NORMAL_HINTS) { | |
| -+ updatesizehints(c); | |
| -+ updatesystrayicongeom(c, c->w, c->h); | |
| -+ } | |
| -+ else | |
| -+ updatesystrayiconstate(c, ev); | |
| -+ resizebarwin(selmon); | |
| -+ updatesystray(); | |
| -+ } | |
| -+ | |
| - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) | |
| - updatestatus(); | |
| - else if (ev->state == PropertyDelete) | |
| -@@ -1276,6 +1413,19 @@ recttomon(int x, int y, int w, int h) | |
| - return r; | |
| - } | |
| - | |
| -+void | |
| -+removesystrayicon(Client *i) | |
| -+{ | |
| -+ Client **ii; | |
| -+ | |
| -+ if (!showsystray || !i) | |
| -+ return; | |
| -+ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); | |
| -+ if (ii) | |
| -+ *ii = i->next; | |
| -+ free(i); | |
| -+} | |
| -+ | |
| - void | |
| - resize(Client *c, int x, int y, int w, int h, int interact) | |
| - { | |
| -@@ -1283,6 +1433,14 @@ resize(Client *c, int x, int y, int w, int h, int inter… | |
| - resizeclient(c, x, y, w, h); | |
| - } | |
| - | |
| -+void | |
| -+resizebarwin(Monitor *m) { | |
| -+ unsigned int w = m->ww; | |
| -+ if (showsystray && m == systraytomon(m) && !systrayonleft) | |
| -+ w -= getsystraywidth(); | |
| -+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); | |
| -+} | |
| -+ | |
| - void | |
| - resizeclient(Client *c, int x, int y, int w, int h) | |
| - { | |
| -@@ -1298,6 +1456,19 @@ resizeclient(Client *c, int x, int y, int w, int h) | |
| - XSync(dpy, False); | |
| - } | |
| - | |
| -+void | |
| -+resizerequest(XEvent *e) | |
| -+{ | |
| -+ XResizeRequestEvent *ev = &e->xresizerequest; | |
| -+ Client *i; | |
| -+ | |
| -+ if ((i = wintosystrayicon(ev->window))) { | |
| -+ updatesystrayicongeom(i, ev->width, ev->height); | |
| -+ resizebarwin(selmon); | |
| -+ updatesystray(); | |
| -+ } | |
| -+} | |
| -+ | |
| - void | |
| - resizemouse(const Arg *arg) | |
| - { | |
| -@@ -1444,26 +1615,37 @@ setclientstate(Client *c, long state) | |
| - } | |
| - | |
| - int | |
| --sendevent(Client *c, Atom proto) | |
| -+sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3,… | |
| - { | |
| - int n; | |
| -- Atom *protocols; | |
| -+ Atom *protocols, mt; | |
| - int exists = 0; | |
| - XEvent ev; | |
| - | |
| -- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { | |
| -- while (!exists && n--) | |
| -- exists = protocols[n] == proto; | |
| -- XFree(protocols); | |
| -+ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { | |
| -+ mt = wmatom[WMProtocols]; | |
| -+ if (XGetWMProtocols(dpy, w, &protocols, &n)) { | |
| -+ while (!exists && n--) | |
| -+ exists = protocols[n] == proto; | |
| -+ XFree(protocols); | |
| -+ } | |
| -+ } | |
| -+ else { | |
| -+ exists = True; | |
| -+ mt = proto; | |
| - } | |
| -+ | |
| - if (exists) { | |
| - ev.type = ClientMessage; | |
| -- ev.xclient.window = c->win; | |
| -- ev.xclient.message_type = wmatom[WMProtocols]; | |
| -+ ev.xclient.window = w; | |
| -+ ev.xclient.message_type = mt; | |
| - ev.xclient.format = 32; | |
| -- ev.xclient.data.l[0] = proto; | |
| -- ev.xclient.data.l[1] = CurrentTime; | |
| -- XSendEvent(dpy, c->win, False, NoEventMask, &ev); | |
| -+ ev.xclient.data.l[0] = d0; | |
| -+ ev.xclient.data.l[1] = d1; | |
| -+ ev.xclient.data.l[2] = d2; | |
| -+ ev.xclient.data.l[3] = d3; | |
| -+ ev.xclient.data.l[4] = d4; | |
| -+ XSendEvent(dpy, w, False, mask, &ev); | |
| - } | |
| - return exists; | |
| - } | |
| -@@ -1477,7 +1659,7 @@ setfocus(Client *c) | |
| - XA_WINDOW, 32, PropModeReplace, | |
| - (unsigned char *) &(c->win), 1); | |
| - } | |
| -- sendevent(c, wmatom[WMTakeFocus]); | |
| -+ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocu… | |
| - } | |
| - | |
| - void | |
| -@@ -1566,6 +1748,10 @@ setup(void) | |
| - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); | |
| - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", Fal… | |
| - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | |
| -+ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", Fals… | |
| -+ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE"… | |
| -+ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRA… | |
| -+ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM… | |
| - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); | |
| - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); | |
| - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", Fa… | |
| -@@ -1573,6 +1759,9 @@ setup(void) | |
| - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", Fa… | |
| - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYP… | |
| - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); | |
| -+ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); | |
| -+ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); | |
| -+ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); | |
| - /* init cursors */ | |
| - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); | |
| - cursor[CurResize] = drw_cur_create(drw, XC_sizing); | |
| -@@ -1581,6 +1770,8 @@ setup(void) | |
| - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); | |
| - for (i = 0; i < LENGTH(colors); i++) | |
| - scheme[i] = drw_scm_create(drw, colors[i], 3); | |
| -+ /* init system tray */ | |
| -+ updatesystray(); | |
| - /* init bars */ | |
| - updatebars(); | |
| - updatestatus(); | |
| -@@ -1711,7 +1902,18 @@ togglebar(const Arg *arg) | |
| - { | |
| - selmon->showbar = !selmon->showbar; | |
| - updatebarpos(selmon); | |
| -- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon… | |
| -+ resizebarwin(selmon); | |
| -+ if (showsystray) { | |
| -+ XWindowChanges wc; | |
| -+ if (!selmon->showbar) | |
| -+ wc.y = -bh; | |
| -+ else if (selmon->showbar) { | |
| -+ wc.y = 0; | |
| -+ if (!selmon->topbar) | |
| -+ wc.y = selmon->mh - bh; | |
| -+ } | |
| -+ XConfigureWindow(dpy, systray->win, CWY, &wc); | |
| -+ } | |
| - arrange(selmon); | |
| - } | |
| - | |
| -@@ -1807,11 +2009,18 @@ unmapnotify(XEvent *e) | |
| - else | |
| - unmanage(c, 0); | |
| - } | |
| -+ else if ((c = wintosystrayicon(ev->window))) { | |
| -+ /* KLUDGE! sometimes icons occasionally unmap their windows, … | |
| -+ * _not_ destroy them. We map those windows back */ | |
| -+ XMapRaised(dpy, c->win); | |
| -+ updatesystray(); | |
| -+ } | |
| - } | |
| - | |
| - void | |
| - updatebars(void) | |
| - { | |
| -+ unsigned int w; | |
| - Monitor *m; | |
| - XSetWindowAttributes wa = { | |
| - .override_redirect = True, | |
| -@@ -1822,10 +2031,15 @@ updatebars(void) | |
| - for (m = mons; m; m = m->next) { | |
| - if (m->barwin) | |
| - continue; | |
| -- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh,… | |
| -+ w = m->ww; | |
| -+ if (showsystray && m == systraytomon(m)) | |
| -+ w -= getsystraywidth(); | |
| -+ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, … | |
| - CopyFromParent, DefaultVisual(dpy, screen), | |
| - CWOverrideRedirect|CWBackPixmap|CWEventMask, … | |
| - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); | |
| -+ if (showsystray && m == systraytomon(m)) | |
| -+ XMapRaised(dpy, systray->win); | |
| - XMapRaised(dpy, m->barwin); | |
| - XSetClassHint(dpy, m->barwin, &ch); | |
| - } | |
| -@@ -2002,6 +2216,125 @@ updatestatus(void) | |
| - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) | |
| - strcpy(stext, "dwm-"VERSION); | |
| - drawbar(selmon); | |
| -+ updatesystray(); | |
| -+} | |
| -+ | |
| -+ | |
| -+void | |
| -+updatesystrayicongeom(Client *i, int w, int h) | |
| -+{ | |
| -+ if (i) { | |
| -+ i->h = bh; | |
| -+ if (w == h) | |
| -+ i->w = bh; | |
| -+ else if (h == bh) | |
| -+ i->w = w; | |
| -+ else | |
| -+ i->w = (int) ((float)bh * ((float)w / (float)h)); | |
| -+ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); | |
| -+ /* force icons into the systray dimensions if they don't want… | |
| -+ if (i->h > bh) { | |
| -+ if (i->w == i->h) | |
| -+ i->w = bh; | |
| -+ else | |
| -+ i->w = (int) ((float)bh * ((float)i->w / (flo… | |
| -+ i->h = bh; | |
| -+ } | |
| -+ } | |
| -+} | |
| -+ | |
| -+void | |
| -+updatesystrayiconstate(Client *i, XPropertyEvent *ev) | |
| -+{ | |
| -+ long flags; | |
| -+ int code = 0; | |
| -+ | |
| -+ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || | |
| -+ !(flags = getatomprop(i, xatom[XembedInfo]))) | |
| -+ return; | |
| -+ | |
| -+ if (flags & XEMBED_MAPPED && !i->tags) { | |
| -+ i->tags = 1; | |
| -+ code = XEMBED_WINDOW_ACTIVATE; | |
| -+ XMapRaised(dpy, i->win); | |
| -+ setclientstate(i, NormalState); | |
| -+ } | |
| -+ else if (!(flags & XEMBED_MAPPED) && i->tags) { | |
| -+ i->tags = 0; | |
| -+ code = XEMBED_WINDOW_DEACTIVATE; | |
| -+ XUnmapWindow(dpy, i->win); | |
| -+ setclientstate(i, WithdrawnState); | |
| -+ } | |
| -+ else | |
| -+ return; | |
| -+ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, co… | |
| -+ systray->win, XEMBED_EMBEDDED_VERSION); | |
| -+} | |
| -+ | |
| -+void | |
| -+updatesystray(void) | |
| -+{ | |
| -+ XSetWindowAttributes wa; | |
| -+ XWindowChanges wc; | |
| -+ Client *i; | |
| -+ Monitor *m = systraytomon(NULL); | |
| -+ unsigned int x = m->mx + m->mw; | |
| -+ unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; | |
| -+ unsigned int w = 1; | |
| -+ | |
| -+ if (!showsystray) | |
| -+ return; | |
| -+ if (systrayonleft) | |
| -+ x -= sw + lrpad / 2; | |
| -+ if (!systray) { | |
| -+ /* init systray */ | |
| -+ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) | |
| -+ die("fatal: could not malloc() %u bytes\n", sizeof(Sy… | |
| -+ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh… | |
| -+ wa.event_mask = ButtonPressMask | ExposureMask; | |
| -+ wa.override_redirect = True; | |
| -+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | |
| -+ XSelectInput(dpy, systray->win, SubstructureNotifyMask); | |
| -+ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrien… | |
| -+ PropModeReplace, (unsigned char *)&netatom[Ne… | |
| -+ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOver… | |
| -+ XMapRaised(dpy, systray->win); | |
| -+ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win,… | |
| -+ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systra… | |
| -+ sendevent(root, xatom[Manager], StructureNotifyMask, … | |
| -+ XSync(dpy, False); | |
| -+ } | |
| -+ else { | |
| -+ fprintf(stderr, "dwm: unable to obtain system tray.\n… | |
| -+ free(systray); | |
| -+ systray = NULL; | |
| -+ return; | |
| -+ } | |
| -+ } | |
| -+ for (w = 0, i = systray->icons; i; i = i->next) { | |
| -+ /* make sure the background color stays the same */ | |
| -+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; | |
| -+ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); | |
| -+ XMapRaised(dpy, i->win); | |
| -+ w += systrayspacing; | |
| -+ i->x = w; | |
| -+ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); | |
| -+ w += i->w; | |
| -+ if (i->mon != m) | |
| -+ i->mon = m; | |
| -+ } | |
| -+ w = w ? w + systrayspacing : 1; | |
| -+ x -= w; | |
| -+ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); | |
| -+ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; | |
| -+ wc.stack_mode = Above; wc.sibling = m->barwin; | |
| -+ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSiblin… | |
| -+ XMapWindow(dpy, systray->win); | |
| -+ XMapSubwindows(dpy, systray->win); | |
| -+ /* redraw background */ | |
| -+ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); | |
| -+ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); | |
| -+ XSync(dpy, False); | |
| - } | |
| - | |
| - void | |
| -@@ -2069,6 +2402,16 @@ wintoclient(Window w) | |
| - return NULL; | |
| - } | |
| - | |
| -+Client * | |
| -+wintosystrayicon(Window w) { | |
| -+ Client *i = NULL; | |
| -+ | |
| -+ if (!showsystray || !w) | |
| -+ return i; | |
| -+ for (i = systray->icons; i && i->win != w; i = i->next) ; | |
| -+ return i; | |
| -+} | |
| -+ | |
| - Monitor * | |
| - wintomon(Window w) | |
| - { | |
| -@@ -2122,6 +2465,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) | |
| - return -1; | |
| - } | |
| - | |
| -+Monitor * | |
| -+systraytomon(Monitor *m) { | |
| -+ Monitor *t; | |
| -+ int i, n; | |
| -+ if(!systraypinning) { | |
| -+ if(!m) | |
| -+ return selmon; | |
| -+ return m == selmon ? m : NULL; | |
| -+ } | |
| -+ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; | |
| -+ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->… | |
| -+ if(systraypinningfailfirst && n < systraypinning) | |
| -+ return mons; | |
| -+ return t; | |
| -+} | |
| -+ | |
| - void | |
| - zoom(const Arg *arg) | |
| - { | |
| diff --git a/suckless/herbe/Makefile b/suckless/herbe/Makefile | |
| @@ -1,40 +0,0 @@ | |
| -REPOSITORY = https://github.com/dudik/herbe.git | |
| -SRC_DIR = src | |
| -PINNED_REVISION = HEAD | |
| -PATCH_DIR = patches | |
| - | |
| -all: $(SRC_DIR) | |
| - | |
| -clean: reset | |
| - @if test -d $(SRC_DIR); then \ | |
| - $(MAKE) -C "${SRC_DIR}" -s clean; \ | |
| - git -C "${SRC_DIR}" clean -f; \ | |
| - fi | |
| - | |
| -$(SRC_DIR): clone reset | |
| - @cp config.h $@ | |
| - $(MAKE) -C "${SRC_DIR}" -s | |
| - | |
| -reset: | |
| - @if [ -n "$(strip $(PINNED_REVISION))" ]; then \ | |
| - git -C "${SRC_DIR}" reset --hard $(PINNED_REVISION); \ | |
| - fi | |
| - | |
| -patch: $(PATCH_DIR)/* | |
| - @for file in $^ ; do \ | |
| - patch -d "${SRC_DIR}" < $${file}; \ | |
| - done | |
| - | |
| -clone: | |
| - @if ! test -d $(SRC_DIR); then \ | |
| - git clone $(REPOSITORY) $(SRC_DIR); \ | |
| - fi | |
| - | |
| -update: clean | |
| - @git -C "${SRC_DIR}" pull | |
| - | |
| -install: | |
| - $(MAKE) -C "${SRC_DIR}" -s install | |
| - | |
| - | |
| -.PHONY: all clean update install reset clone | |
| diff --git a/suckless/herbe/config.h b/suckless/herbe/config.h | |
| @@ -1,19 +0,0 @@ | |
| -static const char *background_color = "#222222"; | |
| -static const char *border_color = "#008000"; | |
| -static const char *font_color = "#ffd7af"; | |
| -static const char *font_pattern = "Hack:pixelsize=12"; | |
| -static unsigned line_spacing = 5; | |
| -static unsigned int padding = 12; | |
| - | |
| -static unsigned int width = 300; | |
| -static unsigned int border_size = 3; | |
| -static unsigned int pos_x = 30; | |
| -static unsigned int pos_y = 60; | |
| - | |
| -enum corners { TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; | |
| -enum corners corner = TOP_RIGHT; | |
| - | |
| -static unsigned int duration = 5; /* in seconds */ | |
| - | |
| -#define DISMISS_BUTTON Button1 | |
| -#define ACTION_BUTTON Button3 | |
| diff --git a/suckless/slstatus/Makefile b/suckless/slstatus/Makefile | |
| @@ -1,35 +0,0 @@ | |
| -REPOSITORY = git://git.suckless.org/slstatus | |
| -SRC_DIR = src | |
| -PINNED_REVISION = HEAD | |
| - | |
| -all: $(SRC_DIR) | |
| - | |
| -clean: reset | |
| - @if test -d $(SRC_DIR); then \ | |
| - cd $(SRC_DIR); \ | |
| - $(MAKE) -s clean; \ | |
| - git clean -f; \ | |
| - fi | |
| - | |
| -$(SRC_DIR): clone reset | |
| - @cp config.h $@ | |
| - @cd $@ && $(MAKE) -s | |
| - | |
| -reset: | |
| - @if [ -n "$(strip $(PINNED_REVISION))" ]; then \ | |
| - cd $(SRC_DIR) && git reset --hard $(PINNED_REVISION); \ | |
| - fi | |
| - | |
| -clone: | |
| - @if ! test -d $(SRC_DIR); then \ | |
| - git clone $(REPOSITORY) $(SRC_DIR); \ | |
| - fi | |
| - | |
| -update: clean | |
| - @cd $(SRC_DIR) && git pull | |
| - | |
| -install: | |
| - $(MAKE) -C "${SRC_DIR}" -s install | |
| - | |
| - | |
| -.PHONY: all clean update install reset clone | |
| diff --git a/suckless/slstatus/config.h b/suckless/slstatus/config.h | |
| @@ -1,71 +0,0 @@ | |
| -/* See LICENSE file for copyright and license details. */ | |
| - | |
| -/* interval between updates (in ms) */ | |
| -const unsigned int interval = 1000; | |
| - | |
| -/* text to show if no value can be retrieved */ | |
| -static const char unknown_str[] = "n/a"; | |
| - | |
| -/* maximum output string length */ | |
| -#define MAXLEN 2048 | |
| - | |
| -/* | |
| - * function description argument (example) | |
| - * | |
| - * battery_perc battery percentage battery name (BAT0) | |
| - * NULL on OpenBSD/FreeBSD | |
| - * battery_remaining battery remaining HH:MM battery name (BAT0) | |
| - * NULL on OpenBSD/FreeBSD | |
| - * battery_state battery charging state battery name (BAT0) | |
| - * NULL on OpenBSD/FreeBSD | |
| - * cat read arbitrary file path | |
| - * cpu_freq cpu frequency in MHz NULL | |
| - * cpu_perc cpu usage in percent NULL | |
| - * datetime date and time format string (%F %T) | |
| - * disk_free free disk space in GB mountpoint path (/) | |
| - * disk_perc disk usage in percent mountpoint path (/) | |
| - * disk_total total disk space in GB mountpoint path (/) | |
| - * disk_used used disk space in GB mountpoint path (/) | |
| - * entropy available entropy NULL | |
| - * gid GID of current user NULL | |
| - * hostname hostname NULL | |
| - * ipv4 IPv4 address interface name (eth0) | |
| - * ipv6 IPv6 address interface name (eth0) | |
| - * kernel_release `uname -r` NULL | |
| - * keyboard_indicators caps/num lock indicators format string (c?n?) | |
| - * see keyboard_indicators… | |
| - * keymap layout (variant) of current NULL | |
| - * keymap | |
| - * load_avg load average NULL | |
| - * netspeed_rx receive network speed interface name (wlan0) | |
| - * netspeed_tx transfer network speed interface name (wlan0) | |
| - * num_files number of files in a directory path | |
| - * (/home/foo/Inbox/cur) | |
| - * ram_free free memory in GB NULL | |
| - * ram_perc memory usage in percent NULL | |
| - * ram_total total memory size in GB NULL | |
| - * ram_used used memory in GB NULL | |
| - * run_command custom shell command command (echo foo) | |
| - * swap_free free swap in GB NULL | |
| - * swap_perc swap usage in percent NULL | |
| - * swap_total total swap size in GB NULL | |
| - * swap_used used swap in GB NULL | |
| - * temp temperature in degree celsius sensor file | |
| - * (/sys/class/thermal/...) | |
| - * NULL on OpenBSD | |
| - * thermal zone on FreeBSD | |
| - * (tz0, tz1, etc.) | |
| - * uid UID of current user NULL | |
| - * uptime system uptime NULL | |
| - * username username of current user NULL | |
| - * vol_perc OSS/ALSA volume in percent mixer file (/dev/mixer) | |
| - * NULL on OpenBSD/FreeBSD | |
| - * wifi_essid WiFi ESSID interface name (wlan0) | |
| - * wifi_perc WiFi signal in percent interface name (wlan0) | |
| - */ | |
| -static const struct arg args[] = { | |
| - /* function format argument */ | |
| - { run_command, "VPN:%4s | ", "if [ `mullvad status|grep Disconnected` … | |
| - { run_command, "VOL:%4s | ", "pactl list sinks | tr ' ' '\n' | grep -m… | |
| - { datetime, "%s", "%T" }, | |
| -}; | |
| diff --git a/sway/config b/sway/config | |
| @@ -0,0 +1,87 @@ | |
| +set $mod Mod1 | |
| + | |
| +# colour theme | |
| +set $colour #013220 | |
| + | |
| +set $left h | |
| +set $down j | |
| +set $up k | |
| +set $right l | |
| + | |
| +# apps | |
| +set $term footclient -d none | |
| +set $browser qutebrowser | |
| +set $menu bemenu-run -n -p '> ' --tb '$colour' --tf '#ffffff' --hf '#444444' | |
| +set $vol pamixer | |
| + | |
| +# autostart | |
| +exec foot --server | |
| +exec wl-paste -t text --watch clipman store --no-persist | |
| +exec /usr/libexec/pipewire-launcher | |
| + | |
| +# appearance | |
| +default_border none | |
| +default_floating_border none | |
| +workspace_layout tabbed | |
| +font pango: Hack:style=Regular 2 | |
| + | |
| +# misc | |
| +xwayland enable | |
| +bar swaybar_command waybar | |
| + | |
| +# Keyboard layout | |
| +input * { | |
| + xkb_layout "gb" | |
| + xkb_variant "extd" | |
| +} | |
| + | |
| +# monitors | |
| +output HDMI-A-1 pos 0 0 res 1920x1080 | |
| +output DP-1 pos 1920 0 res 1920x1080 | |
| +#focus output DP-1 | |
| + | |
| +# workspaces | |
| +workspace 1 HDMI-A-1 | |
| +workspace 2 HDMI-A-1 | |
| +workspace 3 DP-1 | |
| +workspace 4 DP-1 | |
| + | |
| +# Keybinds | |
| +bindsym $mod+Space exec $term | |
| +bindsym $mod+p exec $menu | |
| +bindsym $mod+f exec $browser | |
| +bindsym $mod+u exec $vol -i 5 | |
| +bindsym $mod+d exec $vol -d 5 | |
| + | |
| +bindsym $mod+c kill | |
| +bindsym $mod+Shift+c reload | |
| +bindsym $mod+Shift+q exec swaymsg exit | |
| + | |
| +# Move your focus around | |
| +bindsym $mod+$left focus left | |
| +bindsym $mod+$down focus down | |
| +bindsym $mod+$up focus up | |
| +bindsym $mod+$right focus right | |
| + | |
| +# Or use $mod+[up|down|left|right] | |
| +bindsym $mod+Left focus left | |
| +bindsym $mod+Down focus down | |
| +bindsym $mod+Up focus up | |
| +bindsym $mod+Right focus right | |
| + | |
| +# Switch to workspace | |
| +bindsym $mod+1 workspace number 1 | |
| +bindsym $mod+2 workspace number 2 | |
| +bindsym $mod+3 workspace number 3 | |
| +bindsym $mod+4 workspace number 4 | |
| + | |
| +bindsym $mod+Shift+1 move container to workspace number 1 | |
| +bindsym $mod+Shift+2 move container to workspace number 2 | |
| +bindsym $mod+Shift+3 move container to workspace number 3 | |
| +bindsym $mod+Shift+4 move container to workspace number 4 | |
| + | |
| +bindsym $mod+e layout toggle split | |
| +bindsym $mod+m fullscreen | |
| +bindsym $mod+w layout tabbed | |
| + | |
| +client.focused $colour $colour $colour | |
| diff --git a/waybar/config b/waybar/config | |
| @@ -0,0 +1,65 @@ | |
| +{ | |
| + "layer": "top", | |
| + "position": "top", | |
| + | |
| + "modules-left": [ | |
| + "sway/workspaces", | |
| + "custom/right-arrow-dark" | |
| + ], | |
| + | |
| + "modules-right": [ | |
| + "custom/left-arrow-dark", | |
| + "custom/mail", | |
| + "custom/newsboat", | |
| + "pulseaudio", | |
| + "tray", | |
| + "clock" | |
| + ], | |
| + | |
| + "custom/right-arrow-dark": { | |
| + "format": "", | |
| + "tooltip": false | |
| + }, | |
| + | |
| + "custom/left-arrow-dark": { | |
| + "format": "", | |
| + "tooltip": false | |
| + }, | |
| + | |
| + "sway/workspaces": { | |
| + "disable-scroll": true, | |
| + "format": "{name}" | |
| + }, | |
| + | |
| + "clock": { | |
| + "format": "{:%H:%M}", | |
| + "tooltip": false | |
| + }, | |
| + | |
| + "pulseaudio": { | |
| + "format": "{icon} {volume:2}%", | |
| + "format-bluetooth": " {volume}%", | |
| + "format-muted": "MUTE", | |
| + "format-icons": { | |
| + "default": [ | |
| + "", | |
| + "" | |
| + ] | |
| + }, | |
| + "scroll-step": 5, | |
| + "on-click": "pamixer -t", | |
| + "on-click-right": "foot ncmpcpp" | |
| + }, | |
| + | |
| + "custom/mail": { | |
| + "format": "", | |
| + "return-type": "json", | |
| + "interval": 120, | |
| + "exec": "$HOME/.config/waybar/waybar_mail.sh", | |
| + "on-click": "foot mutt", | |
| + }, | |
| + | |
| + "tray": { | |
| + "icon-size": 15 | |
| + } | |
| +} | |
| diff --git a/waybar/style.css b/waybar/style.css | |
| @@ -0,0 +1,58 @@ | |
| +* { | |
| + font-size: 12px; | |
| + font-family: monospace; | |
| +} | |
| + | |
| +window#waybar { | |
| + background: #292b2e; | |
| + color: #fdf6e3; | |
| +} | |
| + | |
| +#workspaces, | |
| +#clock, | |
| +#custom-mail, | |
| +#custom-newsboat, | |
| +#custom-vpn, | |
| +#pulseaudio, | |
| +#tray { | |
| + background: #1a1a1a; | |
| +} | |
| + | |
| +#custom-right-arrow-dark, | |
| +#custom-left-arrow-dark { | |
| + color: #1a1a1a; | |
| +} | |
| + | |
| +#workspaces button { | |
| + padding: 0 0px; | |
| + color: #fdf6e3; | |
| +} | |
| +#workspaces button.focused { | |
| + color: #268bd2; | |
| +} | |
| +#workspaces button:hover { | |
| + box-shadow: inherit; | |
| + text-shadow: inherit; | |
| +} | |
| +#workspaces button:hover { | |
| + background: #1a1a1a; | |
| + border: #1a1a1a; | |
| + padding: 0 3px; | |
| +} | |
| + | |
| +#custom-mail.new, | |
| +#custom-newsboat.new { | |
| + color: #268bd2; | |
| +} | |
| + | |
| +#custom-vpn.connected { | |
| + color: #d22635; | |
| +} | |
| + | |
| +#clock, | |
| +#custom-mail, | |
| +#custom-newsboat, | |
| +#custom-vpn, | |
| +#pulseaudio { | |
| + padding: 0 5px; | |
| +} | |
| diff --git a/waybar/waybar_mail.sh b/waybar/waybar_mail.sh | |
| @@ -0,0 +1,12 @@ | |
| +#!/bin/sh | |
| + | |
| +maildirnew="$HOME/.mail/jay/Inbox/new/" | |
| +new="$(find $maildirnew -type f | wc -l)" | |
| + | |
| +if [ $new -gt 0 ] | |
| +then | |
| + echo "{\"text\":\"$new\",\"tooltip\":\"$new Mail\",\"class\":\"new\"}" | |
| +else | |
| + echo '{"text":"No new mail","tooltip":"","class":""}' | |
| +fi | |
| + | |
| diff --git a/waybar/waybar_newsboat.sh b/waybar/waybar_newsboat.sh | |
| @@ -0,0 +1,11 @@ | |
| +#!/usr/bin/bash | |
| + | |
| +new="$(newsboat -x print-unread | awk '{ print $1}')" | |
| + | |
| +if [ $new -gt 0 ] | |
| +then | |
| + echo "{\"text\":\"$new\",\"tooltip\":\"$new Feeds\",\"class\":\"new\"}" | |
| +else | |
| + echo '{"text":"No new feeds","tooltip":"","class":""}' | |
| +fi | |
| + |