summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstkhan <personal@slickd.xyz>2021-06-23 21:21:08 -0500
committerstkhan <personal@slickd.xyz>2021-06-23 21:21:08 -0500
commitd23e1969acfdb5d6212e3e796b33963d47e01c08 (patch)
treef0fa005a5c118ad00f23c4c68fe64d0712a2a285
parent7ee7c74831b87a60291db335a272ed4ba3c27496 (diff)
sarc 1.0.0
Former-commit-id: 0154c723c80f3fec789ad09e43749cdffd0f6503
-rw-r--r--PKGBUILD24
-rwxr-xr-xbin/fs2
-rwxr-xr-xbin/ns39
-rwxr-xr-xbin/sarc_compile4
-rwxr-xr-xbin/sarc_install13
-rwxr-xr-xbin/sarc_pkgbuild30
-rwxr-xr-xdmenu-5.0/dmenubin0 -> 43512 bytes
-rw-r--r--dmenu-5.0/dmenu-xyw-5.0.diff116
-rw-r--r--dmenu-5.0/dmenu.124
-rw-r--r--dmenu-5.0/dmenu.c22
-rw-r--r--dmenu-5.0/dmenu.obin0 -> 32928 bytes
-rw-r--r--dmenu-5.0/drw.obin0 -> 10584 bytes
-rwxr-xr-xdmenu-5.0/stestbin0 -> 17096 bytes
-rw-r--r--dmenu-5.0/stest.obin0 -> 5296 bytes
-rw-r--r--dmenu-5.0/util.obin0 -> 2256 bytes
-rw-r--r--dwm-6.2/TODO1
-rw-r--r--dwm-6.2/config.def.h.orig141
-rw-r--r--dwm-6.2/config.h24
-rw-r--r--dwm-6.2/drw.obin0 -> 10528 bytes
-rwxr-xr-xdwm-6.2/dwmbin0 -> 71960 bytes
-rw-r--r--dwm-6.2/dwm.1.orig199
-rw-r--r--dwm-6.2/dwm.c34
-rw-r--r--dwm-6.2/dwm.c.orig2294
-rw-r--r--dwm-6.2/dwm.obin0 -> 62816 bytes
-rw-r--r--dwm-6.2/patches/dwm-attachabove-6.2-20200421.diff (renamed from dwm-6.2/dwm-attachabove-6.2-20200421.diff)0
-rw-r--r--dwm-6.2/patches/dwm-cool-autostart-6.2.diff (renamed from dwm-6.2/dwm-cool-autostart-6.2.diff)0
-rw-r--r--dwm-6.2/patches/dwm-scratchpad-6.2.diff90
-rw-r--r--dwm-6.2/patches/dwm-vanitygaps-20190508-6.2.diff (renamed from dwm-6.2/dwm-vanitygaps-20190508-6.2.diff)0
-rw-r--r--dwm-6.2/patches/sarc-autostart.diff (renamed from dwm-6.2/sarc-autostart.diff)0
-rw-r--r--dwm-6.2/util.obin0 -> 2256 bytes
l---------etc/FossaCursors/cursors/00000000000000020006000e7e9ffc3f1
l---------etc/FossaCursors/cursors/000081600000068100004080800101021
l---------etc/FossaCursors/cursors/03b6e0fcb3499374a867c041f52298f01
l---------etc/FossaCursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd1
l---------etc/FossaCursors/cursors/1081e37283d90000800003c07f3ef6bf1
l---------etc/FossaCursors/cursors/3085a0e285430894940527032f8b26df1
l---------etc/FossaCursors/cursors/3ecb610c1bf2410f44200f48c40d35991
l---------etc/FossaCursors/cursors/4498f0e0c1937ffe01fd06f9736658301
l---------etc/FossaCursors/cursors/5c6cd98b3f3ebcb1f9c7f1c2046304081
l---------etc/FossaCursors/cursors/6407b0e94181790501fd1e167b4748721
l---------etc/FossaCursors/cursors/640fb0e74195791501fd1ed57b41487f1
l---------etc/FossaCursors/cursors/9081237383d90e509aa00f00170e968f1
l---------etc/FossaCursors/cursors/9d800788f1b08800ae810202380a08221
l---------etc/FossaCursors/cursors/a2a266d0498c3104214a47bd64ab0fc81
-rw-r--r--etc/FossaCursors/cursors/aliasbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/all-scrollbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/b66166c04f8c3109214a4fbd64a50fc81
-rw-r--r--etc/FossaCursors/cursors/bottom_left_cornerbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/bottom_right_cornerbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/bottom_sidebin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/cellbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/center_ptrbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/circle1
l---------etc/FossaCursors/cursors/closedhand1
-rw-r--r--etc/FossaCursors/cursors/col-resizebin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/color-pickerbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/context-menubin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/copybin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/cross1
l---------etc/FossaCursors/cursors/crossed_circle1
-rw-r--r--etc/FossaCursors/cursors/crosshairbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/d9ce0ab605698f320427677b458ad60b1
-rw-r--r--etc/FossaCursors/cursors/defaultbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/dnd-copy1
-rw-r--r--etc/FossaCursors/cursors/dnd-movebin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/dnd-no-dropbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/dnd-none1
-rw-r--r--etc/FossaCursors/cursors/down-arrowbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/draftbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/e-resize1
l---------etc/FossaCursors/cursors/e29285e634086352946a0e7090d731061
l---------etc/FossaCursors/cursors/ew-resize1
l---------etc/FossaCursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff1
-rw-r--r--etc/FossaCursors/cursors/fleurbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/forbidden1
l---------etc/FossaCursors/cursors/grab1
l---------etc/FossaCursors/cursors/grabbing1
l---------etc/FossaCursors/cursors/h_double_arrow1
l---------etc/FossaCursors/cursors/half-busy1
l---------etc/FossaCursors/cursors/hand11
l---------etc/FossaCursors/cursors/hand21
-rw-r--r--etc/FossaCursors/cursors/helpbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/ibeam1
-rw-r--r--etc/FossaCursors/cursors/left-arrowbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/left_ptr1
l---------etc/FossaCursors/cursors/left_ptr_help1
l---------etc/FossaCursors/cursors/left_ptr_watch1
-rw-r--r--etc/FossaCursors/cursors/left_sidebin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/link1
l---------etc/FossaCursors/cursors/move1
l---------etc/FossaCursors/cursors/n-resize1
l---------etc/FossaCursors/cursors/ne-resize1
l---------etc/FossaCursors/cursors/nesw-resize1
-rw-r--r--etc/FossaCursors/cursors/no-dropbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/not-allowedbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/ns-resize1
l---------etc/FossaCursors/cursors/nw-resize1
l---------etc/FossaCursors/cursors/nwse-resize1
-rw-r--r--etc/FossaCursors/cursors/openhandbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/pencilbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/piratebin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/plus1
-rw-r--r--etc/FossaCursors/cursors/pointerbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/pointing_hand1
-rw-r--r--etc/FossaCursors/cursors/progressbin603628 -> 0 bytes
l---------etc/FossaCursors/cursors/question_arrow1
-rw-r--r--etc/FossaCursors/cursors/right-arrowbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/right_ptrbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/right_sidebin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/row-resizebin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/s-resize1
l---------etc/FossaCursors/cursors/sb_h_double_arrow1
l---------etc/FossaCursors/cursors/sb_v_double_arrow1
l---------etc/FossaCursors/cursors/se-resize1
l---------etc/FossaCursors/cursors/size-bdiag1
l---------etc/FossaCursors/cursors/size-fdiag1
l---------etc/FossaCursors/cursors/size-hor1
l---------etc/FossaCursors/cursors/size-ver1
l---------etc/FossaCursors/cursors/size_all1
-rw-r--r--etc/FossaCursors/cursors/size_bdiagbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/size_fdiagbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/size_horbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/size_verbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/split_h1
l---------etc/FossaCursors/cursors/split_v1
l---------etc/FossaCursors/cursors/sw-resize1
-rw-r--r--etc/FossaCursors/cursors/textbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/top_left_arrow1
-rw-r--r--etc/FossaCursors/cursors/top_left_cornerbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/top_right_cornerbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/top_sidebin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/up-arrowbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/v_double_arrow1
-rw-r--r--etc/FossaCursors/cursors/vertical-textbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/w-resize1
-rw-r--r--etc/FossaCursors/cursors/waitbin603628 -> 0 bytes
l---------etc/FossaCursors/cursors/watch1
-rw-r--r--etc/FossaCursors/cursors/wayland-cursorbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/whats_this1
-rw-r--r--etc/FossaCursors/cursors/x-cursorbin26260 -> 0 bytes
l---------etc/FossaCursors/cursors/xterm1
-rw-r--r--etc/FossaCursors/cursors/zoom-inbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/cursors/zoom-outbin26260 -> 0 bytes
-rw-r--r--etc/FossaCursors/index.theme3
-rwxr-xr-xetc/autostart.sh7
-rwxr-xr-xetc/clean6
-rwxr-xr-xetc/cursor8
-rw-r--r--etc/wallpaper/liquid_blue.wallpaper.jpgbin0 -> 1772524 bytes
-rw-r--r--etc/wallpaper/liquid_red.wallpaper.jpgbin0 -> 2525535 bytes
-rw-r--r--etc/wallpaper/nord.wallpaper.jpgbin347931 -> 1124827 bytes
-rwxr-xr-xinstall.sh54
-rw-r--r--st-0.8.4/FAQ250
-rw-r--r--st-0.8.4/LEGACY17
-rw-r--r--st-0.8.4/LICENSE (renamed from st/LICENSE)0
-rw-r--r--st-0.8.4/Makefile (renamed from st/Makefile)19
-rw-r--r--st-0.8.4/README34
-rw-r--r--st-0.8.4/TODO28
-rw-r--r--st-0.8.4/arg.h (renamed from st/arg.h)0
-rw-r--r--st-0.8.4/config.def.h487
-rw-r--r--st-0.8.4/config.h (renamed from st/config.h)147
-rw-r--r--st-0.8.4/config.mk (renamed from st/config.mk)6
-rw-r--r--st-0.8.4/patches/st-alpha-0.8.2.diff163
-rw-r--r--st-0.8.4/patches/st-blinking_cursor-20200531-a2a7044.diff150
-rw-r--r--st-0.8.4/patches/st-boxdraw_v2-0.8.3.diff600
-rw-r--r--st-0.8.4/patches/st-dynamic-cursor-color-0.8.4.diff52
-rw-r--r--st-0.8.4/patches/st-scrollback-0.8.4.diff351
-rw-r--r--st-0.8.4/patches/st-scrollback-mouse-20191024-a2c479c.diff13
-rw-r--r--st-0.8.4/st.1 (renamed from st/st.1)54
-rw-r--r--st-0.8.4/st.c (renamed from st/st.c)87
-rw-r--r--st-0.8.4/st.h (renamed from st/st.h)15
-rw-r--r--st-0.8.4/st.info (renamed from st/st.info)0
-rw-r--r--st-0.8.4/win.h (renamed from st/win.h)3
-rw-r--r--st-0.8.4/x.c (renamed from st/x.c)289
-rw-r--r--st/FUNDING.yml2
-rw-r--r--st/README.md105
-rw-r--r--st/Xdefaults127
-rw-r--r--st/boxdraw.c194
-rw-r--r--st/boxdraw_data.h214
-rw-r--r--st/hb.c140
-rw-r--r--st/hb.h7
-rwxr-xr-xst/st-copyout13
-rwxr-xr-xst/st-urlhandler19
-rw-r--r--themes/default6
-rw-r--r--themes/liquid_blue44
-rw-r--r--themes/nord2
-rw-r--r--tools/sarc-bin0 -> 16865280 bytes
-rw-r--r--tools/sarc-1.0.0.tar.xzbin0 -> 16599040 bytes
187 files changed, 2647 insertions, 4192 deletions
diff --git a/PKGBUILD b/PKGBUILD
index 6900372..20c1497 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,45 +1,55 @@
# Maintainer: SkywalkerSW5 <skywalkersw5@protonmail.com>
pkgname=sarc
-pkgver=1.0.0b2
+pkgver=1.0.0
pkgrel=1
pkgdesc="My suckless setup"
arch=('any')
url="https://github.com/SkywalkerSW5/sarc"
license=('MIT')
depends=('adobe-source-code-pro-fonts' 'libnotify' 'dunst' 'picom' 'light' 'feh' 'xorg-server' 'sx' 'pulseaudio')
-provides=('dwm' 'st' 'dmenu')
+provides=('dwm' 'st' 'vim' 'dmenu')
source=("https://github.com/SkywalkerSW5/sarc/raw/master/tools/$pkgname-$pkgver.tar.xz")
-#source=("./$pkgname-$pkgver.tar.xz")
-md5sums=("3a3f4bd3b26d5dbba6cf635ddfd37a71")
+#source=("$pkgname-$pkgver.tar.xz")
+md5sums=("fb415952de443d3ab2203f4dde5a8338")
build() {
cd dwm-6.2
+ make clean
make
- cd ../st
+ cd ../st-0.8.4
make
cd ../dmenu-5.0
make
cd ../dwmblocks
make
+ cd ..
}
+
package() {
cd dwm-6.2
make PREFIX=/usr DESTDIR="$pkgdir" install
- cd ../st
+ cd ../st-0.8.4
make PREFIX=/usr DESTDIR="$pkgdir" install
cd ../dmenu-5.0
make PREFIX=/usr DESTDIR="$pkgdir" install
cd ../dwmblocks
make PREFIX=/usr DESTDIR="$pkgdir" install
- cd ../bin
+ cd ../etc/wallpaper/
+ ls
+ pwd
+ mkdir $pkgdir/etc
+ cp blue.wallpaper.jpg $pkgdir/etc/
+ cd ../../bin
mkdir -p "$pkgdir/usr/local/bin"
cp * "$pkgdir/usr/local/bin"
cd ..
+ cp $srcdir/etc/wallpaper/blue.wallpaper.jpg $pkgdir/etc/wallpaper.jpg
mkdir -p "$pkgdir/usr/src/sarc"
cp -r $srcdir/* "$pkgdir/usr/src/sarc/"
+ echo
echo "Run ss to start sarc"
}
diff --git a/bin/fs b/bin/fs
new file mode 100755
index 0000000..4790a90
--- /dev/null
+++ b/bin/fs
@@ -0,0 +1,2 @@
+#!/bin/sh
+du -h $@
diff --git a/bin/ns b/bin/ns
deleted file mode 100755
index 5755699..0000000
--- a/bin/ns
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/bash
-# ns - A script that starts wifi
-# Uses wpa_supplicant & dhcpcd
-# Made wpa_supplicant & dhcpcd silent
-
-source /etc/ns.conf
-
-case $1 in
-
- -k)
-
- killall wpa_supplicant
- killall dhcpcd
-
- ;;
- -r)
- killall wpa_supplicant
- killall dhcpcd
-
- wpa_supplicant -c $CONFIG -B -i $INTERFACE
- dhcpcd $INTERFACE
- echo "Done"
-
- ;;
- -s)
- wpa_supplicant -s -c $CONFIG -B -i $INTERFACE &
- dhcpcd -q $INTERFACE &
-
- ;;
- *)
- echo "ns"
- echo
- echo " -s: Starts the wifi"
- echo " -r: Restarts wpa_supplicant and dhcpcd"
- echo " -k: Kills the network"
- echo
- ;;
-esac
-
diff --git a/bin/sarc_compile b/bin/sarc_compile
index 5c1a541..ea98ead 100755
--- a/bin/sarc_compile
+++ b/bin/sarc_compile
@@ -26,6 +26,7 @@ make clean
make -s
cd ../dwmblocks
+make clean
make -s
cd ../$st
@@ -33,9 +34,10 @@ make clean
make -s
cd ../$dmenu
+make clean
make -s
cd ..
-rm theme.h
+cp etc/wallpaper/$theme.wallpaper.jpg ./wallpaper.jpg
echo "Compilation is complete! Run sarc_install to install it"
diff --git a/bin/sarc_install b/bin/sarc_install
index 07e1ec3..93dddc9 100755
--- a/bin/sarc_install
+++ b/bin/sarc_install
@@ -5,13 +5,6 @@ dwm="dwm-6.2"
dmenu="dmenu-5.0"
st="st"
-echo "What theme did you choose?"
-echo
-ls themes/ && read theme
-pwd
-echo
-echo $theme
-
cd $dwm
make install
@@ -26,5 +19,7 @@ make install
cd ..
cp bin/* /usr/local/bin
-cp etc/wallpaper/$theme.wallpaper.jpg /etc/wallpaper.jpg
-rm /tmp/theme
+cp wallpaper.jpg /etc/wallpaper.jpg
+
+rm theme.h
+rm wallpaper.jpg
diff --git a/bin/sarc_pkgbuild b/bin/sarc_pkgbuild
deleted file mode 100755
index 07e1ec3..0000000
--- a/bin/sarc_pkgbuild
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-# A script that installs sarc. Run this as root
-
-dwm="dwm-6.2"
-dmenu="dmenu-5.0"
-st="st"
-
-echo "What theme did you choose?"
-echo
-ls themes/ && read theme
-pwd
-echo
-echo $theme
-
-cd $dwm
-make install
-
-cd ../$dmenu
-make install
-
-cd ../$st
-make install
-
-cd ../dwmblocks
-make install
-
-cd ..
-cp bin/* /usr/local/bin
-cp etc/wallpaper/$theme.wallpaper.jpg /etc/wallpaper.jpg
-rm /tmp/theme
diff --git a/dmenu-5.0/dmenu b/dmenu-5.0/dmenu
new file mode 100755
index 0000000..5f289da
--- /dev/null
+++ b/dmenu-5.0/dmenu
Binary files differ
diff --git a/dmenu-5.0/dmenu-xyw-5.0.diff b/dmenu-5.0/dmenu-xyw-5.0.diff
new file mode 100644
index 0000000..ddf9cfb
--- /dev/null
+++ b/dmenu-5.0/dmenu-xyw-5.0.diff
@@ -0,0 +1,116 @@
+From 7dc7cb96cdda9ad66e33109223c4cc297a7721d1 Mon Sep 17 00:00:00 2001
+From: Alex Cole <ajzcole@airmail.cc>
+Date: Tue, 6 Oct 2020 10:42:07 +1300
+Subject: [PATCH] Updated xyw for 5.0 properly
+
+---
+ dmenu.1 | 24 ++++++++++++++++++++++++
+ dmenu.c | 22 ++++++++++++++++------
+ 2 files changed, 40 insertions(+), 6 deletions(-)
+
+diff --git a/dmenu.1 b/dmenu.1
+index 323f93c..a4ecbbb 100644
+--- a/dmenu.1
++++ b/dmenu.1
+@@ -8,6 +8,12 @@ dmenu \- dynamic menu
+ .IR lines ]
+ .RB [ \-m
+ .IR monitor ]
++.RB [ \-x
++.IR xoffset ]
++.RB [ \-y
++.IR yoffset ]
++.RB [ \-z
++.IR width ]
+ .RB [ \-p
+ .IR prompt ]
+ .RB [ \-fn
+@@ -54,6 +60,24 @@ dmenu lists items vertically, with the given number of lines.
+ dmenu is displayed on the monitor number supplied. Monitor numbers are starting
+ from 0.
+ .TP
++.BI \-x " xoffset"
++dmenu is placed at this offset measured from the left side of the monitor.
++Can be negative.
++If option
++.B \-m
++is present, the measurement will use the given monitor.
++.TP
++.BI \-y " yoffset"
++dmenu is placed at this offset measured from the top of the monitor. If the
++.B \-b
++option is used, the offset is measured from the bottom. Can be negative.
++If option
++.B \-m
++is present, the measurement will use the given monitor.
++.TP
++.BI \-z " width"
++sets the width of the dmenu window.
++.TP
+ .BI \-p " prompt"
+ defines the prompt to be displayed to the left of the input field.
+ .TP
+diff --git a/dmenu.c b/dmenu.c
+index 65f25ce..7be19ae 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -37,6 +37,9 @@ struct item {
+ static char text[BUFSIZ] = "";
+ static char *embed;
+ static int bh, mw, mh;
++static int dmx = 0; /* put dmenu at this x offset */
++static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */
++static unsigned int dmw = 0; /* make dmenu this wide */
+ static int inputw = 0, promptw;
+ static int lrpad; /* sum of left and right padding */
+ static size_t cursor;
+@@ -637,9 +640,9 @@ 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;
++ x = info[i].x_org + dmx;
++ y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy);
++ mw = (dmw>0 ? dmw : info[i].width);
+ XFree(info);
+ } else
+ #endif
+@@ -647,9 +650,9 @@ 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;
++ x = dmx;
++ y = topbar ? dmy : wa.height - mh - dmy;
++ mw = (dmw>0 ? dmw : wa.width);
+ }
+ promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
+ inputw = MIN(inputw, mw/3);
+@@ -690,6 +693,7 @@ static void
+ usage(void)
+ {
+ fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
++ " [-x xoffset] [-y yoffset] [-z width]\n"
+ " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
+ exit(1);
+ }
+@@ -717,6 +721,12 @@ main(int argc, char *argv[])
+ /* these options take one argument */
+ else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
+ lines = atoi(argv[++i]);
++ else if (!strcmp(argv[i], "-x")) /* window x offset */
++ dmx = atoi(argv[++i]);
++ else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */
++ dmy = atoi(argv[++i]);
++ else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */
++ dmw = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "-m"))
+ mon = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */
+--
+2.28.0
+
diff --git a/dmenu-5.0/dmenu.1 b/dmenu-5.0/dmenu.1
index 323f93c..a4ecbbb 100644
--- a/dmenu-5.0/dmenu.1
+++ b/dmenu-5.0/dmenu.1
@@ -8,6 +8,12 @@ dmenu \- dynamic menu
.IR lines ]
.RB [ \-m
.IR monitor ]
+.RB [ \-x
+.IR xoffset ]
+.RB [ \-y
+.IR yoffset ]
+.RB [ \-z
+.IR width ]
.RB [ \-p
.IR prompt ]
.RB [ \-fn
@@ -54,6 +60,24 @@ dmenu lists items vertically, with the given number of lines.
dmenu is displayed on the monitor number supplied. Monitor numbers are starting
from 0.
.TP
+.BI \-x " xoffset"
+dmenu is placed at this offset measured from the left side of the monitor.
+Can be negative.
+If option
+.B \-m
+is present, the measurement will use the given monitor.
+.TP
+.BI \-y " yoffset"
+dmenu is placed at this offset measured from the top of the monitor. If the
+.B \-b
+option is used, the offset is measured from the bottom. Can be negative.
+If option
+.B \-m
+is present, the measurement will use the given monitor.
+.TP
+.BI \-z " width"
+sets the width of the dmenu window.
+.TP
.BI \-p " prompt"
defines the prompt to be displayed to the left of the input field.
.TP
diff --git a/dmenu-5.0/dmenu.c b/dmenu-5.0/dmenu.c
index 65f25ce..7be19ae 100644
--- a/dmenu-5.0/dmenu.c
+++ b/dmenu-5.0/dmenu.c
@@ -37,6 +37,9 @@ struct item {
static char text[BUFSIZ] = "";
static char *embed;
static int bh, mw, mh;
+static int dmx = 0; /* put dmenu at this x offset */
+static int dmy = 0; /* put dmenu at this y offset (measured from the bottom if topbar is 0) */
+static unsigned int dmw = 0; /* make dmenu this wide */
static int inputw = 0, promptw;
static int lrpad; /* sum of left and right padding */
static size_t cursor;
@@ -637,9 +640,9 @@ 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;
+ x = info[i].x_org + dmx;
+ y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy);
+ mw = (dmw>0 ? dmw : info[i].width);
XFree(info);
} else
#endif
@@ -647,9 +650,9 @@ 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;
+ x = dmx;
+ y = topbar ? dmy : wa.height - mh - dmy;
+ mw = (dmw>0 ? dmw : wa.width);
}
promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
inputw = MIN(inputw, mw/3);
@@ -690,6 +693,7 @@ static void
usage(void)
{
fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ " [-x xoffset] [-y yoffset] [-z width]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
exit(1);
}
@@ -717,6 +721,12 @@ main(int argc, char *argv[])
/* these options take one argument */
else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
lines = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "-x")) /* window x offset */
+ dmx = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "-y")) /* window y offset (from bottom up if -b) */
+ dmy = atoi(argv[++i]);
+ else if (!strcmp(argv[i], "-z")) /* make dmenu this wide */
+ dmw = atoi(argv[++i]);
else if (!strcmp(argv[i], "-m"))
mon = atoi(argv[++i]);
else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */
diff --git a/dmenu-5.0/dmenu.o b/dmenu-5.0/dmenu.o
new file mode 100644
index 0000000..b7a2661
--- /dev/null
+++ b/dmenu-5.0/dmenu.o
Binary files differ
diff --git a/dmenu-5.0/drw.o b/dmenu-5.0/drw.o
new file mode 100644
index 0000000..57700fd
--- /dev/null
+++ b/dmenu-5.0/drw.o
Binary files differ
diff --git a/dmenu-5.0/stest b/dmenu-5.0/stest
new file mode 100755
index 0000000..4225857
--- /dev/null
+++ b/dmenu-5.0/stest
Binary files differ
diff --git a/dmenu-5.0/stest.o b/dmenu-5.0/stest.o
new file mode 100644
index 0000000..4ffa357
--- /dev/null
+++ b/dmenu-5.0/stest.o
Binary files differ
diff --git a/dmenu-5.0/util.o b/dmenu-5.0/util.o
new file mode 100644
index 0000000..3b48c2f
--- /dev/null
+++ b/dmenu-5.0/util.o
Binary files differ
diff --git a/dwm-6.2/TODO b/dwm-6.2/TODO
new file mode 100644
index 0000000..2ae3ddf
--- /dev/null
+++ b/dwm-6.2/TODO
@@ -0,0 +1 @@
+- Change all SHCMD launchers to actual launchers
diff --git a/dwm-6.2/config.def.h.orig b/dwm-6.2/config.def.h.orig
deleted file mode 100644
index cab05db..0000000
--- a/dwm-6.2/config.def.h.orig
+++ /dev/null
@@ -1,141 +0,0 @@
-#include "../themes/theme.h"
-
-/* See LICENSE file for copyright and license details. */
-
-/* appearance */
-static const unsigned int borderpx = 1; /* border pixel of windows */
-static const unsigned int snap = 32; /* snap pixel */
-static const unsigned int gappih = 12; /* horiz inner gap between windows */
-static const unsigned int gappiv = 15; /* vert inner gap between windows */
-static const unsigned int gappoh = 20; /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov = 12; /* vert outer gap between windows and screen edge */
-static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */
-static const int showbar = 1; /* 0 means no bar */
-static const int topbar = 1; /* 0 means bottom bar */
-static const char *fonts[] = { "Source Code Pro:size=9" };
-static const char dmenufont[] = "Source Code Pro:size=9";
-static const char *colors[][3] = {
- /* fg bg border */
- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
- [SchemeSel] = { col_gray4, col_cyan, col_cyan },
-};
-
-/* tagging */
-static const char *tags[] = { "/", "dev", "web", "etc", };
-
-static const Rule rules[] = {
- /* xprop(1):
- * WM_CLASS(STRING) = instance, class
- * WM_NAME(STRING) = title
- */
- /* class instance title tags mask isfloating monitor */
- { "Gimp", NULL, NULL, 0, 1, -1 },
- { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
-};
-
-/* layout(s) */
-static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
-static const int nmaster = 1; /* number of clients in master area */
-static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
-
-static const Layout layouts[] = {
- /* symbol arrange function */
- { "[]=", tile }, /* first entry is default */
- { "><>", NULL }, /* no layout function means floating behavior */
- { "[M]", monocle },
-};
-
-/* key definitions */
-#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} },
-
-/* helper for spawning shell commands in the pre dwm-5.0 fashion */
-#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
-
-/* commands */
-static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
-static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
-static const char *termcmd[] = { "st", NULL };
-
-static Key keys[] = {
- /* modifier key function argument */
- { MODKEY, XK_d, spawn, {.v = dmenucmd } },
- { MODKEY, XK_Return, spawn, {.v = termcmd } },
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
-/* { MODKEY, XK_i, incnmaster, {.i = +1 } },
- { MODKEY, XK_d, incnmaster, {.i = -1 } },
-*/ { MODKEY, XK_h, setmfact, {.f = -0.05} },
- { MODKEY, XK_l, setmfact, {.f = +0.05} },
- { MODKEY|Mod4Mask, XK_h, incrgaps, {.i = +1 } },
- { MODKEY|Mod4Mask, XK_l, incrgaps, {.i = -1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_h, incrogaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_l, incrogaps, {.i = -1 } },
- { MODKEY|Mod4Mask|ControlMask, XK_h, incrigaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ControlMask, XK_l, incrigaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_0, togglegaps, {0} },
- { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} },
- { MODKEY, XK_y, incrihgaps, {.i = +1 } },
- { MODKEY, XK_o, incrihgaps, {.i = -1 } },
- { MODKEY|ControlMask, XK_y, incrivgaps, {.i = +1 } },
- { MODKEY|ControlMask, XK_o, incrivgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_y, incrohgaps, {.i = +1 } },
- { MODKEY|Mod4Mask, XK_o, incrohgaps, {.i = -1 } },
- { MODKEY|ShiftMask, XK_y, incrovgaps, {.i = +1 } },
- { MODKEY|ShiftMask, XK_o, incrovgaps, {.i = -1 } },
- { MODKEY|ShiftMask, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY, XK_x, killclient, {0} },
- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
- /*{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, */
- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
- { MODKEY, XK_space, setlayout, {0} },
- { MODKEY|ShiftMask, XK_space, togglefloating, {0} },
- { MODKEY, XK_0, view, {.ui = ~0 } },
- { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
- { MODKEY, XK_comma, focusmon, {.i = -1 } },
- { MODKEY, XK_period, focusmon, {.i = +1 } },
- { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
- { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
- // Custom keybinds
- { MODKEY, XK_f, spawn, SHCMD("surf_run") },
- { MODKEY|ShiftMask, XK_f, spawn, SHCMD("chromium") },
- { MODKEY|ShiftMask, XK_b, spawn, SHCMD("brighter") },
- { MODKEY|ShiftMask, XK_l, spawn, SHCMD("darker") },
- { MODKEY|ShiftMask, XK_u, spawn, SHCMD("vol_up") },
- { MODKEY|ShiftMask, XK_d, spawn, SHCMD("vol_down") },
- { MODKEY|ShiftMask, XK_m, spawn, SHCMD("mute") },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
- TAGKEYS( XK_4, 3)
- TAGKEYS( XK_5, 4)
- TAGKEYS( XK_6, 5)
- TAGKEYS( XK_7, 6)
- TAGKEYS( XK_8, 7)
- TAGKEYS( XK_9, 8)
- { MODKEY|ShiftMask, XK_q, quit, {0} },
-};
-
-/* button definitions */
-/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
-static Button buttons[] = {
- /* click event mask button function argument */
- { ClkLtSymbol, 0, Button1, setlayout, {0} },
- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
- { ClkWinTitle, 0, Button2, zoom, {0} },
- { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
- { ClkClientWin, MODKEY, Button1, movemouse, {0} },
- { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
- { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
- { ClkTagBar, 0, Button1, view, {0} },
- { ClkTagBar, 0, Button3, toggleview, {0} },
- { ClkTagBar, MODKEY, Button1, tag, {0} },
- { ClkTagBar, MODKEY, Button3, toggletag, {0} },
-};
-
diff --git a/dwm-6.2/config.h b/dwm-6.2/config.h
index 18c93cb..a20a18b 100644
--- a/dwm-6.2/config.h
+++ b/dwm-6.2/config.h
@@ -21,11 +21,11 @@ static const char *colors[][3] = {
};
static const char *const autostart[] = {
- "st", NULL,
- "picom_run", NULL,
- "fehbg", NULL,
- "dunst", NULL,
+ "fehbg", NULL,
+ "dmenu_run && killall dmenu", NULL,
"dwmblocks", NULL,
+ "picom_run", NULL,
+ "dunst", NULL,
NULL /* terminate */
};
@@ -66,14 +66,25 @@ static const Layout layouts[] = {
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
+
+/* replaces regular quit because it didn't work :( */
+static const char *quitcmd[] = { "killall", "dwm", NULL };
+static const char *browsercmd[] = { "chromium", NULL };
+
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
static const char *termcmd[] = { "st", NULL };
+static const char scratchpadname[] = "ScratchPad";
+static const char scratchpadfile[] = "/tmp/scratchpad_file";
+static const char scratchpadeditor[] = "/usr/bin/vim";
+static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", scratchpadeditor, scratchpadfile, NULL };
+
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_d, spawn, {.v = dmenucmd } },
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
+ { MODKEY, XK_s, spawn, {.v = scratchpadcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
@@ -112,8 +123,7 @@ static Key keys[] = {
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
// Custom keybinds
- { MODKEY, XK_f, spawn, SHCMD("surf_run") },
- { MODKEY|ShiftMask, XK_f, spawn, SHCMD("chromium") },
+ { MODKEY|ShiftMask, XK_f, spawn, {.v = browsercmd} },
{ MODKEY|ShiftMask, XK_b, spawn, SHCMD("brighter") },
{ MODKEY|ShiftMask, XK_l, spawn, SHCMD("darker") },
{ MODKEY|ShiftMask, XK_u, spawn, SHCMD("vol_up") },
@@ -128,7 +138,7 @@ static Key keys[] = {
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
- { MODKEY|ShiftMask, XK_q, quit, {0} },
+ { MODKEY|ShiftMask, XK_q, spawn, {.v = quitcmd } },
};
/* button definitions */
diff --git a/dwm-6.2/drw.o b/dwm-6.2/drw.o
new file mode 100644
index 0000000..ecc65b6
--- /dev/null
+++ b/dwm-6.2/drw.o
Binary files differ
diff --git a/dwm-6.2/dwm b/dwm-6.2/dwm
new file mode 100755
index 0000000..6fc47d3
--- /dev/null
+++ b/dwm-6.2/dwm
Binary files differ
diff --git a/dwm-6.2/dwm.1.orig b/dwm-6.2/dwm.1.orig
deleted file mode 100644
index 9533aa6..0000000
--- a/dwm-6.2/dwm.1.orig
+++ /dev/null
@@ -1,199 +0,0 @@
-.TH DWM 1 dwm\-VERSION
-.SH NAME
-dwm \- dynamic window manager
-.SH SYNOPSIS
-.B dwm
-.RB [ \-v ]
-.SH DESCRIPTION
-dwm is a dynamic window manager for X. It manages windows in tiled, monocle
-and floating layouts. Either layout can be applied dynamically, optimising the
-environment for the application in use and the task performed.
-.P
-In tiled layouts windows are managed in a master and stacking area. The master
-area on the left contains one window by default, and the stacking area on the
-right contains all other windows. The number of master area windows can be
-adjusted from zero to an arbitrary number. In monocle layout all windows are
-maximised to the screen size. In floating layout windows can be resized and
-moved freely. Dialog windows are always managed floating, regardless of the
-layout applied.
-.P
-Windows are grouped by tags. Each window can be tagged with one or multiple
-tags. Selecting certain tags displays all windows with these tags.
-.P
-Each screen contains a small status bar which displays all available tags, the
-layout, the title of the focused window, and the text read from the root window
-name property, if the screen is focused. A floating window is indicated with an
-empty square and a maximised floating window is indicated with a filled square
-before the windows title. The selected tags are indicated with a different
-color. The tags of the focused window are indicated with a filled square in the
-top left corner. The tags which are applied to one or more windows are
-indicated with an empty square in the top left corner.
-.P
-dwm draws a small border around windows to indicate the focus state.
-.P
-On start, dwm can start additional programs that may be specified in two special
-shell scripts (see the FILES section below), autostart_blocking.sh and
-autostart.sh. The former is executed first and dwm will wait for its
-termination before starting. The latter is executed in the background before
-dwm enters its handler loop.
-.P
-Either of these files may be omitted.
-.SH OPTIONS
-.TP
-.B \-v
-prints version information to standard output, then exits.
-.SH USAGE
-.SS Status bar
-.TP
-.B X root window name
-is read and displayed in the status text area. It can be set with the
-.BR xsetroot (1)
-command.
-.TP
-.B Button1
-click on a tag label to display all windows with that tag, click on the layout
-label toggles between tiled and floating layout.
-.TP
-.B Button3
-click on a tag label adds/removes all windows with that tag to/from the view.
-.TP
-.B Mod1\-Button1
-click on a tag label applies that tag to the focused window.
-.TP
-.B Mod1\-Button3
-click on a tag label adds/removes that tag to/from the focused window.
-.SS Keyboard commands
-.TP
-.B Mod1\-Shift\-Return
-Start
-.BR st(1).
-.TP
-.B Mod1\-p
-Spawn
-.BR dmenu(1)
-for launching other programs.
-.TP
-.B Mod1\-,
-Focus previous screen, if any.
-.TP
-.B Mod1\-.
-Focus next screen, if any.
-.TP
-.B Mod1\-Shift\-,
-Send focused window to previous screen, if any.
-.TP
-.B Mod1\-Shift\-.
-Send focused window to next screen, if any.
-.TP
-.B Mod1\-b
-Toggles bar on and off.
-.TP
-.B Mod1\-t
-Sets tiled layout.
-.TP
-.B Mod1\-f
-Sets floating layout.
-.TP
-.B Mod1\-m
-Sets monocle layout.
-.TP
-.B Mod1\-space
-Toggles between current and previous layout.
-.TP
-.B Mod1\-j
-Focus next window.
-.TP
-.B Mod1\-k
-Focus previous window.
-.TP
-.B Mod1\-i
-Increase number of windows in master area.
-.TP
-.B Mod1\-d
-Decrease number of windows in master area.
-.TP
-.B Mod1\-l
-Increase master area size.
-.TP
-.B Mod1\-h
-Decrease master area size.
-.TP
-.B Mod1\-Return
-Zooms/cycles focused window to/from master area (tiled layouts only).
-.TP
-.B Mod1\-Shift\-c
-Close focused window.
-.TP
-.B Mod1\-Shift\-space
-Toggle focused window between tiled and floating state.
-.TP
-.B Mod1\-Tab
-Toggles to the previously selected tags.
-.TP
-.B Mod1\-Shift\-[1..n]
-Apply nth tag to focused window.
-.TP
-.B Mod1\-Shift\-0
-Apply all tags to focused window.
-.TP
-.B Mod1\-Control\-Shift\-[1..n]
-Add/remove nth tag to/from focused window.
-.TP
-.B Mod1\-[1..n]
-View all windows with nth tag.
-.TP
-.B Mod1\-0
-View all windows with any tag.
-.TP
-.B Mod1\-Control\-[1..n]
-Add/remove all windows with nth tag to/from the view.
-.TP
-.B Mod1\-Shift\-q
-Quit dwm.
-.SS Mouse commands
-.TP
-.B Mod1\-Button1
-Move focused window while dragging. Tiled windows will be toggled to the floating state.
-.TP
-.B Mod1\-Button2
-Toggles focused window between floating and tiled state.
-.TP
-.B Mod1\-Button3
-Resize focused window while dragging. Tiled windows will be toggled to the floating state.
-.SH FILES
-The files containing programs to be started along with dwm are searched for in
-the following directories:
-.IP "1. $XDG_DATA_HOME/dwm"
-.IP "2. $HOME/.local/share/dwm"
-.IP "3. $HOME/.dwm"
-.P
-The first existing directory is scanned for any of the autostart files below.
-.TP 15
-autostart.sh
-This file is started as a shell background process before dwm enters its handler
-loop.
-.TP 15
-autostart_blocking.sh
-This file is started before any autostart.sh; dwm waits for its termination.
-.SH CUSTOMIZATION
-dwm is customized by creating a custom config.h and (re)compiling the source
-code. This keeps it fast, secure and simple.
-.SH SEE ALSO
-.BR dmenu (1),
-.BR st (1)
-.SH ISSUES
-Java applications which use the XToolkit/XAWT backend may draw grey windows
-only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
-JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
-are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
-environment variable
-.BR AWT_TOOLKIT=MToolkit
-(to use the older Motif backend instead) or running
-.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
-or
-.B wmname LG3D
-(to pretend that a non-reparenting window manager is running that the
-XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
-.BR _JAVA_AWT_WM_NONREPARENTING=1 .
-.SH BUGS
-Send all bug reports with a patch to hackers@suckless.org.
diff --git a/dwm-6.2/dwm.c b/dwm-6.2/dwm.c
index af6b7f8..c426dbc 100644
--- a/dwm-6.2/dwm.c
+++ b/dwm-6.2/dwm.c
@@ -226,6 +226,7 @@ static void tagmon(const Arg *arg);
static void tile(Monitor *);
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
+static void togglescratch(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
static void unfocus(Client *c, int setfocus);
@@ -288,6 +289,8 @@ static Window root, wmcheckwin;
/* configuration, allows nested code to access above variables */
#include "config.h"
+static unsigned int scratchtag = 1 << LENGTH(tags);
+
/* compile-time check if all tags fit into an unsigned int bit array. */
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
@@ -1112,6 +1115,14 @@ manage(Window w, XWindowAttributes *wa)
&& (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
c->bw = borderpx;
+ selmon->tagset[selmon->seltags] &= ~scratchtag;
+ if (!strcmp(c->name, scratchpadname)) {
+ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag;
+ c->isfloating = True;
+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2);
+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2);
+ }
+
wc.border_width = c->bw;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
@@ -1835,6 +1846,7 @@ spawn(const Arg *arg)
{
if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
+ selmon->tagset[selmon->seltags] &= ~scratchtag;
if (fork() == 0) {
if (dpy)
close(ConnectionNumber(dpy));
@@ -1920,6 +1932,28 @@ togglefloating(const Arg *arg)
}
void
+togglescratch(const Arg *arg)
+{
+ Client *c;
+ unsigned int found = 0;
+
+ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next);
+ if (found) {
+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag;
+ if (newtagset) {
+ selmon->tagset[selmon->seltags] = newtagset;
+ focus(NULL);
+ arrange(selmon);
+ }
+ if (ISVISIBLE(c)) {
+ focus(c);
+ restack(selmon);
+ }
+ } else
+ spawn(arg);
+}
+
+void
toggletag(const Arg *arg)
{
unsigned int newtags;
diff --git a/dwm-6.2/dwm.c.orig b/dwm-6.2/dwm.c.orig
deleted file mode 100644
index 0dfbe8b..0000000
--- a/dwm-6.2/dwm.c.orig
+++ /dev/null
@@ -1,2294 +0,0 @@
-/* See LICENSE file for copyright and license details.
- *
- * dynamic window manager is designed like any other X client as well. It is
- * driven through handling X events. In contrast to other X clients, a window
- * manager selects for SubstructureRedirectMask on the root window, to receive
- * events about window (dis-)appearance. Only one X connection at a time is
- * allowed to select for this event mask.
- *
- * The event handlers of dwm are organized in an array which is accessed
- * whenever a new event has been fetched. This allows event dispatching
- * in O(1) time.
- *
- * Each child of the root window is called a client, except windows which have
- * set the override_redirect flag. Clients are organized in a linked client
- * list on each monitor, the focus history is remembered through a stack list
- * on each monitor. Each client contains a bit array to indicate the tags of a
- * client.
- *
- * Keys and tagging rules are organized as arrays and defined in config.h.
- *
- * To understand everything else, start reading main().
- */
-#include <errno.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <X11/cursorfont.h>
-#include <X11/keysym.h>
-#include <X11/Xatom.h>
-#include <X11/Xlib.h>
-#include <X11/Xproto.h>
-#include <X11/Xutil.h>
-#ifdef XINERAMA
-#include <X11/extensions/Xinerama.h>
-#endif /* XINERAMA */
-#include <X11/Xft/Xft.h>
-
-#include "drw.h"
-#include "util.h"
-
-/* macros */
-#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
-#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
-#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
- * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
-#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
-#define LENGTH(X) (sizeof X / sizeof X[0])
-#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
-#define WIDTH(X) ((X)->w + 2 * (X)->bw)
-#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
-#define TAGMASK ((1 << LENGTH(tags)) - 1)
-#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
-
-/* enums */
-enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
-enum { SchemeNorm, SchemeSel }; /* color schemes */
-enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
- NetWMFullscreen, NetActiveWindow, NetWMWindowType,
- NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
-enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
-enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
-
-typedef union {
- int i;
- unsigned int ui;
- float f;
- const void *v;
-} Arg;
-
-typedef struct {
- unsigned int click;
- unsigned int mask;
- unsigned int button;
- void (*func)(const Arg *arg);
- const Arg arg;
-} Button;
-
-typedef struct Monitor Monitor;
-typedef struct Client Client;
-struct Client {
- char name[256];
- float mina, maxa;
- int x, y, w, h;
- int oldx, oldy, oldw, oldh;
- int basew, baseh, incw, inch, maxw, maxh, minw, minh;
- int bw, oldbw;
- unsigned int tags;
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
- Client *next;
- Client *snext;
- Monitor *mon;
- Window win;
-};
-
-typedef struct {
- unsigned int mod;
- KeySym keysym;
- void (*func)(const Arg *);
- const Arg arg;
-} Key;
-
-typedef struct {
- const char *symbol;
- void (*arrange)(Monitor *);
-} Layout;
-
-struct Monitor {
- char ltsymbol[16];
- float mfact;
- int nmaster;
- int num;
- int by; /* bar geometry */
- int mx, my, mw, mh; /* screen size */
- int wx, wy, ww, wh; /* window area */
- int gappih; /* horizontal gap between windows */
- int gappiv; /* vertical gap between windows */
- int gappoh; /* horizontal outer gaps */
- int gappov; /* vertical outer gaps */
- unsigned int seltags;
- unsigned int sellt;
- unsigned int tagset[2];
- int showbar;
- int topbar;
- Client *clients;
- Client *sel;
- Client *stack;
- Monitor *next;
- Window barwin;
- const Layout *lt[2];
-};
-
-typedef struct {
- const char *class;
- const char *instance;
- const char *title;
- unsigned int tags;
- int isfloating;
- int monitor;
-} Rule;
-
-/* function declarations */
-static void applyrules(Client *c);
-static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
-static void arrange(Monitor *m);
-static void arrangemon(Monitor *m);
-static void attach(Client *c);
-static void attachabove(Client *c);
-static void attachstack(Client *c);
-static void buttonpress(XEvent *e);
-static void checkotherwm(void);
-static void cleanup(void);
-static void cleanupmon(Monitor *mon);
-static void clientmessage(XEvent *e);
-static void configure(Client *c);
-static void configurenotify(XEvent *e);
-static void configurerequest(XEvent *e);
-static Monitor *createmon(void);
-static void destroynotify(XEvent *e);
-static void detach(Client *c);
-static void detachstack(Client *c);
-static Monitor *dirtomon(int dir);
-static void drawbar(Monitor *m);
-static void drawbars(void);
-static void enternotify(XEvent *e);
-static void expose(XEvent *e);
-static void focus(Client *c);
-static void focusin(XEvent *e);
-static void focusmon(const Arg *arg);
-static void focusstack(const Arg *arg);
-static int getrootptr(int *x, int *y);
-static long getstate(Window w);
-static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
-static void grabbuttons(Client *c, int focused);
-static void grabkeys(void);
-static void incnmaster(const Arg *arg);
-static void keypress(XEvent *e);
-static void killclient(const Arg *arg);
-static void manage(Window w, XWindowAttributes *wa);
-static void mappingnotify(XEvent *e);
-static void maprequest(XEvent *e);
-static void monocle(Monitor *m);
-static void motionnotify(XEvent *e);
-static void movemouse(const Arg *arg);
-static Client *nexttiled(Client *c);
-static void pop(Client *);
-static void propertynotify(XEvent *e);
-static void quit(const Arg *arg);
-static Monitor *recttomon(int x, int y, int w, int h);
-static void resize(Client *c, int x, int y, int w, int h, int interact);
-static void resizeclient(Client *c, int x, int y, int w, int h);
-static void resizemouse(const Arg *arg);
-static void restack(Monitor *m);
-static void run(void);
-static void scan(void);
-static int sendevent(Client *c, Atom proto);
-static void sendmon(Client *c, Monitor *m);
-static void setclientstate(Client *c, long state);
-static void setfocus(Client *c);
-static void setfullscreen(Client *c, int fullscreen);
-static void setgaps(int oh, int ov, int ih, int iv);
-static void incrgaps(const Arg *arg);
-static void incrigaps(const Arg *arg);
-static void incrogaps(const Arg *arg);
-static void incrohgaps(const Arg *arg);
-static void incrovgaps(const Arg *arg);
-static void incrihgaps(const Arg *arg);
-static void incrivgaps(const Arg *arg);
-static void togglegaps(const Arg *arg);
-static void defaultgaps(const Arg *arg);
-static void setlayout(const Arg *arg);
-static void setmfact(const Arg *arg);
-static void setup(void);
-static void seturgent(Client *c, int urg);
-static void showhide(Client *c);
-static void sigchld(int unused);
-static void spawn(const Arg *arg);
-static void tag(const Arg *arg);
-static void tagmon(const Arg *arg);
-static void tile(Monitor *);
-static void togglebar(const Arg *arg);
-static void togglefloating(const Arg *arg);
-static void toggletag(const Arg *arg);
-static void toggleview(const Arg *arg);
-static void unfocus(Client *c, int setfocus);
-static void unmanage(Client *c, int destroyed);
-static void unmapnotify(XEvent *e);
-static void updatebarpos(Monitor *m);
-static void updatebars(void);
-static void updateclientlist(void);
-static int updategeom(void);
-static void updatenumlockmask(void);
-static void updatesizehints(Client *c);
-static void updatestatus(void);
-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 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 const char broken[] = "broken";
-static char stext[256];
-static int screen;
-static int sw, sh; /* X display screen geometry width, height */
-static int bh, blw = 0; /* bar geometry */
-static int enablegaps = 1; /* enables gaps, used by togglegaps */
-static int lrpad; /* sum of left and right padding for text */
-static int (*xerrorxlib)(Display *, XErrorEvent *);
-static unsigned int numlockmask = 0;
-static void (*handler[LASTEvent]) (XEvent *) = {
- [ButtonPress] = buttonpress,
- [ClientMessage] = clientmessage,
- [ConfigureRequest] = configurerequest,
- [ConfigureNotify] = configurenotify,
- [DestroyNotify] = destroynotify,
- [EnterNotify] = enternotify,
- [Expose] = expose,
- [FocusIn] = focusin,
- [KeyPress] = keypress,
- [MappingNotify] = mappingnotify,
- [MapRequest] = maprequest,
- [MotionNotify] = motionnotify,
- [PropertyNotify] = propertynotify,
- [UnmapNotify] = unmapnotify
-};
-static Atom wmatom[WMLast], netatom[NetLast];
-static int running = 1;
-static Cur *cursor[CurLast];
-static Clr **scheme;
-static Display *dpy;
-static Drw *drw;
-static Monitor *mons, *selmon;
-static Window root, wmcheckwin;
-
-/* configuration, allows nested code to access above variables */
-#include "config.h"
-
-/* compile-time check if all tags fit into an unsigned int bit array. */
-struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-/* function implementations */
-void
-applyrules(Client *c)
-{
- const char *class, *instance;
- unsigned int i;
- const Rule *r;
- Monitor *m;
- XClassHint ch = { NULL, NULL };
-
- /* rule matching */
- c->isfloating = 0;
- c->tags = 0;
- XGetClassHint(dpy, c->win, &ch);
- class = ch.res_class ? ch.res_class : broken;
- instance = ch.res_name ? ch.res_name : broken;
-
- for (i = 0; i < LENGTH(rules); i++) {
- r = &rules[i];
- if ((!r->title || strstr(c->name, r->title))
- && (!r->class || strstr(class, r->class))
- && (!r->instance || strstr(instance, r->instance)))
- {
- c->isfloating = r->isfloating;
- c->tags |= r->tags;
- for (m = mons; m && m->num != r->monitor; m = m->next);
- if (m)
- c->mon = m;
- }
- }
- if (ch.res_class)
- XFree(ch.res_class);
- if (ch.res_name)
- XFree(ch.res_name);
- c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags];
-}
-
-int
-applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
-{
- int baseismin;
- Monitor *m = c->mon;
-
- /* set minimum possible */
- *w = MAX(1, *w);
- *h = MAX(1, *h);
- if (interact) {
- if (*x > sw)
- *x = sw - WIDTH(c);
- if (*y > sh)
- *y = sh - HEIGHT(c);
- if (*x + *w + 2 * c->bw < 0)
- *x = 0;
- if (*y + *h + 2 * c->bw < 0)
- *y = 0;
- } else {
- if (*x >= m->wx + m->ww)
- *x = m->wx + m->ww - WIDTH(c);
- if (*y >= m->wy + m->wh)
- *y = m->wy + m->wh - HEIGHT(c);
- if (*x + *w + 2 * c->bw <= m->wx)
- *x = m->wx;
- if (*y + *h + 2 * c->bw <= m->wy)
- *y = m->wy;
- }
- if (*h < bh)
- *h = bh;
- if (*w < bh)
- *w = bh;
- if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) {
- /* see last two sentences in ICCCM 4.1.2.3 */
- baseismin = c->basew == c->minw && c->baseh == c->minh;
- if (!baseismin) { /* temporarily remove base dimensions */
- *w -= c->basew;
- *h -= c->baseh;
- }
- /* adjust for aspect limits */
- if (c->mina > 0 && c->maxa > 0) {
- if (c->maxa < (float)*w / *h)
- *w = *h * c->maxa + 0.5;
- else if (c->mina < (float)*h / *w)
- *h = *w * c->mina + 0.5;
- }
- if (baseismin) { /* increment calculation requires this */
- *w -= c->basew;
- *h -= c->baseh;
- }
- /* adjust for increment value */
- if (c->incw)
- *w -= *w % c->incw;
- if (c->inch)
- *h -= *h % c->inch;
- /* restore base dimensions */
- *w = MAX(*w + c->basew, c->minw);
- *h = MAX(*h + c->baseh, c->minh);
- if (c->maxw)
- *w = MIN(*w, c->maxw);
- if (c->maxh)
- *h = MIN(*h, c->maxh);
- }
- return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
-}
-
-void
-arrange(Monitor *m)
-{
- if (m)
- showhide(m->stack);
- else for (m = mons; m; m = m->next)
- showhide(m->stack);
- if (m) {
- arrangemon(m);
- restack(m);
- } else for (m = mons; m; m = m->next)
- arrangemon(m);
-}
-
-void
-arrangemon(Monitor *m)
-{
- strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
- if (m->lt[m->sellt]->arrange)
- m->lt[m->sellt]->arrange(m);
-}
-
-void
-attach(Client *c)
-{
- c->next = c->mon->clients;
- c->mon->clients = c;
-}
-
-void
-attachabove(Client *c)
-{
- if (c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) {
- attach(c);
- return;
- }
-
- Client *at;
- for (at = c->mon->clients; at->next != c->mon->sel; at = at->next);
- c->next = at->next;
- at->next = c;
-}
-
-void
-attachstack(Client *c)
-{
- c->snext = c->mon->stack;
- c->mon->stack = c;
-}
-
-void
-buttonpress(XEvent *e)
-{
- unsigned int i, x, click;
- Arg arg = {0};
- Client *c;
- Monitor *m;
- XButtonPressedEvent *ev = &e->xbutton;
-
- click = ClkRootWin;
- /* focus monitor if necessary */
- if ((m = wintomon(ev->window)) && m != selmon) {
- unfocus(selmon->sel, 1);
- selmon = m;
- focus(NULL);
- }
- if (ev->window == selmon->barwin) {
- i = x = 0;
- do
- x += TEXTW(tags[i]);
- while (ev->x >= x && ++i < LENGTH(tags));
- if (i < LENGTH(tags)) {
- click = ClkTagBar;
- arg.ui = 1 << i;
- } else if (ev->x < x + blw)
- click = ClkLtSymbol;
- else if (ev->x > selmon->ww - TEXTW(stext))
- click = ClkStatusText;
- else
- click = ClkWinTitle;
- } else if ((c = wintoclient(ev->window))) {
- focus(c);
- restack(selmon);
- XAllowEvents(dpy, ReplayPointer, CurrentTime);
- click = ClkClientWin;
- }
- for (i = 0; i < LENGTH(buttons); i++)
- if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
- && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
- buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
-}
-
-void
-checkotherwm(void)
-{
- xerrorxlib = XSetErrorHandler(xerrorstart);
- /* this causes an error if some other window manager is running */
- XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
- XSync(dpy, False);
- XSetErrorHandler(xerror);
- XSync(dpy, False);
-}
-
-void
-cleanup(void)
-{
- Arg a = {.ui = ~0};
- Layout foo = { "", NULL };
- Monitor *m;
- size_t i;
-
- view(&a);
- selmon->lt[selmon->sellt] = &foo;
- for (m = mons; m; m = m->next)
- while (m->stack)
- unmanage(m->stack, 0);
- XUngrabKey(dpy, AnyKey, AnyModifier, root);
- while (mons)
- cleanupmon(mons);
- for (i = 0; i < CurLast; i++)
- drw_cur_free(drw, cursor[i]);
- for (i = 0; i < LENGTH(colors); i++)
- free(scheme[i]);
- XDestroyWindow(dpy, wmcheckwin);
- drw_free(drw);
- XSync(dpy, False);
- XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
- XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
-}
-
-void
-cleanupmon(Monitor *mon)
-{
- Monitor *m;
-
- if (mon == mons)
- mons = mons->next;
- else {
- for (m = mons; m && m->next != mon; m = m->next);
- m->next = mon->next;
- }
- XUnmapWindow(dpy, mon->barwin);
- XDestroyWindow(dpy, mon->barwin);
- free(mon);
-}
-
-void
-clientmessage(XEvent *e)
-{
- XClientMessageEvent *cme = &e->xclient;
- Client *c = wintoclient(cme->window);
-
- if (!c)
- return;
- if (cme->message_type == netatom[NetWMState]) {
- if (cme->data.l[1] == netatom[NetWMFullscreen]
- || cme->data.l[2] == netatom[NetWMFullscreen])
- setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
- || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
- } else if (cme->message_type == netatom[NetActiveWindow]) {
- if (c != selmon->sel && !c->isurgent)
- seturgent(c, 1);
- }
-}
-
-void
-configure(Client *c)
-{
- XConfigureEvent ce;
-
- ce.type = ConfigureNotify;
- ce.display = dpy;
- ce.event = c->win;
- ce.window = c->win;
- ce.x = c->x;
- ce.y = c->y;
- ce.width = c->w;
- ce.height = c->h;
- ce.border_width = c->bw;
- ce.above = None;
- ce.override_redirect = False;
- XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
-}
-
-void
-configurenotify(XEvent *e)
-{
- Monitor *m;
- Client *c;
- XConfigureEvent *ev = &e->xconfigure;
- int dirty;
-
- /* TODO: updategeom handling sucks, needs to be simplified */
- if (ev->window == root) {
- dirty = (sw != ev->width || sh != ev->height);
- sw = ev->width;
- sh = ev->height;
- if (updategeom() || dirty) {
- drw_resize(drw, sw, bh);
- updatebars();
- for (m = mons; m; m = m->next) {
- for (c = m->clients; c; c = c->next)
- if (c->isfullscreen)
- resizeclient(c, m->mx, m->my, m->mw, m->mh);
- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
- }
- focus(NULL);
- arrange(NULL);
- }
- }
-}
-
-void
-configurerequest(XEvent *e)
-{
- Client *c;
- Monitor *m;
- XConfigureRequestEvent *ev = &e->xconfigurerequest;
- XWindowChanges wc;
-
- if ((c = wintoclient(ev->window))) {
- if (ev->value_mask & CWBorderWidth)
- c->bw = ev->border_width;
- else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
- m = c->mon;
- if (ev->value_mask & CWX) {
- c->oldx = c->x;
- c->x = m->mx + ev->x;
- }
- if (ev->value_mask & CWY) {
- c->oldy = c->y;
- c->y = m->my + ev->y;
- }
- if (ev->value_mask & CWWidth) {
- c->oldw = c->w;
- c->w = ev->width;
- }
- if (ev->value_mask & CWHeight) {
- c->oldh = c->h;
- c->h = ev->height;
- }
- if ((c->x + c->w) > m->mx + m->mw && c->isfloating)
- c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */
- if ((c->y + c->h) > m->my + m->mh && c->isfloating)
- c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */
- if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
- configure(c);
- if (ISVISIBLE(c))
- XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
- } else
- configure(c);
- } else {
- wc.x = ev->x;
- wc.y = ev->y;
- wc.width = ev->width;
- wc.height = ev->height;
- wc.border_width = ev->border_width;
- wc.sibling = ev->above;
- wc.stack_mode = ev->detail;
- XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
- }
- XSync(dpy, False);
-}
-
-Monitor *
-createmon(void)
-{
- Monitor *m;
-
- m = ecalloc(1, sizeof(Monitor));
- m->tagset[0] = m->tagset[1] = 1;
- m->mfact = mfact;
- m->nmaster = nmaster;
- m->showbar = showbar;
- m->topbar = topbar;
- m->gappih = gappih;
- m->gappiv = gappiv;
- m->gappoh = gappoh;
- m->gappov = gappov;
- m->lt[0] = &layouts[0];
- m->lt[1] = &layouts[1 % LENGTH(layouts)];
- strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
- return m;
-}
-
-void
-destroynotify(XEvent *e)
-{
- Client *c;
- XDestroyWindowEvent *ev = &e->xdestroywindow;
-
- if ((c = wintoclient(ev->window)))
- unmanage(c, 1);
-}
-
-void
-detach(Client *c)
-{
- Client **tc;
-
- for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next);
- *tc = c->next;
-}
-
-void
-detachstack(Client *c)
-{
- Client **tc, *t;
-
- for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext);
- *tc = c->snext;
-
- if (c == c->mon->sel) {
- for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext);
- c->mon->sel = t;
- }
-}
-
-Monitor *
-dirtomon(int dir)
-{
- Monitor *m = NULL;
-
- if (dir > 0) {
- if (!(m = selmon->next))
- m = mons;
- } else if (selmon == mons)
- for (m = mons; m->next; m = m->next);
- else
- for (m = mons; m->next != selmon; m = m->next);
- return m;
-}
-
-void
-drawbar(Monitor *m)
-{
- int x, w, sw = 0;
- int boxs = drw->fonts->h / 9;
- int boxw = drw->fonts->h / 6 + 2;
- unsigned int i, occ = 0, urg = 0;
- Client *c;
-
- /* 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]);
- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0);
- }
-
- for (c = m->clients; c; c = c->next) {
- occ |= c->tags;
- if (c->isurgent)
- urg |= c->tags;
- }
- x = 0;
- for (i = 0; i < LENGTH(tags); i++) {
- w = TEXTW(tags[i]);
- drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
- if (occ & 1 << i)
- drw_rect(drw, x + boxs, boxs, boxw, boxw,
- m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
- urg & 1 << i);
- x += w;
- }
- w = blw = TEXTW(m->ltsymbol);
- drw_setscheme(drw, scheme[SchemeNorm]);
- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
-
- if ((w = m->ww - sw - x) > bh) {
- if (m->sel) {
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
- if (m->sel->isfloating)
- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
- } else {
- drw_setscheme(drw, scheme[SchemeNorm]);
- drw_rect(drw, x, 0, w, bh, 1, 1);
- }
- }
- drw_map(drw, m->barwin, 0, 0, m->ww, bh);
-}
-
-void
-drawbars(void)
-{
- Monitor *m;
-
- for (m = mons; m; m = m->next)
- drawbar(m);
-}
-
-void
-enternotify(XEvent *e)
-{
- Client *c;
- Monitor *m;
- XCrossingEvent *ev = &e->xcrossing;
-
- if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
- return;
- c = wintoclient(ev->window);
- m = c ? c->mon : wintomon(ev->window);
- if (m != selmon) {
- unfocus(selmon->sel, 1);
- selmon = m;
- } else if (!c || c == selmon->sel)
- return;
- focus(c);
-}
-
-void
-expose(XEvent *e)
-{
- Monitor *m;
- XExposeEvent *ev = &e->xexpose;
-
- if (ev->count == 0 && (m = wintomon(ev->window)))
- drawbar(m);
-}
-
-void
-focus(Client *c)
-{
- if (!c || !ISVISIBLE(c))
- for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
- if (selmon->sel && selmon->sel != c)
- unfocus(selmon->sel, 0);
- if (c) {
- if (c->mon != selmon)
- selmon = c->mon;
- if (c->isurgent)
- seturgent(c, 0);
- detachstack(c);
- attachstack(c);
- grabbuttons(c, 1);
- XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
- setfocus(c);
- } else {
- XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
- }
- selmon->sel = c;
- drawbars();
-}
-
-/* there are some broken focus acquiring clients needing extra handling */
-void
-focusin(XEvent *e)
-{
- XFocusChangeEvent *ev = &e->xfocus;
-
- if (selmon->sel && ev->window != selmon->sel->win)
- setfocus(selmon->sel);
-}
-
-void
-focusmon(const Arg *arg)
-{
- Monitor *m;
-
- if (!mons->next)
- return;
- if ((m = dirtomon(arg->i)) == selmon)
- return;
- unfocus(selmon->sel, 0);
- selmon = m;
- focus(NULL);
-}
-
-void
-focusstack(const Arg *arg)
-{
- Client *c = NULL, *i;
-
- if (!selmon->sel)
- return;
- if (arg->i > 0) {
- for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
- if (!c)
- for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
- } else {
- for (i = selmon->clients; i != selmon->sel; i = i->next)
- if (ISVISIBLE(i))
- c = i;
- if (!c)
- for (; i; i = i->next)
- if (ISVISIBLE(i))
- c = i;
- }
- if (c) {
- focus(c);
- restack(selmon);
- }
-}
-
-Atom
-getatomprop(Client *c, Atom prop)
-{
- int di;
- unsigned long dl;
- unsigned char *p = NULL;
- Atom da, atom = None;
-
- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM,
- &da, &di, &dl, &dl, &p) == Success && p) {
- atom = *(Atom *)p;
- XFree(p);
- }
- return atom;
-}
-
-int
-getrootptr(int *x, int *y)
-{
- int di;
- unsigned int dui;
- Window dummy;
-
- return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui);
-}
-
-long
-getstate(Window w)
-{
- int format;
- long result = -1;
- unsigned char *p = NULL;
- unsigned long n, extra;
- Atom real;
-
- if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
- &real, &format, &n, &extra, (unsigned char **)&p) != Success)
- return -1;
- if (n != 0)
- result = *p;
- XFree(p);
- return result;
-}
-
-int
-gettextprop(Window w, Atom atom, char *text, unsigned int size)
-{
- char **list = NULL;
- int n;
- XTextProperty name;
-
- if (!text || size == 0)
- return 0;
- text[0] = '\0';
- if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems)
- return 0;
- if (name.encoding == XA_STRING)
- strncpy(text, (char *)name.value, size - 1);
- else {
- if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
- strncpy(text, *list, size - 1);
- XFreeStringList(list);
- }
- }
- text[size - 1] = '\0';
- XFree(name.value);
- return 1;
-}
-
-void
-grabbuttons(Client *c, int focused)
-{
- updatenumlockmask();
- {
- unsigned int i, j;
- unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
- XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
- if (!focused)
- XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
- BUTTONMASK, GrabModeSync, GrabModeSync, None, None);
- for (i = 0; i < LENGTH(buttons); i++)
- if (buttons[i].click == ClkClientWin)
- for (j = 0; j < LENGTH(modifiers); j++)
- XGrabButton(dpy, buttons[i].button,
- buttons[i].mask | modifiers[j],
- c->win, False, BUTTONMASK,
- GrabModeAsync, GrabModeSync, None, None);
- }
-}
-
-void
-grabkeys(void)
-{
- updatenumlockmask();
- {
- unsigned int i, j;
- unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
- KeyCode code;
-
- XUngrabKey(dpy, AnyKey, AnyModifier, root);
- for (i = 0; i < LENGTH(keys); i++)
- if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
- for (j = 0; j < LENGTH(modifiers); j++)
- XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
- True, GrabModeAsync, GrabModeAsync);
- }
-}
-
-void
-incnmaster(const Arg *arg)
-{
- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
- arrange(selmon);
-}
-
-#ifdef XINERAMA
-static int
-isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info)
-{
- while (n--)
- if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
- && unique[n].width == info->width && unique[n].height == info->height)
- return 0;
- return 1;
-}
-#endif /* XINERAMA */
-
-void
-keypress(XEvent *e)
-{
- unsigned int i;
- KeySym keysym;
- XKeyEvent *ev;
-
- ev = &e->xkey;
- keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
- for (i = 0; i < LENGTH(keys); i++)
- if (keysym == keys[i].keysym
- && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
- && keys[i].func)
- keys[i].func(&(keys[i].arg));
-}
-
-void
-killclient(const Arg *arg)
-{
- if (!selmon->sel)
- return;
- if (!sendevent(selmon->sel, wmatom[WMDelete])) {
- XGrabServer(dpy);
- XSetErrorHandler(xerrordummy);
- XSetCloseDownMode(dpy, DestroyAll);
- XKillClient(dpy, selmon->sel->win);
- XSync(dpy, False);
- XSetErrorHandler(xerror);
- XUngrabServer(dpy);
- }
-}
-
-void
-manage(Window w, XWindowAttributes *wa)
-{
- Client *c, *t = NULL;
- Window trans = None;
- XWindowChanges wc;
-
- c = ecalloc(1, sizeof(Client));
- c->win = w;
- /* geometry */
- c->x = c->oldx = wa->x;
- c->y = c->oldy = wa->y;
- c->w = c->oldw = wa->width;
- c->h = c->oldh = wa->height;
- c->oldbw = wa->border_width;
-
- updatetitle(c);
- if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) {
- c->mon = t->mon;
- c->tags = t->tags;
- } else {
- c->mon = selmon;
- applyrules(c);
- }
-
- if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
- c->x = c->mon->mx + c->mon->mw - WIDTH(c);
- if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh)
- c->y = c->mon->my + c->mon->mh - HEIGHT(c);
- c->x = MAX(c->x, c->mon->mx);
- /* only fix client y-offset, if the client center might cover the bar */
- c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx)
- && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
- c->bw = borderpx;
-
- wc.border_width = c->bw;
- XConfigureWindow(dpy, w, CWBorderWidth, &wc);
- XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
- configure(c); /* propagates border_width, if size doesn't change */
- updatewindowtype(c);
- updatesizehints(c);
- updatewmhints(c);
- XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
- grabbuttons(c, 0);
- if (!c->isfloating)
- c->isfloating = c->oldstate = trans != None || c->isfixed;
- if (c->isfloating)
- XRaiseWindow(dpy, c->win);
- attachabove(c);
- attachstack(c);
- XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
- (unsigned char *) &(c->win), 1);
- XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
- setclientstate(c, NormalState);
- if (c->mon == selmon)
- unfocus(selmon->sel, 0);
- c->mon->sel = c;
- arrange(c->mon);
- XMapWindow(dpy, c->win);
- focus(NULL);
-}
-
-void
-mappingnotify(XEvent *e)
-{
- XMappingEvent *ev = &e->xmapping;
-
- XRefreshKeyboardMapping(ev);
- if (ev->request == MappingKeyboard)
- grabkeys();
-}
-
-void
-maprequest(XEvent *e)
-{
- static XWindowAttributes wa;
- XMapRequestEvent *ev = &e->xmaprequest;
-
- if (!XGetWindowAttributes(dpy, ev->window, &wa))
- return;
- if (wa.override_redirect)
- return;
- if (!wintoclient(ev->window))
- manage(ev->window, &wa);
-}
-
-void
-monocle(Monitor *m)
-{
- unsigned int n = 0;
- Client *c;
-
- for (c = m->clients; c; c = c->next)
- if (ISVISIBLE(c))
- n++;
- if (n > 0) /* override layout symbol */
- snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
- for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
- resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
-}
-
-void
-motionnotify(XEvent *e)
-{
- static Monitor *mon = NULL;
- Monitor *m;
- XMotionEvent *ev = &e->xmotion;
-
- if (ev->window != root)
- return;
- if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) {
- unfocus(selmon->sel, 1);
- selmon = m;
- focus(NULL);
- }
- mon = m;
-}
-
-void
-movemouse(const Arg *arg)
-{
- int x, y, ocx, ocy, nx, ny;
- Client *c;
- Monitor *m;
- XEvent ev;
- Time lasttime = 0;
-
- if (!(c = selmon->sel))
- return;
- if (c->isfullscreen) /* no support moving fullscreen windows by mouse */
- return;
- restack(selmon);
- ocx = c->x;
- ocy = c->y;
- if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
- None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess)
- return;
- if (!getrootptr(&x, &y))
- return;
- do {
- XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
- switch(ev.type) {
- case ConfigureRequest:
- case Expose:
- case MapRequest:
- handler[ev.type](&ev);
- break;
- case MotionNotify:
- if ((ev.xmotion.time - lasttime) <= (1000 / 60))
- continue;
- lasttime = ev.xmotion.time;
-
- nx = ocx + (ev.xmotion.x - x);
- ny = ocy + (ev.xmotion.y - y);
- if (abs(selmon->wx - nx) < snap)
- nx = selmon->wx;
- else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
- nx = selmon->wx + selmon->ww - WIDTH(c);
- if (abs(selmon->wy - ny) < snap)
- ny = selmon->wy;
- else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
- ny = selmon->wy + selmon->wh - HEIGHT(c);
- if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
- && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
- togglefloating(NULL);
- if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
- resize(c, nx, ny, c->w, c->h, 1);
- break;
- }
- } while (ev.type != ButtonRelease);
- XUngrabPointer(dpy, CurrentTime);
- if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
- sendmon(c, m);
- selmon = m;
- focus(NULL);
- }
-}
-
-Client *
-nexttiled(Client *c)
-{
- for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
- return c;
-}
-
-void
-pop(Client *c)
-{
- detach(c);
- attach(c);
- focus(c);
- arrange(c->mon);
-}
-
-void
-propertynotify(XEvent *e)
-{
- Client *c;
- Window trans;
- XPropertyEvent *ev = &e->xproperty;
-
- if ((ev->window == root) && (ev->atom == XA_WM_NAME))
- updatestatus();
- else if (ev->state == PropertyDelete)
- return; /* ignore */
- else if ((c = wintoclient(ev->window))) {
- switch(ev->atom) {
- default: break;
- case XA_WM_TRANSIENT_FOR:
- if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) &&
- (c->isfloating = (wintoclient(trans)) != NULL))
- arrange(c->mon);
- break;
- case XA_WM_NORMAL_HINTS:
- updatesizehints(c);
- break;
- case XA_WM_HINTS:
- updatewmhints(c);
- drawbars();
- break;
- }
- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
- updatetitle(c);
- if (c == c->mon->sel)
- drawbar(c->mon);
- }
- if (ev->atom == netatom[NetWMWindowType])
- updatewindowtype(c);
- }
-}
-
-void
-quit(const Arg *arg)
-{
- running = 0;
-}
-
-Monitor *
-recttomon(int x, int y, int w, int h)
-{
- Monitor *m, *r = selmon;
- int a, area = 0;
-
- for (m = mons; m; m = m->next)
- if ((a = INTERSECT(x, y, w, h, m)) > area) {
- area = a;
- r = m;
- }
- return r;
-}
-
-void
-resize(Client *c, int x, int y, int w, int h, int interact)
-{
- if (applysizehints(c, &x, &y, &w, &h, interact))
- resizeclient(c, x, y, w, h);
-}
-
-void
-resizeclient(Client *c, int x, int y, int w, int h)
-{
- XWindowChanges wc;
-
- c->oldx = c->x; c->x = wc.x = x;
- c->oldy = c->y; c->y = wc.y = y;
- c->oldw = c->w; c->w = wc.width = w;
- c->oldh = c->h; c->h = wc.height = h;
- wc.border_width = c->bw;
- XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
- configure(c);
- XSync(dpy, False);
-}
-
-void
-resizemouse(const Arg *arg)
-{
- int ocx, ocy, nw, nh;
- Client *c;
- Monitor *m;
- XEvent ev;
- Time lasttime = 0;
-
- if (!(c = selmon->sel))
- return;
- if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */
- return;
- restack(selmon);
- ocx = c->x;
- ocy = c->y;
- if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
- None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess)
- return;
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
- do {
- XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
- switch(ev.type) {
- case ConfigureRequest:
- case Expose:
- case MapRequest:
- handler[ev.type](&ev);
- break;
- case MotionNotify:
- if ((ev.xmotion.time - lasttime) <= (1000 / 60))
- continue;
- lasttime = ev.xmotion.time;
-
- nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
- nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
- if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww
- && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh)
- {
- if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
- && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
- togglefloating(NULL);
- }
- if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
- resize(c, c->x, c->y, nw, nh, 1);
- break;
- }
- } while (ev.type != ButtonRelease);
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
- XUngrabPointer(dpy, CurrentTime);
- while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
- if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
- sendmon(c, m);
- selmon = m;
- focus(NULL);
- }
-}
-
-void
-restack(Monitor *m)
-{
- Client *c;
- XEvent ev;
- XWindowChanges wc;
-
- drawbar(m);
- if (!m->sel)
- return;
- if (m->sel->isfloating || !m->lt[m->sellt]->arrange)
- XRaiseWindow(dpy, m->sel->win);
- if (m->lt[m->sellt]->arrange) {
- wc.stack_mode = Below;
- wc.sibling = m->barwin;
- for (c = m->stack; c; c = c->snext)
- if (!c->isfloating && ISVISIBLE(c)) {
- XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
- wc.sibling = c->win;
- }
- }
- XSync(dpy, False);
- while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
-}
-
-void
-run(void)
-{
- XEvent ev;
- /* main event loop */
- XSync(dpy, False);
- while (running && !XNextEvent(dpy, &ev))
- if (handler[ev.type])
- handler[ev.type](&ev); /* call handler */
-}
-
-void
-scan(void)
-{
- unsigned int i, num;
- Window d1, d2, *wins = NULL;
- XWindowAttributes wa;
-
- if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
- for (i = 0; i < num; i++) {
- if (!XGetWindowAttributes(dpy, wins[i], &wa)
- || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
- continue;
- if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
- manage(wins[i], &wa);
- }
- for (i = 0; i < num; i++) { /* now the transients */
- if (!XGetWindowAttributes(dpy, wins[i], &wa))
- continue;
- if (XGetTransientForHint(dpy, wins[i], &d1)
- && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
- manage(wins[i], &wa);
- }
- if (wins)
- XFree(wins);
- }
-}
-
-void
-sendmon(Client *c, Monitor *m)
-{
- if (c->mon == m)
- return;
- unfocus(c, 1);
- detach(c);
- detachstack(c);
- c->mon = m;
- c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
- attachabove(c);
- attachstack(c);
- focus(NULL);
- arrange(NULL);
-}
-
-void
-setclientstate(Client *c, long state)
-{
- long data[] = { state, None };
-
- XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
- PropModeReplace, (unsigned char *)data, 2);
-}
-
-int
-sendevent(Client *c, Atom proto)
-{
- int n;
- Atom *protocols;
- int exists = 0;
- XEvent ev;
-
- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) {
- while (!exists && n--)
- exists = protocols[n] == proto;
- XFree(protocols);
- }
- if (exists) {
- ev.type = ClientMessage;
- ev.xclient.window = c->win;
- ev.xclient.message_type = wmatom[WMProtocols];
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = proto;
- ev.xclient.data.l[1] = CurrentTime;
- XSendEvent(dpy, c->win, False, NoEventMask, &ev);
- }
- return exists;
-}
-
-void
-setfocus(Client *c)
-{
- if (!c->neverfocus) {
- XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
- XChangeProperty(dpy, root, netatom[NetActiveWindow],
- XA_WINDOW, 32, PropModeReplace,
- (unsigned char *) &(c->win), 1);
- }
- sendevent(c, wmatom[WMTakeFocus]);
-}
-
-void
-setfullscreen(Client *c, int fullscreen)
-{
- if (fullscreen && !c->isfullscreen) {
- XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
- PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
- c->isfullscreen = 1;
- c->oldstate = c->isfloating;
- c->oldbw = c->bw;
- c->bw = 0;
- c->isfloating = 1;
- resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
- XRaiseWindow(dpy, c->win);
- } else if (!fullscreen && c->isfullscreen){
- XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
- PropModeReplace, (unsigned char*)0, 0);
- c->isfullscreen = 0;
- c->isfloating = c->oldstate;
- c->bw = c->oldbw;
- c->x = c->oldx;
- c->y = c->oldy;
- c->w = c->oldw;
- c->h = c->oldh;
- resizeclient(c, c->x, c->y, c->w, c->h);
- arrange(c->mon);
- }
-}
-
-void
-setgaps(int oh, int ov, int ih, int iv)
-{
- if (oh < 0) oh = 0;
- if (ov < 0) ov = 0;
- if (ih < 0) ih = 0;
- if (iv < 0) iv = 0;
-
- selmon->gappoh = oh;
- selmon->gappov = ov;
- selmon->gappih = ih;
- selmon->gappiv = iv;
- arrange(selmon);
-}
-
-void
-togglegaps(const Arg *arg)
-{
- enablegaps = !enablegaps;
- arrange(selmon);
-}
-
-void
-defaultgaps(const Arg *arg)
-{
- setgaps(gappoh, gappov, gappih, gappiv);
-}
-
-void
-incrgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov + arg->i,
- selmon->gappih + arg->i,
- selmon->gappiv + arg->i
- );
-}
-
-void
-incrigaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih + arg->i,
- selmon->gappiv + arg->i
- );
-}
-
-void
-incrogaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov + arg->i,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrohgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrovgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov + arg->i,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrihgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih + arg->i,
- selmon->gappiv
- );
-}
-
-void
-incrivgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih,
- selmon->gappiv + arg->i
- );
-}
-
-void
-setlayout(const Arg *arg)
-{
- if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- selmon->sellt ^= 1;
- if (arg && arg->v)
- selmon->lt[selmon->sellt] = (Layout *)arg->v;
- strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- if (selmon->sel)
- arrange(selmon);
- else
- drawbar(selmon);
-}
-
-/* arg > 1.0 will set mfact absolutely */
-void
-setmfact(const Arg *arg)
-{
- float f;
-
- if (!arg || !selmon->lt[selmon->sellt]->arrange)
- return;
- f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- if (f < 0.1 || f > 0.9)
- return;
- selmon->mfact = f;
- arrange(selmon);
-}
-
-void
-setup(void)
-{
- int i;
- XSetWindowAttributes wa;
- Atom utf8string;
-
- /* clean up any zombies immediately */
- sigchld(0);
-
- /* init screen */
- screen = DefaultScreen(dpy);
- sw = DisplayWidth(dpy, screen);
- sh = DisplayHeight(dpy, screen);
- root = RootWindow(dpy, screen);
- drw = drw_create(dpy, screen, root, sw, sh);
- if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
- die("no fonts could be loaded.");
- lrpad = drw->fonts->h;
- bh = drw->fonts->h + 2;
- updategeom();
- /* init atoms */
- utf8string = XInternAtom(dpy, "UTF8_STRING", False);
- wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
- wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
- wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
- wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False);
- netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
- netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
- netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
- netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
- netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
- netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
- netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
- netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
- netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
- /* init cursors */
- cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
- cursor[CurResize] = drw_cur_create(drw, XC_sizing);
- cursor[CurMove] = drw_cur_create(drw, XC_fleur);
- /* init appearance */
- scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
- for (i = 0; i < LENGTH(colors); i++)
- scheme[i] = drw_scm_create(drw, colors[i], 3);
- /* init bars */
- updatebars();
- updatestatus();
- /* supporting window for NetWMCheck */
- wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
- XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32,
- PropModeReplace, (unsigned char *) &wmcheckwin, 1);
- XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8,
- PropModeReplace, (unsigned char *) "dwm", 3);
- XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32,
- PropModeReplace, (unsigned char *) &wmcheckwin, 1);
- /* EWMH support per view */
- XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
- PropModeReplace, (unsigned char *) netatom, NetLast);
- XDeleteProperty(dpy, root, netatom[NetClientList]);
- /* select events */
- wa.cursor = cursor[CurNormal]->cursor;
- wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask
- |ButtonPressMask|PointerMotionMask|EnterWindowMask
- |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask;
- XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
- XSelectInput(dpy, root, wa.event_mask);
- grabkeys();
- focus(NULL);
-}
-
-
-void
-seturgent(Client *c, int urg)
-{
- XWMHints *wmh;
-
- c->isurgent = urg;
- if (!(wmh = XGetWMHints(dpy, c->win)))
- return;
- wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint);
- XSetWMHints(dpy, c->win, wmh);
- XFree(wmh);
-}
-
-void
-showhide(Client *c)
-{
- if (!c)
- return;
- if (ISVISIBLE(c)) {
- /* show clients top down */
- XMoveWindow(dpy, c->win, c->x, c->y);
- if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
- resize(c, c->x, c->y, c->w, c->h, 0);
- showhide(c->snext);
- } else {
- /* hide clients bottom up */
- showhide(c->snext);
- XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y);
- }
-}
-
-void
-sigchld(int unused)
-{
- if (signal(SIGCHLD, sigchld) == SIG_ERR)
- die("can't install SIGCHLD handler:");
- while (0 < waitpid(-1, NULL, WNOHANG));
-}
-
-void
-spawn(const Arg *arg)
-{
- if (arg->v == dmenucmd)
- dmenumon[0] = '0' + selmon->num;
- if (fork() == 0) {
- if (dpy)
- close(ConnectionNumber(dpy));
- setsid();
- execvp(((char **)arg->v)[0], (char **)arg->v);
- fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
- perror(" failed");
- exit(EXIT_SUCCESS);
- }
-}
-
-void
-tag(const Arg *arg)
-{
- if (selmon->sel && arg->ui & TAGMASK) {
- selmon->sel->tags = arg->ui & TAGMASK;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-void
-tagmon(const Arg *arg)
-{
- if (!selmon->sel || !mons->next)
- return;
- sendmon(selmon->sel, dirtomon(arg->i));
-}
-
-void
-tile(Monitor *m)
-{
- unsigned int i, n, h, r, oe = enablegaps, ie = enablegaps, mw, my, ty;
- Client *c;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
- if (n == 0)
- return;
-
- if (smartgaps == n) {
- oe = 0; // outer gaps disabled
- }
-
- if (n > m->nmaster)
- mw = m->nmaster ? (m->ww + m->gappiv*ie) * m->mfact : 0;
- else
- mw = m->ww - 2*m->gappov*oe + m->gappiv*ie;
- for (i = 0, my = ty = m->gappoh*oe, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- r = MIN(n, m->nmaster) - i;
- h = (m->wh - my - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
- resize(c, m->wx + m->gappov*oe, m->wy + my, mw - (2*c->bw) - m->gappiv*ie, h - (2*c->bw), 0);
- my += HEIGHT(c) + m->gappih*ie;
- } else {
- r = n - i;
- h = (m->wh - ty - m->gappoh*oe - m->gappih*ie * (r - 1)) / r;
- resize(c, m->wx + mw + m->gappov*oe, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappov*oe, h - (2*c->bw), 0);
- ty += HEIGHT(c) + m->gappih*ie;
- }
-}
-
-void
-togglebar(const Arg *arg)
-{
- selmon->showbar = !selmon->showbar;
- updatebarpos(selmon);
- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- arrange(selmon);
-}
-
-void
-togglefloating(const Arg *arg)
-{
- if (!selmon->sel)
- return;
- if (selmon->sel->isfullscreen) /* no support for fullscreen windows */
- return;
- selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
- if (selmon->sel->isfloating)
- resize(selmon->sel, selmon->sel->x, selmon->sel->y,
- selmon->sel->w, selmon->sel->h, 0);
- arrange(selmon);
-}
-
-void
-toggletag(const Arg *arg)
-{
- unsigned int newtags;
-
- if (!selmon->sel)
- return;
- newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- if (newtags) {
- selmon->sel->tags = newtags;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-void
-toggleview(const Arg *arg)
-{
- unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
-
- if (newtagset) {
- selmon->tagset[selmon->seltags] = newtagset;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-void
-unfocus(Client *c, int setfocus)
-{
- if (!c)
- return;
- grabbuttons(c, 0);
- XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
- if (setfocus) {
- XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
- }
-}
-
-void
-unmanage(Client *c, int destroyed)
-{
- Monitor *m = c->mon;
- XWindowChanges wc;
-
- detach(c);
- detachstack(c);
- if (!destroyed) {
- wc.border_width = c->oldbw;
- XGrabServer(dpy); /* avoid race conditions */
- XSetErrorHandler(xerrordummy);
- XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
- XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
- setclientstate(c, WithdrawnState);
- XSync(dpy, False);
- XSetErrorHandler(xerror);
- XUngrabServer(dpy);
- }
- free(c);
- focus(NULL);
- updateclientlist();
- arrange(m);
-}
-
-void
-unmapnotify(XEvent *e)
-{
- Client *c;
- XUnmapEvent *ev = &e->xunmap;
-
- if ((c = wintoclient(ev->window))) {
- if (ev->send_event)
- setclientstate(c, WithdrawnState);
- else
- unmanage(c, 0);
- }
-}
-
-void
-updatebars(void)
-{
- Monitor *m;
- XSetWindowAttributes wa = {
- .override_redirect = True,
- .background_pixmap = ParentRelative,
- .event_mask = ButtonPressMask|ExposureMask
- };
- XClassHint ch = {"dwm", "dwm"};
- for (m = mons; m; m = m->next) {
- if (m->barwin)
- continue;
- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
- CopyFromParent, DefaultVisual(dpy, screen),
- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
- XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
- XMapRaised(dpy, m->barwin);
- XSetClassHint(dpy, m->barwin, &ch);
- }
-}
-
-void
-updatebarpos(Monitor *m)
-{
- m->wy = m->my;
- m->wh = m->mh;
- if (m->showbar) {
- m->wh -= bh;
- m->by = m->topbar ? m->wy : m->wy + m->wh;
- m->wy = m->topbar ? m->wy + bh : m->wy;
- } else
- m->by = -bh;
-}
-
-void
-updateclientlist()
-{
- Client *c;
- Monitor *m;
-
- XDeleteProperty(dpy, root, netatom[NetClientList]);
- for (m = mons; m; m = m->next)
- for (c = m->clients; c; c = c->next)
- XChangeProperty(dpy, root, netatom[NetClientList],
- XA_WINDOW, 32, PropModeAppend,
- (unsigned char *) &(c->win), 1);
-}
-
-int
-updategeom(void)
-{
- int dirty = 0;
-
-#ifdef XINERAMA
- if (XineramaIsActive(dpy)) {
- int i, j, n, nn;
- Client *c;
- Monitor *m;
- XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
- XineramaScreenInfo *unique = NULL;
-
- for (n = 0, m = mons; m; m = m->next, n++);
- /* only consider unique geometries as separate screens */
- unique = ecalloc(nn, sizeof(XineramaScreenInfo));
- for (i = 0, j = 0; i < nn; i++)
- if (isuniquegeom(unique, j, &info[i]))
- memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
- XFree(info);
- nn = j;
- if (n <= nn) { /* new monitors available */
- for (i = 0; i < (nn - n); i++) {
- for (m = mons; m && m->next; m = m->next);
- if (m)
- m->next = createmon();
- else
- mons = createmon();
- }
- for (i = 0, m = mons; i < nn && m; m = m->next, i++)
- if (i >= n
- || unique[i].x_org != m->mx || unique[i].y_org != m->my
- || unique[i].width != m->mw || unique[i].height != m->mh)
- {
- dirty = 1;
- m->num = i;
- m->mx = m->wx = unique[i].x_org;
- m->my = m->wy = unique[i].y_org;
- m->mw = m->ww = unique[i].width;
- m->mh = m->wh = unique[i].height;
- updatebarpos(m);
- }
- } else { /* less monitors available nn < n */
- for (i = nn; i < n; i++) {
- for (m = mons; m && m->next; m = m->next);
- while ((c = m->clients)) {
- dirty = 1;
- m->clients = c->next;
- detachstack(c);
- c->mon = mons;
- attachabove(c);
- attachstack(c);
- }
- if (m == selmon)
- selmon = mons;
- cleanupmon(m);
- }
- }
- free(unique);
- } else
-#endif /* XINERAMA */
- { /* default monitor setup */
- if (!mons)
- mons = createmon();
- if (mons->mw != sw || mons->mh != sh) {
- dirty = 1;
- mons->mw = mons->ww = sw;
- mons->mh = mons->wh = sh;
- updatebarpos(mons);
- }
- }
- if (dirty) {
- selmon = mons;
- selmon = wintomon(root);
- }
- return dirty;
-}
-
-void
-updatenumlockmask(void)
-{
- unsigned int i, j;
- XModifierKeymap *modmap;
-
- numlockmask = 0;
- modmap = XGetModifierMapping(dpy);
- for (i = 0; i < 8; i++)
- for (j = 0; j < modmap->max_keypermod; j++)
- if (modmap->modifiermap[i * modmap->max_keypermod + j]
- == XKeysymToKeycode(dpy, XK_Num_Lock))
- numlockmask = (1 << i);
- XFreeModifiermap(modmap);
-}
-
-void
-updatesizehints(Client *c)
-{
- long msize;
- XSizeHints size;
-
- if (!XGetWMNormalHints(dpy, c->win, &size, &msize))
- /* size is uninitialized, ensure that size.flags aren't used */
- size.flags = PSize;
- if (size.flags & PBaseSize) {
- c->basew = size.base_width;
- c->baseh = size.base_height;
- } else if (size.flags & PMinSize) {
- c->basew = size.min_width;
- c->baseh = size.min_height;
- } else
- c->basew = c->baseh = 0;
- if (size.flags & PResizeInc) {
- c->incw = size.width_inc;
- c->inch = size.height_inc;
- } else
- c->incw = c->inch = 0;
- if (size.flags & PMaxSize) {
- c->maxw = size.max_width;
- c->maxh = size.max_height;
- } else
- c->maxw = c->maxh = 0;
- if (size.flags & PMinSize) {
- c->minw = size.min_width;
- c->minh = size.min_height;
- } else if (size.flags & PBaseSize) {
- c->minw = size.base_width;
- c->minh = size.base_height;
- } else
- c->minw = c->minh = 0;
- if (size.flags & PAspect) {
- c->mina = (float)size.min_aspect.y / size.min_aspect.x;
- c->maxa = (float)size.max_aspect.x / size.max_aspect.y;
- } else
- c->maxa = c->mina = 0.0;
- c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh);
-}
-
-void
-updatestatus(void)
-{
- if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
- strcpy(stext, "dwm-"VERSION);
- drawbar(selmon);
-}
-
-void
-updatetitle(Client *c)
-{
- if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
- gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name);
- if (c->name[0] == '\0') /* hack to mark broken clients */
- strcpy(c->name, broken);
-}
-
-void
-updatewindowtype(Client *c)
-{
- Atom state = getatomprop(c, netatom[NetWMState]);
- Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
-
- if (state == netatom[NetWMFullscreen])
- setfullscreen(c, 1);
- if (wtype == netatom[NetWMWindowTypeDialog])
- c->isfloating = 1;
-}
-
-void
-updatewmhints(Client *c)
-{
- XWMHints *wmh;
-
- if ((wmh = XGetWMHints(dpy, c->win))) {
- if (c == selmon->sel && wmh->flags & XUrgencyHint) {
- wmh->flags &= ~XUrgencyHint;
- XSetWMHints(dpy, c->win, wmh);
- } else
- c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
- if (wmh->flags & InputHint)
- c->neverfocus = !wmh->input;
- else
- c->neverfocus = 0;
- XFree(wmh);
- }
-}
-
-void
-view(const Arg *arg)
-{
- if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- return;
- selmon->seltags ^= 1; /* toggle sel tagset */
- if (arg->ui & TAGMASK)
- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
- focus(NULL);
- arrange(selmon);
-}
-
-Client *
-wintoclient(Window w)
-{
- Client *c;
- Monitor *m;
-
- for (m = mons; m; m = m->next)
- for (c = m->clients; c; c = c->next)
- if (c->win == w)
- return c;
- return NULL;
-}
-
-Monitor *
-wintomon(Window w)
-{
- int x, y;
- Client *c;
- Monitor *m;
-
- if (w == root && getrootptr(&x, &y))
- return recttomon(x, y, 1, 1);
- for (m = mons; m; m = m->next)
- if (w == m->barwin)
- return m;
- if ((c = wintoclient(w)))
- return c->mon;
- return selmon;
-}
-
-/* There's no way to check accesses to destroyed windows, thus those cases are
- * ignored (especially on UnmapNotify's). Other types of errors call Xlibs
- * default error handler, which may call exit. */
-int
-xerror(Display *dpy, XErrorEvent *ee)
-{
- if (ee->error_code == BadWindow
- || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
- || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable)
- || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable)
- || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable)
- || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch)
- || (ee->request_code == X_GrabButton && ee->error_code == BadAccess)
- || (ee->request_code == X_GrabKey && ee->error_code == BadAccess)
- || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable))
- return 0;
- fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
- ee->request_code, ee->error_code);
- return xerrorxlib(dpy, ee); /* may call exit */
-}
-
-int
-xerrordummy(Display *dpy, XErrorEvent *ee)
-{
- return 0;
-}
-
-/* Startup Error handler to check if another window manager
- * is already running. */
-int
-xerrorstart(Display *dpy, XErrorEvent *ee)
-{
- die("dwm: another window manager is already running");
- return -1;
-}
-
-void
-zoom(const Arg *arg)
-{
- Client *c = selmon->sel;
-
- if (!selmon->lt[selmon->sellt]->arrange
- || (selmon->sel && selmon->sel->isfloating))
- return;
- if (c == nexttiled(selmon->clients))
- if (!c || !(c = nexttiled(c->next)))
- return;
- pop(c);
-}
-
-int
-main(int argc, char *argv[])
-{
- if (argc == 2 && !strcmp("-v", argv[1]))
- die("dwm-"VERSION);
- else if (argc != 1)
- die("usage: dwm [-v]");
- if (!setlocale(LC_CTYPE, "") || !XSupportsLocale())
- fputs("warning: no locale support\n", stderr);
- if (!(dpy = XOpenDisplay(NULL)))
- die("dwm: cannot open display");
- checkotherwm();
- setup();
-#ifdef __OpenBSD__
- if (pledge("stdio rpath proc exec", NULL) == -1)
- die("pledge");
-#endif /* __OpenBSD__ */
- scan();
- run();
- cleanup();
- XCloseDisplay(dpy);
- return EXIT_SUCCESS;
-}
diff --git a/dwm-6.2/dwm.o b/dwm-6.2/dwm.o
new file mode 100644
index 0000000..4485077
--- /dev/null
+++ b/dwm-6.2/dwm.o
Binary files differ
diff --git a/dwm-6.2/dwm-attachabove-6.2-20200421.diff b/dwm-6.2/patches/dwm-attachabove-6.2-20200421.diff
index 198f293..198f293 100644
--- a/dwm-6.2/dwm-attachabove-6.2-20200421.diff
+++ b/dwm-6.2/patches/dwm-attachabove-6.2-20200421.diff
diff --git a/dwm-6.2/dwm-cool-autostart-6.2.diff b/dwm-6.2/patches/dwm-cool-autostart-6.2.diff
index 84a93ea..84a93ea 100644
--- a/dwm-6.2/dwm-cool-autostart-6.2.diff
+++ b/dwm-6.2/patches/dwm-cool-autostart-6.2.diff
diff --git a/dwm-6.2/patches/dwm-scratchpad-6.2.diff b/dwm-6.2/patches/dwm-scratchpad-6.2.diff
new file mode 100644
index 0000000..2062263
--- /dev/null
+++ b/dwm-6.2/patches/dwm-scratchpad-6.2.diff
@@ -0,0 +1,90 @@
+diff -up a/config.def.h b/config.def.h
+--- a/config.def.h 2019-06-06 21:23:27.006661784 +0200
++++ b/config.def.h 2019-06-20 15:05:59.083102462 +0200
+@@ -58,11 +58,14 @@ static const Layout layouts[] = {
+ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
+ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
+ static const char *termcmd[] = { "st", NULL };
++static const char scratchpadname[] = "scratchpad";
++static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL };
+
+ static Key keys[] = {
+ /* modifier key function argument */
+ { MODKEY, XK_p, spawn, {.v = dmenucmd } },
+ { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
++ { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } },
+ { MODKEY, XK_b, togglebar, {0} },
+ { MODKEY, XK_j, focusstack, {.i = +1 } },
+ { MODKEY, XK_k, focusstack, {.i = -1 } },
+diff -up a/dwm.c b/dwm.c
+--- a/dwm.c 2019-06-06 21:23:27.023328450 +0200
++++ b/dwm.c 2019-06-20 15:07:01.089767947 +0200
+@@ -213,6 +213,7 @@ static void tagmon(const Arg *arg);
+ static void tile(Monitor *);
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
++static void togglescratch(const Arg *arg);
+ static void toggletag(const Arg *arg);
+ static void toggleview(const Arg *arg);
+ static void unfocus(Client *c, int setfocus);
+@@ -273,6 +274,8 @@ static Window root, wmcheckwin;
+ /* configuration, allows nested code to access above variables */
+ #include "config.h"
+
++static unsigned int scratchtag = 1 << LENGTH(tags);
++
+ /* compile-time check if all tags fit into an unsigned int bit array. */
+ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
+
+@@ -1052,6 +1055,14 @@ manage(Window w, XWindowAttributes *wa)
+ && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
+ c->bw = borderpx;
+
++ selmon->tagset[selmon->seltags] &= ~scratchtag;
++ if (!strcmp(c->name, scratchpadname)) {
++ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag;
++ c->isfloating = True;
++ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2);
++ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2);
++ }
++
+ wc.border_width = c->bw;
+ XConfigureWindow(dpy, w, CWBorderWidth, &wc);
+ XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
+@@ -1661,6 +1672,7 @@ spawn(const Arg *arg)
+ {
+ if (arg->v == dmenucmd)
+ dmenumon[0] = '0' + selmon->num;
++ selmon->tagset[selmon->seltags] &= ~scratchtag;
+ if (fork() == 0) {
+ if (dpy)
+ close(ConnectionNumber(dpy));
+@@ -1748,6 +1760,28 @@ togglefloating(const Arg *arg)
+ }
+
+ void
++togglescratch(const Arg *arg)
++{
++ Client *c;
++ unsigned int found = 0;
++
++ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next);
++ if (found) {
++ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag;
++ if (newtagset) {
++ selmon->tagset[selmon->seltags] = newtagset;
++ focus(NULL);
++ arrange(selmon);
++ }
++ if (ISVISIBLE(c)) {
++ focus(c);
++ restack(selmon);
++ }
++ } else
++ spawn(arg);
++}
++
++void
+ toggletag(const Arg *arg)
+ {
+ unsigned int newtags;
diff --git a/dwm-6.2/dwm-vanitygaps-20190508-6.2.diff b/dwm-6.2/patches/dwm-vanitygaps-20190508-6.2.diff
index ea22e23..ea22e23 100644
--- a/dwm-6.2/dwm-vanitygaps-20190508-6.2.diff
+++ b/dwm-6.2/patches/dwm-vanitygaps-20190508-6.2.diff
diff --git a/dwm-6.2/sarc-autostart.diff b/dwm-6.2/patches/sarc-autostart.diff
index efee676..efee676 100644
--- a/dwm-6.2/sarc-autostart.diff
+++ b/dwm-6.2/patches/sarc-autostart.diff
diff --git a/dwm-6.2/util.o b/dwm-6.2/util.o
new file mode 100644
index 0000000..3b48c2f
--- /dev/null
+++ b/dwm-6.2/util.o
Binary files differ
diff --git a/etc/FossaCursors/cursors/00000000000000020006000e7e9ffc3f b/etc/FossaCursors/cursors/00000000000000020006000e7e9ffc3f
deleted file mode 120000
index a305d5c..0000000
--- a/etc/FossaCursors/cursors/00000000000000020006000e7e9ffc3f
+++ /dev/null
@@ -1 +0,0 @@
-progress \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/00008160000006810000408080010102 b/etc/FossaCursors/cursors/00008160000006810000408080010102
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/00008160000006810000408080010102
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/03b6e0fcb3499374a867c041f52298f0 b/etc/FossaCursors/cursors/03b6e0fcb3499374a867c041f52298f0
deleted file mode 120000
index 031757c..0000000
--- a/etc/FossaCursors/cursors/03b6e0fcb3499374a867c041f52298f0
+++ /dev/null
@@ -1 +0,0 @@
-circle \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd b/etc/FossaCursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd
deleted file mode 120000
index a305d5c..0000000
--- a/etc/FossaCursors/cursors/08e8e1c95fe2fc01f976f1e063a24ccd
+++ /dev/null
@@ -1 +0,0 @@
-progress \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/1081e37283d90000800003c07f3ef6bf b/etc/FossaCursors/cursors/1081e37283d90000800003c07f3ef6bf
deleted file mode 120000
index 88740b2..0000000
--- a/etc/FossaCursors/cursors/1081e37283d90000800003c07f3ef6bf
+++ /dev/null
@@ -1 +0,0 @@
-copy \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/3085a0e285430894940527032f8b26df b/etc/FossaCursors/cursors/3085a0e285430894940527032f8b26df
deleted file mode 120000
index c4ad821..0000000
--- a/etc/FossaCursors/cursors/3085a0e285430894940527032f8b26df
+++ /dev/null
@@ -1 +0,0 @@
-alias \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/3ecb610c1bf2410f44200f48c40d3599 b/etc/FossaCursors/cursors/3ecb610c1bf2410f44200f48c40d3599
deleted file mode 120000
index a305d5c..0000000
--- a/etc/FossaCursors/cursors/3ecb610c1bf2410f44200f48c40d3599
+++ /dev/null
@@ -1 +0,0 @@
-progress \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/4498f0e0c1937ffe01fd06f973665830 b/etc/FossaCursors/cursors/4498f0e0c1937ffe01fd06f973665830
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/4498f0e0c1937ffe01fd06f973665830
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408 b/etc/FossaCursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408
deleted file mode 120000
index 4cea3ac..0000000
--- a/etc/FossaCursors/cursors/5c6cd98b3f3ebcb1f9c7f1c204630408
+++ /dev/null
@@ -1 +0,0 @@
-help \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/6407b0e94181790501fd1e167b474872 b/etc/FossaCursors/cursors/6407b0e94181790501fd1e167b474872
deleted file mode 120000
index 88740b2..0000000
--- a/etc/FossaCursors/cursors/6407b0e94181790501fd1e167b474872
+++ /dev/null
@@ -1 +0,0 @@
-copy \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/640fb0e74195791501fd1ed57b41487f b/etc/FossaCursors/cursors/640fb0e74195791501fd1ed57b41487f
deleted file mode 120000
index c4ad821..0000000
--- a/etc/FossaCursors/cursors/640fb0e74195791501fd1ed57b41487f
+++ /dev/null
@@ -1 +0,0 @@
-alias \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/9081237383d90e509aa00f00170e968f b/etc/FossaCursors/cursors/9081237383d90e509aa00f00170e968f
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/9081237383d90e509aa00f00170e968f
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/9d800788f1b08800ae810202380a0822 b/etc/FossaCursors/cursors/9d800788f1b08800ae810202380a0822
deleted file mode 120000
index 5ba3f42..0000000
--- a/etc/FossaCursors/cursors/9d800788f1b08800ae810202380a0822
+++ /dev/null
@@ -1 +0,0 @@
-pointer \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/a2a266d0498c3104214a47bd64ab0fc8 b/etc/FossaCursors/cursors/a2a266d0498c3104214a47bd64ab0fc8
deleted file mode 120000
index c4ad821..0000000
--- a/etc/FossaCursors/cursors/a2a266d0498c3104214a47bd64ab0fc8
+++ /dev/null
@@ -1 +0,0 @@
-alias \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/alias b/etc/FossaCursors/cursors/alias
deleted file mode 100644
index f9969a7..0000000
--- a/etc/FossaCursors/cursors/alias
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/all-scroll b/etc/FossaCursors/cursors/all-scroll
deleted file mode 100644
index ac764c0..0000000
--- a/etc/FossaCursors/cursors/all-scroll
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/b66166c04f8c3109214a4fbd64a50fc8 b/etc/FossaCursors/cursors/b66166c04f8c3109214a4fbd64a50fc8
deleted file mode 120000
index 88740b2..0000000
--- a/etc/FossaCursors/cursors/b66166c04f8c3109214a4fbd64a50fc8
+++ /dev/null
@@ -1 +0,0 @@
-copy \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/bottom_left_corner b/etc/FossaCursors/cursors/bottom_left_corner
deleted file mode 100644
index bf11322..0000000
--- a/etc/FossaCursors/cursors/bottom_left_corner
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/bottom_right_corner b/etc/FossaCursors/cursors/bottom_right_corner
deleted file mode 100644
index 70cc512..0000000
--- a/etc/FossaCursors/cursors/bottom_right_corner
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/bottom_side b/etc/FossaCursors/cursors/bottom_side
deleted file mode 100644
index c0263db..0000000
--- a/etc/FossaCursors/cursors/bottom_side
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/cell b/etc/FossaCursors/cursors/cell
deleted file mode 100644
index 23d878d..0000000
--- a/etc/FossaCursors/cursors/cell
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/center_ptr b/etc/FossaCursors/cursors/center_ptr
deleted file mode 100644
index e666012..0000000
--- a/etc/FossaCursors/cursors/center_ptr
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/circle b/etc/FossaCursors/cursors/circle
deleted file mode 120000
index 23bfed6..0000000
--- a/etc/FossaCursors/cursors/circle
+++ /dev/null
@@ -1 +0,0 @@
-not-allowed \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/closedhand b/etc/FossaCursors/cursors/closedhand
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/closedhand
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/col-resize b/etc/FossaCursors/cursors/col-resize
deleted file mode 100644
index 836a0eb..0000000
--- a/etc/FossaCursors/cursors/col-resize
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/color-picker b/etc/FossaCursors/cursors/color-picker
deleted file mode 100644
index a2af595..0000000
--- a/etc/FossaCursors/cursors/color-picker
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/context-menu b/etc/FossaCursors/cursors/context-menu
deleted file mode 100644
index 8dfea67..0000000
--- a/etc/FossaCursors/cursors/context-menu
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/copy b/etc/FossaCursors/cursors/copy
deleted file mode 100644
index e58eb31..0000000
--- a/etc/FossaCursors/cursors/copy
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/cross b/etc/FossaCursors/cursors/cross
deleted file mode 120000
index 67580a7..0000000
--- a/etc/FossaCursors/cursors/cross
+++ /dev/null
@@ -1 +0,0 @@
-crosshair \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/crossed_circle b/etc/FossaCursors/cursors/crossed_circle
deleted file mode 120000
index 23bfed6..0000000
--- a/etc/FossaCursors/cursors/crossed_circle
+++ /dev/null
@@ -1 +0,0 @@
-not-allowed \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/crosshair b/etc/FossaCursors/cursors/crosshair
deleted file mode 100644
index 0cfe58d..0000000
--- a/etc/FossaCursors/cursors/crosshair
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/d9ce0ab605698f320427677b458ad60b b/etc/FossaCursors/cursors/d9ce0ab605698f320427677b458ad60b
deleted file mode 120000
index 4cea3ac..0000000
--- a/etc/FossaCursors/cursors/d9ce0ab605698f320427677b458ad60b
+++ /dev/null
@@ -1 +0,0 @@
-help \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/default b/etc/FossaCursors/cursors/default
deleted file mode 100644
index 162c880..0000000
--- a/etc/FossaCursors/cursors/default
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/dnd-copy b/etc/FossaCursors/cursors/dnd-copy
deleted file mode 120000
index 88740b2..0000000
--- a/etc/FossaCursors/cursors/dnd-copy
+++ /dev/null
@@ -1 +0,0 @@
-copy \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/dnd-move b/etc/FossaCursors/cursors/dnd-move
deleted file mode 100644
index 49c86d1..0000000
--- a/etc/FossaCursors/cursors/dnd-move
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/dnd-no-drop b/etc/FossaCursors/cursors/dnd-no-drop
deleted file mode 100644
index 29ae721..0000000
--- a/etc/FossaCursors/cursors/dnd-no-drop
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/dnd-none b/etc/FossaCursors/cursors/dnd-none
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/dnd-none
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/down-arrow b/etc/FossaCursors/cursors/down-arrow
deleted file mode 100644
index 66380ff..0000000
--- a/etc/FossaCursors/cursors/down-arrow
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/draft b/etc/FossaCursors/cursors/draft
deleted file mode 100644
index 96f9824..0000000
--- a/etc/FossaCursors/cursors/draft
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/e-resize b/etc/FossaCursors/cursors/e-resize
deleted file mode 120000
index e0da659..0000000
--- a/etc/FossaCursors/cursors/e-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_hor \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/e29285e634086352946a0e7090d73106 b/etc/FossaCursors/cursors/e29285e634086352946a0e7090d73106
deleted file mode 120000
index 5ba3f42..0000000
--- a/etc/FossaCursors/cursors/e29285e634086352946a0e7090d73106
+++ /dev/null
@@ -1 +0,0 @@
-pointer \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/ew-resize b/etc/FossaCursors/cursors/ew-resize
deleted file mode 120000
index e0da659..0000000
--- a/etc/FossaCursors/cursors/ew-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_hor \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff b/etc/FossaCursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/fcf21c00b30f7e3f83fe0dfd12e71cff
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/fleur b/etc/FossaCursors/cursors/fleur
deleted file mode 100644
index 37dbafb..0000000
--- a/etc/FossaCursors/cursors/fleur
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/forbidden b/etc/FossaCursors/cursors/forbidden
deleted file mode 120000
index 226af18..0000000
--- a/etc/FossaCursors/cursors/forbidden
+++ /dev/null
@@ -1 +0,0 @@
-no-drop \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/grab b/etc/FossaCursors/cursors/grab
deleted file mode 120000
index 0834bff..0000000
--- a/etc/FossaCursors/cursors/grab
+++ /dev/null
@@ -1 +0,0 @@
-openhand \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/grabbing b/etc/FossaCursors/cursors/grabbing
deleted file mode 120000
index 3e94178..0000000
--- a/etc/FossaCursors/cursors/grabbing
+++ /dev/null
@@ -1 +0,0 @@
-closedhand \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/h_double_arrow b/etc/FossaCursors/cursors/h_double_arrow
deleted file mode 120000
index e0da659..0000000
--- a/etc/FossaCursors/cursors/h_double_arrow
+++ /dev/null
@@ -1 +0,0 @@
-size_hor \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/half-busy b/etc/FossaCursors/cursors/half-busy
deleted file mode 120000
index a305d5c..0000000
--- a/etc/FossaCursors/cursors/half-busy
+++ /dev/null
@@ -1 +0,0 @@
-progress \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/hand1 b/etc/FossaCursors/cursors/hand1
deleted file mode 120000
index 5ba3f42..0000000
--- a/etc/FossaCursors/cursors/hand1
+++ /dev/null
@@ -1 +0,0 @@
-pointer \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/hand2 b/etc/FossaCursors/cursors/hand2
deleted file mode 120000
index 5ba3f42..0000000
--- a/etc/FossaCursors/cursors/hand2
+++ /dev/null
@@ -1 +0,0 @@
-pointer \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/help b/etc/FossaCursors/cursors/help
deleted file mode 100644
index 2f70bae..0000000
--- a/etc/FossaCursors/cursors/help
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/ibeam b/etc/FossaCursors/cursors/ibeam
deleted file mode 120000
index f3a3485..0000000
--- a/etc/FossaCursors/cursors/ibeam
+++ /dev/null
@@ -1 +0,0 @@
-text \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/left-arrow b/etc/FossaCursors/cursors/left-arrow
deleted file mode 100644
index 3c7e43c..0000000
--- a/etc/FossaCursors/cursors/left-arrow
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/left_ptr b/etc/FossaCursors/cursors/left_ptr
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/left_ptr
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/left_ptr_help b/etc/FossaCursors/cursors/left_ptr_help
deleted file mode 120000
index 4cea3ac..0000000
--- a/etc/FossaCursors/cursors/left_ptr_help
+++ /dev/null
@@ -1 +0,0 @@
-help \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/left_ptr_watch b/etc/FossaCursors/cursors/left_ptr_watch
deleted file mode 120000
index a305d5c..0000000
--- a/etc/FossaCursors/cursors/left_ptr_watch
+++ /dev/null
@@ -1 +0,0 @@
-progress \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/left_side b/etc/FossaCursors/cursors/left_side
deleted file mode 100644
index 97137ff..0000000
--- a/etc/FossaCursors/cursors/left_side
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/link b/etc/FossaCursors/cursors/link
deleted file mode 120000
index c4ad821..0000000
--- a/etc/FossaCursors/cursors/link
+++ /dev/null
@@ -1 +0,0 @@
-alias \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/move b/etc/FossaCursors/cursors/move
deleted file mode 120000
index cbb52c1..0000000
--- a/etc/FossaCursors/cursors/move
+++ /dev/null
@@ -1 +0,0 @@
-dnd-move \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/n-resize b/etc/FossaCursors/cursors/n-resize
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/n-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/ne-resize b/etc/FossaCursors/cursors/ne-resize
deleted file mode 120000
index e0935e6..0000000
--- a/etc/FossaCursors/cursors/ne-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_bdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/nesw-resize b/etc/FossaCursors/cursors/nesw-resize
deleted file mode 120000
index e0935e6..0000000
--- a/etc/FossaCursors/cursors/nesw-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_bdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/no-drop b/etc/FossaCursors/cursors/no-drop
deleted file mode 100644
index a17c3fb..0000000
--- a/etc/FossaCursors/cursors/no-drop
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/not-allowed b/etc/FossaCursors/cursors/not-allowed
deleted file mode 100644
index 7b84df5..0000000
--- a/etc/FossaCursors/cursors/not-allowed
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/ns-resize b/etc/FossaCursors/cursors/ns-resize
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/ns-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/nw-resize b/etc/FossaCursors/cursors/nw-resize
deleted file mode 120000
index 913bbc3..0000000
--- a/etc/FossaCursors/cursors/nw-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_fdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/nwse-resize b/etc/FossaCursors/cursors/nwse-resize
deleted file mode 120000
index 913bbc3..0000000
--- a/etc/FossaCursors/cursors/nwse-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_fdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/openhand b/etc/FossaCursors/cursors/openhand
deleted file mode 100644
index 1bbb71b..0000000
--- a/etc/FossaCursors/cursors/openhand
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/pencil b/etc/FossaCursors/cursors/pencil
deleted file mode 100644
index 1dbbd4d..0000000
--- a/etc/FossaCursors/cursors/pencil
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/pirate b/etc/FossaCursors/cursors/pirate
deleted file mode 100644
index bc44671..0000000
--- a/etc/FossaCursors/cursors/pirate
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/plus b/etc/FossaCursors/cursors/plus
deleted file mode 120000
index d1b147b..0000000
--- a/etc/FossaCursors/cursors/plus
+++ /dev/null
@@ -1 +0,0 @@
-cell \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/pointer b/etc/FossaCursors/cursors/pointer
deleted file mode 100644
index cb91ac0..0000000
--- a/etc/FossaCursors/cursors/pointer
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/pointing_hand b/etc/FossaCursors/cursors/pointing_hand
deleted file mode 120000
index 5ba3f42..0000000
--- a/etc/FossaCursors/cursors/pointing_hand
+++ /dev/null
@@ -1 +0,0 @@
-pointer \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/progress b/etc/FossaCursors/cursors/progress
deleted file mode 100644
index 0a4be17..0000000
--- a/etc/FossaCursors/cursors/progress
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/question_arrow b/etc/FossaCursors/cursors/question_arrow
deleted file mode 120000
index 4cea3ac..0000000
--- a/etc/FossaCursors/cursors/question_arrow
+++ /dev/null
@@ -1 +0,0 @@
-help \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/right-arrow b/etc/FossaCursors/cursors/right-arrow
deleted file mode 100644
index f3cfb08..0000000
--- a/etc/FossaCursors/cursors/right-arrow
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/right_ptr b/etc/FossaCursors/cursors/right_ptr
deleted file mode 100644
index 153e6ef..0000000
--- a/etc/FossaCursors/cursors/right_ptr
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/right_side b/etc/FossaCursors/cursors/right_side
deleted file mode 100644
index 8e11dec..0000000
--- a/etc/FossaCursors/cursors/right_side
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/row-resize b/etc/FossaCursors/cursors/row-resize
deleted file mode 100644
index 5c8db35..0000000
--- a/etc/FossaCursors/cursors/row-resize
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/s-resize b/etc/FossaCursors/cursors/s-resize
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/s-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/sb_h_double_arrow b/etc/FossaCursors/cursors/sb_h_double_arrow
deleted file mode 120000
index e0da659..0000000
--- a/etc/FossaCursors/cursors/sb_h_double_arrow
+++ /dev/null
@@ -1 +0,0 @@
-size_hor \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/sb_v_double_arrow b/etc/FossaCursors/cursors/sb_v_double_arrow
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/sb_v_double_arrow
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/se-resize b/etc/FossaCursors/cursors/se-resize
deleted file mode 120000
index 913bbc3..0000000
--- a/etc/FossaCursors/cursors/se-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_fdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size-bdiag b/etc/FossaCursors/cursors/size-bdiag
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/size-bdiag
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size-fdiag b/etc/FossaCursors/cursors/size-fdiag
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/size-fdiag
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size-hor b/etc/FossaCursors/cursors/size-hor
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/size-hor
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size-ver b/etc/FossaCursors/cursors/size-ver
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/size-ver
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size_all b/etc/FossaCursors/cursors/size_all
deleted file mode 120000
index 147f744..0000000
--- a/etc/FossaCursors/cursors/size_all
+++ /dev/null
@@ -1 +0,0 @@
-fleur \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/size_bdiag b/etc/FossaCursors/cursors/size_bdiag
deleted file mode 100644
index 6459e1d..0000000
--- a/etc/FossaCursors/cursors/size_bdiag
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/size_fdiag b/etc/FossaCursors/cursors/size_fdiag
deleted file mode 100644
index 102a769..0000000
--- a/etc/FossaCursors/cursors/size_fdiag
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/size_hor b/etc/FossaCursors/cursors/size_hor
deleted file mode 100644
index 4112611..0000000
--- a/etc/FossaCursors/cursors/size_hor
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/size_ver b/etc/FossaCursors/cursors/size_ver
deleted file mode 100644
index 9516ce2..0000000
--- a/etc/FossaCursors/cursors/size_ver
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/split_h b/etc/FossaCursors/cursors/split_h
deleted file mode 120000
index 3ce0e22..0000000
--- a/etc/FossaCursors/cursors/split_h
+++ /dev/null
@@ -1 +0,0 @@
-col-resize \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/split_v b/etc/FossaCursors/cursors/split_v
deleted file mode 120000
index 93d9c89..0000000
--- a/etc/FossaCursors/cursors/split_v
+++ /dev/null
@@ -1 +0,0 @@
-row-resize \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/sw-resize b/etc/FossaCursors/cursors/sw-resize
deleted file mode 120000
index e0935e6..0000000
--- a/etc/FossaCursors/cursors/sw-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_bdiag \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/text b/etc/FossaCursors/cursors/text
deleted file mode 100644
index a7e95b6..0000000
--- a/etc/FossaCursors/cursors/text
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/top_left_arrow b/etc/FossaCursors/cursors/top_left_arrow
deleted file mode 120000
index 331d858..0000000
--- a/etc/FossaCursors/cursors/top_left_arrow
+++ /dev/null
@@ -1 +0,0 @@
-default \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/top_left_corner b/etc/FossaCursors/cursors/top_left_corner
deleted file mode 100644
index 5c3095d..0000000
--- a/etc/FossaCursors/cursors/top_left_corner
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/top_right_corner b/etc/FossaCursors/cursors/top_right_corner
deleted file mode 100644
index 59ad394..0000000
--- a/etc/FossaCursors/cursors/top_right_corner
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/top_side b/etc/FossaCursors/cursors/top_side
deleted file mode 100644
index ecf6483..0000000
--- a/etc/FossaCursors/cursors/top_side
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/up-arrow b/etc/FossaCursors/cursors/up-arrow
deleted file mode 100644
index aa94d1d..0000000
--- a/etc/FossaCursors/cursors/up-arrow
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/v_double_arrow b/etc/FossaCursors/cursors/v_double_arrow
deleted file mode 120000
index fb54fee..0000000
--- a/etc/FossaCursors/cursors/v_double_arrow
+++ /dev/null
@@ -1 +0,0 @@
-size_ver \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/vertical-text b/etc/FossaCursors/cursors/vertical-text
deleted file mode 100644
index 8ffa8b5..0000000
--- a/etc/FossaCursors/cursors/vertical-text
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/w-resize b/etc/FossaCursors/cursors/w-resize
deleted file mode 120000
index e0da659..0000000
--- a/etc/FossaCursors/cursors/w-resize
+++ /dev/null
@@ -1 +0,0 @@
-size_hor \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/wait b/etc/FossaCursors/cursors/wait
deleted file mode 100644
index 289b4e3..0000000
--- a/etc/FossaCursors/cursors/wait
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/watch b/etc/FossaCursors/cursors/watch
deleted file mode 120000
index fd80437..0000000
--- a/etc/FossaCursors/cursors/watch
+++ /dev/null
@@ -1 +0,0 @@
-wait \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/wayland-cursor b/etc/FossaCursors/cursors/wayland-cursor
deleted file mode 100644
index 8e28f56..0000000
--- a/etc/FossaCursors/cursors/wayland-cursor
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/whats_this b/etc/FossaCursors/cursors/whats_this
deleted file mode 120000
index 4cea3ac..0000000
--- a/etc/FossaCursors/cursors/whats_this
+++ /dev/null
@@ -1 +0,0 @@
-help \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/x-cursor b/etc/FossaCursors/cursors/x-cursor
deleted file mode 100644
index 4a019f2..0000000
--- a/etc/FossaCursors/cursors/x-cursor
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/xterm b/etc/FossaCursors/cursors/xterm
deleted file mode 120000
index f3a3485..0000000
--- a/etc/FossaCursors/cursors/xterm
+++ /dev/null
@@ -1 +0,0 @@
-text \ No newline at end of file
diff --git a/etc/FossaCursors/cursors/zoom-in b/etc/FossaCursors/cursors/zoom-in
deleted file mode 100644
index a37aba9..0000000
--- a/etc/FossaCursors/cursors/zoom-in
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/cursors/zoom-out b/etc/FossaCursors/cursors/zoom-out
deleted file mode 100644
index 4eb3d6d..0000000
--- a/etc/FossaCursors/cursors/zoom-out
+++ /dev/null
Binary files differ
diff --git a/etc/FossaCursors/index.theme b/etc/FossaCursors/index.theme
deleted file mode 100644
index 07a7064..0000000
--- a/etc/FossaCursors/index.theme
+++ /dev/null
@@ -1,3 +0,0 @@
-[Icon Theme]
-Name=FossaCursors
-Comment=Fossa cursors based on breeze theme by the KDE VDG
diff --git a/etc/autostart.sh b/etc/autostart.sh
deleted file mode 100755
index f646755..0000000
--- a/etc/autostart.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-# A script run by dwm when it starts
-feh --bg-fill ~/.config/wallpaper.jpg
-dwmblocks &
-picom --experimental-backends &
-dunst &
diff --git a/etc/clean b/etc/clean
index 6cf362c..b422c79 100755
--- a/etc/clean
+++ b/etc/clean
@@ -1,9 +1,9 @@
#!/bin/sh
# This script is used to test new installations of sarc and delete current ones
-sudo rm -r ~/.config/sarc
sudo rm /usr/local/bin/dm*
sudo rm /usr/local/bin/dwm*
sudo rm /usr/local/bin/st*
-rm ~/.xinitrc
-
+sudo rm /usr/local/bin/ss
+sudo rm /etc/wallpaper*
+sudo pacman -Rnsc sarc
diff --git a/etc/cursor b/etc/cursor
deleted file mode 100755
index 6dccfea..0000000
--- a/etc/cursor
+++ /dev/null
@@ -1,8 +0,0 @@
-mkdir -p ~/.icons/default
-mkdir -p ~/.config/gtk-3.0/
-
-echo "[icon theme]" >> ~/.icons/default/index.theme
-echo "Inherits=FossaCursors" >> ~/.icons/default/index.theme
-
-echo "[Settings]" >> ~/.config/gtk-3.0/settings.ini
-echo "gtk-cursor-theme-name=FossaCursors" >> ~/.config/gtk-3.0/settings.ini
diff --git a/etc/wallpaper/liquid_blue.wallpaper.jpg b/etc/wallpaper/liquid_blue.wallpaper.jpg
new file mode 100644
index 0000000..7f6baf5
--- /dev/null
+++ b/etc/wallpaper/liquid_blue.wallpaper.jpg
Binary files differ
diff --git a/etc/wallpaper/liquid_red.wallpaper.jpg b/etc/wallpaper/liquid_red.wallpaper.jpg
new file mode 100644
index 0000000..3e2a4bc
--- /dev/null
+++ b/etc/wallpaper/liquid_red.wallpaper.jpg
Binary files differ
diff --git a/etc/wallpaper/nord.wallpaper.jpg b/etc/wallpaper/nord.wallpaper.jpg
index 2b315fb..e84e3e5 100644
--- a/etc/wallpaper/nord.wallpaper.jpg
+++ b/etc/wallpaper/nord.wallpaper.jpg
Binary files differ
diff --git a/install.sh b/install.sh
deleted file mode 100755
index 027b386..0000000
--- a/install.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/bash
-
-# On Artix Linux install artix-archlinux-support before running the script
-
-sudo pacman -S --needed wpa_supplicant networkmanager ttf-joypixels iw dhcpcd adobe-source-code-pro-fonts falkon libnotify dunst picom light feh xorg xorg-xinit pulseaudio
-clear
-
-# Sets variables here
-dwm="dwm-6.2"
-st="st"
-dmenu="dmenu-5.0"
-
-echo "Welcome to the sarc installation"
-echo ""
-
-echo "What theme do you want to use? Current themes are down below:"
-echo
-ls themes/
-echo
-echo "Enter what theme you want here:" && read theme
-echo
-echo "Theme is $theme"
-pwd
-cp themes/$theme theme.h
-
-cd $dwm
-make clean
-make -s
-sudo make -s install
-
-cd ../dwmblocks
-make -s
-sudo make -s install
-
-cd ../$st
-make clean
-make -s
-sudo make -s install
-
-cd ../$dmenu
-make -s
-sudo make -s install
-
-cd ..
-mkdir ~/.config/
-
-cp etc/.xinitrc ~
-cp etc/wallpaper/$theme.wallpaper.jpg ~/.config/wallpaper.jpg
-
-sudo cp bin/* /usr/local/bin
-rm theme.h
-
-echo
-tput setaf 2 && echo "Installation is complete!"
diff --git a/st-0.8.4/FAQ b/st-0.8.4/FAQ
new file mode 100644
index 0000000..0f9609d
--- /dev/null
+++ b/st-0.8.4/FAQ
@@ -0,0 +1,250 @@
+## Why does st not handle utmp entries?
+
+Use the excellent tool of [utmp](https://git.suckless.org/utmp/) for this task.
+
+
+## Some _random program_ complains that st is unknown/not recognised/unsupported/whatever!
+
+It means that st doesn’t have any terminfo entry on your system. Chances are
+you did not `make install`. If you just want to test it without installing it,
+you can manually run `tic -sx st.info`.
+
+
+## Nothing works, and nothing is said about an unknown terminal!
+
+* Some programs just assume they’re running in xterm i.e. they don’t rely on
+ terminfo. What you see is the current state of the “xterm compliance”.
+* Some programs don’t complain about the lacking st description and default to
+ another terminal. In that case see the question about terminfo.
+
+
+## How do I scroll back up?
+
+* Using a terminal multiplexer.
+ * `st -e tmux` using C-b [
+ * `st -e screen` using C-a ESC
+* Using the excellent tool of [scroll](https://git.suckless.org/scroll/).
+* Using the scrollback [patch](https://st.suckless.org/patches/scrollback/).
+
+
+## I would like to have utmp and/or scroll functionality by default
+
+You can add the absolute patch of both programs in your config.h
+file. You only have to modify the value of utmp and scroll variables.
+
+
+## Why doesn't the Del key work in some programs?
+
+Taken from the terminfo manpage:
+
+ If the terminal has a keypad that transmits codes when the keys
+ are pressed, this information can be given. Note that it is not
+ possible to handle terminals where the keypad only works in
+ local (this applies, for example, to the unshifted HP 2621 keys).
+ If the keypad can be set to transmit or not transmit, give these
+ codes as smkx and rmkx. Otherwise the keypad is assumed to
+ always transmit.
+
+In the st case smkx=E[?1hE= and rmkx=E[?1lE>, so it is mandatory that
+applications which want to test against keypad keys send these
+sequences.
+
+But buggy applications (like bash and irssi, for example) don't do this. A fast
+solution for them is to use the following command:
+
+ $ printf '\033[?1h\033=' >/dev/tty
+
+or
+ $ tput smkx
+
+In the case of bash, readline is used. Readline has a different note in its
+manpage about this issue:
+
+ enable-keypad (Off)
+ When set to On, readline will try to enable the
+ application keypad when it is called. Some systems
+ need this to enable arrow keys.
+
+Adding this option to your .inputrc will fix the keypad problem for all
+applications using readline.
+
+If you are using zsh, then read the zsh FAQ
+<http://zsh.sourceforge.net/FAQ/zshfaq03.html#l25>:
+
+ It should be noted that the O / [ confusion can occur with other keys
+ such as Home and End. Some systems let you query the key sequences
+ sent by these keys from the system's terminal database, terminfo.
+ Unfortunately, the key sequences given there typically apply to the
+ mode that is not the one zsh uses by default (it's the "application"
+ mode rather than the "raw" mode). Explaining the use of terminfo is
+ outside of the scope of this FAQ, but if you wish to use the key
+ sequences given there you can tell the line editor to turn on
+ "application" mode when it starts and turn it off when it stops:
+
+ function zle-line-init () { echoti smkx }
+ function zle-line-finish () { echoti rmkx }
+ zle -N zle-line-init
+ zle -N zle-line-finish
+
+Putting these lines into your .zshrc will fix the problems.
+
+
+## How can I use meta in 8bit mode?
+
+St supports meta in 8bit mode, but the default terminfo entry doesn't
+use this capability. If you want it, you have to use the 'st-meta' value
+in TERM.
+
+
+## I cannot compile st in OpenBSD
+
+OpenBSD lacks librt, despite it being mandatory in POSIX
+<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html#tag_20_11_13>.
+If you want to compile st for OpenBSD you have to remove -lrt from config.mk, and
+st will compile without any loss of functionality, because all the functions are
+included in libc on this platform.
+
+
+## The Backspace Case
+
+St is emulating the Linux way of handling backspace being delete and delete being
+backspace.
+
+This is an issue that was discussed in suckless mailing list
+<https://lists.suckless.org/dev/1404/20697.html>. Here is why some old grumpy
+terminal users wants its backspace to be how he feels it:
+
+ Well, I am going to comment why I want to change the behaviour
+ of this key. When ASCII was defined in 1968, communication
+ with computers was done using punched cards, or hardcopy
+ terminals (basically a typewriter machine connected with the
+ computer using a serial port). ASCII defines DELETE as 7F,
+ because, in punched-card terms, it means all the holes of the
+ card punched; it is thus a kind of 'physical delete'. In the
+ same way, the BACKSPACE key was a non-destructive backspace,
+ as on a typewriter. So, if you wanted to delete a character,
+ you had to BACKSPACE and then DELETE. Another use of BACKSPACE
+ was to type accented characters, for example 'a BACKSPACE `'.
+ The VT100 had no BACKSPACE key; it was generated using the
+ CONTROL key as another control character (CONTROL key sets to
+ 0 b7 b6 b5, so it converts H (code 0x48) into BACKSPACE (code
+ 0x08)), but it had a DELETE key in a similar position where
+ the BACKSPACE key is located today on common PC keyboards.
+ All the terminal emulators emulated the difference between
+ these keys correctly: the backspace key generated a BACKSPACE
+ (^H) and delete key generated a DELETE (^?).
+
+ But a problem arose when Linus Torvalds wrote Linux. Unlike
+ earlier terminals, the Linux virtual terminal (the terminal
+ emulator integrated in the kernel) returned a DELETE when
+ backspace was pressed, due to the VT100 having a DELETE key in
+ the same position. This created a lot of problems (see [1]
+ and [2]). Since Linux has become the king, a lot of terminal
+ emulators today generate a DELETE when the backspace key is
+ pressed in order to avoid problems with Linux. The result is
+ that the only way of generating a BACKSPACE on these systems
+ is by using CONTROL + H. (I also think that emacs had an
+ important point here because the CONTROL + H prefix is used
+ in emacs in some commands (help commands).)
+
+ From point of view of the kernel, you can change the key
+ for deleting a previous character with stty erase. When you
+ connect a real terminal into a machine you describe the type
+ of terminal, so getty configures the correct value of stty
+ erase for this terminal. In the case of terminal emulators,
+ however, you don't have any getty that can set the correct
+ value of stty erase, so you always get the default value.
+ For this reason, it is necessary to add 'stty erase ^H' to your
+ profile if you have changed the value of the backspace key.
+ Of course, another solution is for st itself to modify the
+ value of stty erase. I usually have the inverse problem:
+ when I connect to non-Unix machines, I have to press CONTROL +
+ h to get a BACKSPACE. The inverse problem occurs when a user
+ connects to my Unix machines from a different system with a
+ correct backspace key.
+
+ [1] http://www.ibb.net/~anne/keyboard.html
+ [2] http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html
+
+
+## But I really want the old grumpy behaviour of my terminal
+
+Apply [1].
+
+[1] https://st.suckless.org/patches/delkey
+
+
+## Why do images not work in st using the w3m image hack?
+
+w3mimg uses a hack that draws an image on top of the terminal emulator Drawable
+window. The hack relies on the terminal to use a single buffer to draw its
+contents directly.
+
+st uses double-buffered drawing so the image is quickly replaced and may show a
+short flicker effect.
+
+Below is a patch example to change st double-buffering to a single Drawable
+buffer.
+
+diff --git a/x.c b/x.c
+--- a/x.c
++++ b/x.c
+@@ -732,10 +732,6 @@ xresize(int col, int row)
+ win.tw = col * win.cw;
+ win.th = row * win.ch;
+
+- XFreePixmap(xw.dpy, xw.buf);
+- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
+- DefaultDepth(xw.dpy, xw.scr));
+- XftDrawChange(xw.draw, xw.buf);
+ xclear(0, 0, win.w, win.h);
+
+ /* resize to new width */
+@@ -1148,8 +1144,7 @@ xinit(int cols, int rows)
+ gcvalues.graphics_exposures = False;
+ dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
+ &gcvalues);
+- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
+- DefaultDepth(xw.dpy, xw.scr));
++ xw.buf = xw.win;
+ XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
+ XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
+
+@@ -1632,8 +1627,6 @@ xdrawline(Line line, int x1, int y1, int x2)
+ void
+ xfinishdraw(void)
+ {
+- XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w,
+- win.h, 0, 0);
+ XSetForeground(xw.dpy, dc.gc,
+ dc.col[IS_SET(MODE_REVERSE)?
+ defaultfg : defaultbg].pixel);
+
+
+## BadLength X error in Xft when trying to render emoji
+
+Xft makes st crash when rendering color emojis with the following error:
+
+"X Error of failed request: BadLength (poly request too large or internal Xlib length error)"
+ Major opcode of failed request: 139 (RENDER)
+ Minor opcode of failed request: 20 (RenderAddGlyphs)
+ Serial number of failed request: 1595
+ Current serial number in output stream: 1818"
+
+This is a known bug in Xft (not st) which happens on some platforms and
+combination of particular fonts and fontconfig settings.
+
+See also:
+https://gitlab.freedesktop.org/xorg/lib/libxft/issues/6
+https://bugs.freedesktop.org/show_bug.cgi?id=107534
+https://bugzilla.redhat.com/show_bug.cgi?id=1498269
+
+The solution is to remove color emoji fonts or disable this in the fontconfig
+XML configuration. As an ugly workaround (which may work only on newer
+fontconfig versions (FC_COLOR)), the following code can be used to mask color
+fonts:
+
+ FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
+
+Please don't bother reporting this bug to st, but notify the upstream Xft
+developers about fixing this bug.
diff --git a/st-0.8.4/LEGACY b/st-0.8.4/LEGACY
new file mode 100644
index 0000000..bf28b1e
--- /dev/null
+++ b/st-0.8.4/LEGACY
@@ -0,0 +1,17 @@
+A STATEMENT ON LEGACY SUPPORT
+
+In the terminal world there is much cruft that comes from old and unsup‐
+ported terminals that inherit incompatible modes and escape sequences
+which noone is able to know, except when he/she comes from that time and
+developed a graphical vt100 emulator at that time.
+
+One goal of st is to only support what is really needed. When you en‐
+counter a sequence which you really need, implement it. But while you
+are at it, do not add the other cruft you might encounter while sneek‐
+ing at other terminal emulators. History has bloated them and there is
+no real evidence that most of the sequences are used today.
+
+
+Christoph Lohmann <20h@r-36.net>
+2012-09-13T07:00:36.081271045+02:00
+
diff --git a/st/LICENSE b/st-0.8.4/LICENSE
index d80eb47..d80eb47 100644
--- a/st/LICENSE
+++ b/st-0.8.4/LICENSE
diff --git a/st/Makefile b/st-0.8.4/Makefile
index 02045f0..470ac86 100644
--- a/st/Makefile
+++ b/st-0.8.4/Makefile
@@ -4,7 +4,7 @@
include config.mk
-SRC = st.c x.c boxdraw.c hb.c
+SRC = st.c x.c
OBJ = $(SRC:.c=.o)
all: options st
@@ -15,13 +15,14 @@ options:
@echo "LDFLAGS = $(STLDFLAGS)"
@echo "CC = $(CC)"
+config.h:
+ cp config.def.h config.h
+
.c.o:
$(CC) $(STCFLAGS) -c $<
st.o: config.h st.h win.h
-x.o: arg.h config.h st.h win.h hb.h
-hb.o: st.h
-boxdraw.o: config.h st.h boxdraw_data.h
+x.o: arg.h config.h st.h win.h
$(OBJ): config.h config.mk
@@ -29,12 +30,12 @@ st: $(OBJ)
$(CC) -o $@ $(OBJ) $(STLDFLAGS)
clean:
- rm -f st $(OBJ) st-$(VERSION).tar.gz *.rej *.orig *.o
+ rm -f st $(OBJ) st-$(VERSION).tar.gz
dist: clean
mkdir -p st-$(VERSION)
cp -R FAQ LEGACY TODO LICENSE Makefile README config.mk\
- config.h st.info st.1 arg.h st.h win.h $(SRC)\
+ config.def.h st.info st.1 arg.h st.h win.h $(SRC)\
st-$(VERSION)
tar -cf - st-$(VERSION) | gzip > st-$(VERSION).tar.gz
rm -rf st-$(VERSION)
@@ -42,11 +43,7 @@ dist: clean
install: st
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f st $(DESTDIR)$(PREFIX)/bin
- cp -f st-copyout $(DESTDIR)$(PREFIX)/bin
- cp -f st-urlhandler $(DESTDIR)$(PREFIX)/bin
chmod 755 $(DESTDIR)$(PREFIX)/bin/st
- chmod 755 $(DESTDIR)$(PREFIX)/bin/st-copyout
- chmod 755 $(DESTDIR)$(PREFIX)/bin/st-urlhandler
mkdir -p $(DESTDIR)$(MANPREFIX)/man1
sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1
chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1
@@ -55,8 +52,6 @@ install: st
uninstall:
rm -f $(DESTDIR)$(PREFIX)/bin/st
- rm -f $(DESTDIR)$(PREFIX)/bin/st-copyout
- rm -f $(DESTDIR)$(PREFIX)/bin/st-urlhandler
rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1
.PHONY: all options clean dist install uninstall
diff --git a/st-0.8.4/README b/st-0.8.4/README
new file mode 100644
index 0000000..6a846ed
--- /dev/null
+++ b/st-0.8.4/README
@@ -0,0 +1,34 @@
+st - simple terminal
+--------------------
+st is a simple terminal emulator for X which sucks less.
+
+
+Requirements
+------------
+In order to build st you need the Xlib header files.
+
+
+Installation
+------------
+Edit config.mk to match your local setup (st is installed into
+the /usr/local namespace by default).
+
+Afterwards enter the following command to build and install st (if
+necessary as root):
+
+ make clean install
+
+
+Running st
+----------
+If you did not install st with make clean install, you must compile
+the st terminfo entry with the following command:
+
+ tic -sx st.info
+
+See the man page for additional details.
+
+Credits
+-------
+Based on Aurélien APTEL <aurelien dot aptel at gmail dot com> bt source code.
+
diff --git a/st-0.8.4/TODO b/st-0.8.4/TODO
new file mode 100644
index 0000000..5f74cd5
--- /dev/null
+++ b/st-0.8.4/TODO
@@ -0,0 +1,28 @@
+vt emulation
+------------
+
+* double-height support
+
+code & interface
+----------------
+
+* add a simple way to do multiplexing
+
+drawing
+-------
+* add diacritics support to xdraws()
+ * switch to a suckless font drawing library
+* make the font cache simpler
+* add better support for brightening of the upper colors
+
+bugs
+----
+
+* fix shift up/down (shift selection in emacs)
+* remove DEC test sequence when appropriate
+
+misc
+----
+
+ $ grep -nE 'XXX|TODO' st.c
+
diff --git a/st/arg.h b/st-0.8.4/arg.h
index a22e019..a22e019 100644
--- a/st/arg.h
+++ b/st-0.8.4/arg.h
diff --git a/st-0.8.4/config.def.h b/st-0.8.4/config.def.h
new file mode 100644
index 0000000..3c44ee0
--- /dev/null
+++ b/st-0.8.4/config.def.h
@@ -0,0 +1,487 @@
+/* See LICENSE file for copyright and license details. */
+
+/*
+ * appearance
+ *
+ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
+ */
+static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
+static int borderpx = 2;
+
+/*
+ * What program is execed by st depends of these precedence rules:
+ * 1: program passed with -e
+ * 2: scroll and/or utmp
+ * 3: SHELL environment variable
+ * 4: value of shell in /etc/passwd
+ * 5: value of shell in config.h
+ */
+static char *shell = "/bin/sh";
+char *utmp = NULL;
+/* scroll program: to enable use a string like "scroll" */
+char *scroll = NULL;
+char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
+
+/* identification sequence returned in DA and DECID */
+char *vtiden = "\033[?6c";
+
+/* Kerning / character bounding-box multipliers */
+static float cwscale = 1.0;
+static float chscale = 1.0;
+
+/*
+ * word delimiter string
+ *
+ * More advanced example: L" `'\"()[]{}"
+ */
+wchar_t *worddelimiters = L" ";
+
+/* selection timeouts (in milliseconds) */
+static unsigned int doubleclicktimeout = 300;
+static unsigned int tripleclicktimeout = 600;
+
+/* alt screens */
+int allowaltscreen = 1;
+
+/* allow certain non-interactive (insecure) window operations such as:
+ setting the clipboard text */
+int allowwindowops = 0;
+
+/*
+ * draw latency range in ms - from new content/keypress/etc until drawing.
+ * within this range, st draws when content stops arriving (idle). mostly it's
+ * near minlatency, but it waits longer for slow updates to avoid partial draw.
+ * low minlatency will tear/flicker more, as it can "detect" idle too early.
+ */
+static double minlatency = 8;
+static double maxlatency = 33;
+
+/*
+ * blinking timeout (set to 0 to disable blinking) for the terminal blinking
+ * attribute.
+ */
+static unsigned int blinktimeout = 800;
+
+/*
+ * thickness of underline and bar cursors
+ */
+static unsigned int cursorthickness = 2;
+
+/*
+ * bell volume. It must be a value between -100 and 100. Use 0 for disabling
+ * it
+ */
+static int bellvolume = 0;
+
+/* default TERM value */
+char *termname = "st-256color";
+
+/*
+ * spaces per tab
+ *
+ * When you are changing this value, don't forget to adapt the »it« value in
+ * the st.info and appropriately install the st.info in the environment where
+ * you use this st version.
+ *
+ * it#$tabspaces,
+ *
+ * Secondly make sure your kernel is not expanding tabs. When running `stty
+ * -a` »tab0« should appear. You can tell the terminal to not expand tabs by
+ * running following command:
+ *
+ * stty tabs
+ */
+unsigned int tabspaces = 8;
+
+/* bg opacity */
+float alpha = 0.8;
+
+/* Terminal colors (16 first used in escape sequence) */
+static const char *colorname[] = {
+ /* 8 normal colors */
+ "black",
+ "red3",
+ "green3",
+ "yellow3",
+ "blue2",
+ "magenta3",
+ "cyan3",
+ "gray90",
+
+ /* 8 bright colors */
+ "gray50",
+ "red",
+ "green",
+ "yellow",
+ "#5c5cff",
+ "magenta",
+ "cyan",
+ "white",
+
+ [255] = 0,
+
+ /* more colors can be added after 255 to use with DefaultXX */
+ "#cccccc",
+ "#555555",
+ "black",
+};
+
+
+/*
+ * Default colors (colorname index)
+ * foreground, background, cursor, reverse cursor
+ */
+unsigned int defaultfg = 7;
+unsigned int defaultbg = 258;
+static unsigned int defaultcs = 256;
+static unsigned int defaultrcs = 257;
+
+/*
+ * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
+ * Default style of cursor
+ * 0: Blinking block
+ * 1: Blinking block (default)
+ * 2: Steady block ("█")
+ * 3: Blinking underline
+ * 4: Steady underline ("_")
+ * 5: Blinking bar
+ * 6: Steady bar ("|")
+ * 7: Blinking st cursor
+ * 8: Steady st cursor
+ */
+static unsigned int cursorstyle = 1;
+static Rune stcursor = 0x2603; /* snowman (U+2603) */
+
+/*
+ * Default columns and rows numbers
+ */
+
+static unsigned int cols = 80;
+static unsigned int rows = 24;
+
+/*
+ * Default colour and shape of the mouse cursor
+ */
+static unsigned int mouseshape = XC_xterm;
+static unsigned int mousefg = 7;
+static unsigned int mousebg = 0;
+
+/*
+ * Color used to display font attributes when fontconfig selected a font which
+ * doesn't match the ones requested.
+ */
+static unsigned int defaultattr = 11;
+
+/*
+ * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set).
+ * Note that if you want to use ShiftMask with selmasks, set this to an other
+ * modifier, set to 0 to not use it.
+ */
+static uint forcemousemod = ShiftMask;
+
+/*
+ * Internal mouse shortcuts.
+ * Beware that overloading Button1 will disable the selection.
+ */
+static MouseShortcut mshortcuts[] = {
+ /* mask button function argument release */
+ { ShiftMask, Button4, kscrollup, {.i = 1} },
+ { ShiftMask, Button5, kscrolldown, {.i = 1} },
+ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
+ { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
+ { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
+ { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} },
+ { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} },
+};
+
+/* Internal keyboard shortcuts. */
+#define MODKEY Mod1Mask
+#define TERMMOD (ControlMask|ShiftMask)
+
+static Shortcut shortcuts[] = {
+ /* mask keysym function argument */
+ { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} },
+ { ControlMask, XK_Print, toggleprinter, {.i = 0} },
+ { ShiftMask, XK_Print, printscreen, {.i = 0} },
+ { XK_ANY_MOD, XK_Print, printsel, {.i = 0} },
+ { TERMMOD, XK_Prior, zoom, {.f = +1} },
+ { TERMMOD, XK_Next, zoom, {.f = -1} },
+ { TERMMOD, XK_Home, zoomreset, {.f = 0} },
+ { TERMMOD, XK_C, clipcopy, {.i = 0} },
+ { TERMMOD, XK_V, clippaste, {.i = 0} },
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
+ { ShiftMask, XK_Insert, selpaste, {.i = 0} },
+ { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
+ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
+ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
+};
+
+/*
+ * Special keys (change & recompile st.info accordingly)
+ *
+ * Mask value:
+ * * Use XK_ANY_MOD to match the key no matter modifiers state
+ * * Use XK_NO_MOD to match the key alone (no modifiers)
+ * appkey value:
+ * * 0: no value
+ * * > 0: keypad application mode enabled
+ * * = 2: term.numlock = 1
+ * * < 0: keypad application mode disabled
+ * appcursor value:
+ * * 0: no value
+ * * > 0: cursor application mode enabled
+ * * < 0: cursor application mode disabled
+ *
+ * Be careful with the order of the definitions because st searches in
+ * this table sequentially, so any XK_ANY_MOD must be in the last
+ * position for a key.
+ */
+
+/*
+ * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
+ * to be mapped below, add them to this array.
+ */
+static KeySym mappedkeys[] = { -1 };
+
+/*
+ * State bits to ignore when matching key or button events. By default,
+ * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored.
+ */
+static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
+
+/*
+ * This is the huge key array which defines all compatibility to the Linux
+ * world. Please decide about changes wisely.
+ */
+static Key key[] = {
+ /* keysym mask string appkey appcursor */
+ { XK_KP_Home, ShiftMask, "\033[2J", 0, -1},
+ { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1},
+ { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1},
+ { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1},
+ { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0},
+ { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1},
+ { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1},
+ { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0},
+ { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1},
+ { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1},
+ { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0},
+ { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1},
+ { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1},
+ { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0},
+ { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1},
+ { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1},
+ { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0},
+ { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0},
+ { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0},
+ { XK_KP_End, ControlMask, "\033[J", -1, 0},
+ { XK_KP_End, ControlMask, "\033[1;5F", +1, 0},
+ { XK_KP_End, ShiftMask, "\033[K", -1, 0},
+ { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0},
+ { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0},
+ { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0},
+ { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0},
+ { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0},
+ { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0},
+ { XK_KP_Insert, ControlMask, "\033[L", -1, 0},
+ { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0},
+ { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0},
+ { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0},
+ { XK_KP_Delete, ControlMask, "\033[M", -1, 0},
+ { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0},
+ { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0},
+ { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0},
+ { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0},
+ { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0},
+ { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0},
+ { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0},
+ { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0},
+ { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0},
+ { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0},
+ { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0},
+ { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0},
+ { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0},
+ { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0},
+ { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0},
+ { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0},
+ { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0},
+ { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0},
+ { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0},
+ { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0},
+ { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0},
+ { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0},
+ { XK_Up, ShiftMask, "\033[1;2A", 0, 0},
+ { XK_Up, Mod1Mask, "\033[1;3A", 0, 0},
+ { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0},
+ { XK_Up, ControlMask, "\033[1;5A", 0, 0},
+ { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0},
+ { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0},
+ { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0},
+ { XK_Up, XK_ANY_MOD, "\033[A", 0, -1},
+ { XK_Up, XK_ANY_MOD, "\033OA", 0, +1},
+ { XK_Down, ShiftMask, "\033[1;2B", 0, 0},
+ { XK_Down, Mod1Mask, "\033[1;3B", 0, 0},
+ { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0},
+ { XK_Down, ControlMask, "\033[1;5B", 0, 0},
+ { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0},
+ { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0},
+ { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0},
+ { XK_Down, XK_ANY_MOD, "\033[B", 0, -1},
+ { XK_Down, XK_ANY_MOD, "\033OB", 0, +1},
+ { XK_Left, ShiftMask, "\033[1;2D", 0, 0},
+ { XK_Left, Mod1Mask, "\033[1;3D", 0, 0},
+ { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0},
+ { XK_Left, ControlMask, "\033[1;5D", 0, 0},
+ { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0},
+ { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0},
+ { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0},
+ { XK_Left, XK_ANY_MOD, "\033[D", 0, -1},
+ { XK_Left, XK_ANY_MOD, "\033OD", 0, +1},
+ { XK_Right, ShiftMask, "\033[1;2C", 0, 0},
+ { XK_Right, Mod1Mask, "\033[1;3C", 0, 0},
+ { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0},
+ { XK_Right, ControlMask, "\033[1;5C", 0, 0},
+ { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0},
+ { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0},
+ { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0},
+ { XK_Right, XK_ANY_MOD, "\033[C", 0, -1},
+ { XK_Right, XK_ANY_MOD, "\033OC", 0, +1},
+ { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0},
+ { XK_Return, Mod1Mask, "\033\r", 0, 0},
+ { XK_Return, XK_ANY_MOD, "\r", 0, 0},
+ { XK_Insert, ShiftMask, "\033[4l", -1, 0},
+ { XK_Insert, ShiftMask, "\033[2;2~", +1, 0},
+ { XK_Insert, ControlMask, "\033[L", -1, 0},
+ { XK_Insert, ControlMask, "\033[2;5~", +1, 0},
+ { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0},
+ { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0},
+ { XK_Delete, ControlMask, "\033[M", -1, 0},
+ { XK_Delete, ControlMask, "\033[3;5~", +1, 0},
+ { XK_Delete, ShiftMask, "\033[2K", -1, 0},
+ { XK_Delete, ShiftMask, "\033[3;2~", +1, 0},
+ { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0},
+ { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0},
+ { XK_BackSpace, XK_NO_MOD, "\177", 0, 0},
+ { XK_BackSpace, Mod1Mask, "\033\177", 0, 0},
+ { XK_Home, ShiftMask, "\033[2J", 0, -1},
+ { XK_Home, ShiftMask, "\033[1;2H", 0, +1},
+ { XK_Home, XK_ANY_MOD, "\033[H", 0, -1},
+ { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1},
+ { XK_End, ControlMask, "\033[J", -1, 0},
+ { XK_End, ControlMask, "\033[1;5F", +1, 0},
+ { XK_End, ShiftMask, "\033[K", -1, 0},
+ { XK_End, ShiftMask, "\033[1;2F", +1, 0},
+ { XK_End, XK_ANY_MOD, "\033[4~", 0, 0},
+ { XK_Prior, ControlMask, "\033[5;5~", 0, 0},
+ { XK_Prior, ShiftMask, "\033[5;2~", 0, 0},
+ { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0},
+ { XK_Next, ControlMask, "\033[6;5~", 0, 0},
+ { XK_Next, ShiftMask, "\033[6;2~", 0, 0},
+ { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0},
+ { XK_F1, XK_NO_MOD, "\033OP" , 0, 0},
+ { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0},
+ { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0},
+ { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0},
+ { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0},
+ { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0},
+ { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0},
+ { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0},
+ { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0},
+ { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0},
+ { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0},
+ { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0},
+ { XK_F3, XK_NO_MOD, "\033OR" , 0, 0},
+ { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0},
+ { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0},
+ { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0},
+ { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0},
+ { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0},
+ { XK_F4, XK_NO_MOD, "\033OS" , 0, 0},
+ { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0},
+ { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0},
+ { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0},
+ { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0},
+ { XK_F5, XK_NO_MOD, "\033[15~", 0, 0},
+ { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0},
+ { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0},
+ { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0},
+ { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0},
+ { XK_F6, XK_NO_MOD, "\033[17~", 0, 0},
+ { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0},
+ { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0},
+ { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0},
+ { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0},
+ { XK_F7, XK_NO_MOD, "\033[18~", 0, 0},
+ { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0},
+ { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0},
+ { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0},
+ { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0},
+ { XK_F8, XK_NO_MOD, "\033[19~", 0, 0},
+ { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0},
+ { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0},
+ { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0},
+ { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0},
+ { XK_F9, XK_NO_MOD, "\033[20~", 0, 0},
+ { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0},
+ { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0},
+ { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0},
+ { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0},
+ { XK_F10, XK_NO_MOD, "\033[21~", 0, 0},
+ { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0},
+ { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0},
+ { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0},
+ { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0},
+ { XK_F11, XK_NO_MOD, "\033[23~", 0, 0},
+ { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0},
+ { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0},
+ { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0},
+ { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0},
+ { XK_F12, XK_NO_MOD, "\033[24~", 0, 0},
+ { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0},
+ { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0},
+ { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0},
+ { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0},
+ { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0},
+ { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0},
+ { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0},
+ { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0},
+ { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0},
+ { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0},
+ { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0},
+ { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0},
+ { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0},
+ { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0},
+ { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0},
+ { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0},
+ { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0},
+ { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0},
+ { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0},
+ { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0},
+ { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0},
+ { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0},
+ { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0},
+ { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0},
+ { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0},
+ { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0},
+ { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0},
+};
+
+/*
+ * Selection types' masks.
+ * Use the same masks as usual.
+ * Button1Mask is always unset, to make masks match between ButtonPress.
+ * ButtonRelease and MotionNotify.
+ * If no match is found, regular selection is used.
+ */
+static uint selmasks[] = {
+ [SEL_RECTANGULAR] = Mod1Mask,
+};
+
+/*
+ * Printable characters in ASCII, used to estimate the advance width
+ * of single wide characters.
+ */
+static char ascii_printable[] =
+ " !\"#$%&'()*+,-./0123456789:;<=>?"
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+ "`abcdefghijklmnopqrstuvwxyz{|}~";
diff --git a/st/config.h b/st-0.8.4/config.h
index ee96133..2036063 100644
--- a/st/config.h
+++ b/st-0.8.4/config.h
@@ -1,5 +1,3 @@
-#include "../theme.h"
-
/* See LICENSE file for copyright and license details. */
/*
@@ -8,8 +6,6 @@
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
*/
static char *font = "Source Code Pro:pixelsize=12:antialias=true:autohint=true";
-static char *font2[] = { "JoyPixels:pixelsize=12:antialias=true:autohint=true"};
-
static int borderpx = 2;
/*
@@ -20,7 +16,7 @@ static int borderpx = 2;
* 4: value of shell in /etc/passwd
* 5: value of shell in config.h
*/
-static char *shell = "/usr/bin/mksh";
+static char *shell = "/bin/sh";
char *utmp = NULL;
/* scroll program: to enable use a string like "scroll" */
char *scroll = NULL;
@@ -72,18 +68,6 @@ static unsigned int blinktimeout = 800;
static unsigned int cursorthickness = 2;
/*
- * 1: render most of the lines/blocks characters without using the font for
- * perfect alignment between cells (U2500 - U259F except dashes/diagonals).
- * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
- * 0: disable (render all U25XX glyphs normally from the font).
- */
-const int boxdraw = 1;
-const int boxdraw_bold = 0;
-
-/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */
-const int boxdraw_braille = 0;
-
-/*
* bell volume. It must be a value between -100 and 100. Use 0 for disabling
* it
*/
@@ -110,27 +94,63 @@ char *termname = "st";
unsigned int tabspaces = 8;
/* bg opacity */
-/* Terminal colors (16 first used in escape sequence) */
+float alpha = 0.6;
+/* Terminal colors (16 first used in escape sequence) */
+static const char *colorname[] = {
+ /* 8 normal colors */
+ "black",
+ "red3",
+ "green3",
+ "yellow3",
+ "blue2",
+ "magenta3",
+ "cyan3",
+ "gray90",
+
+ /* 8 bright colors */
+ "gray50",
+ "red",
+ "green",
+ "yellow",
+ "#5c5cff",
+ "magenta",
+ "cyan",
+ "white",
+
+ [255] = 0,
+
+ /* more colors can be added after 255 to use with DefaultXX */
+ "#cccccc",
+ "#555555",
+ "black",
+};
/*
* Default colors (colorname index)
* foreground, background, cursor, reverse cursor
*/
-unsigned int defaultfg = 259;
+unsigned int defaultfg = 7;
unsigned int defaultbg = 258;
-unsigned int defaultcs = 256;
-unsigned int defaultrcs = 257;
+static unsigned int defaultcs = 256;
+static unsigned int defaultrcs = 257;
/*
- * Default shape of cursor
- * 2: Block ("█")
- * 4: Underline ("_")
- * 6: Bar ("|")
- * 7: Snowman ("☃")
+ * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
+ * Default style of cursor
+ * 0: Blinking block
+ * 1: Blinking block (default)
+ * 2: Steady block ("█")
+ * 3: Blinking underline
+ * 4: Steady underline ("_")
+ * 5: Blinking bar
+ * 6: Steady bar ("|")
+ * 7: Blinking st cursor
+ * 8: Steady st cursor
*/
-static unsigned int cursorshape = 6;
+static unsigned int cursorstyle = 5;
+static Rune stcursor = 0x2603; /* snowman (U+2603) */
/*
* Default columns and rows numbers
@@ -159,53 +179,14 @@ static unsigned int defaultattr = 11;
*/
static uint forcemousemod = ShiftMask;
-
-/*
- * Xresources preferences to load at startup
- */
-ResourcePref resources[] = {
- { "font", STRING, &font },
- { "fontalt0", STRING, &font2[0] },
- { "color0", STRING, &colorname[0] },
- { "color1", STRING, &colorname[1] },
- { "color2", STRING, &colorname[2] },
- { "color3", STRING, &colorname[3] },
- { "color4", STRING, &colorname[4] },
- { "color5", STRING, &colorname[5] },
- { "color6", STRING, &colorname[6] },
- { "color7", STRING, &colorname[7] },
- { "color8", STRING, &colorname[8] },
- { "color9", STRING, &colorname[9] },
- { "color10", STRING, &colorname[10] },
- { "color11", STRING, &colorname[11] },
- { "color12", STRING, &colorname[12] },
- { "color13", STRING, &colorname[13] },
- { "color14", STRING, &colorname[14] },
- { "color15", STRING, &colorname[15] },
- { "background", STRING, &colorname[258] },
- { "foreground", STRING, &colorname[259] },
- { "cursorColor", STRING, &colorname[256] },
- { "termname", STRING, &termname },
- { "shell", STRING, &shell },
- { "minlatency", INTEGER, &minlatency },
- { "maxlatency", INTEGER, &maxlatency },
- { "blinktimeout", INTEGER, &blinktimeout },
- { "bellvolume", INTEGER, &bellvolume },
- { "tabspaces", INTEGER, &tabspaces },
- { "borderpx", INTEGER, &borderpx },
- { "cwscale", FLOAT, &cwscale },
- { "chscale", FLOAT, &chscale },
- { "alpha", FLOAT, &alpha },
-};
-
/*
* Internal mouse shortcuts.
* Beware that overloading Button1 will disable the selection.
*/
static MouseShortcut mshortcuts[] = {
/* mask button function argument release */
- { XK_NO_MOD, Button4, kscrollup, {.i = 2} },
- { XK_NO_MOD, Button5, kscrolldown, {.i = 2} },
+ { XK_ANY_MOD, Button4, kscrollup, {.i = 6} },
+ { XK_ANY_MOD, Button5, kscrolldown, {.i = 6} },
{ XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
{ ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} },
{ XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
@@ -215,12 +196,7 @@ static MouseShortcut mshortcuts[] = {
/* Internal keyboard shortcuts. */
#define MODKEY Mod1Mask
-#define TERMMOD (Mod1Mask|ShiftMask)
-
-static char *openurlcmd[] = { "/bin/sh", "-c", "st-urlhandler -o", "externalpipe", NULL };
-static char *copyurlcmd[] = { "/bin/sh", "-c", "st-urlhandler -c", "externalpipe", NULL };
-static char *copyoutput[] = { "/bin/sh", "-c", "st-copyout", "externalpipe", NULL };
-
+#define TERMMOD (ControlMask|ShiftMask)
static Shortcut shortcuts[] = {
/* mask keysym function argument */
@@ -233,32 +209,11 @@ static Shortcut shortcuts[] = {
{ TERMMOD, XK_Home, zoomreset, {.f = 0} },
{ TERMMOD, XK_C, clipcopy, {.i = 0} },
{ TERMMOD, XK_V, clippaste, {.i = 0} },
- { MODKEY, XK_c, clipcopy, {.i = 0} },
- { ShiftMask, XK_Insert, clippaste, {.i = 0} },
- { MODKEY, XK_v, clippaste, {.i = 0} },
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
{ ShiftMask, XK_Insert, selpaste, {.i = 0} },
{ TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
{ ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
{ ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
- { MODKEY, XK_Page_Up, kscrollup, {.i = -1} },
- { MODKEY, XK_Page_Down, kscrolldown, {.i = -1} },
- { MODKEY, XK_k, kscrollup, {.i = 1} },
- { MODKEY, XK_j, kscrolldown, {.i = 1} },
- { MODKEY, XK_Up, kscrollup, {.i = 1} },
- { MODKEY, XK_Down, kscrolldown, {.i = 1} },
- { MODKEY, XK_u, kscrollup, {.i = -1} },
- { MODKEY, XK_d, kscrolldown, {.i = -1} },
- { MODKEY, XK_s, changealpha, {.f = -0.05} },
- { MODKEY, XK_a, changealpha, {.f = +0.05} },
- { TERMMOD, XK_Up, zoom, {.f = +1} },
- { TERMMOD, XK_Down, zoom, {.f = -1} },
- { TERMMOD, XK_K, zoom, {.f = +1} },
- { TERMMOD, XK_J, zoom, {.f = -1} },
- { TERMMOD, XK_U, zoom, {.f = +2} },
- { TERMMOD, XK_D, zoom, {.f = -2} },
- { MODKEY, XK_l, externalpipe, {.v = openurlcmd } },
- { MODKEY, XK_y, externalpipe, {.v = copyurlcmd } },
- { MODKEY, XK_o, externalpipe, {.v = copyoutput } },
};
/*
diff --git a/st/config.mk b/st-0.8.4/config.mk
index 1741840..aaa54ff 100644
--- a/st/config.mk
+++ b/st-0.8.4/config.mk
@@ -15,12 +15,10 @@ PKG_CONFIG = pkg-config
# includes and libs
INCS = -I$(X11INC) \
`$(PKG_CONFIG) --cflags fontconfig` \
- `$(PKG_CONFIG) --cflags freetype2` \
- `$(PKG_CONFIG) --cflags harfbuzz`
+ `$(PKG_CONFIG) --cflags freetype2`
LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
`$(PKG_CONFIG) --libs fontconfig` \
- `$(PKG_CONFIG) --libs freetype2` \
- `$(PKG_CONFIG) --libs harfbuzz`
+ `$(PKG_CONFIG) --libs freetype2`
# flags
STCPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600
diff --git a/st-0.8.4/patches/st-alpha-0.8.2.diff b/st-0.8.4/patches/st-alpha-0.8.2.diff
new file mode 100644
index 0000000..dad6615
--- /dev/null
+++ b/st-0.8.4/patches/st-alpha-0.8.2.diff
@@ -0,0 +1,163 @@
+diff --git a/config.def.h b/config.def.h
+index 0e01717..e116631 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -82,6 +82,9 @@ char *termname = "st-256color";
+ */
+ unsigned int tabspaces = 8;
+
++/* bg opacity */
++float alpha = 0.8;
++
+ /* Terminal colors (16 first used in escape sequence) */
+ static const char *colorname[] = {
+ /* 8 normal colors */
+@@ -109,6 +112,7 @@ static const char *colorname[] = {
+ /* more colors can be added after 255 to use with DefaultXX */
+ "#cccccc",
+ "#555555",
++ "black",
+ };
+
+
+@@ -117,7 +121,7 @@ static const char *colorname[] = {
+ * foreground, background, cursor, reverse cursor
+ */
+ unsigned int defaultfg = 7;
+-unsigned int defaultbg = 0;
++unsigned int defaultbg = 258;
+ static unsigned int defaultcs = 256;
+ static unsigned int defaultrcs = 257;
+
+diff --git a/config.mk b/config.mk
+index 0cbb002..1d2f0e2 100644
+--- a/config.mk
++++ b/config.mk
+@@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config
+ INCS = -I$(X11INC) \
+ `$(PKG_CONFIG) --cflags fontconfig` \
+ `$(PKG_CONFIG) --cflags freetype2`
+-LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
++LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
+ `$(PKG_CONFIG) --libs fontconfig` \
+ `$(PKG_CONFIG) --libs freetype2`
+
+diff --git a/st.h b/st.h
+index 38c61c4..b7634ab 100644
+--- a/st.h
++++ b/st.h
+@@ -120,3 +120,4 @@ extern char *termname;
+ extern unsigned int tabspaces;
+ extern unsigned int defaultfg;
+ extern unsigned int defaultbg;
++extern float alpha;
+diff --git a/x.c b/x.c
+index 0422421..588dec3 100644
+--- a/x.c
++++ b/x.c
+@@ -98,6 +98,7 @@ typedef struct {
+ XSetWindowAttributes attrs;
+ int scr;
+ int isfixed; /* is fixed geometry? */
++ int depth; /* bit depth */
+ int l, t; /* left and top offset */
+ int gm; /* geometry mask */
+ } XWindow;
+@@ -229,6 +230,7 @@ static char *usedfont = NULL;
+ static double usedfontsize = 0;
+ static double defaultfontsize = 0;
+
++static char *opt_alpha = NULL;
+ static char *opt_class = NULL;
+ static char **opt_cmd = NULL;
+ static char *opt_embed = NULL;
+@@ -688,7 +690,7 @@ xresize(int col, int row)
+
+ XFreePixmap(xw.dpy, xw.buf);
+ xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
+- DefaultDepth(xw.dpy, xw.scr));
++ xw.depth);
+ XftDrawChange(xw.draw, xw.buf);
+ xclear(0, 0, win.w, win.h);
+
+@@ -748,6 +750,13 @@ xloadcols(void)
+ else
+ die("could not allocate color %d\n", i);
+ }
++
++ /* set alpha value of bg color */
++ if (opt_alpha)
++ alpha = strtof(opt_alpha, NULL);
++ dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha);
++ dc.col[defaultbg].pixel &= 0x00FFFFFF;
++ dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24;
+ loaded = 1;
+ }
+
+@@ -1004,11 +1013,23 @@ xinit(int cols, int rows)
+ Window parent;
+ pid_t thispid = getpid();
+ XColor xmousefg, xmousebg;
++ XWindowAttributes attr;
++ XVisualInfo vis;
+
+ if (!(xw.dpy = XOpenDisplay(NULL)))
+ die("can't open display\n");
+ xw.scr = XDefaultScreen(xw.dpy);
+- xw.vis = XDefaultVisual(xw.dpy, xw.scr);
++
++ if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
++ parent = XRootWindow(xw.dpy, xw.scr);
++ xw.depth = 32;
++ } else {
++ XGetWindowAttributes(xw.dpy, parent, &attr);
++ xw.depth = attr.depth;
++ }
++
++ XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis);
++ xw.vis = vis.visual;
+
+ /* font */
+ if (!FcInit())
+@@ -1018,7 +1039,7 @@ xinit(int cols, int rows)
+ xloadfonts(usedfont, 0);
+
+ /* colors */
+- xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
++ xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
+ xloadcols();
+
+ /* adjust fixed window geometry */
+@@ -1038,19 +1059,15 @@ xinit(int cols, int rows)
+ | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
+ xw.attrs.colormap = xw.cmap;
+
+- if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
+- parent = XRootWindow(xw.dpy, xw.scr);
+ xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
+- win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
++ win.w, win.h, 0, xw.depth, InputOutput,
+ xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
+ | CWEventMask | CWColormap, &xw.attrs);
+
+ memset(&gcvalues, 0, sizeof(gcvalues));
+ gcvalues.graphics_exposures = False;
+- dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
+- &gcvalues);
+- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
+- DefaultDepth(xw.dpy, xw.scr));
++ xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth);
++ dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues);
+ XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
+ XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
+
+@@ -1894,6 +1911,9 @@ main(int argc, char *argv[])
+ case 'a':
+ allowaltscreen = 0;
+ break;
++ case 'A':
++ opt_alpha = EARGF(usage());
++ break;
+ case 'c':
+ opt_class = EARGF(usage());
+ break;
diff --git a/st-0.8.4/patches/st-blinking_cursor-20200531-a2a7044.diff b/st-0.8.4/patches/st-blinking_cursor-20200531-a2a7044.diff
new file mode 100644
index 0000000..d544f74
--- /dev/null
+++ b/st-0.8.4/patches/st-blinking_cursor-20200531-a2a7044.diff
@@ -0,0 +1,150 @@
+From bff176133618854676bbdc74c0099f184d3da365 Mon Sep 17 00:00:00 2001
+From: Steve Ward <planet36@gmail.com>
+Date: Sun, 31 May 2020 22:48:25 -0400
+Subject: [PATCH] Allow blinking cursor
+
+---
+ config.def.h | 19 +++++++++++++------
+ x.c | 42 ++++++++++++++++++++++++++++++++----------
+ 2 files changed, 45 insertions(+), 16 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 6f05dce..3dbe915 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -133,13 +133,20 @@ static unsigned int defaultcs = 256;
+ static unsigned int defaultrcs = 257;
+
+ /*
+- * Default shape of cursor
+- * 2: Block ("█")
+- * 4: Underline ("_")
+- * 6: Bar ("|")
+- * 7: Snowman ("☃")
++ * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
++ * Default style of cursor
++ * 0: Blinking block
++ * 1: Blinking block (default)
++ * 2: Steady block ("█")
++ * 3: Blinking underline
++ * 4: Steady underline ("_")
++ * 5: Blinking bar
++ * 6: Steady bar ("|")
++ * 7: Blinking st cursor
++ * 8: Steady st cursor
+ */
+-static unsigned int cursorshape = 2;
++static unsigned int cursorstyle = 1;
++static Rune stcursor = 0x2603; /* snowman (U+2603) */
+
+ /*
+ * Default columns and rows numbers
+diff --git a/x.c b/x.c
+index 210f184..bd80a5e 100644
+--- a/x.c
++++ b/x.c
+@@ -253,6 +253,7 @@ static char *opt_name = NULL;
+ static char *opt_title = NULL;
+
+ static int oldbutton = 3; /* button event on startup: 3 = release */
++static int cursorblinks = 0;
+
+ void
+ clipcopy(const Arg *dummy)
+@@ -1526,16 +1527,19 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+ /* draw the new one */
+ if (IS_SET(MODE_FOCUSED)) {
+ switch (win.cursor) {
+- case 7: /* st extension */
+- g.u = 0x2603; /* snowman (U+2603) */
++ case 0: /* Blinking block */
++ case 1: /* Blinking block (default) */
++ if (IS_SET(MODE_BLINK))
++ break;
+ /* FALLTHROUGH */
+- case 0: /* Blinking Block */
+- case 1: /* Blinking Block (Default) */
+- case 2: /* Steady Block */
++ case 2: /* Steady block */
+ xdrawglyph(g, cx, cy);
+ break;
+- case 3: /* Blinking Underline */
+- case 4: /* Steady Underline */
++ case 3: /* Blinking underline */
++ if (IS_SET(MODE_BLINK))
++ break;
++ /* FALLTHROUGH */
++ case 4: /* Steady underline */
+ XftDrawRect(xw.draw, &drawcol,
+ borderpx + cx * win.cw,
+ borderpx + (cy + 1) * win.ch - \
+@@ -1543,12 +1547,23 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+ win.cw, cursorthickness);
+ break;
+ case 5: /* Blinking bar */
++ if (IS_SET(MODE_BLINK))
++ break;
++ /* FALLTHROUGH */
+ case 6: /* Steady bar */
+ XftDrawRect(xw.draw, &drawcol,
+ borderpx + cx * win.cw,
+ borderpx + cy * win.ch,
+ cursorthickness, win.ch);
+ break;
++ case 7: /* Blinking st cursor */
++ if (IS_SET(MODE_BLINK))
++ break;
++ /* FALLTHROUGH */
++ case 8: /* Steady st cursor */
++ g.u = stcursor;
++ xdrawglyph(g, cx, cy);
++ break;
+ }
+ } else {
+ XftDrawRect(xw.draw, &drawcol,
+@@ -1690,9 +1705,12 @@ xsetmode(int set, unsigned int flags)
+ int
+ xsetcursor(int cursor)
+ {
+- if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
++ if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
+ return 1;
+ win.cursor = cursor;
++ cursorblinks = win.cursor == 0 || win.cursor == 1 ||
++ win.cursor == 3 || win.cursor == 5 ||
++ win.cursor == 7;
+ return 0;
+ }
+
+@@ -1936,6 +1954,10 @@ run(void)
+ if (FD_ISSET(ttyfd, &rfd) || xev) {
+ if (!drawing) {
+ trigger = now;
++ if (IS_SET(MODE_BLINK)) {
++ win.mode ^= MODE_BLINK;
++ }
++ lastblink = now;
+ drawing = 1;
+ }
+ timeout = (maxlatency - TIMEDIFF(now, trigger)) \
+@@ -1946,7 +1968,7 @@ run(void)
+
+ /* idle detected or maxlatency exhausted -> draw */
+ timeout = -1;
+- if (blinktimeout && tattrset(ATTR_BLINK)) {
++ if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK))) {
+ timeout = blinktimeout - TIMEDIFF(now, lastblink);
+ if (timeout <= 0) {
+ if (-timeout > blinktimeout) /* start visible */
+@@ -1982,7 +2004,7 @@ main(int argc, char *argv[])
+ {
+ xw.l = xw.t = 0;
+ xw.isfixed = False;
+- xsetcursor(cursorshape);
++ xsetcursor(cursorstyle);
+
+ ARGBEGIN {
+ case 'a':
+--
+2.20.1
+
diff --git a/st-0.8.4/patches/st-boxdraw_v2-0.8.3.diff b/st-0.8.4/patches/st-boxdraw_v2-0.8.3.diff
new file mode 100644
index 0000000..04a868c
--- /dev/null
+++ b/st-0.8.4/patches/st-boxdraw_v2-0.8.3.diff
@@ -0,0 +1,600 @@
+From 3f3b80b9966c60086f4ed80ce4de0cbf03468d36 Mon Sep 17 00:00:00 2001
+From: "Avi Halachmi (:avih)" <avihpit@yahoo.com>
+Date: Wed, 26 Dec 2018 14:51:45 +0200
+Subject: [PATCH] boxdraw_v2: custom render lines/blocks/braille for perfect
+ alignment
+
+It seems impossible to ensure that blocks and line drawing glyphs
+align without visible gaps for all combinations of arbitrary font,
+size and width/height scale factor.
+
+This commit adds options to render most of the lines/blocks and
+braille codepoints without using the font such that they align
+perfectly regardless of font, size or other configuration values.
+
+Supported codepoints are U+2500 - U+259F except dashes/diagonals,
+and U28XX.
+
+The lines/blocks data is stored as 16-bit values at boxdraw_data.h
+
+boxdraw/braille are independent, disabled by default at config[.def].h
+---
+ Makefile | 3 +-
+ boxdraw.c | 194 ++++++++++++++++++++++++++++++++++++++++++++
+ boxdraw_data.h | 214 +++++++++++++++++++++++++++++++++++++++++++++++++
+ config.def.h | 12 +++
+ st.c | 3 +
+ st.h | 10 +++
+ x.c | 21 +++--
+ 7 files changed, 451 insertions(+), 6 deletions(-)
+ create mode 100644 boxdraw.c
+ create mode 100644 boxdraw_data.h
+
+diff --git a/Makefile b/Makefile
+index 470ac86..6dfa212 100644
+--- a/Makefile
++++ b/Makefile
+@@ -4,7 +4,7 @@
+
+ include config.mk
+
+-SRC = st.c x.c
++SRC = st.c x.c boxdraw.c
+ OBJ = $(SRC:.c=.o)
+
+ all: options st
+@@ -23,6 +23,7 @@ config.h:
+
+ st.o: config.h st.h win.h
+ x.o: arg.h config.h st.h win.h
++boxdraw.o: config.h st.h boxdraw_data.h
+
+ $(OBJ): config.h config.mk
+
+diff --git a/boxdraw.c b/boxdraw.c
+new file mode 100644
+index 0000000..28a92d0
+--- /dev/null
++++ b/boxdraw.c
+@@ -0,0 +1,194 @@
++/*
++ * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
++ * MIT/X Consortium License
++ */
++
++#include <X11/Xft/Xft.h>
++#include "st.h"
++#include "boxdraw_data.h"
++
++/* Rounded non-negative integers division of n / d */
++#define DIV(n, d) (((n) + (d) / 2) / (d))
++
++static Display *xdpy;
++static Colormap xcmap;
++static XftDraw *xd;
++static Visual *xvis;
++
++static void drawbox(int, int, int, int, XftColor *, XftColor *, ushort);
++static void drawboxlines(int, int, int, int, XftColor *, ushort);
++
++/* public API */
++
++void
++boxdraw_xinit(Display *dpy, Colormap cmap, XftDraw *draw, Visual *vis)
++{
++ xdpy = dpy; xcmap = cmap; xd = draw, xvis = vis;
++}
++
++int
++isboxdraw(Rune u)
++{
++ Rune block = u & ~0xff;
++ return (boxdraw && block == 0x2500 && boxdata[(uint8_t)u]) ||
++ (boxdraw_braille && block == 0x2800);
++}
++
++/* the "index" is actually the entire shape data encoded as ushort */
++ushort
++boxdrawindex(const Glyph *g)
++{
++ if (boxdraw_braille && (g->u & ~0xff) == 0x2800)
++ return BRL | (uint8_t)g->u;
++ if (boxdraw_bold && (g->mode & ATTR_BOLD))
++ return BDB | boxdata[(uint8_t)g->u];
++ return boxdata[(uint8_t)g->u];
++}
++
++void
++drawboxes(int x, int y, int cw, int ch, XftColor *fg, XftColor *bg,
++ const XftGlyphFontSpec *specs, int len)
++{
++ for ( ; len-- > 0; x += cw, specs++)
++ drawbox(x, y, cw, ch, fg, bg, (ushort)specs->glyph);
++}
++
++/* implementation */
++
++void
++drawbox(int x, int y, int w, int h, XftColor *fg, XftColor *bg, ushort bd)
++{
++ ushort cat = bd & ~(BDB | 0xff); /* mask out bold and data */
++ if (bd & (BDL | BDA)) {
++ /* lines (light/double/heavy/arcs) */
++ drawboxlines(x, y, w, h, fg, bd);
++
++ } else if (cat == BBD) {
++ /* lower (8-X)/8 block */
++ int d = DIV((uint8_t)bd * h, 8);
++ XftDrawRect(xd, fg, x, y + d, w, h - d);
++
++ } else if (cat == BBU) {
++ /* upper X/8 block */
++ XftDrawRect(xd, fg, x, y, w, DIV((uint8_t)bd * h, 8));
++
++ } else if (cat == BBL) {
++ /* left X/8 block */
++ XftDrawRect(xd, fg, x, y, DIV((uint8_t)bd * w, 8), h);
++
++ } else if (cat == BBR) {
++ /* right (8-X)/8 block */
++ int d = DIV((uint8_t)bd * w, 8);
++ XftDrawRect(xd, fg, x + d, y, w - d, h);
++
++ } else if (cat == BBQ) {
++ /* Quadrants */
++ int w2 = DIV(w, 2), h2 = DIV(h, 2);
++ if (bd & TL)
++ XftDrawRect(xd, fg, x, y, w2, h2);
++ if (bd & TR)
++ XftDrawRect(xd, fg, x + w2, y, w - w2, h2);
++ if (bd & BL)
++ XftDrawRect(xd, fg, x, y + h2, w2, h - h2);
++ if (bd & BR)
++ XftDrawRect(xd, fg, x + w2, y + h2, w - w2, h - h2);
++
++ } else if (bd & BBS) {
++ /* Shades - data is 1/2/3 for 25%/50%/75% alpha, respectively */
++ int d = (uint8_t)bd;
++ XftColor xfc;
++ XRenderColor xrc = { .alpha = 0xffff };
++
++ xrc.red = DIV(fg->color.red * d + bg->color.red * (4 - d), 4);
++ xrc.green = DIV(fg->color.green * d + bg->color.green * (4 - d), 4);
++ xrc.blue = DIV(fg->color.blue * d + bg->color.blue * (4 - d), 4);
++
++ XftColorAllocValue(xdpy, xvis, xcmap, &xrc, &xfc);
++ XftDrawRect(xd, &xfc, x, y, w, h);
++ XftColorFree(xdpy, xvis, xcmap, &xfc);
++
++ } else if (cat == BRL) {
++ /* braille, each data bit corresponds to one dot at 2x4 grid */
++ int w1 = DIV(w, 2);
++ int h1 = DIV(h, 4), h2 = DIV(h, 2), h3 = DIV(3 * h, 4);
++
++ if (bd & 1) XftDrawRect(xd, fg, x, y, w1, h1);
++ if (bd & 2) XftDrawRect(xd, fg, x, y + h1, w1, h2 - h1);
++ if (bd & 4) XftDrawRect(xd, fg, x, y + h2, w1, h3 - h2);
++ if (bd & 8) XftDrawRect(xd, fg, x + w1, y, w - w1, h1);
++ if (bd & 16) XftDrawRect(xd, fg, x + w1, y + h1, w - w1, h2 - h1);
++ if (bd & 32) XftDrawRect(xd, fg, x + w1, y + h2, w - w1, h3 - h2);
++ if (bd & 64) XftDrawRect(xd, fg, x, y + h3, w1, h - h3);
++ if (bd & 128) XftDrawRect(xd, fg, x + w1, y + h3, w - w1, h - h3);
++
++ }
++}
++
++void
++drawboxlines(int x, int y, int w, int h, XftColor *fg, ushort bd)
++{
++ /* s: stem thickness. width/8 roughly matches underscore thickness. */
++ /* We draw bold as 1.5 * normal-stem and at least 1px thicker. */
++ /* doubles draw at least 3px, even when w or h < 3. bold needs 6px. */
++ int mwh = MIN(w, h);
++ int base_s = MAX(1, DIV(mwh, 8));
++ int bold = (bd & BDB) && mwh >= 6; /* possibly ignore boldness */
++ int s = bold ? MAX(base_s + 1, DIV(3 * base_s, 2)) : base_s;
++ int w2 = DIV(w - s, 2), h2 = DIV(h - s, 2);
++ /* the s-by-s square (x + w2, y + h2, s, s) is the center texel. */
++ /* The base length (per direction till edge) includes this square. */
++
++ int light = bd & (LL | LU | LR | LD);
++ int double_ = bd & (DL | DU | DR | DD);
++
++ if (light) {
++ /* d: additional (negative) length to not-draw the center */
++ /* texel - at arcs and avoid drawing inside (some) doubles */
++ int arc = bd & BDA;
++ int multi_light = light & (light - 1);
++ int multi_double = double_ & (double_ - 1);
++ /* light crosses double only at DH+LV, DV+LH (ref. shapes) */
++ int d = arc || (multi_double && !multi_light) ? -s : 0;
++
++ if (bd & LL)
++ XftDrawRect(xd, fg, x, y + h2, w2 + s + d, s);
++ if (bd & LU)
++ XftDrawRect(xd, fg, x + w2, y, s, h2 + s + d);
++ if (bd & LR)
++ XftDrawRect(xd, fg, x + w2 - d, y + h2, w - w2 + d, s);
++ if (bd & LD)
++ XftDrawRect(xd, fg, x + w2, y + h2 - d, s, h - h2 + d);
++ }
++
++ /* double lines - also align with light to form heavy when combined */
++ if (double_) {
++ /*
++ * going clockwise, for each double-ray: p is additional length
++ * to the single-ray nearer to the previous direction, and n to
++ * the next. p and n adjust from the base length to lengths
++ * which consider other doubles - shorter to avoid intersections
++ * (p, n), or longer to draw the far-corner texel (n).
++ */
++ int dl = bd & DL, du = bd & DU, dr = bd & DR, dd = bd & DD;
++ if (dl) {
++ int p = dd ? -s : 0, n = du ? -s : dd ? s : 0;
++ XftDrawRect(xd, fg, x, y + h2 + s, w2 + s + p, s);
++ XftDrawRect(xd, fg, x, y + h2 - s, w2 + s + n, s);
++ }
++ if (du) {
++ int p = dl ? -s : 0, n = dr ? -s : dl ? s : 0;
++ XftDrawRect(xd, fg, x + w2 - s, y, s, h2 + s + p);
++ XftDrawRect(xd, fg, x + w2 + s, y, s, h2 + s + n);
++ }
++ if (dr) {
++ int p = du ? -s : 0, n = dd ? -s : du ? s : 0;
++ XftDrawRect(xd, fg, x + w2 - p, y + h2 - s, w - w2 + p, s);
++ XftDrawRect(xd, fg, x + w2 - n, y + h2 + s, w - w2 + n, s);
++ }
++ if (dd) {
++ int p = dr ? -s : 0, n = dl ? -s : dr ? s : 0;
++ XftDrawRect(xd, fg, x + w2 + s, y + h2 - p, s, h - h2 + p);
++ XftDrawRect(xd, fg, x + w2 - s, y + h2 - n, s, h - h2 + n);
++ }
++ }
++}
+diff --git a/boxdraw_data.h b/boxdraw_data.h
+new file mode 100644
+index 0000000..7890500
+--- /dev/null
++++ b/boxdraw_data.h
+@@ -0,0 +1,214 @@
++/*
++ * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
++ * MIT/X Consortium License
++ */
++
++/*
++ * U+25XX codepoints data
++ *
++ * References:
++ * http://www.unicode.org/charts/PDF/U2500.pdf
++ * http://www.unicode.org/charts/PDF/U2580.pdf
++ *
++ * Test page:
++ * https://github.com/GNOME/vte/blob/master/doc/boxes.txt
++ */
++
++/* Each shape is encoded as 16-bits. Higher bits are category, lower are data */
++/* Categories (mutually exclusive except BDB): */
++/* For convenience, BDL/BDA/BBS/BDB are 1 bit each, the rest are enums */
++#define BDL (1<<8) /* Box Draw Lines (light/double/heavy) */
++#define BDA (1<<9) /* Box Draw Arc (light) */
++
++#define BBD (1<<10) /* Box Block Down (lower) X/8 */
++#define BBL (2<<10) /* Box Block Left X/8 */
++#define BBU (3<<10) /* Box Block Upper X/8 */
++#define BBR (4<<10) /* Box Block Right X/8 */
++#define BBQ (5<<10) /* Box Block Quadrants */
++#define BRL (6<<10) /* Box Braille (data is lower byte of U28XX) */
++
++#define BBS (1<<14) /* Box Block Shades */
++#define BDB (1<<15) /* Box Draw is Bold */
++
++/* (BDL/BDA) Light/Double/Heavy x Left/Up/Right/Down/Horizontal/Vertical */
++/* Heavy is light+double (literally drawing light+double align to form heavy) */
++#define LL (1<<0)
++#define LU (1<<1)
++#define LR (1<<2)
++#define LD (1<<3)
++#define LH (LL+LR)
++#define LV (LU+LD)
++
++#define DL (1<<4)
++#define DU (1<<5)
++#define DR (1<<6)
++#define DD (1<<7)
++#define DH (DL+DR)
++#define DV (DU+DD)
++
++#define HL (LL+DL)
++#define HU (LU+DU)
++#define HR (LR+DR)
++#define HD (LD+DD)
++#define HH (HL+HR)
++#define HV (HU+HD)
++
++/* (BBQ) Quadrants Top/Bottom x Left/Right */
++#define TL (1<<0)
++#define TR (1<<1)
++#define BL (1<<2)
++#define BR (1<<3)
++
++/* Data for U+2500 - U+259F except dashes/diagonals */
++static const unsigned short boxdata[256] = {
++ /* light lines */
++ [0x00] = BDL + LH, /* light horizontal */
++ [0x02] = BDL + LV, /* light vertical */
++ [0x0c] = BDL + LD + LR, /* light down and right */
++ [0x10] = BDL + LD + LL, /* light down and left */
++ [0x14] = BDL + LU + LR, /* light up and right */
++ [0x18] = BDL + LU + LL, /* light up and left */
++ [0x1c] = BDL + LV + LR, /* light vertical and right */
++ [0x24] = BDL + LV + LL, /* light vertical and left */
++ [0x2c] = BDL + LH + LD, /* light horizontal and down */
++ [0x34] = BDL + LH + LU, /* light horizontal and up */
++ [0x3c] = BDL + LV + LH, /* light vertical and horizontal */
++ [0x74] = BDL + LL, /* light left */
++ [0x75] = BDL + LU, /* light up */
++ [0x76] = BDL + LR, /* light right */
++ [0x77] = BDL + LD, /* light down */
++
++ /* heavy [+light] lines */
++ [0x01] = BDL + HH,
++ [0x03] = BDL + HV,
++ [0x0d] = BDL + HR + LD,
++ [0x0e] = BDL + HD + LR,
++ [0x0f] = BDL + HD + HR,
++ [0x11] = BDL + HL + LD,
++ [0x12] = BDL + HD + LL,
++ [0x13] = BDL + HD + HL,
++ [0x15] = BDL + HR + LU,
++ [0x16] = BDL + HU + LR,
++ [0x17] = BDL + HU + HR,
++ [0x19] = BDL + HL + LU,
++ [0x1a] = BDL + HU + LL,
++ [0x1b] = BDL + HU + HL,
++ [0x1d] = BDL + HR + LV,
++ [0x1e] = BDL + HU + LD + LR,
++ [0x1f] = BDL + HD + LR + LU,
++ [0x20] = BDL + HV + LR,
++ [0x21] = BDL + HU + HR + LD,
++ [0x22] = BDL + HD + HR + LU,
++ [0x23] = BDL + HV + HR,
++ [0x25] = BDL + HL + LV,
++ [0x26] = BDL + HU + LD + LL,
++ [0x27] = BDL + HD + LU + LL,
++ [0x28] = BDL + HV + LL,
++ [0x29] = BDL + HU + HL + LD,
++ [0x2a] = BDL + HD + HL + LU,
++ [0x2b] = BDL + HV + HL,
++ [0x2d] = BDL + HL + LD + LR,
++ [0x2e] = BDL + HR + LL + LD,
++ [0x2f] = BDL + HH + LD,
++ [0x30] = BDL + HD + LH,
++ [0x31] = BDL + HD + HL + LR,
++ [0x32] = BDL + HR + HD + LL,
++ [0x33] = BDL + HH + HD,
++ [0x35] = BDL + HL + LU + LR,
++ [0x36] = BDL + HR + LU + LL,
++ [0x37] = BDL + HH + LU,
++ [0x38] = BDL + HU + LH,
++ [0x39] = BDL + HU + HL + LR,
++ [0x3a] = BDL + HU + HR + LL,
++ [0x3b] = BDL + HH + HU,
++ [0x3d] = BDL + HL + LV + LR,
++ [0x3e] = BDL + HR + LV + LL,
++ [0x3f] = BDL + HH + LV,
++ [0x40] = BDL + HU + LH + LD,
++ [0x41] = BDL + HD + LH + LU,
++ [0x42] = BDL + HV + LH,
++ [0x43] = BDL + HU + HL + LD + LR,
++ [0x44] = BDL + HU + HR + LD + LL,
++ [0x45] = BDL + HD + HL + LU + LR,
++ [0x46] = BDL + HD + HR + LU + LL,
++ [0x47] = BDL + HH + HU + LD,
++ [0x48] = BDL + HH + HD + LU,
++ [0x49] = BDL + HV + HL + LR,
++ [0x4a] = BDL + HV + HR + LL,
++ [0x4b] = BDL + HV + HH,
++ [0x78] = BDL + HL,
++ [0x79] = BDL + HU,
++ [0x7a] = BDL + HR,
++ [0x7b] = BDL + HD,
++ [0x7c] = BDL + HR + LL,
++ [0x7d] = BDL + HD + LU,
++ [0x7e] = BDL + HL + LR,
++ [0x7f] = BDL + HU + LD,
++
++ /* double [+light] lines */
++ [0x50] = BDL + DH,
++ [0x51] = BDL + DV,
++ [0x52] = BDL + DR + LD,
++ [0x53] = BDL + DD + LR,
++ [0x54] = BDL + DR + DD,
++ [0x55] = BDL + DL + LD,
++ [0x56] = BDL + DD + LL,
++ [0x57] = BDL + DL + DD,
++ [0x58] = BDL + DR + LU,
++ [0x59] = BDL + DU + LR,
++ [0x5a] = BDL + DU + DR,
++ [0x5b] = BDL + DL + LU,
++ [0x5c] = BDL + DU + LL,
++ [0x5d] = BDL + DL + DU,
++ [0x5e] = BDL + DR + LV,
++ [0x5f] = BDL + DV + LR,
++ [0x60] = BDL + DV + DR,
++ [0x61] = BDL + DL + LV,
++ [0x62] = BDL + DV + LL,
++ [0x63] = BDL + DV + DL,
++ [0x64] = BDL + DH + LD,
++ [0x65] = BDL + DD + LH,
++ [0x66] = BDL + DD + DH,
++ [0x67] = BDL + DH + LU,
++ [0x68] = BDL + DU + LH,
++ [0x69] = BDL + DH + DU,
++ [0x6a] = BDL + DH + LV,
++ [0x6b] = BDL + DV + LH,
++ [0x6c] = BDL + DH + DV,
++
++ /* (light) arcs */
++ [0x6d] = BDA + LD + LR,
++ [0x6e] = BDA + LD + LL,
++ [0x6f] = BDA + LU + LL,
++ [0x70] = BDA + LU + LR,
++
++ /* Lower (Down) X/8 block (data is 8 - X) */
++ [0x81] = BBD + 7, [0x82] = BBD + 6, [0x83] = BBD + 5, [0x84] = BBD + 4,
++ [0x85] = BBD + 3, [0x86] = BBD + 2, [0x87] = BBD + 1, [0x88] = BBD + 0,
++
++ /* Left X/8 block (data is X) */
++ [0x89] = BBL + 7, [0x8a] = BBL + 6, [0x8b] = BBL + 5, [0x8c] = BBL + 4,
++ [0x8d] = BBL + 3, [0x8e] = BBL + 2, [0x8f] = BBL + 1,
++
++ /* upper 1/2 (4/8), 1/8 block (X), right 1/2, 1/8 block (8-X) */
++ [0x80] = BBU + 4, [0x94] = BBU + 1,
++ [0x90] = BBR + 4, [0x95] = BBR + 7,
++
++ /* Quadrants */
++ [0x96] = BBQ + BL,
++ [0x97] = BBQ + BR,
++ [0x98] = BBQ + TL,
++ [0x99] = BBQ + TL + BL + BR,
++ [0x9a] = BBQ + TL + BR,
++ [0x9b] = BBQ + TL + TR + BL,
++ [0x9c] = BBQ + TL + TR + BR,
++ [0x9d] = BBQ + TR,
++ [0x9e] = BBQ + BL + TR,
++ [0x9f] = BBQ + BL + TR + BR,
++
++ /* Shades, data is an alpha value in 25% units (1/4, 1/2, 3/4) */
++ [0x91] = BBS + 1, [0x92] = BBS + 2, [0x93] = BBS + 3,
++
++ /* U+2504 - U+250B, U+254C - U+254F: unsupported (dashes) */
++ /* U+2571 - U+2573: unsupported (diagonals) */
++};
+diff --git a/config.def.h b/config.def.h
+index 0895a1f..bf6718b 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -58,6 +58,18 @@ static unsigned int blinktimeout = 800;
+ */
+ static unsigned int cursorthickness = 2;
+
++/*
++ * 1: render most of the lines/blocks characters without using the font for
++ * perfect alignment between cells (U2500 - U259F except dashes/diagonals).
++ * Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
++ * 0: disable (render all U25XX glyphs normally from the font).
++ */
++const int boxdraw = 0;
++const int boxdraw_bold = 0;
++
++/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */
++const int boxdraw_braille = 0;
++
+ /*
+ * bell volume. It must be a value between -100 and 100. Use 0 for disabling
+ * it
+diff --git a/st.c b/st.c
+index 0ce6ac2..c035e19 100644
+--- a/st.c
++++ b/st.c
+@@ -1230,6 +1230,9 @@ tsetchar(Rune u, Glyph *attr, int x, int y)
+ term.dirty[y] = 1;
+ term.line[y][x] = *attr;
+ term.line[y][x].u = u;
++
++ if (isboxdraw(u))
++ term.line[y][x].mode |= ATTR_BOXDRAW;
+ }
+
+ void
+diff --git a/st.h b/st.h
+index d978458..a6c382a 100644
+--- a/st.h
++++ b/st.h
+@@ -33,6 +33,7 @@ enum glyph_attribute {
+ ATTR_WRAP = 1 << 8,
+ ATTR_WIDE = 1 << 9,
+ ATTR_WDUMMY = 1 << 10,
++ ATTR_BOXDRAW = 1 << 11,
+ ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
+ };
+
+@@ -111,6 +112,14 @@ void *xmalloc(size_t);
+ void *xrealloc(void *, size_t);
+ char *xstrdup(char *);
+
++int isboxdraw(Rune);
++ushort boxdrawindex(const Glyph *);
++#ifdef XFT_VERSION
++/* only exposed to x.c, otherwise we'll need Xft.h for the types */
++void boxdraw_xinit(Display *, Colormap, XftDraw *, Visual *);
++void drawboxes(int, int, int, int, XftColor *, XftColor *, const XftGlyphFontSpec *, int);
++#endif
++
+ /* config.h globals */
+ extern char *utmp;
+ extern char *scroll;
+@@ -122,3 +131,4 @@ extern char *termname;
+ extern unsigned int tabspaces;
+ extern unsigned int defaultfg;
+ extern unsigned int defaultbg;
++extern const int boxdraw, boxdraw_bold, boxdraw_braille;
+diff --git a/x.c b/x.c
+index e5f1737..6f7ea2c 100644
+--- a/x.c
++++ b/x.c
+@@ -1205,6 +1205,8 @@ xinit(int cols, int rows)
+ xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0);
+ if (xsel.xtarget == None)
+ xsel.xtarget = XA_STRING;
++
++ boxdraw_xinit(xw.dpy, xw.cmap, xw.draw, xw.vis);
+ }
+
+ int
+@@ -1251,8 +1253,13 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
+ yp = winy + font->ascent;
+ }
+
+- /* Lookup character index with default font. */
+- glyphidx = XftCharIndex(xw.dpy, font->match, rune);
++ if (mode & ATTR_BOXDRAW) {
++ /* minor shoehorning: boxdraw uses only this ushort */
++ glyphidx = boxdrawindex(&glyphs[i]);
++ } else {
++ /* Lookup character index with default font. */
++ glyphidx = XftCharIndex(xw.dpy, font->match, rune);
++ }
+ if (glyphidx) {
+ specs[numspecs].font = font->match;
+ specs[numspecs].glyph = glyphidx;
+@@ -1456,8 +1463,12 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
+ r.width = width;
+ XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
+
+- /* Render the glyphs. */
+- XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
++ if (base.mode & ATTR_BOXDRAW) {
++ drawboxes(winx, winy, width / len, win.ch, fg, bg, specs, len);
++ } else {
++ /* Render the glyphs. */
++ XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
++ }
+
+ /* Render underline and strikethrough. */
+ if (base.mode & ATTR_UNDERLINE) {
+@@ -1500,7 +1511,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+ /*
+ * Select the right color for the right mode.
+ */
+- g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE;
++ g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE|ATTR_BOXDRAW;
+
+ if (IS_SET(MODE_REVERSE)) {
+ g.mode |= ATTR_REVERSE;
+
+base-commit: 43a395ae91f7d67ce694e65edeaa7bbc720dd027
+--
+2.20.1
+
diff --git a/st-0.8.4/patches/st-dynamic-cursor-color-0.8.4.diff b/st-0.8.4/patches/st-dynamic-cursor-color-0.8.4.diff
new file mode 100644
index 0000000..a763d6d
--- /dev/null
+++ b/st-0.8.4/patches/st-dynamic-cursor-color-0.8.4.diff
@@ -0,0 +1,52 @@
+From 01e706efbc13194a4a4404e91b93a9638a3c1bea Mon Sep 17 00:00:00 2001
+From: Kipras Melnikovas <kipras@kipras.org>
+Date: Thu, 25 Feb 2021 14:31:26 +0200
+Subject: [PATCH] refactor dynamic-cursor-color patch
+
+Signed-off-by: Kipras Melnikovas <kipras@kipras.org>
+---
+ x.c | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/x.c b/x.c
+index 120e495..ab66364 100644
+--- a/x.c
++++ b/x.c
+@@ -1489,6 +1489,7 @@ void
+ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+ {
+ Color drawcol;
++ XRenderColor colbg;
+
+ /* remove the old cursor */
+ if (selected(ox, oy))
+@@ -1518,10 +1519,24 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
+ g.fg = defaultfg;
+ g.bg = defaultrcs;
+ } else {
++ /** this is the main part of the dynamic cursor color patch */
++ g.bg = g.fg;
+ g.fg = defaultbg;
+- g.bg = defaultcs;
+ }
+- drawcol = dc.col[g.bg];
++
++ /**
++ * and this is the second part of the dynamic cursor color patch.
++ * it handles the `drawcol` variable
++ */
++ if (IS_TRUECOL(g.bg)) {
++ colbg.alpha = 0xffff;
++ colbg.red = TRUERED(g.bg);
++ colbg.green = TRUEGREEN(g.bg);
++ colbg.blue = TRUEBLUE(g.bg);
++ XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &drawcol);
++ } else {
++ drawcol = dc.col[g.bg];
++ }
+ }
+
+ /* draw the new one */
+--
+2.30.1
+
diff --git a/st-0.8.4/patches/st-scrollback-0.8.4.diff b/st-0.8.4/patches/st-scrollback-0.8.4.diff
new file mode 100644
index 0000000..88e0c79
--- /dev/null
+++ b/st-0.8.4/patches/st-scrollback-0.8.4.diff
@@ -0,0 +1,351 @@
+diff --git a/config.def.h b/config.def.h
+index 6f05dce..93cbcc0 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -199,6 +199,8 @@ static Shortcut shortcuts[] = {
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
+ { ShiftMask, XK_Insert, selpaste, {.i = 0} },
+ { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} },
++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} },
+ };
+
+ /*
+diff --git a/st.c b/st.c
+index 76b7e0d..edec064 100644
+--- a/st.c
++++ b/st.c
+@@ -35,6 +35,7 @@
+ #define ESC_ARG_SIZ 16
+ #define STR_BUF_SIZ ESC_BUF_SIZ
+ #define STR_ARG_SIZ ESC_ARG_SIZ
++#define HISTSIZE 2000
+
+ /* macros */
+ #define IS_SET(flag) ((term.mode & (flag)) != 0)
+@@ -42,6 +43,9 @@
+ #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f))
+ #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c))
+ #define ISDELIM(u) (u && wcschr(worddelimiters, u))
++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \
++ term.scr + HISTSIZE + 1) % HISTSIZE] : \
++ term.line[(y) - term.scr])
+
+ enum term_mode {
+ MODE_WRAP = 1 << 0,
+@@ -115,6 +119,9 @@ typedef struct {
+ int col; /* nb col */
+ Line *line; /* screen */
+ Line *alt; /* alternate screen */
++ Line hist[HISTSIZE]; /* history buffer */
++ int histi; /* history index */
++ int scr; /* scroll back */
+ int *dirty; /* dirtyness of lines */
+ TCursor c; /* cursor */
+ int ocx; /* old cursor col */
+@@ -184,8 +191,8 @@ static void tnewline(int);
+ static void tputtab(int);
+ static void tputc(Rune);
+ static void treset(void);
+-static void tscrollup(int, int);
+-static void tscrolldown(int, int);
++static void tscrollup(int, int, int);
++static void tscrolldown(int, int, int);
+ static void tsetattr(int *, int);
+ static void tsetchar(Rune, Glyph *, int, int);
+ static void tsetdirt(int, int);
+@@ -414,10 +421,10 @@ tlinelen(int y)
+ {
+ int i = term.col;
+
+- if (term.line[y][i - 1].mode & ATTR_WRAP)
++ if (TLINE(y)[i - 1].mode & ATTR_WRAP)
+ return i;
+
+- while (i > 0 && term.line[y][i - 1].u == ' ')
++ while (i > 0 && TLINE(y)[i - 1].u == ' ')
+ --i;
+
+ return i;
+@@ -526,7 +533,7 @@ selsnap(int *x, int *y, int direction)
+ * Snap around if the word wraps around at the end or
+ * beginning of a line.
+ */
+- prevgp = &term.line[*y][*x];
++ prevgp = &TLINE(*y)[*x];
+ prevdelim = ISDELIM(prevgp->u);
+ for (;;) {
+ newx = *x + direction;
+@@ -541,14 +548,14 @@ selsnap(int *x, int *y, int direction)
+ yt = *y, xt = *x;
+ else
+ yt = newy, xt = newx;
+- if (!(term.line[yt][xt].mode & ATTR_WRAP))
++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP))
+ break;
+ }
+
+ if (newx >= tlinelen(newy))
+ break;
+
+- gp = &term.line[newy][newx];
++ gp = &TLINE(newy)[newx];
+ delim = ISDELIM(gp->u);
+ if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim
+ || (delim && gp->u != prevgp->u)))
+@@ -569,14 +576,14 @@ selsnap(int *x, int *y, int direction)
+ *x = (direction < 0) ? 0 : term.col - 1;
+ if (direction < 0) {
+ for (; *y > 0; *y += direction) {
+- if (!(term.line[*y-1][term.col-1].mode
++ if (!(TLINE(*y-1)[term.col-1].mode
+ & ATTR_WRAP)) {
+ break;
+ }
+ }
+ } else if (direction > 0) {
+ for (; *y < term.row-1; *y += direction) {
+- if (!(term.line[*y][term.col-1].mode
++ if (!(TLINE(*y)[term.col-1].mode
+ & ATTR_WRAP)) {
+ break;
+ }
+@@ -607,13 +614,13 @@ getsel(void)
+ }
+
+ if (sel.type == SEL_RECTANGULAR) {
+- gp = &term.line[y][sel.nb.x];
++ gp = &TLINE(y)[sel.nb.x];
+ lastx = sel.ne.x;
+ } else {
+- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0];
++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0];
+ lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1;
+ }
+- last = &term.line[y][MIN(lastx, linelen-1)];
++ last = &TLINE(y)[MIN(lastx, linelen-1)];
+ while (last >= gp && last->u == ' ')
+ --last;
+
+@@ -848,6 +855,9 @@ void
+ ttywrite(const char *s, size_t n, int may_echo)
+ {
+ const char *next;
++ Arg arg = (Arg) { .i = term.scr };
++
++ kscrolldown(&arg);
+
+ if (may_echo && IS_SET(MODE_ECHO))
+ twrite(s, n, 1);
+@@ -1059,13 +1069,53 @@ tswapscreen(void)
+ }
+
+ void
+-tscrolldown(int orig, int n)
++kscrolldown(const Arg* a)
++{
++ int n = a->i;
++
++ if (n < 0)
++ n = term.row + n;
++
++ if (n > term.scr)
++ n = term.scr;
++
++ if (term.scr > 0) {
++ term.scr -= n;
++ selscroll(0, -n);
++ tfulldirt();
++ }
++}
++
++void
++kscrollup(const Arg* a)
++{
++ int n = a->i;
++
++ if (n < 0)
++ n = term.row + n;
++
++ if (term.scr <= HISTSIZE-n) {
++ term.scr += n;
++ selscroll(0, n);
++ tfulldirt();
++ }
++}
++
++void
++tscrolldown(int orig, int n, int copyhist)
+ {
+ int i;
+ Line temp;
+
+ LIMIT(n, 0, term.bot-orig+1);
+
++ if (copyhist) {
++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE;
++ temp = term.hist[term.histi];
++ term.hist[term.histi] = term.line[term.bot];
++ term.line[term.bot] = temp;
++ }
++
+ tsetdirt(orig, term.bot-n);
+ tclearregion(0, term.bot-n+1, term.col-1, term.bot);
+
+@@ -1075,17 +1125,28 @@ tscrolldown(int orig, int n)
+ term.line[i-n] = temp;
+ }
+
+- selscroll(orig, n);
++ if (term.scr == 0)
++ selscroll(orig, n);
+ }
+
+ void
+-tscrollup(int orig, int n)
++tscrollup(int orig, int n, int copyhist)
+ {
+ int i;
+ Line temp;
+
+ LIMIT(n, 0, term.bot-orig+1);
+
++ if (copyhist) {
++ term.histi = (term.histi + 1) % HISTSIZE;
++ temp = term.hist[term.histi];
++ term.hist[term.histi] = term.line[orig];
++ term.line[orig] = temp;
++ }
++
++ if (term.scr > 0 && term.scr < HISTSIZE)
++ term.scr = MIN(term.scr + n, HISTSIZE-1);
++
+ tclearregion(0, orig, term.col-1, orig+n-1);
+ tsetdirt(orig+n, term.bot);
+
+@@ -1095,7 +1156,8 @@ tscrollup(int orig, int n)
+ term.line[i+n] = temp;
+ }
+
+- selscroll(orig, -n);
++ if (term.scr == 0)
++ selscroll(orig, -n);
+ }
+
+ void
+@@ -1124,7 +1186,7 @@ tnewline(int first_col)
+ int y = term.c.y;
+
+ if (y == term.bot) {
+- tscrollup(term.top, 1);
++ tscrollup(term.top, 1, 1);
+ } else {
+ y++;
+ }
+@@ -1289,14 +1351,14 @@ void
+ tinsertblankline(int n)
+ {
+ if (BETWEEN(term.c.y, term.top, term.bot))
+- tscrolldown(term.c.y, n);
++ tscrolldown(term.c.y, n, 0);
+ }
+
+ void
+ tdeleteline(int n)
+ {
+ if (BETWEEN(term.c.y, term.top, term.bot))
+- tscrollup(term.c.y, n);
++ tscrollup(term.c.y, n, 0);
+ }
+
+ int32_t
+@@ -1733,11 +1795,11 @@ csihandle(void)
+ break;
+ case 'S': /* SU -- Scroll <n> line up */
+ DEFAULT(csiescseq.arg[0], 1);
+- tscrollup(term.top, csiescseq.arg[0]);
++ tscrollup(term.top, csiescseq.arg[0], 0);
+ break;
+ case 'T': /* SD -- Scroll <n> line down */
+ DEFAULT(csiescseq.arg[0], 1);
+- tscrolldown(term.top, csiescseq.arg[0]);
++ tscrolldown(term.top, csiescseq.arg[0], 0);
+ break;
+ case 'L': /* IL -- Insert <n> blank lines */
+ DEFAULT(csiescseq.arg[0], 1);
+@@ -2241,7 +2303,7 @@ eschandle(uchar ascii)
+ return 0;
+ case 'D': /* IND -- Linefeed */
+ if (term.c.y == term.bot) {
+- tscrollup(term.top, 1);
++ tscrollup(term.top, 1, 1);
+ } else {
+ tmoveto(term.c.x, term.c.y+1);
+ }
+@@ -2254,7 +2316,7 @@ eschandle(uchar ascii)
+ break;
+ case 'M': /* RI -- Reverse index */
+ if (term.c.y == term.top) {
+- tscrolldown(term.top, 1);
++ tscrolldown(term.top, 1, 1);
+ } else {
+ tmoveto(term.c.x, term.c.y-1);
+ }
+@@ -2464,7 +2526,7 @@ twrite(const char *buf, int buflen, int show_ctrl)
+ void
+ tresize(int col, int row)
+ {
+- int i;
++ int i, j;
+ int minrow = MIN(row, term.row);
+ int mincol = MIN(col, term.col);
+ int *bp;
+@@ -2501,6 +2563,14 @@ tresize(int col, int row)
+ term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty));
+ term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs));
+
++ for (i = 0; i < HISTSIZE; i++) {
++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph));
++ for (j = mincol; j < col; j++) {
++ term.hist[i][j] = term.c.attr;
++ term.hist[i][j].u = ' ';
++ }
++ }
++
+ /* resize each row to new width, zero-pad if needed */
+ for (i = 0; i < minrow; i++) {
+ term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph));
+@@ -2559,7 +2629,7 @@ drawregion(int x1, int y1, int x2, int y2)
+ continue;
+
+ term.dirty[y] = 0;
+- xdrawline(term.line[y], x1, y, x2);
++ xdrawline(TLINE(y), x1, y, x2);
+ }
+ }
+
+@@ -2580,8 +2650,9 @@ draw(void)
+ cx--;
+
+ drawregion(0, 0, term.col, term.row);
+- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
+- term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
++ if (term.scr == 0)
++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
+ term.ocx = cx;
+ term.ocy = term.c.y;
+ xfinishdraw();
+diff --git a/st.h b/st.h
+index 3d351b6..f44e1d3 100644
+--- a/st.h
++++ b/st.h
+@@ -81,6 +81,8 @@ void die(const char *, ...);
+ void redraw(void);
+ void draw(void);
+
++void kscrolldown(const Arg *);
++void kscrollup(const Arg *);
+ void printscreen(const Arg *);
+ void printsel(const Arg *);
+ void sendbreak(const Arg *);
diff --git a/st-0.8.4/patches/st-scrollback-mouse-20191024-a2c479c.diff b/st-0.8.4/patches/st-scrollback-mouse-20191024-a2c479c.diff
new file mode 100644
index 0000000..49eba8e
--- /dev/null
+++ b/st-0.8.4/patches/st-scrollback-mouse-20191024-a2c479c.diff
@@ -0,0 +1,13 @@
+diff --git a/config.def.h b/config.def.h
+index ec1b576..4b3bf15 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -163,6 +163,8 @@ static uint forcemousemod = ShiftMask;
+ */
+ static MouseShortcut mshortcuts[] = {
+ /* mask button function argument release */
++ { ShiftMask, Button4, kscrollup, {.i = 1} },
++ { ShiftMask, Button5, kscrolldown, {.i = 1} },
+ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 },
+ { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} },
+ { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} },
diff --git a/st/st.1 b/st-0.8.4/st.1
index 37f7e84..39120b4 100644
--- a/st/st.1
+++ b/st-0.8.4/st.1
@@ -125,41 +125,6 @@ and all the remaining arguments are used as a command
even without it.
.SH SHORTCUTS
.TP
-.B Alt-j/k or Alt-Up/Down or Alt-Mouse Wheel
-Scroll up/down one line at a time.
-.TP
-.B Alt-u/d or Alt-Page Up/Page Down
-Scroll up/down one screen at a time.
-.TP
-.B Alt-Shift-k/j or Alt-Shift-Page Up/Page Down or Alt-Shift-Mouse Wheel
-Increase or decrease font size.
-.TP
-.B Alt-Home
-Reset to default font size.
-.TP
-.B Shift-Insert or Alt-v
-Paste from clipboard.
-.TP
-.B Alt-c
-Copy to clipboard.
-.TP
-.B Alt-p
-Paste/input primary selection.
-.TP
-.B Alt-l
-Show dmenu menu of all URLs on screen and choose one to open.
-.TP
-.B Alt-y
-Show dmenu menu of all URLs on screen and choose one to copy.
-.TP
-.B Alt-o
-Show dmenu menu of all recently run commands and copy the output of the chosen command to the clipboard.
-.I xclip
-required.
-.TP
-.B Alt-a/s
-Increase or decrease opacity/alpha value (make window more or less transparent).
-.TP
.B Break
Send a break in the serial line.
Break key is obtained in PC keyboards
@@ -176,6 +141,24 @@ Print the full screen to the
.B Print Screen
Print the selection to the
.I iofile.
+.TP
+.B Ctrl-Shift-Page Up
+Increase font size.
+.TP
+.B Ctrl-Shift-Page Down
+Decrease font size.
+.TP
+.B Ctrl-Shift-Home
+Reset to default font size.
+.TP
+.B Ctrl-Shift-y
+Paste from primary selection (middle mouse button).
+.TP
+.B Ctrl-Shift-c
+Copy the selected text to the clipboard selection.
+.TP
+.B Ctrl-Shift-v
+Paste from the clipboard selection.
.SH CUSTOMIZATION
.B st
can be customized by creating a custom config.h and (re)compiling the source
@@ -191,3 +174,4 @@ See the LICENSE file for the terms of redistribution.
.BR scroll (1)
.SH BUGS
See the TODO file in the distribution.
+
diff --git a/st/st.c b/st-0.8.4/st.c
index 1cf277c..edec064 100644
--- a/st/st.c
+++ b/st-0.8.4/st.c
@@ -46,7 +46,6 @@
#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \
term.scr + HISTSIZE + 1) % HISTSIZE] : \
term.line[(y) - term.scr])
-#define TLINE_HIST(y) ((y) <= HISTSIZE-term.row+2 ? term.hist[(y)] : term.line[(y-HISTSIZE+term.row-3)])
enum term_mode {
MODE_WRAP = 1 << 0,
@@ -431,20 +430,6 @@ tlinelen(int y)
return i;
}
-int
-tlinehistlen(int y)
-{
- int i = term.col;
-
- if (TLINE_HIST(y)[i - 1].mode & ATTR_WRAP)
- return i;
-
- while (i > 0 && TLINE_HIST(y)[i - 1].u == ' ')
- --i;
-
- return i;
-}
-
void
selstart(int col, int row, int snap)
{
@@ -1296,9 +1281,6 @@ tsetchar(Rune u, Glyph *attr, int x, int y)
term.dirty[y] = 1;
term.line[y][x] = *attr;
term.line[y][x].u = u;
-
- if (isboxdraw(u))
- term.line[y][x].mode |= ATTR_BOXDRAW;
}
void
@@ -1933,15 +1915,7 @@ strhandle(void)
case ']': /* OSC -- Operating System Command */
switch (par) {
case 0:
- if (narg > 1) {
- xsettitle(strescseq.args[1]);
- xseticontitle(strescseq.args[1]);
- }
- return;
case 1:
- if (narg > 1)
- xseticontitle(strescseq.args[1]);
- return;
case 2:
if (narg > 1)
xsettitle(strescseq.args[1]);
@@ -2015,61 +1989,6 @@ strparse(void)
}
void
-externalpipe(const Arg *arg)
-{
- int to[2];
- char buf[UTF_SIZ];
- void (*oldsigpipe)(int);
- Glyph *bp, *end;
- int lastpos, n, newline;
-
- if (pipe(to) == -1)
- return;
-
- switch (fork()) {
- case -1:
- close(to[0]);
- close(to[1]);
- return;
- case 0:
- dup2(to[0], STDIN_FILENO);
- close(to[0]);
- close(to[1]);
- execvp(((char **)arg->v)[0], (char **)arg->v);
- fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
- perror("failed");
- exit(0);
- }
-
- close(to[0]);
- /* ignore sigpipe for now, in case child exists early */
- oldsigpipe = signal(SIGPIPE, SIG_IGN);
- newline = 0;
- for (n = 0; n <= HISTSIZE + 2; n++) {
- bp = TLINE_HIST(n);
- lastpos = MIN(tlinehistlen(n) + 1, term.col) - 1;
- if (lastpos < 0)
- break;
- if (lastpos == 0)
- continue;
- end = &bp[lastpos + 1];
- for (; bp < end; ++bp)
- if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
- break;
- if ((newline = TLINE_HIST(n)[lastpos].mode & ATTR_WRAP))
- continue;
- if (xwrite(to[1], "\n", 1) < 0)
- break;
- newline = 0;
- }
- if (newline)
- (void)xwrite(to[1], "\n", 1);
- close(to[1]);
- /* restore */
- signal(SIGPIPE, oldsigpipe);
-}
-
-void
strdump(void)
{
size_t i;
@@ -2733,11 +2652,7 @@ draw(void)
drawregion(0, 0, term.col, term.row);
if (term.scr == 0)
xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
- term.ocx, term.ocy, term.line[term.ocy][term.ocx],
- term.line[term.ocy], term.col);
- /* xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], */
- /* term.ocx, term.ocy, term.line[term.ocy][term.ocx], */
- /* term.line[term.ocy], term.col); */
+ term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
term.ocx = cx;
term.ocy = term.c.y;
xfinishdraw();
diff --git a/st/st.h b/st-0.8.4/st.h
index ac76b71..7ea2fd3 100644
--- a/st/st.h
+++ b/st-0.8.4/st.h
@@ -11,8 +11,7 @@
#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d))
#define DEFAULT(a, b) (a) = (a) ? (a) : (b)
#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
-#define ATTRCMP(a, b) (((a).mode & (~ATTR_WRAP) & (~ATTR_LIGA)) != ((b).mode & (~ATTR_WRAP) & (~ATTR_LIGA)) || \
- (a).fg != (b).fg || \
+#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \
(a).bg != (b).bg)
#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \
(t1.tv_nsec-t2.tv_nsec)/1E6)
@@ -34,8 +33,6 @@ enum glyph_attribute {
ATTR_WRAP = 1 << 8,
ATTR_WIDE = 1 << 9,
ATTR_WDUMMY = 1 << 10,
- ATTR_BOXDRAW = 1 << 11,
- ATTR_LIGA = 1 << 12,
ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT,
};
@@ -84,7 +81,6 @@ void die(const char *, ...);
void redraw(void);
void draw(void);
-void externalpipe(const Arg *);
void kscrolldown(const Arg *);
void kscrollup(const Arg *);
void printscreen(const Arg *);
@@ -117,14 +113,6 @@ void *xmalloc(size_t);
void *xrealloc(void *, size_t);
char *xstrdup(char *);
-int isboxdraw(Rune);
-ushort boxdrawindex(const Glyph *);
-#ifdef XFT_VERSION
-/* only exposed to x.c, otherwise we'll need Xft.h for the types */
-void boxdraw_xinit(Display *, Colormap, XftDraw *, Visual *);
-void drawboxes(int, int, int, int, XftColor *, XftColor *, const XftGlyphFontSpec *, int);
-#endif
-
/* config.h globals */
extern char *utmp;
extern char *scroll;
@@ -138,4 +126,3 @@ extern unsigned int tabspaces;
extern unsigned int defaultfg;
extern unsigned int defaultbg;
extern float alpha;
-extern const int boxdraw, boxdraw_bold, boxdraw_braille;
diff --git a/st/st.info b/st-0.8.4/st.info
index 8201ad6..8201ad6 100644
--- a/st/st.info
+++ b/st-0.8.4/st.info
diff --git a/st/win.h b/st-0.8.4/win.h
index 8b5b618..a6ef1b9 100644
--- a/st/win.h
+++ b/st-0.8.4/win.h
@@ -25,12 +25,11 @@ enum win_mode {
void xbell(void);
void xclipcopy(void);
-void xdrawcursor(int, int, Glyph, int, int, Glyph, Line, int);
+void xdrawcursor(int, int, Glyph, int, int, Glyph);
void xdrawline(Line, int, int, int);
void xfinishdraw(void);
void xloadcols(void);
int xsetcolorname(int, const char *);
-void xseticontitle(char *);
void xsettitle(char *);
int xsetcursor(int);
void xsetmode(int, unsigned int);
diff --git a/st/x.c b/st-0.8.4/x.c
index 696ade9..ea97326 100644
--- a/st/x.c
+++ b/st-0.8.4/x.c
@@ -14,13 +14,11 @@
#include <X11/keysym.h>
#include <X11/Xft/Xft.h>
#include <X11/XKBlib.h>
-#include <X11/Xresource.h>
char *argv0;
#include "arg.h"
#include "st.h"
#include "win.h"
-#include "hb.h"
/* types used in config.h */
typedef struct {
@@ -47,19 +45,6 @@ typedef struct {
signed char appcursor; /* application cursor */
} Key;
-/* Xresources preferences */
-enum resource_type {
- STRING = 0,
- INTEGER = 1,
- FLOAT = 2
-};
-
-typedef struct {
- char *name;
- enum resource_type type;
- void *dst;
-} ResourcePref;
-
/* X modifiers */
#define XK_ANY_MOD UINT_MAX
#define XK_NO_MOD 0
@@ -70,7 +55,6 @@ static void clipcopy(const Arg *);
static void clippaste(const Arg *);
static void numlock(const Arg *);
static void selpaste(const Arg *);
-static void changealpha(const Arg *);
static void zoom(const Arg *);
static void zoomabs(const Arg *);
static void zoomreset(const Arg *);
@@ -109,7 +93,7 @@ typedef struct {
Window win;
Drawable buf;
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
- Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid;
+ Atom xembed, wmdeletewin, netwmname, netwmpid;
struct {
XIM xim;
XIC xic;
@@ -174,8 +158,6 @@ static void xhints(void);
static int xloadcolor(int, const char *, Color *);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, double);
-static int xloadsparefont(FcPattern *, int);
-static void xloadsparefonts(void);
static void xunloadfont(Font *);
static void xunloadfonts(void);
static void xsetenv(void);
@@ -273,6 +255,7 @@ static char *opt_name = NULL;
static char *opt_title = NULL;
static int oldbutton = 3; /* button event on startup: 3 = release */
+static int cursorblinks = 0;
void
clipcopy(const Arg *dummy)
@@ -313,20 +296,6 @@ numlock(const Arg *dummy)
}
void
-changealpha(const Arg *arg)
-{
- if((alpha > 0 && arg->f < 0) || (alpha < 1 && arg->f > 0))
- alpha += arg->f;
- if(alpha < 0)
- alpha = 0;
- if(alpha > 1)
- alpha = 1;
-
- xloadcols();
- redraw();
-}
-
-void
zoom(const Arg *arg)
{
Arg larg;
@@ -340,7 +309,6 @@ zoomabs(const Arg *arg)
{
xunloadfonts();
xloadfonts(usedfont, arg->f);
- xloadsparefonts();
cresize(0, 0);
redraw();
xhints();
@@ -870,8 +838,8 @@ xclear(int x1, int y1, int x2, int y2)
void
xhints(void)
{
- XClassHint class = {opt_name ? opt_name : "st",
- opt_class ? opt_class : "St"};
+ XClassHint class = {opt_name ? opt_name : termname,
+ opt_class ? opt_class : termname};
XWMHints wm = {.flags = InputHint, .input = 1};
XSizeHints *sizeh;
@@ -1061,101 +1029,6 @@ xloadfonts(char *fontstr, double fontsize)
FcPatternDestroy(pattern);
}
-int
-xloadsparefont(FcPattern *pattern, int flags)
-{
- FcPattern *match;
- FcResult result;
-
- match = FcFontMatch(NULL, pattern, &result);
- if (!match) {
- return 1;
- }
-
- if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) {
- FcPatternDestroy(match);
- return 1;
- }
-
- frc[frclen].flags = flags;
- /* Believe U+0000 glyph will present in each default font */
- frc[frclen].unicodep = 0;
- frclen++;
-
- return 0;
-}
-
-void
-xloadsparefonts(void)
-{
- FcPattern *pattern;
- double sizeshift, fontval;
- int fc;
- char **fp;
-
- if (frclen != 0)
- die("can't embed spare fonts. cache isn't empty");
-
- /* Calculate count of spare fonts */
- fc = sizeof(font2) / sizeof(*font2);
- if (fc == 0)
- return;
-
- /* Allocate memory for cache entries. */
- if (frccap < 4 * fc) {
- frccap += 4 * fc - frccap;
- frc = xrealloc(frc, frccap * sizeof(Fontcache));
- }
-
- for (fp = font2; fp - font2 < fc; ++fp) {
-
- if (**fp == '-')
- pattern = XftXlfdParse(*fp, False, False);
- else
- pattern = FcNameParse((FcChar8 *)*fp);
-
- if (!pattern)
- die("can't open spare font %s\n", *fp);
-
- if (defaultfontsize > 0) {
- sizeshift = usedfontsize - defaultfontsize;
- if (sizeshift != 0 &&
- FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) ==
- FcResultMatch) {
- fontval += sizeshift;
- FcPatternDel(pattern, FC_PIXEL_SIZE);
- FcPatternDel(pattern, FC_SIZE);
- FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval);
- }
- }
-
- FcPatternAddBool(pattern, FC_SCALABLE, 1);
-
- FcConfigSubstitute(NULL, pattern, FcMatchPattern);
- XftDefaultSubstitute(xw.dpy, xw.scr, pattern);
-
- if (xloadsparefont(pattern, FRC_NORMAL))
- die("can't open spare font %s\n", *fp);
-
- FcPatternDel(pattern, FC_SLANT);
- FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
- if (xloadsparefont(pattern, FRC_ITALIC))
- die("can't open spare font %s\n", *fp);
-
- FcPatternDel(pattern, FC_WEIGHT);
- FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
- if (xloadsparefont(pattern, FRC_ITALICBOLD))
- die("can't open spare font %s\n", *fp);
-
- FcPatternDel(pattern, FC_SLANT);
- FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN);
- if (xloadsparefont(pattern, FRC_BOLD))
- die("can't open spare font %s\n", *fp);
-
- FcPatternDestroy(pattern);
- }
-}
-
void
xunloadfont(Font *f)
{
@@ -1168,9 +1041,6 @@ xunloadfont(Font *f)
void
xunloadfonts(void)
{
- /* Clear Harfbuzz font cache. */
- hbunloadfonts();
-
/* Free the loaded fonts in the font cache. */
while (frclen > 0)
XftFontClose(xw.dpy, frc[--frclen].font);
@@ -1246,6 +1116,8 @@ xinit(int cols, int rows)
XWindowAttributes attr;
XVisualInfo vis;
+ if (!(xw.dpy = XOpenDisplay(NULL)))
+ die("can't open display\n");
xw.scr = XDefaultScreen(xw.dpy);
if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
@@ -1266,9 +1138,6 @@ xinit(int cols, int rows)
usedfont = (opt_font == NULL)? font : opt_font;
xloadfonts(usedfont, 0);
- /* spare fonts */
- xloadsparefonts();
-
/* colors */
xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
xloadcols();
@@ -1335,7 +1204,6 @@ xinit(int cols, int rows)
xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False);
- xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False);
@@ -1355,8 +1223,6 @@ xinit(int cols, int rows)
xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0);
if (xsel.xtarget == None)
xsel.xtarget = XA_STRING;
-
- boxdraw_xinit(xw.dpy, xw.cmap, xw.draw, xw.vis);
}
int
@@ -1381,7 +1247,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
mode = glyphs[i].mode;
/* Skip dummy wide-character spacing. */
- if (mode & ATTR_WDUMMY)
+ if (mode == ATTR_WDUMMY)
continue;
/* Determine font for glyph if different from previous glyph. */
@@ -1403,13 +1269,8 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
yp = winy + font->ascent;
}
- if (mode & ATTR_BOXDRAW) {
- /* minor shoehorning: boxdraw uses only this ushort */
- glyphidx = boxdrawindex(&glyphs[i]);
- } else {
- /* Lookup character index with default font. */
- glyphidx = XftCharIndex(xw.dpy, font->match, rune);
- }
+ /* Lookup character index with default font. */
+ glyphidx = XftCharIndex(xw.dpy, font->match, rune);
if (glyphidx) {
specs[numspecs].font = font->match;
specs[numspecs].glyph = glyphidx;
@@ -1493,9 +1354,6 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
numspecs++;
}
- /* Harfbuzz transformation for ligatures. */
- hbtransform(specs, glyphs, len, x, y);
-
return numspecs;
}
@@ -1616,12 +1474,8 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
r.width = width;
XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
- if (base.mode & ATTR_BOXDRAW) {
- drawboxes(winx, winy, width / len, win.ch, fg, bg, specs, len);
- } else {
- /* Render the glyphs. */
- XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
- }
+ /* Render the glyphs. */
+ XftDrawGlyphFontSpec(xw.draw, fg, specs, len);
/* Render underline and strikethrough. */
if (base.mode & ATTR_UNDERLINE) {
@@ -1649,17 +1503,14 @@ xdrawglyph(Glyph g, int x, int y)
}
void
-xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int len)
+xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
{
Color drawcol;
/* remove the old cursor */
if (selected(ox, oy))
og.mode ^= ATTR_REVERSE;
-
- /* Redraw the line where cursor was previously.
- * It will restore the ligatures broken by the cursor. */
- xdrawline(line, 0, oy, len);
+ xdrawglyph(og, ox, oy);
if (IS_SET(MODE_HIDE))
return;
@@ -1667,7 +1518,7 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le
/*
* Select the right color for the right mode.
*/
- g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE|ATTR_BOXDRAW;
+ g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE;
if (IS_SET(MODE_REVERSE)) {
g.mode |= ATTR_REVERSE;
@@ -1693,16 +1544,19 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le
/* draw the new one */
if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) {
- case 7: /* st extension */
- g.u = 0x2603; /* snowman (U+2603) */
+ case 0: /* Blinking block */
+ case 1: /* Blinking block (default) */
+ if (IS_SET(MODE_BLINK))
+ break;
/* FALLTHROUGH */
- case 0: /* Blinking Block */
- case 1: /* Blinking Block (Default) */
- case 2: /* Steady Block */
+ case 2: /* Steady block */
xdrawglyph(g, cx, cy);
break;
- case 3: /* Blinking Underline */
- case 4: /* Steady Underline */
+ case 3: /* Blinking underline */
+ if (IS_SET(MODE_BLINK))
+ break;
+ /* FALLTHROUGH */
+ case 4: /* Steady underline */
XftDrawRect(xw.draw, &drawcol,
borderpx + cx * win.cw,
borderpx + (cy + 1) * win.ch - \
@@ -1710,12 +1564,23 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le
win.cw, cursorthickness);
break;
case 5: /* Blinking bar */
+ if (IS_SET(MODE_BLINK))
+ break;
+ /* FALLTHROUGH */
case 6: /* Steady bar */
XftDrawRect(xw.draw, &drawcol,
borderpx + cx * win.cw,
borderpx + cy * win.ch,
cursorthickness, win.ch);
break;
+ case 7: /* Blinking st cursor */
+ if (IS_SET(MODE_BLINK))
+ break;
+ /* FALLTHROUGH */
+ case 8: /* Steady st cursor */
+ g.u = stcursor;
+ xdrawglyph(g, cx, cy);
+ break;
}
} else {
XftDrawRect(xw.draw, &drawcol,
@@ -1747,19 +1612,6 @@ xsetenv(void)
}
void
-xseticontitle(char *p)
-{
- XTextProperty prop;
- DEFAULT(p, opt_title);
-
- Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
- &prop);
- XSetWMIconName(xw.dpy, xw.win, &prop);
- XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname);
- XFree(prop.value);
-}
-
-void
xsettitle(char *p)
{
XTextProperty prop;
@@ -1870,9 +1722,12 @@ xsetmode(int set, unsigned int flags)
int
xsetcursor(int cursor)
{
- if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
+ if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
return 1;
win.cursor = cursor;
+ cursorblinks = win.cursor == 0 || win.cursor == 1 ||
+ win.cursor == 3 || win.cursor == 5 ||
+ win.cursor == 7;
return 0;
}
@@ -2116,6 +1971,10 @@ run(void)
if (FD_ISSET(ttyfd, &rfd) || xev) {
if (!drawing) {
trigger = now;
+ if (IS_SET(MODE_BLINK)) {
+ win.mode ^= MODE_BLINK;
+ }
+ lastblink = now;
drawing = 1;
}
timeout = (maxlatency - TIMEDIFF(now, trigger)) \
@@ -2126,7 +1985,7 @@ run(void)
/* idle detected or maxlatency exhausted -> draw */
timeout = -1;
- if (blinktimeout && tattrset(ATTR_BLINK)) {
+ if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK))) {
timeout = blinktimeout - TIMEDIFF(now, lastblink);
if (timeout <= 0) {
if (-timeout > blinktimeout) /* start visible */
@@ -2144,59 +2003,6 @@ run(void)
}
}
-int
-resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst)
-{
- char **sdst = dst;
- int *idst = dst;
- float *fdst = dst;
-
- char fullname[256];
- char fullclass[256];
- char *type;
- XrmValue ret;
-
- snprintf(fullname, sizeof(fullname), "%s.%s",
- opt_name ? opt_name : "st", name);
- snprintf(fullclass, sizeof(fullclass), "%s.%s",
- opt_class ? opt_class : "St", name);
- fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0';
-
- XrmGetResource(db, fullname, fullclass, &type, &ret);
- if (ret.addr == NULL || strncmp("String", type, 64))
- return 1;
-
- switch (rtype) {
- case STRING:
- *sdst = ret.addr;
- break;
- case INTEGER:
- *idst = strtoul(ret.addr, NULL, 10);
- break;
- case FLOAT:
- *fdst = strtof(ret.addr, NULL);
- break;
- }
- return 0;
-}
-
-void
-config_init(void)
-{
- char *resm;
- XrmDatabase db;
- ResourcePref *p;
-
- XrmInitialize();
- resm = XResourceManagerString(xw.dpy);
- if (!resm)
- return;
-
- db = XrmGetStringDatabase(resm);
- for (p = resources; p < resources + LEN(resources); p++)
- resource_load(db, p->name, p->type, p->dst);
-}
-
void
usage(void)
{
@@ -2215,7 +2021,7 @@ main(int argc, char *argv[])
{
xw.l = xw.t = 0;
xw.isfixed = False;
- xsetcursor(cursorshape);
+ xsetcursor(cursorstyle);
ARGBEGIN {
case 'a':
@@ -2273,11 +2079,6 @@ run:
setlocale(LC_CTYPE, "");
XSetLocaleModifiers("");
-
- if(!(xw.dpy = XOpenDisplay(NULL)))
- die("Can't open display\n");
-
- config_init();
cols = MAX(cols, 1);
rows = MAX(rows, 1);
tnew(cols, rows);
diff --git a/st/FUNDING.yml b/st/FUNDING.yml
deleted file mode 100644
index c7c9a22..0000000
--- a/st/FUNDING.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-custom: ["https://lukesmith.xyz/donate.html"]
-github: lukesmithxyz
diff --git a/st/README.md b/st/README.md
deleted file mode 100644
index ab25f86..0000000
--- a/st/README.md
+++ /dev/null
@@ -1,105 +0,0 @@
-# Luke's build of st - the simple (suckless) terminal
-
-The [suckless terminal (st)](https://st.suckless.org/) with some additional
-features that make it literally the best terminal emulator ever:
-
-## Unique features (using dmenu)
-
-+ **follow urls** by pressing `alt-l`
-+ **copy urls** in the same way with `alt-y`
-+ **copy the output of commands** with `alt-o`
-
-## Bindings for
-
-+ scroll with `alt-↑/↓` or `alt-pageup/down` or `shift` while scrolling the
- mouse (via [scroll](https://github.com/lukesmithxyz/scroll)).
-+ OR **vim-bindings**: scroll up/down in history with `alt-k` and `alt-j`.
- Faster with `alt-u`/`alt-d`.
-+ **zoom/change font size**: same bindings as above, but holding down shift as
- well. `alt-home` returns to default
-+ **copy text** with `alt-c`, **paste** is `alt-v` or `shift-insert`
-
-## Pretty stuff
-
-+ Compatibility with `Xresources` and `pywal` for dynamic colors.
-+ Default [gruvbox](https://github.com/morhetz/gruvbox) colors otherwise.
-+ Transparency/alpha, which is also adjustable from your `Xresources`.
-+ Default font is system "mono" at 14pt, meaning the font will match your
- system font.
-
-## Other st patches
-
-+ Boxdraw
-+ Ligatures
-+ font2
-+ updated to latest version 0.8.4
-
-## Installation for newbs
-
-You should have xlib header files and libharfbuzz build files installed.
-
-```
-git clone https://github.com/LukeSmithxyz/st
-cd st
-sudo make install
-```
-
-Note that [scroll](https://github.com/lukesmithxyz/scroll) is automatically
-pulled and installed when you make this build of st.
-
-Users of Arch-based distros can also install it from the AUR as
-[st-luke-git](https://aur.archlinux.org/packages/st-luke-git/).
-
-Obviously, `make` is required to build. `fontconfig` is required for the
-default build, since it asks `fontconfig` for your system monospace font. It
-might be obvious, but `libX11` and `libXft` are required as well. Chances are,
-you have all of this installed already.
-
-On OpenBSD, be sure to edit `config.mk` first and remove `-lrt` from the
-`$LIBS` before compiling.
-
-Be sure to have a composite manager (`xcompmgr`, `picom`, etc.) running if you
-want transparency.
-
-## How to configure dynamically with Xresources
-
-For many key variables, this build of `st` will look for X settings set in
-either `~/.Xdefaults` or `~/.Xresources`. You must run `xrdb` on one of these
-files to load the settings.
-
-For example, you can define your desired fonts, transparency or colors:
-
-```
-*.font: Liberation Mono:pixelsize=12:antialias=true:autohint=true;
-*.alpha: 0.9
-*.color0: #111
-...
-```
-
-The `alpha` value (for transparency) goes from `0` (transparent) to `1`
-(opaque). There is an example `Xdefaults` file in this respository.
-
-### Colors
-
-To be clear about the color settings:
-
-- This build will use gruvbox colors by default and as a fallback.
-- If there are Xresources colors defined, those will take priority.
-- But if `wal` has run in your session, its colors will take priority.
-
-Note that when you run `wal`, it will negate the transparency of existing windows, but new windows will continue with the previously defined transparency.
-
-## Notes on Emojis and Special Characters
-
-If st crashes when viewing emojis, install
-[libxft-bgra](https://aur.archlinux.org/packages/libxft-bgra/) from the AUR.
-
-Note that some special characters may appear truncated if too wide. You might
-want to manually set your prefered emoji/special character font to a lower size
-in the `config.h` file to avoid this. By default, JoyPixels is used at a
-smaller size than the usual text.
-
-## Contact
-
-- Luke Smith <luke@lukesmith.xyz>
-- [https://lukesmith.xyz](https://lukesmith.xyz)
diff --git a/st/Xdefaults b/st/Xdefaults
deleted file mode 100644
index 704f2db..0000000
--- a/st/Xdefaults
+++ /dev/null
@@ -1,127 +0,0 @@
-!! Transparency (0-1):
-st.alpha: 0.92
-
-!! Set a default font and font size as below:
-st.font: Monospace-11;
-
-! st.termname: st-256color
-! st.borderpx: 2
-
-!! Set the background, foreground and cursor colors as below:
-
-!! gruvbox:
-*.color0: #1d2021
-*.color1: #cc241d
-*.color2: #98971a
-*.color3: #d79921
-*.color4: #458588
-*.color5: #b16286
-*.color6: #689d6a
-*.color7: #a89984
-*.color8: #928374
-*.color9: #fb4934
-*.color10: #b8bb26
-*.color11: #fabd2f
-*.color12: #83a598
-*.color13: #d3869b
-*.color14: #8ec07c
-*.color15: #ebdbb2
-*.background: #282828
-*.foreground: white
-*.cursorColor: white
-
-/* /1* !! gruvbox light: *1/ */
-/* *.color0: #fbf1c7 */
-/* *.color1: #cc241d */
-/* *.color2: #98971a */
-/* *.color3: #d79921 */
-/* *.color4: #458588 */
-/* *.color5: #b16286 */
-/* *.color6: #689d6a */
-/* *.color7: #7c6f64 */
-/* *.color8: #928374 */
-/* *.color9: #9d0006 */
-/* *.color10: #79740e */
-/* *.color11: #b57614 */
-/* *.color12: #076678 */
-/* *.color13: #8f3f71 */
-/* *.color14: #427b58 */
-/* *.color15: #3c3836 */
-/* *.background: #fbf1c7 */
-/* *.foreground: #282828 */
-/* *.cursorColor: #282828 */
-
-/* !! brogrammer: */
-/* *.foreground: #d6dbe5 */
-/* *.background: #131313 */
-/* *.color0: #1f1f1f */
-/* *.color8: #d6dbe5 */
-/* *.color1: #f81118 */
-/* *.color9: #de352e */
-/* *.color2: #2dc55e */
-/* *.color10: #1dd361 */
-/* *.color3: #ecba0f */
-/* *.color11: #f3bd09 */
-/* *.color4: #2a84d2 */
-/* *.color12: #1081d6 */
-/* *.color5: #4e5ab7 */
-/* *.color13: #5350b9 */
-/* *.color6: #1081d6 */
-/* *.color14: #0f7ddb */
-/* *.color7: #d6dbe5 */
-/* *.color15: #ffffff */
-/* *.colorBD: #d6dbe5 */
-
-/* ! base16 */
-/* *.color0: #181818 */
-/* *.color1: #ab4642 */
-/* *.color2: #a1b56c */
-/* *.color3: #f7ca88 */
-/* *.color4: #7cafc2 */
-/* *.color5: #ba8baf */
-/* *.color6: #86c1b9 */
-/* *.color7: #d8d8d8 */
-/* *.color8: #585858 */
-/* *.color9: #ab4642 */
-/* *.color10: #a1b56c */
-/* *.color11: #f7ca88 */
-/* *.color12: #7cafc2 */
-/* *.color13: #ba8baf */
-/* *.color14: #86c1b9 */
-/* *.color15: #f8f8f8 */
-
-/* !! solarized */
-/* *.color0: #073642 */
-/* *.color1: #dc322f */
-/* *.color2: #859900 */
-/* *.color3: #b58900 */
-/* *.color4: #268bd2 */
-/* *.color5: #d33682 */
-/* *.color6: #2aa198 */
-/* *.color7: #eee8d5 */
-/* *.color9: #cb4b16 */
-/* *.color8: #fdf6e3 */
-/* *.color10: #586e75 */
-/* *.color11: #657b83 */
-/* *.color12: #839496 */
-/* *.color13: #6c71c4 */
-/* *.color14: #93a1a1 */
-/* *.color15: #fdf6e3 */
-
-/* !! xterm */
-/* *.color0: #000000 */
-/* *.color1: #cd0000 */
-/* *.color2: #00cd00 */
-/* *.color3: #cdcd00 */
-/* *.color4: #0000cd */
-/* *.color5: #cd00cd */
-/* *.color6: #00cdcd */
-/* *.color7: #e5e5e5 */
-/* *.color8: #4d4d4d */
-/* *.color9: #ff0000 */
-/* *.color10: #00ff00 */
-/* *.color11: #ffff00 */
-/* *.color12: #0000ff */
-/* *.color13: #ff00ff */
-/* *.color14: #00ffff */
-/* *.color15: #aabac8 */
diff --git a/st/boxdraw.c b/st/boxdraw.c
deleted file mode 100644
index 28a92d0..0000000
--- a/st/boxdraw.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
- * MIT/X Consortium License
- */
-
-#include <X11/Xft/Xft.h>
-#include "st.h"
-#include "boxdraw_data.h"
-
-/* Rounded non-negative integers division of n / d */
-#define DIV(n, d) (((n) + (d) / 2) / (d))
-
-static Display *xdpy;
-static Colormap xcmap;
-static XftDraw *xd;
-static Visual *xvis;
-
-static void drawbox(int, int, int, int, XftColor *, XftColor *, ushort);
-static void drawboxlines(int, int, int, int, XftColor *, ushort);
-
-/* public API */
-
-void
-boxdraw_xinit(Display *dpy, Colormap cmap, XftDraw *draw, Visual *vis)
-{
- xdpy = dpy; xcmap = cmap; xd = draw, xvis = vis;
-}
-
-int
-isboxdraw(Rune u)
-{
- Rune block = u & ~0xff;
- return (boxdraw && block == 0x2500 && boxdata[(uint8_t)u]) ||
- (boxdraw_braille && block == 0x2800);
-}
-
-/* the "index" is actually the entire shape data encoded as ushort */
-ushort
-boxdrawindex(const Glyph *g)
-{
- if (boxdraw_braille && (g->u & ~0xff) == 0x2800)
- return BRL | (uint8_t)g->u;
- if (boxdraw_bold && (g->mode & ATTR_BOLD))
- return BDB | boxdata[(uint8_t)g->u];
- return boxdata[(uint8_t)g->u];
-}
-
-void
-drawboxes(int x, int y, int cw, int ch, XftColor *fg, XftColor *bg,
- const XftGlyphFontSpec *specs, int len)
-{
- for ( ; len-- > 0; x += cw, specs++)
- drawbox(x, y, cw, ch, fg, bg, (ushort)specs->glyph);
-}
-
-/* implementation */
-
-void
-drawbox(int x, int y, int w, int h, XftColor *fg, XftColor *bg, ushort bd)
-{
- ushort cat = bd & ~(BDB | 0xff); /* mask out bold and data */
- if (bd & (BDL | BDA)) {
- /* lines (light/double/heavy/arcs) */
- drawboxlines(x, y, w, h, fg, bd);
-
- } else if (cat == BBD) {
- /* lower (8-X)/8 block */
- int d = DIV((uint8_t)bd * h, 8);
- XftDrawRect(xd, fg, x, y + d, w, h - d);
-
- } else if (cat == BBU) {
- /* upper X/8 block */
- XftDrawRect(xd, fg, x, y, w, DIV((uint8_t)bd * h, 8));
-
- } else if (cat == BBL) {
- /* left X/8 block */
- XftDrawRect(xd, fg, x, y, DIV((uint8_t)bd * w, 8), h);
-
- } else if (cat == BBR) {
- /* right (8-X)/8 block */
- int d = DIV((uint8_t)bd * w, 8);
- XftDrawRect(xd, fg, x + d, y, w - d, h);
-
- } else if (cat == BBQ) {
- /* Quadrants */
- int w2 = DIV(w, 2), h2 = DIV(h, 2);
- if (bd & TL)
- XftDrawRect(xd, fg, x, y, w2, h2);
- if (bd & TR)
- XftDrawRect(xd, fg, x + w2, y, w - w2, h2);
- if (bd & BL)
- XftDrawRect(xd, fg, x, y + h2, w2, h - h2);
- if (bd & BR)
- XftDrawRect(xd, fg, x + w2, y + h2, w - w2, h - h2);
-
- } else if (bd & BBS) {
- /* Shades - data is 1/2/3 for 25%/50%/75% alpha, respectively */
- int d = (uint8_t)bd;
- XftColor xfc;
- XRenderColor xrc = { .alpha = 0xffff };
-
- xrc.red = DIV(fg->color.red * d + bg->color.red * (4 - d), 4);
- xrc.green = DIV(fg->color.green * d + bg->color.green * (4 - d), 4);
- xrc.blue = DIV(fg->color.blue * d + bg->color.blue * (4 - d), 4);
-
- XftColorAllocValue(xdpy, xvis, xcmap, &xrc, &xfc);
- XftDrawRect(xd, &xfc, x, y, w, h);
- XftColorFree(xdpy, xvis, xcmap, &xfc);
-
- } else if (cat == BRL) {
- /* braille, each data bit corresponds to one dot at 2x4 grid */
- int w1 = DIV(w, 2);
- int h1 = DIV(h, 4), h2 = DIV(h, 2), h3 = DIV(3 * h, 4);
-
- if (bd & 1) XftDrawRect(xd, fg, x, y, w1, h1);
- if (bd & 2) XftDrawRect(xd, fg, x, y + h1, w1, h2 - h1);
- if (bd & 4) XftDrawRect(xd, fg, x, y + h2, w1, h3 - h2);
- if (bd & 8) XftDrawRect(xd, fg, x + w1, y, w - w1, h1);
- if (bd & 16) XftDrawRect(xd, fg, x + w1, y + h1, w - w1, h2 - h1);
- if (bd & 32) XftDrawRect(xd, fg, x + w1, y + h2, w - w1, h3 - h2);
- if (bd & 64) XftDrawRect(xd, fg, x, y + h3, w1, h - h3);
- if (bd & 128) XftDrawRect(xd, fg, x + w1, y + h3, w - w1, h - h3);
-
- }
-}
-
-void
-drawboxlines(int x, int y, int w, int h, XftColor *fg, ushort bd)
-{
- /* s: stem thickness. width/8 roughly matches underscore thickness. */
- /* We draw bold as 1.5 * normal-stem and at least 1px thicker. */
- /* doubles draw at least 3px, even when w or h < 3. bold needs 6px. */
- int mwh = MIN(w, h);
- int base_s = MAX(1, DIV(mwh, 8));
- int bold = (bd & BDB) && mwh >= 6; /* possibly ignore boldness */
- int s = bold ? MAX(base_s + 1, DIV(3 * base_s, 2)) : base_s;
- int w2 = DIV(w - s, 2), h2 = DIV(h - s, 2);
- /* the s-by-s square (x + w2, y + h2, s, s) is the center texel. */
- /* The base length (per direction till edge) includes this square. */
-
- int light = bd & (LL | LU | LR | LD);
- int double_ = bd & (DL | DU | DR | DD);
-
- if (light) {
- /* d: additional (negative) length to not-draw the center */
- /* texel - at arcs and avoid drawing inside (some) doubles */
- int arc = bd & BDA;
- int multi_light = light & (light - 1);
- int multi_double = double_ & (double_ - 1);
- /* light crosses double only at DH+LV, DV+LH (ref. shapes) */
- int d = arc || (multi_double && !multi_light) ? -s : 0;
-
- if (bd & LL)
- XftDrawRect(xd, fg, x, y + h2, w2 + s + d, s);
- if (bd & LU)
- XftDrawRect(xd, fg, x + w2, y, s, h2 + s + d);
- if (bd & LR)
- XftDrawRect(xd, fg, x + w2 - d, y + h2, w - w2 + d, s);
- if (bd & LD)
- XftDrawRect(xd, fg, x + w2, y + h2 - d, s, h - h2 + d);
- }
-
- /* double lines - also align with light to form heavy when combined */
- if (double_) {
- /*
- * going clockwise, for each double-ray: p is additional length
- * to the single-ray nearer to the previous direction, and n to
- * the next. p and n adjust from the base length to lengths
- * which consider other doubles - shorter to avoid intersections
- * (p, n), or longer to draw the far-corner texel (n).
- */
- int dl = bd & DL, du = bd & DU, dr = bd & DR, dd = bd & DD;
- if (dl) {
- int p = dd ? -s : 0, n = du ? -s : dd ? s : 0;
- XftDrawRect(xd, fg, x, y + h2 + s, w2 + s + p, s);
- XftDrawRect(xd, fg, x, y + h2 - s, w2 + s + n, s);
- }
- if (du) {
- int p = dl ? -s : 0, n = dr ? -s : dl ? s : 0;
- XftDrawRect(xd, fg, x + w2 - s, y, s, h2 + s + p);
- XftDrawRect(xd, fg, x + w2 + s, y, s, h2 + s + n);
- }
- if (dr) {
- int p = du ? -s : 0, n = dd ? -s : du ? s : 0;
- XftDrawRect(xd, fg, x + w2 - p, y + h2 - s, w - w2 + p, s);
- XftDrawRect(xd, fg, x + w2 - n, y + h2 + s, w - w2 + n, s);
- }
- if (dd) {
- int p = dr ? -s : 0, n = dl ? -s : dr ? s : 0;
- XftDrawRect(xd, fg, x + w2 + s, y + h2 - p, s, h - h2 + p);
- XftDrawRect(xd, fg, x + w2 - s, y + h2 - n, s, h - h2 + n);
- }
- }
-}
diff --git a/st/boxdraw_data.h b/st/boxdraw_data.h
deleted file mode 100644
index 7890500..0000000
--- a/st/boxdraw_data.h
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2018 Avi Halachmi (:avih) avihpit@yahoo.com https://github.com/avih
- * MIT/X Consortium License
- */
-
-/*
- * U+25XX codepoints data
- *
- * References:
- * http://www.unicode.org/charts/PDF/U2500.pdf
- * http://www.unicode.org/charts/PDF/U2580.pdf
- *
- * Test page:
- * https://github.com/GNOME/vte/blob/master/doc/boxes.txt
- */
-
-/* Each shape is encoded as 16-bits. Higher bits are category, lower are data */
-/* Categories (mutually exclusive except BDB): */
-/* For convenience, BDL/BDA/BBS/BDB are 1 bit each, the rest are enums */
-#define BDL (1<<8) /* Box Draw Lines (light/double/heavy) */
-#define BDA (1<<9) /* Box Draw Arc (light) */
-
-#define BBD (1<<10) /* Box Block Down (lower) X/8 */
-#define BBL (2<<10) /* Box Block Left X/8 */
-#define BBU (3<<10) /* Box Block Upper X/8 */
-#define BBR (4<<10) /* Box Block Right X/8 */
-#define BBQ (5<<10) /* Box Block Quadrants */
-#define BRL (6<<10) /* Box Braille (data is lower byte of U28XX) */
-
-#define BBS (1<<14) /* Box Block Shades */
-#define BDB (1<<15) /* Box Draw is Bold */
-
-/* (BDL/BDA) Light/Double/Heavy x Left/Up/Right/Down/Horizontal/Vertical */
-/* Heavy is light+double (literally drawing light+double align to form heavy) */
-#define LL (1<<0)
-#define LU (1<<1)
-#define LR (1<<2)
-#define LD (1<<3)
-#define LH (LL+LR)
-#define LV (LU+LD)
-
-#define DL (1<<4)
-#define DU (1<<5)
-#define DR (1<<6)
-#define DD (1<<7)
-#define DH (DL+DR)
-#define DV (DU+DD)
-
-#define HL (LL+DL)
-#define HU (LU+DU)
-#define HR (LR+DR)
-#define HD (LD+DD)
-#define HH (HL+HR)
-#define HV (HU+HD)
-
-/* (BBQ) Quadrants Top/Bottom x Left/Right */
-#define TL (1<<0)
-#define TR (1<<1)
-#define BL (1<<2)
-#define BR (1<<3)
-
-/* Data for U+2500 - U+259F except dashes/diagonals */
-static const unsigned short boxdata[256] = {
- /* light lines */
- [0x00] = BDL + LH, /* light horizontal */
- [0x02] = BDL + LV, /* light vertical */
- [0x0c] = BDL + LD + LR, /* light down and right */
- [0x10] = BDL + LD + LL, /* light down and left */
- [0x14] = BDL + LU + LR, /* light up and right */
- [0x18] = BDL + LU + LL, /* light up and left */
- [0x1c] = BDL + LV + LR, /* light vertical and right */
- [0x24] = BDL + LV + LL, /* light vertical and left */
- [0x2c] = BDL + LH + LD, /* light horizontal and down */
- [0x34] = BDL + LH + LU, /* light horizontal and up */
- [0x3c] = BDL + LV + LH, /* light vertical and horizontal */
- [0x74] = BDL + LL, /* light left */
- [0x75] = BDL + LU, /* light up */
- [0x76] = BDL + LR, /* light right */
- [0x77] = BDL + LD, /* light down */
-
- /* heavy [+light] lines */
- [0x01] = BDL + HH,
- [0x03] = BDL + HV,
- [0x0d] = BDL + HR + LD,
- [0x0e] = BDL + HD + LR,
- [0x0f] = BDL + HD + HR,
- [0x11] = BDL + HL + LD,
- [0x12] = BDL + HD + LL,
- [0x13] = BDL + HD + HL,
- [0x15] = BDL + HR + LU,
- [0x16] = BDL + HU + LR,
- [0x17] = BDL + HU + HR,
- [0x19] = BDL + HL + LU,
- [0x1a] = BDL + HU + LL,
- [0x1b] = BDL + HU + HL,
- [0x1d] = BDL + HR + LV,
- [0x1e] = BDL + HU + LD + LR,
- [0x1f] = BDL + HD + LR + LU,
- [0x20] = BDL + HV + LR,
- [0x21] = BDL + HU + HR + LD,
- [0x22] = BDL + HD + HR + LU,
- [0x23] = BDL + HV + HR,
- [0x25] = BDL + HL + LV,
- [0x26] = BDL + HU + LD + LL,
- [0x27] = BDL + HD + LU + LL,
- [0x28] = BDL + HV + LL,
- [0x29] = BDL + HU + HL + LD,
- [0x2a] = BDL + HD + HL + LU,
- [0x2b] = BDL + HV + HL,
- [0x2d] = BDL + HL + LD + LR,
- [0x2e] = BDL + HR + LL + LD,
- [0x2f] = BDL + HH + LD,
- [0x30] = BDL + HD + LH,
- [0x31] = BDL + HD + HL + LR,
- [0x32] = BDL + HR + HD + LL,
- [0x33] = BDL + HH + HD,
- [0x35] = BDL + HL + LU + LR,
- [0x36] = BDL + HR + LU + LL,
- [0x37] = BDL + HH + LU,
- [0x38] = BDL + HU + LH,
- [0x39] = BDL + HU + HL + LR,
- [0x3a] = BDL + HU + HR + LL,
- [0x3b] = BDL + HH + HU,
- [0x3d] = BDL + HL + LV + LR,
- [0x3e] = BDL + HR + LV + LL,
- [0x3f] = BDL + HH + LV,
- [0x40] = BDL + HU + LH + LD,
- [0x41] = BDL + HD + LH + LU,
- [0x42] = BDL + HV + LH,
- [0x43] = BDL + HU + HL + LD + LR,
- [0x44] = BDL + HU + HR + LD + LL,
- [0x45] = BDL + HD + HL + LU + LR,
- [0x46] = BDL + HD + HR + LU + LL,
- [0x47] = BDL + HH + HU + LD,
- [0x48] = BDL + HH + HD + LU,
- [0x49] = BDL + HV + HL + LR,
- [0x4a] = BDL + HV + HR + LL,
- [0x4b] = BDL + HV + HH,
- [0x78] = BDL + HL,
- [0x79] = BDL + HU,
- [0x7a] = BDL + HR,
- [0x7b] = BDL + HD,
- [0x7c] = BDL + HR + LL,
- [0x7d] = BDL + HD + LU,
- [0x7e] = BDL + HL + LR,
- [0x7f] = BDL + HU + LD,
-
- /* double [+light] lines */
- [0x50] = BDL + DH,
- [0x51] = BDL + DV,
- [0x52] = BDL + DR + LD,
- [0x53] = BDL + DD + LR,
- [0x54] = BDL + DR + DD,
- [0x55] = BDL + DL + LD,
- [0x56] = BDL + DD + LL,
- [0x57] = BDL + DL + DD,
- [0x58] = BDL + DR + LU,
- [0x59] = BDL + DU + LR,
- [0x5a] = BDL + DU + DR,
- [0x5b] = BDL + DL + LU,
- [0x5c] = BDL + DU + LL,
- [0x5d] = BDL + DL + DU,
- [0x5e] = BDL + DR + LV,
- [0x5f] = BDL + DV + LR,
- [0x60] = BDL + DV + DR,
- [0x61] = BDL + DL + LV,
- [0x62] = BDL + DV + LL,
- [0x63] = BDL + DV + DL,
- [0x64] = BDL + DH + LD,
- [0x65] = BDL + DD + LH,
- [0x66] = BDL + DD + DH,
- [0x67] = BDL + DH + LU,
- [0x68] = BDL + DU + LH,
- [0x69] = BDL + DH + DU,
- [0x6a] = BDL + DH + LV,
- [0x6b] = BDL + DV + LH,
- [0x6c] = BDL + DH + DV,
-
- /* (light) arcs */
- [0x6d] = BDA + LD + LR,
- [0x6e] = BDA + LD + LL,
- [0x6f] = BDA + LU + LL,
- [0x70] = BDA + LU + LR,
-
- /* Lower (Down) X/8 block (data is 8 - X) */
- [0x81] = BBD + 7, [0x82] = BBD + 6, [0x83] = BBD + 5, [0x84] = BBD + 4,
- [0x85] = BBD + 3, [0x86] = BBD + 2, [0x87] = BBD + 1, [0x88] = BBD + 0,
-
- /* Left X/8 block (data is X) */
- [0x89] = BBL + 7, [0x8a] = BBL + 6, [0x8b] = BBL + 5, [0x8c] = BBL + 4,
- [0x8d] = BBL + 3, [0x8e] = BBL + 2, [0x8f] = BBL + 1,
-
- /* upper 1/2 (4/8), 1/8 block (X), right 1/2, 1/8 block (8-X) */
- [0x80] = BBU + 4, [0x94] = BBU + 1,
- [0x90] = BBR + 4, [0x95] = BBR + 7,
-
- /* Quadrants */
- [0x96] = BBQ + BL,
- [0x97] = BBQ + BR,
- [0x98] = BBQ + TL,
- [0x99] = BBQ + TL + BL + BR,
- [0x9a] = BBQ + TL + BR,
- [0x9b] = BBQ + TL + TR + BL,
- [0x9c] = BBQ + TL + TR + BR,
- [0x9d] = BBQ + TR,
- [0x9e] = BBQ + BL + TR,
- [0x9f] = BBQ + BL + TR + BR,
-
- /* Shades, data is an alpha value in 25% units (1/4, 1/2, 3/4) */
- [0x91] = BBS + 1, [0x92] = BBS + 2, [0x93] = BBS + 3,
-
- /* U+2504 - U+250B, U+254C - U+254F: unsupported (dashes) */
- /* U+2571 - U+2573: unsupported (diagonals) */
-};
diff --git a/st/hb.c b/st/hb.c
deleted file mode 100644
index 467bcac..0000000
--- a/st/hb.c
+++ /dev/null
@@ -1,140 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-#include <X11/Xft/Xft.h>
-#include <hb.h>
-#include <hb-ft.h>
-
-#include "st.h"
-
-void hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoints, int start, int length);
-hb_font_t *hbfindfont(XftFont *match);
-
-typedef struct {
- XftFont *match;
- hb_font_t *font;
-} HbFontMatch;
-
-static int hbfontslen = 0;
-static HbFontMatch *hbfontcache = NULL;
-
-void
-hbunloadfonts()
-{
- for (int i = 0; i < hbfontslen; i++) {
- hb_font_destroy(hbfontcache[i].font);
- XftUnlockFace(hbfontcache[i].match);
- }
-
- if (hbfontcache != NULL) {
- free(hbfontcache);
- hbfontcache = NULL;
- }
- hbfontslen = 0;
-}
-
-hb_font_t *
-hbfindfont(XftFont *match)
-{
- for (int i = 0; i < hbfontslen; i++) {
- if (hbfontcache[i].match == match)
- return hbfontcache[i].font;
- }
-
- /* Font not found in cache, caching it now. */
- hbfontcache = realloc(hbfontcache, sizeof(HbFontMatch) * (hbfontslen + 1));
- FT_Face face = XftLockFace(match);
- hb_font_t *font = hb_ft_font_create(face, NULL);
- if (font == NULL)
- die("Failed to load Harfbuzz font.");
-
- hbfontcache[hbfontslen].match = match;
- hbfontcache[hbfontslen].font = font;
- hbfontslen += 1;
-
- return font;
-}
-
-void
-hbtransform(XftGlyphFontSpec *specs, const Glyph *glyphs, size_t len, int x, int y)
-{
- int start = 0, length = 1, gstart = 0;
- hb_codepoint_t *codepoints = calloc(len, sizeof(hb_codepoint_t));
-
- for (int idx = 1, specidx = 1; idx < len; idx++) {
- if (glyphs[idx].mode & ATTR_WDUMMY) {
- length += 1;
- continue;
- }
-
- if (specs[specidx].font != specs[start].font || ATTRCMP(glyphs[gstart], glyphs[idx]) || selected(x + idx, y) != selected(x + gstart, y)) {
- hbtransformsegment(specs[start].font, glyphs, codepoints, gstart, length);
-
- /* Reset the sequence. */
- length = 1;
- start = specidx;
- gstart = idx;
- } else {
- length += 1;
- }
-
- specidx++;
- }
-
- /* EOL. */
- hbtransformsegment(specs[start].font, glyphs, codepoints, gstart, length);
-
- /* Apply the transformation to glyph specs. */
- for (int i = 0, specidx = 0; i < len; i++) {
- if (glyphs[i].mode & ATTR_WDUMMY)
- continue;
- if (glyphs[i].mode & ATTR_BOXDRAW) {
- specidx++;
- continue;
- }
-
- if (codepoints[i] != specs[specidx].glyph)
- ((Glyph *)glyphs)[i].mode |= ATTR_LIGA;
-
- specs[specidx++].glyph = codepoints[i];
- }
-
- free(codepoints);
-}
-
-void
-hbtransformsegment(XftFont *xfont, const Glyph *string, hb_codepoint_t *codepoints, int start, int length)
-{
- hb_font_t *font = hbfindfont(xfont);
- if (font == NULL)
- return;
-
- Rune rune;
- ushort mode = USHRT_MAX;
- hb_buffer_t *buffer = hb_buffer_create();
- hb_buffer_set_direction(buffer, HB_DIRECTION_LTR);
-
- /* Fill buffer with codepoints. */
- for (int i = start; i < (start+length); i++) {
- rune = string[i].u;
- mode = string[i].mode;
- if (mode & ATTR_WDUMMY)
- rune = 0x0020;
- hb_buffer_add_codepoints(buffer, &rune, 1, 0, 1);
- }
-
- /* Shape the segment. */
- hb_shape(font, buffer, NULL, 0);
-
- /* Get new glyph info. */
- hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, NULL);
-
- /* Write new codepoints. */
- for (int i = 0; i < length; i++) {
- hb_codepoint_t gid = info[i].codepoint;
- codepoints[start+i] = gid;
- }
-
- /* Cleanup. */
- hb_buffer_destroy(buffer);
-}
diff --git a/st/hb.h b/st/hb.h
deleted file mode 100644
index b3e02d0..0000000
--- a/st/hb.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <X11/Xft/Xft.h>
-#include <hb.h>
-#include <hb-ft.h>
-
-void hbunloadfonts();
-void hbtransform(XftGlyphFontSpec *, const Glyph *, size_t, int, int);
-
diff --git a/st/st-copyout b/st/st-copyout
deleted file mode 100755
index 0d19e5a..0000000
--- a/st/st-copyout
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-# Using external pipe with st, give a dmenu prompt of recent commands,
-# allowing the user to copy the output of one.
-# xclip required for this script.
-# By Jaywalker and Luke
-tmpfile=$(mktemp /tmp/st-cmd-output.XXXXXX)
-trap 'rm "$tmpfile"' 0 1 15
-sed -n "w $tmpfile"
-sed -i 's/\x0//g' "$tmpfile"
-ps1="$(grep "\S" "$tmpfile" | tail -n 1 | sed 's/^\s*//' | cut -d' ' -f1)"
-chosen="$(grep -F "$ps1" "$tmpfile" | sed '$ d' | tac | dmenu -p "Copy which command's output?" -i -l 10 | sed 's/[^^]/[&]/g; s/\^/\\^/g')"
-eps1="$(echo "$ps1" | sed 's/[^^]/[&]/g; s/\^/\\^/g')"
-awk "/^$chosen$/{p=1;print;next} p&&/$eps1/{p=0};p" "$tmpfile" | xclip -selection clipboard
diff --git a/st/st-urlhandler b/st/st-urlhandler
deleted file mode 100755
index e2a62f4..0000000
--- a/st/st-urlhandler
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/bin/sh
-
-urlregex="(((http|https|gopher|gemini|ftp|ftps|git)://|www\\.)[a-zA-Z0-9.]*[:]?[a-zA-Z0-9./@$&%?$\#=_~-]*)|((magnet:\\?xt=urn:btih:)[a-zA-Z0-9]*)"
-
-urls="$(sed 's/.*│//g' | tr -d '\n' | # First remove linebreaks and mutt sidebars:
- grep -aEo "$urlregex" | # grep only urls as defined above.
- uniq | # Ignore neighboring duplicates.
- sed "s/\(\.\|,\|;\|\!\\|\?\)$//;
- s/^www./http:\/\/www\./")" # xdg-open will not detect url without http
-
-[ -z "$urls" ] && exit 1
-
-while getopts "hoc" o; do case "${o}" in
- h) printf "Optional arguments for custom use:\\n -c: copy\\n -o: xdg-open\\n -h: Show this message\\n" && exit 1 ;;
- o) chosen="$(echo "$urls" | dmenu -i -p 'Follow which url?' -l 10)"
- setsid xdg-open "$chosen" >/dev/null 2>&1 & ;;
- c) echo "$urls" | dmenu -i -p 'Copy which url?' -l 10 | tr -d '\n' | xclip -selection clipboard ;;
- *) printf "Invalid option: -%s\\n" "$OPTARG" && exit 1 ;;
-esac done
diff --git a/themes/default b/themes/default
index b81f7bd..c7f07c9 100644
--- a/themes/default
+++ b/themes/default
@@ -6,14 +6,14 @@
/* primary color */
-static const char col_cyan[] = "#0a0063";
+static const char col_cyan[] = "#005577"; */
-/* secondary colors */
+/* Secondary color */
static const char col_gray1[] = "#222222";
static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb";
-static const char col_gray4[] = "#005577";
+static const char col_gray4[] = "#eeeeee";
/* st config */
diff --git a/themes/liquid_blue b/themes/liquid_blue
new file mode 100644
index 0000000..f4f6e47
--- /dev/null
+++ b/themes/liquid_blue
@@ -0,0 +1,44 @@
+/* Terminal colors (16 first used in escape sequence) */
+
+static const char col_cyan[] = "#015188";
+
+static const char col_gray1[] = "#080e0d";
+static const char col_gray2[] = "#444444";
+static const char col_gray3[] = "#bbbbbb";
+static const char col_gray4[] = "#eeeeee";
+/* st config */
+
+float alpha = 0.6;
+
+
+static const char *colorname[] = {
+
+ /* 8 normal colors */
+ "#050704", /* black */
+ "#d80e0e", /* red */
+ "#06f115", /* green */
+ "#d8ff00", /* yellow */
+ "#0050d2", /* blue */
+ "#802bee", /* magenta */
+ "#23f0f2", /* cyan */
+ "#cfcfcf", /* white */
+
+ /* 8 bright colors */
+ "#cfcfcf", /* black */
+ "#ff2857", /* red */
+ "#79fc6a", /* green */
+ "#d7ff62", /* yellow */
+ "#698eff", /* blue */
+ "#a461fb", /* magenta */
+ "#91fff5", /* cyan */
+ "#ffffff", /* white */
+
+ [255] = 0,
+
+ /* special colors */
+ "#cccccc",
+ "#555555",
+ "#000000", /* background */
+ "#cfcfcf", /* foreground */
+};
+
diff --git a/themes/nord b/themes/nord
index 2bf7407..92c2f16 100644
--- a/themes/nord
+++ b/themes/nord
@@ -17,7 +17,7 @@ static const char col_gray4[] = "#eeeeee";
/* st config */
-float alpha = 1;
+float alpha = 4;
static const char *colorname[] = {
diff --git a/tools/sarc- b/tools/sarc-
new file mode 100644
index 0000000..77bc3f2
--- /dev/null
+++ b/tools/sarc-
Binary files differ
diff --git a/tools/sarc-1.0.0.tar.xz b/tools/sarc-1.0.0.tar.xz
new file mode 100644
index 0000000..f58f7b6
--- /dev/null
+++ b/tools/sarc-1.0.0.tar.xz
Binary files differ