From 7cd27a535d0394585337aa5bf95c59900cb6fbfd Mon Sep 17 00:00:00 2001 From: coast Date: Sun, 15 Jun 2025 12:43:08 +0330 Subject: [PATCH] new dwm build stuff 2 --- .suckless/st/boxdraw.o | Bin 7600 -> 0 bytes .suckless/st/config.h | 517 ---------- .suckless/st/graphics.o | Bin 82328 -> 0 bytes .suckless/st/rowcolumn_diacritics_helpers.o | Bin 16264 -> 0 bytes .suckless/st/st | Bin 176672 -> 0 bytes .suckless/st/st.h | 220 ----- .suckless/st/st.o | Bin 89504 -> 0 bytes .suckless/st/x.o | Bin 87680 -> 0 bytes {.config => config}/dunst/dunst/dunstrc | 0 {.config => config}/dunst/dunstrc | 0 {.config => config}/fastfetch/ascii.txt | 0 {.config => config}/fastfetch/ascii.txt~ | 0 {.config => config}/fastfetch/config.jsonc | 0 {.config => config}/fastfetch/config.jsonc~ | 0 .../fastfetch/fastfetch/ascii.txt | 0 .../fastfetch/fastfetch/ascii.txt~ | 0 .../fastfetch/fastfetch/config.jsonc | 0 .../fastfetch/fastfetch/config.jsonc~ | 0 {.config => config}/home-manager/README.md | 0 {.config => config}/home-manager/flake.lock | 0 {.config => config}/home-manager/flake.nix | 0 {.config => config}/home-manager/home.nix | 0 {.config => config}/nvim/Makefile | 0 {.config => config}/nvim/fnl/config.fnl | 0 {.config => config}/nvim/init.lua | 0 .../nvim/lua/project_nvim/project.lua | 0 {.config => config}/picom/picom.conf | 0 {.config => config}/picom/picom.conf~ | 0 {.config => config}/picom/picom/picom.conf | 0 {.config => config}/picom/picom/picom.conf~ | 0 {.config => config}/plugin/config.vim | 0 {.config => config}/shell/aliases | 0 {.config => config}/shell/exports | 0 {.config => config}/shell/shell/aliases | 0 .../shell/shell/aliases.backup | 0 {.config => config}/shell/shell/exports | 0 .../shell/shell/exports.backup | 0 {.config => config}/systemd/emacsd.service | 0 {.config => config}/user-dirs.dirs | 0 {.suckless => suckless}/dmenu/LICENSE | 0 {.suckless => suckless}/dmenu/Makefile | 0 {.suckless => suckless}/dmenu/README | 0 {.suckless => suckless}/dmenu/arg.h | 0 {.suckless => suckless}/dmenu/config.def.h | 0 {.suckless => suckless}/dmenu/config.h | 2 +- {.suckless => suckless}/dmenu/config.mk | 0 {.suckless => suckless}/dmenu/dmenu | Bin 42928 -> 42928 bytes {.suckless => suckless}/dmenu/dmenu.1 | 0 {.suckless => suckless}/dmenu/dmenu.c | 0 {.suckless => suckless}/dmenu/dmenu.o | Bin 31968 -> 31968 bytes {.suckless => suckless}/dmenu/dmenu_path | 0 {.suckless => suckless}/dmenu/dmenu_run | 0 {.suckless => suckless}/dmenu/drw.c | 0 {.suckless => suckless}/dmenu/drw.h | 0 {.suckless => suckless}/dmenu/drw.o | Bin {.suckless => suckless}/dmenu/stest | Bin {.suckless => suckless}/dmenu/stest.1 | 0 {.suckless => suckless}/dmenu/stest.c | 0 {.suckless => suckless}/dmenu/stest.o | Bin {.suckless => suckless}/dmenu/util.c | 0 {.suckless => suckless}/dmenu/util.h | 0 {.suckless => suckless}/dmenu/util.o | Bin {.suckless => suckless}/dwm/#dwm.c# | 0 {.suckless => suckless}/dwm/LICENSE | 0 {.suckless => suckless}/dwm/Makefile | 0 {.suckless => suckless}/dwm/README | 0 {.suckless => suckless}/dwm/README.md | 0 {.suckless => suckless}/dwm/attachaside.diff | 0 {.suckless => suckless}/dwm/config.def.h | 0 {.suckless => suckless}/dwm/config.h | 2 +- {.suckless => suckless}/dwm/config.h~ | 0 {.suckless => suckless}/dwm/config.mk | 0 {.suckless => suckless}/dwm/configure | 0 {.suckless => suckless}/dwm/drw.c | 0 {.suckless => suckless}/dwm/drw.h | 0 {.suckless => suckless}/dwm/drw.o | Bin {.suckless => suckless}/dwm/dwm | Bin 74928 -> 74928 bytes {.suckless => suckless}/dwm/dwm.1 | 0 {.suckless => suckless}/dwm/dwm.c | 0 {.suckless => suckless}/dwm/dwm.c.orig | 0 {.suckless => suckless}/dwm/dwm.c.rej | 0 {.suckless => suckless}/dwm/dwm.o | Bin 62952 -> 62944 bytes {.suckless => suckless}/dwm/dwm.png | Bin .../dwm/mkconfig/config.mk.freebsd | 0 .../dwm/mkconfig/config.mk.linux | 0 .../dwm/mkconfig/config.mk.openbsd | 0 .../dwm/mkconfig/config.mk.solaris | 0 {.suckless => suckless}/dwm/movestack.c | 0 {.suckless => suckless}/dwm/patch/attachx.c | 0 {.suckless => suckless}/dwm/patch/attachx.h | 0 {.suckless => suckless}/dwm/patch/bar.c | 0 {.suckless => suckless}/dwm/patch/bar.h | 0 {.suckless => suckless}/dwm/patch/bar_alpha.c | 0 {.suckless => suckless}/dwm/patch/bar_alpha.h | 0 .../dwm/patch/bar_indicators.c | 0 .../dwm/patch/bar_indicators.h | 0 .../dwm/patch/bar_ltsymbol.c | 0 .../dwm/patch/bar_ltsymbol.h | 0 .../dwm/patch/bar_status.c | 0 .../dwm/patch/bar_status.h | 0 .../dwm/patch/bar_tagicons.c | 0 .../dwm/patch/bar_tagicons.h | 0 {.suckless => suckless}/dwm/patch/bar_tags.c | 0 {.suckless => suckless}/dwm/patch/bar_tags.h | 0 .../dwm/patch/bar_wintitle.c | 0 .../dwm/patch/bar_wintitle.h | 0 .../dwm/patch/cool_autostart.c | 0 .../dwm/patch/cool_autostart.h | 0 .../dwm/patch/dwm-alpha-20230401-348f655.diff | Bin {.suckless => suckless}/dwm/patch/dwmc | 0 {.suckless => suckless}/dwm/patch/dwmc.c | 0 {.suckless => suckless}/dwm/patch/dwmc.h | 0 .../dwm/patch/fullscreen.c | 0 .../dwm/patch/fullscreen.h | 0 .../dwm/patch/hidevacanttags.diff | 0 .../dwm/patch/hidevacanttags.diff.orig | 0 .../dwm/patch/hidevacanttags.diff.rej | 0 {.suckless => suckless}/dwm/patch/include.c | 0 {.suckless => suckless}/dwm/patch/include.h | 0 .../dwm/patch/ipc/IPCClient.h | 0 .../dwm/patch/ipc/dwm-msg.c | 0 .../dwm/patch/ipc/yajl_dumps.h | 0 .../dwm/patch/layout_facts.c | 0 .../dwm/patch/layout_tile.c | 0 .../dwm/patch/layout_tile.h | 0 .../dwm/patch/moveresize.c | 0 .../dwm/patch/moveresize.h | 0 {.suckless => suckless}/dwm/patch/movestack.c | 0 {.suckless => suckless}/dwm/patch/movestack.h | 0 .../dwm/patch/scratchpad.c | 0 .../dwm/patch/scratchpad.h | 0 {.suckless => suckless}/dwm/patch/swallow.c | 0 {.suckless => suckless}/dwm/patch/swallow.h | 0 .../dwm/patch/togglefullscreen.c | 0 .../dwm/patch/togglefullscreen.h | 0 .../dwm/patch/vanitygaps.c | 0 .../dwm/patch/vanitygaps.h | 0 {.suckless => suckless}/dwm/patch/xrdb.c | 0 {.suckless => suckless}/dwm/patch/xrdb.h | 0 .../dwm-attachaside-20160718-56a31dc.diff | 0 .../patches/dwm-bar-height-spacing-6.3.diff | 0 .../dwm-barpadding-20211020-a786211.diff | 0 .../dwm/patches/dwm-fullgaps-6.4.diff | 0 .../patches/dwm-notitle-20210715-138b405.diff | 0 .../patches/dwm-restartsig-20180523-6.2.diff | 0 .../dwm/patches/dwm-statusallmons-6.2.diff | 0 .../dwm/patches/dwm-warp-6.4.diff | 0 .../dwm/patches/dwm-xrdb-6.4.diff | 0 .../dwm/patches/hidevacanttags.diff | 0 {.suckless => suckless}/dwm/readme.dwm.txt | 0 {.suckless => suckless}/dwm/transient.c | 0 {.suckless => suckless}/dwm/util.c | 0 {.suckless => suckless}/dwm/util.h | 0 {.suckless => suckless}/dwm/util.o | Bin {.suckless => suckless}/dwmblocks | 0 {.suckless => suckless}/slstatus/LICENSE | 0 {.suckless => suckless}/slstatus/Makefile | 0 {.suckless => suckless}/slstatus/arg.h | 0 .../slstatus/components/battery.c | 0 .../slstatus/components/battery.o | Bin .../slstatus/components/cat.c | 0 .../slstatus/components/cat.o | Bin .../slstatus/components/cpu.c | 0 .../slstatus/components/cpu.o | Bin .../slstatus/components/datetime.c | 0 .../slstatus/components/datetime.o | Bin .../slstatus/components/disk.c | 0 .../slstatus/components/disk.o | Bin .../slstatus/components/entropy.c | 0 .../slstatus/components/entropy.o | Bin .../slstatus/components/hostname.c | 0 .../slstatus/components/hostname.o | Bin .../slstatus/components/ip.c | 0 .../slstatus/components/ip.o | Bin .../slstatus/components/kernel_release.c | 0 .../slstatus/components/kernel_release.o | Bin .../slstatus/components/keyboard_indicators.c | 0 .../slstatus/components/keyboard_indicators.o | Bin .../slstatus/components/keymap.c | 0 .../slstatus/components/keymap.o | Bin .../slstatus/components/load_avg.c | 0 .../slstatus/components/load_avg.o | Bin .../slstatus/components/netspeeds.c | 0 .../slstatus/components/netspeeds.o | Bin .../slstatus/components/num_files.c | 0 .../slstatus/components/num_files.o | Bin .../slstatus/components/pixVol.sh | 0 .../slstatus/components/ram.c | 0 .../slstatus/components/ram.o | Bin .../slstatus/components/run_command.c | 0 .../slstatus/components/run_command.o | Bin .../slstatus/components/swap.c | 0 .../slstatus/components/swap.o | Bin .../slstatus/components/temperature.c | 0 .../slstatus/components/temperature.o | Bin .../slstatus/components/uptime.c | 0 .../slstatus/components/uptime.o | Bin .../slstatus/components/user.c | 0 .../slstatus/components/user.o | Bin .../slstatus/components/volume.c | 0 .../slstatus/components/volume.o | Bin .../slstatus/components/wifi.c | 0 .../slstatus/components/wifi.o | Bin {.suckless => suckless}/slstatus/config.def.h | 0 {.suckless => suckless}/slstatus/config.h | 0 {.suckless => suckless}/slstatus/config.h~ | 0 {.suckless => suckless}/slstatus/config.mk | 0 {.suckless => suckless}/slstatus/slstatus | Bin {.suckless => suckless}/slstatus/slstatus.1 | 0 {.suckless => suckless}/slstatus/slstatus.c | 0 {.suckless => suckless}/slstatus/slstatus.h | 0 {.suckless => suckless}/slstatus/slstatus.o | Bin {.suckless => suckless}/slstatus/util.c | 0 {.suckless => suckless}/slstatus/util.h | 0 {.suckless => suckless}/slstatus/util.o | Bin {.suckless => suckless}/st/LEGACY | 0 {.suckless => suckless}/st/LICENSE | 0 {.suckless => suckless}/st/Makefile | 6 +- {.suckless => suckless}/st/README | 0 {.suckless => suckless}/st/TODO | 0 {.suckless => suckless}/st/arg.h | 0 {.suckless => suckless}/st/boxdraw.c | 0 {.suckless => suckless}/st/boxdraw_data.h | 0 {.suckless => suckless}/st/config.def.h | 0 suckless/st/config.h | 479 ++++++++++ suckless/st/config.h.save | 486 ++++++++++ suckless/st/config.h.save.1 | 486 ++++++++++ suckless/st/config.h.save.2 | 486 ++++++++++ suckless/st/config.h.save.3 | 486 ++++++++++ {.suckless => suckless}/st/config.mk | 9 +- {.suckless => suckless}/st/graphics.c | 0 {.suckless => suckless}/st/graphics.h | 0 suckless/st/hb.c | 125 +++ suckless/st/hb.h | 14 + suckless/st/hb.o | Bin 0 -> 4240 bytes {.suckless => suckless}/st/icat-mini.sh | 0 {.suckless => suckless}/st/khash.h | 0 {.suckless => suckless}/st/kvec.h | 0 .../st/rowcolumn_diacritics_helpers.c | 0 suckless/st/st | Bin 0 -> 113680 bytes ...st-alpha-changealpha-20230519-b44f2ad.diff | 194 ++++ {.suckless => suckless}/st/st.1 | 2 +- {.suckless => suckless}/st/st.c | 687 +++++--------- suckless/st/st.h | 130 +++ {.suckless => suckless}/st/st.info | 6 - suckless/st/st.o | Bin 0 -> 82592 bytes {.suckless => suckless}/st/win.h | 5 +- {.suckless => suckless}/st/x.c | 883 ++++++++---------- suckless/st/x.o | Bin 0 -> 86680 bytes 249 files changed, 3501 insertions(+), 1724 deletions(-) delete mode 100644 .suckless/st/boxdraw.o delete mode 100644 .suckless/st/config.h delete mode 100644 .suckless/st/graphics.o delete mode 100644 .suckless/st/rowcolumn_diacritics_helpers.o delete mode 100755 .suckless/st/st delete mode 100644 .suckless/st/st.h delete mode 100644 .suckless/st/st.o delete mode 100644 .suckless/st/x.o rename {.config => config}/dunst/dunst/dunstrc (100%) rename {.config => config}/dunst/dunstrc (100%) rename {.config => config}/fastfetch/ascii.txt (100%) rename {.config => config}/fastfetch/ascii.txt~ (100%) rename {.config => config}/fastfetch/config.jsonc (100%) rename {.config => config}/fastfetch/config.jsonc~ (100%) rename {.config => config}/fastfetch/fastfetch/ascii.txt (100%) rename {.config => config}/fastfetch/fastfetch/ascii.txt~ (100%) rename {.config => config}/fastfetch/fastfetch/config.jsonc (100%) rename {.config => config}/fastfetch/fastfetch/config.jsonc~ (100%) rename {.config => config}/home-manager/README.md (100%) rename {.config => config}/home-manager/flake.lock (100%) rename {.config => config}/home-manager/flake.nix (100%) rename {.config => config}/home-manager/home.nix (100%) rename {.config => config}/nvim/Makefile (100%) rename {.config => config}/nvim/fnl/config.fnl (100%) rename {.config => config}/nvim/init.lua (100%) rename {.config => config}/nvim/lua/project_nvim/project.lua (100%) rename {.config => config}/picom/picom.conf (100%) rename {.config => config}/picom/picom.conf~ (100%) rename {.config => config}/picom/picom/picom.conf (100%) rename {.config => config}/picom/picom/picom.conf~ (100%) rename {.config => config}/plugin/config.vim (100%) rename {.config => config}/shell/aliases (100%) rename {.config => config}/shell/exports (100%) rename {.config => config}/shell/shell/aliases (100%) rename {.config => config}/shell/shell/aliases.backup (100%) rename {.config => config}/shell/shell/exports (100%) rename {.config => config}/shell/shell/exports.backup (100%) rename {.config => config}/systemd/emacsd.service (100%) rename {.config => config}/user-dirs.dirs (100%) rename {.suckless => suckless}/dmenu/LICENSE (100%) rename {.suckless => suckless}/dmenu/Makefile (100%) rename {.suckless => suckless}/dmenu/README (100%) rename {.suckless => suckless}/dmenu/arg.h (100%) rename {.suckless => suckless}/dmenu/config.def.h (100%) rename {.suckless => suckless}/dmenu/config.h (92%) rename {.suckless => suckless}/dmenu/config.mk (100%) rename {.suckless => suckless}/dmenu/dmenu (98%) rename {.suckless => suckless}/dmenu/dmenu.1 (100%) rename {.suckless => suckless}/dmenu/dmenu.c (100%) rename {.suckless => suckless}/dmenu/dmenu.o (97%) rename {.suckless => suckless}/dmenu/dmenu_path (100%) rename {.suckless => suckless}/dmenu/dmenu_run (100%) rename {.suckless => suckless}/dmenu/drw.c (100%) rename {.suckless => suckless}/dmenu/drw.h (100%) rename {.suckless => suckless}/dmenu/drw.o (100%) rename {.suckless => suckless}/dmenu/stest (100%) rename {.suckless => suckless}/dmenu/stest.1 (100%) rename {.suckless => suckless}/dmenu/stest.c (100%) rename {.suckless => suckless}/dmenu/stest.o (100%) rename {.suckless => suckless}/dmenu/util.c (100%) rename {.suckless => suckless}/dmenu/util.h (100%) rename {.suckless => suckless}/dmenu/util.o (100%) rename {.suckless => suckless}/dwm/#dwm.c# (100%) rename {.suckless => suckless}/dwm/LICENSE (100%) rename {.suckless => suckless}/dwm/Makefile (100%) rename {.suckless => suckless}/dwm/README (100%) rename {.suckless => suckless}/dwm/README.md (100%) rename {.suckless => suckless}/dwm/attachaside.diff (100%) rename {.suckless => suckless}/dwm/config.def.h (100%) rename {.suckless => suckless}/dwm/config.h (99%) rename {.suckless => suckless}/dwm/config.h~ (100%) rename {.suckless => suckless}/dwm/config.mk (100%) rename {.suckless => suckless}/dwm/configure (100%) rename {.suckless => suckless}/dwm/drw.c (100%) rename {.suckless => suckless}/dwm/drw.h (100%) rename {.suckless => suckless}/dwm/drw.o (100%) rename {.suckless => suckless}/dwm/dwm (96%) rename {.suckless => suckless}/dwm/dwm.1 (100%) rename {.suckless => suckless}/dwm/dwm.c (100%) rename {.suckless => suckless}/dwm/dwm.c.orig (100%) rename {.suckless => suckless}/dwm/dwm.c.rej (100%) rename {.suckless => suckless}/dwm/dwm.o (90%) rename {.suckless => suckless}/dwm/dwm.png (100%) rename {.suckless => suckless}/dwm/mkconfig/config.mk.freebsd (100%) rename {.suckless => suckless}/dwm/mkconfig/config.mk.linux (100%) rename {.suckless => suckless}/dwm/mkconfig/config.mk.openbsd (100%) rename {.suckless => suckless}/dwm/mkconfig/config.mk.solaris (100%) rename {.suckless => suckless}/dwm/movestack.c (100%) rename {.suckless => suckless}/dwm/patch/attachx.c (100%) rename {.suckless => suckless}/dwm/patch/attachx.h (100%) rename {.suckless => suckless}/dwm/patch/bar.c (100%) rename {.suckless => suckless}/dwm/patch/bar.h (100%) rename {.suckless => suckless}/dwm/patch/bar_alpha.c (100%) rename {.suckless => suckless}/dwm/patch/bar_alpha.h (100%) rename {.suckless => suckless}/dwm/patch/bar_indicators.c (100%) rename {.suckless => suckless}/dwm/patch/bar_indicators.h (100%) rename {.suckless => suckless}/dwm/patch/bar_ltsymbol.c (100%) rename {.suckless => suckless}/dwm/patch/bar_ltsymbol.h (100%) rename {.suckless => suckless}/dwm/patch/bar_status.c (100%) rename {.suckless => suckless}/dwm/patch/bar_status.h (100%) rename {.suckless => suckless}/dwm/patch/bar_tagicons.c (100%) rename {.suckless => suckless}/dwm/patch/bar_tagicons.h (100%) rename {.suckless => suckless}/dwm/patch/bar_tags.c (100%) rename {.suckless => suckless}/dwm/patch/bar_tags.h (100%) rename {.suckless => suckless}/dwm/patch/bar_wintitle.c (100%) rename {.suckless => suckless}/dwm/patch/bar_wintitle.h (100%) rename {.suckless => suckless}/dwm/patch/cool_autostart.c (100%) rename {.suckless => suckless}/dwm/patch/cool_autostart.h (100%) rename {.suckless => suckless}/dwm/patch/dwm-alpha-20230401-348f655.diff (100%) rename {.suckless => suckless}/dwm/patch/dwmc (100%) rename {.suckless => suckless}/dwm/patch/dwmc.c (100%) rename {.suckless => suckless}/dwm/patch/dwmc.h (100%) rename {.suckless => suckless}/dwm/patch/fullscreen.c (100%) rename {.suckless => suckless}/dwm/patch/fullscreen.h (100%) rename {.suckless => suckless}/dwm/patch/hidevacanttags.diff (100%) rename {.suckless => suckless}/dwm/patch/hidevacanttags.diff.orig (100%) rename {.suckless => suckless}/dwm/patch/hidevacanttags.diff.rej (100%) rename {.suckless => suckless}/dwm/patch/include.c (100%) rename {.suckless => suckless}/dwm/patch/include.h (100%) rename {.suckless => suckless}/dwm/patch/ipc/IPCClient.h (100%) rename {.suckless => suckless}/dwm/patch/ipc/dwm-msg.c (100%) rename {.suckless => suckless}/dwm/patch/ipc/yajl_dumps.h (100%) rename {.suckless => suckless}/dwm/patch/layout_facts.c (100%) rename {.suckless => suckless}/dwm/patch/layout_tile.c (100%) rename {.suckless => suckless}/dwm/patch/layout_tile.h (100%) rename {.suckless => suckless}/dwm/patch/moveresize.c (100%) rename {.suckless => suckless}/dwm/patch/moveresize.h (100%) rename {.suckless => suckless}/dwm/patch/movestack.c (100%) rename {.suckless => suckless}/dwm/patch/movestack.h (100%) rename {.suckless => suckless}/dwm/patch/scratchpad.c (100%) rename {.suckless => suckless}/dwm/patch/scratchpad.h (100%) rename {.suckless => suckless}/dwm/patch/swallow.c (100%) rename {.suckless => suckless}/dwm/patch/swallow.h (100%) rename {.suckless => suckless}/dwm/patch/togglefullscreen.c (100%) rename {.suckless => suckless}/dwm/patch/togglefullscreen.h (100%) rename {.suckless => suckless}/dwm/patch/vanitygaps.c (100%) rename {.suckless => suckless}/dwm/patch/vanitygaps.h (100%) rename {.suckless => suckless}/dwm/patch/xrdb.c (100%) rename {.suckless => suckless}/dwm/patch/xrdb.h (100%) rename {.suckless => suckless}/dwm/patches/dwm-attachaside-20160718-56a31dc.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-bar-height-spacing-6.3.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-barpadding-20211020-a786211.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-fullgaps-6.4.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-notitle-20210715-138b405.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-restartsig-20180523-6.2.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-statusallmons-6.2.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-warp-6.4.diff (100%) rename {.suckless => suckless}/dwm/patches/dwm-xrdb-6.4.diff (100%) rename {.suckless => suckless}/dwm/patches/hidevacanttags.diff (100%) rename {.suckless => suckless}/dwm/readme.dwm.txt (100%) rename {.suckless => suckless}/dwm/transient.c (100%) rename {.suckless => suckless}/dwm/util.c (100%) rename {.suckless => suckless}/dwm/util.h (100%) rename {.suckless => suckless}/dwm/util.o (100%) rename {.suckless => suckless}/dwmblocks (100%) rename {.suckless => suckless}/slstatus/LICENSE (100%) rename {.suckless => suckless}/slstatus/Makefile (100%) rename {.suckless => suckless}/slstatus/arg.h (100%) rename {.suckless => suckless}/slstatus/components/battery.c (100%) rename {.suckless => suckless}/slstatus/components/battery.o (100%) rename {.suckless => suckless}/slstatus/components/cat.c (100%) rename {.suckless => suckless}/slstatus/components/cat.o (100%) rename {.suckless => suckless}/slstatus/components/cpu.c (100%) rename {.suckless => suckless}/slstatus/components/cpu.o (100%) rename {.suckless => suckless}/slstatus/components/datetime.c (100%) rename {.suckless => suckless}/slstatus/components/datetime.o (100%) rename {.suckless => suckless}/slstatus/components/disk.c (100%) rename {.suckless => suckless}/slstatus/components/disk.o (100%) rename {.suckless => suckless}/slstatus/components/entropy.c (100%) rename {.suckless => suckless}/slstatus/components/entropy.o (100%) rename {.suckless => suckless}/slstatus/components/hostname.c (100%) rename {.suckless => suckless}/slstatus/components/hostname.o (100%) rename {.suckless => suckless}/slstatus/components/ip.c (100%) rename {.suckless => suckless}/slstatus/components/ip.o (100%) rename {.suckless => suckless}/slstatus/components/kernel_release.c (100%) rename {.suckless => suckless}/slstatus/components/kernel_release.o (100%) rename {.suckless => suckless}/slstatus/components/keyboard_indicators.c (100%) rename {.suckless => suckless}/slstatus/components/keyboard_indicators.o (100%) rename {.suckless => suckless}/slstatus/components/keymap.c (100%) rename {.suckless => suckless}/slstatus/components/keymap.o (100%) rename {.suckless => suckless}/slstatus/components/load_avg.c (100%) rename {.suckless => suckless}/slstatus/components/load_avg.o (100%) rename {.suckless => suckless}/slstatus/components/netspeeds.c (100%) rename {.suckless => suckless}/slstatus/components/netspeeds.o (100%) rename {.suckless => suckless}/slstatus/components/num_files.c (100%) rename {.suckless => suckless}/slstatus/components/num_files.o (100%) rename {.suckless => suckless}/slstatus/components/pixVol.sh (100%) rename {.suckless => suckless}/slstatus/components/ram.c (100%) rename {.suckless => suckless}/slstatus/components/ram.o (100%) rename {.suckless => suckless}/slstatus/components/run_command.c (100%) rename {.suckless => suckless}/slstatus/components/run_command.o (100%) rename {.suckless => suckless}/slstatus/components/swap.c (100%) rename {.suckless => suckless}/slstatus/components/swap.o (100%) rename {.suckless => suckless}/slstatus/components/temperature.c (100%) rename {.suckless => suckless}/slstatus/components/temperature.o (100%) rename {.suckless => suckless}/slstatus/components/uptime.c (100%) rename {.suckless => suckless}/slstatus/components/uptime.o (100%) rename {.suckless => suckless}/slstatus/components/user.c (100%) rename {.suckless => suckless}/slstatus/components/user.o (100%) rename {.suckless => suckless}/slstatus/components/volume.c (100%) rename {.suckless => suckless}/slstatus/components/volume.o (100%) rename {.suckless => suckless}/slstatus/components/wifi.c (100%) rename {.suckless => suckless}/slstatus/components/wifi.o (100%) rename {.suckless => suckless}/slstatus/config.def.h (100%) rename {.suckless => suckless}/slstatus/config.h (100%) rename {.suckless => suckless}/slstatus/config.h~ (100%) rename {.suckless => suckless}/slstatus/config.mk (100%) rename {.suckless => suckless}/slstatus/slstatus (100%) rename {.suckless => suckless}/slstatus/slstatus.1 (100%) rename {.suckless => suckless}/slstatus/slstatus.c (100%) rename {.suckless => suckless}/slstatus/slstatus.h (100%) rename {.suckless => suckless}/slstatus/slstatus.o (100%) rename {.suckless => suckless}/slstatus/util.c (100%) rename {.suckless => suckless}/slstatus/util.h (100%) rename {.suckless => suckless}/slstatus/util.o (100%) rename {.suckless => suckless}/st/LEGACY (100%) rename {.suckless => suckless}/st/LICENSE (100%) rename {.suckless => suckless}/st/Makefile (87%) rename {.suckless => suckless}/st/README (100%) rename {.suckless => suckless}/st/TODO (100%) rename {.suckless => suckless}/st/arg.h (100%) rename {.suckless => suckless}/st/boxdraw.c (100%) rename {.suckless => suckless}/st/boxdraw_data.h (100%) rename {.suckless => suckless}/st/config.def.h (100%) create mode 100644 suckless/st/config.h create mode 100644 suckless/st/config.h.save create mode 100644 suckless/st/config.h.save.1 create mode 100644 suckless/st/config.h.save.2 create mode 100644 suckless/st/config.h.save.3 rename {.suckless => suckless}/st/config.mk (80%) rename {.suckless => suckless}/st/graphics.c (100%) rename {.suckless => suckless}/st/graphics.h (100%) create mode 100644 suckless/st/hb.c create mode 100644 suckless/st/hb.h create mode 100644 suckless/st/hb.o rename {.suckless => suckless}/st/icat-mini.sh (100%) rename {.suckless => suckless}/st/khash.h (100%) rename {.suckless => suckless}/st/kvec.h (100%) rename {.suckless => suckless}/st/rowcolumn_diacritics_helpers.c (100%) create mode 100755 suckless/st/st create mode 100644 suckless/st/st-alpha-changealpha-20230519-b44f2ad.diff rename {.suckless => suckless}/st/st.1 (98%) rename {.suckless => suckless}/st/st.c (80%) create mode 100644 suckless/st/st.h rename {.suckless => suckless}/st/st.info (96%) create mode 100644 suckless/st/st.o rename {.suckless => suckless}/st/win.h (90%) rename {.suckless => suckless}/st/x.c (71%) create mode 100644 suckless/st/x.o diff --git a/.suckless/st/boxdraw.o b/.suckless/st/boxdraw.o deleted file mode 100644 index f5eb599827dcba235b2b39e2950b4cf6d14e4a1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7600 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 BaY_IH diff --git a/.suckless/st/config.h b/.suckless/st/config.h deleted file mode 100644 index c99cd99..0000000 --- a/.suckless/st/config.h +++ /dev/null @@ -1,517 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static const char *font = "CaskaydiaMonoNerdFontMono-Bold:size=14:style=Bold"; -/* Spare fonts */ - -static char *font2[] = { - "CaskaydiaMonoNerdFontMono-Bold:pixelsize=12:antialias=true:autohint=true"}; -static int borderpx = 6; - -/* How to align the content in the window when the size of the terminal - * doesn't perfectly match the size of the window. The values are percentages. - * 50 means center, 0 means flush left/top, 100 means flush right/bottom. - */ -static int anysize_halign = 50; -static int anysize_valign = 50; - -/* - * 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 = "/usr/bin/zsh"; -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 */ -/* By default, use the same one as kitty. */ - -char *vtiden = "\033[?62c"; -//char *vtiden = "\x1b[?62;4c"; - -/* Kerning / character bounding-box multipliers */ -static float cwscale = 1; -static float chscale = 1; - -/* - * 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 = 1; -static double maxlatency = 10; - -/* - * blinking timeout (set to 0 to disable blinking) for the terminal blinking - * attribute. - */ -static unsigned int blinktimeout = 100; - -/* - * thickness of underline and bar cursors - */ -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 = 1; - -/* 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 - */ -static int bellvolume = 0; - -/* default TERM value */ -char *termname = "st"; - -/* - * 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; - -/* 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", "gray90", /* default foreground colour */ - "black", /* default background colour */ -}; - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * 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; - -/* - * Graphics configuration - */ - -/// The template for the cache directory. -const char graphics_cache_dir_template[] = "/tmp/st-images-XXXXXX"; -/// The max size of a single image file, in bytes. -unsigned graphics_max_single_image_file_size = 20 * 1024 * 1024; -/// The max size of the cache, in bytes. -unsigned graphics_total_file_cache_size = 300 * 1024 * 1024; -/// The max ram size of an image or placement, in bytes. -unsigned graphics_max_single_image_ram_size = 100 * 1024 * 1024; -/// The max total size of all images loaded into RAM. -unsigned graphics_max_total_ram_size = 300 * 1024 * 1024; -/// The max total number of image placements and images. -unsigned graphics_max_total_placements = 4096; -/// The ratio by which limits can be exceeded. This is to reduce the frequency -/// of image removal. -double graphics_excess_tolerance_ratio = 0.05; -/// The minimum delay between redraws caused by animations, in milliseconds. -unsigned graphics_animation_min_delay = 20; - -/* - * 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 keyboard shortcuts. */ -#define MODKEY Mod1Mask -#define TERMMOD (ControlMask | ShiftMask) - -/* - * Internal mouse shortcuts. - * Beware that overloading Button1 will disable the selection. - */ -static MouseShortcut mshortcuts[] = { - /* mask button function argument release */ - {TERMMOD, Button3, previewimage, {.s = "feh"}}, - {TERMMOD, Button2, showimageinfo, {}, 1}, - {XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1}, - {ShiftMask, Button4, kscrollup, {.i = 1}}, - {ShiftMask, Button5, kscrolldown, {.i = 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. */ - -static Shortcut shortcuts[] = { - /* mask keysym function argument */ - {TERMMOD, XK_F1, togglegrdebug, {.i = 0}}, - {TERMMOD, XK_F6, dumpgrstate, {.i = 0}}, - {TERMMOD, XK_F7, unloadimages, {.i = 0}}, - {TERMMOD, XK_F8, toggleimages, {.i = 0}}, - {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_C, clipcopy, {.i = 0}}, - {TERMMOD, XK_V, clippaste, {.i = 0}}, - {TERMMOD, XK_Y, selpaste, {.i = 0}}, - {ShiftMask, XK_Page_Up, kscrollup, {.i = -1}}, - {ShiftMask, XK_Page_Down, kscrolldown, {.i = -1}}, - {ShiftMask, XK_Insert, selpaste, {.i = 0}}, - {TERMMOD, XK_Num_Lock, numlock, {.i = 0}}, - {TERMMOD, XK_plus, zoom, {.f = +1}}, - {TERMMOD, XK_underscore, zoom, {.f = -1}}, - {TERMMOD, XK_equal, zoomreset, {0}}, -}; - -/* - * 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/.suckless/st/graphics.o b/.suckless/st/graphics.o deleted file mode 100644 index 73551f99d237c95f40e06dc7a8f04b8dc01c0ae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82328 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%0D@@0&KR`i0`cv^$^RF2;i7Uq8I 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 Sv;48Q+VY=NLs`JN4E`6XY3!T; diff --git a/.suckless/st/st.h b/.suckless/st/st.h deleted file mode 100644 index 1e2ad89..0000000 --- a/.suckless/st/st.h +++ /dev/null @@ -1,220 +0,0 @@ -/* See LICENSE for license details. */ - -#include -#include - -/* macros */ -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) < (b) ? (b) : (a)) -#define LEN(a) (sizeof(a) / sizeof(a)[0]) -#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) -#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 != (b).mode || (a).fg != (b).fg || \ - (a).bg != (b).bg || (a).decor != (b).decor) -#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \ - (t1.tv_nsec-t2.tv_nsec)/1E6) -#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) - -#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) -#define IS_TRUECOL(x) (1 << 24 & (x)) - -// This decor color indicates that the fg color should be used. Note that it's -// not a 24-bit color because the 25-th bit is not set. -#define DECOR_DEFAULT_COLOR 0x0ffffff - -enum glyph_attribute { - ATTR_NULL = 0, - ATTR_BOLD = 1 << 0, - ATTR_FAINT = 1 << 1, - ATTR_ITALIC = 1 << 2, - ATTR_UNDERLINE = 1 << 3, - ATTR_BLINK = 1 << 4, - ATTR_REVERSE = 1 << 5, - ATTR_INVISIBLE = 1 << 6, - ATTR_STRUCK = 1 << 7, - ATTR_WRAP = 1 << 8, - ATTR_WIDE = 1 << 9, - ATTR_WDUMMY = 1 << 10, - ATTR_BOXDRAW = 1 << 11, - ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, - ATTR_IMAGE = 1 << 14, -}; - -enum selection_mode { - SEL_IDLE = 0, - SEL_EMPTY = 1, - SEL_READY = 2 -}; - -enum selection_type { - SEL_REGULAR = 1, - SEL_RECTANGULAR = 2 -}; - -enum selection_snap { - SNAP_WORD = 1, - SNAP_LINE = 2 -}; - -enum underline_style { - UNDERLINE_STRAIGHT = 1, - UNDERLINE_DOUBLE = 2, - UNDERLINE_CURLY = 3, - UNDERLINE_DOTTED = 4, - UNDERLINE_DASHED = 5, -}; - -typedef unsigned char uchar; -typedef unsigned int uint; -typedef unsigned long ulong; -typedef unsigned short ushort; - -typedef uint_least32_t Rune; - -#define Glyph Glyph_ -typedef struct { - Rune u; /* character code */ - ushort mode; /* attribute flags */ - uint32_t fg; /* foreground */ - uint32_t bg; /* background */ - uint32_t decor; /* decoration (like underline) */ -} Glyph; - -typedef Glyph *Line; - -typedef union { - int i; - uint ui; - float f; - const void *v; - const char *s; -} Arg; - -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 *); -void toggleprinter(const Arg *); - -int tattrset(int); -void tnew(int, int); -void tresize(int, int); -void tsetdirtattr(int); -void ttyhangup(void); -int ttynew(const char *, char *, const char *, char **); -size_t ttyread(void); -void ttyresize(int, int); -void ttywrite(const char *, size_t, int); - -void resettitle(void); - -void selclear(void); -void selinit(void); -void selstart(int, int, int); -void selextend(int, int, int, int); -int selected(int, int); -char *getsel(void); - -Glyph getglyphat(int, int); - -size_t utf8encode(Rune, char *); - -void *xmalloc(size_t); -void *xrealloc(void *, size_t); -char *xstrdup(const 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; -extern char *stty_args; -extern char *vtiden; -extern wchar_t *worddelimiters; -extern int allowaltscreen; -extern int allowwindowops; -extern char *termname; -extern unsigned int tabspaces; -extern unsigned int defaultfg; -extern unsigned int defaultbg; -extern unsigned int defaultcs; -extern const int boxdraw, boxdraw_bold, boxdraw_braille; - -// Accessors to decoration properties stored in `decor`. -// The 25-th bit is used to indicate if it's a 24-bit color. -static inline uint32_t tgetdecorcolor(Glyph *g) { return g->decor & 0x1ffffff; } -static inline uint32_t tgetdecorstyle(Glyph *g) { return (g->decor >> 25) & 0x7; } -static inline void tsetdecorcolor(Glyph *g, uint32_t color) { - g->decor = (g->decor & ~0x1ffffff) | (color & 0x1ffffff); -} -static inline void tsetdecorstyle(Glyph *g, uint32_t style) { - g->decor = (g->decor & ~(0x7 << 25)) | ((style & 0x7) << 25); -} - - -// Some accessors to image placeholder properties stored in `u`: -// - row (1-base) - 9 bits -// - column (1-base) - 9 bits -// - most significant byte of the image id plus 1 - 9 bits (0 means unspecified, -// don't forget to subtract 1). -// - the original number of diacritics (0, 1, 2, or 3) - 2 bits -// - whether this is a classic (1) or Unicode (0) placeholder - 1 bit -static inline uint32_t tgetimgrow(Glyph *g) { return g->u & 0x1ff; } -static inline uint32_t tgetimgcol(Glyph *g) { return (g->u >> 9) & 0x1ff; } -static inline uint32_t tgetimgid4thbyteplus1(Glyph *g) { return (g->u >> 18) & 0x1ff; } -static inline uint32_t tgetimgdiacriticcount(Glyph *g) { return (g->u >> 27) & 0x3; } -static inline uint32_t tgetisclassicplaceholder(Glyph *g) { return (g->u >> 29) & 0x1; } -static inline void tsetimgrow(Glyph *g, uint32_t row) { - g->u = (g->u & ~0x1ff) | (row & 0x1ff); -} -static inline void tsetimgcol(Glyph *g, uint32_t col) { - g->u = (g->u & ~(0x1ff << 9)) | ((col & 0x1ff) << 9); -} -static inline void tsetimg4thbyteplus1(Glyph *g, uint32_t byteplus1) { - g->u = (g->u & ~(0x1ff << 18)) | ((byteplus1 & 0x1ff) << 18); -} -static inline void tsetimgdiacriticcount(Glyph *g, uint32_t count) { - g->u = (g->u & ~(0x3 << 27)) | ((count & 0x3) << 27); -} -static inline void tsetisclassicplaceholder(Glyph *g, uint32_t isclassic) { - g->u = (g->u & ~(0x1 << 29)) | ((isclassic & 0x1) << 29); -} - -/// Returns the full image id. This is a naive implementation, if the most -/// significant byte is not specified, it's assumed to be 0 instead of inferring -/// it from the cells to the left. -static inline uint32_t tgetimgid(Glyph *g) { - uint32_t msb = tgetimgid4thbyteplus1(g); - if (msb != 0) - --msb; - return (msb << 24) | (g->fg & 0xFFFFFF); -} - -/// Sets the full image id. -static inline void tsetimgid(Glyph *g, uint32_t id) { - g->fg = (id & 0xFFFFFF) | (1 << 24); - tsetimg4thbyteplus1(g, ((id >> 24) & 0xFF) + 1); -} - -static inline uint32_t tgetimgplacementid(Glyph *g) { - if (tgetdecorcolor(g) == DECOR_DEFAULT_COLOR) - return 0; - return g->decor & 0xFFFFFF; -} - -static inline void tsetimgplacementid(Glyph *g, uint32_t id) { - g->decor = (id & 0xFFFFFF) | (1 << 24); -} diff --git a/.suckless/st/st.o b/.suckless/st/st.o deleted file mode 100644 index 470a0d782738cfafe4626f52cdea918c1c255ea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89504 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 K)N7!h;{O5~K%gc7 diff --git a/.suckless/st/x.o b/.suckless/st/x.o deleted file mode 100644 index 48c16f4c44f87c0c3c24e8e01355bccbd4ab115d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87680 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 diff --git a/.config/dunst/dunst/dunstrc b/config/dunst/dunst/dunstrc similarity index 100% rename from .config/dunst/dunst/dunstrc rename to config/dunst/dunst/dunstrc diff --git a/.config/dunst/dunstrc b/config/dunst/dunstrc similarity index 100% rename from .config/dunst/dunstrc rename to config/dunst/dunstrc diff --git a/.config/fastfetch/ascii.txt b/config/fastfetch/ascii.txt similarity index 100% rename from .config/fastfetch/ascii.txt rename to config/fastfetch/ascii.txt diff --git a/.config/fastfetch/ascii.txt~ b/config/fastfetch/ascii.txt~ similarity index 100% rename from .config/fastfetch/ascii.txt~ rename to config/fastfetch/ascii.txt~ diff --git a/.config/fastfetch/config.jsonc b/config/fastfetch/config.jsonc similarity index 100% rename from .config/fastfetch/config.jsonc rename to config/fastfetch/config.jsonc diff --git a/.config/fastfetch/config.jsonc~ b/config/fastfetch/config.jsonc~ similarity index 100% rename from .config/fastfetch/config.jsonc~ rename to config/fastfetch/config.jsonc~ diff --git a/.config/fastfetch/fastfetch/ascii.txt b/config/fastfetch/fastfetch/ascii.txt similarity index 100% rename from .config/fastfetch/fastfetch/ascii.txt rename to config/fastfetch/fastfetch/ascii.txt diff --git a/.config/fastfetch/fastfetch/ascii.txt~ b/config/fastfetch/fastfetch/ascii.txt~ similarity index 100% rename from .config/fastfetch/fastfetch/ascii.txt~ rename to config/fastfetch/fastfetch/ascii.txt~ diff --git a/.config/fastfetch/fastfetch/config.jsonc b/config/fastfetch/fastfetch/config.jsonc similarity index 100% rename from .config/fastfetch/fastfetch/config.jsonc rename to config/fastfetch/fastfetch/config.jsonc diff --git a/.config/fastfetch/fastfetch/config.jsonc~ b/config/fastfetch/fastfetch/config.jsonc~ similarity index 100% rename from .config/fastfetch/fastfetch/config.jsonc~ rename to config/fastfetch/fastfetch/config.jsonc~ diff --git a/.config/home-manager/README.md b/config/home-manager/README.md similarity index 100% rename from .config/home-manager/README.md rename to config/home-manager/README.md diff --git a/.config/home-manager/flake.lock b/config/home-manager/flake.lock similarity index 100% rename from .config/home-manager/flake.lock rename to config/home-manager/flake.lock diff --git a/.config/home-manager/flake.nix b/config/home-manager/flake.nix similarity index 100% rename from .config/home-manager/flake.nix rename to config/home-manager/flake.nix diff --git a/.config/home-manager/home.nix b/config/home-manager/home.nix similarity index 100% rename from .config/home-manager/home.nix rename to config/home-manager/home.nix diff --git a/.config/nvim/Makefile b/config/nvim/Makefile similarity index 100% rename from .config/nvim/Makefile rename to config/nvim/Makefile diff --git a/.config/nvim/fnl/config.fnl b/config/nvim/fnl/config.fnl similarity index 100% rename from .config/nvim/fnl/config.fnl rename to config/nvim/fnl/config.fnl diff --git a/.config/nvim/init.lua b/config/nvim/init.lua similarity index 100% rename from .config/nvim/init.lua rename to config/nvim/init.lua diff --git a/.config/nvim/lua/project_nvim/project.lua b/config/nvim/lua/project_nvim/project.lua similarity index 100% rename from .config/nvim/lua/project_nvim/project.lua rename to config/nvim/lua/project_nvim/project.lua diff --git a/.config/picom/picom.conf b/config/picom/picom.conf similarity index 100% rename from .config/picom/picom.conf rename to config/picom/picom.conf diff --git a/.config/picom/picom.conf~ b/config/picom/picom.conf~ similarity index 100% rename from .config/picom/picom.conf~ rename to config/picom/picom.conf~ diff --git a/.config/picom/picom/picom.conf b/config/picom/picom/picom.conf similarity index 100% rename from .config/picom/picom/picom.conf rename to config/picom/picom/picom.conf diff --git a/.config/picom/picom/picom.conf~ b/config/picom/picom/picom.conf~ similarity index 100% rename from .config/picom/picom/picom.conf~ rename to config/picom/picom/picom.conf~ diff --git a/.config/plugin/config.vim b/config/plugin/config.vim similarity index 100% rename from .config/plugin/config.vim rename to config/plugin/config.vim diff --git a/.config/shell/aliases b/config/shell/aliases similarity index 100% rename from .config/shell/aliases rename to config/shell/aliases diff --git a/.config/shell/exports b/config/shell/exports similarity index 100% rename from .config/shell/exports rename to config/shell/exports diff --git a/.config/shell/shell/aliases b/config/shell/shell/aliases similarity index 100% rename from .config/shell/shell/aliases rename to config/shell/shell/aliases diff --git a/.config/shell/shell/aliases.backup b/config/shell/shell/aliases.backup similarity index 100% rename from .config/shell/shell/aliases.backup rename to config/shell/shell/aliases.backup diff --git a/.config/shell/shell/exports b/config/shell/shell/exports similarity index 100% rename from .config/shell/shell/exports rename to config/shell/shell/exports diff --git a/.config/shell/shell/exports.backup b/config/shell/shell/exports.backup similarity index 100% rename from .config/shell/shell/exports.backup rename to config/shell/shell/exports.backup diff --git a/.config/systemd/emacsd.service b/config/systemd/emacsd.service similarity index 100% rename from .config/systemd/emacsd.service rename to config/systemd/emacsd.service diff --git a/.config/user-dirs.dirs b/config/user-dirs.dirs similarity index 100% rename from .config/user-dirs.dirs rename to config/user-dirs.dirs diff --git a/.suckless/dmenu/LICENSE b/suckless/dmenu/LICENSE similarity index 100% rename from .suckless/dmenu/LICENSE rename to suckless/dmenu/LICENSE diff --git a/.suckless/dmenu/Makefile b/suckless/dmenu/Makefile similarity index 100% rename from .suckless/dmenu/Makefile rename to suckless/dmenu/Makefile diff --git a/.suckless/dmenu/README b/suckless/dmenu/README similarity index 100% rename from .suckless/dmenu/README rename to suckless/dmenu/README diff --git a/.suckless/dmenu/arg.h b/suckless/dmenu/arg.h similarity index 100% rename from .suckless/dmenu/arg.h rename to suckless/dmenu/arg.h diff --git a/.suckless/dmenu/config.def.h b/suckless/dmenu/config.def.h similarity index 100% rename from .suckless/dmenu/config.def.h rename to suckless/dmenu/config.def.h diff --git a/.suckless/dmenu/config.h b/suckless/dmenu/config.h similarity index 92% rename from .suckless/dmenu/config.h rename to suckless/dmenu/config.h index ad70a45..1edb647 100644 --- a/.suckless/dmenu/config.h +++ b/suckless/dmenu/config.h @@ -1,7 +1,7 @@ /* See LICENSE file for copyright and license details. */ /* Default settings; can be overriden by command line. */ -static int topbar = 0; /* -b option; if 0, dmenu appears at bottom */ +static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ /* -fn option overrides fonts[0]; default X11 font or font set */ static const char *fonts[] = { "monospace:size=10" diff --git a/.suckless/dmenu/config.mk b/suckless/dmenu/config.mk similarity index 100% rename from .suckless/dmenu/config.mk rename to suckless/dmenu/config.mk diff --git a/.suckless/dmenu/dmenu b/suckless/dmenu/dmenu similarity index 98% rename from .suckless/dmenu/dmenu rename to suckless/dmenu/dmenu index 9a463a4ce77d0a1b37b22d5a5d13750a5e3fcb8b..656bab89d05ef91e4c08f9e592538f3236578d6e 100755 GIT binary patch delta 105 zcmV-v0G9u-&jPT|0(=`(aJ4IvcAS#~tCDYqPWiULpdzT$2X@^H37^^1j delta 120 zcmdmRo@oOREnpT=d1bq&?7+`s%D*qHi zW}LIxP|K8&F?Djf_AREM@X5|PiHz?zFV)cwn|!57XA(2Zre;4DX-S3|%?x0`0-+ex S85tND86+4kY|def2qvI0 V`C+X1<_|Fe(u^FN9V_Ou002Z-J7WL< delta 155 zcmaFxlkve%#tkocIQ|0x0}yQfz!N4X%)%f6;s5~)gkn&i?5Hiixj_4kDi26V1S-5a zBd~&z;}1wT5Nv)Cbc3A}#@jPlF-m;$gQx|Jzb7|FM}zeVL-kF55&eW0WDrb1WAejT S@y#D%0;CyPHak|#X8{0n5H!L7 diff --git a/.suckless/dmenu/dmenu_path b/suckless/dmenu/dmenu_path similarity index 100% rename from .suckless/dmenu/dmenu_path rename to suckless/dmenu/dmenu_path diff --git a/.suckless/dmenu/dmenu_run b/suckless/dmenu/dmenu_run similarity index 100% rename from .suckless/dmenu/dmenu_run rename to suckless/dmenu/dmenu_run diff --git a/.suckless/dmenu/drw.c b/suckless/dmenu/drw.c similarity index 100% rename from .suckless/dmenu/drw.c rename to suckless/dmenu/drw.c diff --git a/.suckless/dmenu/drw.h b/suckless/dmenu/drw.h similarity index 100% rename from .suckless/dmenu/drw.h rename to suckless/dmenu/drw.h diff --git a/.suckless/dmenu/drw.o b/suckless/dmenu/drw.o similarity index 100% rename from .suckless/dmenu/drw.o rename to suckless/dmenu/drw.o diff --git a/.suckless/dmenu/stest b/suckless/dmenu/stest similarity index 100% rename from .suckless/dmenu/stest rename to suckless/dmenu/stest diff --git a/.suckless/dmenu/stest.1 b/suckless/dmenu/stest.1 similarity index 100% rename from .suckless/dmenu/stest.1 rename to suckless/dmenu/stest.1 diff --git a/.suckless/dmenu/stest.c b/suckless/dmenu/stest.c similarity index 100% rename from .suckless/dmenu/stest.c rename to suckless/dmenu/stest.c diff --git a/.suckless/dmenu/stest.o b/suckless/dmenu/stest.o similarity index 100% rename from .suckless/dmenu/stest.o rename to suckless/dmenu/stest.o diff --git a/.suckless/dmenu/util.c b/suckless/dmenu/util.c similarity index 100% rename from .suckless/dmenu/util.c rename to suckless/dmenu/util.c diff --git a/.suckless/dmenu/util.h b/suckless/dmenu/util.h similarity index 100% rename from .suckless/dmenu/util.h rename to suckless/dmenu/util.h diff --git a/.suckless/dmenu/util.o b/suckless/dmenu/util.o similarity index 100% rename from .suckless/dmenu/util.o rename to suckless/dmenu/util.o diff --git a/.suckless/dwm/#dwm.c# b/suckless/dwm/#dwm.c# similarity index 100% rename from .suckless/dwm/#dwm.c# rename to suckless/dwm/#dwm.c# diff --git a/.suckless/dwm/LICENSE b/suckless/dwm/LICENSE similarity index 100% rename from .suckless/dwm/LICENSE rename to suckless/dwm/LICENSE diff --git a/.suckless/dwm/Makefile b/suckless/dwm/Makefile similarity index 100% rename from .suckless/dwm/Makefile rename to suckless/dwm/Makefile diff --git a/.suckless/dwm/README b/suckless/dwm/README similarity index 100% rename from .suckless/dwm/README rename to suckless/dwm/README diff --git a/.suckless/dwm/README.md b/suckless/dwm/README.md similarity index 100% rename from .suckless/dwm/README.md rename to suckless/dwm/README.md diff --git a/.suckless/dwm/attachaside.diff b/suckless/dwm/attachaside.diff similarity index 100% rename from .suckless/dwm/attachaside.diff rename to suckless/dwm/attachaside.diff diff --git a/.suckless/dwm/config.def.h b/suckless/dwm/config.def.h similarity index 100% rename from .suckless/dwm/config.def.h rename to suckless/dwm/config.def.h diff --git a/.suckless/dwm/config.h b/suckless/dwm/config.h similarity index 99% rename from .suckless/dwm/config.h rename to suckless/dwm/config.h index c0a1398..95d512e 100644 --- a/.suckless/dwm/config.h +++ b/suckless/dwm/config.h @@ -121,7 +121,7 @@ static Key keys[] = { { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, { MODKEY|ShiftMask, XK_q, quit, {0} }, - { MODKEY, XK_b, spawn, SHCMD("mullvad-browser") }, + { MODKEY, XK_b, spawn, SHCMD("floorp") }, { MODKEY, XK_m, togglebar, {0} }, { MODKEY, XK_o, incnmaster, {.i = +1 } }, { MODKEY, XK_Return, spawn, {.v = termcmd } }, diff --git a/.suckless/dwm/config.h~ b/suckless/dwm/config.h~ similarity index 100% rename from .suckless/dwm/config.h~ rename to suckless/dwm/config.h~ diff --git a/.suckless/dwm/config.mk b/suckless/dwm/config.mk similarity index 100% rename from .suckless/dwm/config.mk rename to suckless/dwm/config.mk diff --git a/.suckless/dwm/configure b/suckless/dwm/configure similarity index 100% rename from .suckless/dwm/configure rename to suckless/dwm/configure diff --git a/.suckless/dwm/drw.c b/suckless/dwm/drw.c similarity index 100% rename from .suckless/dwm/drw.c rename to suckless/dwm/drw.c diff --git a/.suckless/dwm/drw.h b/suckless/dwm/drw.h similarity index 100% rename from .suckless/dwm/drw.h rename to suckless/dwm/drw.h diff --git a/.suckless/dwm/drw.o b/suckless/dwm/drw.o similarity index 100% rename from .suckless/dwm/drw.o rename to suckless/dwm/drw.o diff --git a/.suckless/dwm/dwm b/suckless/dwm/dwm similarity index 96% rename from .suckless/dwm/dwm rename to suckless/dwm/dwm index 42b3dccc6322a3c3a146a8c6e79efb25ec97364e..3628153fecdab0e3c5069d92bfc9c79b775e8448 100755 GIT binary patch delta 729 zcmdmRl4S!BEnpVeuzm5Lwr0yI-*VjFKQz-9T5*lFaPt=C5-~>c$(mC7lG0llAm9#! z;(&7HCl^ZTGb&GBC?zhb2~}f&rbd7AMWC!XRMr7a)^0MRw78@zR5k!j)_bxcP&ODU zn}8-8y*W|(KR4r=$%*Rvj2k9TR2P>#y#?Yjjd!RHy*l|IP|eNBAAxG_Le+Snsd+kC zQA1qvB~&&7P4?sDKn-!vuTa?xG}*sU@d7k)m|YEM;*66wYKTwXpur)y0!@Z@@{FAqTnh_d>cgOCX^2glBZBUEWkfP`LG~{1u0BD)O;oe#>t6yLQ$9MZp0p|aXnE(I) delta 738 zcmdmRl4S!BEnpVu5G=hE9d~*4!&U0VzUTQih%7oQuz3q}i5R28WKAi3NtLY(5O4=V zaX`5mlMAKv8FeNvloFRTf~qkpq!LT3pf(DjR?%8#37tC>sNn zO+b@P*_7*=nPv zr~q?D62$xPc!S3m;~jZN9jGc;j9EbWusCvu@?o(O0_DTv0T}Lg<_p$ug@%R6W{BxK zp?s)a46wMk2NT~0k$D8=!@}krln)E}Ur;_QtYKjbQx7$tiGgc!;vIQGSRjf)T`4(v O<2!p`uzh^D-xL7VIF9cC diff --git a/.suckless/dwm/dwm.1 b/suckless/dwm/dwm.1 similarity index 100% rename from .suckless/dwm/dwm.1 rename to suckless/dwm/dwm.1 diff --git a/.suckless/dwm/dwm.c b/suckless/dwm/dwm.c similarity index 100% rename from .suckless/dwm/dwm.c rename to suckless/dwm/dwm.c diff --git a/.suckless/dwm/dwm.c.orig b/suckless/dwm/dwm.c.orig similarity index 100% rename from .suckless/dwm/dwm.c.orig rename to suckless/dwm/dwm.c.orig diff --git a/.suckless/dwm/dwm.c.rej b/suckless/dwm/dwm.c.rej similarity index 100% rename from .suckless/dwm/dwm.c.rej rename to suckless/dwm/dwm.c.rej diff --git a/.suckless/dwm/dwm.o b/suckless/dwm/dwm.o similarity index 90% rename from .suckless/dwm/dwm.o rename to suckless/dwm/dwm.o index 9719429970d9e96288e53193708f644d920e5e64..7c4854b54ec12d4849cfa0e262c2bd20f6bb2e60 100644 GIT binary patch delta 544 zcmZ9{u}cDB9L8~fT}hXVL2w;ZToGiGHo0{kG$=$6w6)k01c6seZE>TU^85ofgtaNR zH1T#OEPTepUz#Ue+#Y)`m(7GhdU0BYe8@qLEko|;PmTpT?lR()U)Xl4mSpmn}X;q F{Q)ymdZYjV delta 546 zcmZ9|JxBs!90u_IUO{GHMReWJheL2uVNT(6I&}_-OItyPL4y$)Ww+&KTk$M4Hsuu5 zE#78RQ-hOAL^k*V4t0J|PW77C;Cpb-3;*BqzPxv(x=^bN7c$BB?y~CKKaRytBGKiY z_(9@mH?B_x9YgwjD0@y4-t!)s!FWL=7u*Gpv@kgE_oS$|c9&W9F5<8tN?uE^IQ8L% zso&Bxr)$VDUAHvD=?17M(v~h2s}8yYl|A$TZ&{R{h29lv_WrBn5n-JdT(Zua)fpb? z?^N-~v~KA%r%jklzbutG{ei0@2LDg?b1GP$vCYj#t@$1|cOqF4X#&@kTZ-y|YQj!u zFg~9sg`~Mk-!M#t(&(6qO%5RtnnJiCQwCZ?AsGhCQ*>CC;A<*028|_~vs^-_so2y_ l 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_F16, 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/suckless/st/config.h.save b/suckless/st/config.h.save new file mode 100644 index 0000000..b25362c --- /dev/null +++ b/suckless/st/config.h.save @@ -0,0 +1,486 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Terminus-9: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 = 2; +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; + +/* Background opacity */ +float alpha_def; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + + /* 8 normal colors */ + "#0a0a0a", /* black */ + "#44516d", /* red */ + "#c95d38", /* green */ + "#de9e68", /* yellow */ + "#8b7675", /* blue */ + "#7e5f8c", /* magenta */ + "#8c82c2", /* cyan */ + "#eff7d0", /* white */ + + /* 8 bright colors */ + "#181818", /* black */ + "#7d87a1", /* red */ + "#e9673c", /* green */ + "#e0b18b", /* yellow */ + "#b9a192", /* blue */ + "#9a7ebd", /* magenta */ + "#bccce2", /* cyan */ + "#ffffff", /* white */ + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#gray90", /* default foreground colour */ + "#black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 256; +unsigned int defaultbg = 257; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 6; + +/* + * 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 */ + { XK_NO_MOD, Button4, kscrollup, {.i = 1} }, + { XK_NO_MOD, 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 (Mod1Mask|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} }, + { ControlMask, XK_j, zoom, {.f = +1} }, + { ControlMask, XK_minus, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { MODKEY, XK_c, clipcopy, {.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} }, + { MODKEY, XK_k, kscrollup, {.i = 1} }, + { MODKEY, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_a, chgalpha, {.f = -1} }, + { MODKEY, XK_s, chgalpha, {.f = +1} }, + { MODKEY, XK_d, chgalpha, {.f = 0} }, +}; + +/* + * 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/suckless/st/config.h.save.1 b/suckless/st/config.h.save.1 new file mode 100644 index 0000000..d608c5a --- /dev/null +++ b/suckless/st/config.h.save.1 @@ -0,0 +1,486 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Terminus-9: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 = 2; +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; + +/* Background opacity */ +float alpha_def; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + + /* 8 normal colors */ + "#0a0a0a", /* black */ + "#44516d", /* red */ + "#c95d38", /* green */ + "#de9e68", /* yellow */ + "#8b7675", /* blue */ + "#7e5f8c", /* magenta */ + "#8c82c2", /* cyan */ + "#eff7d0", /* white */ + + /* 8 bright colors */ + "#181818", /* black */ + "#7d87a1", /* red */ + "#e9673c", /* green */ + "#e0b18b", /* yellow */ + "#b9a192", /* blue */ + "#9a7ebd", /* magenta */ + "#bccce2", /* cyan */ + "#ffffff", /* white */ + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 256; +unsigned int defaultbg = 257; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 6; + +/* + * 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 */ + { XK_NO_MOD, Button4, kscrollup, {.i = 1} }, + { XK_NO_MOD, 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 (Mod1Mask|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} }, + { ControlMask, XK_equal, zoom, {.f = +1} }, + { ControlMask, XK_minus, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { MODKEY, XK_c, clipcopy, {.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} }, + { ControlMask, XK_k, kscrollup, {.i = 1} }, + { ControlMask, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_a, chgalpha, {.f = -1} }, + { MODKEY, XK_s, chgalpha, {.f = +1} }, + { MODKEY, XK_d, chgalpha, {.f = 0} }, +}; + +/* + * 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/suckless/st/config.h.save.2 b/suckless/st/config.h.save.2 new file mode 100644 index 0000000..4869423 --- /dev/null +++ b/suckless/st/config.h.save.2 @@ -0,0 +1,486 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Terminus-9: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 = 2; +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; + +/* Background opacity */ +float alpha_def; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + + /* 8 normal colors */ + "#0a0a0a", /* black */ + "#44516d", /* red */ + "#c95d38", /* green */ + "#de9e68", /* yellow */ + "#8b7675", /* blue */ + "#7e5f8c", /* magenta */ + "#8c82c2", /* cyan */ + "#eff7d0", /* white */ + + /* 8 bright colors */ + "#181818", /* black */ + "#7d87a1", /* red */ + "#e9673c", /* green */ + "#e0b18b", /* yellow */ + "#b9a192", /* blue */ + "#9a7ebd", /* magenta */ + "#bccce2", /* cyan */ + "#ffffff", /* white */ + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 256; +unsigned int defaultbg = 257; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 6; + +/* + * 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 */ + { XK_NO_MOD, Button4, kscrollup, {.i = 1} }, + { XK_NO_MOD, 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 (Mod1Mask|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} }, + { ControlMask, XK_equal, zoom, {.f = +1} }, + { ControlMask, XK_minus, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { ControlMask|Shift, XK_c, clipcopy, {.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} }, + { ControlMask, XK_k, kscrollup, {.i = 1} }, + { ControlMask, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_a, chgalpha, {.f = -1} }, + { MODKEY, XK_s, chgalpha, {.f = +1} }, + { MODKEY, XK_d, chgalpha, {.f = 0} }, +}; + +/* + * 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/suckless/st/config.h.save.3 b/suckless/st/config.h.save.3 new file mode 100644 index 0000000..e2169a7 --- /dev/null +++ b/suckless/st/config.h.save.3 @@ -0,0 +1,486 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Terminus-9: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 = 2; +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; + +/* Background opacity */ +float alpha_def; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + + /* 8 normal colors */ + "#333e21", /* black */ + "#757849", /* red */ + "#FF432A", /* green */ + "#c83e72", /* yellow */ + "#448C2C", /* blue */ + "#7d5f5f", /* magenta */ + "#bd8c77", /* cyan */ + "#efdceb", /* white */ + + /* 8 bright colors */ + "#686e50", /* black */ + "#A6AA6A", /* red */ + "#fa6d5a", /* green */ + "#d3658e", /* yellow */ + "#80BD6C", /* blue */ + "#B38887", /* magenta */ + "#f0bfaa", /* cyan */ + "#ffffff", /* white */ + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 256; +unsigned int defaultbg = 257; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 6; + +/* + * 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 */ + { XK_NO_MOD, Button4, kscrollup, {.i = 1} }, + { XK_NO_MOD, 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 (Mod1Mask|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} }, + { ControlMask, XK_equal, zoom, {.f = +1} }, + { ControlMask, XK_minus, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { MODKEY, XK_c, clipcopy, {.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_k, kscrollup, {.i = 1} }, + { ShiftMask, XK_j, kscrolldown, {.i = 1} }, + { MODKEY, XK_a, chgalpha, {.f = -1} }, + { MODKEY, XK_s, chgalpha, {.f = +1} }, + { MODKEY, XK_d, chgalpha, {.f = 0} }, +}; + +/* + * 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/.suckless/st/config.mk b/suckless/st/config.mk similarity index 80% rename from .suckless/st/config.mk rename to suckless/st/config.mk index cb2875c..b6458af 100644 --- a/.suckless/st/config.mk +++ b/suckless/st/config.mk @@ -14,14 +14,13 @@ PKG_CONFIG = pkg-config # includes and libs INCS = -I$(X11INC) \ - `$(PKG_CONFIG) --cflags imlib2` \ `$(PKG_CONFIG) --cflags fontconfig` \ - `$(PKG_CONFIG) --cflags freetype2` + `$(PKG_CONFIG) --cflags freetype2` \ + `$(PKG_CONFIG) --cflags harfbuzz` LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender \ - `$(PKG_CONFIG) --libs imlib2` \ - `$(PKG_CONFIG) --libs zlib` \ `$(PKG_CONFIG) --libs fontconfig` \ - `$(PKG_CONFIG) --libs freetype2` + `$(PKG_CONFIG) --libs freetype2` \ + `$(PKG_CONFIG) --libs harfbuzz` # flags STCPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 diff --git a/.suckless/st/graphics.c b/suckless/st/graphics.c similarity index 100% rename from .suckless/st/graphics.c rename to suckless/st/graphics.c diff --git a/.suckless/st/graphics.h b/suckless/st/graphics.h similarity index 100% rename from .suckless/st/graphics.h rename to suckless/st/graphics.h diff --git a/suckless/st/hb.c b/suckless/st/hb.c new file mode 100644 index 0000000..2bb334c --- /dev/null +++ b/suckless/st/hb.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "st.h" +#include "hb.h" + +#define FEATURE(c1,c2,c3,c4) { .tag = HB_TAG(c1,c2,c3,c4), .value = 1, .start = HB_FEATURE_GLOBAL_START, .end = HB_FEATURE_GLOBAL_END } +#define BUFFER_STEP 256 + +hb_font_t *hbfindfont(XftFont *match); + +typedef struct { + XftFont *match; + hb_font_t *font; +} HbFontMatch; + +typedef struct { + size_t capacity; + HbFontMatch *fonts; +} HbFontCache; + +static HbFontCache hbfontcache = { 0, NULL }; + +typedef struct { + size_t capacity; + Rune *runes; +} RuneBuffer; + +static RuneBuffer hbrunebuffer = { 0, NULL }; + +/* + * Poplulate the array with a list of font features, wrapped in FEATURE macro, + * e. g. + * FEATURE('c', 'a', 'l', 't'), FEATURE('d', 'l', 'i', 'g') + */ +hb_feature_t features[] = {0}; + +void +hbunloadfonts() +{ + for (int i = 0; i < hbfontcache.capacity; i++) { + hb_font_destroy(hbfontcache.fonts[i].font); + XftUnlockFace(hbfontcache.fonts[i].match); + } + + if (hbfontcache.fonts != NULL) { + free(hbfontcache.fonts); + hbfontcache.fonts = NULL; + } + hbfontcache.capacity = 0; +} + +hb_font_t * +hbfindfont(XftFont *match) +{ + for (int i = 0; i < hbfontcache.capacity; i++) { + if (hbfontcache.fonts[i].match == match) + return hbfontcache.fonts[i].font; + } + + /* Font not found in cache, caching it now. */ + hbfontcache.fonts = realloc(hbfontcache.fonts, sizeof(HbFontMatch) * (hbfontcache.capacity + 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.fonts[hbfontcache.capacity].match = match; + hbfontcache.fonts[hbfontcache.capacity].font = font; + hbfontcache.capacity += 1; + + return font; +} + +void hbtransform(HbTransformData *data, XftFont *xfont, const Glyph *glyphs, int start, int length) { + ushort mode = USHRT_MAX; + unsigned int glyph_count; + int rune_idx, glyph_idx, end = start + length; + + hb_font_t *font = hbfindfont(xfont); + if (font == NULL) + return; + + hb_buffer_t *buffer = hb_buffer_create(); + hb_buffer_set_direction(buffer, HB_DIRECTION_LTR); + hb_buffer_set_cluster_level(buffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); + + /* Resize the buffer if required length is larger. */ + if (hbrunebuffer.capacity < length) { + hbrunebuffer.capacity = (length / BUFFER_STEP + 1) * BUFFER_STEP; + hbrunebuffer.runes = realloc(hbrunebuffer.runes, hbrunebuffer.capacity * sizeof(Rune)); + } + + /* Fill buffer with codepoints. */ + for (rune_idx = 0, glyph_idx = start; glyph_idx < end; glyph_idx++, rune_idx++) { + hbrunebuffer.runes[rune_idx] = glyphs[glyph_idx].u; + mode = glyphs[glyph_idx].mode; + if (mode & ATTR_WDUMMY) + hbrunebuffer.runes[rune_idx] = 0x0020; + } + hb_buffer_add_codepoints(buffer, hbrunebuffer.runes, length, 0, length); + + /* Shape the segment. */ + hb_shape(font, buffer, features, sizeof(features)/sizeof(hb_feature_t)); + + /* Get new glyph info. */ + hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, &glyph_count); + hb_glyph_position_t *pos = hb_buffer_get_glyph_positions(buffer, &glyph_count); + + /* Fill the output. */ + data->buffer = buffer; + data->glyphs = info; + data->positions = pos; + data->count = glyph_count; +} + +void hbcleanup(HbTransformData *data) { + hb_buffer_destroy(data->buffer); + memset(data, 0, sizeof(HbTransformData)); +} diff --git a/suckless/st/hb.h b/suckless/st/hb.h new file mode 100644 index 0000000..3b0ef44 --- /dev/null +++ b/suckless/st/hb.h @@ -0,0 +1,14 @@ +#include +#include +#include + +typedef struct { + hb_buffer_t *buffer; + hb_glyph_info_t *glyphs; + hb_glyph_position_t *positions; + unsigned int count; +} HbTransformData; + +void hbunloadfonts(); +void hbtransform(HbTransformData *, XftFont *, const Glyph *, int, int); +void hbcleanup(HbTransformData *); diff --git a/suckless/st/hb.o b/suckless/st/hb.o new file mode 100644 index 0000000000000000000000000000000000000000..5efaf3e7791d1964d305f744171d8d36bac9d401 GIT binary patch literal 4240 zcmbtWO>7%Q6rOe5#8oP_lTZA$eTQ)x)5W@kcvt?{-6R-ao;q^NO=G^ukYVLl+ zr+*6b#v)-go=8M~_C^x8BjMTgw#IM28mH{fctgbCQ?pLYn>{Mn!ciI4Ka6bK-j;dY zv%DcH<5QnFt7O7=(ItBA)55bq?mWipM>Jk<#d!axwUfO0sK%#fpgNJyOXYfnx!+0i z=pl5L#z%ar<=jH6agXrnAHuxjQW4(0lDm(<`db>O7(a8bMBd0pPW;ZBBF#H<@lL#L zZZ;n@$IJ)B8WJP!dG4O!?gQNs)BSwNZD)BSyea{F?hbXwds|)=Q?2N;CjcCAKOS!0 zaTS$zC@hFag?$Kjj=QJ4$xNH~i)BTh`2z6a{&P>>vmx{2sQW#i{vMY9M0bR1f64y2 z-;QcCqAl9rhYg_1{xxE5*Xe;p;pp&JZkOm`eLBqhf3MA$?y-ZwWA4|yu?7c}_@Jnw zDf@GB)IB5W8Es~}SB$zdMB{E-u}0hpSlaf;h&vo>40W$C-QhTgK|IT^_qtKz(AUJa z?dC(~cJpB~)o#{jA?wuf=t%njYaYO3%QL6B>lHIS6Ix)0e>wg4?5rqf6UVc2w;1Q5 zr&`gjj%e4~*tRw08rtQ=do<{uqc-)}-jJ!s>m5V75i09(08BlSfTS@Qgkw@KmpIv^uNCui7mH+j zeO|8Q6}^VpK6uD?jtqmr0Q~*{d<<}mPjRVdI|BIm0Ne?{_Xgn41CDub!iIy0{RaIC zJPWPsjR5>`0De3G{}b>oWxpub`2hZ6sE;^6nG+)bzbgR04{%)X!H^e1oJkmN4dAo< zcrpV&_+DqynY;yKyH>KsYq^|dv*hU79zbd(yakX`1uKPvRMx6Gc6pL*$vI;%o!PZ6 zov~QXwlGAlP!e=zTj?T9B5Ra57{T#^WMJO0Shj#pj-4)5b7gx1b9e=$Bw-$?T9CS6 zTN$TNE-6IBGsRlfvFudQddw;+bLnh0l__VfO1Xe5$U)AUZHc8+^XUrarhGdg%+BIu zC7&vka%Dl0mCVmn%GCm9ud-CC>ZCKfQknd&R1R)T2$U&W=~Attgrr7^4WauEx2FT1 zl>%kVdoLN>lOB%u9?Er|5+@1olykG5^hn&#?^pPki}-Xm5+Cm^lntJ`An#_0he0oa zhvGc!;~Ua0`0%*2pY`FCcb^ZZ^?ne5ACWlLb1^(r&nE$V{KrQ@K7Jq(|62q>5ZB=$ z{5J$a{QWuW!E-p(xeVSX6hFUP!SQaU_(_Rl-l&3S6@00JPbzqqg1ZWicRa;^MZqso z@cj~}IsANp|m|LsH~2=NJzN*wD)jPkBj`1r*`_-ciJnS$S};Fl}-kb>jcp*Sxq z@$r43`d{IpL(oK|8jm^E9%pVmj$qyB(IyrkylPj#sNJX_wJJI(&w)WTreZVU>VV zDmzvZKD}-fSCq7OmTJk0U9MQRGYPI3(8{NBc6!2+1^rKDfIl8BJo~B)NaIVjX@D6L zCxyMnGd4hg)D`(b)xtvng6|6EkuanCX0^m64J=QV`vHl|*MMm31{h&XKRqr1x_8OJ z|DW9p6BrY}n^YnHYg7=%l%Mo~#Qb?~mig)aq%h=1dPIpy9Ml{A3zC!MN8GJ2=!D0& zO>9fR`l3@ufQv3ajfG@QFJ@UohA^mXw@&AqdY5y0>jV?PdD9C2`j`u#EHf~`U_$Sz;Qd?tMJE$qKf*8jMOGXLZE{|8r*jIaOz literal 0 HcmV?d00001 diff --git a/.suckless/st/icat-mini.sh b/suckless/st/icat-mini.sh similarity index 100% rename from .suckless/st/icat-mini.sh rename to suckless/st/icat-mini.sh diff --git a/.suckless/st/khash.h b/suckless/st/khash.h similarity index 100% rename from .suckless/st/khash.h rename to suckless/st/khash.h diff --git a/.suckless/st/kvec.h b/suckless/st/kvec.h similarity index 100% rename from .suckless/st/kvec.h rename to suckless/st/kvec.h diff --git a/.suckless/st/rowcolumn_diacritics_helpers.c b/suckless/st/rowcolumn_diacritics_helpers.c similarity index 100% rename from .suckless/st/rowcolumn_diacritics_helpers.c rename to suckless/st/rowcolumn_diacritics_helpers.c diff --git a/suckless/st/st b/suckless/st/st new file mode 100755 index 0000000000000000000000000000000000000000..faa4fa6aabcf1687dbd749dff7ed29860bbab10e GIT binary patch literal 113680 zcmeFad3Y36+BRODbU|1`HJC_Tkf1?`hz2D}3yo>$Km{9!fXXOa2nj?((k9((vILt5 zW!V@VN72y{mv;tr9HXO%sE`mzKu2wGLlg~+OEs+!K*A>UcR#19l9L+xec$W)et-P_ z_~J#^x$pCwbDr~@eW`Lqu6Im=%_f+CiNZ*MP}Q9}lVf<~zu7L6BMcLI2suJu;WD8U z{O$N>%2}U|M0n!Qd?x8oAezFxY4}^8ml|^B(@dS76fWN1Jg@F!J_U!4DV#{od>vb# z?u|NcKKXDgJ%^!z<>|Ol4`)94aAcdTaeBC{J3BsWv-EIPQ}w4AE&-6j%^I)E&zj!x znNI@vGoPkCNk{sZZ`jlN%z+>M<*;8tu!gHK!dagghP?TtH0Y0>^si-%uAlXp4nO)! zXTR-bHu*>Y913UE&%`-~y!kZs%s0ZNU#+KSeR>VW%%=f`TM>@z`M>=$s*5nmNH1Rb zg;`}11oNqDrRS51mb}MKxJ^i?66#17)88i8817;ylwe@fpJY?;kBWoBKV7u@)yX}- zcD>T+{;6m0o&VB+hqunZwzOpS4MVRjoin(!q%5##@Spy9sKO#FHKLrY(kG}u~cRs$c^ZEJ3Nb`L1gQ5BP z_``AZnGq-5K5^2$E)IV)3h;dCwxD3n$5+Hjw=@p_NgTd=9Nrm6&jE4l-v{8r(6!ikxz*e|1)v;7vq%g<8jh`J5Ihf#nI=NIDAnYer+6HjZ<$2 z#HlCycITvH$CF)oOq_j(f@3mcn-#?pD)CT=ju3i=oF`4dMpnAa-8`4!ETo$ z4eQ^?IQH2PCtvr*$ycv9`eel^ui`lI+!?2ypNi9Oyd6i+8FBKpAPzq%j-J=YiT{B( zdgjH6rz%dld=tkG)8ojmj>E5r6VItQ<~JL1Hj6Q^EX9LEmt$BE~|IC|b2N1q?i5YIQS@W!#{!8m#*#^Hy>splzi z_+4?*ZH%Mmwm9}58z;YC#j)qcIQCp0hwm0A{`cbOe=rVT6es?SIOVt~j-AWm*z*r@ z()}@x-DsJ4zWVTL9J^f>Cw?VPzUIb}x5v?^IZnR5ierbr$EhbT#Yxu_C*Aksl<%!^ z>{Ap+pK)>Q_FSBNJrGBqsd4zf#L@G;IQl#qC*9ZLl-KS!@hfrS9~LK`2jkdnP@MQT z#VN-J;*{g!IOz_FBY!MTy0vlQSsus!HF4xO#Nl_v$=Af{CQiD} zIOTFfoO-(V z%$zxQetFrgsHccnUUv>&nrW!W&RS1te~`Xc0u7i z!qmJn#8u|@m(MqY=a(#E$xKH2Mj~U2{F94HiwgZEMkuUFPsc-BcajdWebq2wt{38 zsdN%b6-GzRoH_vt7zK{h+srwssIojzQCKv-psZkSQAG#iu}aCbZ_CfhIpbb@&F9rdYrQ_K2u^V5V=66#i{W znKhh`m#UgDwb)Na&0XY2gQ~m@)+WkRQLqq6jxH@h&s6Lu4f4w76fGiv3VhF)fd9({>8+cc5bME8%c)C1lq9XU5}l$n_&XgZZ7Y54qivcB?4 z^cm%4Oulknfv<=QSjdJMjwqNjXJ%pfoFZR2>#5q4s6^s(N-Fe5!37|`5IrW^!pzd5 z1*q1P0l%IHBl^lRANqWMvEU2%3k7tu6&R)vu(D*1P)Nl^S@V~mSD#6PByi!pduA3F zl#~j^)Kj8oF7u&l_7_%Se3}iN?-5{}IRT$Azi9sa@&!c%{pH2_qg1F|41MMch}E|+ zfJBPRD_Dq9^xrdQ7WxknqD4i83w*-N zqD5#Aq=_(J_n0{o=LChus6M}-qztKJ0#HFZ70#=myezI5FI&|cK^g@gf6c!d%l1NE;p}&+2hqkhy*obIhL5bf7 zwGo1H%Y>b#W_Ufeb_qUiGqfpdXEB=Tnqk^w(Bl>@Qo2^Ul&Ps1GarWy=S_U-W~%KnR;D91 zqBLXm-=VE&0hxq$;0m%x=EEWt1RndiCY{MvVy&JQ!rc}+gu;Bzee-roBBT(TMhXf3xC?+Web1K z;PWkfLYf}`R14q9;AdI*t_DBP!uK$EpM~#f@QW;biosV|_%wrGW8p6~_! z-fQqJ7CztLPg?jX1}{wOSl^}^e3FHqX7CORKg;0LEPSECr(5{B20zfk-)->u7Cw8g z-mYg^_z(8z{5%W){Z~5gv+(~k_%#-O)t9<_O&or`g>QIYm)~UJfBC1*hb?^an>ycO z;kz~Je7bSJ#O$w%KG*py3;(>q53}%}(?$yZWDD;z_<=y|Yw#@=ew@KO?(V4n1cT4A@V6O!zJcg!`mu?qpf`!A3m!7JjI~`z-u$gRimhqYS>*!si)$ z*uv)X6&>|A$CoS%Z;mhd7Tz3Rd=}muUurD8Ilk0dcyoLSTX=JPX|eF;_~NMSsJ}VB zWLfxP!=CvTzR0w{g*WGiH5T5SAJ$rUbAA}M@aFum#loBO7Kgv1{^qR4I zzuDlkEc{r5&$sXs4c=$r?=bip3qRf9Yb|_{!G|sUe1mVX@BxE&Ea|BKGK0^u@Iiym zxA3aL`z-t)4Zg<0|JmScE&K}xAGYu>8GMU{f8F36_jT0&9fQxZ@bw0tZ{c?uywAda zYVb7{{wss8wea5?eAvSOZ161>{;W;=2$@2J07&$BGNSr79qyjf3t7Tzq!8VhgQxz@s)<679lo8wE1g*W?o$BK^n zoBeH;g*W@dd<$>(S3V1G_9rzK-fZu+7T#=+VGD1zmlg|e)@Pxrqy9JdHL!&rYw!*W zKhfaREc_h?pKjr28vH;DKiA;1EPT1a53}$K4L--huP}Jo!ml>?d<*}u!B4gDPZ<0x z3;(Ra&$IA?#pyy+HxuOUCs z!tY7Z<+Ch&QmW49TX^L`w(Jso7XD3xud(p&8GNmU|IpyW7JkTwdi*VMc!$!_Zr||7VUj?@QvEDtmvj&1;sf53Yp@x=Z&-;&@yE zZToX@Jg)e*{iSg{u7pLU(fLua{LC4@6GYG9G}MVn>hX=j<4hRi#dJ=$6vznVUFit)ZN4J^lqp5 z*Ua&knIxVX$M@y<7LHHn_>&ypkK=`c_WFN0$0u?86&&y2_zaFufd<8LrYJlAu)@hJo5yMg0}aq_hs@8tMR z9DftX*Kz!Cj^DxYE{+d#{78=9!|^wBd^5+pIbP%VQ5@gG@uNBZB*%L=UYOlp|8qG$ ziQ~s`yo2M%a(o)c%N(E1@p&9SkmJX3d=|&w!tuj6-plbh96z4pWsaY~@%bE2?-HAT zQ#n50B=MZZ@wamPJdU5l@ji~9%<+pjehSA|ar|u@zlP&)=lB|qzk}n~ar{({U(fM> z;P?$3Z+r@c`POp0akY!_n>cPv`g@96y8O!yHfV9-DuAIDVE%;@Qmc1stz& z{A`YI;rK$1KgscPI9@1hum43HpTzOS9Pi-xxg4Ly@$)!7o#RV5ejvx+&GA_re-FnG zjJ&*Av_94~Wx8OP^yd^yKY<#->*&*J!dIes3;S8%+K<10CS5y$&EzKY`m9KVL+ z7jS$H$1mjgbsWEl&yJisOYj?e)K!u2iQ}K)_&SdN z3&-!^_-8pj%<=0vehe!|+pt zI}xs8_))^t{X~2WKS(%<@GOS!C)|Z_KEq20cO{&|a0TIRgtHjFn{ao+=?u>%oJ`ok z@STKv5EdAoL|7u+at=iQafBU&n;9NOn6{=OVTNxa+>3A>!`BhMfN(9tR}oGjyq@99 z38xaSVfbRg7ZR>wxEJBxgnbNmC7ech7Q+dIFCv`J@aZ1F7Zc85_$Xo8Vv1xje2_40 zEk)89K0vq+VF$x|313E7V0bs-zJy!OQvN?AoKCoz;cbNb5e_rFnegR=>ll86@D+q> z8Ge~?2I2J#KTo(n;TndYB77y`Duy2=Jbmq-@F2MLcLoX+q8!Y;xNhW8R4NmyWbH{qKJx13?+PdJBgGsD{my9tLG z-b{ED;W~!jAUv9IEyFJp_7Gmr@biRo3D+?E6yY(1s~CQi@L0k=h94v>6Q0HJ{e<%f z=QF&7@HoOb3|A1og>V+bcN6v!PG@*F;qinW4Btt30%3vSNrWd7ZaK}$pKw0mW`;)* zzLjv8;hP9gB3#Gtb%ZAqu4VWt!cz#ZXZUi$w-K&k_+rAh6Ru*o7vVby`xx#@cq-vp z3?~r&1L1szPj?5tlW-2hM+wtbMI?*igM_CMPG|T4;pv1O4DTg8gRsExZo)GOx13_- zPk0vLW`?&BE+8Cccr)SIgzFf7gK#0?T83XHJcsalhMy-~M7W0GrwA7lu44F6!gC4x z7=Dm24M34u4Bt<|?kq;YEaJF`PhnG2wiMPj>@eLO6%vql9Ux9?4?(AmOEi(-}TMco|^_!+QxY zCoC|$oA3(4Ehkv{6RslM%x_$c8&6V77zAmOJ8 zr!#zj@H2!R4DTiU7s3L=y9qx_xaBx2f5PhtH#5AA@N=kr{oT)8?sXlxk_FXgjnhz(I)&>e2vtXstn#U3%N40Fi#DMm(#;} z(w~Z{>mj>7b?p*smiktaT!Zn1{Hbe6KKm#=GSA6Mi(G%`X1V@kqHJrFcb)U6AcD7y z2$EvW#Zq5Sdw9~X%Jn|N3W4iylY_2DAt}hpkN#v?b^X)@bK}%1P+B2u(jIM-W`G&VsNov#Il0 zSaLJ{Y)U}xR-Pt)K_5IpNl(;C8|&m?U1EdUJ9v76|iZkf(E+$F}21_lZ+-;qGy& zr!!Uv_OM*IOIE&=>wmJhda{n&0_oK|mtQK|TH5m%T-1^t=pqL-M=)Xw98q>ORL2(m zK^0S=Kqx=vJSj~$UER7UM->wcrbU`?)Ol`cu3Y$)9I{hG5Ku}X?{zl0et&|jrshGg z$(}%2LLTk1b4MW3u!ZEJO))pC0~sBXe(gp25Dn*f5g#RpWx3? zQ?GPdtZt@$N>+Snva%?>AsDmyZ4HR2DW77xAMGPfOmcUr zXYxgeO;!*%uO2T)pv7-=KKa&D4u(-(i+dh2&Mma>UCO(g0`6ibR;wc}_Vg zc^jqi=afbz`zHt~t{?E*pl5!cZu_qpGTbQQ7FFyEA!p;VJ<184-lmF=fvS!zFH@5{ zk>`%eiAeV~IHTQyhi$+&SI7LrLq41H6Dha?`YCmJp_D46g=uhpx zo87si;;@?i>O|z?_Ly^$a49KpKwM_EnIrIf^Algasu2H>@Q;?CURwKd80KLdQ4_YRb0 zE5^J{DD)V)rM|Fuy|>>^Ik+?3+pk_$cF0N(S-Cw)4mLVu=ea<0gZmEm?e5#$Q*N7# zW%xi@S(=fQr?k42&sA~51k|*XHh)_1WP-HHhK7%I`M|rTyQjIQyJxs(qAFy+2N^W% zKOoO$!|vV-6{{yzERX8x-J=%saZ{)j14IPxaMWEEN~eRGv- zWTiACjXYVzYL;8=p&awr{=F#4*(VjMuJ~83@}t}Kv9x9gY~*nc{(U_3Uz-7-x_*N@ zWbgariJ0%NN8iK9}$?D96_1vO={<=Qv^qzQtwXm3MuYEULkE1 zvX4xjMka4jJxR!4E0vg>I5gZkMzl$*-a?i4D2KIg(0w}hNNfKKSPmuokcv8Ioo@35A(GJwuRGRIdLKNnIWG zsLO;+WW-$5=rj*%jq3XAl`!N^42x}sY|RzzQuVt~zzM5K)fdABBd>aiR8qYeX`bOu zY1N;BA~7sSt9MIlXslMnCNJxTWOW)$p9p^K_wZLos^Uw!kF!Y%{Rg=*58LuM>P>>k_CZe^s} z37*cTrB6lfq!g)AHBr_DbtIBcL-N%zY3)e({f}x;T@86U$Nu+f{ETI)u10li#j}w; zfUGekse@;{m$+Y~W}Niexoa<@rb zVM<&Mha9SO$f5hXZ>E;6Iguh5jNbR9Y^GsK8vrJFHo-q!bw$Ua$SW|Dc8cG^xxAAi zevYT=+DjgPfX8t0BRE$`s(1`f7*Y{8!$Es+cTLBD^A3QT`YwK*VZVRb3^n-$xRvA( z@yXBP7di7Y>VEvTX?!mL%af0Z@EWhi%C@7%0WgsX)C`lyv#74cubS+{Z*)E4Pa!B? zN582V_-#w2GXP7a6O&+aspM{xh~ya(8XO%h7efQ=sK>8hB8^n}u_>wc@D|qRg>r1( zPd_ED-=N*bejr0z;5CER6)r%Rm+owcwqyZ(Tqet%Mz4?SJBDdA*LwrIWbA!0xI zGK>B7{$}hqnz55xqxGM38_L0@>udhHuoN|aFX|Tz| zpTSpt1Sv=pQEB7SJ_6>Yd8$35)sv4bgoClJ{>y{0WdE>W>=OTN%4x512sQ6dh(oV= zmq457TTu3XQ0>Zkm6%p_1YS?UYizSfBa2X`G*9Uu;Z;s(qsjM9=9@hL zzFWIeMxQ}O+sm3w3Yt36GC@|ta`op0O>+W|7Fw&uF0_jX4%AdzT99ohpiF+q<-Sd8e7&8{bVNcMG{+ zHUjOb?98kf9p_e(WaT@r(xmOB;#KxUZ)7sjEWUE}73%kQ3Ldz*%Py=8Y_hYZ@?B|T zN@usS%N^Wb=dLe@BLdz+eo2m_E9LCtVBsDRr2yf7L?me8e^x zGXY5s`7`XSVraKgKUesLv82iid9nrRZQ0(sJ;6T#O=bAt1E{#mdgg_uWILJ?(h+&_ z%GvhV8MzRRDs>1FZL&W_*3DD9XXMdLKqj+IO;V?1*cC^6#b{{VZuesrdJrS{0ehb9 z3wKklz~XbSEV9SWMqj1bXA+r*`iKyoY{srlN3BB<+ZRrf(PJUJ|4J3=x3Bl8-rOAA zS+%D71@(tIkwoAZ1ro^hZFSUwQW8$=z8vacew7EJYl>~n1x&F9y`+yBQ(wm%EHL{I zL}q9XnluD<%l>{eE1;#Yf;sQw3+R8Cw|FpbQ7;W^$5F-9)F%)Zy5c$VIyp2i#wKaD zeX=v^pD8={Rb1f>&B?H~#8}n6*{pL-U+D z@*rL9Kp$kw!8$Iv@Sq(06}JA-9(^)6JU#GSbelFiiaCL+8`Kb%Up$#LDCK+Y91=sf zTQTxHeb%wx zr|_#KV#_M%DuYw-cWn~ygoAnY|LlfP8PH`E0q-snj5Dn&5;;q2W zlS`MW$-Ns;dFN&JU%h>zt>gr|Y}yaGt{>X-B~BJi4s2wj0ZUXg_T#W=YYD z)zsZLL-?x|4z_-dKIq)B;wkMlT15nL2HkNEknUDKaejr(h>6>ziC-xx8A`p!*{Za- zu}R~RCboLe^Eli}BMNK{%>z_XgeJ73u|t};OPP|9f_{=bKW3g9Qf~81$;hp4mDaq1 znxl%vx{t@%;=u|O1>q2+HMD$E#anbQEX^EdtPb=84!5&WdRRqh4CezN1LJ>yhq=?! z9efJweN}&NtQ~Z>M>&=_t#^uStH)lKoz|05nyux@6X&3-J+H74>#YRV9m<8Yrl!>w zI>)rgM^MFFqeli(^RZ`u5+cLM4Q&`G0?_7QDWXj^Xp7{@6HA>A%9cCWh|L=GoOZ)(E2g3)%t07h?0cctjpS{}DWWt+aY19MbAx z_{G#Jl-z*nqg-fTDcg3$npd9w9Q(0Yy~7t8Q9pH9tHhEelFJz6h?oLm=>H(Ih3rnu zL}KXwy^>q~s~x+Gtb~JQZYx9u?avrJA}0|KWTui#^V#TL3e-KAd>61S z@(nzL{U^eGF7hed@XV1OYs!%}#}n^^uadK z868ERBAA3IDF-1Eo!KUOeMix9f>awxbT)|&g(!ip9R^hT3%okvSu3wMhA+6ehU(O6#B~~&)S6KJNstwIKeFWLkt~Ayk zNhRlc%o&hc=K>{AaYCnn!eF zFncR}>{@XI=yl9!vaxxCBh4u%$ww74)mK;}8n`EMymM?EO_f2kL&Jk8X5csY8@m8XA39hTPK3U}!KG}?bSIb>l7yQhWr z)n41lSTj|YF2Uq$pin~e^B-2KGQAnIq|7N9J}L9*j4FhYGGEM~Q#L8{?-}da^UaJ}_Ixj+4$ltL#k3)H z=mDupqW#;m@RUQVGMed$w34vFo{>&2Y~LNA{ae-b1KwlR`hFLSZM8v4`_s47Tl|uw z{Z0<_Ya$zdv|q7QQHN=N{T{5+h^~F|dK|$ZgrKEU_tRnXHt6c&WP|S_)KS%SYM4zJ z}IstnEgp#CH*b5ch>R8$jN1EOLFOu?0N$${u81{<0 z%Z1oB$6!|YwOs#iyYrMRP23|VUiu~G;}w0m1zvFtX3tXf*T|b3jA9xdtvtl^TG83# zL~C8zyLGf^^LM5JAR*Az-DuC~Ivz85n;Xj~G-DWXyYz4v!KoSj@&if?vx7RR`fZF3 z?b6Zk|3$XQf`x;H8!>)izE3;9s(2a&Mb?UZOrubtcmS9(9C;B~6~8gP|3Ti!)P<2N zQ5oob5L+aaP3itr5VScQ_!axev@E$3>)<@w2hn|A42@}|JlY^?4=QShGXb=KG-Oza z?w_npqj?l+Gj@Kk57eY>`G%@oql|?|1MM8(c^@b&k&QD5`1CVq#SdJBl^Z-1r-t>vo$u+Q6YyWc|$|Pd1@yp9(XPbK`lS@p?NLi5G`l&H17`)DJeiuu){GN_ z-_az-hf+QpuXc5Zx~GNgJ>Uh2bi)t(K%eC)2_4e&hAtIwLX}7hYmYhwb35hBL~rku zLEhf{K?I8GM$DkPhe>;P@MKJ?&P55U;u#Exo=^@p+a5ty+&CazOPep4VeE&Gv~i_1 zYeSJW96zbkaM}>kfx2`EvZlL{wIP(XA(XYw=g-w{PWUVK%_En<4XUZUd zPs-Yb#u*E;=4{KF`p$Z2@4?~2LpjvHg|aVZ*+_mHkGe=ga6cxBDP3^d+?9@=vAZ(H z*j;&Y)QP2?9HW#eol;bBJftz8D(5o4!*o$OrB7K7)23v03H)^Wu=ec!SnR|%%6Dkp zHh7woy$1aNKsl@S831W#pKSd4`=T0G|H`70Jg%;wl<&0f5d-!0*lOQ`t`7aS2oEhv zwQcu#n#CHD>GR|De6w&X``jn?p;eTjRa^zHXcwbZ`2W9b46n2|2D<7L{j=(tj>J5n zu{O_e@r~h{ns*vXk&Ip<0A)5%#2ot$}W;r1#t#Hd1bHjI`Y zr%ig;jrvpltF(3(vP2d}4|8IVTlvME`7Nqd!w|~c1J>4IHvB0)+8e&N2U^DnG@GBH ziGO68x^$#tbjTwLwjG|#7PIRaAL_n)ym}ETwhe5^K1@H>Lz~~7r`Z1cb1U?%xym+A zBI>S33G4fW=H&@A59|{vm!jp@*>auDdc#K!Y%B-jU+^$jTkTz!y0iyYiF$67lZl=l zDVcldV02246i;Z*Aaop8Asm{BN7=6&(wj$^HoCIMfu{x9s_$@uKn+7P_B-g%xPeV_ zI@2)FKFLYigK)#N`Y&ljph?aWTsP7uIm5A^qPL}-s@Pxr0p-lXLbz)D75IH-({vP# zc&as{&$%&o$3Yk#EHuWWlK6(TGySvh=6ennPNUx&Ah{T@6hz?wem;0h)` znT46M(Gn5)vzun>kw>3``p!UH{YI<{lGg!7c`a$)KN*V34LK)m$e6iX1=>9()xM^@_ySys_-hiMfs6idx9O*Apc^I-Ni>}$E>CHS&>b>N1iZ>YS zwmrqt;X1m@f`7Pyf`z@Te5{JOKVpUB&QQf+%rUUZ&F&dAx!IIOy{o1A8)+@=Tj&e> z$WS=-8T#9pn5*Kh!RWNbYmtQ3i)QM<4*OxOa^Lv{`1Z;@2oRO~2g((z+%MzqonEv<^!Nw)2b)Y<7^Vx|%bQ)WXkcuVc~mPH`7tpqwnAGzNcK5fEEHhy`#@U+o}A-yvnnGA9JbQc!6Q0RjXJEohYBvcViFEK=U`Hp zr~F78`#8fwk5T&-%`o?k$5G+k@6-QDL(becUcGXB^$-3#X*axz!eSyxTied<71`rM z%WUpO93&tLRxxARd_*xmbah{Zq)HR5L$+q4;_3$fl}-~vuJBru_!b1k0M&lhp8J%n z9Oy5ry58+MPM24HK)ExAcXsu~)gSR{OVMdXKh{K8nT)~us$uNN^F*HV31%QL z@gv-c!AfFHh$Qe&(E5EGi_uBlT$Ig6u*Wz()zzo7xdeX!)gdC2xKkHD zN;O9>+mP!Di0ko}V343AC>*!q(vF*vtPf!q+O%H~3RT^uy#R|U;(nZ{W3uWWj|Npj zD>v<eio$%i$kXq_R~ z*EQfSV{(=0X5e3m?9wKvX1fxoOk8`3KZ5qe45pV(#fK(@s<^M(2FY&Pls1SuDrmWF z5Iu#U-OvVm5F7yLRa)sxdjxE)chJ44klsg{DEI}Rkm;!454QDlEm&}BA%u*CsDUiQ zl_38`nzv2z+cwEYTACuqZNytdsP_!4S_UIap2HD^*3B5F2ij<4q~87-!1aJ|%aUii z7e|>`u3#xFV+c)$(l86QO!Ab*$X$Bi3SHXY&8wWINR)7NXP$C6`hm6ynK<9Lpo$aF zsEZXl#xI$9-C-}{}>e$XNOnn8YLMklv@zLb^!K9G)WC^<)rF*lNxHwCawJ^vPy?* zUd;c&;qI#os+udWpbz|U4IarT< zjZ=Zcp;0!9+l@m9xAT{PaSGgxwa|u5R5huWZwR{f_s6cbwDy#dALR_}^9eX?fZqd6 z&NF59(v(@B=PNrBJtI?SBL3uwQ#fN}^TTMaatK4($W-ntACSObunv2uC z_7jVdI8FMTwvxmt5XAfq+Z)Ad_ALa?*_OWpUA~9AO_v;Yyk7VLCXH8sm(?jfvAvdp zq8(=sjlsQ9?0JQjCZx2_AYq^C@1$zFJ#L!lm&gntW`%}UaXI3#OVyYf=*M=Q(K|0y zlRw8*7>}C#1s=*LgR`s0j_fh1(t& zNs}-2MqK>ORK<~?aCLe@OJ<8A4gomvogURRifU?GRNqOjWuHc6j{b`+O!V&E?)+JCLf?*?A1Bz-O6^4G(LiRc%Yox(zHbJUbr$fOzxgM;VOVz zNuAjyE`=^db#)$+CLVVyCxWgV_+SVAS(McH!sD1z+u2@PR8}ImkAd+v`$RQs-t%JS zV0Z{EKe8Sj@cEY)bbpv#4*2PE+#Jk97xx7mIJMf7r;f;=+a%5ChP8o5>9&(S1O9Kp zAFXgtuA-^QNl*y)n|iWGYA-yrA*lP&S3JroTuNO&E3a@nRY~-I-ohia2w)25Dc^b% z`~Mj+Q7T^LoYr)tErC^f0%JuX7sa{+vBD6n)uJT6f;1YYbKmmI#uxsE z;9EdU2#sjT3*IdFpLh28EAWa>qJM1?zlDqbl)<~<8b0_T{4N_L7w*Hxb0Rhq5cqXa zP$*6FHKJoczXY2n;mE!K{EF|rg=fcwhMuK3&@)$q(>ArBk}2Y1xK(jDex2Kw&yWjo zDtIX!KS8xa?##wK+m~cg-J0Ve#WMZG&uyl3>KvKU%yTiLQs?5KJwS63XhN3U3>8=x z1{H21&um?VYv9IYth=}H-+A>vBw!K_0n%Gb(FJZJfz&^vK{@v>#pWuSffxc(1_$wr z>j^*L5egWKjaC}HvyX$qy;b~b+tA*$muQH#EVK%7HSy9l6kjIpKZV=Z(b!S`!#2pP zse2It*2lpp-q_e%DF%lN{-dhs{R(yr*@Ir&0ofUrf+grf&R_ZU_i&m7DnB(fMGsfw zRSw9Bsml>Jf>-R1WFkCG{3l~?39S$}RbTFF6W+N9f!L6Oc{SU0IJ32CBs!3^pQz}9 zv^Cijq}g&9{ej#R^ub9*$HH*>)F2}Th)~80DCCc8W=XP(q6++oE8QMU_aDVcpEma} zdTjkpKDt4@uPdKP@-#s6eUYr3>98spHl!{X>$?Eg30L^94~?xdPP9+zwqZQ)q6sr?_n zChaMz>Ul6a^0OGtPN~N#gN^=DF8bl7h!=ix;c;4|bk};*+GZ@6(B!J%X(U!mzG|O^ z7o%hfe?@&7L^C)wdj=8CmWqk;ChT$0-wL`Ecm++rhH(qA6TMi`$ozuR){2*8`cMR_ zs|Oz1u3xCGhzUfo1(Wi z=zG!HeV8Oi-X@Rib-;S{C?@iGkoAWXgFoA}Je(0nuuMZyt%Z=o-&wmO4I5tfX=O!t z_+ij%p~^eAK*XrpU!iKNVgaOs&0hp}V0Y;@xFbD~Z``}xBtbHBk0Qz-qr=tYOYu}w zd*K&j(HRV0TW^Mhwht>#M7|q2u|^*3Pye5qXwb#}H#SoBo0vK`iFR=G7oqni^sG}~ z9^HjqwKowh`qX`RG}&uNF1i^d_11A19A)joT`w#Q*y@b%7;FzlpOiM9(H@T?hR0R$ zj|hp{u-}H4OQcmd;U4yeguu-kP^%xrjaTwXax0%o)$4#ZpgwEF?h8%cS9RJet^TAt zRlePrf30AZFXa*0_F?P*TJbSfjH7HQQH?p1_ovx}HJA1bMstE^MlR?syUtO~eISgQ z(C?yM*aL>t2XiSihMmMT|^rESTDs0L>$$_IS zWz`?M!{rXfhD+77vry%{Y12)J+b!ibQKMtCP$eR5w5<^@U`DzZnx}5UZ3T3?uT#x; zeklbXL&cId=GoRH9|jfF(ns7Tt?rMQ=`F-isJI+@7*kWt0^5nwZoFc|VCZmX`_OjSyn zfcH)2!6)c?3z6f#%54-oZ4yrci~AK|wXHbmQAIZhIuA>w|G#H--HHQ|Ocrq_gSzqh zz?~>wk3e|iEBjgsoPbGmgkG{x#TW{)x=xoo2Dj?!0*OpWl6|y2s5g->nB*6nD?9C9&Gz1?Y!5|Y1GC}{Gz`A0oo`Ifv>hgNU~O9R%&g670ok z)(LLb6_b6mmhBMwm28^&>xHn$Zdl|CC3QdCs`x!IhK)XhJ5&)vNUbmB6SVMtHTyXzp^6ufDk#Mxs_P**wZ7Ob zRmE!ZOFl-SBX|Q+3QeHsvVQ`B*BJ3Cq;B}5RAaAaDNRNQq_m=snk~bL_)oU>HXwGmzS3PhsbJ*Vh3*itKtsalc7vqLwo&WC_}Zx zXNM6;6-VhoDMRnVsZF4O4>N(+fJw0z@YE9?LZ0*{l$!l0NL94smzhKN?@9iX;9un$ zk5tjXa+z>0Ky@o@eq70R!mYXr5m3wf9^zLpi7PmX-b}(x5+kW4D4e_>~^scLHx=xq349F1R&2g=~UL+Tz+q;>iLcKqvAJ0JEj`8prLkN!>!ePhmdzuNbzn8X;iow6f%1elA_PSl?j(4`UG5k;YyE&;G*p0M1#dE zlkx6>P$fhHXpzOi{%4Wm?~!>rXaP7Axl0HC1~|c9hJ)Cb0EZ)V77efy;Cpr`1@Iog z*2n^cz;K2;+=t9fioEwxX??VDI~)?&W59$5FW~tn z22Xa9st2^iF3M!F>b~zo6Yp@DsqQQ};^Mw^DEG+U`J+eEtX4=2pD{zlalj z)tRyW9#v;@0_DN}dy(4KDC*iSIC7%Xr7gIUf=qmh0|o7>O~@~HsIlpgx()uQ>~DjY zGk3ssTt(~cz7j{i$B@dJha7mfM2KFh&=Jo?epV1S{fbDozl%;=tU5EyFExp!h=u+l z{h9uh(lO0IQlK#SyGPTRBvl8#I)a0cGx``K7Gy7pU~d)HaJ|YhV-)6 zJ<1upKfnU+jPA$PV?}fzvdB(sDg}3>WBo(uU50WL@i$0DUIn5#`+@IajP(pO1hrB{ z{EmF76-gUE3mzP(r0xO{+>xY+?~zXcqN?~OIERZb;MacvMmN<}1*dk$7Q~f~psdeP zT`Pzz`Wj?6kb3D{`7Pk@R80$0Z-GB12Yx(^g+}B6tDZN2QC&Is#m7OA07|egfYyp? z9N7vHy;JK)an({>YMxVrR?I=vTr3z-%>(AOd zAW}lHQpMHPTteJ!Z5(((D<;kjP7f9#Wv(O0s@-0KR{(CnYTyz)wP~31M|zU$CMX4S zvKJ|ZR?k#h&ZcV+qvX+Yq>Ud_J*i;zq*v5zu0k2$T4 zHb3?u-U4TnsN+@7u?K#!0cqRitd|}d0cBLznPj3)CW;H-=RCRm zo>p-+TzGFg7yi15uG)*T31$BaqIkui1m5Ot*Y?|m{PzwL#les{&ntUSS%QzLvYIRc zsi~v`;{O2;tV?%dTBr2s3m>eO@bLv&)q9j!qU&?`4|k0tEgnjOa#hJY;kHGd!Um9b zk~+!tD7500+f`MQ*O-;QBo`X`Kz%M?_F<~3#05FLFsP?%ZzaHhdZ6B=jDBS;(b#8~u z`K*J_)2OMhBhk!*^fd+;L@qqWzWadB{1kpn_d#(wl%zfQ1~m)^VhP=b2^I>Q&Wj^o zzC^=1~&)M;>~?HZ7=fQVMj78k6wNG&8>Xd zVPg^(VQ{=9Q0}w@WgEU3)Zvpg$)k`~aH%a#2wap~{e!f&3T4f<_w^0O2s^PtL4@p+ z$RJG~h~iJX6XRj@V~=tmb1&r>J8LMYGhW+aHWgL2;}*tZ+OKQB@gh|}gMjSf1poG1 zuq6ivy!Nd#DAsic5o?Nmyigy?KS3`fi@}r0fv<7WZ`T&X+ZJ^@zg_-ft2hXn=SbCy zQO)JT2HaN0RX~c#qnyRQr2i8nZpWVHf=$7bEByZq<%>KKGmA;S;gJ&MasQ%24aM`d!@icht;lHE#;5J21Tq{5}uhPeYi@<8D zYEiz!G}miv1j5|m-h0jN{B7*ND~*ZSw;~E9`xce}QijaUh+U(vda9{IL1%7LQm@9d zdiM$u8M~{2?2E~@t2b#88ahl{i|C_2n73N-b_NDUY*n3=mE&C5ugajFZAcwXc=41& zPiIt7deyCg)ChIy+E<81#g4UIszx)y)Q&!ywF*9PV`@VW+9!AJ3AD(eRT))8gdWRa zvGM-f0xft?-j3Srz8SCO<<-}p?8LT4G`3D|Y@!XBX0#FYv_xJby8Xz0=dyIHEKlURW4bOgW(sD8g0WGot|^$3A|Q6~6-j8mTmyvB)i90;v^jd5+$ zJQjXsTlmfhAKl_sS}i%F*Uny=?*^)*yw zaW|Fhq8IZwFn;6)s#tr_Vmgcf^SH+E$(TB%P8FX=`?0p6+W37ya7R3yG8=8HSm~TTXAuFq?^&lGU4xwrowmefsj2h&H;@AKW zS+RdDZE*xo5BCqI_hC?tucB`|=p6bJ+-SoUlEwrCn2eL!GY)@OT9gGazTUbNCQy7_nj3lE$Dph=dBIIuXO z?a~Q0!mjaTboNMFaAV%9}_&vp)M_J65Um?nBS>{>rdiKdguwJWOT-iuSo@kHBzq&{=BD+iyCMGfSJ0}yKnb$arth9(J$d*n@ULCb72E(BGH*2s9IZT^ zPAgHZFdtI=_H?!fLY+Van<$ZoDX@Mc18+&C)7bX$&D1&guWb*8D@As^N=eP!(kmS~nCtO~6o!okY}+A}eeE1d&{g%VsaYq|>@}#t zx+2ydDb}N>K(7O>J$(bLzLx2korhrh*KM|y)qXz$ZD@v&nR0?;Qip4uKp{7XOjIm?YqQ3U7;P86~#=? zJ>Qsm&OqmYZ#t>T+d;K|ya!XLT!?C0QHs%(@cygSdk}fAhj(Nqb-ZfwDyu{fl2}d> zE?r_aNuc*@t53P;)wO9PQ4Q9;6+g(5xa15vn3*f)jF`T{HzMC(I%2xC>SGMqNTe@C z!Jni2JQq=1geasfsiP1Md5nNUS^T!w%;OSx<8w(j!5b~P63VMGP_R3YR`O)1HR55CcrKLGz)kI*c>)rt2Ti zVM(aE*5RRwkK-33OLr|ck_BJY74=JX-3J;Uj9Zg{qQ_Y>swtK`c%^LoX~i{@1)NS2 znDiZl=4$HOBrz_A!?p4C-cafWKt;R>B3Pc?jEA{Aqn(1G_%h;8_VKFsI(mJM0lXx8 z9bSL3_oO${#;Tr#G}*R`){Ab{+tp#i{kb~x{+zia)4zdd#|zbmZHnt7O0XqSd>2nn z*t}i^Vd?E0dvSlkUW~I8ckqiCZbl_Qm@S;%L>}->kyg}TPi7--Wa2WO^2PYVAKs;M ziH>0vA(8+qvt}N-7%qG&3j^j>R_RlxAtp16^t}c4fmVEPVTeQdf;zf9=ePbzXd?pT zupC<#947d;=<{&YugfU3`RZhjzHZ)*$Y&#R;{xLd+zvgW?A=28Xfs@>EK8vS!XALk z`B#S-@L{V%e;#fby$pmo1%4IrdHiaZVRTbne}vQHj0L)*nss-IYXJS-a4(M}s%iYQ z+&WS|rAwyxBBS|cl#G`;aWyr00z#M^zVC()YGCLx-p6!@>|NU5H1n#Le(6!gix5C{ zb;EDS?rirpZ>lBQzm(N{T;0TR$P6@wTiuiM3U{z75%YITa>s^tlNEd{a~oX&I;{P3 zB-1rL(i3K3_YebUWE%bd1K0(i_UoSQF5~;ZE3?-^33?H#K^>bjNX$Whw&+59uZL7a zmBwyKJ#M^}02)_ikEmlkgTypLE~lfMi<84UR=WY|Zxb4l&=6cPFu{-Q`E;=Cwn%T1 zRz(Nl=5x_Q!TxqQ&*|52gBW0Yto-Tlv-ou3IsG#<9d9xvDaX}``5txQ6nF5PxbOlx z$_b_3vjDa*=S%u~S$A4&b}8Sh`_FqRrokF8Bz$ zB8z)bbcMSq!at@GC?Rb0r=p&h*Va$aI9Dcy4 z;p#mSzx}bsCzgdi1n<7_2!Gke#cF2RD;YPupYGlI?U`GTozZKXwED6w4?px!Zw90u z|I1syIiuI^`u15-d;I%)?S7hQR%zMpd7(?rxHuvy4ZYJ8b0BetVPXn?d`IH4k5{6A*RS4}*vFw9 z>_^>|1EdfGx)8noTa&JZsXwc#pL#eyPlosOk#xqMghprDN}t~T>}vcaHyGUM&+rX4&xsLjmP zsC-Z|GBvfA@#k$RaqQd0BX9w=vnwmQC{?_8|*^>#_sz5D=POHQcp z#&nwqTF*ixt%-Tl83kXl3L0bmQOejOsDp^0+|CPwHrvS zl&qf~?XD|8IAz8>5!sQXp{} ziu(7(xUS|dV=J5PGnW#|iTXz7W6QVrcd{exD>d#>ohaBgqw0sHu+KpvZi`9Gg*`jt zjmrlpp`*Eraiu9??y+&H1i}Rc5>E#sy}=XTvjEE*Wej{j#V^rK#H6(oZrARIM8wfA z(PyW-{u3bv;y&Xxmy^H!4LP!koa6si-jobv{)s5TLo2ZbH7Q-5j^rc_5h4rXTlG0P{*Uw#(9fwfBI z0saG9gRwfCvh{sh)QqH5sS*pqs>C4jM+LlFflLn|co|t~cptlB@%Hs|VofVbLQ|dt zej!a_`6rOo*P#M^vuMwXCF=Et9JB~@8=x?>v8Y$o7ontil)fBnZXYJB8i)x;ZXvgk zAPWAdK;~6|;9HohVWK1z_x@@r^KX?k)nkEsW!~MSXrZHurqI_5`g^evFEM}N?(M1| zr(d`)aNU6baC^SUcK80*7w)NBxm=qj2(i!Z?58LJsV@{No?i;JLKJxFcBH9QdRI^6 zL~Surk$i#6i^MP77r8D+h(mI#61$4T*&;EBe!;ju>)s)_;w$6k?UOIC!cAleC6)k! z1%HChQ-@FFO*w1nUiO;C$eW~rw7HsVqHujmVan`(;mukahhhl#2R}CMo5(=L8(8E) zV6w2@D=dM_QiAPtAXx@AuHf6KHhufVjab48hH|7))PF8>wJXn2I~$jB!_vOE#2D8i zxe25o@^wPNd?c}VNU>k_GULF{L^af5t%niAW$D31I7w?V%Cwv-Wthsyh8!`#K%|aNfE?^3hhH$d32vr+d;KFliqy#4y+}uyK=da*xIL>v#umL3*ItlgG<#?fLEij~kdvOS(NJ z-CZM-B@_kaTXkY4|*g0yqKSs2;S)}>5dfm^;(S!9l zQTm-)@7JIEN48PrE8dHj=bMLm?~C+W`!pgB9QrKy$&JifrCBt-BDe2yD-QzpH>3Y4 z7GR={|3EK;Dk4UU8 zWK|y^-kRY1h2I5+-<|#M(wNH{1YYa3zYFQ)@ju zY&q)gfOgIrwRCu2cir#lBZCjBLgzhV)})g`9Cas@C&iY!&*?jUE~9}JeZf(R*(9PK z!n_yUfO(i!q=Jzuy_#Dhkw_RFgfA(Uw9`)eRM=#{(X))NgB|b-)Sl&&5i6dCgj`LZ zkkB<38jN_fm9UEc*?TXPnY421&sB~ zq-JAXcLQ6;Sa7tBH-yHa&EXMqMAP?(Io9j8a^LZY=S#%h$0J5HM?6C!?qQ8hBHpee zo_joECy7WrJH_492c6onSYWcF-l2_v=-q?xHG60`muyKck9+6eU`m{$3(+6v!tV+rII)0p0{O}BrN~8>SEmE-lCF>-^Y>S`zeLx zY%llA3$hzw^t=AbU-z26f0vuSxAB+$Hku^y%OXG64X75O)QbKw`D#dQE}M zO~SQWd16j&bM4gF-@zZ;MpgoGUNC{gKk!#oAl*&v{T$<{%`a_9>CYmg%|@}8t6tdC zPLjWwQG)Nt?nu25!unJCP}i3YEF+v0NIU|}m@X1oDhhcDgkewK;lFRn>fIHy7+LI*q4uRT3DH~%DQu}R!FLC1uD&+B<#P*`ow$vUxR=edy|46TD50q;x z(`TNU=TH2}MiuR?18F}TRz-Ul5PaD$X|pulBx-4Yn?F z9!?=AN_N_Q)IE&}N(ai4vEb#@jm87PyQLAgB2stx(@r?bY$$-}7ICwr5tB7WNT&N! zHIEaF@)2hr*wgZ*SlmGH69(>#qA|`%WQYSQ0wePSC)Iw_)>j<3tiXS)eo?6Q$9C>( z#!<4h-?;PJ_K90+4|4$hk({WlJSwZh6=TE6wCXGSi*RbmuX{Ok7=9X1?NS#pbpm zv%o)+WD?oP1Tb#GAxR@~pn&?c zht5+ecH=HM@<~Z?7u&+#3tmiv&aNLloE5Wd_n2L5h@<~&uk1F){~G(I$GrMMcKs;m zyb(2Kr>66DvCn189IK)U;!so2o1J)SZA#5I`o4al8VmMG0@+olo8%9>!G_&{dXr>N zg8w7C=au+UK2Eykn+>)Jbs(-V^h<4PEhkN{AXo=7d&T! zD(<>%+yq>|M*>n`5nXudA(=(P^cL!CMVr-6(dzG!D5!ijxa#NMk~cs}-7@_nu_&xhXq zx9HJGeOlkqs?JVDUhourm>O$m2Y5~I*cp6S;8@q15o38WlHBMLkj@9feEp5%xI8IY zwtaaT&ZTL-*tT*{cBFM(cuT0We|K?ii641rgsEnJ^%<_g1c!rL$SwQ01v$~J}0hS82b&HeUY$_fPD-f zTjCu{jV%=HovbZ3Ug51@9JP~UFZ^$LdwsjPomlpiD^Z>1`9YKGa~|nL`A$@8g8zo* zE%LD<=3c|DHy((^=%q#$j+50vkxj0xiod;=M(UxxZkH&Ee8v^Xq)AI;$??{pOFq74 z_}0TGotF5`WHplPqyFaS&oxslc0P+4{0(_H>paLS_M5F-Nj7>ddm!i5yRd3M@rG{+(+u9i8jry)ZK1HNzhU!T1h$*=UzVB76+>V;t zg49(=ej)uHk~V91txh{pCzop25RJg#JiMn2U+p?~Y@|~90}L6w8xL4}S-Mr@Wp^0^J%R9$)>Ccx6MSEKp}@3_fLek5;0hz%uigTiz z2NC6)j8$uKb25`boOVjRjmE zy~)Vo5zN<+snWiAo!x(S!iK6g;TJ9k`*ae5Y`^e6+`)wiZFpO%M;`5ueJMOdy$L4q zj_hTv^?*?;kJmklR zIY-~s7lg;BAJlKA+oRYsXJfPAbNi@c8EnRb1)ks97dK|`x_bC$5yn)P52nXjdy4NK~ z6lHp9(ZS&qN+5HuFkC|+GAL`7whN>@iU=gmmk|D6xVqb7%(1T?r;FgZPRnddfxLR~ zMAt3*CEJMzF&30;4^$SE0y>pBkgSi8bsy_2c^8U6S zEjBJf_W;vo1}apVZQipJ50V@^QOs~ljaS&A@jR3lp)eFtgO%rHurg_a3>Kzt-4snS z44mQ$Krmw6T|L@+w(A-t$R4+ufzR1-i^HU_pn6f9+ei@sU5tP%_btz5xz~Tfcg7Qk z6T#gf(W~NBc1?13=+;L>lbgHWlzPfq<9oq!g49!#A@=UAYb7`=Dx!f_pSlq%b z&yfW@EQb2>{P%S_W%u&77+&5o3S{O=GBj$2#sx_{sLD%X<0b4*Wx>yjF~M@$I&&eq z#E#5rWm@57=+TK~xSN@VvMFo}vKj}-QZ`5iAo^{fr*-_#g4Zup@f-J;{dMerRQttF z_h!tCt@%7VP?OII*j>mPb^4IE{<2P?i3yE!as%_}B7O+f4B~xAl$LXb_&C9f{%y++ z$>uz|kk}p;N#lJv$*V)ecN7B{n$@9^?E1uddI>B%CebP;;Bjw8#EoR?JW ze~0Q-z?Q2yIsW3L@@)V24bxm&&ze5}6n=WE_a&pEW5W~-ZeE$m%zVwpW(!u#3-4#m zyk~=zDwkb9j5iLF%7dFI93EtV8c{ziS)m>R#dimnPa;hS1w5zE;WGtw|71Ny?PD3$ zu#q7MkNsS)^r!f4hL1;w`%u0hDHZhPNm+zxv4k;{GFL+F5C%)H=eg!lZ_KT#u*8f<-MvS|%Iv*#ta!mbyWP+3G3I5*MM7~>0yf?u zdoD`--u8Bk_7WqtMT}P{ke7+USeG?{FWfV>nMm;_QnbXeh{HX_I&H5wU&5cTgc&3w zq>g)fdyH1WNPPR*xi}hXoQ$Qet{aF|2NUkPUni}%B$zg3KGxUAXDSZTx*s#ue>r9tuaf{m%(Wo##mdO2-`O8LndD zyKg+7I-?qtw{~$db*Nt5s|u5iZ_rKM8(5MOOj)2_fDCTDMEoC1#f z@&=cnEDerE$X6zHbxWqYd5a2AOZJS$B!2oYQS)T4KY@g3B7CW>)Sus8g|Z06*KUo% zKecb@{)4FhoHwu_MVaL(sX}3fd8ArpFS+4dDqQUr4vq|nXkJ9*r3-AZoV(!SzX+3S z31Rhttl%}o;^pTo@}t+{4&!H}KVUVMr&$e+2+JccQ{}6WGjsf(c{~3&n2|J!x4S3-sd=&P4J;PP93V`?mKG)#-lnA+Z5cNJU7^bSC2^7vKXsk#1x*}b+LPtsjCSLzK24|es~d6O5< z{BPz_d3d+(Xz)W1g?vDJjO?bIwl11@8N#L2pW7gWz?)Sv7w)Em$vf#yL}jd+jt z?0l386E==&VRd(%9FC+dpG`YaXV3><634+DL^ta1UXnYRP=eCasfo-270P~PzBY4$ zJnQjY&ii!P*cP8SLV()hd%&Bqy_$80H}Qq-Ul3wijRKiXL<;@~cg654fjIGYoEX=4 z!jZAPYB!san+Q{Y*YH;tMtzSNcgR39?X`gd`nElX!S4_rz3+ij))=1kBp_Km%J#d~ zf^6I6LJA^XYNBoE_PC}7uBSLq?aB4EH(#$ROwCOk2TXCa(@J`57#*7g#%K6^_2 z=f-=N{hr|nM@hQc!XUekZr9X(TMzL$)>phIChT&3wwuMau#()ac3Lg_cqvGkg0~nF z%2Qn)6@JYkE|sypF2`Qw*x9e&FJL*WZYARt@=--Tffm~6m%aahbFL7jpF-UW zd+=RJ#qYXX!WZD0dB=-LyddR&lMVQiM%2sxI1i9rDBS_|If-mbIfYOlu>@I7+Y;Ci zT9lSc7#Dp4Ryh}K>h&ULDnP8yi~rFd*IPyLNR-5rRg^M3I~KIS9YGGb%%{eq`xUS%%kuIGgaLb>K96v{+Gj}TjWtCgy#X7 zyM=S2WDrLbaFuY&YgTa=0QGEF^}0BjHIft7fgup>j}onqL@WA^gMiuw&km@Z{aKOY zE>$4$eFf4kS0M93Kya~A*|k-p&K1-wR(`NXg4Ecp%qljol%fe__7$SHROGVwfqO_h zTgU1sgu7`xYLgkd{rfhhTN_RO>N&_B$oQE=*?HcHJ_^uTgRVNBhj{aJyuCyqy-gA? zh|%nL$utt;_12&dOsoXZXEyJn4@itt=a_*V1Hi-ml%#6G_Y(#Et{VxfHV^qFO)e0! zTay=uk+*7cnvjoZ$5I$ZUZcsU3i)MCK9{gw`l?UtM;IHOpg`u49dMmQb+gm1)v*r< z{uULRbs<*=xb-@4$Cm5BZB-ehJq0_axkqCCi&(o{=Mj`uir`iEGP5p_vg3?R&32iv z4I)wH--tI?5X+^S)OQ;sJpOm}%2odo!Br>dyEEl(*GL(U(k4e96KL!GMqj0YMT{2|h&%fm`|T7{kSD6ia3k1s}Xy;yea|MtK{m1mXhxm0iy&?$r`^EcR&_ z@I7NN)n?eE_U&7(ZF8C=%qi6ChLdrl!S&cnZRA)UT6~_ot`=}j7ukHLQ=!LX9IG0r z4%_0}&k$JVNI&sfHru)Sn7fm%jppuja~F4QlP zSqTVEqiv8%EexgZ$~G+iwdtgkYg`%J3{6zbYM~-e4CyANtGZ|_;us;uE*);wFdK1= zRR~75vI4}1TXT3C(ne|ug(a2r2k60M?8+38Y%ob_t_(F}$wn60kVwt$+gyZ zdB-@ei+7;|ahp{Zcw@_3^sXxVsO>n%Sc@O8)bb;4Qp1M?a{d3s`mx!)`1GNfj3L$= z^&@BI$;$#fj1X(41m}EAjoRwoP>{qqW`{g^ywtmyQCmnJ$9lUTQJ+uT$^OQ!dH!Qw zPq?e!@%bvt}f=OK^wN8>yR&enyqTx7@rBYE1RLhcYHu9`W zcp26u0~3HJZd?V3R) zb1#?W7;=!Dff)DlN4V23!PgB#=LRMcA%tAT!}=CawsZXN%apNKqqpceHU3d+0Z}_; zBH5k~fA|~xZ^`$ZQ)J5i$w%7sIb!;Q80BcV>5n!W1=D{UZhB4GCCw{YBFYlMiTjS* zeqye_A=@96Bw}`Iqc;?waM%v1S~-u&{}qcpWBi=Wwkt32j9QIz`T?njWBh#By;S`8L z)l^a0_S6#@G_&3TR~JyqQk*$S^)j#F%UlyD!TTnG#ILHD=FASbJ^>oe^{sQhB%GNl zf#+D#mch(TqGjS{2qgco0IIPbm|miU@DO=1&ux5?9P4sC{b!ksx%MntUclAB4aeSI zHJhCo?i)Evm%HdI8J)RyLE)TxBvLCGZ9l<%eO~g9EE^w?&qL!M6SAL*CVAZ3WQ-F0 z+e|9X=OQ+-x7OzjKm)xUnl3rDVZV}of_wSD2+*wC$Ml33C=-CN*7BnF#3Q-x4NZJ) z#uHv)j^v$qgvpBk75O4+ch#o0en`{IJMmZ^6MT=@G&wKOV+oq-M=8|DHs&a8q zY9llD9?|aGws05^(`ISO`PovN4#=t&wqgxQm>=G5>Q#4iWvu!n^Vfi@`V#z*drd=q zo{I@cxBEagn_{Ce#d)M2y!~QKaafARb(O?S%OEBnB3Khw&TSNLG`rWl8g(?UzF3S% z66%xLdLq}n3fXh#0UGD#sSb528l~d)e zwbe<^lxPnV&CwA$oknmly@Hr}t~D3gB}mKQUUIQgngDzeA#XT&+N+ z9}rx3p(K-d7fH%!p~=-7tjE`r^SCNOsdd1P3{leNDG`|k66rmORLcrTz_rqFHB!*7 z8$~e9lYz&_v8C=cnQu}3N@Fr_fvMD=xfn7Zo`sOMNfFX6RfM!c2&$r@$#juXpSJo; zfPa@7a0JhpVbW7eF3iLSk=V_`Si3umLF6?mPFy;`-T?Fr@+g7(0l@`DCOWZZs8|P| zZQLDjWkK{GJ#pLD`@8RCZ*1;Se_CHq{g15n)I_PIf>WL`QPt3?HYA5=XSRn)DW-Uu zT(XK1?Q;hb$74lKmsXF!x9j2YZ8*}#{}MseN$W`ft=xd%xwD|W-om#|ZQ(}QHLn*c zmQF_r8lgIYYD}=dsu>Kff?r<%LA=!&F66SD{Q&h;UMa*243i{*IRep3Mx~jHe=i{I zQb1!NW9k9|!K*Gukq70dsKipCOJDq1aH!Z^o}S8J4Il6kQ(;-}c@=L|`u2YrNuKR46OC2)zV_(tn@2$#A5t-X*8|aA4E40jQD@4=d zGDkaPUae&M7TY?S&%Bs?zwJS0rIxvnbsa6U!pLl_v^CuWUwH2OAhp3IrW8|Sp6w2X zlY}8XjA65b;UkRGz<3jXxnUj+#q}V6ZE1Hqm^Ud)`UcpU@bRou7hD%OgO5^~FiQVG z;!GvP^~iE3bt`dZo9U3Yq`lFk=NA5eSAiAeh9`s0!gKnpkjBSz9!QDHirX6tl< zNV-Ewa@Tz!ET)jwI>eM3F(0=oX3Ob_nP|kQ?UF`JokPqSM$G%IidiCJ+8Z(d3Dc&) zA?ARxqPy;`R>ceuG0#oY4dg(WnBERCe>7rVZdFWUH^f|N#Jm(H<{0wBO?<8q^IWT9 z?h`SCjhO9?}v@J0*5J44W-} zvK!^P$@&37l|=nrSk%srsD%=>b9mJ8Ch9bs&dq&HTJ9nv1c`{@$~FFar5 zGvaAJAYdxnFW7+_@PIQRAw!b`vH>-(KIFbU*{s5&C}m@}!J z9*zB%E{?Wp-uKo%r$jc0wRgEM5a_U6RmV8^zMaXGf&uMp8^08pVkqx=Q+x8s_iAP^C0Lxu>op|W_Zuj96WL;7+ z7hEEBfQt1;HogS)7iZGs@C#jne;H5lXTDj?2u-h;xpR*BGxu=MdXZq8+&M@5Y3m3E zU#*v_@}ST%|1OAC|CIuZn=LxjC*DLA*_h(WVlenBhU=58zxPn3m`N9ifw8W}4vFiIirL?R0 zp2f>gi$u}5MghEib0e1V=eB8(tsc8v%ixn5-|&g@6+c(Z|9yfKx;N`}_ansWsPy`| zSZgF!<2XAvg%a!CUrcL>#Cozh)|nD(^)JR6DY33RDWO8BXsK4M$G_B4sXea4yDa5uhn{E)xWo6H8>+ROn`!F@y2h@I21&4!vDQnrE1lVgKl zP^}QzQ6YvU2e(h+UPj$RyB(w2RK0+|`=&jvGo7}<&x}UG%%mF_7r*~^y19R{#QOxhUOoY%1 z1FF{SQtm$Z;sl||Q762+5^#-IJnHC0o&t|icb&cdx$Np^?ZEFkM`42EaMj5&b7C8h zP$pBm*k!V}64$c6#oURryf~izYgzl@!;gD&{M%c&W|q%`2{U>nI7>xQ}Y!@34v z)vBq_vd9$b3!IwSvHV%^f%Aw_w4KfU*HazcSHDce+>Gz9IFC~|^ZW<(^q6slY?BGZ zEr5ro>QRT4S)zV?)^pr`fdqetrYu(*ckUa0=7-p@b}JveJyLU+H4-&F^vlY1Uqs04 ztJ_$fK1d_Q-9#xIldrFXqw?6`!s13pStx*Qy{f{TzOL>%Ve&El`DE?F*fIXx1jacX zv;Dc9WWaNLYqHu6pBy&Wsjm%@5L?N{Y+q~DuNB|ml{Y=pR!X(qdYIXN=4}Ln$CRmD zeyQ0_((7)(aqIJbh6m3kad|B5?hxbdFfw8Kc6lg$`nS?4tB#W-e*67qf!{3fn+1Ne zz;71#%>ut!;5Q5WzhePD&4;o~MXjtX0*s48S6QK}M)MuXk&=s&s;ZLeqU3?;y@q(k zR1{TmTjcXp)Xbk%Qst>E^(-i?Dx6>9E2*mXB=;!p)lTBbPsbbLnN?WqshT~@Q&d@A zSp`c?AN9YPFQN>T>8N6pfRoTKqUx}x>#CHxFmiRpL zD~n5rX=2#v+x(IE78REH$|`1iO3`jXS+S?boMKODVOe=e@eogs>ULJqoU-y_5BZy4 zRzZ5jp5mGkkFU~GT{gR-u>5#>)jr>nMyOi<{N9?Oj|_T3A!=!{`x=LZM)zIfWI)sOl-2Q&>d~hj?-)j`SpZdK5*p zTXo4LH6;~AC5kg;agUS%Q$1((C_2lIVB1aGK-4QO@fFR%7N!V|swx{|BF`c$R3hb3 zp$rLz%q^&_s4fwiT`ufV-J^IYRbU8dNqURV`AOh}? zr6lyPrn+!8RwR|_eGAJLUI-}i6qOfNS4*&za;)%4Xtrl|NhKAtYKh!ccq*u+5+XmS zdtp0I^KW|J0*|lE2NJUHcyN(tQCUTC<)X4;2-EvQE~=bAAA@_Q7go)#_Vnx5@4{v| z|C{ycTka_@t0?hImuh!$vpN`Q>ckS?n6Z-!%WF!ihj>O-)=+yZDt*#UJX6QzlvMkw zDwm8bEH9r`STwI+J8SC5suJq;n33VkMGEIBt5{IuBi9walEprFke6eE8Rn@$@q@q}A`9zyzT&1t9bcv^AVM&Eg@l7rDjUs{Z3rZ^T zY5OHr6{h(iwPc=ZnMPSvw7OBEM^SUmAXgTNE6`QutRB@;nN@qNDqKXHtgcS?RFr%A zmK4pY^z3#&7I zRW&6;3Tu3obExC$u7!Imovl-rmZ7t~s7gB(T2Ez-PmCy)&Z2Qnw~}X6^x{vI{3+p& zG=^T*e3c8GJB%+`(l?Y>am@l9*1o7@ahdp`MP>MxYG0wRrdoNSvS#Pp(iPEiR4u4D zi=sp@aePaxzDCnZ>@G&`Q9VT3nB3}`C1z~l2!*r&9~bT%ahmg5Aj&F>eC3{kG2=&0 z99d9sK?~aK65oPFHD$)HE}|?7t4cgeDr<(fvnG0T^YW~bW2*h(F0C0Epxm-lMc%65FS3ad*7rM9z%|Ac~%Q58+6fCHuv z7-Dyn6l;}7YFLjV`OD{n53Tqk*DYK(bKPVey8T+NJFG)1Ypp|nT0t26O@6NHx$3#D zv$n0ZwmnAZKCXau=+>27#Jm-bTW{rh#yWJv(_H@~yc8(+n+V^@MVwpLas7kqYU_}n zd;k5`OR)J@S=;Wlwr#LR=8ef8F+O`jj#XVw^RmQQdsNU^qLQ-N za}0+L|AeKeP)bTwStUryeL>mcl5(jAR&h&LXVE43^2AY44pvcl84hTQ^6!>%a}#|_ zXrW!E52LeE|FL72>0^5o$v^9yS!EUHRL`--j2k(@8rkgljO&q-)y<+EaR#KMT&Y0+ zE3Ja;38QlhCUQH5YdoU~)lXa1w8X+$BpA_+i8BeyU~yUXg7U&8;F|qjSw$Is1qRU>88C^EzDAXd?TFy85_(a;?Tl`8d1 z(gScS12`E1fNBnco<%P@&sR3T1UC(-#jTKO`U@+|YgD|j8zEIz6_->kSS+#ZAZV>o z^_;>5l2rJe5En_gD}o6La!xbSgsOd*(v#9Jqu+pbR*&);OP3;rL*+V`KmCUe@B-wb zj&&Kom_RmAt}4PKfO7c=6KT9$3ki<|a!pSgIzVb@n*7P-(lXOV5j>9z@e)iG@*vGR zNWuejIJKN`p1M~OQs+om7{+o99IB85M9@GTAzy;fIqka3_<3CLji1kj;~ihgwSemq zu4=9tu0>o+h=d|!2{2HDR1MNJ7^J~q4bn9jK)xk{2B{jPX)s8G!5XA%FhHzI1PxL( zNYh}D27@(7*I)3!Y#O9#Fi3-e8l(coiz6aY4bn6iq`^Q1RN3`6^#f?% ztMcbwig9}X!TPT*-Ts3O*WjU=Yp~%;S6u0aE8TFV8?JQ2m7%yY3|EHX$}n6RnrndZ zsG4g)isl09dYNLlq%lk%Kn4xeHL<_pqRbTD{54#5eI01H1{y9^`v;^Nu2hp^s^Ll% zuG1`+b>@I{`DdM3Ix96}V5)WItn^v41`Oi9a8~hvQtQn0frV)q(2EDA56YOueMwQu z;3DhHl3B$tT4xR{8kjy1{-UA*sr`$sGc(dN2KO(7e{e>|fd1B*scGqH>BOJaf6#z* z_y(nC6c2)4no*ioJlL9DRk$Q0#X2)Z{qS^s2c!+s?zqeJ;e(2-QEDzL^SJU#hBV&7 zs?u3CmtLwmj(&`LADkEp74v9JpnWam{#ve02LC0n9J*Y>V~4|`9XA|jhu;c|Z{z-_ zu(fnQ=ebn_R~0(FZD4Q0av$l+{u!FYnaXt%`rd}TLBK+;>&*R~z^UMW?vi*vNB^JD z9{m;RIpw`WoJ4fk0vxk|6C@m$joZMJ)+JnXx&9t@-AwpsXpz9cN%T6sPA3v@fqwPAb`$G*1mQb+D(q0mbPO87g%;g{fk z?Ue{`QY-wQTp9{RwSpJ9iO|mDveTFr7PfJ|Fx)#~y4v*C-~+^Y0^Wh7A#v<0ocH-K zx#4&_9G=!k$dKz=4jws#4gXJFuUCXZN4PrEp8KN56s~1l4{_yO5(<@Z-Np43*9}#i z-(4LFJFq-guZ0^&-`0Tg>B@IdUHPXMAYZ82-i=_K1_)EFZ;ogpO zBl7M7_czW}v2g-V#g220Etde@!uZ1Jl7^&vC)Yf# zZqyCYMbiBX@kemq9=siA3UW%om7%+h6ZkIo130io!r8zNuMUOcYeS)AuFls`X3I5{ zaQO8g=PKJ*IR5{(@Cfq3uuJ`7?7**se}HXxYTBT|=@~&i+v7uUw+n=LSl6kda>wv|35aPCp*r1JFHU zix$5l&+6OcEDetgH)MUEb)$ky>-x#=Rv!1MXMKFS`RXjWwYF4gXx(JTTPkSzMRkc8 zn%Bm%u9cf4P6Z@9vmbd8cupv^8u$$G8Q_SNP-q`;E${>24&X81S^a7IyvdXU^Z-8u zrUJ(eU>6>+&A?D-2Cxt)XRfRtggoGqboQbFS7qQ!+gjEsLqee};N`$_;NwH_dB7dR z=r4f5OllMLXx1N)4;(ifJ%LrgI^Z9HD}lY(!Tb;4RNxli+rW>3YdAwMojSI3L@1OG z+?#_x1OCB_9>7MRb)sdRJ|-0E3VepArE`EE0_%Vq#vu>*Bk*J3zVq>0Jd22#K%WJ? z8MpxWNCEi+9t0i${&i9)^d<1&$>i@O%Q`kK6uKOE-E{N?-V0m{T+HhL9|Nztko4PI zR`-keVmq)5I0JYqa53;s;Pt?VfcF760-piiH!Bp1jpIeQBJ2aq0p_~4bmnZUKcdB7dOTYv|E{{(&v+zYg5 z)}H`70>1(#1LLnn4)7yj9dHuu_Du2Z-MRJ%L?;_x_Rc2R;U@1D<#@ z=>rD=_W~aT27$YPZBFKp*W0iw@YR)k(i+(K=TK-BF!2uR5AZ_ZKHy7#VeSJw>CRB7 z(z_q|)-ZwY~ z3;{bOVxNaYp#tEuzy-kG{~+JM3xVr^_W}0;6CWktr-ENgIRO8&k#vDy0yhFrcnZCN zS3gbqzq71ww@`0@e2~T)Z&DwF6~cBFx>Zqe+0Ka3@3+zuj(5L zU1)G#pnOZB0o)`RAdHAlxG{P}e5V^?M#OvS+l+`$zTTA`pR%HDc6@s62|4jIi`vDf zgUF6gh5<$*jEIlT#!n;@eF3tL;)mr`DJwfZVMTOye5cx&oOn<4ws!HIz+@|Cir=~u z9{+$)=q%yQiBE_g-A>Wcxs~^1Z^b`X6BeE7MW^dyvg17~+K_auD%;OxYvsgD1Xq(D3Y}wcQU~NUqMN`;y?5#oeR)g!uYxxS@2iIQXX{>m^y)~J zPukJP$g0c;gFl`pdB|Eoyr7iHzg zTo4mMmgsvYvc@q+c!aPuI{u(k4Jns(;NJ&7Q1G;iak^Qk`YPj{Z=wD5*W_hp%%#y0 z45rGTu}&UikFzBmRjwwQXazM5`v)>;{w% z@DcYj#xkRg+~YogI(ys&sB~7r+b%a0dgbTS+2%|~^naVUt49CSPErStLE8ZB#-HdA zJvUqlDbpmza-F@QP?uk0)BKp|NcBT>T7ayEF+bHwXxBrt&NZ(tibq_h3s!Vk4ecIi zalh<`M#t~-M86xMT+@;DC9;an3x&o~SHkLOxbK`9ea}yQjp&%dxYRd36uOx(bvIzjS1-Vyh6n>ia1y1(8B|8&N=_rPwQPa9vR^cyD?SM}%6WldUaYK@Igs8Hnd zRK1q`CBWyJVCp<=YpTwk@^5{hb%X{`Kgn|zH?iOthN?V|L6YF7g8z|p!tq}43&6|s z3-Lu^wr{;J&5y~AiBOKoM1KZZw=!0*CmbeA_hYqoucyZ{GGF)#UWSL-XP{@Egqar{ z0e`b7{Y(AZ(x{m0qar9obT3yv@&?RhP3M>EX-<58^gkj=ld`%KS;OWrrz5QWPxOtZ zIIJ8{&p_V+{dJR8>pp07{FdmL9MqN}3ASnWMKUB&KBf)hxbtN#NYcRut@gdSKWz^( zu9Gp~v&3EAtb-ZP%#5BKKPNkWL3aG&?D(Zo+40v#jflS~syKe83}Z|s&ps*o!U$Z* zmhxGJ{0}M^?~8BvrSe%771O6}B#Tlf5pe{0-~0G<*{}0u10(eh(U-+f9T7h>FMdu= z{DOk`eAWIj=*^2-)-f3u6oX$4UhFMD!7b+IZg9y8qjA@Rd%}TR1#TBOrcdf8ao2&{ z0j_%(Za27>!BNfCPx#&j_Z&FokGPjQa|GP;;NBLlU$SRb^!C=eXUS`Nd&|0LF>8w= zN5-b5@v(gf=7WC>{9M70j!(GZ`1p20Sh0`B>%Ay)mcri%f0FPc=VIEW_@R~HzXpGg z)GP6`vvkcD+B#@gTp9|UPgtd$rD=KG?t}I?w13gR{X+ieC!%6rjO1X5F8XPmZ*BCvW`DaB+AL^l9IwV0(U%BO@+oTo zPeD7qIo=EvFP;01(EbVSd{d8GX|wq;MYMXy3?PNLUlMoU)qI}7_~4df;jEb9RC*81 zSa(F(CrN&japY50Fb|dTXp!F-ca&l!zmUXc1@Mk!O`$hoYZ~J-D1t8sKMA~7@KR?+ z#>a~6I`GTER~gwde$R?-w8!rw;=QBd^RI}{5}T}r_l0X&r!X?c8iy$P+6%1_+GSyK zX2zTr6+dTG{DM*156zFCIl~q#@+{Uv23*JdSi;Kw3spXZ))m?~XcL7-9b9PA5?VU6 z<L8SgzRer43C z_*Go1@#brz%JA&Eu6l7e58e_A$uhXM<0VQH@j1oNo`-fw$_1a(>=Q`y`7oz2jZ{X_ zM-(BIsg~|AE>cOTvCBV@Q+ylGFC>j|@d*o53enT0z@+?Sjp{w`qY6JCl^$MfM`0k1tbsW5ea4*0);A8q6_ zU5HH~ycGOC@Rx+!#>~Z~70hqh6jh(NjyQ2EX-B`NT-Qda&Og2NB?%=@*5q7wFdxN^ zzvwfMM8#ysMyM!67aJ5HFXNt;{h;8>!KXU#Qf_tN&jGL6t*Rfb&ZXu>wH&`#<;2}W z+=_cyH#6gda9=h$epO6N=jiy=F}d+;V@AbqWO}wGW_0{+;Jz3i)aaWaj)oY$NO&)e z;&znWKEy2**c0XjbswF=0CM4jtOb#_{5)Ja;5LA}R}jjF$ch3E!K~#7kE~Y?dWd!3 zFrNJAvKBno!}H?L@KC+2weXZa911avQ9o(-JHX8VH|N*X2b$JS)3l~aJ9{NUSw=61 zE1T9hK{ddsq|=8&obd?HHh<07ow0Iqv=K1_5ivs|j+~{9U5o6ySXcE+u4sR1lpA1gk2FZj`q@eEn;$XH_9u*3=SXCbtHLMx6> zka>#O(_&rsdhjgUs-MW|2<`@OBLst-DMpTrFH)eblQft|{X$#G!FVxOxFXn>=%UwB z}KfCTUGp1jp!WDZKBP;t^GY(blV~XlyAz6|=DF?~R=y8+y zt8s$=?f07nezU;OTVTO-P4^i1*6*Yxv2JbPAp;K^_>qC18hF$|E#?2czdxR;^V?+d z@vVVB8W^o6ESA;Qz;*`48`#0Xjs|uzu&aR{1CtC)Hn5L@DF&t*m~P-O1G5awG0+qzVt>YtMOI~Y9xyRhU_Hs-70>`~g)wP9Z>N3{lXWzf;xc|s; z-{iP&%i3Fb{L>uwy&d;M%{|K#`j@W(Q*rf6ZL2l0*J@Ix>3fc1Qa_WtWggpF>4x6b zLI3KXTEDx!l^xN`d$k5_vqFKR zl%JQmru<|~BR?4)$&bg|>gQ1t!{hjL^WeHH8>tUsFj-D*)p z_9$t(U5-c0eT9+tjk(XT8FVuL$N$c}uyuua=S2NR893R%QUeznxWd5O4Sc}B^#<-V zaKC|v4Qw*7?fE*LQw{8CATP7%^bMSBV5xx%4P0U1?FK$z;Ccgh8o1xU!v;1P*mi;D z^Ut3!v0&2VDN`?)Hhsp07hOEFa8^-qN$Ko4Wpn41&#$Ola7k6QuV&$*#Y--|?D8wF zRL}3PM-A!sq9kE18~$r=-f-!pJam#;CppJu>G1Hm>}??!_}Mx?(#3=f-bsJlrW-b! zPQRyOJY~}z@ooAhn{ML&$?)0qZH8{^7!@{)-OzPWmf$d=t+} z-*3~6{M#M!-*U)z(%-e?n|Mz8A)9XGuXM;i?2zxIe`Lou@tpKeZMu>toaH`?v`4ZF+|Y@ooJ(8M?`y z^%qC}yG5Ye@sk|%zdGXga-{F1rx?1Of17UGC+!#L84={$`ej9kZ_{%f@$WW@*y*3^ zi0`D2ixA(o|D*`vmK2JF4*E!;^bI@)7 zX2*ZhLBGKff4zfl`!75G1_%9SNBoTry4^q6@t<VCZ)JyTj1!_HWbedEeh6 z(CvBP>IihZ{j7;Vx97dKPpG|l6j|C3;({1~_ z5`k{p=gkOo+dc;)&~5vC7=dov=hFyu+df}KpxgO(_V0H7Y`U|5Ki^@W?;Y}Ox@{kJ z9NSe(L7Q&dr(FcPZJ!Pi=(c@2MWEaEIU@qywolIpbUXjf@rkX!O?Qq@COYiX*CF4g z+xAI~K)3BPGy>hW&xi+xB&iKb&;u_`{~#`a8!TPP%ja5o_#kmq)3i{A{{iz9kNNzN7q{ z^DigeIsdZhw*Jofmy_ZpF8Q!@wrX6?e83)JL%5xxlOnAcaF~|IrN+3 zu%Au0(|68aY`QJqIe(e#kYDMLZ_{o0&iR2&x8*zM2b+z2yM8Qm$hYaX{7WOy?ebX` zfu3a&xHbaau75X1pnFXG+a2_09s1uDfo|*nw+M7w|J4!bw*G4(&~5$KN1)sKZ*tJL zIP~8Ufo|)+I|AL-|D_0YTmStL=(hgvM4;RHf8d~Rb?Dz1fo|*nSp>SRe^Ugyt^W@Z z=(hfCPPbFC)Nh+Zzmp=+?N}Wm&~5!ri$J&a>mGq_>(|Rc-|o<_e+0U%-{1&zTfgBE z=(c{NBhYRA#yjXc9QsX(K)3a~Faq7yuOtH9)^C0Ux~*T0gZ`XDzbhipZT)H^&~5z! z5$Lvlw?v@Z`u)X0-|5ir-UxJCzXv1GZT%jLK)3aKDgxcsZ>xj8%c0+%2y|P&mm<(@ z{oaT`xAl830^Qc{LkIm|4*foJ(03cUt>0G>=(c`8M4;RHxz4a9S?XuYxAlv2(Dyj> zON>CbrFMxxxAi+S0^Qc{>!3UPpP!VE!#}_1i0|~T zFFEK=|F+LTclwu?9du{=e#Jp|wy#$mbZ7m3%|Un8uh$)PXZh}T(4FI>Hym{5_~U?s z?(E;+bkLps=UWcCv;X?HgYN7<-geNP{`(yV-RVEybpchE=|2uS=+5>#+|>8c z297syih&m!INQKV0~Z;1m4Vk7c%y-TGVpE#|8C$K12-6`y~J;Sf3v`E7WmBqzggfn z3;bq*|D6_i*7U3wU+j}*gP}N@L$(bdwX17Xz1%4 zbX%HDf5t(#<=gb<9duj1+3soef8I`C_QD)rckXM@Vf1GOWj~j&*HPcyV;Bvv=LJRP zzTK0p(-#`_6$e_^ZvsOLplW*#ml{`dh48bH2BU2ztn;64qoKEZRD&l{Jj-_XKU%BTF!2RKgaOT zG6_}~e7eE!Gk81Q5eEN(!Q1usT!SBdp%!4aEn5{lAQOFx4gOwDwq*OL;7_I)_X6ml?b|+X|M$YVTTSE6e0J#mHG~^4g?=*OI4i&U@ zTv6dkaf5jL^oizn+kHLR1hX6ly&J^$!t|)f7XPN!r6e7IxW8sxTIb^<-mUoUedkVG;Fz-UlW($D~v-(Qdr*YGx(S0YsAY2FRuXz|0+|V z)R|1sPBHk87idOxz7j!sJTCliFVgt4HL!XZ{0UNU{M0!`z;g`#jY}2U8m)nqZt$mH zrV;AAA%Zyuf991MFXbw~^TCV#J;wg4HQJhP_#Zd?>dYW$vkcx^rWvK2Z#Mku+#mR>4S%eIe~IBQHVUfqT;RXT;Ez2hsqr3eTMhk6&S_SPsfSd1^}9jg z-PYn>1o+wh`c@;S$uvZDz6d_c>wJR*%VAi0(D`tp8#ug-2ExZdEa zjUkttXnTNC-u5ID-8bSP5OSS!TSxq zmuaB(IPErrpKS29KfedOl<${ow4Qc7dC=gG8N6MNj~F@j_~CSu?vn=pp^>l7HG%f5 zl5?7sW%4!C@V{jE)3<7bI?IIMTZ*54!IAEVM$SHmeLge%2ORt|h!Q)0u|vyme%%g7 zA$a?}H5nhs?*xNS+o|up8dxVA{Aar~Vwk~qH~1?IzdHK_S}%h?d$(r1OqCiL7;CDOlBaNH~q~qgf*XQ#Lf6&2SVEFCv_Cy`cy2#+|ar$_JFEaS0&ufI#OZinA z`E^FVT_5DkL(zY!1HZ)JuXo^=8ToJR)pFIDCkWRj1AnW*uX5n!3J z*z+WNJP>d2_WPphd=la$8od2psXBuMe2QsbS=VYqZZY=k3cvWhgT|g78G!Ti*y$RF zt%iw2{60tdjx+M_IjoYi)cGI;3k?582meI|zt(}DrSOas zOulSCHrw#u?hn+vsm`R3kRN-x|TN&8A7?#g9NtPJXRzWw%}RFIEjxnzi4pK65%7y5;IE5-zc&JYt-{Ay zx3LORs=ai41dS}YW`C+utpgC`DPwxr#b}vkqLRQ&i`c61+MB|80gp?|#j{+9-Ng1pY@O;I~G=zZn59-%F5o zWUtrSWnCKijGi@XGXxMDtw&vhZ>zBb-psep%M7UM!-*xfS(ruFXMs^ zj2mZ~ewJcYzZ)X(|1|>s;RyK65%BxKOZ{2rs6THh{x~bjQExwpAm>N~yd2coT77Fz zzuy|ZJ9v-DdpO8c{BhRJ#_yeBh`9#8=kFTvkin0OAipRAeo+Mc?ch7GE@35TM`f4G z{fa-%I?LF{p1-V#AVA$H#Fu=7h1_}`6yZ;XKdJ_5e2>UY8|sl%s&m-@EAF|O+p zfnPqu?)j-0%d7a~tcR}AM0>qr0{8^->m2`FZ1_7F{+o@=Q>YBmu4k^*2z72P!7}*8 zZk-(c+F~WgL=FRWM*e{qU0%-^+Koz1XRFxJzWy3P&J#wC{aop6BWF_t{@20(K1>fg zDCh9DR?p>NyVmgWC$*06s_?A$%0er@ei~RkBJlT*fX|J9&o}Zb&A9YlBmbfZ{Bo{u zYx*xYa(3LH1=Jfk*G1sJ4Sa`a=1pe(%CK91i@^U_1pL1u;NOja|11JNu6^tI`h5g^ zS_FJf1pE~6l3)A1emlR#il6##>g{4fsEQzGx#9o4sShQF|Aq+se>VKFb2a0ohX1|@ z{7*)}Z;gO|H3I&F|JB;{g-CLg@k%7952uMpNYucBhU6g`_bz)HeY*WOn~A%($L-!_ zM6j=?yJn`@?yk1Gdj15&5Cjd1ih`OK6NDfbgfkIDMG#aJBqpGF@g+ih2#9jQKSc1s z-}hD3%yefU{N zzt4kT@Zb-7@Ci1Or`dVm)Bl8V{IhlG?RLEri$D1f13Y2z$AMFPyWYwRU*!I_(@OKS z2Y=Rs|JsAU$oLs?yXAAs&hfIRKRuu6R_Lqkr}P`kr^)9g6lSO4@9^MvdGL-0-|*mj z9{idIKk?vG5B^mT{#_6LQ^wB-cmDy(A%6YF)BhC@{<=gCBbEYaV>;!6zR4aS#4=5B?nw{$mgRf(QSD2Y=0jzX6>5^ww4#a+4=Myc;|jO<(u^$sL|??z8=8spg6e^MLZdlvtQ#oc{h z2*3Q=@{E7%!ABl^=D|PX!N1_azv023X8eqB-xKEFSH=pSA^c_(znAQSZ1b$`|L@lg zz`uQs!ykIaf6;@#YRCEJ=gm0$JRcn1uz1hP|AXeT_?KrKQRz-3YCU{#5~fKUYDp(q zl5-Qzgie!OrZN{=mYL9%)NxX3p@(&vnxjljq*g*x8`1&#R8gtYROq7CIvj{7m0?K( ziAttb9v0N*s?0Fwqf%)6LRO?wRf3>Qa?B(WHH^g|tmKC_Vi^S^sUs0pNnB?IwX%vT z`6=cbmsN~0Fl#gpOEJ-B*Vlvf&bnDabwcf6j)iHWW-j=Md9i#lgQXlL3Jb+Z84pSQ z!6*>!Ru@9&a%x5}P^_jzpi6L5%RIsYb!nNS1F1!ojG}QGiz10}QO`w`#aJ7OCZgWs zFppD-MRm@J3I3lIdRiu6cTf)@_s)4b=xhj(GG2yLp{gigfd!bOP^Vi;Ojrg+-~8O}vfsv=i>2(Tnmth5-asIJWHq^d!N9#G++gge7n$oz}2!V;r2 zDa_HJ0N<53v5kaUvhYNOgJ`{8> zZyxLh5A9qQ!QTGi*5-b2*zF$e9tX#pTl>3#2zEYxar2r%k8OL-aAQ`L)_@z)I2<1E0H-ey=SCasqoQLU!z5U+Sc5tq94z3y3#kmGxNAH5~ zZC;b;cS}j^lVjuvA>%<{RuRDZgD9<`f-*?u1Uho&IYJamVpv@!GxTcAFoSKDnw*O? zC})~HqRQC^hK-&lD=`YAAbK_~_lKI;7~=!6128T#VN*$=NU1PP4?x(xGbh};1y z7-cFCSRO$j`uj?q)WwlT3K@x684rS{I-%wrRa2OdGZ{^a#U!N3{$*LIx{TyOm?Nf@ zb{MP^A%Drkp44^>3SQ(_?CHj~gCXo6eMzhb96Op~ zN0Jw~Tz-m}?Lsd-QoJSCgs^(_TJQ0y?6F2XdA)wQ7yutOjzh?qwWq#qh&8 zM*4~o5;>-F>ntlqwWbD+%n8gI=Wa zi~xQ+2y&_; zR1pY5*4{Byr00bU$kCTx@c`kokerdr%f<>wKwX6;l&VJDBmt!`38ecG;sSgDUftX7 za_S@x=Ry$75*yS{RHtazNS!54G;Cm8BrIb+j5pvk8YFNbUKx2uFOMZ^Yzi^`i-_e$ zQ$YYT3wAH=P*elMtZ}U{E(obsKStMmxa_f_qlMZ|u$VWkw$bA>hER$nR2d+=BPNxl zYQ|-NS~U|3%!SLSBV%+_9~FAOnE8PXGJ;A4wzM4&mbD#EqE(a48Hy~Fv6@0nVWS5v z6NMqw;U=I$4lW;a$UJz6gU513u7IP$dcg~Yc8zR~0$mFvtjRi=9tW6BilwYHWFy+V zG>EY5c7~dU$te*C{-fpIw&<5x57kd%wlvVU%qNWz*)&W|Fr!3KjX8AoLrHuhorB@;QcNNiLsbbO+|V{VbZuB1cR!wPDv)!JFrpJNrS5t zYv{PXjo`Ut2$^$BVf)ZOn&%Ol4wXTJVN+Y)f(fA}7 zhRM<#HdfLEREGUbY2rIAD$1IR(rN^+WrqY0(`cH+dfZqxtYfHyAwow0TjhElqjKKC zcGeWc#JjcUdQc&g*C=@wHfQqqG^*Ox0DVJGM_g^}AmY&m3}iOvEliaXOz*%62v>7# znEIDO7$jSv=wA&@g1m@oQ^w@hD>ATLJ1w!zvgRmTwR07E_0wU@gHue0l}VTAvO%Lf zLJ-b4M1h7P#4gp5y1D|dLt>}MNETS;n;JV9Yy!wvuwP@tqQy`&rlr|RnYVHY(vB&F z$kfddDSaOXo5}+fC&Pqde@#KQ?H$W9XcOL=V0%RMCf*q+o8br&R{1a)9W8Z5N+u1v z0MIv5UWCOyOYI27mI)bLkzY!%ssfv&vROBEqcr2}`Hhsg zaBTRIb8Lu!964=99h4_USV9vv3Zfot$Kya!es!giT?RCA1^Z{4P;o~2%9s`6Mw$#F z=b(q=cKmM#ZlYrL0WgH*;7zXCZEeYs>c8%3<19mz;(#b8z?Z9S3S z&!Km!C=1XU%sUju1^1-Nq%P<9pud`D^j1}eR?h9%9bs!NJEOer6s|z;ETBQ1r1AZD zYo`No;GGr09mgSJaVMVV7}T_wny+9FP|+@Y^(4SGY&}CFut!CzX+*5Lqv4&RLkR=d z6zjet$HA~fffpc!h{c&OY;A7!?$_bS&|{NUqO@gtcT8i@gcy#Q3$r8wL&(4Mufubj zd5|+iCsJ8P_2d8L^`uKj@PXj^w5 zk%KpJKzFRT`F~*PUHd-Q(YEI9mL=H3;Xm;V7)Sq-rFX5H{}xNq=Klyd-W6WV@1C3E z+8g-%i(a^mlKFJ>cQA@)v7@Ca-Tdx3Jg#-m-Lc(y40lXzgg<c%xO4a19M{rydbRmCD84_31Ja43f6(4w=34jM9yfn`{q%W0(Qo08UhX+S zu6551B6^ZpoBnISXo!NOV2M~ecftLT>B)>SLxk- z%C3Fx*;Q&GE;LWYQ!RRT|Eg@8s|9w{z`U%K_FJqX|Ku+YtYb-rc|N zTKD;fBWut9lNNokPNNCo+Q;0D9E>jYXHUg1aj@$DH@b%2wQH`UZQJwz4mf?rWZhP{ z=VGltY{qf+;)ZeOu6+d;$VDB!dv4Z)|0DgMK}$0^diOoy3zmM(T|ggtt?~cmzc+A5 zw(GjN??YTWF#OZ^|LEoH+wtw}kDe{EI{)>+&|NT2y7gO`WTJu!U&r{G?ZvF0a*grmM=wG_0NzkT$kDY(L z*-be5w*Q+^&6x++jPo=;2dDHX#ErQmm_z$u!`7i(g literal 0 HcmV?d00001 diff --git a/suckless/st/st-alpha-changealpha-20230519-b44f2ad.diff b/suckless/st/st-alpha-changealpha-20230519-b44f2ad.diff new file mode 100644 index 0000000..9d8bf6e --- /dev/null +++ b/suckless/st/st-alpha-changealpha-20230519-b44f2ad.diff @@ -0,0 +1,194 @@ +diff --git a/st/config.def.h b/st_patched/config.def.h +index 91ab8ca..59fc2a9 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -93,6 +93,10 @@ char *termname = "st-256color"; + */ + unsigned int tabspaces = 8; + ++/* bg opacity */ ++float alpha = 0.8; ++float alpha_def; ++ + /* Terminal colors (16 first used in escape sequence) */ + static const char *colorname[] = { + /* 8 normal colors */ +@@ -201,6 +205,9 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { MODKEY, XK_bracketleft, chgalpha, {.f = -1} }, /* Decrease opacity */ ++ { MODKEY|ShiftMask, XK_braceright, chgalpha, {.f = +1} }, /* Increase opacity */ ++ { MODKEY, XK_bracketright,chgalpha, {.f = 0} }, /* Reset opacity */ + }; + + /* +diff --git a/st/st.h b/st_patched/st.h +index fd3b0d8..cda8c13 100644 +--- a/st.h ++++ b/st.h +@@ -124,3 +124,4 @@ extern unsigned int tabspaces; + extern unsigned int defaultfg; + extern unsigned int defaultbg; + extern unsigned int defaultcs; ++extern float alpha, alpha_def; +diff --git a/st/config.mk b/st_patched/config.mk +index 1e306f8..47c615e 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/x.c b/st_patched/x.c +index aa09997..3b05a55 100644 +--- a/x.c ++++ b/x.c +@@ -59,6 +59,7 @@ static void zoom(const Arg *); + static void zoomabs(const Arg *); + static void zoomreset(const Arg *); + static void ttysend(const Arg *); ++static void chgalpha(const Arg *); + + /* config.h for applying patches and the configuration. */ + #include "config.h" +@@ -105,6 +106,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; +@@ -243,6 +245,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; +@@ -752,7 +755,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); + +@@ -812,6 +815,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; + } + +@@ -1134,11 +1144,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()) +@@ -1147,8 +1169,11 @@ xinit(int cols, int rows) + usedfont = (opt_font == NULL)? font : opt_font; + xloadfonts(usedfont, 0); + ++ /* Backup default alpha value */ ++ alpha_def = alpha; ++ + /* colors */ +- xw.cmap = XDefaultColormap(xw.dpy, xw.scr); ++ xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); + xloadcols(); + + /* adjust fixed window geometry */ +@@ -1168,19 +1193,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); + +@@ -1371,6 +1392,24 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x + return numspecs; + } + ++void ++chgalpha(const Arg *arg) ++{ ++ if (arg->f == -1.0f && alpha >= 0.1f) ++ alpha -= 0.1f; ++ else if (arg->f == 1.0f && alpha < 1.0f) ++ alpha += 0.1f; ++ else if (arg->f == 0.0f) ++ alpha = alpha_def; ++ else ++ return; ++ ++ dc.col[defaultbg].color.alpha = (unsigned short)(0xFFFF * alpha); ++ /* Required to remove artifacting from borderpx */ ++ cresize(0, 0); ++ redraw(); ++} ++ + void + xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) + { +@@ -2038,6 +2077,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/.suckless/st/st.1 b/suckless/st/st.1 similarity index 98% rename from .suckless/st/st.1 rename to suckless/st/st.1 index 39120b4..ef8c956 100644 --- a/.suckless/st/st.1 +++ b/suckless/st/st.1 @@ -1,6 +1,6 @@ .TH ST 1 st\-VERSION .SH NAME -st \- simple terminal +st \- simple terminal (bread's build) .SH SYNOPSIS .B st .RB [ \-aiv ] diff --git a/.suckless/st/st.c b/suckless/st/st.c similarity index 80% rename from .suckless/st/st.c rename to suckless/st/st.c index f0a70ff..367a3bb 100644 --- a/.suckless/st/st.c +++ b/suckless/st/st.c @@ -19,7 +19,6 @@ #include "st.h" #include "win.h" -#include "graphics.h" #if defined(__linux) #include @@ -36,11 +35,6 @@ #define ESC_ARG_SIZ 16 #define STR_BUF_SIZ ESC_BUF_SIZ #define STR_ARG_SIZ ESC_ARG_SIZ -#define HISTSIZE 2000 - -/* PUA character used as an image placeholder */ -#define IMAGE_PLACEHOLDER_CHAR 0x10EEEE -#define IMAGE_PLACEHOLDER_CHAR_OLD 0xEEEE /* macros */ #define IS_SET(flag) ((term.mode & (flag)) != 0) @@ -48,9 +42,10 @@ #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]) + +#define TSCREEN term.screen[IS_SET(MODE_ALTSCREEN)] +#define TLINEOFFSET(y) (((y) + TSCREEN.cur - TSCREEN.off + TSCREEN.size) % TSCREEN.size) +#define TLINE(y) (TSCREEN.buffer[TLINEOFFSET(y)]) enum term_mode { MODE_WRAP = 1 << 0, @@ -118,17 +113,21 @@ typedef struct { int alt; } Selection; +/* Screen lines */ +typedef struct { + Line* buffer; /* ring buffer */ + int size; /* size of buffer */ + int cur; /* start of active screen */ + int off; /* scrollback line offset */ + TCursor sc; /* saved cursor */ +} LineBuffer; + /* Internal representation of the screen */ typedef struct { int row; /* nb row */ int col; /* nb col */ - int pixw; /* width of the text area in pixels */ - int pixh; /* height of the text area in pixels */ - Line *line; /* screen */ - Line *alt; /* alternate screen */ - Line hist[HISTSIZE]; /* history buffer */ - int histi; /* history index */ - int scr; /* scroll back */ + LineBuffer screen[2]; /* screen and alternate screen */ + int linelen; /* allocated line length */ int *dirty; /* dirtyness of lines */ TCursor c; /* cursor */ int ocx; /* old cursor col */ @@ -199,8 +198,8 @@ static void tnewline(int); static void tputtab(int); static void tputc(Rune); static void treset(void); -static void tscrollup(int, int, int); -static void tscrolldown(int, int, int); +static void tscrollup(int, int); +static void tscrolldown(int, int); static void tsetattr(const int *, int); static void tsetchar(Rune, const Glyph *, int, int); static void tsetdirt(int, int); @@ -217,6 +216,8 @@ static void tdeftran(char); static void tstrsequence(uchar); static void drawregion(int, int, int, int); +static void clearline(Line, Glyph, int, int); +static Line ensureline(Line); static void selnormalize(void); static void selscroll(int, int); @@ -227,6 +228,7 @@ static Rune utf8decodebyte(char, size_t *); static char utf8encodebyte(Rune, size_t); static size_t utf8validate(Rune *, size_t); +static char *base64dec(const char *); static char base64dec_getc(const char **); static ssize_t xwrite(int, const char *, size_t); @@ -245,10 +247,6 @@ static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; -/* Converts a diacritic to a row/column/etc number. The result is 1-base, 0 - * means "couldn't convert". Defined in rowcolumn_diacritics_helpers.c */ -uint16_t diacritic_to_num(uint32_t code); - ssize_t xwrite(int fd, const char *s, size_t len) { @@ -425,11 +423,12 @@ int tlinelen(int y) { int i = term.col; + Line line = TLINE(y); - if (TLINE(y)[i - 1].mode & ATTR_WRAP) + if (line[i - 1].mode & ATTR_WRAP) return i; - while (i > 0 && TLINE(y)[i - 1].u == ' ') + while (i > 0 && line[i - 1].u == ' ') --i; return i; @@ -633,12 +632,6 @@ getsel(void) if (gp->mode & ATTR_WDUMMY) continue; - if (gp->mode & ATTR_IMAGE) { - // TODO: Copy diacritics as well - ptr += utf8encode(IMAGE_PLACEHOLDER_CHAR, ptr); - continue; - } - ptr += utf8encode(gp->u, ptr); } @@ -842,11 +835,7 @@ ttyread(void) { static char buf[BUFSIZ]; static int buflen = 0; - static int already_processing = 0; - int ret, written = 0; - - if (buflen >= LEN(buf)) - return 0; + int ret, written; /* append read bytes to unprocessed bytes */ ret = read(cmdfd, buf+buflen, LEN(buf)-buflen); @@ -858,24 +847,7 @@ ttyread(void) die("couldn't read from shell: %s\n", strerror(errno)); default: buflen += ret; - if (already_processing) { - /* Avoid recursive call to twrite() */ - return ret; - } - already_processing = 1; - while (1) { - int buflen_before_processing = buflen; - written += twrite(buf + written, buflen - written, 0); - // If buflen changed during the call to twrite, there is - // new data, and we need to keep processing, otherwise - // we can exit. This will not loop forever because the - // buffer is limited, and we don't clean it in this - // loop, so at some point ttywrite will have to drop - // some data. - if (buflen_before_processing == buflen) - break; - } - already_processing = 0; + written = twrite(buf, buflen, 0); buflen -= written; /* keep any incomplete UTF-8 byte sequence for the next call */ if (buflen > 0) @@ -888,9 +860,6 @@ 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); @@ -921,7 +890,6 @@ ttywriteraw(const char *s, size_t n) fd_set wfd, rfd; ssize_t r; size_t lim = 256; - int retries_left = 100; /* * Remember that we are using a pty, which might be a modem line. @@ -930,9 +898,6 @@ ttywriteraw(const char *s, size_t n) * FIXME: Migrate the world to Plan 9. */ while (n > 0) { - if (retries_left-- <= 0) - goto too_many_retries; - FD_ZERO(&wfd); FD_ZERO(&rfd); FD_SET(cmdfd, &wfd); @@ -974,16 +939,11 @@ ttywriteraw(const char *s, size_t n) write_error: die("write error on tty: %s\n", strerror(errno)); -too_many_retries: - fprintf(stderr, "Could not write %zu bytes to tty\n", n); } void ttyresize(int tw, int th) { - term.pixw = tw; - term.pixh = th; - struct winsize w; w.ws_row = term.row; @@ -1005,12 +965,15 @@ int tattrset(int attr) { int i, j; + int y = TLINEOFFSET(0); for (i = 0; i < term.row-1; i++) { + Line line = TSCREEN.buffer[y]; for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) + if (line[j].mode & attr) return 1; } + y = (y+1) % TSCREEN.size; } return 0; @@ -1032,14 +995,17 @@ void tsetdirtattr(int attr) { int i, j; + int y = TLINEOFFSET(0); for (i = 0; i < term.row-1; i++) { + Line line = TSCREEN.buffer[y]; for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) { + if (line[j].mode & attr) { tsetdirt(i, i); break; } } + y = (y+1) % TSCREEN.size; } } @@ -1052,28 +1018,19 @@ tfulldirt(void) void tcursor(int mode) { - static TCursor c[2]; - int alt = IS_SET(MODE_ALTSCREEN); - if (mode == CURSOR_SAVE) { - c[alt] = term.c; + TSCREEN.sc = term.c; } else if (mode == CURSOR_LOAD) { - term.c = c[alt]; - tmoveto(c[alt].x, c[alt].y); + term.c = TSCREEN.sc; + tmoveto(term.c.x, term.c.y); } } void treset(void) { - uint i; - - term.c = (TCursor){{ - .mode = ATTR_NULL, - .fg = defaultfg, - .bg = defaultbg, - .decor = DECOR_DEFAULT_COLOR - }, .x = 0, .y = 0, .state = CURSOR_DEFAULT}; + int i, j; + Glyph g = (Glyph){ .fg = defaultfg, .bg = defaultbg}; memset(term.tabs, 0, term.col * sizeof(*term.tabs)); for (i = tabspaces; i < term.col; i += tabspaces) @@ -1085,19 +1042,37 @@ treset(void) term.charset = 0; for (i = 0; i < 2; i++) { - tmoveto(0, 0); - tcursor(CURSOR_SAVE); - tclearregion(0, 0, term.col-1, term.row-1); - tswapscreen(); + term.screen[i].sc = (TCursor){{ + .fg = defaultfg, + .bg = defaultbg + }}; + term.screen[i].cur = 0; + term.screen[i].off = 0; + for (j = 0; j < term.row; ++j) { + if (term.col != term.linelen) + term.screen[i].buffer[j] = xrealloc(term.screen[i].buffer[j], term.col * sizeof(Glyph)); + clearline(term.screen[i].buffer[j], g, 0, term.col); + } + for (j = term.row; j < term.screen[i].size; ++j) { + free(term.screen[i].buffer[j]); + term.screen[i].buffer[j] = NULL; + } } + tcursor(CURSOR_LOAD); + term.linelen = term.col; + tfulldirt(); } void tnew(int col, int row) { - term = (Term){.c = {.attr = {.fg = defaultfg, - .bg = defaultbg, - .decor = DECOR_DEFAULT_COLOR}}}; + int i; + term = (Term){0}; + term.screen[0].buffer = xmalloc(HISTSIZE * sizeof(Line)); + term.screen[0].size = HISTSIZE; + term.screen[1].buffer = NULL; + for (i = 0; i < HISTSIZE; ++i) term.screen[0].buffer[i] = NULL; + tresize(col, row); treset(); } @@ -1105,104 +1080,108 @@ tnew(int col, int row) void tswapscreen(void) { - Line *tmp = term.line; - - term.line = term.alt; - term.alt = tmp; term.mode ^= MODE_ALTSCREEN; tfulldirt(); } void -kscrolldown(const Arg* a) +kscrollup(const Arg *a) { int n = a->i; - if (n < 0) - n = term.row + n; + if (IS_SET(MODE_ALTSCREEN)) + return; - if (n > term.scr) - n = term.scr; - - if (term.scr > 0) { - term.scr -= n; - selscroll(0, -n); - tfulldirt(); - } + if (n < 0) n = (-n) * term.row; + if (n > TSCREEN.size - term.row - TSCREEN.off) n = TSCREEN.size - term.row - TSCREEN.off; + while (!TLINE(-n)) --n; + TSCREEN.off += n; + selscroll(0, n); + tfulldirt(); } void -kscrollup(const Arg* a) +kscrolldown(const Arg *a) { + int n = a->i; - if (n < 0) - n = term.row + n; + if (IS_SET(MODE_ALTSCREEN)) + return; - if (term.scr <= HISTSIZE-n) { - term.scr += n; - selscroll(0, n); - tfulldirt(); - } + if (n < 0) n = (-n) * term.row; + if (n > TSCREEN.off) n = TSCREEN.off; + TSCREEN.off -= n; + selscroll(0, -n); + tfulldirt(); } void -tscrolldown(int orig, int n, int copyhist) +tscrolldown(int orig, int n) { 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; + /* Ensure that lines are allocated */ + for (i = -n; i < 0; i++) { + TLINE(i) = ensureline(TLINE(i)); } - tsetdirt(orig, term.bot-n); - tclearregion(0, term.bot-n+1, term.col-1, term.bot); - - for (i = term.bot; i >= orig+n; i--) { - temp = term.line[i]; - term.line[i] = term.line[i-n]; - term.line[i-n] = temp; + /* Shift non-scrolling areas in ring buffer */ + for (i = term.bot+1; i < term.row; i++) { + temp = TLINE(i); + TLINE(i) = TLINE(i-n); + TLINE(i-n) = temp; + } + for (i = 0; i < orig; i++) { + temp = TLINE(i); + TLINE(i) = TLINE(i-n); + TLINE(i-n) = temp; } - if (term.scr == 0) - selscroll(orig, n); + /* Scroll buffer */ + TSCREEN.cur = (TSCREEN.cur + TSCREEN.size - n) % TSCREEN.size; + /* Clear lines that have entered the view */ + tclearregion(0, orig, term.linelen-1, orig+n-1); + /* Redraw portion of the screen that has scrolled */ + tsetdirt(orig+n-1, term.bot); + selscroll(orig, n); } void -tscrollup(int orig, int n, int copyhist) +tscrollup(int orig, int n) { 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; + /* Ensure that lines are allocated */ + for (i = term.row; i < term.row + n; i++) { + TLINE(i) = ensureline(TLINE(i)); } - 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); - - for (i = orig; i <= term.bot-n; i++) { - temp = term.line[i]; - term.line[i] = term.line[i+n]; - term.line[i+n] = temp; + /* Shift non-scrolling areas in ring buffer */ + for (i = orig-1; i >= 0; i--) { + temp = TLINE(i); + TLINE(i) = TLINE(i+n); + TLINE(i+n) = temp; + } + for (i = term.row-1; i >term.bot; i--) { + temp = TLINE(i); + TLINE(i) = TLINE(i+n); + TLINE(i+n) = temp; } - if (term.scr == 0) - selscroll(orig, -n); + /* Scroll buffer */ + TSCREEN.cur = (TSCREEN.cur + n) % TSCREEN.size; + /* Clear lines that have entered the view */ + tclearregion(0, term.bot-n+1, term.linelen-1, term.bot); + /* Redraw portion of the screen that has scrolled */ + tsetdirt(orig, term.bot-n+1); + selscroll(orig, -n); } void @@ -1231,7 +1210,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1, 1); + tscrollup(term.top, 1); } else { y++; } @@ -1308,6 +1287,7 @@ tsetchar(Rune u, const Glyph *attr, int x, int y) "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ }; + Line line = TLINE(y); /* * The table is proudly stolen from rxvt. @@ -1316,44 +1296,25 @@ tsetchar(Rune u, const Glyph *attr, int x, int y) BETWEEN(u, 0x41, 0x7e) && vt100_0[u - 0x41]) utf8decode(vt100_0[u - 0x41], &u, UTF_SIZ); - if (term.line[y][x].mode & ATTR_WIDE) { + if (line[x].mode & ATTR_WIDE) { if (x+1 < term.col) { - term.line[y][x+1].u = ' '; - term.line[y][x+1].mode &= ~ATTR_WDUMMY; + line[x+1].u = ' '; + line[x+1].mode &= ~ATTR_WDUMMY; } - } else if (term.line[y][x].mode & ATTR_WDUMMY) { - term.line[y][x-1].u = ' '; - term.line[y][x-1].mode &= ~ATTR_WIDE; - } - - if (u == ' ' && term.line[y][x].mode & ATTR_IMAGE && - tgetisclassicplaceholder(&term.line[y][x])) { - // This is a workaround: don't overwrite classic placement - // placeholders with space symbols (unlike Unicode placeholders - // which must be overwritten by anything). - term.line[y][x].bg = attr->bg; - term.dirty[y] = 1; - return; + } else if (line[x].mode & ATTR_WDUMMY) { + line[x-1].u = ' '; + line[x-1].mode &= ~ATTR_WIDE; } 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; - - - if (u == IMAGE_PLACEHOLDER_CHAR || u == IMAGE_PLACEHOLDER_CHAR_OLD) { - term.line[y][x].u = 0; - term.line[y][x].mode |= ATTR_IMAGE; - } + line[x] = *attr; + line[x].u = u; } void tclearregion(int x1, int y1, int x2, int y2) { - int x, y, temp; + int x, y, L, S, temp; Glyph *gp; if (x1 > x2) @@ -1361,114 +1322,24 @@ tclearregion(int x1, int y1, int x2, int y2) if (y1 > y2) temp = y1, y1 = y2, y2 = temp; - LIMIT(x1, 0, term.col-1); - LIMIT(x2, 0, term.col-1); + LIMIT(x1, 0, term.linelen-1); + LIMIT(x2, 0, term.linelen-1); LIMIT(y1, 0, term.row-1); LIMIT(y2, 0, term.row-1); + L = TLINEOFFSET(y1); for (y = y1; y <= y2; y++) { term.dirty[y] = 1; for (x = x1; x <= x2; x++) { - gp = &term.line[y][x]; + gp = &TSCREEN.buffer[L][x]; if (selected(x, y)) selclear(); gp->fg = term.c.attr.fg; gp->bg = term.c.attr.bg; - gp->decor = term.c.attr.decor; gp->mode = 0; gp->u = ' '; } - } -} - -/// Fills a rectangle area with an image placeholder. The starting point is the -/// cursor. Adds empty lines if needed. The placeholder will be marked as -/// classic. -void -tcreateimgplaceholder(uint32_t image_id, uint32_t placement_id, - int cols, int rows, char do_not_move_cursor) -{ - for (int row = 0; row < rows; ++row) { - int y = term.c.y; - term.dirty[y] = 1; - for (int col = 0; col < cols; ++col) { - int x = term.c.x + col; - if (x >= term.col) - break; - Glyph *gp = &term.line[y][x]; - if (selected(x, y)) - selclear(); - gp->mode = ATTR_IMAGE; - gp->u = 0; - tsetimgrow(gp, row + 1); - tsetimgcol(gp, col + 1); - tsetimgid(gp, image_id); - tsetimgplacementid(gp, placement_id); - tsetimgdiacriticcount(gp, 3); - tsetisclassicplaceholder(gp, 1); - } - // If moving the cursor is not allowed and this is the last line - // of the terminal, we are done. - if (do_not_move_cursor && y == term.row - 1) - break; - // Move the cursor down, maybe creating a new line. The x is - // preserved (we never change term.c.x in the loop above). - if (row != rows - 1) - tnewline(/*first_col=*/0); - } - if (do_not_move_cursor) { - // Return the cursor to the original position. - tmoveto(term.c.x, term.c.y - rows + 1); - } else { - // Move the cursor beyond the last column, as required by the - // protocol. If the cursor goes beyond the screen edge, insert a - // newline to match the behavior of kitty. - if (term.c.x + cols >= term.col) - tnewline(/*first_col=*/1); - else - tmoveto(term.c.x + cols, term.c.y); - } -} - -void gr_for_each_image_cell(int (*callback)(void *data, uint32_t image_id, - uint32_t placement_id, int col, - int row, char is_classic), - void *data) { - for (int row = 0; row < term.row; ++row) { - for (int col = 0; col < term.col; ++col) { - Glyph *gp = &term.line[row][col]; - if (gp->mode & ATTR_IMAGE) { - uint32_t image_id = tgetimgid(gp); - uint32_t placement_id = tgetimgplacementid(gp); - int ret = - callback(data, tgetimgid(gp), - tgetimgplacementid(gp), - tgetimgcol(gp), tgetimgrow(gp), - tgetisclassicplaceholder(gp)); - if (ret == 1) { - term.dirty[row] = 1; - gp->mode = 0; - gp->u = ' '; - } - } - } - } -} - -void gr_schedule_image_redraw_by_id(uint32_t image_id) { - for (int row = 0; row < term.row; ++row) { - if (term.dirty[row]) - continue; - for (int col = 0; col < term.col; ++col) { - Glyph *gp = &term.line[row][col]; - if (gp->mode & ATTR_IMAGE) { - uint32_t cell_image_id = tgetimgid(gp); - if (cell_image_id == image_id) { - term.dirty[row] = 1; - break; - } - } - } + L = (L + 1) % TSCREEN.size; } } @@ -1483,7 +1354,7 @@ tdeletechar(int n) dst = term.c.x; src = term.c.x + n; size = term.col - src; - line = term.line[term.c.y]; + line = TLINE(term.c.y); memmove(&line[dst], &line[src], size * sizeof(Glyph)); tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); @@ -1500,7 +1371,7 @@ tinsertblank(int n) dst = term.c.x + n; src = term.c.x; size = term.col - dst; - line = term.line[term.c.y]; + line = TLINE(term.c.y); memmove(&line[dst], &line[src], size * sizeof(Glyph)); tclearregion(src, term.c.y, dst - 1, term.c.y); @@ -1510,14 +1381,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n, 0); + tscrolldown(term.c.y, n); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n, 0); + tscrollup(term.c.y, n); } int32_t @@ -1590,7 +1461,6 @@ tsetattr(const int *attr, int l) ATTR_STRUCK ); term.c.attr.fg = defaultfg; term.c.attr.bg = defaultbg; - term.c.attr.decor = DECOR_DEFAULT_COLOR; break; case 1: term.c.attr.mode |= ATTR_BOLD; @@ -1603,20 +1473,6 @@ tsetattr(const int *attr, int l) break; case 4: term.c.attr.mode |= ATTR_UNDERLINE; - if (i + 1 < l) { - idx = attr[++i]; - if (BETWEEN(idx, 1, 5)) { - tsetdecorstyle(&term.c.attr, idx); - } else if (idx == 0) { - term.c.attr.mode &= ~ATTR_UNDERLINE; - tsetdecorstyle(&term.c.attr, 0); - } else { - fprintf(stderr, - "erresc: unknown underline " - "style %d\n", - idx); - } - } break; case 5: /* slow blink */ /* FALLTHROUGH */ @@ -1640,7 +1496,6 @@ tsetattr(const int *attr, int l) break; case 24: term.c.attr.mode &= ~ATTR_UNDERLINE; - tsetdecorstyle(&term.c.attr, 0); break; case 25: term.c.attr.mode &= ~ATTR_BLINK; @@ -1668,13 +1523,6 @@ tsetattr(const int *attr, int l) case 49: term.c.attr.bg = defaultbg; break; - case 58: - if ((idx = tdefcolor(attr, &i, l)) >= 0) - tsetdecorcolor(&term.c.attr, idx); - break; - case 59: - tsetdecorcolor(&term.c.attr, DECOR_DEFAULT_COLOR); - break; default: if (BETWEEN(attr[i], 30, 37)) { term.c.attr.fg = attr[i] - 30; @@ -1978,11 +1826,11 @@ csihandle(void) case 'S': /* SU -- Scroll line up */ if (csiescseq.priv) break; DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0], 0); + tscrollup(term.top, csiescseq.arg[0]); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0], 0); + tscrolldown(term.top, csiescseq.arg[0]); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2058,39 +1906,6 @@ csihandle(void) goto unknown; } break; - case '>': - switch (csiescseq.mode[1]) { - case 'q': /* XTVERSION -- Print terminal name and version */ - len = snprintf(buf, sizeof(buf), - "\033P>|st-graphics(%s)\033\\", VERSION); - ttywrite(buf, len, 0); - break; - default: - goto unknown; - } - break; - case 't': /* XTWINOPS -- Window manipulation */ - switch (csiescseq.arg[0]) { - case 14: /* Report text area size in pixels. */ - len = snprintf(buf, sizeof(buf), "\033[4;%i;%it", - term.pixh, term.pixw); - ttywrite(buf, len, 0); - break; - case 16: /* Report character cell size in pixels. */ - len = snprintf(buf, sizeof(buf), "\033[6;%i;%it", - term.pixh / term.row, - term.pixw / term.col); - ttywrite(buf, len, 0); - break; - case 18: /* Report the size of the text area in characters. */ - len = snprintf(buf, sizeof(buf), "\033[8;%i;%it", - term.row, term.col); - ttywrite(buf, len, 0); - break; - default: - goto unknown; - } - break; } } @@ -2240,26 +2055,8 @@ strhandle(void) case 'k': /* old title set compatibility */ xsettitle(strescseq.args[0]); return; - case '_': /* APC -- Application Program Command */ - if (gr_parse_command(strescseq.buf, strescseq.len)) { - GraphicsCommandResult *res = &graphics_command_result; - if (res->create_placeholder) { - tcreateimgplaceholder( - res->placeholder.image_id, - res->placeholder.placement_id, - res->placeholder.columns, - res->placeholder.rows, - res->placeholder.do_not_move_cursor); - } - if (res->response[0]) - ttywrite(res->response, strlen(res->response), - 0); - if (res->redraw) - tfulldirt(); - return; - } - return; case 'P': /* DCS -- Device Control String */ + case '_': /* APC -- Application Program Command */ case '^': /* PM -- Privacy Message */ return; } @@ -2378,7 +2175,7 @@ tdumpline(int n) char buf[UTF_SIZ]; const Glyph *bp, *end; - bp = &term.line[n][0]; + bp = &TLINE(n)[0]; end = &bp[MIN(tlinelen(n), term.col) - 1]; if (bp != end || bp->u != ' ') { for ( ; bp <= end; ++bp) @@ -2605,7 +2402,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1, 1); + tscrollup(term.top, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2618,7 +2415,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1, 1); + tscrolldown(term.top, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2765,38 +2562,11 @@ check_control_code: if (selected(term.c.x, term.c.y)) selclear(); - if (width == 0) { - // It's probably a combining char. Combining characters are not - // supported, so we just ignore them, unless it denotes the row and - // column of an image character. - if (term.c.y <= 0 && term.c.x <= 0) - return; - else if (term.c.x == 0) - gp = &term.line[term.c.y-1][term.col-1]; - else if (term.c.state & CURSOR_WRAPNEXT) - gp = &term.line[term.c.y][term.c.x]; - else - gp = &term.line[term.c.y][term.c.x-1]; - uint16_t num = diacritic_to_num(u); - if (num && (gp->mode & ATTR_IMAGE)) { - unsigned diaccount = tgetimgdiacriticcount(gp); - if (diaccount == 0) - tsetimgrow(gp, num); - else if (diaccount == 1) - tsetimgcol(gp, num); - else if (diaccount == 2) - tsetimg4thbyteplus1(gp, num); - tsetimgdiacriticcount(gp, diaccount + 1); - } - term.lastc = u; - return; - } - - gp = &term.line[term.c.y][term.c.x]; + gp = &TLINE(term.c.y)[term.c.x]; if (IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) { gp->mode |= ATTR_WRAP; tnewline(1); - gp = &term.line[term.c.y][term.c.x]; + gp = &TLINE(term.c.y)[term.c.x]; } if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) { @@ -2809,7 +2579,7 @@ check_control_code: tnewline(1); else tmoveto(term.col - width, term.c.y); - gp = &term.line[term.c.y][term.c.x]; + gp = &TLINE(term.c.y)[term.c.x]; } tsetchar(u, &term.c.attr, term.c.x, term.c.y); @@ -2840,6 +2610,11 @@ twrite(const char *buf, int buflen, int show_ctrl) Rune u; int n; + if (TSCREEN.off) { + TSCREEN.off = 0; + tfulldirt(); + } + for (n = 0; n < buflen; n += charsize) { if (IS_SET(MODE_UTF8)) { /* process a complete utf8 char */ @@ -2865,65 +2640,86 @@ twrite(const char *buf, int buflen, int show_ctrl) return n; } +void +clearline(Line line, Glyph g, int x, int xend) +{ + int i; + g.mode = 0; + g.u = ' '; + for (i = x; i < xend; ++i) { + line[i] = g; + } +} + +Line +ensureline(Line line) +{ + if (!line) { + line = xmalloc(term.linelen * sizeof(Glyph)); + } + return line; +} + void tresize(int col, int row) { int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); + int linelen = MAX(col, term.linelen); int *bp; - TCursor c; - if (col < 1 || row < 1) { + if (col < 1 || row < 1 || row > HISTSIZE) { fprintf(stderr, "tresize: error resizing to %dx%d\n", col, row); return; } - /* - * slide screen to keep cursor where we expect it - - * tscrollup would work here, but we can optimize to - * memmove because we're freeing the earlier lines - */ - for (i = 0; i <= term.c.y - row; i++) { - free(term.line[i]); - free(term.alt[i]); + /* Shift buffer to keep the cursor where we expect it */ + if (row <= term.c.y) { + term.screen[0].cur = (term.screen[0].cur - row + term.c.y + 1) % term.screen[0].size; } - /* ensure that both src and dst are not NULL */ - if (i > 0) { - memmove(term.line, term.line + i, row * sizeof(Line)); - memmove(term.alt, term.alt + i, row * sizeof(Line)); + + /* Resize and clear line buffers as needed */ + if (linelen > term.linelen) { + for (i = 0; i < term.screen[0].size; ++i) { + if (term.screen[0].buffer[i]) { + term.screen[0].buffer[i] = xrealloc(term.screen[0].buffer[i], linelen * sizeof(Glyph)); + clearline(term.screen[0].buffer[i], term.c.attr, term.linelen, linelen); + } + } + for (i = 0; i < minrow; ++i) { + term.screen[1].buffer[i] = xrealloc(term.screen[1].buffer[i], linelen * sizeof(Glyph)); + clearline(term.screen[1].buffer[i], term.c.attr, term.linelen, linelen); + } } - for (i += row; i < term.row; i++) { - free(term.line[i]); - free(term.alt[i]); + /* Allocate all visible lines for regular line buffer */ + for (j = term.screen[0].cur, i = 0; i < row; ++i, j = (j + 1) % term.screen[0].size) + { + if (!term.screen[0].buffer[j]) { + term.screen[0].buffer[j] = xmalloc(linelen * sizeof(Glyph)); + } + if (i >= term.row) { + clearline(term.screen[0].buffer[j], term.c.attr, 0, linelen); + } + } + /* Resize alt screen */ + term.screen[1].cur = 0; + term.screen[1].size = row; + for (i = row; i < term.row; ++i) { + free(term.screen[1].buffer[i]); + } + term.screen[1].buffer = xrealloc(term.screen[1].buffer, row * sizeof(Line)); + for (i = term.row; i < row; ++i) { + term.screen[1].buffer[i] = xmalloc(linelen * sizeof(Glyph)); + clearline(term.screen[1].buffer[i], term.c.attr, 0, linelen); } /* resize to new height */ - term.line = xrealloc(term.line, row * sizeof(Line)); - term.alt = xrealloc(term.alt, row * sizeof(Line)); 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)); - term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); - } - - /* allocate any new rows */ - for (/* i = minrow */; i < row; i++) { - term.line[i] = xmalloc(col * sizeof(Glyph)); - term.alt[i] = xmalloc(col * sizeof(Glyph)); - } + /* fix tabstops */ if (col > term.col) { bp = term.tabs + term.col; @@ -2933,26 +2729,16 @@ tresize(int col, int row) for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces) *bp = 1; } + /* update terminal size */ term.col = col; term.row = row; + term.linelen = linelen; /* reset scrolling region */ tsetscroll(0, row-1); /* make use of the LIMIT in tmoveto */ tmoveto(term.c.x, term.c.y); - /* Clearing both screens (it makes dirty all lines) */ - c = term.c; - for (i = 0; i < 2; i++) { - if (mincol < col && 0 < minrow) { - tclearregion(mincol, 0, col - 1, minrow - 1); - } - if (0 < col && minrow < row) { - tclearregion(0, minrow, col - 1, row - 1); - } - tswapscreen(); - tcursor(CURSOR_LOAD); - } - term.c = c; + tfulldirt(); } void @@ -2964,19 +2750,16 @@ resettitle(void) void drawregion(int x1, int y1, int x2, int y2) { - int y; - - xstartimagedraw(term.dirty, term.row); + int y, L; + L = TLINEOFFSET(y1); for (y = y1; y < y2; y++) { - if (!term.dirty[y]) - continue; - - term.dirty[y] = 0; - xdrawline(TLINE(y), x1, y, x2); + if (term.dirty[y]) { + term.dirty[y] = 0; + xdrawline(TSCREEN.buffer[L], x1, y, x2); + } + L = (L + 1) % TSCREEN.size; } - - xfinishimagedraw(); } void @@ -2990,15 +2773,17 @@ draw(void) /* adjust cursor position */ LIMIT(term.ocx, 0, term.col-1); LIMIT(term.ocy, 0, term.row-1); - if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY) + if (TLINE(term.ocy)[term.ocx].mode & ATTR_WDUMMY) term.ocx--; - if (term.line[term.c.y][cx].mode & ATTR_WDUMMY) + if (TLINE(term.c.y)[cx].mode & ATTR_WDUMMY) cx--; 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]); + if (TSCREEN.off == 0) + xdrawcursor(cx, term.c.y, TLINE(term.c.y)[cx], + term.ocx, term.ocy, TLINE(term.ocy)[term.ocx], + TLINE(term.ocy), term.col); + term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); @@ -3012,9 +2797,3 @@ redraw(void) tfulldirt(); draw(); } - -Glyph -getglyphat(int col, int row) -{ - return term.line[row][col]; -} diff --git a/suckless/st/st.h b/suckless/st/st.h new file mode 100644 index 0000000..4649646 --- /dev/null +++ b/suckless/st/st.h @@ -0,0 +1,130 @@ +/* See LICENSE for license details. */ + +#include +#include + +/* macros */ +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) < (b) ? (b) : (a)) +#define LEN(a) (sizeof(a) / sizeof(a)[0]) +#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) +#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)) != ((b).mode & (~ATTR_WRAP)) || \ + (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) +#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) + +#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) +#define IS_TRUECOL(x) (1 << 24 & (x)) +#define HISTSIZE 2000 + +enum glyph_attribute { + ATTR_NULL = 0, + ATTR_BOLD = 1 << 0, + ATTR_FAINT = 1 << 1, + ATTR_ITALIC = 1 << 2, + ATTR_UNDERLINE = 1 << 3, + ATTR_BLINK = 1 << 4, + ATTR_REVERSE = 1 << 5, + ATTR_INVISIBLE = 1 << 6, + ATTR_STRUCK = 1 << 7, + ATTR_WRAP = 1 << 8, + ATTR_WIDE = 1 << 9, + ATTR_WDUMMY = 1 << 10, + ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, +}; + +enum selection_mode { + SEL_IDLE = 0, + SEL_EMPTY = 1, + SEL_READY = 2 +}; + +enum selection_type { + SEL_REGULAR = 1, + SEL_RECTANGULAR = 2 +}; + +enum selection_snap { + SNAP_WORD = 1, + SNAP_LINE = 2 +}; + +typedef unsigned char uchar; +typedef unsigned int uint; +typedef unsigned long ulong; +typedef unsigned short ushort; + +typedef uint_least32_t Rune; + +#define Glyph Glyph_ +typedef struct { + Rune u; /* character code */ + ushort mode; /* attribute flags */ + uint32_t fg; /* foreground */ + uint32_t bg; /* background */ +} Glyph; + +typedef Glyph *Line; + +typedef union { + int i; + uint ui; + float f; + const void *v; + const char *s; +} Arg; + +void die(const char *, ...); +void redraw(void); +void draw(void); + +void printscreen(const Arg *); +void printsel(const Arg *); +void sendbreak(const Arg *); +void toggleprinter(const Arg *); + +int tattrset(int); +void tnew(int, int); +void tresize(int, int); +void tsetdirtattr(int); +void ttyhangup(void); +int ttynew(const char *, char *, const char *, char **); +size_t ttyread(void); +void ttyresize(int, int); +void ttywrite(const char *, size_t, int); + +void resettitle(void); + +void selclear(void); +void selinit(void); +void selstart(int, int, int); +void selextend(int, int, int, int); +int selected(int, int); +char *getsel(void); + +size_t utf8encode(Rune, char *); + +void *xmalloc(size_t); +void *xrealloc(void *, size_t); +char *xstrdup(const char *); + +/* config.h globals */ +extern char *utmp; +extern char *scroll; +extern char *stty_args; +extern char *vtiden; +extern wchar_t *worddelimiters; +extern int allowaltscreen; +extern int allowwindowops; +extern char *termname; +extern unsigned int tabspaces; +extern unsigned int defaultfg; +extern unsigned int defaultbg; +extern unsigned int defaultcs; +extern float alpha; +extern float alpha_def; diff --git a/.suckless/st/st.info b/suckless/st/st.info similarity index 96% rename from .suckless/st/st.info rename to suckless/st/st.info index ded76c1..efab2cf 100644 --- a/.suckless/st/st.info +++ b/suckless/st/st.info @@ -195,7 +195,6 @@ st-mono| simpleterm monocolor, Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q, - Smulx=\E[4:%p1%dm, st| simpleterm, use=st-mono, @@ -216,11 +215,6 @@ st-256color| simpleterm with 256 colors, initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, -# Underline colors - Su, - Setulc=\E[58:2:%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d%;m, - Setulc1=\E[58:5:%p1%dm, - ol=\E[59m, st-meta| simpleterm with meta key, use=st, diff --git a/suckless/st/st.o b/suckless/st/st.o new file mode 100644 index 0000000000000000000000000000000000000000..6f4b43b52a09233ac3f55c8debc691494db1cd60 GIT binary patch literal 82592 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 #include #include -#include -#include #include #include #include @@ -16,12 +14,13 @@ #include #include #include +#include char *argv0; #include "arg.h" #include "st.h" #include "win.h" -#include "graphics.h" +#include "hb.h" /* types used in config.h */ typedef struct { @@ -62,12 +61,9 @@ static void zoom(const Arg *); static void zoomabs(const Arg *); static void zoomreset(const Arg *); static void ttysend(const Arg *); -static void previewimage(const Arg *); -static void showimageinfo(const Arg *); -static void togglegrdebug(const Arg *); -static void dumpgrstate(const Arg *); -static void unloadimages(const Arg *); -static void toggleimages(const Arg *); +static void chgalpha(const Arg *); +void kscrollup(const Arg *); +void kscrolldown(const Arg *); /* config.h for applying patches and the configuration. */ #include "config.h" @@ -90,7 +86,6 @@ typedef XftGlyphFontSpec GlyphFontSpec; typedef struct { int tw, th; /* tty width and height */ int w, h; /* window width and height */ - int hborderpx, vborderpx; int ch; /* char height */ int cw; /* char width */ int mode; /* window state/mode flags */ @@ -115,6 +110,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; @@ -151,11 +147,10 @@ typedef struct { } DC; static inline ushort sixd_to_16bit(int); +static void xresetfontsettings(ushort mode, Font **font, int *frcflags); static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); -static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); +static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int, int); static void xdrawglyph(Glyph, int, int); -static void xdrawimages(Glyph, Line, int x1, int y1, int x2); -static void xdrawoneimagecell(Glyph, int x, int y); static void xclear(int, int, int, int); static int xgeommasktogravity(int); static int ximopen(Display *); @@ -232,7 +227,6 @@ static DC dc; static XWindow xw; static XSelection xsel; static TermWindow win; -static unsigned int mouse_col = 0, mouse_row = 0; /* Font Ring Cache */ enum { @@ -256,6 +250,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; @@ -341,72 +336,10 @@ ttysend(const Arg *arg) ttywrite(arg->s, strlen(arg->s), 1); } -void -previewimage(const Arg *arg) -{ - Glyph g = getglyphat(mouse_col, mouse_row); - if (g.mode & ATTR_IMAGE) { - uint32_t image_id = tgetimgid(&g); - fprintf(stderr, "Clicked on placeholder %u/%u, x=%d, y=%d\n", - image_id, tgetimgplacementid(&g), tgetimgcol(&g), - tgetimgrow(&g)); - gr_preview_image(image_id, arg->s); - } -} - -void -showimageinfo(const Arg *arg) -{ - Glyph g = getglyphat(mouse_col, mouse_row); - if (g.mode & ATTR_IMAGE) { - uint32_t image_id = tgetimgid(&g); - fprintf(stderr, "Clicked on placeholder %u/%u, x=%d, y=%d\n", - image_id, tgetimgplacementid(&g), tgetimgcol(&g), - tgetimgrow(&g)); - char stcommand[256] = {0}; - size_t len = snprintf(stcommand, sizeof(stcommand), "%s -e less", argv0); - if (len > sizeof(stcommand) - 1) { - fprintf(stderr, "Executable name too long: %s\n", - argv0); - return; - } - gr_show_image_info(image_id, tgetimgplacementid(&g), - tgetimgcol(&g), tgetimgrow(&g), - tgetisclassicplaceholder(&g), - tgetimgdiacriticcount(&g), argv0); - } -} - -void -togglegrdebug(const Arg *arg) -{ - graphics_debug_mode = (graphics_debug_mode + 1) % 3; - redraw(); -} - -void -dumpgrstate(const Arg *arg) -{ - gr_dump_state(); -} - -void -unloadimages(const Arg *arg) -{ - gr_unload_images_to_reduce_ram(); -} - -void -toggleimages(const Arg *arg) -{ - graphics_display_images = !graphics_display_images; - redraw(); -} - int evcol(XEvent *e) { - int x = e->xbutton.x - win.hborderpx; + int x = e->xbutton.x - borderpx; LIMIT(x, 0, win.tw - 1); return x / win.cw; } @@ -414,7 +347,7 @@ evcol(XEvent *e) int evrow(XEvent *e) { - int y = e->xbutton.y - win.vborderpx; + int y = e->xbutton.y - borderpx; LIMIT(y, 0, win.th - 1); return y / win.ch; } @@ -527,9 +460,6 @@ mouseaction(XEvent *e, uint release) /* ignore Buttonmask for Button - it's set on release */ uint state = e->xbutton.state & ~buttonmask(e->xbutton.button); - mouse_col = evcol(e); - mouse_row = evrow(e); - for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { if (ms->release == release && ms->button == e->xbutton.button && @@ -817,9 +747,6 @@ cresize(int width, int height) col = MAX(1, col); row = MAX(1, row); - win.hborderpx = (win.w - col * win.cw) * anysize_halign / 100; - win.vborderpx = (win.h - row * win.ch) * anysize_valign / 100; - tresize(col, row); xresize(col, row); ttyresize(win.tw, win.th); @@ -833,12 +760,12 @@ 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); /* resize to new width */ - xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); + xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec) * 4); } ushort @@ -893,6 +820,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; } @@ -950,8 +884,8 @@ xhints(void) sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; sizeh->height = win.h; sizeh->width = win.w; - sizeh->height_inc = 1; - sizeh->width_inc = 1; + sizeh->height_inc = win.ch; + sizeh->width_inc = win.cw; sizeh->base_height = 2 * borderpx; sizeh->base_width = 2 * borderpx; sizeh->min_height = win.ch + 2 * borderpx; @@ -1095,8 +1029,7 @@ xloadfonts(const char *fontstr, double fontsize) FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); usedfontsize = 12; } - if (defaultfontsize <= 0) - defaultfontsize = usedfontsize; + defaultfontsize = usedfontsize; } if (xloadfont(&dc.font, pattern)) @@ -1106,7 +1039,7 @@ xloadfonts(const char *fontstr, double fontsize) FcPatternGetDouble(dc.font.match->pattern, FC_PIXEL_SIZE, 0, &fontval); usedfontsize = fontval; - if (defaultfontsize <= 0 && fontsize == 0) + if (fontsize == 0) defaultfontsize = fontval; } @@ -1144,6 +1077,9 @@ 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); @@ -1216,11 +1152,23 @@ xinit(int cols, int rows) Window parent, root; 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()) @@ -1229,13 +1177,16 @@ xinit(int cols, int rows) usedfont = (opt_font == NULL)? font : opt_font; xloadfonts(usedfont, 0); + /* Backup default alpha value */ + alpha_def = alpha; + /* colors */ - xw.cmap = XDefaultColormap(xw.dpy, xw.scr); + xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); xloadcols(); /* adjust fixed window geometry */ - win.w = 2 * win.hborderpx + 2 * borderpx + cols * win.cw; - win.h = 2 * win.vborderpx + 2 * borderpx + rows * win.ch; + win.w = 2 * borderpx + cols * win.cw; + win.h = 2 * borderpx + rows * win.ch; if (xw.gm & XNegative) xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; if (xw.gm & YNegative) @@ -1251,10 +1202,8 @@ xinit(int cols, int rows) xw.attrs.colormap = xw.cmap; root = XRootWindow(xw.dpy, xw.scr); - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) - parent = root; xw.win = XCreateWindow(xw.dpy, root, 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); if (parent != root) @@ -1262,15 +1211,13 @@ xinit(int cols, int rows) memset(&gcvalues, 0, sizeof(gcvalues)); gcvalues.graphics_exposures = False; - dc.gc = XCreateGC(xw.dpy, xw.win, 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); /* font spec buffer */ - xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); + xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec) * 4); /* Xft rendering context */ xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); @@ -1322,17 +1269,28 @@ 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); - - // Initialize the graphics (image display) module. - gr_init(xw.dpy, xw.vis, xw.cmap); +void +xresetfontsettings(ushort mode, Font **font, int *frcflags) +{ + *font = &dc.font; + if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { + *font = &dc.ibfont; + *frcflags = FRC_ITALICBOLD; + } else if (mode & ATTR_ITALIC) { + *font = &dc.ifont; + *frcflags = FRC_ITALIC; + } else if (mode & ATTR_BOLD) { + *font = &dc.bfont; + *frcflags = FRC_BOLD; + } } int xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) { - float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; + float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; ushort mode, prevmode = USHRT_MAX; Font *font = &dc.font; int frcflags = FRC_NORMAL; @@ -1343,189 +1301,175 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x FcPattern *fcpattern, *fontpattern; FcFontSet *fcsets[] = { NULL }; FcCharSet *fccharset; - int i, f, numspecs = 0; + int i, f, length = 0, start = 0, numspecs = 0; + float cluster_xp = xp, cluster_yp = yp; + HbTransformData shaped = { 0 }; + + /* Initial values. */ + mode = prevmode = glyphs[0].mode & ~ATTR_WRAP; + xresetfontsettings(mode, &font, &frcflags); for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { - /* Fetch rune and mode for current glyph. */ - rune = glyphs[i].u; - mode = glyphs[i].mode; + mode = glyphs[i].mode & ~ATTR_WRAP; /* Skip dummy wide-character spacing. */ - if (mode == ATTR_WDUMMY) + if (mode & ATTR_WDUMMY && i < (len - 1)) continue; - /* Draw spaces for image placeholders (images will be drawn - * separately). */ - if (mode & ATTR_IMAGE) - rune = ' '; - - /* Determine font for glyph if different from previous glyph. */ - if (prevmode != mode) { - prevmode = mode; - font = &dc.font; - frcflags = FRC_NORMAL; - runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); - if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { - font = &dc.ibfont; - frcflags = FRC_ITALICBOLD; - } else if (mode & ATTR_ITALIC) { - font = &dc.ifont; - frcflags = FRC_ITALIC; - } else if (mode & ATTR_BOLD) { - font = &dc.bfont; - frcflags = FRC_BOLD; - } - 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); - } - if (glyphidx) { - specs[numspecs].font = font->match; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - continue; - } - - /* Fallback on font cache, search the font cache for match. */ - for (f = 0; f < frclen; f++) { - glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); - /* Everything correct. */ - if (glyphidx && frc[f].flags == frcflags) - break; - /* We got a default font for a not found glyph. */ - if (!glyphidx && frc[f].flags == frcflags - && frc[f].unicodep == rune) { - break; - } - } - - /* Nothing was found. Use fontconfig to find matching font. */ - if (f >= frclen) { - if (!font->set) - font->set = FcFontSort(0, font->pattern, - 1, 0, &fcres); - fcsets[0] = font->set; - - /* - * Nothing was found in the cache. Now use - * some dozen of Fontconfig calls to get the - * font for one single character. - * - * Xft and fontconfig are design failures. - */ - fcpattern = FcPatternDuplicate(font->pattern); - fccharset = FcCharSetCreate(); - - FcCharSetAddChar(fccharset, rune); - FcPatternAddCharSet(fcpattern, FC_CHARSET, - fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, 1); - - FcConfigSubstitute(0, fcpattern, - FcMatchPattern); - FcDefaultSubstitute(fcpattern); - - fontpattern = FcFontSetMatch(0, fcsets, 1, - fcpattern, &fcres); - - /* Allocate memory for the new cache entry. */ - if (frclen >= frccap) { - frccap += 16; - frc = xrealloc(frc, frccap * sizeof(Fontcache)); + if ( + prevmode != mode + || ATTRCMP(glyphs[start], glyphs[i]) + || selected(x + i, y) != selected(x + start, y) + || i == (len - 1) + ) { + /* Handle 1-character wide segments and end of line */ + length = i - start; + if (i == start) { + length = 1; + } else if (i == (len - 1)) { + length = (i - start + 1); } - frc[frclen].font = XftFontOpenPattern(xw.dpy, - fontpattern); - if (!frc[frclen].font) - die("XftFontOpenPattern failed seeking fallback font: %s\n", - strerror(errno)); - frc[frclen].flags = frcflags; - frc[frclen].unicodep = rune; + /* Shape the segment. */ + hbtransform(&shaped, font->match, glyphs, start, length); + runewidth = win.cw * ((glyphs[start].mode & ATTR_WIDE) ? 2.0f : 1.0f); + cluster_xp = xp; cluster_yp = yp; + for (int code_idx = 0; code_idx < shaped.count; code_idx++) { + int idx = shaped.glyphs[code_idx].cluster; - glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); + if (glyphs[start + idx].mode & ATTR_WDUMMY) + continue; - f = frclen; - frclen++; + /* Advance the drawing cursor if we've moved to a new cluster */ + if (code_idx > 0 && idx != shaped.glyphs[code_idx - 1].cluster) { + xp += runewidth; + cluster_xp = xp; + cluster_yp = yp; + runewidth = win.cw * ((glyphs[start + idx].mode & ATTR_WIDE) ? 2.0f : 1.0f); + } - FcPatternDestroy(fcpattern); - FcCharSetDestroy(fccharset); + if (shaped.glyphs[code_idx].codepoint != 0) { + /* If symbol is found, put it into the specs. */ + specs[numspecs].font = font->match; + specs[numspecs].glyph = shaped.glyphs[code_idx].codepoint; + specs[numspecs].x = cluster_xp + (short)(shaped.positions[code_idx].x_offset / 64.); + specs[numspecs].y = cluster_yp - (short)(shaped.positions[code_idx].y_offset / 64.); + cluster_xp += shaped.positions[code_idx].x_advance / 64.; + cluster_yp += shaped.positions[code_idx].y_advance / 64.; + numspecs++; + } else { + /* If it's not found, try to fetch it through the font cache. */ + rune = glyphs[start + idx].u; + for (f = 0; f < frclen; f++) { + glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); + /* Everything correct. */ + if (glyphidx && frc[f].flags == frcflags) + break; + /* We got a default font for a not found glyph. */ + if (!glyphidx && frc[f].flags == frcflags + && frc[f].unicodep == rune) { + break; + } + } + + /* Nothing was found. Use fontconfig to find matching font. */ + if (f >= frclen) { + if (!font->set) + font->set = FcFontSort(0, font->pattern, + 1, 0, &fcres); + fcsets[0] = font->set; + + /* + * Nothing was found in the cache. Now use + * some dozen of Fontconfig calls to get the + * font for one single character. + * + * Xft and fontconfig are design failures. + */ + fcpattern = FcPatternDuplicate(font->pattern); + fccharset = FcCharSetCreate(); + + FcCharSetAddChar(fccharset, rune); + FcPatternAddCharSet(fcpattern, FC_CHARSET, + fccharset); + FcPatternAddBool(fcpattern, FC_SCALABLE, 1); + + FcConfigSubstitute(0, fcpattern, + FcMatchPattern); + FcDefaultSubstitute(fcpattern); + + fontpattern = FcFontSetMatch(0, fcsets, 1, + fcpattern, &fcres); + + /* Allocate memory for the new cache entry. */ + if (frclen >= frccap) { + frccap += 16; + frc = xrealloc(frc, frccap * sizeof(Fontcache)); + } + + frc[frclen].font = XftFontOpenPattern(xw.dpy, + fontpattern); + if (!frc[frclen].font) + die("XftFontOpenPattern failed seeking fallback font: %s\n", + strerror(errno)); + frc[frclen].flags = frcflags; + frc[frclen].unicodep = rune; + + glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); + + f = frclen; + frclen++; + + FcPatternDestroy(fcpattern); + FcCharSetDestroy(fccharset); + } + + specs[numspecs].font = frc[f].font; + specs[numspecs].glyph = glyphidx; + specs[numspecs].x = (short)xp; + specs[numspecs].y = (short)yp; + numspecs++; + } + } + + /* Cleanup and get ready for next segment. */ + hbcleanup(&shaped); + start = i; + + /* Determine font for glyph if different from previous glyph. */ + if (prevmode != mode) { + prevmode = mode; + xresetfontsettings(mode, &font, &frcflags); + yp = winy + font->ascent; + } } - - specs[numspecs].font = frc[f].font; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; } return numspecs; } -/* Draws a horizontal dashed line of length `w` starting at `(x, y)`. `wavelen` - * is the length of the dash plus the length of the gap. `fraction` is the - * fraction of the dash length compared to `wavelen`. */ -static void -xdrawunderdashed(Draw draw, Color *color, int x, int y, int w, - int wavelen, float fraction, int thick) +void +chgalpha(const Arg *arg) { - int dashw = MAX(1, fraction * wavelen); - for (int i = x - x % wavelen; i < x + w; i += wavelen) { - int startx = MAX(i, x); - int endx = MIN(i + dashw, x + w); - if (startx < endx) - XftDrawRect(xw.draw, color, startx, y, endx - startx, - thick); - } -} + if (arg->f == -1.0f && alpha >= 0.1f) + alpha -= 0.1f; + else if (arg->f == 1.0f && alpha < 1.0f) + alpha += 0.1f; + else if (arg->f == 0.0f) + alpha = alpha_def; + else + return; -/* Draws an undercurl. `h` is the total height, including line thickness. */ -static void -xdrawundercurl(Draw draw, Color *color, int x, int y, int w, int h, int thick) -{ - XGCValues gcvals = {.foreground = color->pixel, - .line_width = thick, - .line_style = LineSolid, - .cap_style = CapRound}; - GC gc = XCreateGC(xw.dpy, XftDrawDrawable(xw.draw), - GCForeground | GCLineWidth | GCLineStyle | GCCapStyle, - &gcvals); - - XRectangle clip = {.x = x, .y = y, .width = w, .height = h}; - XSetClipRectangles(xw.dpy, gc, 0, 0, &clip, 1, Unsorted); - - int yoffset = thick / 2; - int segh = MAX(1, h - thick); - /* Make sure every segment is at a 45 degree angle, otherwise it doesn't - * look good without antialiasing. */ - int segw = segh; - int wavelen = MAX(1, segw * 2); - - for (int i = x - (x % wavelen); i < x + w; i += wavelen) { - XPoint points[3] = {{.x = i, .y = y + yoffset}, - {.x = i + segw, .y = y + yoffset + segh}, - {.x = i + wavelen, .y = y + yoffset}}; - XDrawLines(xw.dpy, XftDrawDrawable(xw.draw), gc, points, 3, - CoordModeOrigin); - } - - XFreeGC(xw.dpy, gc); + dc.col[defaultbg].color.alpha = (unsigned short)(0xFFFF * alpha); + /* Required to remove artifacting from borderpx */ + cresize(0, 0); + redraw(); } void -xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) +xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y, int charlen) { - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); - int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, + int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, width = charlen * win.cw; Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; XRenderColor colfg, colbg; @@ -1615,17 +1559,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i /* Intelligent cleaning up of the borders. */ if (x == 0) { - xclear(0, (y == 0)? 0 : winy, win.hborderpx, + xclear(0, (y == 0)? 0 : winy, borderpx, winy + win.ch + - ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); + ((winy + win.ch >= borderpx + win.th)? win.h : 0)); } - if (winx + width >= win.hborderpx + win.tw) { + if (winx + width >= borderpx + win.tw) { xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); + ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); } if (y == 0) - xclear(winx, 0, winx + width, win.vborderpx); - if (winy + win.ch >= win.vborderpx + win.th) + xclear(winx, 0, winx + width, borderpx); + if (winy + win.ch >= borderpx + win.th) xclear(winx, winy + win.ch, winx + width, win.h); /* Clean up the region we want to draw to. */ @@ -1638,72 +1582,18 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i r.width = width; XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); - /* Decoration color. */ - Color decor; - uint32_t decorcolor = tgetdecorcolor(&base); - if (decorcolor == DECOR_DEFAULT_COLOR) { - decor = *fg; - } else if (IS_TRUECOL(decorcolor)) { - colfg.alpha = 0xffff; - colfg.red = TRUERED(decorcolor); - colfg.green = TRUEGREEN(decorcolor); - colfg.blue = TRUEBLUE(decorcolor); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &decor); - } else { - decor = dc.col[decorcolor]; - } - decor.color.alpha = 0xffff; - decor.pixel |= 0xff << 24; + /* Render the glyphs. */ + XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - /* Float thickness, used as a base to compute other values. */ - float fthick = dc.font.height / 18.0; - /* Integer thickness in pixels. Must not be 0. */ - int thick = MAX(1, roundf(fthick)); - /* The default gap between the baseline and a single underline. */ - int gap = roundf(fthick * 2); - /* The total thickness of a double underline. */ - int doubleh = thick * 2 + ceilf(fthick * 0.5); - /* The total thickness of an undercurl. */ - int curlh = thick * 2 + roundf(fthick * 0.75); - - /* Render the underline before the glyphs. */ + /* Render underline and strikethrough. */ if (base.mode & ATTR_UNDERLINE) { - uint32_t style = tgetdecorstyle(&base); - int liney = winy + dc.font.ascent + gap; - /* Adjust liney to guarantee that a single underline fits. */ - liney -= MAX(0, liney + thick - (winy + win.ch)); - if (style == UNDERLINE_DOUBLE) { - liney -= MAX(0, liney + doubleh - (winy + win.ch)); - XftDrawRect(xw.draw, &decor, winx, liney, width, thick); - XftDrawRect(xw.draw, &decor, winx, - liney + doubleh - thick, width, thick); - } else if (style == UNDERLINE_DOTTED) { - xdrawunderdashed(xw.draw, &decor, winx, liney, width, - thick * 2, 0.5, thick); - } else if (style == UNDERLINE_DASHED) { - int wavelen = MAX(2, win.cw * 0.9); - xdrawunderdashed(xw.draw, &decor, winx, liney, width, - wavelen, 0.65, thick); - } else if (style == UNDERLINE_CURLY) { - liney -= MAX(0, liney + curlh - (winy + win.ch)); - xdrawundercurl(xw.draw, &decor, winx, liney, width, - curlh, thick); - } else { - XftDrawRect(xw.draw, &decor, winx, liney, width, thick); - } + XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, + width, 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 strikethrough. Alway use the fg color. */ if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent / 3, - width, thick); + XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, + width, 1); } /* Reset clip to none. */ @@ -1714,38 +1604,32 @@ void xdrawglyph(Glyph g, int x, int y) { int numspecs; - XftGlyphFontSpec spec; + XftGlyphFontSpec *specs = xw.specbuf; - numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y); - if (g.mode & ATTR_IMAGE) { - gr_start_drawing(xw.buf, win.cw, win.ch); - xdrawoneimagecell(g, x, y); - gr_finish_drawing(xw.buf); - } + numspecs = xmakeglyphfontspecs(specs, &g, 1, x, y); + xdrawglyphfontspecs(specs, g, numspecs, x, y, (g.mode & ATTR_WIDE) ? 2 : 1); } void -xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) +xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int len) { Color drawcol; /* remove the old cursor */ if (selected(ox, oy)) og.mode ^= ATTR_REVERSE; - xdrawglyph(og, ox, oy); + + /* Redraw the line where cursor was previously. + * It will restore the ligatures broken by the cursor. */ + xdrawline(line, 0, oy, len); if (IS_SET(MODE_HIDE)) return; - // If it's an image, just draw a ballot box for simplicity. - if (g.mode & ATTR_IMAGE) - g.u = 0x2610; - /* * 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; @@ -1782,167 +1666,39 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) case 3: /* Blinking Underline */ case 4: /* Steady Underline */ XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - \ + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - \ cursorthickness, win.cw, cursorthickness); break; case 5: /* Blinking bar */ case 6: /* Steady bar */ XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, cursorthickness, win.ch); break; } } else { XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, win.cw - 1, 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + cy * win.ch, + borderpx + cx * win.cw, + borderpx + cy * win.ch, 1, win.ch - 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + (cx + 1) * win.cw - 1, - win.vborderpx + cy * win.ch, + borderpx + (cx + 1) * win.cw - 1, + borderpx + cy * win.ch, 1, win.ch - 1); XftDrawRect(xw.draw, &drawcol, - win.hborderpx + cx * win.cw, - win.vborderpx + (cy + 1) * win.ch - 1, + borderpx + cx * win.cw, + borderpx + (cy + 1) * win.ch - 1, win.cw, 1); } } -/* Draw (or queue for drawing) image cells between columns x1 and x2 assuming - * that they have the same attributes (and thus the same lower 24 bits of the - * image ID and the same placement ID). */ -void -xdrawimages(Glyph base, Line line, int x1, int y1, int x2) { - int y_pix = win.vborderpx + y1 * win.ch; - uint32_t image_id_24bits = base.fg & 0xFFFFFF; - uint32_t placement_id = tgetimgplacementid(&base); - // Columns and rows are 1-based, 0 means unspecified. - int last_col = 0; - int last_row = 0; - int last_start_col = 0; - int last_start_x = x1; - // The most significant byte is also 1-base, subtract 1 before use. - uint32_t last_id_4thbyteplus1 = 0; - // We may need to inherit row/column/4th byte from the previous cell. - Glyph *prev = &line[x1 - 1]; - if (x1 > 0 && (prev->mode & ATTR_IMAGE) && - (prev->fg & 0xFFFFFF) == image_id_24bits && - prev->decor == base.decor) { - last_row = tgetimgrow(prev); - last_col = tgetimgcol(prev); - last_id_4thbyteplus1 = tgetimgid4thbyteplus1(prev); - last_start_col = last_col + 1; - } - for (int x = x1; x < x2; ++x) { - Glyph *g = &line[x]; - uint32_t cur_row = tgetimgrow(g); - uint32_t cur_col = tgetimgcol(g); - uint32_t cur_id_4thbyteplus1 = tgetimgid4thbyteplus1(g); - uint32_t num_diacritics = tgetimgdiacriticcount(g); - // If the row is not specified, assume it's the same as the row - // of the previous cell. Note that `cur_row` may contain a - // value imputed earlier, which will be preserved if `last_row` - // is zero (i.e. we don't know the row of the previous cell). - if (last_row && (num_diacritics == 0 || !cur_row)) - cur_row = last_row; - // If the column is not specified and the row is the same as the - // row of the previous cell, then assume that the column is the - // next one. - if (last_col && (num_diacritics <= 1 || !cur_col) && - cur_row == last_row) - cur_col = last_col + 1; - // If the additional id byte is not specified and the - // coordinates are consecutive, assume the byte is also the - // same. - if (last_id_4thbyteplus1 && - (num_diacritics <= 2 || !cur_id_4thbyteplus1) && - cur_row == last_row && cur_col == last_col + 1) - cur_id_4thbyteplus1 = last_id_4thbyteplus1; - // If we couldn't infer row and column, start from the top left - // corner. - if (cur_row == 0) - cur_row = 1; - if (cur_col == 0) - cur_col = 1; - // If this cell breaks a contiguous stripe of image cells, draw - // that line and start a new one. - if (cur_col != last_col + 1 || cur_row != last_row || - cur_id_4thbyteplus1 != last_id_4thbyteplus1) { - uint32_t image_id = image_id_24bits; - if (last_id_4thbyteplus1) - image_id |= (last_id_4thbyteplus1 - 1) << 24; - if (last_row != 0) { - int x_pix = - win.hborderpx + last_start_x * win.cw; - gr_append_imagerect( - xw.buf, image_id, placement_id, - last_start_col - 1, last_col, - last_row - 1, last_row, last_start_x, - y1, x_pix, y_pix, win.cw, win.ch, - base.mode & ATTR_REVERSE); - } - last_start_col = cur_col; - last_start_x = x; - } - last_row = cur_row; - last_col = cur_col; - last_id_4thbyteplus1 = cur_id_4thbyteplus1; - // Populate the missing glyph data to enable inheritance between - // runs and support the naive implementation of tgetimgid. - if (!tgetimgrow(g)) - tsetimgrow(g, cur_row); - // We cannot save this information if there are > 511 cols. - if (!tgetimgcol(g) && (cur_col & ~0x1ff) == 0) - tsetimgcol(g, cur_col); - if (!tgetimgid4thbyteplus1(g)) - tsetimg4thbyteplus1(g, cur_id_4thbyteplus1); - } - uint32_t image_id = image_id_24bits; - if (last_id_4thbyteplus1) - image_id |= (last_id_4thbyteplus1 - 1) << 24; - // Draw the last contiguous stripe. - if (last_row != 0) { - int x_pix = win.hborderpx + last_start_x * win.cw; - gr_append_imagerect(xw.buf, image_id, placement_id, - last_start_col - 1, last_col, last_row - 1, - last_row, last_start_x, y1, x_pix, y_pix, - win.cw, win.ch, base.mode & ATTR_REVERSE); - } -} - -/* Draw just one image cell without inheriting attributes from the left. */ -void xdrawoneimagecell(Glyph g, int x, int y) { - if (!(g.mode & ATTR_IMAGE)) - return; - int x_pix = win.hborderpx + x * win.cw; - int y_pix = win.vborderpx + y * win.ch; - uint32_t row = tgetimgrow(&g) - 1; - uint32_t col = tgetimgcol(&g) - 1; - uint32_t placement_id = tgetimgplacementid(&g); - uint32_t image_id = tgetimgid(&g); - gr_append_imagerect(xw.buf, image_id, placement_id, col, col + 1, row, - row + 1, x, y, x_pix, y_pix, win.cw, win.ch, - g.mode & ATTR_REVERSE); -} - -/* Prepare for image drawing. */ -void xstartimagedraw(int *dirty, int rows) { - gr_start_drawing(xw.buf, win.cw, win.ch); - gr_mark_dirty_animations(dirty, rows); -} - -/* Draw all queued image cells. */ -void xfinishimagedraw() { - gr_finish_drawing(xw.buf); -} - void xsetenv(void) { @@ -1989,8 +1745,6 @@ xsettitle(char *p) int xstartdraw(void) { - if (IS_SET(MODE_VISIBLE)) - XCopyArea(xw.dpy, xw.win, xw.buf, dc.gc, 0, 0, win.w, win.h, 0, 0); return IS_SET(MODE_VISIBLE); } @@ -2001,20 +1755,16 @@ xdrawline(Line line, int x1, int y1, int x2) Glyph base, new; XftGlyphFontSpec *specs = xw.specbuf; - numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { + for (x = x1; x < x2; x++) { new = line[x]; if (new.mode == ATTR_WDUMMY) continue; if (selected(x, y1)) new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1); - if (base.mode & ATTR_IMAGE) - xdrawimages(base, line, ox, y1, x); - specs += i; - numspecs -= i; + if ((i > 0) && ATTRCMP(base, new)) { + numspecs = xmakeglyphfontspecs(specs, &line[ox], x - ox, ox, y1); + xdrawglyphfontspecs(specs, base, numspecs, ox, y1, x - ox); i = 0; } if (i == 0) { @@ -2023,10 +1773,10 @@ xdrawline(Line line, int x1, int y1, int x2) } i++; } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1); - if (i > 0 && base.mode & ATTR_IMAGE) - xdrawimages(base, line, ox, y1, x); + if (i > 0) { + numspecs = xmakeglyphfontspecs(specs, &line[ox], x2 - ox, ox, y1); + xdrawglyphfontspecs(specs, base, numspecs, ox, y1, x2 - ox); + } } void @@ -2251,7 +2001,6 @@ cmessage(XEvent *e) } } else if (e->xclient.data.l[0] == xw.wmdeletewin) { ttyhangup(); - gr_deinit(); exit(0); } } @@ -2302,13 +2051,6 @@ run(void) if (XPending(xw.dpy)) timeout = 0; /* existing events might not set xfd */ - /* Decrease the timeout if there are active animations. */ - if (graphics_next_redraw_delay != INT_MAX && - IS_SET(MODE_VISIBLE)) - timeout = timeout < 0 ? graphics_next_redraw_delay - : MIN(timeout, - graphics_next_redraw_delay); - seltv.tv_sec = timeout / 1E3; seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec); tv = timeout >= 0 ? &seltv : NULL; @@ -2375,6 +2117,118 @@ run(void) } } + +#define XRESOURCE_LOAD_META(NAME) \ + if(!XrmGetResource(xrdb, "st." NAME, "st." NAME, &type, &ret)) \ + XrmGetResource(xrdb, "*." NAME, "*." NAME, &type, &ret); \ + if (ret.addr != NULL && !strncmp("String", type, 64)) + +#define XRESOURCE_LOAD_STRING(NAME, DST) \ + XRESOURCE_LOAD_META(NAME) \ + DST = ret.addr; + +#define XRESOURCE_LOAD_CHAR(NAME, DST) \ + XRESOURCE_LOAD_META(NAME) \ + DST = ret.addr[0]; + +#define XRESOURCE_LOAD_INTEGER(NAME, DST) \ + XRESOURCE_LOAD_META(NAME) \ + DST = strtoul(ret.addr, NULL, 10); + +#define XRESOURCE_LOAD_FLOAT(NAME, DST) \ + XRESOURCE_LOAD_META(NAME) \ + DST = strtof(ret.addr, NULL); + +void +xrdb_load(void) +{ + /* XXX */ + char *xrm; + char *type; + XrmDatabase xrdb; + XrmValue ret; + Display *dpy; + + if(!(dpy = XOpenDisplay(NULL))) + die("Can't open display\n"); + + XrmInitialize(); + xrm = XResourceManagerString(dpy); + + if (xrm != NULL) { + xrdb = XrmGetStringDatabase(xrm); + + /* handling colors here without macros to do via loop. */ + int i = 0; + char loadValue[12] = ""; + for (i = 0; i < 256; i++) + { + sprintf(loadValue, "%s%d", "st.color", i); + + if(!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret)) + { + sprintf(loadValue, "%s%d", "*.color", i); + if (!XrmGetResource(xrdb, loadValue, loadValue, &type, &ret)) + /* reset if not found (unless in range for defaults). */ + if (i > 15) + colorname[i] = NULL; + } + + if (ret.addr != NULL && !strncmp("String", type, 64)) + colorname[i] = ret.addr; + } + + XRESOURCE_LOAD_STRING("foreground", colorname[defaultfg]); + XRESOURCE_LOAD_STRING("background", colorname[defaultbg]); + XRESOURCE_LOAD_STRING("cursorColor", colorname[defaultcs]) + else { + // this looks confusing because we are chaining off of the if + // in the macro. probably we should be wrapping everything blocks + // so this isn't possible... + defaultcs = defaultfg; + } + XRESOURCE_LOAD_STRING("reverse-cursor", colorname[defaultrcs]) + else { + // see above. + defaultrcs = defaultbg; + } + + XRESOURCE_LOAD_STRING("font", font); + XRESOURCE_LOAD_STRING("termname", termname); + + XRESOURCE_LOAD_INTEGER("blinktimeout", blinktimeout); + XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume); + XRESOURCE_LOAD_INTEGER("borderpx", borderpx); + XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape); + + XRESOURCE_LOAD_FLOAT("cwscale", cwscale); + XRESOURCE_LOAD_FLOAT("chscale", chscale); + } + XFlush(dpy); +} + +void +reload(int sig) +{ + xrdb_load(); + + /* colors, fonts */ + xloadcols(); + xunloadfonts(); + xloadfonts(font, 0); + + /* pretend the window just got resized */ + cresize(win.w, win.h); + + redraw(); + + /* triggers re-render if we're visible. */ + ttywrite("\033[O", 3, 1); + + signal(SIGUSR1, reload); +} + + void usage(void) { @@ -2399,6 +2253,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; @@ -2448,6 +2305,8 @@ run: setlocale(LC_CTYPE, ""); XSetLocaleModifiers(""); + xrdb_load(); + signal(SIGUSR1, reload); cols = MAX(cols, 1); rows = MAX(rows, 1); tnew(cols, rows); diff --git a/suckless/st/x.o b/suckless/st/x.o new file mode 100644 index 0000000000000000000000000000000000000000..9c23ee62957dfba799e0f31a64f2fce007f61928 GIT binary patch literal 86680 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�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 literal 0 HcmV?d00001