| Removing suckless tools in favour or openbsd defaults. - dotfiles - These are m… | |
| git clone git://jay.scot/dotfiles | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 3344d07e0e3a34b3d66126d2c8958fca02d35caf | |
| parent 880272711827b8fe9ee861faa1613f3829e0e640 | |
| Author: Jay Scott <[email protected]> | |
| Date: Sat, 1 Feb 2025 12:47:52 +0000 | |
| Removing suckless tools in favour or openbsd defaults. | |
| Diffstat: | |
| M README | 3 +-- | |
| M Xdefaults | 2 -- | |
| A bin/backup | 16 ++++++++++++++++ | |
| M bin/link-handler | 15 ++++++--------- | |
| M bootstrap.sh | 2 +- | |
| A castgetrc | 44 +++++++++++++++++++++++++++++… | |
| A cwmrc | 37 +++++++++++++++++++++++++++++… | |
| M lynx/bookmarks.html | 20 ++++++++++++-------- | |
| A mutt/gruvbox | 121 +++++++++++++++++++++++++++++… | |
| M mutt/muttrc | 69 ++++-------------------------… | |
| D mutt/theme | 94 -----------------------------… | |
| A rss2email/rss2email.cfg | 126 +++++++++++++++++++++++++++++… | |
| 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 | 201 ------------------------------ | |
| 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 -----------------------------… | |
| M xsession | 3 ++- | |
| 24 files changed, 373 insertions(+), 1543 deletions(-) | |
| --- | |
| diff --git a/README b/README | |
| @@ -13,9 +13,8 @@ main desktop OS and are forever evolving. | |
| operating sys : openbsd 7.6 | |
| - window manager : dwm | |
| + window manager : cwm | |
| terminal : xterm | |
| - launcher : dmenu | |
| email : neomutt / isync / smtpd | |
| browser : firefox / lynx | |
| media : mpv | |
| diff --git a/Xdefaults b/Xdefaults | |
| @@ -2,9 +2,7 @@ xterm*FaceName: Hack | |
| xterm*FaceSize: 14 | |
| xterm*toolBar: false | |
| xterm*scrollBar: false | |
| -xterm*selectToClipboard: false | |
| xterm*loginShell: true | |
| -xterm*scrollBar: false | |
| xterm*selectToClipboard: true | |
| xterm.termName: xterm-256color | |
| diff --git a/bin/backup b/bin/backup | |
| @@ -0,0 +1,16 @@ | |
| +#!/bin/sh | |
| + | |
| +# Variables | |
| +USER_HOME="/home/jay" | |
| +BACKUP_DIR="$HOME/tmp" | |
| +BACKUP_FILE="backup_$(date +%Y%m%d).tar.gz" | |
| +REMOTE_HOST="192.168.1.100" # Replace with your remote server address | |
| +REMOTE_PATH="backup/" # Replace with the remote path to store backups | |
| + | |
| +mkdir -p "$BACKUP_DIR" | |
| +tar cvzf "$BACKUP_DIR/$BACKUP_FILE" \ | |
| + $(ls -A "$USER_HOME" | grep -v -e tmp -e media -e .cache -e .mozilla -… | |
| + | |
| +scp "$BACKUP_DIR/$BACKUP_FILE" "${REMOTE_HOST}:${REMOTE_PATH}" | |
| + | |
| +rm "$BACKUP_DIR/$BACKUP_FILE" | |
| diff --git a/bin/link-handler b/bin/link-handler | |
| @@ -1,13 +1,11 @@ | |
| #!/bin/sh | |
| -launcher="setsid" | |
| - | |
| # applications | |
| player="mpv --autofit=30% --really-quiet --no-terminal" | |
| -gemini="foot -e amfora" | |
| -gopher="foot -e w3m" | |
| -pdf="zathura" | |
| -images="swayimg" | |
| +gemini="xterm -e amfora" | |
| +gopher="xterm -e lynx" | |
| +pdf="mupdf" | |
| +images="feh" | |
| torrent="qbittorrent" | |
| uri="$1" | |
| @@ -29,10 +27,9 @@ case "$uri_lower" in | |
| *.pdf | *.ps | *.epub) | |
| $pdf "$uri" | |
| ;; | |
| - *.jpg | *.jpe | *.jpeg | *.png | *.gif | *.webp) | |
| + *.jpg | *.jpe | *.jpeg | *.png | *.gif | *.svg | *.webp) | |
| echo "in" | |
| - #$launcher "$images" "$uri" | |
| - wget -qO- $uri | $images - | |
| + $images "$uri" | |
| ;; | |
| *) | |
| $BROWSER "$uri" | |
| diff --git a/bootstrap.sh b/bootstrap.sh | |
| @@ -2,7 +2,7 @@ | |
| DOTFILES=$(pwd) | |
| -FILES='kshrc profile Xdefaults xsession' | |
| +FILES='cwmrc kshrc profile Xdefaults xsession' | |
| ROOT='bin' | |
| CONFIG='git lynx mpd mutt ncmpcpp nvim isync' | |
| diff --git a/castgetrc b/castgetrc | |
| @@ -0,0 +1,44 @@ | |
| +[*] | |
| +spool=/home/jay/media/podcasts | |
| +filename=%(date)-%(title).mp3 | |
| + | |
| + | |
| +[2600] | |
| +url=https://www.2600.com/oth-broadband.xml | |
| +spool=/home/jay/media/podcasts/offthehook | |
| + | |
| +[cory-doctorows] | |
| +url=http://feeds.feedburner.com/doctorow_podcast | |
| +spool=/home/jay/media/podcasts/cory-doctorows | |
| + | |
| +[corecursive] | |
| +url=https://link.chtbl.com/corecursive?id=corecursive&platform=rss | |
| +spool=/home/jay/media/podcasts/corecursive | |
| + | |
| +[commandlineheroes] | |
| +url=https://feeds.pacific-content.com/commandlineheroes | |
| +spool=/home/jay/media/podcasts/commandlineheroes | |
| + | |
| +[hpr] | |
| +url=http://hackerpublicradio.org/hpr_rss.php | |
| +spool=/home/jay/media/podcasts/hacker-public-radio | |
| + | |
| +[tilde-town] | |
| +url=https://tilde.town/~dozens/podcast/rss.xml | |
| +spool=/home/jay/media/podcasts/tilde-town | |
| + | |
| +[ask-noah] | |
| +url=https://feeds.fireside.fm/asknoah/rss | |
| +spool=/home/jay/media/podcasts/ask-noah | |
| + | |
| +[2.5-admins] | |
| +url=https://2.5admins.com/feed/podcast | |
| +spool=/home/jay/media/podcasts/2.5-admins | |
| + | |
| +[going-linux] | |
| +url=https://goinglinux.com/mp3podcast.xml | |
| +spool=/home/jay/media/podcasts/going-linux | |
| + | |
| +[living-adventurously] | |
| +url=https://feeds.transistor.fm/living-adventurously | |
| +spool=/home/jay/media/podcasts/living-adventurously | |
| diff --git a/cwmrc b/cwmrc | |
| @@ -0,0 +1,37 @@ | |
| +# Set default Xft(3) font | |
| +fontname "Hack:pixelsize=14:bold" | |
| + | |
| +# Turn on sticky-group mode | |
| +sticky yes | |
| + | |
| +# Appearance | |
| +borderwidth 2 | |
| + | |
| +# Autogroup some apps | |
| +autogroup 2 "Navigator,firefox-default" | |
| + | |
| +# Remove all default keybindings | |
| +unbind-key all | |
| + | |
| +# Key bindings | |
| +bind-key M-m /home/jay/bin/music | |
| +bind-key M-space xterm | |
| +bind-key M-f firefox | |
| + | |
| +bind-key M-p menu-exec | |
| +bind-key M-r restart | |
| +bind-key M-c window-close | |
| +bind-key M-q quit | |
| +bind-key M-return window-fullscreen | |
| + | |
| +bind-key M-1 group-only-1 | |
| +bind-key M-2 group-only-2 | |
| +bind-key M-3 group-only-3 | |
| +bind-key M-4 group-only-4 | |
| +bind-key MS-1 window-movetogroup-1 | |
| +bind-key MS-2 window-movetogroup-2 | |
| +bind-key MS-3 window-movetogroup-3 | |
| +bind-key MS-4 window-movetogroup-4 | |
| + | |
| +# Mouse bindings | |
| +unbind-mouse all | |
| diff --git a/lynx/bookmarks.html b/lynx/bookmarks.html | |
| @@ -12,13 +12,17 @@ | |
| <ol> | |
| <h2>Gopher</h2> | |
| <li><a href="gopher://jay.scot/">jay.scot</a></li> | |
| -<li><a href="gopher://gopher.icu/">Ian J</a> | |
| -<li><a href="gopher://hngopher.com">Hacker News</a> | |
| -<LI><a href="gopher://gopherpedia.com/">gopherpedia</a> | |
| -<LI><a href="gopher://bitreich.org/1/lawn">The Gopher Lawn</a> | |
| -<LI><a href="gopher://gopher.black/1/moku-pona">Aggregator of phlog</a> | |
| -<LI><a href="gopher://i-logout.cz/1/bongusta/">Bongusta</a> | |
| -<LI><a href="gopher://floodgap.com/">Floodgap</a> | |
| +<li><a href="gopher://1436.ninja/1/Port70News">Port 70 News</a></li> | |
| +<li><a href="gopher://hngopher.com">Hacker News</a></li> | |
| +<li><a href="gopher://gopherpedia.com/">gopherpedia</a></li> | |
| +<li><a href="gopher://bitreich.org/1/lawn">The Gopher Lawn</a></li> | |
| +<li><a href="gopher://gopher.black/1/moku-pona">Aggregator of phlog</a></li> | |
| +<li><a href="gopher://i-logout.cz/1/bongusta/">Bongusta</a></li> | |
| +<li><a href="gopher://gopher.icu/">Ian J</a></li> | |
| +<li><a href="gopher://floodgap.com/">Floodgap</a></li> | |
| <hr> | |
| <h2>Web</h2> | |
| -<LI><a href="https://text.npr.org/">NPR</a> | |
| +<li><a href="https://text.npr.org/">NPR</a></li> | |
| +<li><a href="https://neuters.de/">Reuters</a></li> | |
| +<li><a href="http://lite.cnn.com/">CNN</a></li> | |
| +</ol> | |
| diff --git a/mutt/gruvbox b/mutt/gruvbox | |
| @@ -0,0 +1,121 @@ | |
| +# gruvbox dark (contrast dark): | |
| + | |
| +# bg0 = 234 | |
| +# bg1 = 237 | |
| +# bg2 = 239 | |
| +# bg3 = 241 | |
| +# bg4 = 243 | |
| +# | |
| +# gray = 245 | |
| +# | |
| +# fg0 = 229 | |
| +# fg1 = 223 | |
| +# fg2 = 250 | |
| +# fg3 = 248 | |
| +# fg4 = 246 | |
| +# | |
| +# red = 167 | |
| +# green = 142 | |
| +# yellow = 214 | |
| +# blue = 109 | |
| +# purple = 175 | |
| +# aqua = 108 | |
| +# orange = 208 | |
| + | |
| + | |
| +# See http://www.mutt.org/doc/manual/#color | |
| + | |
| +color attachment color109 color234 | |
| +color bold color229 color234 | |
| +color error color167 color234 | |
| +color hdrdefault color246 color234 | |
| +color indicator color223 color237 | |
| +color markers color243 color234 | |
| +color normal color223 color234 | |
| +color quoted color250 color234 | |
| +color quoted1 color108 color234 | |
| +color quoted2 color250 color234 | |
| +color quoted3 color108 color234 | |
| +color quoted4 color250 color234 | |
| +color quoted5 color108 color234 | |
| +color search color234 color208 | |
| +color signature color108 color234 | |
| +color status color234 color250 | |
| +color tilde color243 color234 | |
| +color tree color142 color234 | |
| +color underline color223 color239 | |
| + | |
| +color sidebar_divider color250 color234 | |
| +color sidebar_new color142 color234 | |
| + | |
| +color index color142 color234 ~N | |
| +color index color108 color234 ~O | |
| +color index color109 color234 ~P | |
| +color index color214 color234 ~F | |
| +color index color175 color234 ~Q | |
| +color index color167 color234 ~= | |
| +color index color234 color223 ~T | |
| +color index color234 color167 ~D | |
| + | |
| +color header color214 color234 "^(To:|From:)" | |
| +color header color142 color234 "^Subject:" | |
| +color header color108 color234 "^X-Spam-Status:" | |
| +color header color108 color234 "^Received:" | |
| + | |
| +# Regex magic for URLs and hostnames | |
| +# | |
| +# Attention: BSD's regex has RE_DUP_MAX set to 255. | |
| +# | |
| +# Examples: | |
| +# http://some-service.example.com | |
| +# example.com | |
| +# a.example.com | |
| +# some-service.example.com | |
| +# example.com/ | |
| +# example.com/datenschutz | |
| +# file:///tmp/foo | |
| +# | |
| +# Non-examples: | |
| +# 1.1.1900 | |
| +# 14.02.2022/24:00 | |
| +# 23.59 | |
| +# w.l.o.g | |
| +# team.its | |
| +color body color142 color234 "[a-z]{3,255}://[[:graph:]]*" | |
| +color body color142 color234 "([-[:alnum:]]+\\.)+([0-9]{1,3}|[-[:alpha:]]+)/[[… | |
| +color body color142 color234 "([-[:alnum:]]+\\.){2,255}[-[:alpha:]]{2,10}" | |
| + | |
| +# IPv4 and IPv6 stolen from https://stackoverflow.com/questions/53497/regular-… | |
| +color body color142 color234 "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,… | |
| +color body color142 color234 "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a… | |
| + | |
| +# Mail addresses and mailto URLs | |
| +color body color208 color234 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+" | |
| +color body color208 color234 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+" | |
| + | |
| +# some simleys and stuff | |
| +color body color234 color214 "[;:]-*[)>(<lt;|]" | |
| +color body color229 color234 "\\*[- A-Za-z]+\\*" | |
| + | |
| +color body color214 color234 "^-.*PGP.*-*" | |
| +color body color142 color234 "^gpg: Good signature from" | |
| +color body color167 color234 "^gpg: Can't.*$" | |
| +color body color214 color234 "^gpg: WARNING:.*$" | |
| +color body color167 color234 "^gpg: BAD signature from" | |
| +color body color167 color234 "^gpg: Note: This key has expired!" | |
| +color body color214 color234 "^gpg: There is no indication that the signature … | |
| +color body color214 color234 "^gpg: can't handle these multiple signatures" | |
| +color body color214 color234 "^gpg: signature verification suppressed" | |
| +color body color214 color234 "^gpg: invalid node with packet of type" | |
| + | |
| +color body color142 color234 "^Good signature from:" | |
| +color body color167 color234 "^.?BAD.? signature from:" | |
| +color body color142 color234 "^Verification successful" | |
| +color body color167 color234 "^Verification [^s][^[:space:]]*$" | |
| + | |
| +color compose header color223 color234 | |
| +color compose security_encrypt color175 color234 | |
| +color compose security_sign color109 color234 | |
| +color compose security_both color142 color234 | |
| +color compose security_none color208 color234 | |
| + | |
| diff --git a/mutt/muttrc b/mutt/muttrc | |
| @@ -1,5 +1,4 @@ | |
| - | |
| -source ~/.config/mutt/theme | |
| +source ~/.config/mutt/gruvbox | |
| # info | |
| set realname = 'Jay Scott' | |
| @@ -40,7 +39,6 @@ set folder = ~/.mail | |
| set header_cache = ~/.config/mutt/cache/headers | |
| set message_cachedir = ~/.config/mutt/cache/bodies | |
| set mailcap_path = ~/.config/mutt/mailcap | |
| -set alias_file = ~/.config/mutt/aliases | |
| set tmpdir = ~/.cache/ | |
| set spoolfile = "+jay/Inbox" | |
| @@ -50,9 +48,11 @@ set record = "+jay/Sent" | |
| # inbox | |
| mailboxes ! `echo ~/.mail/jay/*` | |
| -set sort_alias = alias | |
| -set reverse_alias = yes | |
| -source $alias_file | |
| +# aliases | |
| +set alias_file = ~/.config/mutt/aliases | |
| +set sort_alias = alias | |
| +set reverse_alias = yes | |
| +source $alias_file | |
| # macros | |
| bind index g noop | |
| @@ -72,69 +72,14 @@ set pager_index_lines = 15 | |
| set pager_context = 1 | |
| set index_format = '%Z | %{%b %d %Y} | %-15.15F | %s' | |
| -# sidebar | |
| -set mail_check_stats = yes | |
| -set sidebar_visible = yes | |
| -set sidebar_width = 25 | |
| -set sidebar_short_path = yes | |
| -set sidebar_folder_indent = yes | |
| -set sidebar_format = "%B%* %?N?%N?" | |
| -set sidebar_divider_char = │ | |
| -bind index,pager \Ck sidebar-prev | |
| -bind index,pager <tab> sidebar-next | |
| -bind index,pager <backtab> sidebar-prev | |
| -bind index,pager \Cl sidebar-open | |
| - | |
| # disable help menu | |
| -set help = no | |
| +set help = yes | |
| # status bar | |
| set sidebar_delim_chars = "/" | |
| set status_chars = " *%A" | |
| set status_format = "───[ Folder: %f ]───[%r%m messages%?n… | |
| -# default | |
| -#color normal color223 color0 | |
| - | |
| -# status bar | |
| -#color status color8 color0 | |
| - | |
| -# highlight bar | |
| -#color indicator color223 color237 | |
| - | |
| -# replied to | |
| -color index color2 color0 ~Q | |
| - | |
| -# email info header | |
| -#color header color11 color0 "^(To:|From:|Date:|^Subject:)" | |
| - | |
| -# web links | |
| -color body color2 color0 "https?://[^ ]+" | |
| -color body color2 color0 "www.[^ ]+" | |
| - | |
| -# email addresss | |
| -color body color2 color0 "[-a-z_0-9.%$]+@[-a-z_0-9.]+\\.[-a-z][-a-z]+" | |
| -color body color2 color0 "mailto:[-a-z_0-9.]+@[-a-z_0-9.]+" | |
| - | |
| -# image links | |
| -color body color2 color0 "\\[image\\ [0-9]+\\]" | |
| - | |
| -# sidebar | |
| -#color sidebar_new bold color11 color0 | |
| -color sidebar_divider bold color2 color0 | |
| - | |
| -# patch syntax | |
| -color body brightwhite default ^[[:space:]].* | |
| -color body brightwhite default ^(diff).* | |
| -#color body white default ^[\-\-\-].* | |
| -color body white default ^[\+\+\+].* | |
| -color body green default ^[\+].* | |
| -color body red default ^[\-].* | |
| -color body brightblue default [@@].* | |
| -color body brightwhite default ^(\s).* | |
| -color body brightwhite default ^(Signed-off-by).* | |
| -color body brightwhite default ^(Cc) | |
| - | |
| ignore * | |
| unignore from date subject to cc | |
| unignore x-mailer | |
| diff --git a/mutt/theme b/mutt/theme | |
| @@ -1,94 +0,0 @@ | |
| - | |
| -color body color136 color234 "(jay|jay.scot)" | |
| - | |
| -# basic colors --------------------------------------------------------- | |
| -color normal color241 color234 | |
| -color error color160 color234 | |
| -color tilde color235 color234 | |
| -color message color37 color234 | |
| -color markers color160 color254 | |
| -color attachment color254 color234 | |
| -color search color61 color234 | |
| -color status color241 color235 | |
| -color indicator color234 color136 | |
| -color tree color136 color234 | |
| - | |
| -# basic monocolor screen | |
| -mono bold bold | |
| -mono underline underline | |
| -mono indicator reverse | |
| -mono error bold | |
| - | |
| -# index ---------------------------------------------------------------- | |
| - | |
| -color index color160 color234 "~A" … | |
| -color index color166 color234 "~E" … | |
| -color index color33 color234 "~N" … | |
| -color index color33 color234 "~O" … | |
| -color index color61 color234 "~Q" … | |
| -color index color240 color234 "~R" … | |
| -color index color33 color234 "~U" … | |
| -color index color33 color234 "~U~$" … | |
| -color index color241 color234 "~v" … | |
| -color index color241 color234 "~P" … | |
| -color index color37 color234 "~p!~F" … | |
| -color index color37 color234 "~N~p!~F" … | |
| -color index color37 color234 "~U~p!~F" … | |
| -color index color240 color234 "~R~p!~F" … | |
| -color index color160 color234 "~F" … | |
| -color index color160 color234 "~F~p" … | |
| -color index color160 color234 "~N~F" … | |
| -color index color160 color234 "~N~F~p" … | |
| -color index color160 color234 "~U~F~p" … | |
| -color index color235 color160 "~D" … | |
| -color index color245 color234 "~v~(!~N)" … | |
| -color index color136 color234 "~v~(~N)" … | |
| -color index color64 color234 "~N~v~(~N)" … | |
| -# statusbg used to indicated flagged when foreground color shows other status | |
| -# for collapsed thread | |
| -color index color160 color235 "~v~(~F)!~N" … | |
| -color index color136 color235 "~v~(~F~N)" … | |
| -color index color64 color235 "~N~v~(~F~N)" … | |
| -color index color64 color235 "~N~v~(~F)" … | |
| -color index color37 color235 "~v~(~p)" … | |
| -color index color136 color160 "~v~(~D)" … | |
| - | |
| -# message headers ------------------------------------------------------ | |
| - | |
| -#color header color240 color234 "^" | |
| -color hdrdefault color240 color234 | |
| -color header color241 color234 "^(From)" | |
| -color header color33 color234 "^(Subject)" | |
| - | |
| -# body ----------------------------------------------------------------- | |
| - | |
| -color quoted color33 color234 | |
| -color quoted1 color37 color234 | |
| -color quoted2 color136 color234 | |
| -color quoted3 color160 color234 | |
| -color quoted4 color166 color234 | |
| - | |
| -color signature color240 color234 | |
| -color bold color235 color234 | |
| -color underline color235 color234 | |
| -color normal color244 color234 | |
| -# | |
| -color body color245 color234 "[;:][-o][)/(|]" # emot… | |
| -color body color245 color234 "[;:][)(|]" # emot… | |
| -color body color245 color234 "[*]?((N)?ACK|CU|LOL|SCNR|… | |
| - |FWIW|vbg|GD&R|HTH|HTHBE|… | |
| - |IRL|RTFM|ROTFL|ROFL|YMMV… | |
| -color body color245 color234 "[ ][*][^*]*[*][ ]?" # mor… | |
| -color body color245 color234 "[ ]?[*][^*]*[*][ ]" # mor… | |
| - | |
| -## pgp | |
| - | |
| -color body color160 color234 "(BAD signature)" | |
| -color body color37 color234 "(Good signature)" | |
| -color body color234 color234 "^gpg: Good signature .*" | |
| -color body color241 color234 "^gpg: " | |
| -color body color241 color160 "^gpg: BAD signature from.… | |
| -mono body bold "^gpg: Good signature" | |
| -mono body bold "^gpg: BAD signature from.… | |
| -color body color160 color234 "([a-z][a-z0-9+-]*://(((([… | |
| -color body color33 color234 "( *[-+=#*~_]){6,}" | |
| diff --git a/rss2email/rss2email.cfg b/rss2email/rss2email.cfg | |
| @@ -0,0 +1,126 @@ | |
| +[DEFAULT] | |
| +from = [email protected] | |
| +user-agent = rss2email/__VERSION__ (__URL__) | |
| +use-8bit = False | |
| +force-from = True | |
| +use-publisher-email = False | |
| +name-format = {feed-title}: {author} | |
| +to = [email protected] | |
| +proxy = | |
| +feed-timeout = 60 | |
| +same-server-fetch-interval = 0 | |
| +active = True | |
| +digest = False | |
| +digest-type = multipart/digest | |
| +date-header = True | |
| +date-header-order = modified, issued, created, expired | |
| +bonus-header = | |
| +trust-guid = True | |
| +trust-link = False | |
| +reply-changes = False | |
| +encodings = US-ASCII, ISO-8859-1, UTF-8, BIG5, ISO-2022-JP | |
| +post-process = rss2email.post_process.prettify process | |
| +digest-post-process = | |
| +subject-format = {feed-title} | |
| +html-mail = False | |
| +multipart-html = False | |
| +use-css = False | |
| +css = h1 { | |
| + font: 18pt Georgia, "Times New Roman"; | |
| + } | |
| + body { | |
| + font: 12pt Arial; | |
| + } | |
| + a:link { | |
| + font: 12pt Arial; | |
| + font-weight: bold; | |
| + color: #0000cc; | |
| + } | |
| + blockquote { | |
| + font-family: monospace; | |
| + } | |
| + .header { | |
| + background: #e0ecff; | |
| + border-bottom: solid 4px #c3d9ff; | |
| + padding: 5px; | |
| + margin-top: 0px; | |
| + color: red; | |
| + } | |
| + .header a { | |
| + font-size: 20px; | |
| + text-decoration: none; | |
| + } | |
| + .footer { | |
| + background: #c3d9ff; | |
| + border-top: solid 4px #c3d9ff; | |
| + padding: 5px; | |
| + margin-bottom: 0px; | |
| + } | |
| + .entry { | |
| + border: solid 4px #c3d9ff; | |
| + } | |
| + .body { | |
| + margin-left: 5px; | |
| + margin-right: 5px; | |
| + } | |
| +unicode-snob = False | |
| +links-after-each-paragraph = False | |
| +inline-links = True | |
| +wrap-links = True | |
| +body-width = 72 | |
| +email-protocol = sendmail | |
| +sendmail = /usr/sbin/sendmail | |
| +sendmail_config = | |
| +smtp-auth = False | |
| +smtp-username = username | |
| +smtp-password = password | |
| +smtp-server = smtp.example.net | |
| +smtp-port = 465 | |
| +smtp-ssl = False | |
| +imap-auth = False | |
| +imap-username = username | |
| +imap-password = password | |
| +imap-server = imap.example.net | |
| +imap-port = 143 | |
| +imap-ssl = False | |
| +imap-mailbox = INBOX | |
| +maildir-path = ~/Maildir | |
| +maildir-mailbox = INBOX | |
| +verbose = info | |
| + | |
| +[feed.noted] | |
| +url = https://noted.lol/rss/ | |
| + | |
| +[feed.selfhosted] | |
| +url = https://selfh.st/rss/ | |
| + | |
| +[feed.planet-kernel] | |
| +url = https://planet.kernel.org/rss20.xml | |
| + | |
| +[feed.bear-blogs] | |
| +url = https://bearblog.dev/discover/feed/ | |
| + | |
| +[feed.Uninformativ] | |
| +url = https://www.uninformativ.de/blog/feeds/en.atom | |
| + | |
| +[feed.Joey-H] | |
| +url = http://joeyh.name/blog/index.rss | |
| + | |
| +[feed.Fabiensanglard] | |
| +url = https://fabiensanglard.net/rss.xml | |
| + | |
| +[feed.Pluralistic] | |
| +url = https://pluralistic.net/feed/ | |
| + | |
| +[feed.Koutsie] | |
| +url = https://k0.tel/feed.xml | |
| + | |
| +[feed.Jeff-Geerling] | |
| +url = https://www.jeffgeerling.com/blog.xml | |
| + | |
| +[feed.Lab-Notes] | |
| +url = https://labnotes.org/rss/ | |
| + | |
| +[feed.1MB-Club] | |
| +url = https://1mb.club/posts.xml | |
| + | |
| 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,201 +0,0 @@ | |
| -/* See LICENSE file for copyright and license details. */ | |
| - | |
| -#include <X11/XF86keysym.h> | |
| - | |
| -/* 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[] = { "xterm", NULL }; | |
| -static const char *webcmd[] = { "firefox", NULL }; | |
| -static const char *musiccmd[] = { "/home/jay/bin/music", NULL }; | |
| -static const char *volup[] = { "sndioctl", "output.level=+0.1", NULL }; | |
| -static const char *voldown[] = { "sndioctl", "output.level=-0.1", 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_m, spawn, {.v = music… | |
| - { MODKEY, XF86XK_AudioRaiseVolume, spawn, … | |
| - { MODKEY, XF86XK_AudioLowerVolume, spawn, … | |
| - { 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|ShiftMask, 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 = 60000; | |
| - | |
| -/* 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 curl -s https://am.i.mullvad.net/conn… | |
| - { vol_perc, "VOL:%s | ", NULL }, | |
| - { datetime, "%s", "%H:%M" }, | |
| -}; | |
| diff --git a/xsession b/xsession | |
| @@ -7,4 +7,5 @@ slstatus & | |
| mpd & | |
| # window manager | |
| -exec dwm | |
| +#exec dwm | |
| +exec cwm |