From 66fcd5c5835debdfbcba25970330c04f31d1f1c9 Mon Sep 17 00:00:00 2001 From: Alexis Jhon Gaspar Date: Sun, 17 Sep 2023 20:00:51 +0800 Subject: [PATCH] New stuff, finalizing things, fixing bugs --- README.md | 98 +- desktop/startdwm | 8 + {dmenu => dmenu-flexipatch}/.gitignore | 3 +- {dmenu => dmenu-flexipatch}/LICENSE | 0 {dmenu => dmenu-flexipatch}/Makefile | 5 +- {dmenu => dmenu-flexipatch}/README | 0 dmenu-flexipatch/README.md | 265 ++ {dmenu => dmenu-flexipatch}/arg.h | 0 dmenu-flexipatch/config.def.h | 153 ++ {dmenu => dmenu-flexipatch}/config.mk | 23 +- {dmenu => dmenu-flexipatch}/dmenu.1 | 7 +- dmenu-flexipatch/dmenu.c | 2220 +++++++++++++++++ {dmenu => dmenu-flexipatch}/dmenu_path | 0 dmenu-flexipatch/dmenu_run | 6 + {dmenu => dmenu-flexipatch}/drw.c | 326 ++- {dmenu => dmenu-flexipatch}/drw.h | 43 + dmenu-flexipatch/patch/center.c | 8 + dmenu-flexipatch/patch/dynamicoptions.c | 91 + dmenu-flexipatch/patch/dynamicoptions.h | 2 + dmenu-flexipatch/patch/fuzzyhighlight.c | 66 + dmenu-flexipatch/patch/fuzzymatch.c | 115 + dmenu-flexipatch/patch/fzfexpect.c | 39 + dmenu-flexipatch/patch/fzfexpect.h | 1 + dmenu-flexipatch/patch/highlight.c | 60 + dmenu-flexipatch/patch/highpriority.c | 35 + dmenu-flexipatch/patch/highpriority.h | 2 + dmenu-flexipatch/patch/include.c | 38 + dmenu-flexipatch/patch/include.h | 18 + dmenu-flexipatch/patch/mousesupport.c | 159 ++ dmenu-flexipatch/patch/multiselect.c | 53 + dmenu-flexipatch/patch/multiselect.h | 1 + dmenu-flexipatch/patch/navhistory.c | 126 + dmenu-flexipatch/patch/nonblockingstdin.c | 68 + dmenu-flexipatch/patch/nonblockingstdin.h | 1 + dmenu-flexipatch/patch/numbers.c | 16 + dmenu-flexipatch/patch/numbers.h | 4 + dmenu-flexipatch/patch/scroll.c | 168 ++ dmenu-flexipatch/patch/scroll.h | 3 + dmenu-flexipatch/patch/xresources.c | 90 + dmenu-flexipatch/patches.def.h | 355 +++ {dmenu => dmenu-flexipatch}/stest.1 | 0 {dmenu => dmenu-flexipatch}/stest.c | 0 {dmenu => dmenu-flexipatch}/util.c | 23 +- {dmenu => dmenu-flexipatch}/util.h | 4 + dmenu/config.def.h | 34 - dmenu/dmenu.c | 847 ------- dmenu/dmenu_run | 2 - dmenu/patches/dmenu-alpha.diff | 281 --- ...menu-caseinsensitive-20200523-db6093f.diff | 42 - dmenu/patches/dmenu-grid-4.9.diff | 107 - .../dmenu-morecolor-20190922-4bf895b.diff | 47 - dmenu/patches/dmenu-mousesupport.diff | 144 -- dmenu/patches/dmenu-scroll.diff | 245 -- dmenu/scripts/dfmpeg | 46 - dwm-flexipatch/.github/FUNDING.yml | 3 - dwm-flexipatch/config.def.h | 63 +- dwm-flexipatch/config.mk | 2 +- dwm-flexipatch/dwm.desktop | 4 +- dwm-flexipatch/patch/xrdb.c | 76 +- dwm-flexipatch/patches.def.h | 32 +- dwm-flexipatch/startdwm | 6 - dwmblocks-async/.clang-format | 6 + dwmblocks-async/.clangd | 6 + dwmblocks-async/.gitignore | 3 + dwmblocks-async/LICENSE | 339 +++ dwmblocks-async/Makefile | 54 + dwmblocks-async/README.md | 161 ++ dwmblocks-async/config.c | 15 + dwmblocks-async/config.h | 6 + dwmblocks-async/inc/bar.h | 15 + dwmblocks-async/inc/block.h | 17 + dwmblocks-async/inc/util.h | 8 + dwmblocks-async/inc/x11.h | 5 + dwmblocks-async/preview.png | Bin 0 -> 54091 bytes dwmblocks-async/src/bar.c | 62 + dwmblocks-async/src/block.c | 72 + dwmblocks-async/src/main.c | 157 ++ dwmblocks-async/src/util.c | 41 + dwmblocks-async/src/x11.c | 25 + pics/neofetch.png | Bin 200423 -> 0 bytes pics/random.png | Bin 405712 -> 0 bytes {dmenu/scripts => scripts/dmenu}/dboard | 0 {dmenu/scripts => scripts/dmenu}/dcalc | 0 {dmenu/scripts => scripts/dmenu}/shutdown.sh | 0 scripts/dwmblocks/musicup | 12 + scripts/dwmblocks/sb-battery | 53 + scripts/dwmblocks/sb-date | 23 + scripts/dwmblocks/sb-disk | 16 + scripts/dwmblocks/sb-loadavg | 13 + scripts/dwmblocks/sb-mail | 34 + scripts/dwmblocks/sb-memory | 9 + scripts/dwmblocks/sb-mic | 7 + scripts/dwmblocks/sb-music | 27 + scripts/dwmblocks/sb-record | 7 + scripts/dwmblocks/sb-theme | 32 + scripts/dwmblocks/sb-volume | 28 + slock-flexipatch/.gitignore | 5 + slock-flexipatch/LICENSE | 24 + slock-flexipatch/Makefile | 65 + slock-flexipatch/README | 24 + slock-flexipatch/README.md | 117 + slock-flexipatch/arg.h | 65 + slock-flexipatch/config.def.h | 164 ++ slock-flexipatch/config.mk | 48 + slock-flexipatch/explicit_bzero.c | 19 + slock-flexipatch/patch/background_image.c | 47 + slock-flexipatch/patch/background_image.h | 4 + .../patch/blur_pixelated_screen.c | 70 + .../patch/blur_pixelated_screen.h | 4 + slock-flexipatch/patch/colormessage.c | 128 + slock-flexipatch/patch/dwmlogo.c | 29 + slock-flexipatch/patch/dwmlogo.h | 2 + slock-flexipatch/patch/include.c | 28 + slock-flexipatch/patch/include.h | 18 + slock-flexipatch/patch/keypress_feedback.c | 28 + slock-flexipatch/patch/keypress_feedback.h | 1 + slock-flexipatch/patch/message.c | 94 + slock-flexipatch/patch/pamauth.c | 27 + slock-flexipatch/patch/pamauth.h | 5 + slock-flexipatch/patch/xresources.c | 53 + slock-flexipatch/patches.def.h | 145 ++ slock-flexipatch/slock.1 | 39 + slock-flexipatch/slock.c | 797 ++++++ slock-flexipatch/util.h | 2 + st-flexipatch/config.mk | 2 +- st-flexipatch/patches.def.h | 8 +- {tabbed => tabbed-flexipatch}/.gitignore | 3 + {tabbed => tabbed-flexipatch}/LICENSE | 0 {tabbed => tabbed-flexipatch}/Makefile | 6 +- {tabbed => tabbed-flexipatch}/README | 0 tabbed-flexipatch/README.md | 66 + {tabbed => tabbed-flexipatch}/TODO | 0 {tabbed => tabbed-flexipatch}/arg.h | 0 tabbed-flexipatch/config.def.h | 138 + {tabbed => tabbed-flexipatch}/config.mk | 7 +- tabbed-flexipatch/patch/hidebar.c | 6 + tabbed-flexipatch/patch/hidebar.h | 1 + tabbed-flexipatch/patch/icon.c | 41 + tabbed-flexipatch/patch/icon.h | 43 + tabbed-flexipatch/patch/include.c | 13 + tabbed-flexipatch/patch/include.h | 13 + tabbed-flexipatch/patch/keyrelease.c | 15 + tabbed-flexipatch/patch/keyrelease.h | 1 + tabbed-flexipatch/patch/xresources.c | 50 + tabbed-flexipatch/patch/xresources.h | 17 + tabbed-flexipatch/patches.def.h | 83 + {tabbed => tabbed-flexipatch}/tabbed.1 | 0 {tabbed => tabbed-flexipatch}/tabbed.c | 232 +- {tabbed => tabbed-flexipatch}/xembed.1 | 0 {tabbed => tabbed-flexipatch}/xembed.c | 0 tabbed/config.def.h | 66 - tabbed/patches/alpha.diff | 122 - tabbed/patches/tabbed-autohide.diff | 54 - tabbed/patches/tabbed-clientnumber.diff | 23 - tabbed/tabbed | Bin 32440 -> 0 bytes tabbed/xembed | Bin 14576 -> 0 bytes 156 files changed, 8720 insertions(+), 2279 deletions(-) create mode 100755 desktop/startdwm rename {dmenu => dmenu-flexipatch}/.gitignore (71%) rename {dmenu => dmenu-flexipatch}/LICENSE (100%) rename {dmenu => dmenu-flexipatch}/Makefile (95%) rename {dmenu => dmenu-flexipatch}/README (100%) create mode 100644 dmenu-flexipatch/README.md rename {dmenu => dmenu-flexipatch}/arg.h (100%) create mode 100644 dmenu-flexipatch/config.def.h rename {dmenu => dmenu-flexipatch}/config.mk (57%) rename {dmenu => dmenu-flexipatch}/dmenu.1 (94%) create mode 100644 dmenu-flexipatch/dmenu.c rename {dmenu => dmenu-flexipatch}/dmenu_path (100%) create mode 100755 dmenu-flexipatch/dmenu_run rename {dmenu => dmenu-flexipatch}/drw.c (54%) rename {dmenu => dmenu-flexipatch}/drw.h (57%) create mode 100644 dmenu-flexipatch/patch/center.c create mode 100644 dmenu-flexipatch/patch/dynamicoptions.c create mode 100644 dmenu-flexipatch/patch/dynamicoptions.h create mode 100644 dmenu-flexipatch/patch/fuzzyhighlight.c create mode 100644 dmenu-flexipatch/patch/fuzzymatch.c create mode 100644 dmenu-flexipatch/patch/fzfexpect.c create mode 100644 dmenu-flexipatch/patch/fzfexpect.h create mode 100644 dmenu-flexipatch/patch/highlight.c create mode 100644 dmenu-flexipatch/patch/highpriority.c create mode 100644 dmenu-flexipatch/patch/highpriority.h create mode 100644 dmenu-flexipatch/patch/include.c create mode 100644 dmenu-flexipatch/patch/include.h create mode 100644 dmenu-flexipatch/patch/mousesupport.c create mode 100644 dmenu-flexipatch/patch/multiselect.c create mode 100644 dmenu-flexipatch/patch/multiselect.h create mode 100644 dmenu-flexipatch/patch/navhistory.c create mode 100644 dmenu-flexipatch/patch/nonblockingstdin.c create mode 100644 dmenu-flexipatch/patch/nonblockingstdin.h create mode 100644 dmenu-flexipatch/patch/numbers.c create mode 100644 dmenu-flexipatch/patch/numbers.h create mode 100644 dmenu-flexipatch/patch/scroll.c create mode 100644 dmenu-flexipatch/patch/scroll.h create mode 100644 dmenu-flexipatch/patch/xresources.c create mode 100644 dmenu-flexipatch/patches.def.h rename {dmenu => dmenu-flexipatch}/stest.1 (100%) rename {dmenu => dmenu-flexipatch}/stest.c (100%) rename {dmenu => dmenu-flexipatch}/util.c (94%) rename {dmenu => dmenu-flexipatch}/util.h (88%) delete mode 100644 dmenu/config.def.h delete mode 100644 dmenu/dmenu.c delete mode 100755 dmenu/dmenu_run delete mode 100644 dmenu/patches/dmenu-alpha.diff delete mode 100644 dmenu/patches/dmenu-caseinsensitive-20200523-db6093f.diff delete mode 100644 dmenu/patches/dmenu-grid-4.9.diff delete mode 100644 dmenu/patches/dmenu-morecolor-20190922-4bf895b.diff delete mode 100644 dmenu/patches/dmenu-mousesupport.diff delete mode 100644 dmenu/patches/dmenu-scroll.diff delete mode 100755 dmenu/scripts/dfmpeg delete mode 100644 dwm-flexipatch/.github/FUNDING.yml delete mode 100755 dwm-flexipatch/startdwm create mode 100644 dwmblocks-async/.clang-format create mode 100644 dwmblocks-async/.clangd create mode 100644 dwmblocks-async/.gitignore create mode 100644 dwmblocks-async/LICENSE create mode 100644 dwmblocks-async/Makefile create mode 100644 dwmblocks-async/README.md create mode 100644 dwmblocks-async/config.c create mode 100644 dwmblocks-async/config.h create mode 100644 dwmblocks-async/inc/bar.h create mode 100644 dwmblocks-async/inc/block.h create mode 100644 dwmblocks-async/inc/util.h create mode 100644 dwmblocks-async/inc/x11.h create mode 100644 dwmblocks-async/preview.png create mode 100644 dwmblocks-async/src/bar.c create mode 100644 dwmblocks-async/src/block.c create mode 100644 dwmblocks-async/src/main.c create mode 100644 dwmblocks-async/src/util.c create mode 100644 dwmblocks-async/src/x11.c delete mode 100644 pics/neofetch.png delete mode 100644 pics/random.png rename {dmenu/scripts => scripts/dmenu}/dboard (100%) rename {dmenu/scripts => scripts/dmenu}/dcalc (100%) rename {dmenu/scripts => scripts/dmenu}/shutdown.sh (100%) create mode 100755 scripts/dwmblocks/musicup create mode 100755 scripts/dwmblocks/sb-battery create mode 100755 scripts/dwmblocks/sb-date create mode 100755 scripts/dwmblocks/sb-disk create mode 100755 scripts/dwmblocks/sb-loadavg create mode 100755 scripts/dwmblocks/sb-mail create mode 100755 scripts/dwmblocks/sb-memory create mode 100755 scripts/dwmblocks/sb-mic create mode 100755 scripts/dwmblocks/sb-music create mode 100755 scripts/dwmblocks/sb-record create mode 100755 scripts/dwmblocks/sb-theme create mode 100755 scripts/dwmblocks/sb-volume create mode 100644 slock-flexipatch/.gitignore create mode 100644 slock-flexipatch/LICENSE create mode 100644 slock-flexipatch/Makefile create mode 100644 slock-flexipatch/README create mode 100644 slock-flexipatch/README.md create mode 100644 slock-flexipatch/arg.h create mode 100644 slock-flexipatch/config.def.h create mode 100644 slock-flexipatch/config.mk create mode 100644 slock-flexipatch/explicit_bzero.c create mode 100644 slock-flexipatch/patch/background_image.c create mode 100644 slock-flexipatch/patch/background_image.h create mode 100644 slock-flexipatch/patch/blur_pixelated_screen.c create mode 100644 slock-flexipatch/patch/blur_pixelated_screen.h create mode 100644 slock-flexipatch/patch/colormessage.c create mode 100644 slock-flexipatch/patch/dwmlogo.c create mode 100644 slock-flexipatch/patch/dwmlogo.h create mode 100644 slock-flexipatch/patch/include.c create mode 100644 slock-flexipatch/patch/include.h create mode 100644 slock-flexipatch/patch/keypress_feedback.c create mode 100644 slock-flexipatch/patch/keypress_feedback.h create mode 100644 slock-flexipatch/patch/message.c create mode 100644 slock-flexipatch/patch/pamauth.c create mode 100644 slock-flexipatch/patch/pamauth.h create mode 100644 slock-flexipatch/patch/xresources.c create mode 100644 slock-flexipatch/patches.def.h create mode 100644 slock-flexipatch/slock.1 create mode 100644 slock-flexipatch/slock.c create mode 100644 slock-flexipatch/util.h rename {tabbed => tabbed-flexipatch}/.gitignore (52%) rename {tabbed => tabbed-flexipatch}/LICENSE (100%) rename {tabbed => tabbed-flexipatch}/Makefile (94%) rename {tabbed => tabbed-flexipatch}/README (100%) create mode 100644 tabbed-flexipatch/README.md rename {tabbed => tabbed-flexipatch}/TODO (100%) rename {tabbed => tabbed-flexipatch}/arg.h (100%) create mode 100644 tabbed-flexipatch/config.def.h rename {tabbed => tabbed-flexipatch}/config.mk (80%) create mode 100644 tabbed-flexipatch/patch/hidebar.c create mode 100644 tabbed-flexipatch/patch/hidebar.h create mode 100644 tabbed-flexipatch/patch/icon.c create mode 100644 tabbed-flexipatch/patch/icon.h create mode 100644 tabbed-flexipatch/patch/include.c create mode 100644 tabbed-flexipatch/patch/include.h create mode 100644 tabbed-flexipatch/patch/keyrelease.c create mode 100644 tabbed-flexipatch/patch/keyrelease.h create mode 100644 tabbed-flexipatch/patch/xresources.c create mode 100644 tabbed-flexipatch/patch/xresources.h create mode 100644 tabbed-flexipatch/patches.def.h rename {tabbed => tabbed-flexipatch}/tabbed.1 (100%) rename {tabbed => tabbed-flexipatch}/tabbed.c (84%) rename {tabbed => tabbed-flexipatch}/xembed.1 (100%) rename {tabbed => tabbed-flexipatch}/xembed.c (100%) delete mode 100644 tabbed/config.def.h delete mode 100644 tabbed/patches/alpha.diff delete mode 100644 tabbed/patches/tabbed-autohide.diff delete mode 100644 tabbed/patches/tabbed-clientnumber.diff delete mode 100755 tabbed/tabbed delete mode 100755 tabbed/xembed diff --git a/README.md b/README.md index 402ba5f..553b866 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,49 @@ -# Suckless Utilities version 6.3 +# Suckless Utilities version 6.4 ## About -These are my builds of suckless software such as dwm and st. -It's simple to compile these things. +These are my builds of suckless software such as dwm and st, based on the work for flexipatch by bakkeby. This aims for much more streamlined configuration and patching than 6.3 (which becomes more complicated over time and whenever more patches are integrated). + +This was designed to save me some sanity in maintaining it as well as easily integrating requested patches, whenever it drops from the flexipatch upstream. This should be easy to hack and build, and should be as fast as the previous versions of my build. + +## Included software + +- dwm +- dmenu +- st +- slstatus +- tabbed +- sfm +- spmenu +- dwmblocks-async +- slock ## Notes -Additionals are spmenu configs made by myself, as well as scripts for `spmenu_run`. If you prefer dmenu, it still exists, and could be launched via `Win/Super/Cmd+Alt+S`, while `Win/Super/Cmd+S` would launch `spmenu_run -d` by default (only with .desktop entries, while `Win/Super/Cmd+Shift+S` would launch `spmenu_run` in a similar fashion to dmenu. +### Compatibility notes + +For those who want the old version, check out `oldmain`. I don't plan on maintaining it myself since the flexipatch base means much more flexibility over codebase updates as well as new patches. + +Note that there are some programs that is included here, mainly for compatibility or choice reasons. While slstatus is pretty barebones compared to dwmblocks-async, it is included on the repo if one decides not to have statuscmd, for example. This aims to be also compatible with already existing setups. + +### Keybind notes + +In the documentation for this suite, Mod4Key would be defined as ⊞ Win/⌘ Cmd/❖ Super, depending on whichever keyboard do you use. + +In most cases, you probably have only ⊞ Win, but I added ⌘ Cmd and ❖ Super for Mac and advanced Linux/Unix users, respectively. + +If one uses ChromeOS, ⊞ Win equals to the 🔍 Search key. But I don't know who uses X11 window managers inside ChromeOS. + +For new to dwm, MODKEY or Mod1Mask is the Alt key. + +### spmenu notes + +Additionals are spmenu configs made by myself, as well as scripts for `spmenu_run`. If you prefer dmenu, it still exists, and could be launched via ⊞ Win/⌘ Cmd/❖ Super+Alt+S, while ⊞ Win/⌘ Cmd/❖ Super+S would launch `spmenu_run -d` by default (only with .desktop entries, while ⊞ Win/⌘ Cmd/❖ Super+Shift+S would launch `spmenu_run` in a similar fashion to dmenu. Some user scripts are also included, which has it's own set of dependencies. For example, `clipmenu-spmenu` needs `xsel` and `clipnotify`. These are optional, however. ``` clipmenu-spmenu dependencies: - xsel -- clipnotify (included on the folder) +- clipnotify screenshot-spmenu dependencies: - curl @@ -25,19 +56,23 @@ screenshot-spmenu dependencies: wallpaper-spmenu dependencies: - xwallpaper ``` -## Building -1. Install necessary tools and libraries +Additionally, spmenu will not work on macOS, so use `dmenu` instead. + +## Building +### Prerequisites ``` Linux/Unix users: - xorg (including drivers of course) - base-devel (or build-essential/s) - libX11(-devel or -dev) - libXft(-devel or -dev) +- libXcb(-devel or -dev) +- libXrender(-devel or -dev) - libXinerama(-devel or -dev) - freetype(-devel or -dev) - fontconfig(-devel or -dev) -- Nerd Fonts (for slstatus) +- Nerd Fonts (Hack as default, can be changed manually) - imlibs2(-devel or -dev) - picom (for transparency) - feh (optional) @@ -64,11 +99,15 @@ For spmenu: - libconfig(-devel or -dev) - OpenSSL or libssl(-devel or -dev) - meson + +Refer to patches.def.h and config.mk for additional patch-related requirements. ``` +### Compiling the whole thing +1. Install necessary tools and libraries 2. Clone this repository (`git clone --recurse-submodules`) 3. Change directory to what suckless software do you want to use -4. Remove the `config.h` file, to make sure all patches are applied correctly +4. Remove the `config.h`, and `patches.h` files, to make sure all patches are applied correctly 5. Copy `make clean install` and paste it on your terminal 6. Building the spmenu submodule included in this repo (by speedie) would strictly use meson as it's build system. 1. For that, `cd` to the spmenu folder. @@ -76,46 +115,53 @@ For spmenu: 3. Run `ninja -C build` for building the binaries. 4. Install via `meson install -C build`, and it'll prompt you if you would like to use sudo if not run as root. -7. Insert dwm, slstatus and/or st inside your `.xinitrc` using your favorite text editor (usually located in `/home//.xinitrc`) -8. Start it and done! +7. Insert dwm, slstatus and/or st inside your `.xinitrc` using your favorite text editor (usually located in `$HOME/.xinitrc`) + - Additionally, a script called `startdwm` located in `desktop` could be installed in `/usr/local/bin` which could be used to launch dwm on display managers, such as GDM or SDDM. + - `startdwm` could be also used as the xinitrc script by putting it under $HOME and renaming it to `.xinitrc`. +8. Install the `dwmblocks` scripts (in `scripts/dwmblocks`) to your `$PATH`. +9. Start it and done! -## Current bugs -- ~~Taskbar not working properly~~ (fixed in commit [e9015f2](https://github.com/Lucas-mother3/suckless-utils/commit/e9015f2d2a09ef66f1c9e188b277c89d23635195) & [7085f9](https://github.com/Lucas-mother3/suckless-utils/commit/7085f97d80fc203d6f54d0209af07007c0347880)). Thanks, [Speedie](https://speedie.gq)! -- ~~Unhiding a hidden window (using the show/hide function) and if it's the only program running, crashes dwm~~ -- ~~Alt-tab crashes dwm altogther (idk man)~~ ## Future plans -- [ ] Rebase the dwm build to dwm-flexipatch (maybe under a new branch with a VM debug environment?) -- [ ] Integrate barmodules if the dwm-flexipatch rewrite did happen -- [ ] Version jump from 6.3 -> 6.4 +- [x] Rebase the dwm build to dwm-flexipatch (maybe under a new branch with a VM debug environment?) +- [x] Integrate barmodules if the dwm-flexipatch rewrite did happen +- [x] Version jump from 6.3 -> 6.4 - [ ] Potentially making this project into a desktop environment, when I feel it's ready to do so - [ ] Use `spmenu-desktop-launcher` if it's mature/usable, retaining `spmenu_run` for backwards compatibility with existing scripts +- [ ] Making a wiki for documenting functions in this build, as well as other important information about the project ## Patching even further -Patching everything is as easy as downloading the diff file, use the `patch` command and apply changes. +Patching everything is as easy as editing the `patches.def.h` file included in the repo. Unlike 6.3, which had a complicated codebase, 6.4 aims for a much more streamlined process of patching things, unlike the previous version which would mean using `patch` and manually editing files whenever something isn't patched up properly. -But, since this is a heavily patched version of everything, I wouldn't recommend patching even further unless if you know what you're doing. +A huge thanks for bakkeby on the work for making suckless software easier to patch, meaning more people could modify and configure the code to their liking. + +## Contributing to the project + +Contributions are welcome, as long as it follows the defined rules in [the CONTRIBUTING document](/CONTRIBUTING.md). + +Documentations are also welcome, in fact, I do need someone who could maintain documentation for the project's inner workings. ## How the versioning system works -Suckless Uilities (the whole package and not the individual components) are versioned under the current version of the repo's dwm. -Even if dwm 6.4 releases, if the repo still uses dwm 6.3 for compatibility reasons, the whole package will be still be Suckless Utilities 6.3. +Suckless Utilities (the whole package and not the individual components) are versioned under the current version of the repo's dwm. +Even if dwm(-flexipatch) 6.5 releases, if the repo still uses dwm(-flexipatch) 6.4 for compatibility reasons, the whole package will still be Suckless Utilities 6.4. ## Licensing -All programs are licensed under the MIT License, which sucks, and worse than GNU GPL, but hey, it's better than proprietary code! +All programs are licensed under the MIT License, except for some submodules, which might have different licenses (for example, GPLv2). ## Screenshots ![Screenshot of neofetch](/pics/neofetch.png) -![Screenshot of random applications (Spotify, Space Cadet Pinball, NCSA Mosaic)](/pics/random.png) +![Screenshot of random applications](/pics/random.png) ## Special thanks -* [Speedie](https://speedie.gq) for helping me out with this and providing me with patches +* [Speedie](https://speedie.site) for helping me out with this and providing me with patches * [The suckless team](https://suckless.org) for maintaining suckless software suck less +* [bakkeby](https://github.com/bakkeby) for creating dwm-flexipatch and related projects, making it possible to easily integrate patches ## Mirrors * [GitHub](https://github.com/Lucas-mother3/suckless-utils) - Main mirror * [GitLab](https://gitlab.com/Lucas-mother3/suckless-utils) - Secondary (and backup) * [BitBucket](https://bitbucket.org/Lucas-mother3/suckless-utils) - Secondary backup -* [speedie.site](https://git.speedie.site/Lucas-mother3/suckless-utils) - Mirror of gitlab +* [speedie.site](https://git.speedie.site/Lucas-mother3/suckless-utils) - Mirror of gitlab \ No newline at end of file diff --git a/desktop/startdwm b/desktop/startdwm new file mode 100755 index 0000000..1740e8e --- /dev/null +++ b/desktop/startdwm @@ -0,0 +1,8 @@ +#!/bin/sh +systemctl --user restart clipmenud.service # restarts clipmenud, if installed +wal -i "/usr/local/share/wallpapers/opensuse.png" --backend colorz # could be changed +picom -b # launches compositor +/usr/local/bin/dwmblocks & # launches slstatus/dwmblocks +/usr/bin/dunst & # launches dunst daemon +paplay /usr/share/sounds/Oxygen-Sys-Special.ogg # autoplay sound, optional +exec /usr/local/bin/dwm # launch dwm diff --git a/dmenu/.gitignore b/dmenu-flexipatch/.gitignore similarity index 71% rename from dmenu/.gitignore rename to dmenu-flexipatch/.gitignore index d29fa65..3ef527d 100644 --- a/dmenu/.gitignore +++ b/dmenu-flexipatch/.gitignore @@ -1,4 +1,5 @@ *.o +config.h +patches.h dmenu stest -config.h diff --git a/dmenu/LICENSE b/dmenu-flexipatch/LICENSE similarity index 100% rename from dmenu/LICENSE rename to dmenu-flexipatch/LICENSE diff --git a/dmenu/Makefile b/dmenu-flexipatch/Makefile similarity index 95% rename from dmenu/Makefile rename to dmenu-flexipatch/Makefile index a03a95c..f4be9d1 100644 --- a/dmenu/Makefile +++ b/dmenu-flexipatch/Makefile @@ -20,7 +20,10 @@ options: config.h: cp config.def.h $@ -$(OBJ): arg.h config.h config.mk drw.h +patches.h: + cp patches.def.h $@ + +$(OBJ): arg.h config.h config.mk drw.h patches.h dmenu: dmenu.o drw.o util.o $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) diff --git a/dmenu/README b/dmenu-flexipatch/README similarity index 100% rename from dmenu/README rename to dmenu-flexipatch/README diff --git a/dmenu-flexipatch/README.md b/dmenu-flexipatch/README.md new file mode 100644 index 0000000..be2c349 --- /dev/null +++ b/dmenu-flexipatch/README.md @@ -0,0 +1,265 @@ +Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this dmenu 5.2 (0fe460d, +2023-04-05) project has a different take on patching. It uses preprocessor directives to decide +whether or not to include a patch during build time. Essentially this means that this build, for +better or worse, contains both the patched _and_ the original code. The aim being that you can +select which patches to include and the build will contain that code and nothing more. + +For example to include the `alpha` patch then you would only need to flip this setting from 0 +to 1 in [patches.h](https://github.com/bakkeby/dmenu-flexipatch/blob/master/patches.def.h): +```c +#define ALPHA_PATCH 1 +``` + +Once you have found out what works for you and what doesn't then you should be in a better position +to choose patches should you want to start patching from scratch. + +Alternatively if you have found the patches you want, but don't want the rest of the flexipatch +entanglement on your plate then you may want to have a look at +[flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer); a custom pre-processor +tool that removes all the unused flexipatch code leaving you with a build that contains the patches +you selected. + +Refer to [https://tools.suckless.org/dmenu/](https://tools.suckless.org/dmenu/) for details on +dmenu, how to install it and how it works. + +Browsing patches? There is a [map of patches](https://coggle.it/diagram/YjT2DD6jBM9dayf3) diagram which tries to organise patches into categories. + +--- + +### Changelog: + +2023-06-15 - Added the caret width patch + +2022-09-05 - Removed the json patch due to maintenance and compatibility reasons, added the + separator patch + +2022-09-04 - Added the fzfexpect patch + +2022-06-21 - Adding barpadding patch and relative input width patch + +2022-03-02 - Bump to 5.1 + +2021-05-23 - Adding support for `ctrl+v` to paste and adding emoji-highlight patch + +2021-05-17 - Added the restrict return, no sort, gridnav and plain-prompt (listfullwidth) patches + +2021-05-15 - Added the tsv and printindex patches + +2020-08-08 - Added the json, symbols, managed, morecolor, multi-selection and preselect patches + +2020-08-05 - Added the grid, highlight, highpriority, dynamic options and numbers patches + +2020-06-13 - Added the pango patch + +2020-06-10 - Added the case-insensitive patch + +2020-05-29 - Added the alpha patch (derived from Baitinq's [build](https://github.com/Baitinq/dmenu)) + and the color emoji patch + +2020-04-05 - Added fuzzyhighlight patch + +2020-02-09 - Added revised border patch (adding command line parameter for setting border width) + +2019-12-29 - Added xresources patch + +2019-10-16 - Introduced [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer) + +2019-09-18 - Added border, center, fuzzymatch, incremental, initialtext, instant, line-height, + mouse-support, navhistory, non-blocking-stdin, password, pipeout, printinputtext, + rejectnomatch, scroll, vertfull, wmtype and xyw patches + +### Patches included: + + - [alpha](https://github.com/bakkeby/patches/blob/master/dmenu/dmenu-alpha-5.0_20210725_523aa08.diff) + - adds transparency for the dmenu window + + - [barpadding](https://github.com/bakkeby/patches/wiki/barpadding) + - adds padding for dmenu in similar fashion to the [barpadding](https://dwm.suckless.org/patches/barpadding/) + patch for dwm + + - [border](http://tools.suckless.org/dmenu/patches/border/) + - adds a border around the dmenu window + + - [caret-width](https://github.com/DarkSamus669/dmenu-patches/blob/main/dmenu-caretwidth-5.2.diff) + - makes the caret width configurable and overridable via a command line option + + - [case-insensitive](http://tools.suckless.org/dmenu/patches/case-insensitive/) + - makes dmenu case-insensitive by default, replacing the case-insensitive `-i` option with a + case sensitive `-s` option + + - [center](https://tools.suckless.org/dmenu/patches/center/) + - this patch centers dmenu in the middle of the screen + + - color_emoji + - enables color emoji in dmenu by removing a workaround for a BadLength error in the Xft + library when color glyphs are used + - enabling this will crash dmenu on encountering such glyphs unless you also have an updated + Xft library that can handle them + + - [dynamic_options](https://tools.suckless.org/dmenu/patches/dynamicoptions/) + - adds a flag (`-dy`) which makes dmenu run the command given to it whenever input is changed + with the current input as the last argument and update the option list according to the + output of that command + + - [emoji-highlight](https://tools.suckless.org/dmenu/patches/emoji-highlight/) + - this patch will allow for emojis on the left side with a colored background when selected + + - [fuzzyhighlight](https://tools.suckless.org/dmenu/patches/fuzzyhighlight/) + - intended to be combined with the fuzzymatch patch, this makes it so that fuzzy matches are + highlighted + + - [fuzzymatch](https://tools.suckless.org/dmenu/patches/fuzzymatch/) + - adds support for fuzzy-matching to dmenu, allowing users to type non-consecutive portions + of the string to be matched + + - [fzfexpect](https://github.com/DAFF0D11/dafmenu/blob/master/patches/dmenu-fzfexpect-5.1.diff) + - adds fzf expect functionality in dmenu + + - [grid](https://tools.suckless.org/dmenu/patches/grid/) + - allows dmenu's entries to be rendered in a grid by adding a new `-g` flag to specify the + number of grid columns + - the `-g` and `-l` options can be used together to create a G columns * L lines grid + + - [gridnav](https://tools.suckless.org/dmenu/patches/gridnav/) + - adds the ability to move left and right through a grid (when using the grid patch) + + - [highlight](https://tools.suckless.org/dmenu/patches/highlight/) + - this patch highlights the individual characters of matched text for each dmenu list entry + + - [highpriority](https://tools.suckless.org/dmenu/patches/highpriority/) + - this patch will automatically sort the search result so that high priority items are shown + first + + - [incremental](https://tools.suckless.org/dmenu/patches/incremental/) + - this patch causes dmenu to print out the current text each time a key is pressed + + - [initialtext](https://tools.suckless.org/dmenu/patches/initialtext/) + - adds an option to provide preselected text + + - [instant](https://tools.suckless.org/dmenu/patches/instant/) + - adds a flag that will cause dmenu to select an item immediately if there is only one + matching option left + + - [~json~](https://tools.suckless.org/dmenu/patches/json/) + - ~adds basic support for json files~ + + - [line-height](http://tools.suckless.org/dmenu/patches/line-height/) + - adds a `-h` option which sets the minimum height of a dmenu line + - this helps integrate dmenu with other UI elements that require a particular vertical size + + - [managed](https://tools.suckless.org/dmenu/patches/managed/) + - adds a `-wm` flag which sets override_redirect to false; thus letting your window manager + manage the dmenu window + - this may be helpful in contexts where you don't want to exclusively bind dmenu or want to + treat dmenu more as a "window" rather than as an overlay + + - [morecolor](https://tools.suckless.org/dmenu/patches/morecolor/) + - adds an additional color scheme for highlighting entries adjacent to the current selection + + - [mouse-support](https://tools.suckless.org/dmenu/patches/mouse-support/) + - adds basic mouse support for dmenu + + - [multi-selection](https://tools.suckless.org/dmenu/patches/multi-selection/) + - without this patch when you press `Ctrl+Enter` dmenu just outputs current item and it is + not possible to undo that + - with this patch dmenu will output all selected items only on exit + - it is also possible to deselect any selected item + + - [navhistory](https://tools.suckless.org/dmenu/patches/navhistory/) + - provides dmenu the ability for history navigation similar to that of bash + + - [no-sort](https://tools.suckless.org/dmenu/patches/no-sort/) + - adds the `-S` option to disable sorting menu items after matching + - useful, for example, when menu items are sorted by their frequency of use (using an + external cache) and the most frequently selected items should always appear first regardless + of how they were exact, prefix, or substring matches + + - [non-blocking-stdin](https://tools.suckless.org/dmenu/patches/non_blocking_stdin/) + - this is a patch to have dmenu read stdin in a non blocking way, making it wait for input + both from stdin and from X + - this means that you can continue feeding dmenu while you type + - the patch is meant to be used along with the incremental patch in order to use stdout to + feed stdin + + - [numbers](https://tools.suckless.org/dmenu/patches/numbers/) + - adds text which displays the number of matched and total items in the top right corner of + dmenu + + - [pango](https://github.com/StillANixRookie/dmenu-pango/) + - adds simple markup for dmenu using pango markup + + - [password](https://tools.suckless.org/dmenu/patches/password/) + - with this patch dmenu will not directly display the keyboard input, but instead replace it + with dots + - all data from stdin will be ignored + + - [pipeout](https://tools.suckless.org/dmenu/patches/pipeout/) + - this patch allows the selected text to be piped back out with dmenu + - this can be useful if you want to display the output of a command on the screen + + - [plain-prompt](https://tools.suckless.org/dmenu/patches/listfullwidth/) + - simple change that avoids colors for the prompt by making it use the same style as the + rest of the input field + + - [prefix-completion](https://tools.suckless.org/dmenu/patches/prefix-completion/) + - changes the behaviour of matched items and the Tab key to allow tab completion + + - [preselect](https://tools.suckless.org/dmenu/patches/preselect/) + - adds an option `-ps` to preselect an item by providing the index that should be pre-selected + + - [printindex](https://tools.suckless.org/dmenu/patches/printindex/) + - allows dmenu to print out the 0-based index of matched text instead of the matched text + itself + - this can be useful in cases where you would like to select entries from one array of text + but index into another, or when you are selecting from an ordered list of non-unique items + + - [printinputtext](https://tools.suckless.org/dmenu/patches/printinputtext/) + - this patch adds a flag `-t` which makes Return key ignore selection and print the input + text to stdout + - the flag basically swaps the functions of Return and Shift+Return hotkeys + + - [rejectnomatch](https://tools.suckless.org/dmenu/patches/reject-no-match/) + - adds a new flag to dmenu with which text input will be rejected if it would result in no + matching item + + - relative_input_width + - prior to commit [e1e1de7](https://git.suckless.org/dmenu/commit/e1e1de7b3b8399cba90ddca9613f837b2dbef7b9.html) + the input width was calculated based on the input options + - this feature was removed in favour of hardcoding the input width to always take up 1/3rd of + the available space + - this patch adds that feature back in with some bespoke performance optimisations at the cost + of accuracy and correctness + + - [restrict-return](https://tools.suckless.org/dmenu/patches/restrict-return/) + - adds a `-1` option which disables Shift-Return and Ctrl-Return + - this guarantees that dmenu will only output one item, and that item was read from stdin + + - [scroll](https://tools.suckless.org/dmenu/patches/scroll/) + - this patch adds support for text scrolling + - it doesn't append `...` for long input anymore as it can handle long text + + - [separator](https://tools.suckless.org/dmenu/patches/separator/) + - adds `-d` and `-D` flags which separates the input into two halves; one half to be + displayed in dmenu and the other to be printed to stdout + + - [symbols](https://tools.suckless.org/dmenu/patches/symbols/) + - allows the symbols, which are printed in dmenu to indicate that either the input is too + long or there are too many options to be shown in dmenu in one line, to be defined + + - [tsv](https://tools.suckless.org/dmenu/patches/tsv/) + - makes dmenu split input lines at first tab character and only display first part, but it + will perform matching on and output full lines as usual + - can be useful if you want to separate data and representation + + - [vertfull](https://tools.suckless.org/dmenu/patches/vertfull/) + - prevents dmenu from indenting items at the same level as the prompt length + + - [wmtype](https://github.com/Baitinq/dmenu/blob/master/patches/dmenu-wm_type.diff) + - adds extended window manager hints such as \_NET_WM_WINDOW_TYPE and \_NET_WM_WINDOW_TYPE_DOCK + + - [xresources](https://tools.suckless.org/dmenu/patches/xresources/) + - allows dmenu to read font and colors from Xresources + - note that with this patch the Xresources settings takes precedence over command line arguments + + - [xyw](https://tools.suckless.org/dmenu/patches/xyw/) + - adds options for specifying dmenu window position and width diff --git a/dmenu/arg.h b/dmenu-flexipatch/arg.h similarity index 100% rename from dmenu/arg.h rename to dmenu-flexipatch/arg.h diff --git a/dmenu-flexipatch/config.def.h b/dmenu-flexipatch/config.def.h new file mode 100644 index 0000000..92c42a9 --- /dev/null +++ b/dmenu-flexipatch/config.def.h @@ -0,0 +1,153 @@ +/* See LICENSE file for copyright and license details. */ +/* Default settings; can be overriden by command line. */ + +static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ +#if ALPHA_PATCH +static int opacity = 1; /* -o option; if 0, then alpha is disabled */ +#endif // ALPHA_PATCH +#if CARET_WIDTH_PATCH +static int caret_width = 2; /* -cw option; set default caret width */ +#endif // CARET_WIDTH_PATCH +#if FUZZYMATCH_PATCH +static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ +#endif // FUZZYMATCH_PATCH +#if INCREMENTAL_PATCH +static int incremental = 0; /* -r option; if 1, outputs text each time a key is pressed */ +#endif // INCREMENTAL_PATCH +#if INSTANT_PATCH +static int instant = 0; /* -n option; if 1, selects matching item without the need to press enter */ +#endif // INSTANT_PATCH +#if CENTER_PATCH +static int center = 1; /* -c option; if 0, dmenu won't be centered on the screen */ +static int min_width = 500; /* minimum width when centered */ +#endif // CENTER_PATCH +#if BARPADDING_PATCH +static const int vertpad = 10; /* vertical padding of bar */ +static const int sidepad = 10; /* horizontal padding of bar */ +#endif // BARPADDING_PATCH +#if RESTRICT_RETURN_PATCH +static int restrict_return = 0; /* -1 option; if 1, disables shift-return and ctrl-return */ +#endif // RESTRICT_RETURN_PATCH +/* -fn option overrides fonts[0]; default X11 font or font set */ +#if PANGO_PATCH +static char font[] = "Hack Nerd Font 12"; +#else +#if XRESOURCES_PATCH +static char *fonts[] = +#else +static const char *fonts[] = +#endif // XRESOURCES_PATCH +{ + "Hack Nerd Font:size=12" +}; +#endif // PANGO_PATCH +#if MANAGED_PATCH +static char *prompt = NULL; /* -p option; prompt to the left of input field */ +#else +static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +#endif // MANAGED_PATCH +#if DYNAMIC_OPTIONS_PATCH +static const char *dynamic = NULL; /* -dy option; dynamic command to run on input change */ +#endif // DYNAMIC_OPTIONS_PATCH +#if SYMBOLS_PATCH +static const char *symbol_1 = "<"; +static const char *symbol_2 = ">"; +#endif // SYMBOLS_PATCH + +#if ALPHA_PATCH +static const unsigned int baralpha = 0xd0; +static const unsigned int borderalpha = OPAQUE; +static const unsigned int alphas[][3] = { + /* fg bg border */ + [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, + [SchemeSel] = { OPAQUE, baralpha, borderalpha }, + #if BORDER_PATCH + [SchemeBorder] = { OPAQUE, OPAQUE, OPAQUE }, + #endif // BORDER_PATCH + #if MORECOLOR_PATCH + [SchemeMid] = { OPAQUE, baralpha, borderalpha }, + #endif // MORECOLOR_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + [SchemeSelHighlight] = { OPAQUE, baralpha, borderalpha }, + [SchemeNormHighlight] = { OPAQUE, baralpha, borderalpha }, + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + #if HIGHPRIORITY_PATCH + [SchemeHp] = { OPAQUE, baralpha, borderalpha }, + #endif // HIGHPRIORITY_PATCH + #if EMOJI_HIGHLIGHT_PATCH + [SchemeHover] = { OPAQUE, baralpha, borderalpha }, + [SchemeGreen] = { OPAQUE, baralpha, borderalpha }, + [SchemeRed] = { OPAQUE, baralpha, borderalpha }, + [SchemeYellow] = { OPAQUE, baralpha, borderalpha }, + [SchemeBlue] = { OPAQUE, baralpha, borderalpha }, + [SchemePurple] = { OPAQUE, baralpha, borderalpha }, + #endif // EMOJI_HIGHLIGHT_PATCH +}; +#endif // ALPHA_PATCH + +static +#if !XRESOURCES_PATCH +const +#endif // XRESOURCES_PATCH +char *colors[][2] = { + /* fg bg */ + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, + #if BORDER_PATCH + [SchemeBorder] = { "#000000", "#005577" }, + #endif // BORDER_PATCH + #if MORECOLOR_PATCH + [SchemeMid] = { "#eeeeee", "#770000" }, + #endif // MORECOLOR_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + [SchemeSelHighlight] = { "#ffc978", "#005577" }, + [SchemeNormHighlight] = { "#ffc978", "#222222" }, + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + #if HIGHPRIORITY_PATCH + [SchemeHp] = { "#bbbbbb", "#333333" }, + #endif // HIGHPRIORITY_PATCH + #if EMOJI_HIGHLIGHT_PATCH + [SchemeHover] = { "#ffffff", "#353D4B" }, + [SchemeGreen] = { "#ffffff", "#52E067" }, + [SchemeRed] = { "#ffffff", "#e05252" }, + [SchemeYellow] = { "#ffffff", "#e0c452" }, + [SchemeBlue] = { "#ffffff", "#5280e0" }, + [SchemePurple] = { "#ffffff", "#9952e0" }, + #endif // EMOJI_HIGHLIGHT_PATCH +}; +/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ +static unsigned int lines = 0; +#if GRID_PATCH +/* -g option; if nonzero, dmenu uses a grid comprised of columns and lines */ +static unsigned int columns = 0; +#endif // GRID_PATCH +#if LINE_HEIGHT_PATCH +static unsigned int lineheight = 0; /* -h option; minimum height of a menu line */ +static unsigned int min_lineheight = 8; +#endif // LINE_HEIGHT_PATCH +#if NAVHISTORY_PATCH +static unsigned int maxhist = 15; +static int histnodup = 1; /* if 0, record repeated histories */ +#endif // NAVHISTORY_PATCH + +/* + * Characters not considered part of a word while deleting words + * for example: " /?\"&[]" + */ +#if PIPEOUT_PATCH +static const char startpipe[] = "#"; +#endif // PIPEOUT_PATCH +static const char worddelimiters[] = " "; + +#if BORDER_PATCH +/* Size of the window border */ +static unsigned int border_width = 0; +#endif // BORDER_PATCH + +#if PREFIXCOMPLETION_PATCH +/* + * Use prefix matching by default; can be inverted with the -x flag. + */ +static int use_prefix = 1; +#endif // PREFIXCOMPLETION_PATCH diff --git a/dmenu/config.mk b/dmenu-flexipatch/config.mk similarity index 57% rename from dmenu/config.mk rename to dmenu-flexipatch/config.mk index 56e4b51..29b96ca 100644 --- a/dmenu/config.mk +++ b/dmenu-flexipatch/config.mk @@ -1,5 +1,5 @@ # dmenu version -VERSION = 5.1 +VERSION = 5.2 # paths PREFIX = /usr/local @@ -15,19 +15,26 @@ XINERAMAFLAGS = -DXINERAMA # freetype FREETYPELIBS = -lfontconfig -lXft FREETYPEINC = /usr/include/freetype2 - -# alpha -XRENDERLIBS = -lXrender - # OpenBSD (uncomment) #FREETYPEINC = $(X11INC)/freetype2 +#MANPREFIX = ${PREFIX}/man + +# uncomment on RHEL for strcasecmp +#EXTRAFLAGS=-D_GNU_SOURCE + +# Uncomment this for the alpha patch / ALPHA_PATCH +XRENDER = -lXrender + +# Uncomment for the pango patch / PANGO_PATCH +#PANGOINC = `pkg-config --cflags xft pango pangoxft` +#PANGOLIB = `pkg-config --libs xft pango pangoxft` # includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) ${XRENDERLIBS} +INCS = -I$(X11INC) -I$(FREETYPEINC) ${PANGOINC} +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm $(XRENDER) ${PANGOLIB} # flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) +CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) $(EXTRAFLAGS) CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) LDFLAGS = $(LIBS) diff --git a/dmenu/dmenu.1 b/dmenu-flexipatch/dmenu.1 similarity index 94% rename from dmenu/dmenu.1 rename to dmenu-flexipatch/dmenu.1 index d0a734a..323f93c 100644 --- a/dmenu/dmenu.1 +++ b/dmenu-flexipatch/dmenu.1 @@ -4,8 +4,6 @@ dmenu \- dynamic menu .SH SYNOPSIS .B dmenu .RB [ \-bfiv ] -.RB [ \-g -.IR columns ] .RB [ \-l .IR lines ] .RB [ \-m @@ -49,11 +47,8 @@ is faster, but will lock up X until stdin reaches end\-of\-file. .B \-i dmenu matches menu items case insensitively. .TP -.BI \-g " columns" -dmenu lists items in a grid with the given number of columns. -.TP .BI \-l " lines" -dmenu lists items in a grid with the given number of lines. +dmenu lists items vertically, with the given number of lines. .TP .BI \-m " monitor" dmenu is displayed on the monitor number supplied. Monitor numbers are starting diff --git a/dmenu-flexipatch/dmenu.c b/dmenu-flexipatch/dmenu.c new file mode 100644 index 0000000..5d20ed8 --- /dev/null +++ b/dmenu-flexipatch/dmenu.c @@ -0,0 +1,2220 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#ifdef XINERAMA +#include +#endif +#include + +#include "patches.h" +/* Patch incompatibility overrides */ +#if MULTI_SELECTION_PATCH +#undef NON_BLOCKING_STDIN_PATCH +#undef PIPEOUT_PATCH +#undef PRINTINPUTTEXT_PATCH +#endif // MULTI_SELECTION_PATCH + +#include "drw.h" +#include "util.h" +#if GRIDNAV_PATCH +#include +#endif // GRIDNAV_PATCH + +/* macros */ +#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ + * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#if PANGO_PATCH +#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad) +#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad) +#else +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#endif // PANGO_PATCH +#if ALPHA_PATCH +#define OPAQUE 0xffU +#define OPACITY "_NET_WM_WINDOW_OPACITY" +#endif // ALPHA_PATCH + +/* enums */ +enum { + SchemeNorm, + SchemeSel, + SchemeOut, + #if BORDER_PATCH + SchemeBorder, + #endif // BORDER_PATCH + #if MORECOLOR_PATCH + SchemeMid, + #endif // MORECOLOR_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + SchemeNormHighlight, + SchemeSelHighlight, + #endif // HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + #if HIGHPRIORITY_PATCH + SchemeHp, + #endif // HIGHPRIORITY_PATCH + #if EMOJI_HIGHLIGHT_PATCH + SchemeHover, + SchemeGreen, + SchemeYellow, + SchemeBlue, + SchemePurple, + SchemeRed, + #endif // EMOJI_HIGHLIGHT_PATCH + SchemeLast, +}; /* color schemes */ + +struct item { + char *text; + #if SEPARATOR_PATCH + char *text_output; + #elif TSV_PATCH + char *stext; + #endif // SEPARATOR_PATCH | TSV_PATCH + struct item *left, *right; + #if NON_BLOCKING_STDIN_PATCH + struct item *next; + #endif // NON_BLOCKING_STDIN_PATCH + #if MULTI_SELECTION_PATCH + int id; /* for multiselect */ + #else + int out; + #endif // MULTI_SELECTION_PATCH + #if HIGHPRIORITY_PATCH + int hp; + #endif // HIGHPRIORITY_PATCH + #if FUZZYMATCH_PATCH + double distance; + #endif // FUZZYMATCH_PATCH + #if PRINTINDEX_PATCH + int index; + #endif // PRINTINDEX_PATCH +}; + +static char text[BUFSIZ] = ""; +#if PIPEOUT_PATCH +static char pipeout[8] = " | dmenu"; +#endif // PIPEOUT_PATCH +static char *embed; +#if SEPARATOR_PATCH +static char separator; +static int separator_greedy; +static int separator_reverse; +#endif // SEPARATOR_PATCH +static int bh, mw, mh; +#if XYW_PATCH +static int dmx = 0, dmy = 0; /* put dmenu at these x and y offsets */ +static unsigned int dmw = 0; /* make dmenu this wide */ +#endif // XYW_PATCH +static int inputw = 0, promptw; +#if PASSWORD_PATCH +static int passwd = 0; +#endif // PASSWORD_PATCH +static int lrpad; /* sum of left and right padding */ +#if BARPADDING_PATCH +static int vp; /* vertical padding for bar */ +static int sp; /* side padding for bar */ +#endif // BARPADDING_PATCH +#if REJECTNOMATCH_PATCH +static int reject_no_match = 0; +#endif // REJECTNOMATCH_PATCH +static size_t cursor; +static struct item *items = NULL; +static struct item *matches, *matchend; +static struct item *prev, *curr, *next, *sel; +static int mon = -1, screen; +#if PRINTINDEX_PATCH +static int print_index = 0; +#endif // PRINTINDEX_PATCH +#if MANAGED_PATCH +static int managed = 0; +#endif // MANAGED_PATCH +#if MULTI_SELECTION_PATCH +static int *selid = NULL; +static unsigned int selidsize = 0; +#endif // MULTI_SELECTION_PATCH +#if NO_SORT_PATCH +static unsigned int sortmatches = 1; +#endif // NO_SORT_PATCH +#if PRINTINPUTTEXT_PATCH +static int use_text_input = 0; +#endif // PRINTINPUTTEXT_PATCH +#if PRESELECT_PATCH +static unsigned int preselected = 0; +#endif // PRESELECT_PATCH +#if EMOJI_HIGHLIGHT_PATCH +static int commented = 0; +static int animated = 0; +#endif // EMOJI_HIGHLIGHT_PATCH + +static Atom clip, utf8; +#if WMTYPE_PATCH +static Atom type, dock; +#endif // WMTYPE_PATCH +static Display *dpy; +static Window root, parentwin, win; +static XIC xic; + +#if ALPHA_PATCH +static int useargb = 0; +static Visual *visual; +static int depth; +static Colormap cmap; +#endif // ALPHA_PATCH + +static Drw *drw; +static Clr *scheme[SchemeLast]; + +#include "patch/include.h" + +#include "config.h" + +#if CASEINSENSITIVE_PATCH +static char * cistrstr(const char *s, const char *sub); +static int (*fstrncmp)(const char *, const char *, size_t) = strncasecmp; +static char *(*fstrstr)(const char *, const char *) = cistrstr; +#else +static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; +static char *(*fstrstr)(const char *, const char *) = strstr; +#endif // CASEINSENSITIVE_PATCH + +static unsigned int +textw_clamp(const char *str, unsigned int n) +{ + unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; + return MIN(w, n); +} + +static void appenditem(struct item *item, struct item **list, struct item **last); +static void calcoffsets(void); +static void cleanup(void); +static char * cistrstr(const char *s, const char *sub); +static int drawitem(struct item *item, int x, int y, int w); +static void drawmenu(void); +static void grabfocus(void); +static void grabkeyboard(void); +static void match(void); +static void insert(const char *str, ssize_t n); +static size_t nextrune(int inc); +static void movewordedge(int dir); +static void keypress(XKeyEvent *ev); +static void paste(void); +#if ALPHA_PATCH +static void xinitvisual(void); +#endif // ALPHA_PATCH +static void readstdin(void); +static void run(void); +static void setup(void); +static void usage(void); + +#include "patch/include.c" + +static void +appenditem(struct item *item, struct item **list, struct item **last) +{ + if (*last) + (*last)->right = item; + else + *list = item; + + item->left = *last; + item->right = NULL; + *last = item; +} + +static void +calcoffsets(void) +{ + int i, n, rpad = 0; + + if (lines > 0) { + #if GRID_PATCH + if (columns) + n = lines * columns * bh; + else + n = lines * bh; + #else + n = lines * bh; + #endif // GRID_PATCH + } else { + #if NUMBERS_PATCH + rpad = TEXTW(numbers); + #endif // NUMBERS_PATCH + #if SYMBOLS_PATCH + n = mw - (promptw + inputw + TEXTW(symbol_1) + TEXTW(symbol_2) + rpad); + #else + n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">") + rpad); + #endif // SYMBOLS_PATCH + } + /* calculate which items will begin the next page and previous page */ + for (i = 0, next = curr; next; next = next->right) + if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n) + break; + for (i = 0, prev = curr; prev && prev->left; prev = prev->left) + if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) > n) + break; +} + +static void +cleanup(void) +{ + size_t i; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + for (i = 0; i < SchemeLast; i++) + free(scheme[i]); + for (i = 0; items && items[i].text; ++i) + free(items[i].text); + free(items); + #if HIGHPRIORITY_PATCH + for (i = 0; i < hplength; ++i) + free(hpitems[i]); + free(hpitems); + #endif // HIGHPRIORITY_PATCH + drw_free(drw); + XSync(dpy, False); + XCloseDisplay(dpy); + #if MULTI_SELECTION_PATCH + free(selid); + #endif // MULTI_SELECTION_PATCH +} + +static char * +cistrstr(const char *s, const char *sub) +{ + size_t len; + + for (len = strlen(sub); *s; s++) + if (!strncasecmp(s, sub, len)) + return (char *)s; + return NULL; +} + +static int +drawitem(struct item *item, int x, int y, int w) +{ + int r; + #if TSV_PATCH && !SEPARATOR_PATCH + char *text = item->stext; + #else + char *text = item->text; + #endif // TSV_PATCH + + #if EMOJI_HIGHLIGHT_PATCH + int iscomment = 0; + if (text[0] == '>') { + if (text[1] == '>') { + iscomment = 3; + switch (text[2]) { + case 'r': + drw_setscheme(drw, scheme[SchemeRed]); + break; + case 'g': + drw_setscheme(drw, scheme[SchemeGreen]); + break; + case 'y': + drw_setscheme(drw, scheme[SchemeYellow]); + break; + case 'b': + drw_setscheme(drw, scheme[SchemeBlue]); + break; + case 'p': + drw_setscheme(drw, scheme[SchemePurple]); + break; + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + case 'h': + drw_setscheme(drw, scheme[SchemeNormHighlight]); + break; + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + case 's': + drw_setscheme(drw, scheme[SchemeSel]); + break; + default: + iscomment = 1; + drw_setscheme(drw, scheme[SchemeNorm]); + break; + } + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + iscomment = 1; + } + } else if (text[0] == ':') { + iscomment = 2; + if (item == sel) { + switch (text[1]) { + case 'r': + drw_setscheme(drw, scheme[SchemeRed]); + break; + case 'g': + drw_setscheme(drw, scheme[SchemeGreen]); + break; + case 'y': + drw_setscheme(drw, scheme[SchemeYellow]); + break; + case 'b': + drw_setscheme(drw, scheme[SchemeBlue]); + break; + case 'p': + drw_setscheme(drw, scheme[SchemePurple]); + break; + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + case 'h': + drw_setscheme(drw, scheme[SchemeNormHighlight]); + break; + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + case 's': + drw_setscheme(drw, scheme[SchemeSel]); + break; + default: + drw_setscheme(drw, scheme[SchemeSel]); + iscomment = 0; + break; + } + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + } + } + #endif // EMOJI_HIGHLIGHT_PATCH + + #if EMOJI_HIGHLIGHT_PATCH + int temppadding = 0; + if (iscomment == 2) { + if (text[2] == ' ') { + #if PANGO_PATCH + temppadding = drw->font->h * 3; + #else + temppadding = drw->fonts->h * 3; + #endif // PANGO_PATCH + animated = 1; + char dest[1000]; + strcpy(dest, text); + dest[6] = '\0'; + drw_text(drw, x, y + , temppadding + #if LINE_HEIGHT_PATCH + , MAX(lineheight, bh) + #else + , bh + #endif // LINE_HEIGHT_PATCH + , temppadding / 2.6 + , dest + 3 + , 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + iscomment = 6; + drw_setscheme(drw, sel == item ? scheme[SchemeHover] : scheme[SchemeNorm]); + } + } + + char *output; + if (commented) { + static char onestr[2]; + onestr[0] = text[0]; + onestr[1] = '\0'; + output = onestr; + } else { + output = text; + } + #endif // EMOJI_HIGHLIGHT_PATCH + + if (item == sel) + drw_setscheme(drw, scheme[SchemeSel]); + #if HIGHPRIORITY_PATCH + else if (item->hp) + drw_setscheme(drw, scheme[SchemeHp]); + #endif // HIGHPRIORITY_PATCH + #if MORECOLOR_PATCH + else if (item->left == sel || item->right == sel) + drw_setscheme(drw, scheme[SchemeMid]); + #endif // MORECOLOR_PATCH + #if MULTI_SELECTION_PATCH + else if (issel(item->id)) + #else + else if (item->out) + #endif // MULTI_SELECTION_PATCH + drw_setscheme(drw, scheme[SchemeOut]); + else + drw_setscheme(drw, scheme[SchemeNorm]); + + r = drw_text(drw + #if EMOJI_HIGHLIGHT_PATCH + , x + ((iscomment == 6) ? temppadding : 0) + #else + , x + #endif // EMOJI_HIGHLIGHT_PATCH + , y + , w + , bh + #if EMOJI_HIGHLIGHT_PATCH + , commented ? (bh - TEXTW(output) - lrpad) / 2 : lrpad / 2 + #else + , lrpad / 2 + #endif // EMOJI_HIGHLIGHT_PATCH + #if EMOJI_HIGHLIGHT_PATCH + , output + iscomment + #else + , text + #endif // EMOJI_HIGHLIGHT_PATCH + , 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + #if EMOJI_HIGHLIGHT_PATCH + drawhighlights(item, output + iscomment, x + ((iscomment == 6) ? temppadding : 0), y, w); + #else + drawhighlights(item, x, y, w); + #endif // EMOJI_HIGHLIGHT_PATCH + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + return r; +} + +static void +drawmenu(void) +{ + #if SCROLL_PATCH + static int curpos, oldcurlen; + int curlen, rcurlen; + #else + unsigned int curpos; + #endif // SCROLL_PATCH + struct item *item; + int x = 0, y = 0, w, rpad = 0, itw = 0, stw = 0; + #if LINE_HEIGHT_PATCH && PANGO_PATCH + int fh = drw->font->h; + #elif LINE_HEIGHT_PATCH + int fh = drw->fonts->h; + #endif // LINE_HEIGHT_PATCH + #if PASSWORD_PATCH + char *censort; + #endif // PASSWORD_PATCH + + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, 0, 0, mw, mh, 1, 1); + + if (prompt && *prompt) { + #if !PLAIN_PROMPT_PATCH + drw_setscheme(drw, scheme[SchemeSel]); + #endif // PLAIN_PROMPT_PATCH + x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + } + /* draw input field */ + w = (lines > 0 || !matches) ? mw - x : inputw; + + #if SCROLL_PATCH + w -= lrpad / 2; + x += lrpad / 2; + rcurlen = TEXTW(text + cursor) - lrpad; + curlen = TEXTW(text) - lrpad - rcurlen; + curpos += curlen - oldcurlen; + curpos = MIN(w, MAX(0, curpos)); + curpos = MAX(curpos, w - rcurlen); + curpos = MIN(curpos, curlen); + oldcurlen = curlen; + + drw_setscheme(drw, scheme[SchemeNorm]); + #if PASSWORD_PATCH + if (passwd) { + censort = ecalloc(1, sizeof(text)); + memset(censort, '.', strlen(text)); + drw_text_align(drw, x, 0, curpos, bh, censort, cursor, AlignR); + drw_text_align(drw, x + curpos, 0, w - curpos, bh, censort + cursor, strlen(censort) - cursor, AlignL); + free(censort); + } else { + drw_text_align(drw, x, 0, curpos, bh, text, cursor, AlignR); + drw_text_align(drw, x + curpos, 0, w - curpos, bh, text + cursor, strlen(text) - cursor, AlignL); + } + #else + drw_text_align(drw, x, 0, curpos, bh, text, cursor, AlignR); + drw_text_align(drw, x + curpos, 0, w - curpos, bh, text + cursor, strlen(text) - cursor, AlignL); + #endif // PASSWORD_PATCH + #if LINE_HEIGHT_PATCH + drw_rect(drw, x + curpos - 1, 2 + (bh-fh)/2, 2, fh - 4, 1, 0); + #else + drw_rect(drw, x + curpos - 1, 2, 2, bh - 4, 1, 0); + #endif // LINE_HEIGHT_PATCH + #else // !SCROLL_PATCH + drw_setscheme(drw, scheme[SchemeNorm]); + #if PASSWORD_PATCH + if (passwd) { + censort = ecalloc(1, sizeof(text)); + memset(censort, '.', strlen(text)); + drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0 + #if PANGO_PATCH + , False + #endif // PANGO_PATCH + ); + drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0 + #if PANGO_PATCH + , False + #endif // PANGO_PATCH + ); + free(censort); + } else { + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0 + #if PANGO_PATCH + , False + #endif // PANGO_PATCH + ); + } + #else + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0 + #if PANGO_PATCH + , False + #endif // PANGO_PATCH + ); + #endif // PASSWORD_PATCH + + curpos = TEXTW(text) - TEXTW(&text[cursor]); + if ((curpos += lrpad / 2 - 1) < w) { + drw_setscheme(drw, scheme[SchemeNorm]); + #if CARET_WIDTH_PATCH && LINE_HEIGHT_PATCH + drw_rect(drw, x + curpos, 2 + (bh-fh)/2, caret_width, fh - 4, 1, 0); + #elif CARET_WIDTH_PATCH + drw_rect(drw, x + curpos, 2, caret_width, bh - 4, 1, 0); + #elif LINE_HEIGHT_PATCH + drw_rect(drw, x + curpos, 2 + (bh-fh)/2, 2, fh - 4, 1, 0); + #else + drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); + #endif // LINE_HEIGHT_PATCH + } + #endif // SCROLL_PATCH + + #if NUMBERS_PATCH + recalculatenumbers(); + rpad = TEXTW(numbers); + #if BARPADDING_PATCH + rpad += 2 * sp; + #endif // BARPADDING_PATCH + #if BORDER_PATCH + rpad += border_width; + #endif // BORDER_PATCH + #endif // NUMBERS_PATCH + if (lines > 0) { + #if GRID_PATCH + /* draw grid */ + int i = 0; + for (item = curr; item != next; item = item->right, i++) + if (columns) + #if VERTFULL_PATCH + drawitem( + item, + 0 + ((i / lines) * (mw / columns)), + y + (((i % lines) + 1) * bh), + mw / columns + ); + #else + drawitem( + item, + x + ((i / lines) * ((mw - x) / columns)), + y + (((i % lines) + 1) * bh), + (mw - x) / columns + ); + #endif // VERTFULL_PATCH + else + #if VERTFULL_PATCH + drawitem(item, 0, y += bh, mw); + #else + drawitem(item, x, y += bh, mw - x); + #endif // VERTFULL_PATCH + #else + /* draw vertical list */ + for (item = curr; item != next; item = item->right) + #if VERTFULL_PATCH + drawitem(item, 0, y += bh, mw); + #else + drawitem(item, x, y += bh, mw - x); + #endif // VERTFULL_PATCH + #endif // GRID_PATCH + } else if (matches) { + /* draw horizontal list */ + x += inputw; + w = TEXTW("<"); + if (curr->left) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + } + x += w; + for (item = curr; item != next; item = item->right) { + #if SYMBOLS_PATCH + stw = TEXTW(symbol_2); + #else + stw = TEXTW(">"); + #endif // SYMBOLS_PATCH + #if TSV_PATCH && !SEPARATOR_PATCH + itw = textw_clamp(item->stext, mw - x - stw - rpad); + #else + itw = textw_clamp(item->text, mw - x - stw - rpad); + #endif // TSV_PATCH + x = drawitem(item, x, 0, itw); + } + if (next) { + #if SYMBOLS_PATCH + w = TEXTW(symbol_2); + #else + w = TEXTW(">"); + #endif // SYMBOLS_PATCH + drw_setscheme(drw, scheme[SchemeNorm]); + drw_text(drw, mw - w - rpad, 0, w, bh, lrpad / 2 + #if SYMBOLS_PATCH + , symbol_2 + #else + , ">" + #endif // SYMBOLS_PATCH + , 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + } + } + #if NUMBERS_PATCH + drw_setscheme(drw, scheme[SchemeNorm]); + #if PANGO_PATCH + drw_text(drw, mw - rpad, 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0, False); + #else + drw_text(drw, mw - rpad, 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0); + #endif // PANGO_PATCH + #endif // NUMBERS_PATCH + drw_map(drw, win, 0, 0, mw, mh); + #if NON_BLOCKING_STDIN_PATCH + XFlush(dpy); + #endif // NON_BLOCKING_STDIN_PATCH +} + +static void +grabfocus(void) +{ + struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; + Window focuswin; + int i, revertwin; + + for (i = 0; i < 100; ++i) { + XGetInputFocus(dpy, &focuswin, &revertwin); + if (focuswin == win) + return; + #if !MANAGED_PATCH + XSetInputFocus(dpy, win, RevertToParent, CurrentTime); + #endif // MANAGED_PATCH + nanosleep(&ts, NULL); + } + die("cannot grab focus"); +} + +static void +grabkeyboard(void) +{ + struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; + int i; + + #if MANAGED_PATCH + if (embed || managed) + #else + if (embed) + #endif // MANAGED_PATCH + return; + /* try to grab keyboard, we may have to wait for another process to ungrab */ + for (i = 0; i < 1000; i++) { + if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, + GrabModeAsync, CurrentTime) == GrabSuccess) + return; + nanosleep(&ts, NULL); + } + die("cannot grab keyboard"); +} + +static void +match(void) +{ + #if DYNAMIC_OPTIONS_PATCH + if (dynamic && *dynamic) + refreshoptions(); + #endif // DYNAMIC_OPTIONS_PATCH + + #if FUZZYMATCH_PATCH + if (fuzzy) { + fuzzymatch(); + return; + } + #endif + static char **tokv = NULL; + static int tokn = 0; + + char buf[sizeof text], *s; + int i, tokc = 0; + size_t len, textsize; + struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; + #if HIGHPRIORITY_PATCH + struct item *lhpprefix, *hpprefixend; + #endif // HIGHPRIORITY_PATCH + #if NON_BLOCKING_STDIN_PATCH + int preserve = 0; + #endif // NON_BLOCKING_STDIN_PATCH + + strcpy(buf, text); + /* separate input text into tokens to be matched individually */ + for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) + if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) + die("cannot realloc %zu bytes:", tokn * sizeof *tokv); + len = tokc ? strlen(tokv[0]) : 0; + + #if PREFIXCOMPLETION_PATCH + if (use_prefix) { + matches = lprefix = matchend = prefixend = NULL; + textsize = strlen(text); + } else { + matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; + textsize = strlen(text) + 1; + } + #else + matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; + textsize = strlen(text) + 1; + #endif // PREFIXCOMPLETION_PATCH + #if HIGHPRIORITY_PATCH + lhpprefix = hpprefixend = NULL; + #endif // HIGHPRIORITY_PATCH + #if NON_BLOCKING_STDIN_PATCH && DYNAMIC_OPTIONS_PATCH + for (item = items; item && (!(dynamic && *dynamic) || item->text); item = (dynamic && *dynamic) ? item + 1 : item->next) + #elif NON_BLOCKING_STDIN_PATCH + for (item = items; item; item = item->next) + #else + for (item = items; item && item->text; item++) + #endif + { + for (i = 0; i < tokc; i++) + if (!fstrstr(item->text, tokv[i])) + break; + #if DYNAMIC_OPTIONS_PATCH + if (i != tokc && !(dynamic && *dynamic)) /* not all tokens match */ + continue; + #else + if (i != tokc) /* not all tokens match */ + continue; + #endif // DYNAMIC_OPTIONS_PATCH + #if HIGHPRIORITY_PATCH + /* exact matches go first, then prefixes with high priority, then prefixes, then substrings */ + #else + /* exact matches go first, then prefixes, then substrings */ + #endif // HIGHPRIORITY_PATCH + #if NO_SORT_PATCH + if (!sortmatches) + appenditem(item, &matches, &matchend); + else + #endif // NO_SORT_PATCH + if (!tokc || !fstrncmp(text, item->text, textsize)) + appenditem(item, &matches, &matchend); + #if HIGHPRIORITY_PATCH + else if (item->hp && !fstrncmp(tokv[0], item->text, len)) + appenditem(item, &lhpprefix, &hpprefixend); + #endif // HIGHPRIORITY_PATCH + else if (!fstrncmp(tokv[0], item->text, len)) + appenditem(item, &lprefix, &prefixend); + #if PREFIXCOMPLETION_PATCH + else if (!use_prefix) + #else + else + #endif // PREFIXCOMPLETION_PATCH + appenditem(item, &lsubstr, &substrend); + #if NON_BLOCKING_STDIN_PATCH + if (sel == item) + preserve = 1; + #endif // NON_BLOCKING_STDIN_PATCH + } + #if HIGHPRIORITY_PATCH + if (lhpprefix) { + if (matches) { + matchend->right = lhpprefix; + lhpprefix->left = matchend; + } else + matches = lhpprefix; + matchend = hpprefixend; + } + #endif // HIGHPRIORITY_PATCH + if (lprefix) { + if (matches) { + matchend->right = lprefix; + lprefix->left = matchend; + } else + matches = lprefix; + matchend = prefixend; + } + #if PREFIXCOMPLETION_PATCH + if (!use_prefix && lsubstr) + #else + if (lsubstr) + #endif // PREFIXCOMPLETION_PATCH + { + if (matches) { + matchend->right = lsubstr; + lsubstr->left = matchend; + } else + matches = lsubstr; + matchend = substrend; + } + #if NON_BLOCKING_STDIN_PATCH + if (!preserve) + #endif // NON_BLOCKING_STDIN_PATCH + curr = sel = matches; + + #if INSTANT_PATCH + if (instant && matches && matches==matchend && !lsubstr) { + puts(matches->text); + cleanup(); + exit(0); + } + #endif // INSTANT_PATCH + + calcoffsets(); +} + +static void +insert(const char *str, ssize_t n) +{ + if (strlen(text) + n > sizeof text - 1) + return; + + #if REJECTNOMATCH_PATCH + static char last[BUFSIZ] = ""; + if (reject_no_match) { + /* store last text value in case we need to revert it */ + memcpy(last, text, BUFSIZ); + } + #endif // REJECTNOMATCH_PATCH + + /* move existing text out of the way, insert new text, and update cursor */ + memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); + if (n > 0) + memcpy(&text[cursor], str, n); + cursor += n; + match(); + + #if REJECTNOMATCH_PATCH + if (!matches && reject_no_match) { + /* revert to last text value if theres no match */ + memcpy(text, last, BUFSIZ); + cursor -= n; + match(); + } + #endif // REJECTNOMATCH_PATCH +} + +static size_t +nextrune(int inc) +{ + ssize_t n; + + /* return location of next utf8 rune in the given direction (+1 or -1) */ + for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) + ; + return n; +} + +static void +movewordedge(int dir) +{ + if (dir < 0) { /* move cursor to the start of the word*/ + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) + cursor = nextrune(-1); + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) + cursor = nextrune(-1); + } else { /* move cursor to the end of the word */ + while (text[cursor] && strchr(worddelimiters, text[cursor])) + cursor = nextrune(+1); + while (text[cursor] && !strchr(worddelimiters, text[cursor])) + cursor = nextrune(+1); + } +} + +static void +keypress(XKeyEvent *ev) +{ + char buf[64]; + int len; + #if PREFIXCOMPLETION_PATCH + struct item * item; + #endif // PREFIXCOMPLETION_PATCH + KeySym ksym = NoSymbol; + Status status; + #if GRID_PATCH && GRIDNAV_PATCH + int i; + struct item *tmpsel; + bool offscreen = false; + #endif // GRIDNAV_PATCH + + len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); + switch (status) { + default: /* XLookupNone, XBufferOverflow */ + return; + case XLookupChars: /* composed string from input method */ + goto insert; + case XLookupKeySym: + case XLookupBoth: /* a KeySym and a string are returned: use keysym */ + break; + } + + if (ev->state & ControlMask) { + switch(ksym) { + #if FZFEXPECT_PATCH + case XK_a: expect("ctrl-a", ev); ksym = XK_Home; break; + case XK_b: expect("ctrl-b", ev); ksym = XK_Left; break; + case XK_c: expect("ctrl-c", ev); ksym = XK_Escape; break; + case XK_d: expect("ctrl-d", ev); ksym = XK_Delete; break; + case XK_e: expect("ctrl-e", ev); ksym = XK_End; break; + case XK_f: expect("ctrl-f", ev); ksym = XK_Right; break; + case XK_g: expect("ctrl-g", ev); ksym = XK_Escape; break; + case XK_h: expect("ctrl-h", ev); ksym = XK_BackSpace; break; + case XK_i: expect("ctrl-i", ev); ksym = XK_Tab; break; + case XK_j: expect("ctrl-j", ev); ksym = XK_Down; break; + case XK_J:/* fallthrough */ + case XK_l: expect("ctrl-l", ev); break; + case XK_m: expect("ctrl-m", ev); /* fallthrough */ + case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; + case XK_n: expect("ctrl-n", ev); ksym = XK_Down; break; + case XK_p: expect("ctrl-p", ev); ksym = XK_Up; break; + case XK_o: expect("ctrl-o", ev); break; + case XK_q: expect("ctrl-q", ev); break; + case XK_r: expect("ctrl-r", ev); break; + case XK_s: expect("ctrl-s", ev); break; + case XK_t: expect("ctrl-t", ev); break; + case XK_k: expect("ctrl-k", ev); ksym = XK_Up; break; + #else + case XK_a: ksym = XK_Home; break; + case XK_b: ksym = XK_Left; break; + case XK_c: ksym = XK_Escape; break; + case XK_d: ksym = XK_Delete; break; + case XK_e: ksym = XK_End; break; + case XK_f: ksym = XK_Right; break; + case XK_g: ksym = XK_Escape; break; + case XK_h: ksym = XK_BackSpace; break; + case XK_i: ksym = XK_Tab; break; + case XK_j: /* fallthrough */ + case XK_J: /* fallthrough */ + case XK_m: /* fallthrough */ + case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; + case XK_n: ksym = XK_Down; break; + case XK_p: ksym = XK_Up; break; + + case XK_k: /* delete right */ + text[cursor] = '\0'; + match(); + break; + #endif // FZFEXPECT_PATCH + #if FZFEXPECT_PATCH + case XK_u: expect("ctrl-u", ev); /* delete left */ + #else + case XK_u: /* delete left */ + #endif // FZFEXPECT_PATCH + insert(NULL, 0 - cursor); + break; + #if FZFEXPECT_PATCH + case XK_w: expect("ctrl-w", ev); /* delete word */ + #else + case XK_w: /* delete word */ + #endif // FZFEXPECT_PATCH + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) + insert(NULL, nextrune(-1) - cursor); + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) + insert(NULL, nextrune(-1) - cursor); + break; + #if FZFEXPECT_PATCH || CTRL_V_TO_PASTE_PATCH + case XK_v: + #if FZFEXPECT_PATCH + expect("ctrl-v", ev); + #endif // FZFEXPECT_PATCH + case XK_V: + XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, + utf8, utf8, win, CurrentTime); + return; + #endif // FZFEXPECT_PATCH | CTRL_V_TO_PASTE_PATCH + #if FZFEXPECT_PATCH + case XK_y: expect("ctrl-y", ev); /* paste selection */ + #else + case XK_y: /* paste selection */ + #endif // FZFEXPECT_PATCH + case XK_Y: + XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, + utf8, utf8, win, CurrentTime); + return; + #if FZFEXPECT_PATCH + case XK_x: expect("ctrl-x", ev); break; + case XK_z: expect("ctrl-z", ev); break; + #endif // FZFEXPECT_PATCH + case XK_Left: + case XK_KP_Left: + movewordedge(-1); + goto draw; + case XK_Right: + case XK_KP_Right: + movewordedge(+1); + goto draw; + case XK_Return: + case XK_KP_Enter: + #if RESTRICT_RETURN_PATCH + if (restrict_return) + break; + #endif // RESTRICT_RETURN_PATCH + #if MULTI_SELECTION_PATCH + selsel(); + #endif // MULTI_SELECTION_PATCH + break; + case XK_bracketleft: + cleanup(); + exit(1); + default: + return; + } + } else if (ev->state & Mod1Mask) { + switch(ksym) { + case XK_b: + movewordedge(-1); + goto draw; + case XK_f: + movewordedge(+1); + goto draw; + case XK_g: ksym = XK_Home; break; + case XK_G: ksym = XK_End; break; + case XK_h: ksym = XK_Up; break; + case XK_j: ksym = XK_Next; break; + case XK_k: ksym = XK_Prior; break; + case XK_l: ksym = XK_Down; break; + #if NAVHISTORY_PATCH + case XK_p: + navhistory(-1); + buf[0]=0; + break; + case XK_n: + navhistory(1); + buf[0]=0; + break; + #endif // NAVHISTORY_PATCH + default: + return; + } + } + + switch(ksym) { + default: +insert: + if (!iscntrl((unsigned char)*buf)) + insert(buf, len); + break; + case XK_Delete: + case XK_KP_Delete: + if (text[cursor] == '\0') + return; + cursor = nextrune(+1); + /* fallthrough */ + case XK_BackSpace: + if (cursor == 0) + return; + insert(NULL, nextrune(-1) - cursor); + break; + case XK_End: + case XK_KP_End: + if (text[cursor] != '\0') { + cursor = strlen(text); + break; + } + if (next) { + /* jump to end of list and position items in reverse */ + curr = matchend; + calcoffsets(); + curr = prev; + calcoffsets(); + while (next && (curr = curr->right)) + calcoffsets(); + } + sel = matchend; + break; + case XK_Escape: + cleanup(); + exit(1); + case XK_Home: + case XK_KP_Home: + if (sel == matches) { + cursor = 0; + break; + } + sel = curr = matches; + calcoffsets(); + break; + case XK_Left: + case XK_KP_Left: + #if GRID_PATCH && GRIDNAV_PATCH + if (columns > 1) { + if (!sel) + return; + tmpsel = sel; + for (i = 0; i < lines; i++) { + if (!tmpsel->left || tmpsel->left->right != tmpsel) + return; + if (tmpsel == curr) + offscreen = true; + tmpsel = tmpsel->left; + } + sel = tmpsel; + if (offscreen) { + curr = prev; + calcoffsets(); + } + break; + } + #endif // GRIDNAV_PATCH + if (cursor > 0 && (!sel || !sel->left || lines > 0)) { + cursor = nextrune(-1); + break; + } + if (lines > 0) + return; + /* fallthrough */ + case XK_Up: + case XK_KP_Up: + if (sel && sel->left && (sel = sel->left)->right == curr) { + curr = prev; + calcoffsets(); + } + break; + case XK_Next: + case XK_KP_Next: + if (!next) + return; + sel = curr = next; + calcoffsets(); + break; + case XK_Prior: + case XK_KP_Prior: + if (!prev) + return; + sel = curr = prev; + calcoffsets(); + break; + case XK_Return: + case XK_KP_Enter: + #if RESTRICT_RETURN_PATCH + if (restrict_return && (!sel || ev->state & (ShiftMask | ControlMask))) + break; + #endif // RESTRICT_RETURN_PATCH + #if !MULTI_SELECTION_PATCH + #if PIPEOUT_PATCH + #if PRINTINPUTTEXT_PATCH + if (sel && ( + (use_text_input && (ev->state & ShiftMask)) || + (!use_text_input && !(ev->state & ShiftMask)) + )) + #else + if (sel && !(ev->state & ShiftMask)) + #endif // PRINTINPUTTEXT_PATCH + { + if (sel->text[0] == startpipe[0]) { + strncpy(sel->text + strlen(sel->text),pipeout,8); + puts(sel->text+1); + } + #if PRINTINDEX_PATCH + if (print_index) + printf("%d\n", sel->index); + else + #endif // PRINTINDEX_PATCH + puts(sel->text); + } else { + if (text[0] == startpipe[0]) { + strncpy(text + strlen(text),pipeout,8); + puts(text+1); + } + puts(text); + } + #elif PRINTINPUTTEXT_PATCH + if (use_text_input) + puts((sel && (ev->state & ShiftMask)) ? sel->text : text); + #if PRINTINDEX_PATCH + else if (print_index) + printf("%d\n", (sel && !(ev->state & ShiftMask)) ? sel->index : -1); + #endif // PRINTINDEX_PATCH + else + #if SEPARATOR_PATCH + puts((sel && !(ev->state & ShiftMask)) ? sel->text_output : text); + #else + puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); + #endif // SEPARATOR_PATCH + #elif PRINTINDEX_PATCH + if (print_index) + printf("%d\n", (sel && !(ev->state & ShiftMask)) ? sel->index : -1); + else + #if SEPARATOR_PATCH + puts((sel && !(ev->state & ShiftMask)) ? sel->text_output : text); + #else + puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); + #endif // SEPARATOR_PATCH + #elif SEPARATOR_PATCH + puts((sel && !(ev->state & ShiftMask)) ? sel->text_output : text); + #else + puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); + #endif // PIPEOUT_PATCH | PRINTINPUTTEXT_PATCH | PRINTINDEX_PATCH + #endif // MULTI_SELECTION_PATCH + if (!(ev->state & ControlMask)) { + #if NAVHISTORY_PATCH + savehistory((sel && !(ev->state & ShiftMask)) + ? sel->text : text); + #endif // NAVHISTORY_PATCH + #if MULTI_SELECTION_PATCH + printsel(ev->state); + #endif // MULTI_SELECTION_PATCH + cleanup(); + exit(0); + } + #if !MULTI_SELECTION_PATCH + if (sel) + sel->out = 1; + #endif // MULTI_SELECTION_PATCH + break; + case XK_Right: + case XK_KP_Right: + #if GRID_PATCH && GRIDNAV_PATCH + if (columns > 1) { + if (!sel) + return; + tmpsel = sel; + for (i = 0; i < lines; i++) { + if (!tmpsel->right || tmpsel->right->left != tmpsel) + return; + tmpsel = tmpsel->right; + if (tmpsel == next) + offscreen = true; + } + sel = tmpsel; + if (offscreen) { + curr = next; + calcoffsets(); + } + break; + } + #endif // GRIDNAV_PATCH + if (text[cursor] != '\0') { + cursor = nextrune(+1); + break; + } + if (lines > 0) + return; + /* fallthrough */ + case XK_Down: + case XK_KP_Down: + if (sel && sel->right && (sel = sel->right) == next) { + curr = next; + calcoffsets(); + } + break; + case XK_Tab: + #if PREFIXCOMPLETION_PATCH + if (!matches) + break; /* cannot complete no matches */ + #if FUZZYMATCH_PATCH + /* only do tab completion if all matches start with prefix */ + for (item = matches; item && item->text; item = item->right) + if (item->text[0] != text[0]) + goto draw; + #endif // FUZZYMATCH_PATCH + strncpy(text, matches->text, sizeof text - 1); + text[sizeof text - 1] = '\0'; + len = cursor = strlen(text); /* length of longest common prefix */ + for (item = matches; item && item->text; item = item->right) { + cursor = 0; + while (cursor < len && text[cursor] == item->text[cursor]) + cursor++; + len = cursor; + } + memset(text + len, '\0', strlen(text) - len); + #else + if (!sel) + return; + cursor = strnlen(sel->text, sizeof text - 1); + memcpy(text, sel->text, cursor); + text[cursor] = '\0'; + match(); + #endif // PREFIXCOMPLETION_PATCH + break; + } + +draw: + #if INCREMENTAL_PATCH + if (incremental) { + puts(text); + fflush(stdout); + } + #endif // INCREMENTAL_PATCH + drawmenu(); +} + +static void +paste(void) +{ + char *p, *q; + int di; + unsigned long dl; + Atom da; + + /* we have been given the current selection, now insert it into input */ + if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, + utf8, &da, &di, &dl, &dl, (unsigned char **)&p) + == Success && p) { + insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); + XFree(p); + } + drawmenu(); +} + +#if ALPHA_PATCH +static void +xinitvisual() +{ + XVisualInfo *infos; + XRenderPictFormat *fmt; + int nitems; + int i; + + XVisualInfo tpl = { + .screen = screen, + .depth = 32, + .class = TrueColor + }; + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; + + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); + visual = NULL; + for(i = 0; i < nitems; i ++) { + fmt = XRenderFindVisualFormat(dpy, infos[i].visual); + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { + visual = infos[i].visual; + depth = infos[i].depth; + cmap = XCreateColormap(dpy, root, visual, AllocNone); + useargb = 1; + break; + } + } + + XFree(infos); + + if (!visual || !opacity) { + visual = DefaultVisual(dpy, screen); + depth = DefaultDepth(dpy, screen); + cmap = DefaultColormap(dpy, screen); + } +} +#endif // ALPHA_PATCH + +#if !NON_BLOCKING_STDIN_PATCH +static void +readstdin(void) +{ + char *line = NULL; + #if SEPARATOR_PATCH + char *p; + #elif TSV_PATCH + char *buf, *p; + #endif // SEPARATOR_PATCH | TSV_PATCH + + size_t i, linesiz, itemsiz = 0; + ssize_t len; + + #if PASSWORD_PATCH + if (passwd) { + inputw = lines = 0; + return; + } + #endif // PASSWORD_PATCH + + /* read each line from stdin and add it to the item list */ + for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) { + if (i + 1 >= itemsiz) { + itemsiz += 256; + if (!(items = realloc(items, itemsiz * sizeof(*items)))) + die("cannot realloc %zu bytes:", itemsiz * sizeof(*items)); + } + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + + if (!(items[i].text = strdup(line))) + die("strdup:"); + #if SEPARATOR_PATCH + if (separator && (p = separator_greedy ? + strrchr(items[i].text, separator) : strchr(items[i].text, separator))) { + *p = '\0'; + items[i].text_output = ++p; + } else { + items[i].text_output = items[i].text; + } + if (separator_reverse) { + p = items[i].text; + items[i].text = items[i].text_output; + items[i].text_output = p; + } + #elif TSV_PATCH + if (!(buf = strdup(line))) + die("cannot strdup %u bytes:", strlen(line) + 1); + if ((p = strchr(buf, '\t'))) + *p = '\0'; + items[i].stext = buf; + #endif // SEPARATOR_PATCH | TSV_PATCH + #if MULTI_SELECTION_PATCH + items[i].id = i; /* for multiselect */ + #if PRINTINDEX_PATCH + items[i].index = i; + #endif // PRINTINDEX_PATCH + #elif PRINTINDEX_PATCH + items[i].index = i; + #else + items[i].out = 0; + #endif // MULTI_SELECTION_PATCH | PRINTINDEX_PATCH + + #if HIGHPRIORITY_PATCH + items[i].hp = arrayhas(hpitems, hplength, items[i].text); + #endif // HIGHPRIORITY_PATCH + } + free(line); + if (items) + items[i].text = NULL; + lines = MIN(lines, i); +} +#endif // NON_BLOCKING_STDIN_PATCH + +static void +#if NON_BLOCKING_STDIN_PATCH +readevent(void) +#else +run(void) +#endif // NON_BLOCKING_STDIN_PATCH +{ + XEvent ev; + #if PRESELECT_PATCH + int i; + #endif // PRESELECT_PATCH + + while (!XNextEvent(dpy, &ev)) { + #if PRESELECT_PATCH + if (preselected) { + for (i = 0; i < preselected; i++) { + if (sel && sel->right && (sel = sel->right) == next) { + curr = next; + calcoffsets(); + } + } + drawmenu(); + preselected = 0; + } + #endif // PRESELECT_PATCH + if (XFilterEvent(&ev, win)) + continue; + switch(ev.type) { + #if MOUSE_SUPPORT_PATCH + case ButtonPress: + buttonpress(&ev); + break; + #endif // MOUSE_SUPPORT_PATCH + case DestroyNotify: + if (ev.xdestroywindow.window != win) + break; + cleanup(); + exit(1); + case Expose: + if (ev.xexpose.count == 0) + drw_map(drw, win, 0, 0, mw, mh); + break; + case FocusIn: + /* regrab focus from parent window */ + if (ev.xfocus.window != win) + grabfocus(); + break; + case KeyPress: + keypress(&ev.xkey); + break; + case SelectionNotify: + if (ev.xselection.property == utf8) + paste(); + break; + case VisibilityNotify: + if (ev.xvisibility.state != VisibilityUnobscured) + XRaiseWindow(dpy, win); + break; + } + } +} + +static void +setup(void) +{ + int x, y, i, j; + unsigned int du; + #if RELATIVE_INPUT_WIDTH_PATCH + unsigned int tmp, minstrlen = 0, curstrlen = 0; + int numwidthchecks = 100; + struct item *item; + #endif // RELATIVE_INPUT_WIDTH_PATCH + XSetWindowAttributes swa; + XIM xim; + Window w, dw, *dws; + XWindowAttributes wa; + XClassHint ch = {"dmenu", "dmenu"}; +#ifdef XINERAMA + XineramaScreenInfo *info; + Window pw; + int a, di, n, area = 0; +#endif + /* init appearance */ + #if XRESOURCES_PATCH + for (j = 0; j < SchemeLast; j++) + #if ALPHA_PATCH + scheme[j] = drw_scm_create(drw, (const char**)colors[j], alphas[j], 2); + #else + scheme[j] = drw_scm_create(drw, (const char**)colors[j], 2); + #endif // ALPHA_PATCH + #else + for (j = 0; j < SchemeLast; j++) + #if ALPHA_PATCH + scheme[j] = drw_scm_create(drw, colors[j], alphas[j], 2); + #else + scheme[j] = drw_scm_create(drw, colors[j], 2); + #endif // ALPHA_PATCH + #endif // XRESOURCES_PATCH + + clip = XInternAtom(dpy, "CLIPBOARD", False); + utf8 = XInternAtom(dpy, "UTF8_STRING", False); + #if WMTYPE_PATCH + type = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + dock = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); + #endif // WMTYPE_PATCH + + /* calculate menu geometry */ + #if PANGO_PATCH + bh = drw->font->h + 2; + #else + bh = drw->fonts->h + 2; + #endif // PANGO_PATCH + #if LINE_HEIGHT_PATCH + bh = MAX(bh,lineheight); /* make a menu line AT LEAST 'lineheight' tall */ + #endif // LINE_HEIGHT_PATCH + lines = MAX(lines, 0); + mh = (lines + 1) * bh; + #if CENTER_PATCH && PANGO_PATCH + promptw = (prompt && *prompt) ? TEXTWM(prompt) - lrpad / 4 : 0; + #elif CENTER_PATCH + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + #endif // CENTER_PATCH +#ifdef XINERAMA + i = 0; + if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { + XGetInputFocus(dpy, &w, &di); + if (mon >= 0 && mon < n) + i = mon; + else if (w != root && w != PointerRoot && w != None) { + /* find top-level window containing current input focus */ + do { + if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) + XFree(dws); + } while (w != root && w != pw); + /* find xinerama screen with which the window intersects most */ + if (XGetWindowAttributes(dpy, pw, &wa)) + for (j = 0; j < n; j++) + if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { + area = a; + i = j; + } + } + /* no focused window is on screen, so use pointer location instead */ + if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) + for (i = 0; i < n; i++) + if (INTERSECT(x, y, 1, 1, info[i]) != 0) + break; + + #if CENTER_PATCH + if (center) { + mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width); + x = info[i].x_org + ((info[i].width - mw) / 2); + y = info[i].y_org + ((info[i].height - mh) / 2); + } else { + #if XYW_PATCH + x = info[i].x_org + dmx; + y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); + mw = (dmw>0 ? dmw : info[i].width); + #else + x = info[i].x_org; + y = info[i].y_org + (topbar ? 0 : info[i].height - mh); + mw = info[i].width; + #endif // XYW_PATCH + } + #elif XYW_PATCH + x = info[i].x_org + dmx; + y = info[i].y_org + (topbar ? dmy : info[i].height - mh - dmy); + mw = (dmw>0 ? dmw : info[i].width); + #else + x = info[i].x_org; + y = info[i].y_org + (topbar ? 0 : info[i].height - mh); + mw = info[i].width; + #endif // CENTER_PATCH / XYW_PATCH + XFree(info); + } else +#endif + { + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); + #if CENTER_PATCH + if (center) { + mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); + x = (wa.width - mw) / 2; + y = (wa.height - mh) / 2; + } else { + #if XYW_PATCH + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); + #else + x = 0; + y = topbar ? 0 : wa.height - mh; + mw = wa.width; + #endif // XYW_PATCH + } + #elif XYW_PATCH + x = dmx; + y = topbar ? dmy : wa.height - mh - dmy; + mw = (dmw>0 ? dmw : wa.width); + #else + x = 0; + y = topbar ? 0 : wa.height - mh; + mw = wa.width; + #endif // CENTER_PATCH / XYW_PATCH + } + #if !CENTER_PATCH + #if PANGO_PATCH + promptw = (prompt && *prompt) ? TEXTWM(prompt) - lrpad / 4 : 0; + #else + promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; + #endif // PANGO_PATCH + #endif // CENTER_PATCH + #if RELATIVE_INPUT_WIDTH_PATCH + for (item = items; !lines && item && item->text; ++item) { + curstrlen = strlen(item->text); + if (numwidthchecks || minstrlen < curstrlen) { + numwidthchecks = MAX(numwidthchecks - 1, 0); + minstrlen = MAX(minstrlen, curstrlen); + if ((tmp = textw_clamp(item->text, mw/3)) > inputw) { + inputw = tmp; + if (tmp == mw/3) + break; + } + } + } + #else + inputw = mw / 3; /* input width: ~33.33% of monitor width */ + #endif // RELATIVE_INPUT_WIDTH_PATCH + match(); + + /* create menu window */ + #if MANAGED_PATCH + swa.override_redirect = managed ? False : True; + #else + swa.override_redirect = True; + #endif // MANAGED_PATCH + #if ALPHA_PATCH + swa.background_pixel = 0; + swa.colormap = cmap; + #else + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + #endif // ALPHA_PATCH + swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask + #if MOUSE_SUPPORT_PATCH + | ButtonPressMask + #endif // MOUSE_SUPPORT_PATCH + ; + win = XCreateWindow( + dpy, root, + #if BARPADDING_PATCH && BORDER_PATCH + x + sp, y + vp - (topbar ? 0 : border_width * 2), mw - 2 * sp - border_width * 2, mh, border_width, + #elif BARPADDING_PATCH + x + sp, y + vp, mw - 2 * sp, mh, 0, + #elif BORDER_PATCH + x, y - (topbar ? 0 : border_width * 2), mw - border_width * 2, mh, border_width, + #else + x, y, mw, mh, 0, + #endif // BORDER_PATCH | BARPADDING_PATCH + #if ALPHA_PATCH + depth, InputOutput, visual, + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa + #else + CopyFromParent, CopyFromParent, CopyFromParent, + CWOverrideRedirect | CWBackPixel | CWEventMask, &swa + #endif // ALPHA_PATCH + ); + #if BORDER_PATCH + if (border_width) + XSetWindowBorder(dpy, win, scheme[SchemeBorder][ColBg].pixel); + #endif // BORDER_PATCH + XSetClassHint(dpy, win, &ch); + #if WMTYPE_PATCH + XChangeProperty(dpy, win, type, XA_ATOM, 32, PropModeReplace, + (unsigned char *) &dock, 1); + #endif // WMTYPE_PATCH + + + /* input methods */ + if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) + die("XOpenIM failed: could not open input device"); + + xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, + XNClientWindow, win, XNFocusWindow, win, NULL); + + #if MANAGED_PATCH + if (managed) { + XTextProperty prop; + char *windowtitle = prompt != NULL ? prompt : "dmenu"; + Xutf8TextListToTextProperty(dpy, &windowtitle, 1, XUTF8StringStyle, &prop); + XSetWMName(dpy, win, &prop); + XSetTextProperty(dpy, win, &prop, XInternAtom(dpy, "_NET_WM_NAME", False)); + XFree(prop.value); + } + #endif // MANAGED_PATCH + + XMapRaised(dpy, win); + if (embed) { + XReparentWindow(dpy, win, parentwin, x, y); + XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); + if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { + for (i = 0; i < du && dws[i] != win; ++i) + XSelectInput(dpy, dws[i], FocusChangeMask); + XFree(dws); + } + grabfocus(); + } + drw_resize(drw, mw, mh); + drawmenu(); +} + +static void +usage(void) +{ + die("usage: dmenu [-bv" + #if CENTER_PATCH + "c" + #endif + #if !NON_BLOCKING_STDIN_PATCH + "f" + #endif // NON_BLOCKING_STDIN_PATCH + #if INCREMENTAL_PATCH + "r" + #endif // INCREMENTAL_PATCH + #if CASEINSENSITIVE_PATCH + "s" + #else + "i" + #endif // CASEINSENSITIVE_PATCH + #if INSTANT_PATCH + "n" + #endif // INSTANT_PATCH + #if PRINTINPUTTEXT_PATCH + "t" + #endif // PRINTINPUTTEXT_PATCH + #if PREFIXCOMPLETION_PATCH + "x" + #endif // PREFIXCOMPLETION_PATCH + #if FUZZYMATCH_PATCH + "F" + #endif // FUZZYMATCH_PATCH + #if PASSWORD_PATCH + "P" + #endif // PASSWORD_PATCH + #if NO_SORT_PATCH + "S" + #endif // NO_SORT_PATCH + #if REJECTNOMATCH_PATCH + "R" // (changed from r to R due to conflict with INCREMENTAL_PATCH) + #endif // REJECTNOMATCH_PATCH + #if RESTRICT_RETURN_PATCH + "1" + #endif // RESTRICT_RETURN_PATCH + "] " + #if CARET_WIDTH_PATCH + "[-cw caret_width] " + #endif // CARET_WIDTH_PATCH + #if MANAGED_PATCH + "[-wm] " + #endif // MANAGED_PATCH + #if GRID_PATCH + "[-g columns] " + #endif // GRID_PATCH + "[-l lines] [-p prompt] [-fn font] [-m monitor]" + "\n [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]" + #if DYNAMIC_OPTIONS_PATCH || FZFEXPECT_PATCH || ALPHA_PATCH || BORDER_PATCH || HIGHPRIORITY_PATCH + "\n " + #endif + #if DYNAMIC_OPTIONS_PATCH + " [-dy command]" + #endif // DYNAMIC_OPTIONS_PATCH + #if FZFEXPECT_PATCH + " [-ex expectkey]" + #endif // FZFEXPECT_PATCH + #if ALPHA_PATCH + " [-o opacity]" + #endif // ALPHA_PATCH + #if BORDER_PATCH + " [-bw width]" + #endif // BORDER_PATCH + #if HIGHPRIORITY_PATCH + " [-hb color] [-hf color] [-hp items]" + #endif // HIGHPRIORITY_PATCH + #if INITIALTEXT_PATCH || LINE_HEIGHT_PATCH || PRESELECT_PATCH || NAVHISTORY_PATCH || XYW_PATCH + "\n " + #endif + #if INITIALTEXT_PATCH + " [-it text]" + #endif // INITIALTEXT_PATCH + #if LINE_HEIGHT_PATCH + " [-h height]" + #endif // LINE_HEIGHT_PATCH + #if PRESELECT_PATCH + " [-ps index]" + #endif // PRESELECT_PATCH + #if NAVHISTORY_PATCH + " [-H histfile]" + #endif // NAVHISTORY_PATCH + #if XYW_PATCH + " [-X xoffset] [-Y yoffset] [-W width]" // (arguments made upper case due to conflicts) + #endif // XYW_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + "\n [-nhb color] [-nhf color] [-shb color] [-shf color]" // highlight colors + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + #if SEPARATOR_PATCH + "\n [-d separator] [-D separator]" + #endif // SEPARATOR_PATCH + "\n"); +} + +int +main(int argc, char *argv[]) +{ + XWindowAttributes wa; + int i; + #if !NON_BLOCKING_STDIN_PATCH + int fast = 0; + #endif // NON_BLOCKING_STDIN_PATCH + + #if XRESOURCES_PATCH + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("cannot open display"); + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + if (!embed || !(parentwin = strtol(embed, NULL, 0))) + parentwin = root; + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); + + #if ALPHA_PATCH + /* These need to be checked before we init the visuals. */ + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-o")) { /* opacity, pass -o 0 to disable alpha */ + opacity = atoi(argv[++i]); + } else { + continue; + } + argv[i][0] = '\0'; // mark as used + } + xinitvisual(); + drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); + #else + drw = drw_create(dpy, screen, root, wa.width, wa.height); + #endif // ALPHA_PATCH + readxresources(); + #endif // XRESOURCES_PATCH + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '\0') + continue; + + /* these options take no arguments */ + if (!strcmp(argv[i], "-v")) { /* prints version information */ + puts("dmenu-"VERSION); + exit(0); + } else if (!strcmp(argv[i], "-b")) { /* appears at the bottom of the screen */ + topbar = 0; + #if CENTER_PATCH + } else if (!strcmp(argv[i], "-c")) { /* toggles centering of dmenu window on screen */ + center = !center; + #endif // CENTER_PATCH + #if !NON_BLOCKING_STDIN_PATCH + } else if (!strcmp(argv[i], "-f")) { /* grabs keyboard before reading stdin */ + fast = 1; + #endif // NON_BLOCKING_STDIN_PATCH + #if INCREMENTAL_PATCH + } else if (!strcmp(argv[i], "-r")) { /* incremental */ + incremental = !incremental; + #endif // INCREMENTAL_PATCH + #if CASEINSENSITIVE_PATCH + } else if (!strcmp(argv[i], "-s")) { /* case-sensitive item matching */ + fstrncmp = strncmp; + fstrstr = strstr; + #else + } else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ + fstrncmp = strncasecmp; + fstrstr = cistrstr; + #endif // CASEINSENSITIVE_PATCH + #if MANAGED_PATCH + } else if (!strcmp(argv[i], "-wm")) { /* display as managed wm window */ + managed = 1; + #endif // MANAGED_PATCH + #if INSTANT_PATCH + } else if (!strcmp(argv[i], "-n")) { /* instant select only match */ + instant = !instant; + #endif // INSTANT_PATCH + #if PRINTINPUTTEXT_PATCH + } else if (!strcmp(argv[i], "-t")) { /* favors text input over selection */ + use_text_input = 1; + #endif // PRINTINPUTTEXT_PATCH + #if PREFIXCOMPLETION_PATCH + } else if (!strcmp(argv[i], "-x")) { /* invert use_prefix */ + use_prefix = !use_prefix; + #endif // PREFIXCOMPLETION_PATCH + #if FUZZYMATCH_PATCH + } else if (!strcmp(argv[i], "-F")) { /* disable/enable fuzzy matching, depends on default */ + fuzzy = !fuzzy; + #endif // FUZZYMATCH_PATCH + #if PASSWORD_PATCH + } else if (!strcmp(argv[i], "-P")) { /* is the input a password */ + passwd = 1; + #endif // PASSWORD_PATCH + #if FZFEXPECT_PATCH + } else if (!strcmp(argv[i], "-ex")) { /* expect key */ + expected = argv[++i]; + #endif // FZFEXPECT_PATCH + #if REJECTNOMATCH_PATCH + } else if (!strcmp(argv[i], "-R")) { /* reject input which results in no match */ + reject_no_match = 1; + #endif // REJECTNOMATCH_PATCH + #if NO_SORT_PATCH + } else if (!strcmp(argv[i], "-S")) { /* do not sort matches */ + sortmatches = 0; + #endif // NO_SORT_PATCH + #if PRINTINDEX_PATCH + } else if (!strcmp(argv[i], "-ix")) { /* adds ability to return index in list */ + print_index = 1; + #endif // PRINTINDEX_PATCH + #if RESTRICT_RETURN_PATCH + } else if (!strcmp(argv[i], "-1")) { + restrict_return = 1; + #endif // RESTRICT_RETURN_PATCH + } else if (i + 1 == argc) + usage(); + /* these options take one argument */ + #if NAVHISTORY_PATCH + else if (!strcmp(argv[i], "-H")) + histfile = argv[++i]; + #endif // NAVHISTORY_PATCH + #if GRID_PATCH + else if (!strcmp(argv[i], "-g")) { /* number of columns in grid */ + columns = atoi(argv[++i]); + if (columns && lines == 0) + lines = 1; + } + #endif // GRID_PATCH + else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ + lines = atoi(argv[++i]); + #if XYW_PATCH + else if (!strcmp(argv[i], "-X")) /* window x offset */ + dmx = atoi(argv[++i]); + else if (!strcmp(argv[i], "-Y")) /* window y offset (from bottom up if -b) */ + dmy = atoi(argv[++i]); + else if (!strcmp(argv[i], "-W")) /* make dmenu this wide */ + dmw = atoi(argv[++i]); + #endif // XYW_PATCH + else if (!strcmp(argv[i], "-m")) + mon = atoi(argv[++i]); + #if ALPHA_PATCH + else if (!strcmp(argv[i], "-o")) /* opacity, pass -o 0 to disable alpha */ + opacity = atoi(argv[++i]); + #endif // ALPHA_PATCH + else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ + prompt = argv[++i]; + else if (!strcmp(argv[i], "-fn")) /* font or font set */ + #if PANGO_PATCH + strcpy(font, argv[++i]); + #else + fonts[0] = argv[++i]; + #endif // PANGO_PATCH + #if LINE_HEIGHT_PATCH + else if(!strcmp(argv[i], "-h")) { /* minimum height of one menu line */ + lineheight = atoi(argv[++i]); + lineheight = MAX(lineheight, min_lineheight); /* reasonable default in case of value too small/negative */ + } + #endif // LINE_HEIGHT_PATCH + else if (!strcmp(argv[i], "-nb")) /* normal background color */ + colors[SchemeNorm][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ + colors[SchemeNorm][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-sb")) /* selected background color */ + colors[SchemeSel][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ + colors[SchemeSel][ColFg] = argv[++i]; + #if HIGHPRIORITY_PATCH + else if (!strcmp(argv[i], "-hb")) /* high priority background color */ + colors[SchemeHp][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-hf")) /* low priority background color */ + colors[SchemeHp][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-hp")) + hpitems = tokenize(argv[++i], ",", &hplength); + #endif // HIGHPRIORITY_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + else if (!strcmp(argv[i], "-nhb")) /* normal hi background color */ + colors[SchemeNormHighlight][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-nhf")) /* normal hi foreground color */ + colors[SchemeNormHighlight][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-shb")) /* selected hi background color */ + colors[SchemeSelHighlight][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-shf")) /* selected hi foreground color */ + colors[SchemeSelHighlight][ColFg] = argv[++i]; + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + #if CARET_WIDTH_PATCH + else if (!strcmp(argv[i], "-cw")) /* sets caret witdth */ + caret_width = atoi(argv[++i]); + #endif // CARET_WIDTH_PATCH + else if (!strcmp(argv[i], "-w")) /* embedding window id */ + embed = argv[++i]; + #if SEPARATOR_PATCH + else if (!strcmp(argv[i], "-d") || /* field separator */ + (separator_greedy = !strcmp(argv[i], "-D"))) { + separator = argv[++i][0]; + separator_reverse = argv[i][1] == '|'; + } + #endif // SEPARATOR_PATCH + #if PRESELECT_PATCH + else if (!strcmp(argv[i], "-ps")) /* preselected item */ + preselected = atoi(argv[++i]); + #endif // PRESELECT_PATCH + #if DYNAMIC_OPTIONS_PATCH + else if (!strcmp(argv[i], "-dy")) /* dynamic command to run */ + dynamic = argv[++i]; + #endif // DYNAMIC_OPTIONS_PATCH + #if BORDER_PATCH + else if (!strcmp(argv[i], "-bw")) /* border width around dmenu */ + border_width = atoi(argv[++i]); + #endif // BORDER_PATCH + #if INITIALTEXT_PATCH + else if (!strcmp(argv[i], "-it")) { /* adds initial text */ + const char * text = argv[++i]; + insert(text, strlen(text)); + } + #endif // INITIALTEXT_PATCH + else { + usage(); + } + } + + #if XRESOURCES_PATCH + #if PANGO_PATCH + if (!drw_font_create(drw, font)) + die("no fonts could be loaded."); + #else + if (!drw_fontset_create(drw, (const char**)fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + #endif // PANGO_PATCH + #else // !XRESOURCES_PATCH + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("cannot open display"); + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + if (!embed || !(parentwin = strtol(embed, NULL, 0))) + parentwin = root; + if (!XGetWindowAttributes(dpy, parentwin, &wa)) + die("could not get embedding window attributes: 0x%lx", + parentwin); + + #if ALPHA_PATCH + xinitvisual(); + drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); + #else + drw = drw_create(dpy, screen, root, wa.width, wa.height); + #endif // ALPHA_PATCH + + #if PANGO_PATCH + if (!drw_font_create(drw, font)) + die("no fonts could be loaded."); + #else + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + #endif // PANGO_PATCH + #endif // XRESOURCES_PATCH + + #if PANGO_PATCH + lrpad = drw->font->h; + #else + lrpad = drw->fonts->h; + #endif // PANGO_PATCH + + #if BARPADDING_PATCH + sp = sidepad; + vp = (topbar ? vertpad : - vertpad); + #endif // BARPADDING_PATCH + + #if LINE_HEIGHT_PATCH + if (lineheight == -1) + #if PANGO_PATCH + lineheight = drw->font->h * 2.5; + #else + lineheight = drw->fonts->h * 2.5; + #endif // PANGO_PATCH + #endif // LINE_HEIGHT_PATCH + +#ifdef __OpenBSD__ + if (pledge("stdio rpath", NULL) == -1) + die("pledge"); +#endif + #if NAVHISTORY_PATCH + loadhistory(); + #endif // NAVHISTORY_PATCH + + #if NON_BLOCKING_STDIN_PATCH + grabkeyboard(); + #else + if (fast && !isatty(0)) { + grabkeyboard(); + #if DYNAMIC_OPTIONS_PATCH + if (!(dynamic && *dynamic)) + readstdin(); + #else + readstdin(); + #endif // DYNAMIC_OPTIONS_PATCH + } else { + #if DYNAMIC_OPTIONS_PATCH + if (!(dynamic && *dynamic)) + readstdin(); + #else + readstdin(); + #endif // DYNAMIC_OPTIONS_PATCH + grabkeyboard(); + } + #endif // NON_BLOCKING_STDIN_PATCH + setup(); + run(); + + return 1; /* unreachable */ +} diff --git a/dmenu/dmenu_path b/dmenu-flexipatch/dmenu_path similarity index 100% rename from dmenu/dmenu_path rename to dmenu-flexipatch/dmenu_path diff --git a/dmenu-flexipatch/dmenu_run b/dmenu-flexipatch/dmenu_run new file mode 100755 index 0000000..e6d1355 --- /dev/null +++ b/dmenu-flexipatch/dmenu_run @@ -0,0 +1,6 @@ +#!/bin/sh +export _JAVA_AWT_WM_NONREPARENTING=1 +dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & + +# Uncomment for the NAVHISTORY patch (and remove the exec above) +#dmenu_path | dmenu -H "${XDG_CACHE_HOME:-$HOME/.cache/}/dmenu_run.hist" "$@" | ${SHELL:-"/bin/sh"} & \ No newline at end of file diff --git a/dmenu/drw.c b/dmenu-flexipatch/drw.c similarity index 54% rename from dmenu/drw.c rename to dmenu-flexipatch/drw.c index fe3aadd..62096d1 100644 --- a/dmenu/drw.c +++ b/dmenu-flexipatch/drw.c @@ -5,9 +5,11 @@ #include #include +#include "patches.h" #include "drw.h" #include "util.h" +#if !PANGO_PATCH #define UTF_INVALID 0xFFFD #define UTF_SIZ 4 @@ -59,9 +61,14 @@ utf8decode(const char *c, long *u, size_t clen) return len; } +#endif // PANGO_PATCH Drw * +#if ALPHA_PATCH drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) +#else +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) +#endif // ALPHA_PATCH { Drw *drw = ecalloc(1, sizeof(Drw)); @@ -70,11 +77,16 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h drw->root = root; drw->w = w; drw->h = h; + #if ALPHA_PATCH drw->visual = visual; drw->depth = depth; drw->cmap = cmap; drw->drawable = XCreatePixmap(dpy, root, w, h, depth); drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); + #else + drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); + drw->gc = XCreateGC(dpy, root, 0, NULL); + #endif // ALPHA_PATCH XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); return drw; @@ -90,7 +102,11 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) drw->h = h; if (drw->drawable) XFreePixmap(drw->dpy, drw->drawable); + #if ALPHA_PATCH drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); + #else + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); + #endif // ALPHA_PATCH } void @@ -98,10 +114,49 @@ drw_free(Drw *drw) { XFreePixmap(drw->dpy, drw->drawable); XFreeGC(drw->dpy, drw->gc); + #if PANGO_PATCH + drw_font_free(drw->font); + #else drw_fontset_free(drw->fonts); + #endif // PANGO_PATCH free(drw); } +#if PANGO_PATCH +/* This function is an implementation detail. Library users should use + * drw_font_create instead. + */ +static Fnt * +xfont_create(Drw *drw, const char *fontname) +{ + Fnt *font; + PangoFontMap *fontmap; + PangoContext *context; + PangoFontDescription *desc; + PangoFontMetrics *metrics; + + if (!fontname) { + die("no font specified."); + } + + font = ecalloc(1, sizeof(Fnt)); + font->dpy = drw->dpy; + + fontmap = pango_xft_get_font_map(drw->dpy, drw->screen); + context = pango_font_map_create_context(fontmap); + desc = pango_font_description_from_string(fontname); + font->layout = pango_layout_new(context); + pango_layout_set_font_description(font->layout, desc); + + metrics = pango_context_get_metrics(context, desc, pango_language_from_string ("en-us")); + font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; + + pango_font_metrics_unref(metrics); + g_object_unref(context); + + return font; +} +#else /* This function is an implementation detail. Library users should use * drw_fontset_create instead. */ @@ -136,6 +191,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) die("no font specified."); } + #if NO_COLOR_EMOJI_PATCH /* Do not allow using color fonts. This is a workaround for a BadLength * error from Xft with color glyphs. Modelled on the Xterm workaround. See * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 @@ -144,10 +200,11 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) * and lots more all over the internet. */ FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { + if (FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { XftFontClose(drw->dpy, xfont); return NULL; } + #endif // NO_COLOR_EMOJI_PATCH font = ecalloc(1, sizeof(Fnt)); font->xfont = xfont; @@ -157,18 +214,38 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) return font; } +#endif // PANGO_PATCH static void xfont_free(Fnt *font) { if (!font) return; + #if PANGO_PATCH + if (font->layout) + g_object_unref(font->layout); + #else if (font->pattern) FcPatternDestroy(font->pattern); XftFontClose(font->dpy, font->xfont); + #endif // PANGO_PATCH free(font); } +#if PANGO_PATCH +Fnt* +drw_font_create(Drw* drw, const char font[]) +{ + Fnt *fnt = NULL; + + if (!drw || !font) + return NULL; + + fnt = xfont_create(drw, font); + + return (drw->font = fnt); +} +#else Fnt* drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) { @@ -186,7 +263,16 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) } return (drw->fonts = ret); } +#endif // PANGO_PATCH +#if PANGO_PATCH +void +drw_font_free(Fnt *font) +{ + if (font) + xfont_free(font); +} +#else void drw_fontset_free(Fnt *font) { @@ -195,24 +281,40 @@ drw_fontset_free(Fnt *font) xfont_free(font); } } +#endif // PANGO_PATCH void +#if ALPHA_PATCH drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) +#else +drw_clr_create(Drw *drw, Clr *dest, const char *clrname) +#endif // ALPHA_PATCH { if (!drw || !dest || !clrname) return; + #if ALPHA_PATCH if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, clrname, dest)) die("error, cannot allocate color '%s'", clrname); dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); + #else + if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen), + clrname, dest)) + die("error, cannot allocate color '%s'", clrname); + #endif // ALPHA_PATCH } /* Wrapper to create color schemes. The caller has to call free(3) on the * returned color scheme when done using it. */ Clr * +#if ALPHA_PATCH drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) +#else +drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) +#endif // ALPHA_PATCH { size_t i; Clr *ret; @@ -222,16 +324,22 @@ drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], si return NULL; for (i = 0; i < clrcount; i++) + #if ALPHA_PATCH drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); + #else + drw_clr_create(drw, &ret[i], clrnames[i]); + #endif // ALPHA_PATCH return ret; } +#if !PANGO_PATCH void drw_setfontset(Drw *drw, Fnt *set) { if (drw) drw->fonts = set; } +#endif // PANGO_PATCH void drw_setscheme(Drw *drw, Clr *scm) @@ -252,15 +360,80 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); } +#if PANGO_PATCH int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup) { char buf[1024]; int ty; unsigned int ew; XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; size_t i, len; + int render = x || y || w || h; + + if (!drw || (render && !drw->scheme) || !text || !drw->font) + return 0; + + if (!render) { + w = invert ? invert : ~invert; + } else { + XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + #if ALPHA_PATCH + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + #else + d = XftDrawCreate(drw->dpy, drw->drawable, + DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen)); + #endif // ALPHA_PATCH + x += lpad; + w -= lpad; + } + + len = strlen(text); + + if (len) { + drw_font_getexts(drw->font, text, len, &ew, NULL, markup); + /* shorten text if necessary */ + for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) + drw_font_getexts(drw->font, text, len, &ew, NULL, markup); + + if (len) { + memcpy(buf, text, len); + buf[len] = '\0'; + if (len < strlen(text)) + for (i = len; i && i > len - 3; buf[--i] = '.') + ; /* NOP */ + + if (render) { + ty = y + (h - drw->font->h) / 2; + if (markup) + pango_layout_set_markup(drw->font->layout, buf, len); + else + pango_layout_set_text(drw->font->layout, buf, len); + pango_xft_render_layout(d, &drw->scheme[invert ? ColBg : ColFg], + drw->font->layout, x * PANGO_SCALE, ty * PANGO_SCALE); + if (markup) /* clear markup attributes */ + pango_layout_set_attributes(drw->font->layout, NULL); + } + x += ew; + w -= ew; + } + } + + if (d) + XftDrawDestroy(d); + + return x + (render ? w : 0); +} +#else +int +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) +{ + int i, ty, ellipsis_x = 0; + unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; + XftDraw *d = NULL; + Fnt *usedfont, *curfont, *nextfont; int utf8strlen, utf8charlen, render = x || y || w || h; long utf8codepoint = 0; const char *utf8str; @@ -268,24 +441,37 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp FcPattern *fcpattern; FcPattern *match; XftResult result; - int charexists = 0; + int charexists = 0, overflow = 0; + /* keep track of a couple codepoints for which we have no match. */ + enum { nomatches_len = 64 }; + static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; + const char *ellipsis = "..."; + static unsigned int ellipsis_width = 0; - if (!drw || (render && !drw->scheme) || !text || !drw->fonts) + if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) return 0; if (!render) { - w = ~w; + w = invert ? invert : ~invert; } else { XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + #if ALPHA_PATCH d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + #else + d = XftDrawCreate(drw->dpy, drw->drawable, + DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen)); + #endif // ALPHA_PATCH x += lpad; w -= lpad; } usedfont = drw->fonts; + if (!ellipsis_width && render) + ellipsis_width = drw_fontset_getwidth(drw, ellipsis); while (1) { - utf8strlen = 0; + ew = ellipsis_len = utf8strlen = 0; utf8str = text; nextfont = NULL; while (*text) { @@ -293,46 +479,53 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp for (curfont = drw->fonts; curfont; curfont = curfont->next) { charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); if (charexists) { - if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - } else { - nextfont = curfont; + drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); + if (ew + ellipsis_width <= w) { + /* keep track where the ellipsis still fits */ + ellipsis_x = x + ew; + ellipsis_w = w - ew; + ellipsis_len = utf8strlen; } + + if (ew + tmpw > w) { + overflow = 1; + /* called from drw_fontset_getwidth_clamp(): + * it wants the width AFTER the overflow + */ + if (!render) + x += tmpw; + else + utf8strlen = ellipsis_len; + } else if (curfont == usedfont) { + utf8strlen += utf8charlen; + text += utf8charlen; + ew += tmpw; + } else { + nextfont = curfont; + } break; } } - if (!charexists || nextfont) + if (overflow || !charexists || nextfont) break; else charexists = 0; } if (utf8strlen) { - drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); - /* shorten text if necessary */ - for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) - drw_font_getexts(usedfont, utf8str, len, &ew, NULL); - - if (len) { - memcpy(buf, utf8str, len); - buf[len] = '\0'; - if (len < utf8strlen) - for (i = len; i && i > len - 3; buf[--i] = '.') - ; /* NOP */ - - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)buf, len); - } - x += ew; - w -= ew; - } + if (render) { + ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; + XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], + usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); + } + x += ew; + w -= ew; } + if (render && overflow && ellipsis_w) + drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, ellipsis, invert); - if (!*text) { + if (!*text || overflow) { break; } else if (nextfont) { charexists = 0; @@ -342,6 +535,12 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp * character must be drawn. */ charexists = 1; + for (i = 0; i < nomatches_len; ++i) { + /* avoid calling XftFontMatch if we know we won't find a match */ + if (utf8codepoint == nomatches.codepoint[i]) + goto no_match; + } + fccharset = FcCharSetCreate(); FcCharSetAddChar(fccharset, utf8codepoint); @@ -353,7 +552,9 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp fcpattern = FcPatternDuplicate(drw->fonts->pattern); FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); + #if NO_COLOR_EMOJI_PATCH FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); + #endif // NO_COLOR_EMOJI_PATCH FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); FcDefaultSubstitute(fcpattern); @@ -370,6 +571,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp curfont->next = usedfont; } else { xfont_free(usedfont); + nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; +no_match: usedfont = drw->fonts; } } @@ -380,6 +583,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp return x + (render ? w : 0); } +#endif // PANGO_PATCH void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) @@ -391,6 +595,24 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) XSync(drw->dpy, False); } +#if PANGO_PATCH +unsigned int +drw_font_getwidth(Drw *drw, const char *text, Bool markup) +{ + if (!drw || !drw->font || !text) + return 0; + return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup); +} + +unsigned int +drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) +{ + unsigned int tmp = 0; + if (drw && drw->font && text && n) + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n, True); + return MIN(n, tmp); +} +#else unsigned int drw_fontset_getwidth(Drw *drw, const char *text) { @@ -399,6 +621,37 @@ drw_fontset_getwidth(Drw *drw, const char *text) return drw_text(drw, 0, 0, 0, 0, 0, text, 0); } +unsigned int +drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) +{ + unsigned int tmp = 0; + if (drw && drw->fonts && text && n) + tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); + return MIN(n, tmp); +} +#endif // PANGO_PATCH + +#if PANGO_PATCH +void +drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup) +{ + if (!font || !text) + return; + + PangoRectangle r; + if (markup) + pango_layout_set_markup(font->layout, text, len); + else + pango_layout_set_text(font->layout, text, len); + pango_layout_get_extents(font->layout, 0, &r); + if (markup) /* clear markup attributes */ + pango_layout_set_attributes(font->layout, NULL); + if (w) + *w = r.width / PANGO_SCALE; + if (h) + *h = font->h; +} +#else void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) { @@ -413,6 +666,7 @@ drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, if (h) *h = font->h; } +#endif // PANGO_PATCH Cur * drw_cur_create(Drw *drw, int shape) @@ -436,3 +690,7 @@ drw_cur_free(Drw *drw, Cur *cursor) XFreeCursor(drw->dpy, cursor->cursor); free(cursor); } + +#if SCROLL_PATCH +#include "patch/scroll.c" +#endif diff --git a/dmenu/drw.h b/dmenu-flexipatch/drw.h similarity index 57% rename from dmenu/drw.h rename to dmenu-flexipatch/drw.h index 4f66f0d..af4af4d 100644 --- a/dmenu/drw.h +++ b/dmenu-flexipatch/drw.h @@ -1,5 +1,10 @@ /* See LICENSE file for copyright and license details. */ +#if PANGO_PATCH +#include +#include +#endif // PANGO_PATCH + typedef struct { Cursor cursor; } Cur; @@ -7,9 +12,13 @@ typedef struct { typedef struct Fnt { Display *dpy; unsigned int h; + #if PANGO_PATCH + PangoLayout *layout; + #else XftFont *xfont; FcPattern *pattern; struct Fnt *next; + #endif // PANGO_PATCH } Fnt; enum { ColFg, ColBg }; /* Clr scheme index */ @@ -20,41 +29,75 @@ typedef struct { Display *dpy; int screen; Window root; + #if ALPHA_PATCH Visual *visual; unsigned int depth; Colormap cmap; + #endif // ALPHA_PATCH Drawable drawable; GC gc; Clr *scheme; + #if PANGO_PATCH + Fnt *font; + #else Fnt *fonts; + #endif // PANGO_PATCH } Drw; /* Drawable abstraction */ +#if ALPHA_PATCH Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); +#else +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); +#endif // ALPHA_PATCH void drw_resize(Drw *drw, unsigned int w, unsigned int h); void drw_free(Drw *drw); /* Fnt abstraction */ +#if PANGO_PATCH +Fnt *drw_font_create(Drw* drw, const char font[]); +void drw_font_free(Fnt* set); +unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); +unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); +void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup); +#else Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); void drw_fontset_free(Fnt* set); unsigned int drw_fontset_getwidth(Drw *drw, const char *text); +unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); +#endif // PANGO_PATCH /* Colorscheme abstraction */ +#if ALPHA_PATCH void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); +#else +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); +#endif // ALPHA_PATCH /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape); void drw_cur_free(Drw *drw, Cur *cursor); /* Drawing context manipulation */ +#if !PANGO_PATCH void drw_setfontset(Drw *drw, Fnt *set); +#endif // PANGO_PATCH void drw_setscheme(Drw *drw, Clr *scm); /* Drawing functions */ void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); +#if PANGO_PATCH +int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup); +#else int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); +#endif // PANGO_PATCH /* Map functions */ void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); + +#if SCROLL_PATCH +#include "patch/scroll.h" +#endif \ No newline at end of file diff --git a/dmenu-flexipatch/patch/center.c b/dmenu-flexipatch/patch/center.c new file mode 100644 index 0000000..9682bfb --- /dev/null +++ b/dmenu-flexipatch/patch/center.c @@ -0,0 +1,8 @@ +static int +max_textw(void) +{ + int len = 0; + for (struct item *item = items; item && item->text; item++) + len = MAX(TEXTW(item->text), len); + return len; +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/dynamicoptions.c b/dmenu-flexipatch/patch/dynamicoptions.c new file mode 100644 index 0000000..0102cfb --- /dev/null +++ b/dmenu-flexipatch/patch/dynamicoptions.c @@ -0,0 +1,91 @@ +static void +refreshoptions() +{ + int dynlen = strlen(dynamic); + char* cmd= malloc(dynlen + strlen(text) + 2); + if (cmd == NULL) + die("malloc:"); + sprintf(cmd, "%s %s", dynamic, text); + FILE *stream = popen(cmd, "r"); + if (!stream) + die("popen(%s):", cmd); + readstream(stream); + int pc = pclose(stream); + if (pc == -1) + die("pclose:"); + free(cmd); + curr = sel = items; +} + +static void +readstream(FILE* stream) +{ + char buf[sizeof text], *p; + size_t i, imax = 0, size = 0; + unsigned int tmpmax = 0; + + /* read each line from stdin and add it to the item list */ + for (i = 0; fgets(buf, sizeof buf, stream); i++) { + if (i + 1 >= size / sizeof *items) + if (!(items = realloc(items, (size += BUFSIZ)))) + die("cannot realloc %u bytes:", size); + if ((p = strchr(buf, '\n'))) + *p = '\0'; + if (!(items[i].text = strdup(buf))) + die("cannot strdup %u bytes:", strlen(buf) + 1); + #if SEPARATOR_PATCH + if (separator && (p = separator_greedy ? + strrchr(items[i].text, separator) : strchr(items[i].text, separator))) { + *p = '\0'; + items[i].text_output = ++p; + } else { + items[i].text_output = items[i].text; + } + if (separator_reverse) { + p = items[i].text; + items[i].text = items[i].text_output; + items[i].text_output = p; + } + #elif TSV_PATCH + if ((p = strchr(buf, '\t'))) + *p = '\0'; + if (!(items[i].stext = strdup(buf))) + die("cannot strdup %u bytes:", strlen(buf) + 1); + #endif // TSV_PATCH + #if MULTI_SELECTION_PATCH + items[i].id = i; + #else + items[i].out = 0; + #endif // MULTI_SELECTION_PATCH + #if HIGHPRIORITY_PATCH + items[i].hp = arrayhas(hpitems, hplength, items[i].text); + #endif // HIGHPRIORITY_PATCH + #if PANGO_PATCH + drw_font_getexts(drw->font, buf, strlen(buf), &tmpmax, NULL, True); + #else + drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL); + #endif // PANGO_PATCH + if (tmpmax > inputw) { + inputw = tmpmax; + imax = i; + } + } + + /* If the command did not give any output at all, then do not clear the existing items */ + if (!i) + return; + + if (items) + items[i].text = NULL; + #if PANGO_PATCH + inputw = items ? TEXTWM(items[imax].text) : 0; + #else + inputw = items ? TEXTW(items[imax].text) : 0; + #endif // PANGO_PATCH + if (!dynamic || !*dynamic) + lines = MIN(lines, i); + else { + text[0] = '\0'; + cursor = 0; + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/dynamicoptions.h b/dmenu-flexipatch/patch/dynamicoptions.h new file mode 100644 index 0000000..eba9fb0 --- /dev/null +++ b/dmenu-flexipatch/patch/dynamicoptions.h @@ -0,0 +1,2 @@ +static void refreshoptions(); +static void readstream(FILE* stream); \ No newline at end of file diff --git a/dmenu-flexipatch/patch/fuzzyhighlight.c b/dmenu-flexipatch/patch/fuzzyhighlight.c new file mode 100644 index 0000000..d31a150 --- /dev/null +++ b/dmenu-flexipatch/patch/fuzzyhighlight.c @@ -0,0 +1,66 @@ +static void +#if EMOJI_HIGHLIGHT_PATCH +drawhighlights(struct item *item, char *output, int x, int y, int maxw) +#else +drawhighlights(struct item *item, int x, int y, int maxw) +#endif // EMOJI_HIGHLIGHT_PATCH +{ + int i, indent; + char *highlight; + char c; + + #if EMOJI_HIGHLIGHT_PATCH + char *itemtext = output; + #elif TSV_PATCH && !SEPARATOR_PATCH + char *itemtext = item->stext; + #else + char *itemtext = item->text; + #endif // TSV_PATCH + + if (!(strlen(itemtext) && strlen(text))) + return; + + /* Do not highlight items scheduled for output */ + #if MULTI_SELECTION_PATCH + if (issel(item->id)) + return; + #else + if (item->out) + return; + #endif // MULTI_SELECTION_PATCH + + drw_setscheme(drw, scheme[item == sel + ? SchemeSelHighlight + : SchemeNormHighlight]); + for (i = 0, highlight = itemtext; *highlight && text[i];) { + #if FUZZYMATCH_PATCH + if (!fstrncmp(&(*highlight), &text[i], 1)) + #else + if (*highlight == text[i]) + #endif // FUZZYMATCH_PATCH + { + /* get indentation */ + c = *highlight; + *highlight = '\0'; + indent = TEXTW(itemtext) - lrpad; + *highlight = c; + + /* highlight character */ + c = highlight[1]; + highlight[1] = '\0'; + drw_text( + drw, + x + indent + (lrpad / 2), + y, + MIN(maxw - indent - lrpad, TEXTW(highlight) - lrpad), + bh, 0, highlight, 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + highlight[1] = c; + i++; + } + highlight++; + } +} diff --git a/dmenu-flexipatch/patch/fuzzymatch.c b/dmenu-flexipatch/patch/fuzzymatch.c new file mode 100644 index 0000000..9407afe --- /dev/null +++ b/dmenu-flexipatch/patch/fuzzymatch.c @@ -0,0 +1,115 @@ +#include + +int +compare_distance(const void *a, const void *b) +{ + struct item *da = *(struct item **) a; + struct item *db = *(struct item **) b; + + if (!db) + return 1; + if (!da) + return -1; + + return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1; +} + +void +fuzzymatch(void) +{ + /* bang - we have so much memory */ + struct item *it; + struct item **fuzzymatches = NULL; + char c; + int number_of_matches = 0, i, pidx, sidx, eidx; + int text_len = strlen(text), itext_len; + #if HIGHPRIORITY_PATCH + struct item *lhpprefix, *hpprefixend; + lhpprefix = hpprefixend = NULL; + #endif // HIGHPRIORITY_PATCH + matches = matchend = NULL; + + /* walk through all items */ + for (it = items; it && it->text; it++) { + if (text_len) { + itext_len = strlen(it->text); + pidx = 0; /* pointer */ + sidx = eidx = -1; /* start of match, end of match */ + /* walk through item text */ + for (i = 0; i < itext_len && (c = it->text[i]); i++) { + /* fuzzy match pattern */ + if (!fstrncmp(&text[pidx], &c, 1)) { + if (sidx == -1) + sidx = i; + pidx++; + if (pidx == text_len) { + eidx = i; + break; + } + } + } + /* build list of matches */ + if (eidx != -1) { + /* compute distance */ + /* add penalty if match starts late (log(sidx+2)) + * add penalty for long a match without many matching characters */ + it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len); + /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */ + appenditem(it, &matches, &matchend); + number_of_matches++; + } + } else { + appenditem(it, &matches, &matchend); + } + } + + if (number_of_matches) { + /* initialize array with matches */ + if (!(fuzzymatches = realloc(fuzzymatches, number_of_matches * sizeof(struct item*)))) + die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item*)); + for (i = 0, it = matches; it && i < number_of_matches; i++, it = it->right) { + fuzzymatches[i] = it; + } + + #if NO_SORT_PATCH + if (sortmatches) + #endif // NO_SORT_PATCH + /* sort matches according to distance */ + qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance); + /* rebuild list of matches */ + matches = matchend = NULL; + for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it && \ + it->text; i++, it = fuzzymatches[i]) { + #if HIGHPRIORITY_PATCH + #if NO_SORT_PATCH + if (sortmatches && it->hp) + #else + if (it->hp) + #endif // NO_SORT_PATCH + appenditem(it, &lhpprefix, &hpprefixend); + else + appenditem(it, &matches, &matchend); + #else + appenditem(it, &matches, &matchend); + #endif // HIGHPRIORITY_PATCH + } + free(fuzzymatches); + } + #if HIGHPRIORITY_PATCH + if (lhpprefix) { + hpprefixend->right = matches; + matches = lhpprefix; + } + #endif // HIGHPRIORITY_PATCH + curr = sel = matches; + + #if INSTANT_PATCH + if (instant && matches && matches==matchend) { + puts(matches->text); + cleanup(); + exit(0); + } + #endif // INSTANT_PATCH + + calcoffsets(); +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/fzfexpect.c b/dmenu-flexipatch/patch/fzfexpect.c new file mode 100644 index 0000000..1563362 --- /dev/null +++ b/dmenu-flexipatch/patch/fzfexpect.c @@ -0,0 +1,39 @@ +static char *expected; +#if MULTI_SELECTION_PATCH +void +expect(char *expect, XKeyEvent *ev) +{ + if (sel && expected && strstr(expected, expect)) { + if (expected && sel && !(ev->state & ShiftMask)) + puts(expect); + for (int i = 0; i < selidsize; i++) + if (selid[i] != -1 && (!sel || sel->id != selid[i])) + puts(items[selid[i]].text); + if (sel && !(ev->state & ShiftMask)) { + puts(sel->text); + } else + puts(text); + cleanup(); + exit(1); + } else if (!sel && expected && strstr(expected, expect)) { + puts(expect); + cleanup(); + exit(1); + } +} +#else +void +expect(char *expect, XKeyEvent *ignored) +{ + if (sel && expected && strstr(expected, expect)) { + puts(expect); + puts(sel->text); + cleanup(); + exit(1); + } else if (!sel && expected && strstr(expected, expect)){ + puts(expect); + cleanup(); + exit(1); + } +} +#endif // MULTI_SELECTION_PATCH \ No newline at end of file diff --git a/dmenu-flexipatch/patch/fzfexpect.h b/dmenu-flexipatch/patch/fzfexpect.h new file mode 100644 index 0000000..95c1dad --- /dev/null +++ b/dmenu-flexipatch/patch/fzfexpect.h @@ -0,0 +1 @@ +static void expect(char *expect, XKeyEvent *ev); diff --git a/dmenu-flexipatch/patch/highlight.c b/dmenu-flexipatch/patch/highlight.c new file mode 100644 index 0000000..d2d55d0 --- /dev/null +++ b/dmenu-flexipatch/patch/highlight.c @@ -0,0 +1,60 @@ +static void +#if EMOJI_HIGHLIGHT_PATCH +drawhighlights(struct item *item, char *output, int x, int y, int maxw) +#else +drawhighlights(struct item *item, int x, int y, int maxw) +#endif // EMOJI_HIGHLIGHT_PATCH +{ + char restorechar, tokens[sizeof text], *highlight, *token; + int indentx, highlightlen; + #if EMOJI_HIGHLIGHT_PATCH + char *itemtext = output; + #elif TSV_PATCH && !SEPARATOR_PATCH + char *itemtext = item->stext; + #else + char *itemtext = item->text; + #endif // EMOJI_HIGHLIGHT_PATCH | TSV_PATCH + + /* Do not highlight items scheduled for output */ + #if MULTI_SELECTION_PATCH + if (issel(item->id)) + return; + #else + if (item->out) + return; + #endif // MULTI_SELECTION_PATCH + + drw_setscheme(drw, scheme[item == sel ? SchemeSelHighlight : SchemeNormHighlight]); + strcpy(tokens, text); + for (token = strtok(tokens, " "); token; token = strtok(NULL, " ")) { + highlight = fstrstr(itemtext, token); + while (highlight) { + // Move item str end, calc width for highlight indent, & restore + highlightlen = highlight - itemtext; + restorechar = *highlight; + itemtext[highlightlen] = '\0'; + indentx = TEXTW(itemtext); + itemtext[highlightlen] = restorechar; + + // Move highlight str end, draw highlight, & restore + restorechar = highlight[strlen(token)]; + highlight[strlen(token)] = '\0'; + if (indentx - (lrpad / 2) - 1 < maxw) + drw_text( + drw, + x + indentx - (lrpad / 2) - 1, + y, + MIN(maxw - indentx, TEXTW(highlight) - lrpad), + bh, 0, highlight, 0 + #if PANGO_PATCH + , True + #endif // PANGO_PATCH + ); + highlight[strlen(token)] = restorechar; + + if (strlen(highlight) - strlen(token) < strlen(token)) + break; + highlight = fstrstr(highlight + strlen(token), token); + } + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/highpriority.c b/dmenu-flexipatch/patch/highpriority.c new file mode 100644 index 0000000..2b3577a --- /dev/null +++ b/dmenu-flexipatch/patch/highpriority.c @@ -0,0 +1,35 @@ +static char **hpitems = NULL; +static int hplength = 0; + +static char ** +tokenize(char *source, const char *delim, int *llen) +{ + int listlength = 0, list_size = 0; + char **list = NULL, *token; + + token = strtok(source, delim); + while (token) { + if (listlength + 1 >= list_size) { + if (!(list = realloc(list, (list_size += 8) * sizeof(*list)))) + die("Unable to realloc %zu bytes\n", list_size * sizeof(*list)); + } + if (!(list[listlength] = strdup(token))) + die("Unable to strdup %zu bytes\n", strlen(token) + 1); + token = strtok(NULL, delim); + listlength++; + } + + *llen = listlength; + return list; +} + +static int +arrayhas(char **list, int length, char *item) { + for (int i = 0; i < length; i++) { + int len1 = strlen(list[i]); + int len2 = strlen(item); + if (fstrncmp(list[i], item, len1 > len2 ? len2 : len1) == 0) + return 1; + } + return 0; +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/highpriority.h b/dmenu-flexipatch/patch/highpriority.h new file mode 100644 index 0000000..8fa65bf --- /dev/null +++ b/dmenu-flexipatch/patch/highpriority.h @@ -0,0 +1,2 @@ +static int arrayhas(char **list, int length, char *item); + diff --git a/dmenu-flexipatch/patch/include.c b/dmenu-flexipatch/patch/include.c new file mode 100644 index 0000000..4240212 --- /dev/null +++ b/dmenu-flexipatch/patch/include.c @@ -0,0 +1,38 @@ +#if CENTER_PATCH +#include "center.c" +#endif +#if FUZZYHIGHLIGHT_PATCH +#include "fuzzyhighlight.c" +#elif HIGHLIGHT_PATCH +#include "highlight.c" +#endif +#if FUZZYMATCH_PATCH +#include "fuzzymatch.c" +#endif +#if FZFEXPECT_PATCH +#include "fzfexpect.c" +#endif +#if HIGHPRIORITY_PATCH +#include "highpriority.c" +#endif +#if DYNAMIC_OPTIONS_PATCH +#include "dynamicoptions.c" +#endif +#if MULTI_SELECTION_PATCH +#include "multiselect.c" +#endif +#if MOUSE_SUPPORT_PATCH +#include "mousesupport.c" +#endif +#if NAVHISTORY_PATCH +#include "navhistory.c" +#endif +#if NON_BLOCKING_STDIN_PATCH +#include "nonblockingstdin.c" +#endif +#if NUMBERS_PATCH +#include "numbers.c" +#endif +#if XRESOURCES_PATCH +#include "xresources.c" +#endif \ No newline at end of file diff --git a/dmenu-flexipatch/patch/include.h b/dmenu-flexipatch/patch/include.h new file mode 100644 index 0000000..c3cb75b --- /dev/null +++ b/dmenu-flexipatch/patch/include.h @@ -0,0 +1,18 @@ +#if DYNAMIC_OPTIONS_PATCH +#include "dynamicoptions.h" +#endif +#if FZFEXPECT_PATCH +#include "fzfexpect.h" +#endif +#if MULTI_SELECTION_PATCH +#include "multiselect.h" +#endif +#if HIGHPRIORITY_PATCH +#include "highpriority.h" +#endif +#if NON_BLOCKING_STDIN_PATCH +#include "nonblockingstdin.h" +#endif +#if NUMBERS_PATCH +#include "numbers.h" +#endif diff --git a/dmenu-flexipatch/patch/mousesupport.c b/dmenu-flexipatch/patch/mousesupport.c new file mode 100644 index 0000000..d040e86 --- /dev/null +++ b/dmenu-flexipatch/patch/mousesupport.c @@ -0,0 +1,159 @@ +static void +buttonpress(XEvent *e) +{ + struct item *item; + XButtonPressedEvent *ev = &e->xbutton; + int x = 0, y = 0, h = bh, w; + + if (ev->window != win) + return; + + /* right-click: exit */ + if (ev->button == Button3) + exit(1); + + if (prompt && *prompt) + x += promptw; + + /* input field */ + w = (lines > 0 || !matches) ? mw - x : inputw; + + /* left-click on input: clear input, + * NOTE: if there is no left-arrow the space for < is reserved so + * add that to the input width */ + #if SYMBOLS_PATCH + if (ev->button == Button1 && + ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + + ((!prev || !curr->left) ? TEXTW(symbol_1) : 0)) || + (lines > 0 && ev->y >= y && ev->y <= y + h))) { + insert(NULL, -cursor); + drawmenu(); + return; + } + #else + if (ev->button == Button1 && + ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + + ((!prev || !curr->left) ? TEXTW("<") : 0)) || + (lines > 0 && ev->y >= y && ev->y <= y + h))) { + insert(NULL, -cursor); + drawmenu(); + return; + } + #endif // SYMBOLS_PATCH + /* middle-mouse click: paste selection */ + if (ev->button == Button2) { + XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, + utf8, utf8, win, CurrentTime); + drawmenu(); + return; + } + /* scroll up */ + if (ev->button == Button4 && prev) { + sel = curr = prev; + calcoffsets(); + drawmenu(); + return; + } + /* scroll down */ + if (ev->button == Button5 && next) { + sel = curr = next; + calcoffsets(); + drawmenu(); + return; + } + if (ev->button != Button1) + return; + if (ev->state & ~ControlMask) + return; + if (lines > 0) { + /* vertical list: (ctrl)left-click on item */ + w = mw - x; + for (item = curr; item != next; item = item->right) { + y += h; + if (ev->y >= y && ev->y <= (y + h)) { + #if !MULTI_SELECTION_PATCH + puts(item->text); + #endif // MULTI_SELECTION_PATCH + if (!(ev->state & ControlMask)) { + #if MULTI_SELECTION_PATCH + sel = item; + selsel(); + printsel(ev->state); + #endif // MULTI_SELECTION_PATCH + exit(0); + } + sel = item; + if (sel) { + #if MULTI_SELECTION_PATCH + selsel(); + #else + sel->out = 1; + #endif // MULTI_SELECTION_PATCH + drawmenu(); + } + return; + } + } + } else if (matches) { + /* left-click on left arrow */ + x += inputw; + #if SYMBOLS_PATCH + w = TEXTW(symbol_1); + #else + w = TEXTW("<"); + #endif // SYMBOLS_PATCH + if (prev && curr->left) { + if (ev->x >= x && ev->x <= x + w) { + sel = curr = prev; + calcoffsets(); + drawmenu(); + return; + } + } + /* horizontal list: (ctrl)left-click on item */ + for (item = curr; item != next; item = item->right) { + x += w; + #if SYMBOLS_PATCH + w = MIN(TEXTW(item->text), mw - x - TEXTW(symbol_2)); + #else + w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); + #endif // SYMBOLS_PATCH + if (ev->x >= x && ev->x <= x + w) { + #if !MULTI_SELECTION_PATCH + puts(item->text); + #endif // MULTI_SELECTION_PATCH + if (!(ev->state & ControlMask)) { + #if MULTI_SELECTION_PATCH + sel = item; + selsel(); + printsel(ev->state); + #endif // MULTI_SELECTION_PATCH + exit(0); + } + sel = item; + if (sel) { + #if MULTI_SELECTION_PATCH + selsel(); + #else + sel->out = 1; + #endif // MULTI_SELECTION_PATCH + drawmenu(); + } + return; + } + } + /* left-click on right arrow */ + #if SYMBOLS_PATCH + w = TEXTW(symbol_2); + #else + w = TEXTW(">"); + #endif // SYMBOLS_PATCH + x = mw - w; + if (next && ev->x >= x && ev->x <= x + w) { + sel = curr = next; + calcoffsets(); + drawmenu(); + return; + } + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/multiselect.c b/dmenu-flexipatch/patch/multiselect.c new file mode 100644 index 0000000..ad78db3 --- /dev/null +++ b/dmenu-flexipatch/patch/multiselect.c @@ -0,0 +1,53 @@ +static int +issel(size_t id) +{ + for (int i = 0;i < selidsize;i++) + if (selid[i] == id) + return 1; + return 0; +} + +static void +printsel(unsigned int state) +{ + for (int i = 0;i < selidsize;i++) + if (selid[i] != -1 && (!sel || sel->id != selid[i])) { + #if PRINTINDEX_PATCH + if (print_index) + printf("%d\n", selid[i]); + else + #endif // PRINTINDEX_PATCH + puts(items[selid[i]].text); + } + if (sel && !(state & ShiftMask)) { + #if PRINTINDEX_PATCH + if (print_index) + printf("%d\n", sel->index); + else + #endif // PRINTINDEX_PATCH + puts(sel->text); + } else + puts(text); + +} + +static void +selsel() +{ + if (!sel) + return; + if (issel(sel->id)) { + for (int i = 0; i < selidsize; i++) + if (selid[i] == sel->id) + selid[i] = -1; + } else { + for (int i = 0; i < selidsize; i++) + if (selid[i] == -1) { + selid[i] = sel->id; + return; + } + selidsize++; + selid = realloc(selid, (selidsize + 1) * sizeof(int)); + selid[selidsize - 1] = sel->id; + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/multiselect.h b/dmenu-flexipatch/patch/multiselect.h new file mode 100644 index 0000000..03aa328 --- /dev/null +++ b/dmenu-flexipatch/patch/multiselect.h @@ -0,0 +1 @@ +static int issel(size_t id); diff --git a/dmenu-flexipatch/patch/navhistory.c b/dmenu-flexipatch/patch/navhistory.c new file mode 100644 index 0000000..7d10ee4 --- /dev/null +++ b/dmenu-flexipatch/patch/navhistory.c @@ -0,0 +1,126 @@ +static char *histfile; +static char **history; +static size_t histsz, histpos; + +static void +loadhistory(void) +{ + FILE *fp = NULL; + static size_t cap = 0; + size_t llen; + char *line; + + if (!histfile) { + return; + } + + fp = fopen(histfile, "r"); + if (!fp) { + return; + } + + for (;;) { + line = NULL; + llen = 0; + if (-1 == getline(&line, &llen, fp)) { + if (ferror(fp)) { + die("failed to read history"); + } + free(line); + break; + } + + if (cap == histsz) { + cap += 64 * sizeof(char*); + history = realloc(history, cap); + if (!history) { + die("failed to realloc memory"); + } + } + strtok(line, "\n"); + history[histsz] = line; + histsz++; + } + histpos = histsz; + + if (fclose(fp)) { + die("failed to close file %s", histfile); + } +} + +static void +navhistory(int dir) +{ + static char def[BUFSIZ]; + char *p = NULL; + size_t len = 0; + + if (!history || histpos + 1 == 0) + return; + + if (histsz == histpos) { + strncpy(def, text, sizeof(def)); + } + + switch(dir) { + case 1: + if (histpos < histsz - 1) { + p = history[++histpos]; + } else if (histpos == histsz - 1) { + p = def; + histpos++; + } + break; + case -1: + if (histpos > 0) { + p = history[--histpos]; + } + break; + } + if (p == NULL) { + return; + } + + len = MIN(strlen(p), BUFSIZ - 1); + strncpy(text, p, len); + text[len] = '\0'; + cursor = len; + match(); +} + +static void +savehistory(char *input) +{ + unsigned int i; + FILE *fp; + + if (!histfile || + 0 == maxhist || + 0 == strlen(input)) { + goto out; + } + + fp = fopen(histfile, "w"); + if (!fp) { + die("failed to open %s", histfile); + } + for (i = histsz < maxhist ? 0 : histsz - maxhist; i < histsz; i++) { + if (0 >= fprintf(fp, "%s\n", history[i])) { + die("failed to write to %s", histfile); + } + } + if (histsz == 0 || !histnodup || (histsz > 0 && strcmp(input, history[histsz-1]) != 0)) { /* TODO */ + if (0 >= fputs(input, fp)) { + die("failed to write to %s", histfile); + } + } + if (fclose(fp)) { + die("failed to close file %s", histfile); + } + +out: + for (i = 0; i < histsz; i++) { + free(history[i]); + } + free(history); +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/nonblockingstdin.c b/dmenu-flexipatch/patch/nonblockingstdin.c new file mode 100644 index 0000000..eb7013f --- /dev/null +++ b/dmenu-flexipatch/patch/nonblockingstdin.c @@ -0,0 +1,68 @@ +#include +#include +#include + +static void +readstdin(void) +{ + static size_t max = 0; + static struct item **end = &items; + + char buf[sizeof text], *p, *maxstr; + struct item *item; + + #if PASSWORD_PATCH + if (passwd) { + inputw = lines = 0; + return; + } + #endif // PASSWORD_PATCH + + /* read each line from stdin and add it to the item list */ + while (fgets(buf, sizeof buf, stdin)) { + if (!(item = malloc(sizeof *item))) + die("cannot malloc %u bytes:", sizeof *item); + if ((p = strchr(buf, '\n'))) + *p = '\0'; + if (!(item->text = strdup(buf))) + die("cannot strdup %u bytes:", strlen(buf)+1); + if (strlen(item->text) > max) { + max = strlen(maxstr = item->text); + #if PANGO_PATCH + inputw = maxstr ? TEXTWM(maxstr) : 0; + #else + inputw = maxstr ? TEXTW(maxstr) : 0; + #endif // PANGO_PATCH + } + *end = item; + end = &item->next; + item->next = NULL; + item->out = 0; + } + match(); + drawmenu(); +} + +static void +run(void) +{ + fd_set fds; + int flags, xfd = XConnectionNumber(dpy); + + if ((flags = fcntl(0, F_GETFL)) == -1) + die("cannot get stdin control flags:"); + if (fcntl(0, F_SETFL, flags | O_NONBLOCK) == -1) + die("cannot set stdin control flags:"); + for (;;) { + FD_ZERO(&fds); + FD_SET(xfd, &fds); + if (!feof(stdin)) + FD_SET(0, &fds); + if (select(xfd + 1, &fds, NULL, NULL, NULL) == -1) + die("cannot multiplex input:"); + if (FD_ISSET(xfd, &fds)) + readevent(); + if (FD_ISSET(0, &fds)) + readstdin(); + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/nonblockingstdin.h b/dmenu-flexipatch/patch/nonblockingstdin.h new file mode 100644 index 0000000..a0c4dfe --- /dev/null +++ b/dmenu-flexipatch/patch/nonblockingstdin.h @@ -0,0 +1 @@ +static void readevent(); \ No newline at end of file diff --git a/dmenu-flexipatch/patch/numbers.c b/dmenu-flexipatch/patch/numbers.c new file mode 100644 index 0000000..9f9557a --- /dev/null +++ b/dmenu-flexipatch/patch/numbers.c @@ -0,0 +1,16 @@ +static char numbers[NUMBERSBUFSIZE] = ""; + +static void +recalculatenumbers() +{ + unsigned int numer = 0, denom = 0; + struct item *item; + if (matchend) { + numer++; + for (item = matchend; item && item->left; item = item->left) + numer++; + } + for (item = items; item && item->text; item++) + denom++; + snprintf(numbers, NUMBERSBUFSIZE, "%d/%d", numer, denom); +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/numbers.h b/dmenu-flexipatch/patch/numbers.h new file mode 100644 index 0000000..34d3dbc --- /dev/null +++ b/dmenu-flexipatch/patch/numbers.h @@ -0,0 +1,4 @@ +#define NUMBERSMAXDIGITS 100 +#define NUMBERSBUFSIZE (NUMBERSMAXDIGITS * 2) + 1 + +static void recalculatenumbers(); \ No newline at end of file diff --git a/dmenu-flexipatch/patch/scroll.c b/dmenu-flexipatch/patch/scroll.c new file mode 100644 index 0000000..9021edf --- /dev/null +++ b/dmenu-flexipatch/patch/scroll.c @@ -0,0 +1,168 @@ +int +utf8nextchar(const char *str, int len, int i, int inc) +{ + int n; + + for (n = i + inc; n + inc >= 0 && n + inc <= len + && (str[n] & 0xc0) == 0x80; n += inc) + ; + return n; +} + +int +drw_text_align(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int textlen, int align) +{ + int ty; + unsigned int ew; + XftDraw *d = NULL; + Fnt *usedfont, *curfont, *nextfont; + size_t len; + int utf8strlen, utf8charlen, render = x || y || w || h; + long utf8codepoint = 0; + const char *utf8str; + FcCharSet *fccharset; + FcPattern *fcpattern; + FcPattern *match; + XftResult result; + int charexists = 0; + int i, n; + + if (!drw || (render && !drw->scheme) || !text || !drw->fonts || textlen <= 0 + || (align != AlignL && align != AlignR)) + return 0; + + if (!render) { + w = ~w; + } else { + XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + d = XftDrawCreate(drw->dpy, drw->drawable, + DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen)); + } + + usedfont = drw->fonts; + i = align == AlignL ? 0 : textlen; + x = align == AlignL ? x : x + w; + while (1) { + utf8strlen = 0; + nextfont = NULL; + /* if (align == AlignL) */ + utf8str = text + i; + + while ((align == AlignL && i < textlen) || (align == AlignR && i > 0)) { + if (align == AlignL) { + utf8charlen = utf8decode(text + i, &utf8codepoint, MIN(textlen - i, UTF_SIZ)); + if (!utf8charlen) { + textlen = i; + break; + } + } else { + n = utf8nextchar(text, textlen, i, -1); + utf8charlen = utf8decode(text + n, &utf8codepoint, MIN(textlen - n, UTF_SIZ)); + if (!utf8charlen) { + textlen -= i; + text += i; + i = 0; + break; + } + } + for (curfont = drw->fonts; curfont; curfont = curfont->next) { + charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); + if (charexists) { + if (curfont == usedfont) { + utf8strlen += utf8charlen; + i += align == AlignL ? utf8charlen : -utf8charlen; + } else { + nextfont = curfont; + } + break; + } + } + + if (!charexists || nextfont) + break; + else + charexists = 0; + } + + if (align == AlignR) + utf8str = text + i; + + if (utf8strlen) { + drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); + /* shorten text if necessary */ + if (align == AlignL) { + for (len = utf8strlen; len && ew > w; ) { + len = utf8nextchar(utf8str, len, len, -1); + drw_font_getexts(usedfont, utf8str, len, &ew, NULL); + } + } else { + for (len = utf8strlen; len && ew > w; ) { + n = utf8nextchar(utf8str, len, 0, +1); + utf8str += n; + len -= n; + drw_font_getexts(usedfont, utf8str, len, &ew, NULL); + } + } + + if (len) { + if (render) { + ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; + XftDrawStringUtf8(d, &drw->scheme[ColFg], + usedfont->xfont, align == AlignL ? x : x - ew, ty, (XftChar8 *)utf8str, len); + } + x += align == AlignL ? ew : -ew; + w -= ew; + } + if (len < utf8strlen) + break; + } + + if ((align == AlignR && i <= 0) || (align == AlignL && i >= textlen)) { + break; + } else if (nextfont) { + charexists = 0; + usedfont = nextfont; + } else { + /* Regardless of whether or not a fallback font is found, the + * character must be drawn. */ + charexists = 1; + + fccharset = FcCharSetCreate(); + FcCharSetAddChar(fccharset, utf8codepoint); + + if (!drw->fonts->pattern) { + /* Refer to the comment in xfont_create for more information. */ + die("the first font in the cache must be loaded from a font string."); + } + + fcpattern = FcPatternDuplicate(drw->fonts->pattern); + FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); + FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); + + FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); + FcDefaultSubstitute(fcpattern); + match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); + + FcCharSetDestroy(fccharset); + FcPatternDestroy(fcpattern); + + if (match) { + usedfont = xfont_create(drw, NULL, match); + if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { + for (curfont = drw->fonts; curfont->next; curfont = curfont->next) + ; /* NOP */ + curfont->next = usedfont; + } else { + xfont_free(usedfont); + usedfont = drw->fonts; + } + } + } + } + if (d) + XftDrawDestroy(d); + + return x; +} \ No newline at end of file diff --git a/dmenu-flexipatch/patch/scroll.h b/dmenu-flexipatch/patch/scroll.h new file mode 100644 index 0000000..927df9a --- /dev/null +++ b/dmenu-flexipatch/patch/scroll.h @@ -0,0 +1,3 @@ +enum { AlignL, AlignR }; + +int drw_text_align(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int textlen, int align); \ No newline at end of file diff --git a/dmenu-flexipatch/patch/xresources.c b/dmenu-flexipatch/patch/xresources.c new file mode 100644 index 0000000..cdb1631 --- /dev/null +++ b/dmenu-flexipatch/patch/xresources.c @@ -0,0 +1,90 @@ +#include + +void +readxresources(void) +{ + XrmInitialize(); + + char* xrm; + if ((xrm = XResourceManagerString(drw->dpy))) { + char *type; + XrmDatabase xdb = XrmGetStringDatabase(xrm); + XrmValue xval; + + if (XrmGetResource(xdb, "dmenu.font", "*", &type, &xval)) + #if PANGO_PATCH + strcpy(font, xval.addr); + #else + fonts[0] = strdup(xval.addr); + #endif // PANGO_PATCH + #if !PANGO_PATCH + else + fonts[0] = strdup(fonts[0]); + #endif // PANGO_PATCH + if (XrmGetResource(xdb, "dmenu.background", "*", &type, &xval)) + colors[SchemeNorm][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.foreground", "*", &type, &xval)) + colors[SchemeNorm][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.selbackground", "*", &type, &xval)) + colors[SchemeSel][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.selforeground", "*", &type, &xval)) + colors[SchemeSel][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.outbackground", "*", &type, &xval)) + colors[SchemeOut][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.outforeground", "*", &type, &xval)) + colors[SchemeOut][ColFg] = strdup(xval.addr); + #if MORECOLOR_PATCH + if (XrmGetResource(xdb, "dmenu.midbackground", "*", &type, &xval)) + colors[SchemeMid][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.midforeground", "*", &type, &xval)) + colors[SchemeMid][ColFg] = strdup(xval.addr); + #endif // MORECOLOR_PATCH + #if BORDER_PATCH + if (XrmGetResource(xdb, "dmenu.bordercolor", "*", &type, &xval)) + colors[SchemeBorder][ColBg] = strdup(xval.addr); + #endif // BORDER_PATCH + #if HIGHLIGHT_PATCH || FUZZYHIGHLIGHT_PATCH + if (XrmGetResource(xdb, "dmenu.selhlbackground", "*", &type, &xval)) + colors[SchemeSelHighlight][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.selhlforeground", "*", &type, &xval)) + colors[SchemeSelHighlight][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.hlbackground", "*", &type, &xval)) + colors[SchemeNormHighlight][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.hlforeground", "*", &type, &xval)) + colors[SchemeNormHighlight][ColFg] = strdup(xval.addr); + #endif // HIGHLIGHT_PATCH | FUZZYHIGHLIGHT_PATCH + #if HIGHPRIORITY_PATCH + if (XrmGetResource(xdb, "dmenu.hpbackground", "*", &type, &xval)) + colors[SchemeHp][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.hpforeground", "*", &type, &xval)) + colors[SchemeHp][ColFg] = strdup(xval.addr); + #endif // HIGHPRIORITY_PATCH + #if EMOJI_HIGHLIGHT_PATCH + if (XrmGetResource(xdb, "dmenu.hoverbackground", "*", &type, &xval)) + colors[SchemeHover][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.hoverforeground", "*", &type, &xval)) + colors[SchemeHover][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.greenbackground", "*", &type, &xval)) + colors[SchemeGreen][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.greenforeground", "*", &type, &xval)) + colors[SchemeGreen][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.yellowbackground", "*", &type, &xval)) + colors[SchemeYellow][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.yellowforeground", "*", &type, &xval)) + colors[SchemeYellow][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.bluebackground", "*", &type, &xval)) + colors[SchemeBlue][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.blueforeground", "*", &type, &xval)) + colors[SchemeBlue][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.purplebackground", "*", &type, &xval)) + colors[SchemePurple][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.purpleforeground", "*", &type, &xval)) + colors[SchemePurple][ColFg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.redbackground", "*", &type, &xval)) + colors[SchemeRed][ColBg] = strdup(xval.addr); + if (XrmGetResource(xdb, "dmenu.redforeground", "*", &type, &xval)) + colors[SchemeRed][ColFg] = strdup(xval.addr); + #endif // EMOJI_HIGHLIGHT_PATCH + XrmDestroyDatabase(xdb); + } +} \ No newline at end of file diff --git a/dmenu-flexipatch/patches.def.h b/dmenu-flexipatch/patches.def.h new file mode 100644 index 0000000..3c1651e --- /dev/null +++ b/dmenu-flexipatch/patches.def.h @@ -0,0 +1,355 @@ +/* Patches */ + +/* The alpha patch adds transparency for the dmenu window. + * You need to uncomment the corresponding line in config.mk to use the -lXrender library + * when including this patch. + * https://github.com/bakkeby/patches/blob/master/dmenu/dmenu-alpha-5.0_20210725_523aa08.diff + */ +#define ALPHA_PATCH 1 + +/* This adds padding for dmenu in similar fashion to the similarly named patch for dwm. The idea + * is to have dmenu appear on top of the bar when using said patch in dwm. + * https://github.com/bakkeby/patches/wiki/barpadding + */ +#define BARPADDING_PATCH 0 + +/* This patch adds a border around the dmenu window. It is intended to be used with the center + * or xyw patches, to make the menu stand out from similarly coloured windows. + * http://tools.suckless.org/dmenu/patches/border/ + */ +#define BORDER_PATCH 0 + +/* By default the caret in dmenu has a width of 2 pixels. This patch makes that configurable + * as well as overridable via a command line option. + * https://github.com/DarkSamus669/dmenu-patches/blob/main/dmenu-caretwidth-5.2.diff + */ +#define CARET_WIDTH_PATCH 1 + +/* This patch makes dmenu case-insensitive by default, replacing the + * case-insensitive -i option with a case sensitive -s option. + * http://tools.suckless.org/dmenu/patches/case-insensitive/ + */ +#define CASEINSENSITIVE_PATCH 1 + +/* This patch centers dmenu in the middle of the screen. + * https://tools.suckless.org/dmenu/patches/center/ + */ +#define CENTER_PATCH 0 + +/* Minor patch to enable the use of Ctrl+v (XA_PRIMARY) and Ctrl+Shift+v (CLIPBOARD) to paste. + * By default dmenu only supports Ctrl+y and Ctrl+Shift+y to paste. + */ +#define CTRL_V_TO_PASTE_PATCH 1 + +/* This patch adds a flag (-dy) which makes dmenu run the command given to it whenever input + * is changed with the current input as the last argument and update the option list according + * to the output of that command. + * https://tools.suckless.org/dmenu/patches/dynamicoptions/ + */ +#define DYNAMIC_OPTIONS_PATCH 0 + +/* This patch will allow for emojis on the left side with a colored background when selected. + * To test this try running: + * $ echo -e ":b here\n:p there\n:r and here" | ./dmenu -p "Search..." -W 400 -l 20 -i -h -1 + * NB: the original patch came embedded with the the xyw patch, the morecolors patch and the + * line height patch and as such is intended to be combined with these. + * https://tools.suckless.org/dmenu/patches/emoji-highlight/ + */ +#define EMOJI_HIGHLIGHT_PATCH 0 + +/* This patch make it so that fuzzy matches gets highlighted and is therefore meant + * to be used together with the fuzzymatch patch. + * https://tools.suckless.org/dmenu/patches/fuzzyhighlight/ + */ +#define FUZZYHIGHLIGHT_PATCH 1 + +/* This patch adds support for fuzzy-matching to dmenu, allowing users to type non-consecutive + * portions of the string to be matched. + * https://tools.suckless.org/dmenu/patches/fuzzymatch/ + */ +#define FUZZYMATCH_PATCH 1 + +/* Adds fzf-like functionality for dmenu. + * Refer to https://github.com/DAFF0D11/dafmenu/ for documentation and example use cases. + * https://github.com/DAFF0D11/dafmenu/blob/master/patches/dmenu-fzfexpect-5.1.diff + */ +#define FZFEXPECT_PATCH 0 + +/* Allows dmenu's entries to be rendered in a grid by adding a new -g flag to specify + * the number of grid columns. The -g and -l options can be used together to create a + * G columns * L lines grid. + * https://tools.suckless.org/dmenu/patches/grid/ + */ +#define GRID_PATCH 1 + +/* This patch adds the ability to move left and right through a grid. + * This patch depends on the grid patch. + * https://tools.suckless.org/dmenu/patches/gridnav/ + */ +#define GRIDNAV_PATCH 1 + +/* This patch highlights the individual characters of matched text for each dmenu list entry. + * The fuzzy highlight patch takes precedence over this patch. + * https://tools.suckless.org/dmenu/patches/highlight/ + */ +#define HIGHLIGHT_PATCH 0 + +/* This will automatically sort the search result so that high priority items are shown first. + * https://tools.suckless.org/dmenu/patches/highpriority/ + */ +#define HIGHPRIORITY_PATCH 0 + +/* This patch causes dmenu to print out the current text each time a key is pressed. + * https://tools.suckless.org/dmenu/patches/incremental/ + */ +#define INCREMENTAL_PATCH 0 + +/* This patch adds an option to provide preselected text. + * https://tools.suckless.org/dmenu/patches/initialtext/ + */ +#define INITIALTEXT_PATCH 0 + +/* This patch adds a flag which will cause dmenu to select an item immediately if there + * is only one matching option left. + * https://tools.suckless.org/dmenu/patches/instant/ + */ +#define INSTANT_PATCH 1 + +/* This patch adds a '-h' option which sets the minimum height of a dmenu line. This helps + * integrate dmenu with other UI elements that require a particular vertical size. + * http://tools.suckless.org/dmenu/patches/line-height/ + */ +#define LINE_HEIGHT_PATCH 0 + +/* This patch adds a -wm flag which sets override_redirect to false; thus letting your window + * manager manage the dmenu window. + * + * This may be helpful in contexts where you don't want to exclusively bind dmenu or want to + * treat dmenu more as a "window" rather than as an overlay. + * https://tools.suckless.org/dmenu/patches/managed/ + */ +#define MANAGED_PATCH 0 + +/* This patch adds an additional color scheme for highlighting entries adjacent to the current + * selection. + * https://tools.suckless.org/dmenu/patches/morecolor/ + */ +#define MORECOLOR_PATCH 1 + +/* This patch adds basic mouse support for dmenu. + * https://tools.suckless.org/dmenu/patches/mouse-support/ + */ +#define MOUSE_SUPPORT_PATCH 1 + +/* Without this patch when you press Ctrl+Enter dmenu just outputs current item and it is not + * possible to undo that. + * With this patch dmenu will output all selected items only on exit. It is also possible to + * deselect any selected item. + * Also refer to the dmenu_run replacement on the below URL that supports multiple selections. + * + * This patch is not compatible with, and takes precedence over, the json, printinputtext, + * pipeout and non-blocking stdin patches. + * + * https://tools.suckless.org/dmenu/patches/multi-selection/ + */ +#define MULTI_SELECTION_PATCH 1 + +/* This patch provides dmenu the ability for history navigation similar to that of bash. + * + * If you take this patch then it is recommended that you also uncomment the line in the + * dmenu_run script which replaces the exec command. + * + * https://tools.suckless.org/dmenu/patches/navhistory/ + */ +#define NAVHISTORY_PATCH 1 + +/* This patch adds back in the workaround for a BadLength error in the Xft library when color + * glyphs are used. This is for systems that do not have an updated version of the Xft library + * (or generally prefer monochrome fonts). + */ +#define NO_COLOR_EMOJI_PATCH 0 + +/* Adds the -S option to disable sorting menu items after matching. Useful, for example, when menu + * items are sorted by their frequency of use (using an external cache) and the most frequently + * selected items should always appear first regardless of how they were exact, prefix, or + * substring matches. + * https://tools.suckless.org/dmenu/patches/no-sort/ + */ +#define NO_SORT_PATCH 0 + +/* This is a patch to have dmenu read stdin in a non blocking way, making it wait for input both + * from stdin and from X. This means that you can continue feeding dmenu while you type. + * This patch is meant to be used along with the incremental patch, so that you can use stdout + * to feed stdin. + * + * This patch is not compatible with the json and multi-selection patches, both of which takes + * precedence over this patch. + * + * https://tools.suckless.org/dmenu/patches/non_blocking_stdin/ + */ +#define NON_BLOCKING_STDIN_PATCH 0 + +/* Adds text which displays the number of matched and total items in the top right corner of dmenu. + * https://tools.suckless.org/dmenu/patches/numbers/ + */ +#define NUMBERS_PATCH 1 + +/* This patch adds simple markup for dmenu using pango markup. + * This depends on the pango library v1.44 or greater. + * You need to uncomment the corresponding lines in config.mk to use the pango libraries + * when including this patch. + * + * Note that the pango patch is incompatible with the scroll patch and will result in + * compilation errors if both are enabled. + * + * Note that the pango patch does not protect against the BadLength error from Xft + * when color glyphs are used, which means that dmenu will crash if color emoji is used. + * + * If you need color emoji then you may want to install this patched library from the AUR: + * https://aur.archlinux.org/packages/libxft-bgra/ + * + * A long term fix for the libXft library is pending approval of this pull request: + * https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1 + * + * Also see: + * https://developer.gnome.org/pygtk/stable/pango-markup-language.html + * https://github.com/StillANixRookie/dmenu-pango + */ +#define PANGO_PATCH 0 + +/* With this patch dmenu will not directly display the keyboard input, but instead replace + * it with dots. All data from stdin will be ignored. + * https://tools.suckless.org/dmenu/patches/password/ + */ +#define PASSWORD_PATCH 0 + +/* This patch allows the selected text to be piped back out with dmenu. This can be useful if you + * want to display the output of a command on the screen. + * Only text starting with the character '#' is piped out by default. + * + * This patch is not compatible with the json and multi-select patches, both of which takes + * precedence over this one. + * + * https://tools.suckless.org/dmenu/patches/pipeout/ + */ +#define PIPEOUT_PATCH 0 + +/* Lifted from the listfullwidth patch this simple change just avoids colors for the prompt (with + * the -p option or in config.h) by making it use the same style as the rest of the input field. + * The rest of the listfullwidth patch is covered by the vertfull patch. + * https://tools.suckless.org/dmenu/patches/listfullwidth/ + */ +#define PLAIN_PROMPT_PATCH 0 + +/* This patch changes the behaviour of matched items and the Tab key to allow tab completion. + * https://tools.suckless.org/dmenu/patches/prefix-completion/ + */ +#define PREFIXCOMPLETION_PATCH 0 + +/* This patch adds an option -ps to specify an item by providing the index that should be + * pre-selected. + * https://tools.suckless.org/dmenu/patches/preselect/ + */ +#define PRESELECT_PATCH 0 + +/* This patch allows dmenu to print out the 0-based index of matched text instead of the matched + * text itself. This can be useful in cases where you would like to select entries from one array + * of text but index into another, or when you are selecting from an ordered list of non-unique + * items. + * https://tools.suckless.org/dmenu/patches/printindex/ + */ +#define PRINTINDEX_PATCH 0 + +/* This patch adds a flag (-t) which makes Return key to ignore selection and print the input + * text to stdout. The flag basically swaps the functions of Return and Shift+Return hotkeys. + * + * This patch is not compatible with the multi-select and json patches, both of which takes + * precedence over this one. + * + * https://tools.suckless.org/dmenu/patches/printinputtext/ + */ +#define PRINTINPUTTEXT_PATCH 0 + +/* This patch adds a new flag to dmenu with which text input will be rejected if it would + * result in no matching item. + * https://tools.suckless.org/dmenu/patches/reject-no-match/ + */ +#define REJECTNOMATCH_PATCH 0 + +/* The input width used to be relative to the input options prior to commit e1e1de7: + * https://git.suckless.org/dmenu/commit/e1e1de7b3b8399cba90ddca9613f837b2dbef7b9.html + * + * This had a performance hit when using large data sets and was removed in favour of having the + * input width take up 1/3rd of the available space. + * + * This option adds that feature back in with some performance optimisations at the cost of + * accuracy and correctness. + */ +#define RELATIVE_INPUT_WIDTH_PATCH 0 + +/* This patch adds a '-1' option which disables Shift-Return and Ctrl-Return. + * This guarantees that dmenu will only output one item, and that item was read from stdin. + * The original patch used '-r'. This was changed to '-1' to avoid conflict with the incremental + * patch. + * https://tools.suckless.org/dmenu/patches/restrict-return/ + */ +#define RESTRICT_RETURN_PATCH 0 + +/* This patch adds support for text scrolling and no longer appends '...' for long input as + * it can handle long text. + * https://tools.suckless.org/dmenu/patches/scroll/ + */ +#define SCROLL_PATCH 1 + +/* This patch adds -d and -D flags which separates the input into two halves; one half to be + * displayed in dmenu and the other to be printed to stdout. This patch takes precedence over + * the TSV patch. + * https://tools.suckless.org/dmenu/patches/separator/ + */ +#define SEPARATOR_PATCH 0 + +/* This patch allows the symbols, which are printed in dmenu to indicate that either the input + * is too long or there are too many options to be shown in dmenu in one line, to be defined. + * https://tools.suckless.org/dmenu/patches/symbols/ + */ +#define SYMBOLS_PATCH 0 + +/* With this patch dmenu will split input lines at first tab character and only display first + * part, but it will perform matching on and output full lines as usual. + * + * This can be useful if you want to separate data and representation, for example, a music + * player wrapper can display only a track title to user, but still supply full filename to + * the underlying script. + * https://tools.suckless.org/dmenu/patches/tsv/ + */ +#define TSV_PATCH 0 + +/* This patch prevents dmenu from indenting items at the same level as the prompt length. + * https://tools.suckless.org/dmenu/patches/vertfull/ + */ +#define VERTFULL_PATCH 0 + +/* Adds extended window manager hints such as _NET_WM_WINDOW_TYPE and _NET_WM_WINDOW_TYPE_DOCK. + * https://github.com/Baitinq/dmenu/blob/master/patches/dmenu-wm_type.diff + */ +#define WMTYPE_PATCH 0 + +/* This patch adds the ability to configure dmenu via Xresources. At startup, dmenu will read and + * apply the resources named below: + * dmenu.font : font or font set + * dmenu.background : normal background color + * dmenu.foreground : normal foreground color + * dmenu.selbackground : selected background color + * dmenu.selforeground : selected foreground color + * + * See patch/xresources.c for more color settings. + * + * https://tools.suckless.org/dmenu/patches/xresources/ + */ +#define XRESOURCES_PATCH 1 + +/* This patch adds options for specifying dmenu window position and width. + * The center patch takes precedence over the XYW patch if enabled. + * https://tools.suckless.org/dmenu/patches/xyw/ + */ +#define XYW_PATCH 0 diff --git a/dmenu/stest.1 b/dmenu-flexipatch/stest.1 similarity index 100% rename from dmenu/stest.1 rename to dmenu-flexipatch/stest.1 diff --git a/dmenu/stest.c b/dmenu-flexipatch/stest.c similarity index 100% rename from dmenu/stest.c rename to dmenu-flexipatch/stest.c diff --git a/dmenu/util.c b/dmenu-flexipatch/util.c similarity index 94% rename from dmenu/util.c rename to dmenu-flexipatch/util.c index fe044fc..96b82c9 100644 --- a/dmenu/util.c +++ b/dmenu-flexipatch/util.c @@ -6,18 +6,9 @@ #include "util.h" -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} - void -die(const char *fmt, ...) { +die(const char *fmt, ...) +{ va_list ap; va_start(ap, fmt); @@ -33,3 +24,13 @@ die(const char *fmt, ...) { exit(1); } + +void * +ecalloc(size_t nmemb, size_t size) +{ + void *p; + + if (!(p = calloc(nmemb, size))) + die("calloc:"); + return p; +} diff --git a/dmenu/util.h b/dmenu-flexipatch/util.h similarity index 88% rename from dmenu/util.h rename to dmenu-flexipatch/util.h index f633b51..531ab25 100644 --- a/dmenu/util.h +++ b/dmenu-flexipatch/util.h @@ -1,7 +1,11 @@ /* See LICENSE file for copyright and license details. */ +#ifndef MAX #define MAX(A, B) ((A) > (B) ? (A) : (B)) +#endif +#ifndef MIN #define MIN(A, B) ((A) < (B) ? (A) : (B)) +#endif #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) void die(const char *fmt, ...); diff --git a/dmenu/config.def.h b/dmenu/config.def.h deleted file mode 100644 index 4790187..0000000 --- a/dmenu/config.def.h +++ /dev/null @@ -1,34 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -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[] = { - "Hack Nerd Font:size=11:" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ - -static const unsigned int baralpha = 0xd0; -static const unsigned int borderalpha = OPAQUE; -static const unsigned int alphas[][3] = { - /* fg bg border */ - [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, - [SchemeSel] = { OPAQUE, baralpha, borderalpha }, -}; - -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, - [SchemeMid] = { "#eeeeee", "#770000" }, -}; -/* -l and -g options; controls number of lines and columns in grid if > 0 */ -static unsigned int lines = 0; -static unsigned int columns = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/dmenu/dmenu.c b/dmenu/dmenu.c deleted file mode 100644 index 59f7076..0000000 --- a/dmenu/dmenu.c +++ /dev/null @@ -1,847 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -#define OPAQUE 0xffU - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeMid, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw; -static int lrpad; /* sum of left and right padding */ -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static int useargb = 0; -static Visual *visual; -static int depth; -static Colormap cmap; - -static Drw *drw; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static char * cistrstr(const char *s, const char *sub); -static int (*fstrncmp)(const char *, const char *, size_t) = strncasecmp; -static char *(*fstrstr)(const char *, const char *) = cistrstr; - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * columns * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : MIN(TEXTW(next->text), n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : MIN(TEXTW(prev->left->text), n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *h, const char *n) -{ - size_t i; - - if (!n[0]) - return (char *)h; - - for (; *h; ++h) { - for (i = 0; n[i] && tolower((unsigned char)n[i]) == - tolower((unsigned char)h[i]); ++i) - ; - if (n[i] == '\0') - return (char *)h; - } - return NULL; -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->left == sel || item->right == sel) - drw_setscheme(drw, scheme[SchemeMid]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw grid */ - int i = 0; - for (item = curr; item != next; item = item->right, i++) - drawitem( - item, - x + ((i / lines) * ((mw - x) / columns)), - y + (((i % lines) + 1) * bh), - (mw - x) / columns - ); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, MIN(TEXTW(item->text), mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -static void -match(void) -{ - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %u bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[32]; - int len; - KeySym ksym; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: - goto insert; - case XLookupKeySym: - case XLookupBoth: - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - case XK_KP_Left: - movewordedge(-1); - goto draw; - case XK_Right: - case XK_KP_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl(*buf)) - insert(buf, len); - break; - case XK_Delete: - case XK_KP_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - case XK_KP_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - case XK_KP_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - case XK_KP_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - case XK_KP_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - case XK_KP_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - case XK_KP_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - case XK_KP_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - case XK_KP_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); - text[sizeof text - 1] = '\0'; - cursor = strlen(text); - match(); - break; - } - -draw: - drawmenu(); -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -xinitvisual() -{ - XVisualInfo *infos; - XRenderPictFormat *fmt; - int nitems; - int i; - - XVisualInfo tpl = { - .screen = screen, - .depth = 32, - .class = TrueColor - }; - long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; - - infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); - visual = NULL; - for(i = 0; i < nitems; i ++) { - fmt = XRenderFindVisualFormat(dpy, infos[i].visual); - if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { - visual = infos[i].visual; - depth = infos[i].depth; - cmap = XCreateColormap(dpy, root, visual, AllocNone); - useargb = 1; - break; - } - } - - XFree(infos); - - if (! visual) { - visual = DefaultVisual(dpy, screen); - depth = DefaultDepth(dpy, screen); - cmap = DefaultColormap(dpy, screen); - } -} - -static void -readstdin(void) -{ - char buf[sizeof text], *p; - size_t i, imax = 0, size = 0; - unsigned int tmpmax = 0; - - /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { - if (i + 1 >= size / sizeof *items) - if (!(items = realloc(items, (size += BUFSIZ)))) - die("cannot realloc %u bytes:", size); - if ((p = strchr(buf, '\n'))) - *p = '\0'; - if (!(items[i].text = strdup(buf))) - die("cannot strdup %u bytes:", strlen(buf) + 1); - items[i].out = 0; - drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL); - if (tmpmax > inputw) { - inputw = tmpmax; - imax = i; - } - } - if (items) - items[i].text = NULL; - inputw = items ? TEXTW(items[imax].text) : 0; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], alphas[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i]) != 0) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = MIN(inputw, mw/3); - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = 0; - swa.colormap = cmap; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - depth, InputOutput, visual, - CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-s")) { /* case-sensitive item matching */ - fstrncmp = strncmp; - fstrstr = strstr; - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-g")) { /* number of columns in grid */ - columns = atoi(argv[++i]); - if (lines == 0) lines = 1; - } else if (!strcmp(argv[i], "-l")) { /* number of lines in grid */ - lines = atoi(argv[++i]); - if (columns == 0) columns = 1; - } else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - xinitvisual(); - drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/dmenu/dmenu_run b/dmenu/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/dmenu/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/dmenu/patches/dmenu-alpha.diff b/dmenu/patches/dmenu-alpha.diff deleted file mode 100644 index ad32fc8..0000000 --- a/dmenu/patches/dmenu-alpha.diff +++ /dev/null @@ -1,281 +0,0 @@ -From 5e232dc79ba3c0b791f3d9ddfab2fcecca19f18d Mon Sep 17 00:00:00 2001 -From: bakkeby -Date: Thu, 28 May 2020 16:58:12 +0200 -Subject: [PATCH] Adding alpha patch - ---- - config.def.h | 9 +++++++++ - config.mk | 6 +++++- - dmenu.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++------ - drw.c | 26 +++++++++++++----------- - drw.h | 9 ++++++--- - 5 files changed, 84 insertions(+), 22 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..5c512d3 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,15 @@ static const char *fonts[] = { - "monospace:size=10" - }; - static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -+ -+static const unsigned int baralpha = 0xd0; -+static const unsigned int borderalpha = OPAQUE; -+static const unsigned int alphas[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, -+ [SchemeSel] = { OPAQUE, baralpha, borderalpha }, -+}; -+ - static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, -diff --git a/config.mk b/config.mk -index 05d5a3e..ee4991a 100644 ---- a/config.mk -+++ b/config.mk -@@ -15,12 +15,16 @@ XINERAMAFLAGS = -DXINERAMA - # freetype - FREETYPELIBS = -lfontconfig -lXft - FREETYPEINC = /usr/include/freetype2 -+ -+# alpha -+XRENDERLIBS = -lXrender -+ - # OpenBSD (uncomment) - #FREETYPEINC = $(X11INC)/freetype2 - - # includes and libs - INCS = -I$(X11INC) -I$(FREETYPEINC) --LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -+LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) ${XRENDERLIBS} - - # flags - CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -diff --git a/dmenu.c b/dmenu.c -index 65f25ce..31efafc 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -24,6 +24,7 @@ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -+#define OPAQUE 0xffU - - /* enums */ - enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ -@@ -50,6 +51,11 @@ static Display *dpy; - static Window root, parentwin, win; - static XIC xic; - -+static int useargb = 0; -+static Visual *visual; -+static int depth; -+static Colormap cmap; -+ - static Drw *drw; - static Clr *scheme[SchemeLast]; - -@@ -518,6 +524,43 @@ paste(void) - drawmenu(); - } - -+static void -+xinitvisual() -+{ -+ XVisualInfo *infos; -+ XRenderPictFormat *fmt; -+ int nitems; -+ int i; -+ -+ XVisualInfo tpl = { -+ .screen = screen, -+ .depth = 32, -+ .class = TrueColor -+ }; -+ long masks = VisualScreenMask | VisualDepthMask | VisualClassMask; -+ -+ infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); -+ visual = NULL; -+ for(i = 0; i < nitems; i ++) { -+ fmt = XRenderFindVisualFormat(dpy, infos[i].visual); -+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { -+ visual = infos[i].visual; -+ depth = infos[i].depth; -+ cmap = XCreateColormap(dpy, root, visual, AllocNone); -+ useargb = 1; -+ break; -+ } -+ } -+ -+ XFree(infos); -+ -+ if (! visual) { -+ visual = DefaultVisual(dpy, screen); -+ depth = DefaultDepth(dpy, screen); -+ cmap = DefaultColormap(dpy, screen); -+ } -+} -+ - static void - readstdin(void) - { -@@ -602,7 +645,7 @@ setup(void) - #endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) -- scheme[j] = drw_scm_create(drw, colors[j], 2); -+ scheme[j] = drw_scm_create(drw, colors[j], alphas[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); -@@ -657,14 +700,14 @@ setup(void) - - /* create menu window */ - swa.override_redirect = True; -- swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -+ swa.background_pixel = 0; -+ swa.colormap = cmap; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, -- CopyFromParent, CopyFromParent, CopyFomParent, -- CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); -+ depth, InputOutput, visual, -+ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - -- - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); -@@ -747,7 +790,8 @@ main(int argc, char *argv[]) - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); -- drw = drw_create(dpy, screen, root, wa.width, wa.height); -+ xinitvisual(); -+ drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; -diff --git a/drw.c b/drw.c -index 4cdbcbe..fe3aadd 100644 ---- a/drw.c -+++ b/drw.c -@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) - } - - Drw * --drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -+drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) - { - Drw *drw = ecalloc(1, sizeof(Drw)); - -@@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h - drw->root = root; - drw->w = w; - drw->h = h; -- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); -- drw->gc = XCreateGC(dpy, root, 0, NULL); -+ drw->visual = visual; -+ drw->depth = depth; -+ drw->cmap = cmap; -+ drw->drawable = XCreatePixmap(dpy, root, w, h, depth); -+ drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -@@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); -- drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -+ drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth); - } - - void -@@ -194,21 +197,22 @@ drw_fontset_free(Fnt *font) - } - - void --drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -+drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) - { - if (!drw || !dest || !clrname) - return; - -- if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), -- DefaultColormap(drw->dpy, drw->screen), -+ if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -+ -+ dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); - } - - /* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ - Clr * --drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -+drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) - { - size_t i; - Clr *ret; -@@ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) - return NULL; - - for (i = 0; i < clrcount; i++) -- drw_clr_create(drw, &ret[i], clrnames[i]); -+ drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); - return ret; - } - -@@ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); -- d = XftDrawCreate(drw->dpy, drw->drawable, -- DefaultVisual(drw->dpy, drw->screen), -- DefaultColormap(drw->dpy, drw->screen)); -+ d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); - x += lpad; - w -= lpad; - } -diff --git a/drw.h b/drw.h -index 4c67419..4f66f0d 100644 ---- a/drw.h -+++ b/drw.h -@@ -20,6 +20,9 @@ typedef struct { - Display *dpy; - int screen; - Window root; -+ Visual *visual; -+ unsigned int depth; -+ Colormap cmap; - Drawable drawable; - GC gc; - Clr *scheme; -@@ -27,7 +30,7 @@ typedef struct { - } Drw; - - /* Drawable abstraction */ --Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -+Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap); - void drw_resize(Drw *drw, unsigned int w, unsigned int h); - void drw_free(Drw *drw); - -@@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text); - void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - - /* Colorscheme abstraction */ --void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); --Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); -+void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); -+Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); - - /* Cursor abstraction */ - Cur *drw_cur_create(Drw *drw, int shape); --- -2.34.1 -r diff --git a/dmenu/patches/dmenu-caseinsensitive-20200523-db6093f.diff b/dmenu/patches/dmenu-caseinsensitive-20200523-db6093f.diff deleted file mode 100644 index 939a2e8..0000000 --- a/dmenu/patches/dmenu-caseinsensitive-20200523-db6093f.diff +++ /dev/null @@ -1,42 +0,0 @@ -From 54acbdf72083a5eae5783eed42e162424ab2cec2 Mon Sep 17 00:00:00 2001 -From: Kim Torgersen -Date: Sat, 23 May 2020 14:48:28 +0200 -Subject: [PATCH] case-insensitive item matching default, case-sensitive option - (-s) - ---- - dmenu.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/dmenu.c b/dmenu.c -index 65f25ce..855df59 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -55,8 +55,9 @@ static Clr *scheme[SchemeLast]; - - #include "config.h" - --static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; --static char *(*fstrstr)(const char *, const char *) = strstr; -+static char * cistrstr(const char *s, const char *sub); -+static int (*fstrncmp)(const char *, const char *, size_t) = strncasecmp; -+static char *(*fstrstr)(const char *, const char *) = cistrstr; - - static void - appenditem(struct item *item, struct item **list, struct item **last) -@@ -709,9 +710,9 @@ main(int argc, char *argv[]) - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; -- else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ -- fstrncmp = strncasecmp; -- fstrstr = cistrstr; -+ else if (!strcmp(argv[i], "-s")) { /* case-sensitive item matching */ -+ fstrncmp = strncmp; -+ fstrstr = strstr; - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ --- -2.26.2 - diff --git a/dmenu/patches/dmenu-grid-4.9.diff b/dmenu/patches/dmenu-grid-4.9.diff deleted file mode 100644 index c27689b..0000000 --- a/dmenu/patches/dmenu-grid-4.9.diff +++ /dev/null @@ -1,107 +0,0 @@ -From 39ab9676914bd0d8105d0f96bbd7611a53077438 Mon Sep 17 00:00:00 2001 -From: Miles Alan -Date: Sat, 4 Jul 2020 11:19:04 -0500 -Subject: [PATCH] Add -g option to display entries in the given number of grid - columns - -This option can be used in conjunction with -l to format dmenu's options in -arbitrary size grids. For example, to create a 4 column by 6 line grid, you -could use: dmenu -g 4 -l 6 ---- - config.def.h | 3 ++- - dmenu.1 | 7 ++++++- - dmenu.c | 22 ++++++++++++++++------ - 3 files changed, 24 insertions(+), 8 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..96cf3c9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,8 +13,9 @@ static const char *colors[SchemeLast][2] = { - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, - }; --/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -+/* -l and -g options; controls number of lines and columns in grid if > 0 */ - static unsigned int lines = 0; -+static unsigned int columns = 0; - - /* - * Characters not considered part of a word while deleting words -diff --git a/dmenu.1 b/dmenu.1 -index 323f93c..d0a734a 100644 ---- a/dmenu.1 -+++ b/dmenu.1 -@@ -4,6 +4,8 @@ dmenu \- dynamic menu - .SH SYNOPSIS - .B dmenu - .RB [ \-bfiv ] -+.RB [ \-g -+.IR columns ] - .RB [ \-l - .IR lines ] - .RB [ \-m -@@ -47,8 +49,11 @@ is faster, but will lock up X until stdin reaches end\-of\-file. - .B \-i - dmenu matches menu items case insensitively. - .TP -+.BI \-g " columns" -+dmenu lists items in a grid with the given number of columns. -+.TP - .BI \-l " lines" --dmenu lists items vertically, with the given number of lines. -+dmenu lists items in a grid with the given number of lines. - .TP - .BI \-m " monitor" - dmenu is displayed on the monitor number supplied. Monitor numbers are starting -diff --git a/dmenu.c b/dmenu.c -index 6b8f51b..d79b6bb 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -77,7 +77,7 @@ calcoffsets(void) - int i, n; - - if (lines > 0) -- n = lines * bh; -+ n = lines * columns * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ -@@ -152,9 +152,15 @@ drawmenu(void) - } - - if (lines > 0) { -- /* draw vertical list */ -- for (item = curr; item != next; item = item->right) -- drawitem(item, x, y += bh, mw - x); -+ /* draw grid */ -+ int i = 0; -+ for (item = curr; item != next; item = item->right, i++) -+ drawitem( -+ item, -+ x + ((i / lines) * ((mw - x) / columns)), -+ y + (((i % lines) + 1) * bh), -+ (mw - x) / columns -+ ); - } else if (matches) { - /* draw horizontal list */ - x += inputw; -@@ -708,9 +714,13 @@ main(int argc, char *argv[]) - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ -- else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ -+ else if (!strcmp(argv[i], "-g")) { /* number of columns in grid */ -+ columns = atoi(argv[++i]); -+ if (lines == 0) lines = 1; -+ } else if (!strcmp(argv[i], "-l")) { /* number of lines in grid */ - lines = atoi(argv[++i]); -- else if (!strcmp(argv[i], "-m")) -+ if (columns == 0) columns = 1; -+ } else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; --- -2.23.1 - diff --git a/dmenu/patches/dmenu-morecolor-20190922-4bf895b.diff b/dmenu/patches/dmenu-morecolor-20190922-4bf895b.diff deleted file mode 100644 index 539e9c1..0000000 --- a/dmenu/patches/dmenu-morecolor-20190922-4bf895b.diff +++ /dev/null @@ -1,47 +0,0 @@ -From 4bf895be219ae00394a5cde901dc43ec6dcb3759 Mon Sep 17 00:00:00 2001 -From: Tanner Babcock -Date: Sun, 22 Sep 2019 03:07:26 -0500 -Subject: [PATCH] Additional color scheme, for adjacent entries - ---- - config.def.h | 1 + - dmenu.c | 4 +++- - 2 files changed, 4 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..767c88f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -12,6 +12,7 @@ static const char *colors[SchemeLast][2] = { - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -+ [SchemeMid] = { "#eeeeee", "#770000" }, - }; - /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ - static unsigned int lines = 0; -diff --git a/dmenu.c b/dmenu.c -index 65f25ce..0a5c08d 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -26,7 +26,7 @@ - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - - /* enums */ --enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ -+enum { SchemeNorm, SchemeSel, SchemeOut, SchemeMid, SchemeLast }; /* color schemes */ - - struct item { - char *text; -@@ -118,6 +118,8 @@ drawitem(struct item *item, int x, int y, int w) - { - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); -+ else if (item->left == sel || item->right == sel) -+ drw_setscheme(drw, scheme[SchemeMid]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else --- -2.23.0 - diff --git a/dmenu/patches/dmenu-mousesupport.diff b/dmenu/patches/dmenu-mousesupport.diff deleted file mode 100644 index 49824ba..0000000 --- a/dmenu/patches/dmenu-mousesupport.diff +++ /dev/null @@ -1,144 +0,0 @@ -diff --git a/dmenu.c b/dmenu.c -index d95e6c6..75a79d0 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -518,6 +518,119 @@ draw: - drawmenu(); - } - -+static void -+buttonpress(XEvent *e) -+{ -+ struct item *item; -+ XButtonPressedEvent *ev = &e->xbutton; -+ int x = 0, y = 0, h = bh, w; -+ -+ if (ev->window != win) -+ return; -+ -+ /* right-click: exit */ -+ if (ev->button == Button3) -+ exit(1); -+ -+ if (prompt && *prompt) -+ x += promptw; -+ -+ /* input field */ -+ w = (lines > 0 || !matches) ? mw - x : inputw; -+ -+ /* left-click on input: clear input, -+ * NOTE: if there is no left-arrow the space for < is reserved so -+ * add that to the input width */ -+ if (ev->button == Button1 && -+ ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + -+ ((!prev || !curr->left) ? TEXTW("<") : 0)) || -+ (lines > 0 && ev->y >= y && ev->y <= y + h))) { -+ insert(NULL, -cursor); -+ drawmenu(); -+ return; -+ } -+ /* middle-mouse click: paste selection */ -+ if (ev->button == Button2) { -+ XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, -+ utf8, utf8, win, CurrentTime); -+ drawmenu(); -+ return; -+ } -+ /* scroll up */ -+ if (ev->button == Button4 && prev) { -+ sel = curr = prev; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ /* scroll down */ -+ if (ev->button == Button5 && next) { -+ sel = curr = next; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ if (ev->button != Button1) -+ return; -+ if (ev->state & ~ControlMask) -+ return; -+ if (lines > 0) { -+ /* vertical list: (ctrl)left-click on item */ -+ w = mw - x; -+ for (item = curr; item != next; item = item->right) { -+ y += h; -+ if (ev->y >= y && ev->y <= (y + h)) { -+ puts(item->text); -+ if (!(ev->state & ControlMask)) -+ exit(0); -+ sel = item; -+ if (sel) { -+ sel->out = 1; -+ drawmenu(); -+ } -+ return; -+ } -+ } -+ } else if (matches) { -+ /* left-click on left arrow */ -+ x += inputw; -+ w = TEXTW("<"); -+ if (prev && curr->left) { -+ if (ev->x >= x && ev->x <= x + w) { -+ sel = curr = prev; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ } -+ /* horizontal list: (ctrl)left-click on item */ -+ for (item = curr; item != next; item = item->right) { -+ x += w; -+ w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); -+ if (ev->x >= x && ev->x <= x + w) { -+ puts(item->text); -+ if (!(ev->state & ControlMask)) -+ exit(0); -+ sel = item; -+ if (sel) { -+ sel->out = 1; -+ drawmenu(); -+ } -+ return; -+ } -+ } -+ /* left-click on right arrow */ -+ w = TEXTW(">"); -+ x = mw - w; -+ if (next && ev->x >= x && ev->x <= x + w) { -+ sel = curr = next; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ } -+} -+ - static void - paste(void) - { -@@ -579,6 +692,9 @@ run(void) - break; - cleanup(); - exit(1); -+ case ButtonPress: -+ buttonpress(&ev); -+ break; - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); -@@ -676,7 +792,8 @@ setup(void) - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; -+ swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | -+ ButtonPressMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); diff --git a/dmenu/patches/dmenu-scroll.diff b/dmenu/patches/dmenu-scroll.diff deleted file mode 100644 index 7a7386a..0000000 --- a/dmenu/patches/dmenu-scroll.diff +++ /dev/null @@ -1,245 +0,0 @@ -diff --git a/dmenu.c b/dmenu.c -index 5c835dd..71efe52 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -131,9 +131,10 @@ drawitem(struct item *item, int x, int y, int w) - static void - drawmenu(void) - { -- unsigned int curpos; -+ static int curpos, oldcurlen; - struct item *item; - int x = 0, y = 0, w; -+ int curlen, rcurlen; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); -@@ -144,14 +145,21 @@ drawmenu(void) - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; -- drw_setscheme(drw, scheme[SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); -+ w -= lrpad / 2; -+ x += lrpad / 2; - -- curpos = TEXTW(text) - TEXTW(&text[cursor]); -- if ((curpos += lrpad / 2 - 1) < w) { -- drw_setscheme(drw, scheme[SchemeNorm]); -- drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); -- } -+ rcurlen = drw_fontset_getwidth(drw, text + cursor); -+ curlen = drw_fontset_getwidth(drw, text) - rcurlen; -+ curpos += curlen - oldcurlen; -+ curpos = MIN(w, MAX(0, curpos)); -+ curpos = MAX(curpos, w - rcurlen); -+ curpos = MIN(curpos, curlen); -+ oldcurlen = curlen; -+ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ drw_text_align(drw, x, 0, curpos, bh, text, cursor, AlignR); -+ drw_text_align(drw, x + curpos, 0, w - curpos, bh, text + cursor, strlen(text) - cursor, AlignL); -+ drw_rect(drw, x + curpos - 1, 2, 2, bh - 4, 1, 0); - - if (lines > 0) { - /* draw vertical list */ -diff --git a/drw.c b/drw.c -index c638323..bfffbc1 100644 ---- a/drw.c -+++ b/drw.c -@@ -364,6 +364,175 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp - return x + (render ? w : 0); - } - -+int -+utf8nextchar(const char *str, int len, int i, int inc) -+{ -+ int n; -+ -+ for (n = i + inc; n + inc >= 0 && n + inc <= len -+ && (str[n] & 0xc0) == 0x80; n += inc) -+ ; -+ return n; -+} -+ -+int -+drw_text_align(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int textlen, int align) -+{ -+ int ty; -+ unsigned int ew; -+ XftDraw *d = NULL; -+ Fnt *usedfont, *curfont, *nextfont; -+ size_t len; -+ int utf8strlen, utf8charlen, render = x || y || w || h; -+ long utf8codepoint = 0; -+ const char *utf8str; -+ FcCharSet *fccharset; -+ FcPattern *fcpattern; -+ FcPattern *match; -+ XftResult result; -+ int charexists = 0; -+ int i, n; -+ -+ if (!drw || (render && !drw->scheme) || !text || !drw->fonts || textlen <= 0 -+ || (align != AlignL && align != AlignR)) -+ return 0; -+ -+ if (!render) { -+ w = ~w; -+ } else { -+ XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel); -+ XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); -+ d = XftDrawCreate(drw->dpy, drw->drawable, -+ DefaultVisual(drw->dpy, drw->screen), -+ DefaultColormap(drw->dpy, drw->screen)); -+ } -+ -+ usedfont = drw->fonts; -+ i = align == AlignL ? 0 : textlen; -+ x = align == AlignL ? x : x + w; -+ while (1) { -+ utf8strlen = 0; -+ nextfont = NULL; -+ /* if (align == AlignL) */ -+ utf8str = text + i; -+ -+ while ((align == AlignL && i < textlen) || (align == AlignR && i > 0)) { -+ if (align == AlignL) { -+ utf8charlen = utf8decode(text + i, &utf8codepoint, MIN(textlen - i, UTF_SIZ)); -+ if (!utf8charlen) { -+ textlen = i; -+ break; -+ } -+ } else { -+ n = utf8nextchar(text, textlen, i, -1); -+ utf8charlen = utf8decode(text + n, &utf8codepoint, MIN(textlen - n, UTF_SIZ)); -+ if (!utf8charlen) { -+ textlen -= i; -+ text += i; -+ i = 0; -+ break; -+ } -+ } -+ for (curfont = drw->fonts; curfont; curfont = curfont->next) { -+ charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); -+ if (charexists) { -+ if (curfont == usedfont) { -+ utf8strlen += utf8charlen; -+ i += align == AlignL ? utf8charlen : -utf8charlen; -+ } else { -+ nextfont = curfont; -+ } -+ break; -+ } -+ } -+ -+ if (!charexists || nextfont) -+ break; -+ else -+ charexists = 0; -+ } -+ -+ if (align == AlignR) -+ utf8str = text + i; -+ -+ if (utf8strlen) { -+ drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); -+ /* shorten text if necessary */ -+ if (align == AlignL) { -+ for (len = utf8strlen; len && ew > w; ) { -+ len = utf8nextchar(utf8str, len, len, -1); -+ drw_font_getexts(usedfont, utf8str, len, &ew, NULL); -+ } -+ } else { -+ for (len = utf8strlen; len && ew > w; ) { -+ n = utf8nextchar(utf8str, len, 0, +1); -+ utf8str += n; -+ len -= n; -+ drw_font_getexts(usedfont, utf8str, len, &ew, NULL); -+ } -+ } -+ -+ if (len) { -+ if (render) { -+ ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; -+ XftDrawStringUtf8(d, &drw->scheme[ColFg], -+ usedfont->xfont, align == AlignL ? x : x - ew, ty, (XftChar8 *)utf8str, len); -+ } -+ x += align == AlignL ? ew : -ew; -+ w -= ew; -+ } -+ if (len < utf8strlen) -+ break; -+ } -+ -+ if ((align == AlignR && i <= 0) || (align == AlignL && i >= textlen)) { -+ break; -+ } else if (nextfont) { -+ charexists = 0; -+ usedfont = nextfont; -+ } else { -+ /* Regardless of whether or not a fallback font is found, the -+ * character must be drawn. */ -+ charexists = 1; -+ -+ fccharset = FcCharSetCreate(); -+ FcCharSetAddChar(fccharset, utf8codepoint); -+ -+ if (!drw->fonts->pattern) { -+ /* Refer to the comment in xfont_create for more information. */ -+ die("the first font in the cache must be loaded from a font string."); -+ } -+ -+ fcpattern = FcPatternDuplicate(drw->fonts->pattern); -+ FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); -+ FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); -+ -+ FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); -+ FcDefaultSubstitute(fcpattern); -+ match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); -+ -+ FcCharSetDestroy(fccharset); -+ FcPatternDestroy(fcpattern); -+ -+ if (match) { -+ usedfont = xfont_create(drw, NULL, match); -+ if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { -+ for (curfont = drw->fonts; curfont->next; curfont = curfont->next) -+ ; /* NOP */ -+ curfont->next = usedfont; -+ } else { -+ xfont_free(usedfont); -+ usedfont = drw->fonts; -+ } -+ } -+ } -+ } -+ if (d) -+ XftDrawDestroy(d); -+ -+ return x; -+} -+ - void - drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) - { -diff --git a/drw.h b/drw.h -index 4c67419..b66a83e 100644 ---- a/drw.h -+++ b/drw.h -@@ -13,6 +13,7 @@ typedef struct Fnt { - } Fnt; - - enum { ColFg, ColBg }; /* Clr scheme index */ -+enum { AlignL, AlignR }; - typedef XftColor Clr; - - typedef struct { -@@ -52,6 +53,7 @@ void drw_setscheme(Drw *drw, Clr *scm); - /* Drawing functions */ - void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); - int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); -+int drw_text_align(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int textlen, int align); - - /* Map functions */ - void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/dmenu/scripts/dfmpeg b/dmenu/scripts/dfmpeg deleted file mode 100755 index 96a73b7..0000000 --- a/dmenu/scripts/dfmpeg +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# dfmpeg -# dmenu gui for recording your screen with ffmpeg -# Licensed under MIT, written by speedie -# https://github.com/speediegamer/dfmpeg - -defaultConfig() { - DFMPEG_DOTDIR="$HOME/.config/dfmpeg" # The directory where dotfiles are - DFMPEG_RESOLUTION="1920x1080" # The resolution to record in - DFMPEG_AUDIO_DEVICE="alsa" # How to capture audio (alsa/pulseaudio) - DFMPEG_FRAME_RATE="60" # Frame rate to capture in. - DFMPEG_RECORD_DEVICE="x11grab" # Probably do not change. - DFMPEG_OUTPUT_PATH="$HOME/Videos" # Path where videos will be saved. - DFMPEG_OUTPUT_FORMAT="mp4" # What format to use - DFMPEG_OUTPUT_FILENAME="$DFMPEG_OUTPUT_PATH/Dfmpeg-Output-$(date +"%d-%d-%y-%T").$DFMPEG_OUTPUT_FORMAT" # File name of the output. Probably don't need to change. - DFMPEG_WH=":0.0" # Width and height, no need to change, defaults should work. - DFMPEG_DMENU="dmenu" # Path to dmenu - DFMPEG_TERM="$TERMINAL" # Terminal to use when editing the configuration file. - DFMPEG_EDITOR="vim" # Editor to edit the config file with -} - -defaultConfig -. "$DFMPEG_DOTDIR"/dfmpegrc -startrec="ffmpeg -f $DFMPEG_RECORD_DEVICE -s $DFMPEG_RESOLUTION -i $DFMPEG_WH -f $DFMPEG_AUDIO_DEVICE -r $DFMPEG_FRAME_RATE -i default $DFMPEG_OUTPUT_FILENAME" -startrec_no_audio="ffmpeg -f $DFMPEG_RECORD_DEVICE -s $DFMPEG_RESOLUTION -r $DFMPEG_FRAME_RATE -i $DFMPEG_WH $DFMPEG_OUTPUT_FILENAME" -stoprec="pkill ffmpeg" -dfmpeg_ver="2022-04-03-r1" -about_screen="dfmpeg $dfmpeg_ver." -about_screen_2="Licensed under MIT, written by speedie + contributors." -about_screen_3="https://github.com/speediegamer/dfmpeg" - -case "$(printf 'Start\nStop\nStart-No-Audio\nConfigure\nExit\nAbout' | dmenu -p 'Record your screen:')" in - "Exit") DFMPEG_STATUS=idle && exit 0 ;; - "Start") DFMPEG_STATUS=recording && touch /tmp/dfmpeg-recording && $startrec && exit 0 ;; - "Stop") $stoprec && rm /tmp/dfmpeg-recording && DFMPEG_STATUS=idle ;; - "Configure") $DFMPEG_TERM $DFMPEG_EDITOR $DFMPEG_DOTDIR/dfmpegrc ;; - "Start-No-Audio") DFMPEG_STATUS=recording && touch /tmp/dfmpeg-recording && $startrec_no_audio && exit 0 ;; - "About") - echo $about_screen > $DFMPEG_DOTDIR/dfmpeg_about - echo $about_screen_2 >> $DFMPEG_DOTDIR/dfmpeg_about - echo $about_screen_3 >> $DFMPEG_DOTDIR/dfmpeg_about - $DFMPEG_TERM $DFMPEG_EDITOR $DFMPEG_DOTDIR/dfmpeg_about - ;; -esac - -exit 0 # This fixes a small bug. diff --git a/dwm-flexipatch/.github/FUNDING.yml b/dwm-flexipatch/.github/FUNDING.yml deleted file mode 100644 index 870c946..0000000 --- a/dwm-flexipatch/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -custom: ["https://suckless.org/donations/", "https://paypal.me/dwmflexipatch"] diff --git a/dwm-flexipatch/config.def.h b/dwm-flexipatch/config.def.h index fc5cb07..d40ac22 100644 --- a/dwm-flexipatch/config.def.h +++ b/dwm-flexipatch/config.def.h @@ -168,45 +168,45 @@ static const char dmenufont[] = "Hack Nerd Font:size=11"; static char c000000[] = "#000000"; // placeholder value -static char normfgcolor[] = "#bbbbbb"; -static char normbgcolor[] = "#222222"; -static char normbordercolor[] = "#444444"; -static char normfloatcolor[] = "#db8fd9"; +static char normfgcolor[] = "#ffffff"; +static char normbgcolor[] = "#173f4f"; +static char normbordercolor[] = "#173f4f"; +static char normfloatcolor[] = "#124f5f"; static char selfgcolor[] = "#eeeeee"; -static char selbgcolor[] = "#005577"; -static char selbordercolor[] = "#005577"; -static char selfloatcolor[] = "#005577"; +static char selbgcolor[] = "#153a49"; +static char selbordercolor[] = "#153a49"; +static char selfloatcolor[] = "#153a49"; -static char titlenormfgcolor[] = "#bbbbbb"; -static char titlenormbgcolor[] = "#222222"; -static char titlenormbordercolor[] = "#444444"; -static char titlenormfloatcolor[] = "#db8fd9"; +static char titlenormfgcolor[] = "#ffffff"; +static char titlenormbgcolor[] = "#173f4f"; +static char titlenormbordercolor[] = "#173f4f"; +static char titlenormfloatcolor[] = "#124f5f"; static char titleselfgcolor[] = "#eeeeee"; -static char titleselbgcolor[] = "#005577"; -static char titleselbordercolor[] = "#005577"; -static char titleselfloatcolor[] = "#005577"; +static char titleselbgcolor[] = "#153a49"; +static char titleselbordercolor[] = "#153a49"; +static char titleselfloatcolor[] = "#153a49"; -static char tagsnormfgcolor[] = "#bbbbbb"; -static char tagsnormbgcolor[] = "#222222"; -static char tagsnormbordercolor[] = "#444444"; -static char tagsnormfloatcolor[] = "#db8fd9"; +static char tagsnormfgcolor[] = "#ffffff"; +static char tagsnormbgcolor[] = "#173f4f"; +static char tagsnormbordercolor[] = "#173f4f"; +static char tagsnormfloatcolor[] = "#124f5f"; static char tagsselfgcolor[] = "#eeeeee"; -static char tagsselbgcolor[] = "#005577"; -static char tagsselbordercolor[] = "#005577"; -static char tagsselfloatcolor[] = "#005577"; +static char tagsselbgcolor[] = "#153a49"; +static char tagsselbordercolor[] = "#153a49"; +static char tagsselfloatcolor[] = "#153a49"; -static char hidnormfgcolor[] = "#005577"; +static char hidnormfgcolor[] = "#153a49"; static char hidselfgcolor[] = "#227799"; -static char hidnormbgcolor[] = "#222222"; -static char hidselbgcolor[] = "#222222"; +static char hidnormbgcolor[] = "#173f4f"; +static char hidselbgcolor[] = "#173f4f"; -static char urgfgcolor[] = "#bbbbbb"; -static char urgbgcolor[] = "#222222"; +static char urgfgcolor[] = "#ffffff"; +static char urgbgcolor[] = "#173f4f"; static char urgbordercolor[] = "#ff0000"; -static char urgfloatcolor[] = "#db8fd9"; +static char urgfloatcolor[] = "#124f5f"; #if RENAMED_SCRATCHPADS_PATCH static char scratchselfgcolor[] = "#FFF7D4"; @@ -905,7 +905,7 @@ static const Key keys[] = { { Mod4Mask, XK_f, spawn, SHCMD("spmenu_run -fm -a '-g 4 -l 10'") }, /* spmenu scripts down here */ { Mod4Mask, XK_v, spawn, SHCMD("clipmenu-spmenu") }, - { Mod4Mask|ShiftMask, XK_Print, spawn, SHCMD("screenshot-spmenu -f") }, + { Mod4Mask, XK_Print, spawn, SHCMD("screenshot-spmenu -f") }, { Mod4Mask|Mod1Mask, XK_Print, spawn, SHCMD("screenshot-spmenu -s") }, { Mod4Mask, XK_p, spawn, SHCMD("pirokit") }, { Mod4Mask|ShiftMask, XK_w, spawn, SHCMD("wallpaper-spmenu") }, @@ -917,6 +917,8 @@ static const Key keys[] = { { Mod4Mask, XK_u, spawn, SHCMD("volume-dunst up") }, { Mod4Mask, XK_d, spawn, SHCMD("volume-dunst down") }, { Mod4Mask, XK_m, spawn, SHCMD("volume-dunst mute") }, + /* slock must be installed */ + { Mod4Mask, XK_l, spawn, SHCMD("slock") }, #if KEYMODES_PATCH { MODKEY, XK_Escape, setkeymode, {.ui = COMMANDMODE} }, #endif // KEYMODES_PATCH @@ -928,9 +930,8 @@ static const Key keys[] = { { MODKEY, XK_s, rioresize, {0} }, /* suckless-utils keymaps */ { MODKEY|ShiftMask, XK_t, spawn, SHCMD("tabbed -r 2 st -w ''") }, - { MODKEY|ShiftMask, XK_i, spawn, SHCMD("firefox") }, + { MODKEY|ShiftMask, XK_i, spawn, SHCMD("firefox") }, { Mod4Mask, XK_e, spawn, SHCMD("st -T sfm sfm") }, - { Mod4Mask, XK_Print, spawn, SHCMD("maim ~/Pictures/Screenshot_$(date +%s).png") }, #endif // RIODRAW_PATCH { MODKEY, XK_b, togglebar, {0} }, #if TOGGLETOPBAR_PATCH @@ -1093,7 +1094,7 @@ static const Key keys[] = { { MODKEY, XK_o, winview, {0} }, #endif // WINVIEW_PATCH #if XRDB_PATCH && !BAR_VTCOLORS_PATCH - { MODKEY, XK_F5, xrdb, {.v = NULL } }, + { MODKEY, XK_F5, xrdb, {.v = NULL } }, #endif // XRDB_PATCH { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, diff --git a/dwm-flexipatch/config.mk b/dwm-flexipatch/config.mk index 4fe92fc..f782f5d 100644 --- a/dwm-flexipatch/config.mk +++ b/dwm-flexipatch/config.mk @@ -46,7 +46,7 @@ XRENDER = -lXrender XEXTLIB = -lXext # Uncomment this for the swallow patch / SWALLOW_PATCH -#XCBLIBS = -lX11-xcb -lxcb -lxcb-res +XCBLIBS = -lX11-xcb -lxcb -lxcb-res # This is needed for the winicon and tagpreview patches / BAR_WINICON_PATCH / BAR_TAGPREVIEW_PATCH IMLIB2LIBS = -lImlib2 diff --git a/dwm-flexipatch/dwm.desktop b/dwm-flexipatch/dwm.desktop index b0c3354..0249693 100644 --- a/dwm-flexipatch/dwm.desktop +++ b/dwm-flexipatch/dwm.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Encoding=UTF-8 -Name=Dwm +Name=dwm-flexipatch (X11) Comment=Dynamic window manager -Exec=dwm +Exec=/usr/local/bin/startdwm Icon=dwm Type=XSession diff --git a/dwm-flexipatch/patch/xrdb.c b/dwm-flexipatch/patch/xrdb.c index 435da73..4eef92d 100644 --- a/dwm-flexipatch/patch/xrdb.c +++ b/dwm-flexipatch/patch/xrdb.c @@ -16,47 +16,47 @@ loadxrdb() xrdb = XrmGetStringDatabase(resm); if (xrdb != NULL) { - XRDB_LOAD_COLOR("dwm.color0", normbordercolor); + XRDB_LOAD_COLOR("dwm.color15", normfgcolor); XRDB_LOAD_COLOR("dwm.color0", normbgcolor); - XRDB_LOAD_COLOR("dwm.color4", normfgcolor); - XRDB_LOAD_COLOR("dwm.color8", selbordercolor); - XRDB_LOAD_COLOR("dwm.color4", selbgcolor); + XRDB_LOAD_COLOR("dwm.color10", normbordercolor); + XRDB_LOAD_COLOR("dwm.color10", normfloatcolor); XRDB_LOAD_COLOR("dwm.color0", selfgcolor); - XRDB_LOAD_COLOR("dwm.selbordercolor", selbordercolor); - XRDB_LOAD_COLOR("dwm.selfloatcolor", selfloatcolor); - XRDB_LOAD_COLOR("dwm.titlenormfgcolor", titlenormfgcolor); - XRDB_LOAD_COLOR("dwm.titlenormbgcolor", titlenormbgcolor); - XRDB_LOAD_COLOR("dwm.titlenormbordercolor", titlenormbordercolor); - XRDB_LOAD_COLOR("dwm.titlenormfloatcolor", titlenormfloatcolor); - XRDB_LOAD_COLOR("dwm.titleselfgcolor", titleselfgcolor); - XRDB_LOAD_COLOR("dwm.titleselbgcolor", titleselbgcolor); - XRDB_LOAD_COLOR("dwm.titleselbordercolor", titleselbordercolor); - XRDB_LOAD_COLOR("dwm.titleselfloatcolor", titleselfloatcolor); - XRDB_LOAD_COLOR("dwm.tagsnormfgcolor", tagsnormfgcolor); - XRDB_LOAD_COLOR("dwm.tagsnormbgcolor", tagsnormbgcolor); - XRDB_LOAD_COLOR("dwm.tagsnormbordercolor", tagsnormbordercolor); - XRDB_LOAD_COLOR("dwm.tagsnormfloatcolor", tagsnormfloatcolor); - XRDB_LOAD_COLOR("dwm.tagsselfgcolor", tagsselfgcolor); - XRDB_LOAD_COLOR("dwm.tagsselbgcolor", tagsselbgcolor); - XRDB_LOAD_COLOR("dwm.tagsselbordercolor", tagsselbordercolor); - XRDB_LOAD_COLOR("dwm.tagsselfloatcolor", tagsselfloatcolor); - XRDB_LOAD_COLOR("dwm.hidnormfgcolor", hidnormfgcolor); - XRDB_LOAD_COLOR("dwm.hidnormbgcolor", hidnormbgcolor); - XRDB_LOAD_COLOR("dwm.hidselfgcolor", hidselfgcolor); - XRDB_LOAD_COLOR("dwm.hidselbgcolor", hidselbgcolor); - XRDB_LOAD_COLOR("dwm.urgfgcolor", urgfgcolor); - XRDB_LOAD_COLOR("dwm.urgbgcolor", urgbgcolor); - XRDB_LOAD_COLOR("dwm.urgbordercolor", urgbordercolor); - XRDB_LOAD_COLOR("dwm.urgfloatcolor", urgfloatcolor); + XRDB_LOAD_COLOR("dwm.color14", selbgcolor); + XRDB_LOAD_COLOR("dwm.color12", selbordercolor); + XRDB_LOAD_COLOR("dwm.color12", selfloatcolor); + XRDB_LOAD_COLOR("dwm.color15", titlenormfgcolor); + XRDB_LOAD_COLOR("dwm.color0", titlenormbgcolor); + XRDB_LOAD_COLOR("dwm.color10", titlenormbordercolor); + XRDB_LOAD_COLOR("dwm.color10", titlenormfloatcolor); + XRDB_LOAD_COLOR("dwm.color0", titleselfgcolor); + XRDB_LOAD_COLOR("dwm.color14", titleselbgcolor); + XRDB_LOAD_COLOR("dwm.color12", titleselbordercolor); + XRDB_LOAD_COLOR("dwm.color12", titleselfloatcolor); + XRDB_LOAD_COLOR("dwm.color15", tagsnormfgcolor); + XRDB_LOAD_COLOR("dwm.color0", tagsnormbgcolor); + XRDB_LOAD_COLOR("dwm.color10", tagsnormbordercolor); + XRDB_LOAD_COLOR("dwm.color10", tagsnormfloatcolor); + XRDB_LOAD_COLOR("dwm.color0", tagsselfgcolor); + XRDB_LOAD_COLOR("dwm.color14", tagsselbgcolor); + XRDB_LOAD_COLOR("dwm.color12", tagsselbordercolor); + XRDB_LOAD_COLOR("dwm.color12", tagsselfloatcolor); + XRDB_LOAD_COLOR("dwm.color15", hidnormfgcolor); + XRDB_LOAD_COLOR("dwm.color0", hidnormbgcolor); + XRDB_LOAD_COLOR("dwm.color0", hidselfgcolor); + XRDB_LOAD_COLOR("dwm.color14", hidselbgcolor); + XRDB_LOAD_COLOR("dwm.color15", urgfgcolor); + XRDB_LOAD_COLOR("dwm.color3", urgbgcolor); + XRDB_LOAD_COLOR("dwm.color11", urgbordercolor); + XRDB_LOAD_COLOR("dwm.color11", urgfloatcolor); #if RENAMED_SCRATCHPADS_PATCH - XRDB_LOAD_COLOR("dwm.scratchselfgcolor", scratchselfgcolor); - XRDB_LOAD_COLOR("dwm.scratchselbgcolor", scratchselbgcolor); - XRDB_LOAD_COLOR("dwm.scratchselbordercolor", scratchselbordercolor); - XRDB_LOAD_COLOR("dwm.scratchselfloatcolor", scratchselfloatcolor); - XRDB_LOAD_COLOR("dwm.scratchnormfgcolor", scratchnormfgcolor); - XRDB_LOAD_COLOR("dwm.scratchnormbgcolor", scratchnormbgcolor); - XRDB_LOAD_COLOR("dwm.scratchnormbordercolor", scratchnormbordercolor); - XRDB_LOAD_COLOR("dwm.scratchnormfloatcolor", scratchnormfloatcolor); + XRDB_LOAD_COLOR("dwm.color0", scratchselfgcolor); + XRDB_LOAD_COLOR("dwm.color14", scratchselbgcolor); + XRDB_LOAD_COLOR("dwm.color14", scratchselbordercolor); + XRDB_LOAD_COLOR("dwm.color14", scratchselfloatcolor); + XRDB_LOAD_COLOR("dwm.color8", scratchnormfgcolor); + XRDB_LOAD_COLOR("dwm.color13", scratchnormbgcolor); + XRDB_LOAD_COLOR("dwm.color13", scratchnormbordercolor); + XRDB_LOAD_COLOR("dwm.color13", scratchnormfloatcolor); #endif // RENAMED_SCRATCHPADS_PATCH #if BAR_FLEXWINTITLE_PATCH XRDB_LOAD_COLOR("dwm.normTTBbgcolor", normTTBbgcolor); diff --git a/dwm-flexipatch/patches.def.h b/dwm-flexipatch/patches.def.h index 85065d5..065759b 100644 --- a/dwm-flexipatch/patches.def.h +++ b/dwm-flexipatch/patches.def.h @@ -130,7 +130,7 @@ * * https://dwm.suckless.org/patches/tag-previews/ */ -#define BAR_TAGPREVIEW_PATCH 0 +#define BAR_TAGPREVIEW_PATCH 1 /* Show status in bar */ #define BAR_STATUS_PATCH 1 @@ -423,7 +423,7 @@ * Essentially this way the colors you use in your regular tty is "mirrored" to dwm. * https://dwm.suckless.org/patches/vtcolors/ */ -#define BAR_VTCOLORS_PATCH 1 +#define BAR_VTCOLORS_PATCH 0 /* This patch allows client windows to be hidden. This code was originally part of awesomebar, * but has been separated out so that other bar modules can take advantage of it. @@ -532,7 +532,7 @@ * respective stack in tiled layout. * https://dwm.suckless.org/patches/cfacts/ */ -#define CFACTS_PATCH 0 +#define CFACTS_PATCH 1 /* This patch allows color attributes to be set through the command line. * https://dwm.suckless.org/patches/cmdcustomize/ @@ -575,14 +575,14 @@ /* Similarly to the dragmfact patch this allows you to click and drag clients to change the * cfact to adjust the client's size in the stack. This patch depends on the cfacts patch. */ -#define DRAGCFACT_PATCH 0 +#define DRAGCFACT_PATCH 1 /* This patch lets you resize the split in the tile layout (i.e. modify mfact) by holding * the modkey and dragging the mouse. * This patch can be a bit wonky with other layouts, but generally works. * https://dwm.suckless.org/patches/dragmfact/ */ -#define DRAGMFACT_PATCH 0 +#define DRAGMFACT_PATCH 1 /* Simple dwmc client using a fork of fsignal to communicate with dwm. * To use this either copy the patch/dwmc shell script to somewhere in your path or @@ -597,7 +597,7 @@ * it will be opened on the first tag. * https://dwm.suckless.org/patches/emptyview/ */ -#define EMPTYVIEW_PATCH 0 +#define EMPTYVIEW_PATCH 1 /* This patch allows the user to change size and placement of floating windows using only the * keyboard. It also allows for temporary vertical and horizontal extension of windows similar @@ -612,7 +612,7 @@ * This patch takes precedence over the fakefullscreen client patch below. * https://dwm.suckless.org/patches/fakefullscreen/ */ -#define FAKEFULLSCREEN_PATCH 0 +#define FAKEFULLSCREEN_PATCH 1 /* Similarly to the fakefullscreen patch this patch only allows clients to "fullscreen" into * the space currently given to them. @@ -826,13 +826,13 @@ /* Removes the border when there is only one window visible. * https://dwm.suckless.org/patches/noborder/ */ -#define NOBORDER_PATCH 0 +#define NOBORDER_PATCH 1 /* Enable modifying or removing dmenu in config.def.h which resulted previously in a * compilation error because two lines of code hardcode dmenu into dwm. * https://dwm.suckless.org/patches/nodmenu/ */ -#define NODMENU_PATCH 0 +#define NODMENU_PATCH 1 /* This patch allows for toggleable client button bindings that have no modifiers. * This can, for example, allow you to move or resize using the mouse alone without holding @@ -948,7 +948,7 @@ * Additionally dwm can quit cleanly by using kill -TERM dwmpid. * https://dwm.suckless.org/patches/restartsig/ */ -#define RESTARTSIG_PATCH 0 +#define RESTARTSIG_PATCH 1 /* Adds rio-like drawing to resize the selected client. * This depends on an external tool slop being installed. @@ -987,10 +987,10 @@ * https://lists.suckless.org/hackers/2004/17205.html * https://dwm.suckless.org/patches/scratchpads/ */ -#define SCRATCHPADS_PATCH 0 +#define SCRATCHPADS_PATCH 1 /* Minor alteration of the above allowing clients to keep their size and position when shown */ -#define SCRATCHPADS_KEEP_POSITION_AND_SIZE_PATCH 0 +#define SCRATCHPADS_KEEP_POSITION_AND_SIZE_PATCH 1 /* This alternative patch enables a scratchpad feature in dwm similar to the scratchpad * feature in i3wm. @@ -1064,7 +1064,7 @@ /* This variant of the shiftview patch adds left and right circular shift through tags, * but skips tags where there are no clients. */ -#define SHIFTVIEW_CLIENTS_PATCH 0 +#define SHIFTVIEW_CLIENTS_PATCH 1 /* This patch makes dwm obey even "soft" sizehints for new clients. Any window * that requests a specific initial size will be floated and set to that size. @@ -1133,7 +1133,7 @@ /* Adds toggleable keyboard shortcut to make a client 'sticky', i.e. visible on all tags. * https://dwm.suckless.org/patches/sticky/ */ -#define STICKY_PATCH 0 +#define STICKY_PATCH 1 /* This patch adds "window swallowing" to dwm as known from Plan 9's windowing system rio. * Clients marked with isterminal in config.h swallow a window opened by any child process, @@ -1150,7 +1150,7 @@ * * https://dwm.suckless.org/patches/swallow/ */ -#define SWALLOW_PATCH 0 +#define SWALLOW_PATCH 1 /* This patch depends on the pertag patch and makes it possible to switch focus with a single * shortcut (MOD+s) instead of having to think if you should use mod-j or mod-k for reaching @@ -1199,7 +1199,7 @@ /* Adds keyboard shortcuts to move all (or only floating) windows from one tag to another. * https://dwm.suckless.org/patches/tagall/ */ -#define TAGALL_PATCH 0 +#define TAGALL_PATCH 1 /* This patch allows you to move all visible windows on a monitor to an adjacent monitor. * https://github.com/bakkeby/patches/blob/master/dwm/dwm-tagallmon-6.2.diff diff --git a/dwm-flexipatch/startdwm b/dwm-flexipatch/startdwm deleted file mode 100755 index 1af269b..0000000 --- a/dwm-flexipatch/startdwm +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -systemctl --user restart clipmenud.service -xrdb -merge ~/.Xresources & -/usr/local/bin/slstatus & -paplay /usr/share/sounds/Oxygen-Sys-Special.ogg -exec ./dwm diff --git a/dwmblocks-async/.clang-format b/dwmblocks-async/.clang-format new file mode 100644 index 0000000..d9be3e2 --- /dev/null +++ b/dwmblocks-async/.clang-format @@ -0,0 +1,6 @@ +BasedOnStyle: Google +IndentWidth: 4 +ColumnLimit: 79 +AlignArrayOfStructures: Left +AlignConsecutiveMacros: true +AllowShortFunctionsOnASingleLine: None diff --git a/dwmblocks-async/.clangd b/dwmblocks-async/.clangd new file mode 100644 index 0000000..6c32dd2 --- /dev/null +++ b/dwmblocks-async/.clangd @@ -0,0 +1,6 @@ +CompileFlags: + Add: + - "-I." + - "-I./inc" + - "-I.." + - "-I../inc" diff --git a/dwmblocks-async/.gitignore b/dwmblocks-async/.gitignore new file mode 100644 index 0000000..9056e50 --- /dev/null +++ b/dwmblocks-async/.gitignore @@ -0,0 +1,3 @@ +build/ +.cache/ +dwmblocks diff --git a/dwmblocks-async/LICENSE b/dwmblocks-async/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/dwmblocks-async/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/dwmblocks-async/Makefile b/dwmblocks-async/Makefile new file mode 100644 index 0000000..0d8d60e --- /dev/null +++ b/dwmblocks-async/Makefile @@ -0,0 +1,54 @@ +.POSIX: + +BIN := dwmblocks +BUILD_DIR := build +SRC_DIR := src +INC_DIR := inc + +VERBOSE := 0 + +PREFIX := /usr/local +CC = cc +CFLAGS := -Wall -Wextra -Ofast -I. -I$(INC_DIR) +CFLAGS += -Wall -Wextra -Wno-missing-field-initializers +LDLIBS := -lX11 + +VPATH := $(SRC_DIR) +OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(wildcard $(SRC_DIR)/*.c)) +OBJS += $(patsubst %.c,$(BUILD_DIR)/%.o,$(wildcard *.c)) + +INSTALL_DIR := $(DESTDIR)$(PREFIX)/bin + +# Prettify output +PRINTF := @printf "%-8s %s\n" +ifeq ($(VERBOSE), 0) + Q := @ +endif + +all: $(BUILD_DIR)/$(BIN) + +$(BUILD_DIR)/$(BIN): $(OBJS) + $(PRINTF) "LD" $@ + $Q$(LINK.o) $^ $(LDLIBS) -o $@ + +$(BUILD_DIR)/%.o: %.c config.h | $(BUILD_DIR) + $(PRINTF) "CC" $@ + $Q$(COMPILE.c) -o $@ $< + +$(BUILD_DIR): + $(PRINTF) "MKDIR" $@ + $Qmkdir -p $@ + +clean: + $(PRINTF) "CLEAN" $(BUILD_DIR) + $Q$(RM) $(BUILD_DIR)/* + +install: $(BUILD_DIR)/$(BIN) + $(PRINTF) "INSTALL" $(INSTALL_DIR)/$(BIN) + $Qinstall -D -m 755 $< $(INSTALL_DIR)/$(BIN) + +uninstall: + $(PRINTF) "RM" $(INSTALL_DIR)/$(BIN) + $Q$(RM) $(INSTALL_DIR)/$(BIN) + +.PHONY: all clean install uninstall diff --git a/dwmblocks-async/README.md b/dwmblocks-async/README.md new file mode 100644 index 0000000..2006457 --- /dev/null +++ b/dwmblocks-async/README.md @@ -0,0 +1,161 @@ +# dwmblocks-async + +A [`dwm`](https://dwm.suckless.org) status bar that has a modular, async +design, so it is always responsive. Imagine `i3blocks`, but for `dwm`. + +![A lean config of dwmblocks-async.](preview.png) + +## Features + +- [Modular](#modifying-the-blocks) +- Lightweight +- [Suckless](https://suckless.org/philosophy) +- Blocks: + - [Clickable](#clickable-blocks) + - Loaded asynchronously + - [Updates can be externally triggered](#signalling-changes) +- Compatible with `i3blocks` scripts + +> Additionally, this build of `dwmblocks` is more optimized and fixes the +> flickering of the status bar when scrolling. + +## Why `dwmblocks`? + +In `dwm`, you have to set the status bar through an infinite loop, like so: + +```sh +while :; do + xsetroot -name "$(date)" + sleep 30 +done +``` + +This is inefficient when running multiple commands that need to be updated at +different frequencies. For example, to display an unread mail count and a clock +in the status bar: + +```sh +while :; do + xsetroot -name "$(mailCount) $(date)" + sleep 60 +done +``` + +Both are executed at the same rate, which is wasteful. Ideally, the mail +counter would be updated every thirty minutes, since there's a limit to the +number of requests I can make using Gmail's APIs (as a free user). + +`dwmblocks` allows you to divide the status bar into multiple blocks, each of +which can be updated at its own interval. This effectively addresses the +previous issue, because the commands in a block are only executed once within +that time frame. + +## Why `dwmblocks-async`? + +The magic of `dwmblocks-async` is in the `async` part. Since vanilla +`dwmblocks` executes the commands of each block sequentially, it leads to +annoying freezes. In cases where one block takes several seconds to execute, +like in the mail and date blocks example from above, the delay is clearly +visible. Fire up a new instance of `dwmblocks` and you'll see! + +With `dwmblocks-async`, the computer executes each block asynchronously +(simultaneously). + +## Installation + +Clone this repository, modify `config.h` appropriately, then compile the +program: + +```sh +git clone https://github.com/UtkarshVerma/dwmblocks-async.git +cd dwmblocks-async +vi config.h +sudo make install +``` + +## Usage + +To set `dwmblocks-async` as your status bar, you need to run it as a background +process on startup. One way is to add the following to `~/.xinitrc`: + +```sh +# The binary of `dwmblocks-async` is named `dwmblocks` +dwmblocks & +``` + +### Modifying the blocks + +You can define your status bar blocks in `config.c`: + +```c +Block blocks[] = { + ... + {"volume", 0, 5}, + {"date", 1800, 1}, + ... +} +``` + +Each block has the following properties: + +| Property | Description | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Command | The command you wish to execute in your block. | +| Update interval | Time in seconds, after which you want the block to update. If `0`, the block will never be updated. | +| Update signal | Signal to be used for triggering the block. Must be a positive integer. If `0`, a signal won't be set up for the block and it will be unclickable. | + +Apart from defining the blocks, features can be toggled through `config.h`: + +```c +// Maximum possible length of output from block, expressed in number of characters. +#define CMDLENGTH 50 + +// The status bar's delimiter that appears in between each block. +#define DELIMITER " " + +// Adds a leading delimiter to the status bar, useful for powerline. +#define LEADING_DELIMITER 1 + +// Enable clickability for blocks. See the "Clickable blocks" section below. +#define CLICKABLE_BLOCKS 1 +``` + +### Signalling changes + +Most status bars constantly rerun all scripts every few seconds. This is an +option here, but a superior choice is to give your block a signal through which +you can indicate it to update on relevant event, rather than have it rerun +idly. + +For example, the volume block has the update signal `5` by default. I run +`kill -39 $(pidof dwmblocks)` alongside my volume shortcuts in `dwm` to only +update it when relevant. Just add `34` to your signal number! You could also +run `pkill -RTMIN+5 dwmblocks`, but it's slower. + +To refresh all the blocks, run `kill -10 $(pidof dwmblocks)` or +`pkill -SIGUSR1 dwmblocks`. + +> All blocks must have different signal numbers! + +### Clickable blocks + +Like `i3blocks`, this build allows you to build in additional actions into your +scripts in response to click events. You can check out +[my status bar scripts](https://github.com/UtkarshVerma/dotfiles/tree/main/.local/bin/statusbar) +as references for using the `$BLOCK_BUTTON` variable. + +To use this feature, define the `CLICKABLE_BLOCKS` feature macro in your +`config.h`: + +```c +#define CLICKABLE_BLOCKS 1 +``` + +Apart from that, you need `dwm` to be patched with +[statuscmd](https://dwm.suckless.org/patches/statuscmd/). + +## Credits + +This work would not have been possible without +[Luke's build of dwmblocks](https://github.com/LukeSmithxyz/dwmblocks) and +[Daniel Bylinka's statuscmd patch](https://dwm.suckless.org/patches/statuscmd/). diff --git a/dwmblocks-async/config.c b/dwmblocks-async/config.c new file mode 100644 index 0000000..bf0da3f --- /dev/null +++ b/dwmblocks-async/config.c @@ -0,0 +1,15 @@ +#include "config.h" + +#include "block.h" +#include "util.h" + +Block blocks[] = { + {"sb-disk", 1800, 1 }, + {"sb-memory", 10, 2 }, + {"sb-loadavg", 5, 3 }, + {"sb-record", 0, 4 }, + {"sb-volume", 1, 5 }, + {"sb-date", 1, 6 }, +}; + +const unsigned short blockCount = LEN(blocks); diff --git a/dwmblocks-async/config.h b/dwmblocks-async/config.h new file mode 100644 index 0000000..235ee71 --- /dev/null +++ b/dwmblocks-async/config.h @@ -0,0 +1,6 @@ +#pragma once + +#define CLICKABLE_BLOCKS 1 // Enable clickability for blocks +#define CMDLENGTH 45 // Trim block output to this length +#define DELIMITER " " // Delimiter string used to separate blocks +#define LEADING_DELIMITER 0 // Whether a leading separator should be used diff --git a/dwmblocks-async/inc/bar.h b/dwmblocks-async/inc/bar.h new file mode 100644 index 0000000..377886e --- /dev/null +++ b/dwmblocks-async/inc/bar.h @@ -0,0 +1,15 @@ +#pragma once +#include "block.h" +#include "config.h" +#include "util.h" + +typedef struct { + char *current; + char *previous; +} BarStatus; + +extern unsigned short debugMode; + +void initStatus(BarStatus *); +void freeStatus(BarStatus *); +void writeStatus(BarStatus *); diff --git a/dwmblocks-async/inc/block.h b/dwmblocks-async/inc/block.h new file mode 100644 index 0000000..f0d264c --- /dev/null +++ b/dwmblocks-async/inc/block.h @@ -0,0 +1,17 @@ +#pragma once +#include "config.h" + +typedef struct { + const char *command; + const unsigned int interval; + const unsigned int signal; + int pipe[2]; + char output[CMDLENGTH * 4 + 1]; +} Block; + +extern Block blocks[]; +extern const unsigned short blockCount; + +void execBlock(const Block *, const char *); +void execBlocks(unsigned int); +void updateBlock(Block *); diff --git a/dwmblocks-async/inc/util.h b/dwmblocks-async/inc/util.h new file mode 100644 index 0000000..bfc030d --- /dev/null +++ b/dwmblocks-async/inc/util.h @@ -0,0 +1,8 @@ +#pragma once + +#define LEN(arr) (sizeof(arr) / sizeof(arr[0])) +#define MAX(a, b) (a > b ? a : b) + +int gcd(int, int); +void closePipe(int[2]); +void trimUTF8(char*, unsigned int); diff --git a/dwmblocks-async/inc/x11.h b/dwmblocks-async/inc/x11.h new file mode 100644 index 0000000..abb4f0f --- /dev/null +++ b/dwmblocks-async/inc/x11.h @@ -0,0 +1,5 @@ +#pragma once + +int setupX(); +int closeX(); +void setXRootName(char *); diff --git a/dwmblocks-async/preview.png b/dwmblocks-async/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0027495a22428f96da28541a827ae826d15d79 GIT binary patch literal 54091 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 +#include +#include + +#include "block.h" +#include "x11.h" + +void initStatus(BarStatus *status) { + const unsigned int statusLength = + (blockCount * (LEN(blocks[0].output) - 1)) + + (blockCount - 1 + LEADING_DELIMITER) * (LEN(DELIMITER) - 1); + + status->current = (char *)malloc(statusLength); + status->previous = (char *)malloc(statusLength); + status->current[0] = '\0'; + status->previous[0] = '\0'; +} + +void freeStatus(BarStatus *status) { + free(status->current); + free(status->previous); +} + +int updateStatus(BarStatus *status) { + strcpy(status->previous, status->current); + status->current[0] = '\0'; + + for (int i = 0; i < blockCount; i++) { + Block *block = blocks + i; + + if (strlen(block->output)) { +#if LEADING_DELIMITER + strcat(status->current, DELIMITER); +#else + if (status->current[0]) strcat(status->current, DELIMITER); +#endif + +#if CLICKABLE_BLOCKS + if (!debugMode && block->signal) { + char signal[] = {block->signal, '\0'}; + strcat(status->current, signal); + } +#endif + + strcat(status->current, block->output); + } + } + return strcmp(status->current, status->previous); +} + +void writeStatus(BarStatus *status) { + // Only write out if status has changed + if (!updateStatus(status)) return; + + if (debugMode) { + printf("%s\n", status->current); + return; + } + setXRootName(status->current); +} diff --git a/dwmblocks-async/src/block.c b/dwmblocks-async/src/block.c new file mode 100644 index 0000000..ae50ea5 --- /dev/null +++ b/dwmblocks-async/src/block.c @@ -0,0 +1,72 @@ +#include "block.h" + +#define _GNU_SOURCE +#include +#include +#include +#include + +#include "util.h" + +static int execLock = 0; + +void execBlock(const Block *block, const char *button) { + unsigned short i = block - blocks; + + // Ensure only one child process exists per block at an instance + if (execLock & 1 << i) return; + // Lock execution of block until current instance finishes execution + execLock |= 1 << i; + + if (fork() == 0) { + close(block->pipe[0]); + dup2(block->pipe[1], STDOUT_FILENO); + close(block->pipe[1]); + + if (button) setenv("BLOCK_BUTTON", button, 1); + + FILE *file = popen(block->command, "r"); + if (!file) { + printf("\n"); + exit(EXIT_FAILURE); + } + + // Buffer will hold both '\n' and '\0' + char buffer[LEN(block->output) + 1]; + if (fgets(buffer, LEN(buffer), file) == NULL) { + // Send an empty line in case of no output + printf("\n"); + exit(EXIT_SUCCESS); + } + pclose(file); + + // Trim to the max possible UTF-8 capacity + trimUTF8(buffer, LEN(buffer)); + + printf("%s\n", buffer); + exit(EXIT_SUCCESS); + } +} + +void execBlocks(unsigned int time) { + for (int i = 0; i < blockCount; i++) { + const Block *block = blocks + i; + if (time == 0 || + (block->interval != 0 && time % block->interval == 0)) { + execBlock(block, NULL); + } + } +} + +void updateBlock(Block *block) { + char buffer[LEN(block->output)]; + int bytesRead = read(block->pipe[0], buffer, LEN(buffer)); + + // String from pipe will always end with '\n' + buffer[bytesRead - 1] = '\0'; + + strcpy(block->output, buffer); + + // Remove execution lock for the current block + execLock &= ~(1 << (block - blocks)); +} diff --git a/dwmblocks-async/src/main.c b/dwmblocks-async/src/main.c new file mode 100644 index 0000000..8b87b63 --- /dev/null +++ b/dwmblocks-async/src/main.c @@ -0,0 +1,157 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#include "bar.h" +#include "block.h" +#include "util.h" +#include "x11.h" + +static unsigned short statusContinue = 1; +unsigned short debugMode = 0; +static int epollFD, signalFD; +static unsigned int timerTick = 0, maxInterval = 1; + +void signalHandler() { + struct signalfd_siginfo info; + read(signalFD, &info, sizeof(info)); + unsigned int signal = info.ssi_signo; + + static unsigned int timer = 0; + switch (signal) { + case SIGALRM: + // Schedule the next timer event and execute blocks + alarm(timerTick); + execBlocks(timer); + + // Wrap `timer` to the interval [1, `maxInterval`] + timer = (timer + timerTick - 1) % maxInterval + 1; + return; + case SIGUSR1: + // Update all blocks on receiving SIGUSR1 + execBlocks(0); + return; + } + + for (int j = 0; j < blockCount; j++) { + const Block *block = blocks + j; + if (block->signal == signal - SIGRTMIN) { + char button[4]; // value can't be more than 255; + sprintf(button, "%d", info.ssi_int & 0xff); + execBlock(block, button); + break; + } + } +} + +void termHandler() { + statusContinue = 0; +} + +void setupSignals() { + sigset_t handledSignals; + sigemptyset(&handledSignals); + sigaddset(&handledSignals, SIGUSR1); + sigaddset(&handledSignals, SIGALRM); + + // Append all block signals to `handledSignals` + for (int i = 0; i < blockCount; i++) + if (blocks[i].signal > 0) + sigaddset(&handledSignals, SIGRTMIN + blocks[i].signal); + + // Create a signal file descriptor for epoll to watch + signalFD = signalfd(-1, &handledSignals, 0); + + // Block all realtime and handled signals + for (int i = SIGRTMIN; i <= SIGRTMAX; i++) sigaddset(&handledSignals, i); + sigprocmask(SIG_BLOCK, &handledSignals, NULL); + + // Handle termination signals + signal(SIGINT, termHandler); + signal(SIGTERM, termHandler); + + // Avoid zombie subprocesses + struct sigaction signalAction; + signalAction.sa_handler = SIG_DFL; + sigemptyset(&signalAction.sa_mask); + signalAction.sa_flags = SA_NOCLDWAIT; + sigaction(SIGCHLD, &signalAction, 0); +} + +void statusLoop() { + // Update all blocks initially + raise(SIGALRM); + + BarStatus status; + initStatus(&status); + struct epoll_event events[blockCount + 1]; + while (statusContinue) { + int eventCount = epoll_wait(epollFD, events, LEN(events), 100); + for (int i = 0; i < eventCount; i++) { + unsigned short id = events[i].data.u32; + if (id < blockCount) { + updateBlock(blocks + id); + } else { + signalHandler(); + } + } + + if (eventCount != -1) writeStatus(&status); + } + freeStatus(&status); +} + +void init() { + epollFD = epoll_create(blockCount); + struct epoll_event event = { + .events = EPOLLIN, + }; + + for (int i = 0; i < blockCount; i++) { + // Append each block's pipe's read end to `epollFD` + pipe(blocks[i].pipe); + event.data.u32 = i; + epoll_ctl(epollFD, EPOLL_CTL_ADD, blocks[i].pipe[0], &event); + + // Calculate the max interval and tick size for the timer + if (blocks[i].interval) { + maxInterval = MAX(blocks[i].interval, maxInterval); + timerTick = gcd(blocks[i].interval, timerTick); + } + } + + setupSignals(); + + // Watch signal file descriptor as well + event.data.u32 = blockCount; + epoll_ctl(epollFD, EPOLL_CTL_ADD, signalFD, &event); +} + +int main(const int argc, const char *argv[]) { + if (setupX()) { + fprintf(stderr, "%s\n", "dwmblocks: Failed to open display"); + return 1; + } + + for (int i = 0; i < argc; i++) { + if (!strcmp("-d", argv[i])) { + debugMode = 1; + break; + } + } + + init(); + statusLoop(); + + if (closeX()) + fprintf(stderr, "%s\n", "dwmblocks: Failed to close display"); + + close(epollFD); + close(signalFD); + for (int i = 0; i < blockCount; i++) closePipe(blocks[i].pipe); + + return 0; +} diff --git a/dwmblocks-async/src/util.c b/dwmblocks-async/src/util.c new file mode 100644 index 0000000..157e626 --- /dev/null +++ b/dwmblocks-async/src/util.c @@ -0,0 +1,41 @@ +#include "util.h" + +#include + +int gcd(int a, int b) { + int temp; + while (b > 0) { + temp = a % b; + a = b; + b = temp; + } + return a; +} + +void closePipe(int pipe[2]) { + close(pipe[0]); + close(pipe[1]); +} + +void trimUTF8(char* buffer, unsigned int size) { + int length = (size - 1) / 4; + int count = 0, j = 0; + char ch = buffer[j]; + while (ch != '\0' && ch != '\n' && count < length) { + // Skip continuation bytes, if any + int skip = 1; + while ((ch & 0xc0) > 0x80) { + ch <<= 1; + skip++; + } + + j += skip; + ch = buffer[j]; + count++; + } + + // Trim trailing newline and spaces + buffer[j] = ' '; + while (j >= 0 && buffer[j] == ' ') j--; + buffer[j + 1] = '\0'; +} diff --git a/dwmblocks-async/src/x11.c b/dwmblocks-async/src/x11.c new file mode 100644 index 0000000..63c5d14 --- /dev/null +++ b/dwmblocks-async/src/x11.c @@ -0,0 +1,25 @@ +#include "x11.h" + +#include + +static Display *display; +static Window rootWindow; + +int setupX() { + display = XOpenDisplay(NULL); + if (!display) { + return 1; + } + + rootWindow = DefaultRootWindow(display); + return 0; +} + +int closeX() { + return XCloseDisplay(display); +} + +void setXRootName(char *str) { + XStoreName(display, rootWindow, str); + XFlush(display); +} diff --git a/pics/neofetch.png b/pics/neofetch.png deleted file mode 100644 index 35cae46c94268d57ef1dacfb5ca8843b9a3cf77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200423 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

hEVEGg*1;jGr*C{}N;D5ebo9dI)hniD9>`bI z+dr4D5f92ZfHH+wdA0+ZVdhCb)j2h*YX<-20(8cnx|?PFwjX#E3uB8gRsq%i)Gx{KJ%`}n^bU>m}eR}I63ifa^mAv;u>A>6I~;1Eqt1R z0sx<1)}KB&5J2Ysr<--s8XAnXm*ao|D=*}vc?xI#h01x;@$9=@pbA3O z8C}q2Z|QseP}YK**WqZgm{a&$i&4A3-P);V=c^Euki$DEovF&M``Wl`rDw|0ViEac z=O2nLB+5ND&w}P2>t$?vv9D}3c{ST{H8SH**-l*i5olsxlE-*I9Nw!Q7;7fY!VBg- zIV3Kt*A=P`3kPUSPX3Zy>H$hyPg_Tc`41G{jcQe%^g+)Prg~6#jFpa*u zY%X4<{{AN*A+`h=MMV)dg5*vKp#goH+uI|)dk4;<5DQ=r0Rv%kNTUfDDDYjUeKjqb zXvj;3^wEHF6|OFAf?)=1dJ!(`WkEPMwAlDJw%i5m0Tk^yv=>f+gJSN`l~2kqKVPTL zUAxqJf%*arUa}0;3`IU;-w~dK3ah6Wf-b-(yg&4%A<=XUr`XM92iVzU>FDz7(GG&- zfMGucV>n)0nx~MG(zv(W#nt|0H z|K)PPRX`{4{2+&3ollFQ>G&Z1`Sy-`-0XR$^?ssRS~|ZUCk3NxXwg@f@cA9y{fGz^ zL8rbxXRGyNt-mYcWS9BzdTxBf`)%zL5<;ynB5FDxiqtjz1SVy-o_Juk9Fy4jpVEz! zJ~^j9cs&v;r6as;FyN@imlvj3IWNf*AckY8q2_

~%?U8P&DT&0iI|fJ?x)LiakX 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 z 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%0DsW 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 X)UF*7nB~EQ*WO(RcgAejKmY#$%Ec4v diff --git a/dmenu/scripts/dboard b/scripts/dmenu/dboard similarity index 100% rename from dmenu/scripts/dboard rename to scripts/dmenu/dboard diff --git a/dmenu/scripts/dcalc b/scripts/dmenu/dcalc similarity index 100% rename from dmenu/scripts/dcalc rename to scripts/dmenu/dcalc diff --git a/dmenu/scripts/shutdown.sh b/scripts/dmenu/shutdown.sh similarity index 100% rename from dmenu/scripts/shutdown.sh rename to scripts/dmenu/shutdown.sh diff --git a/scripts/dwmblocks/musicup b/scripts/dwmblocks/musicup new file mode 100755 index 0000000..55e9585 --- /dev/null +++ b/scripts/dwmblocks/musicup @@ -0,0 +1,12 @@ +#!/bin/sh +# This loop will update the music statusbar module whenever a command changes the +# music player's status. mpd and must be running on X's start for this to work. + +{ + playerctl metadata -F -f "{{title}}{{artist}}{{status}}" & + while ! mpc idleloop 2>/dev/null; do + sleep 1 + done +} | while read -r _; do + pkill -RTMIN+2 "$STATUSBAR" +done diff --git a/scripts/dwmblocks/sb-battery b/scripts/dwmblocks/sb-battery new file mode 100755 index 0000000..bf4a07b --- /dev/null +++ b/scripts/dwmblocks/sb-battery @@ -0,0 +1,53 @@ +#!/bin/sh +# Prints all batteries, their percentage remaining and an emoji corresponding +# to charge status (🔌 for plugged up, 🔋 for discharging on battery, etc.). + +notify() { + notify-send -i battery-good-symbolic \ + -h string:x-canonical-private-synchronous:battery \ + "Battery" "$1" -t 4000 +} + +case "$BLOCK_BUTTON" in + 1) notify "$(acpi -b | awk -F ': |, ' '{printf "%s\n%s\n", $2, $4}')" ;; + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +. sb-theme + +# Loop through all attached batteries and format the info +for battery in /sys/class/power_supply/BAT?*; do + # If non-first battery, print a space separator. + [ -n "${capacity+x}" ] && printf " " + + capacity="$(cat "$battery/capacity" 2>&1)" + if [ "$capacity" -gt 90 ]; then + status=" " + elif [ "$capacity" -gt 60 ]; then + status=" " + elif [ "$capacity" -gt 40 ]; then + status=" " + elif [ "$capacity" -gt 10 ]; then + status=" " + else + status=" " + fi + + # Sets up the status and capacity + case "$(cat "$battery/status" 2>&1)" in + Full) status=" " ;; + Discharging) + if [ "$capacity" -le 20 ]; then + status="$status" + color=1 + fi + ;; + Charging) status="󰚥$status" ;; + "Not charging") status=" " ;; + Unknown) status="? $status" ;; + *) exit 1 ;; + esac + + # Prints the info + display "$status$capacity%" "$color" +done && echo diff --git a/scripts/dwmblocks/sb-date b/scripts/dwmblocks/sb-date new file mode 100755 index 0000000..0d4aca5 --- /dev/null +++ b/scripts/dwmblocks/sb-date @@ -0,0 +1,23 @@ +#!/bin/sh +# Displays the current time in HH:MM:SS (AM|PM) + +notify() { + notify-send -i office-calendar-symbolic \ + -h string:x-canonical-private-synchronous:"$1" "$@" +} + +case $BLOCK_BUTTON in + 1) + notify "This Month" "$(cal --color=always | + sed "s|..7m||;s|..0m||")" + appointments="$(calcurse -d1 \ + --format-apt "• %S - %E\n %m\n" \ + --format-event "• %m\n")" + [ -n "$appointments" ] && notify "Appointments" "$appointments" + ;; + 2) setsid -f "$TERMINAL" -e calcurse ;; + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +. sb-theme +display " $(date '+%I:%M:%S %p')" diff --git a/scripts/dwmblocks/sb-disk b/scripts/dwmblocks/sb-disk new file mode 100755 index 0000000..8f4b688 --- /dev/null +++ b/scripts/dwmblocks/sb-disk @@ -0,0 +1,16 @@ +#!/bin/sh +# Displays the disk usages of root and home partitions. + +case $BLOCK_BUTTON in + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +. sb-theme +fetchDiskUsage() { + avail=$(df "$1" | awk 'NR==2 {printf "%2.1f", ($4 / 1024 / 1024)}') + percentUsed=$(df "$1" | awk -F'[^0-9]*' 'NR==2 {print $5}') + [ "$percentUsed" -le 10 ] && color=10 + display "${avail}G" "$color" +} + +echo "$(display 󰋊) $(fetchDiskUsage /)$(display "|")$(fetchDiskUsage /home)" diff --git a/scripts/dwmblocks/sb-loadavg b/scripts/dwmblocks/sb-loadavg new file mode 100755 index 0000000..ca242ab --- /dev/null +++ b/scripts/dwmblocks/sb-loadavg @@ -0,0 +1,13 @@ +#!/bin/sh +# Displays the average CPU load. + +case $BLOCK_BUTTON in + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +threshold=5 +load=$(cut -d' ' -f1 /proc/loadavg) + +. sb-theme +[ 1 -eq "$(echo "$load > $threshold" | bc)" ] && color=9 +display " $load" "$color" diff --git a/scripts/dwmblocks/sb-mail b/scripts/dwmblocks/sb-mail new file mode 100755 index 0000000..327b182 --- /dev/null +++ b/scripts/dwmblocks/sb-mail @@ -0,0 +1,34 @@ +#!/bin/sh +# Displays unread mail count for my email addresses. + +# Keep retrying until internet is there +while ! wget --spider -q http://example.com; do + sleep 10 +done + +tokens="token.json college_token.json" +icons=" : " + +# Display work mail info during work hours only +hour="$(date +"%H")" +if [ "$(date +"%u")" -lt 6 ] && [ "$hour" -gt 9 ] && [ "$hour" -le 18 ]; then + tokens="$tokens work_token.json" + icons="$icons: " +fi + +counts="" +for token in $tokens; do + tokenFile="$XDG_CACHE_HOME/qgmail/$token" + [ ! -f "$tokenFile" ] && continue + + icon="${icons%%:*}" + icons="${icons#*:}" + i=$((i + 1)) + count="$(qgmail --token "$tokenFile" request \ + users.labels.get me INBOX | jq -r '.messagesUnread // empty')" + counts="$counts${count:+"${counts:+" "}$icon$count"}" +done + +[ -z "$counts" ] && exit +. sb-theme +display "$counts" diff --git a/scripts/dwmblocks/sb-memory b/scripts/dwmblocks/sb-memory new file mode 100755 index 0000000..1a0cbd5 --- /dev/null +++ b/scripts/dwmblocks/sb-memory @@ -0,0 +1,9 @@ +#!/bin/sh +# Displays RAM usage. + +case $BLOCK_BUTTON in + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +. sb-theme +display " $(free --mebi | awk 'NR==2 {printf ("%2.2fGiB\n", ($3 / 1024))}')" diff --git a/scripts/dwmblocks/sb-mic b/scripts/dwmblocks/sb-mic new file mode 100755 index 0000000..3c2dbfd --- /dev/null +++ b/scripts/dwmblocks/sb-mic @@ -0,0 +1,7 @@ +#!/bin/sh +# Display an icon if the microphone is muted. + +if pactl get-source-mute @DEFAULT_SOURCE@ | grep -q yes; then + . sb-theme + display "" +fi diff --git a/scripts/dwmblocks/sb-music b/scripts/dwmblocks/sb-music new file mode 100755 index 0000000..22c0b21 --- /dev/null +++ b/scripts/dwmblocks/sb-music @@ -0,0 +1,27 @@ +#!/bin/sh +# Display currently playing music metadata. + +case "$BLOCK_BUTTON" in + 1) musicctl prev ;; + 2) musicctl toggle ;; + 3) musicctl next ;; + 4) musicctl seek +5 ;; + 5) musicctl seek -5 ;; + 6) terminal -e "$EDITOR" "$0" ;; +esac + +set -- --player spotify,mpv,%any +icon="" +pausedIcon="" +if status="$(playerctl "$@" status 2>&1)" && [ "$status" != "Stopped" ]; then + [ "$status" = "Paused" ] && icon="$pausedIcon" + currentSong="$(playerctl "$@" metadata --format "{{title}} - {{artist}}")" +else + [ "$(mpc status "%state%")" = "paused" ] && icon="$pausedIcon" + currentSong="$(mpc current -f "%title%[ - %artist%]")" +fi + +[ -z "$currentSong" ] && exit + +. sb-theme +display "$icon $currentSong" diff --git a/scripts/dwmblocks/sb-record b/scripts/dwmblocks/sb-record new file mode 100755 index 0000000..a079b1d --- /dev/null +++ b/scripts/dwmblocks/sb-record @@ -0,0 +1,7 @@ +#!/bin/sh +# Displays an indicator during screen records. + +if [ -f /tmp/record ]; then + . sb-theme + display "" +fi diff --git a/scripts/dwmblocks/sb-theme b/scripts/dwmblocks/sb-theme new file mode 100755 index 0000000..e82001e --- /dev/null +++ b/scripts/dwmblocks/sb-theme @@ -0,0 +1,32 @@ +#!/bin/sh +# Utility functions for theming statusbar scripts. + +display() { + if [ -n "$2" ]; then + color="$2" + else + case "$(basename "$0")" in + sb-mail) color=13 ;; + sb-music) color=14 ;; + sb-disk) color=10 ;; + sb-memory) color=15 ;; + sb-loadavg) color=11 ;; + sb-mic) color=9 ;; + sb-record) color=9 ;; + sb-volume) color=15 ;; + sb-battery) color=14 ;; + sb-date) color=12 ;; + sb-network) color=9 ;; + *) color=15 ;; + esac + fi + + case "$STATUSBAR" in + "dwmblocks") + echo "^C$color^$1" + ;; + *) + echo "$1" + ;; + esac +} diff --git a/scripts/dwmblocks/sb-volume b/scripts/dwmblocks/sb-volume new file mode 100755 index 0000000..bd8c046 --- /dev/null +++ b/scripts/dwmblocks/sb-volume @@ -0,0 +1,28 @@ +#!/bin/sh + +case $BLOCK_BUTTON in + 1) setsid -f "$TERMINAL" -e pulsemixer ;; + 2) pamixer -t ;; + 4) pamixer -i 3 ;; + 5) pamixer -d 3 ;; + 6) "$TERMINAL" -e "$EDITOR" "$0" ;; +esac + +. sb-theme +if [ "$(pamixer --get-mute)" = true ]; then + display " " 9 + exit +fi + +vol="$(pamixer --get-volume)" +[ $? -ne 0 ] && [ -z "$vol" ] && exit 1 + +if [ "$vol" -gt 40 ]; then + icon=" " +elif [ "$vol" -gt 15 ]; then + icon=" " +else + icon=" " +fi + +display "$icon$vol%" diff --git a/slock-flexipatch/.gitignore b/slock-flexipatch/.gitignore new file mode 100644 index 0000000..d79332d --- /dev/null +++ b/slock-flexipatch/.gitignore @@ -0,0 +1,5 @@ +slock +*.o +dwm +config.h +patches.h diff --git a/slock-flexipatch/LICENSE b/slock-flexipatch/LICENSE new file mode 100644 index 0000000..2e4419b --- /dev/null +++ b/slock-flexipatch/LICENSE @@ -0,0 +1,24 @@ +MIT/X Consortium License + +© 2015-2016 Markus Teich +© 2014 Dimitris Papastamos +© 2006-2014 Anselm R Garbe +© 2014-2016 Laslo Hunhold + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/slock-flexipatch/Makefile b/slock-flexipatch/Makefile new file mode 100644 index 0000000..0caaef0 --- /dev/null +++ b/slock-flexipatch/Makefile @@ -0,0 +1,65 @@ +# slock - simple screen locker +# See LICENSE file for copyright and license details. + +include config.mk + +SRC = slock.c ${COMPATSRC} +OBJ = ${SRC:.c=.o} + +all: options slock + +options: + @echo slock build options: + @echo "CFLAGS = ${CFLAGS}" + @echo "LDFLAGS = ${LDFLAGS}" + @echo "CC = ${CC}" + +.c.o: + @echo CC $< + @${CC} -c ${CFLAGS} $< + +${OBJ}: config.h config.mk arg.h util.h patches.h + +config.h: + @echo creating $@ from config.def.h + @cp config.def.h $@ + +patches.h: + @echo creating $@ from patches.def.h + @cp patches.def.h $@ + +slock: ${OBJ} + @echo CC -o $@ + @${CC} -o $@ ${OBJ} ${LDFLAGS} + +clean: + @echo cleaning + @rm -f slock ${OBJ} slock-${VERSION}.tar.gz + +dist: clean + @echo creating dist tarball + @mkdir -p slock-${VERSION} + @cp -R LICENSE Makefile README slock.1 config.mk \ + ${SRC} config.def.h arg.h util.h slock-${VERSION} + @tar -cf slock-${VERSION}.tar slock-${VERSION} + @gzip slock-${VERSION}.tar + @rm -rf slock-${VERSION} + +install: all + @echo installing executable file to ${DESTDIR}${PREFIX}/bin + @mkdir -p ${DESTDIR}${PREFIX}/bin + @cp -f slock ${DESTDIR}${PREFIX}/bin + @chmod 755 ${DESTDIR}${PREFIX}/bin/slock + @chmod u+s ${DESTDIR}${PREFIX}/bin/slock + @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 + @mkdir -p ${DESTDIR}${MANPREFIX}/man1 + @sed "s/VERSION/${VERSION}/g" ${DESTDIR}${MANPREFIX}/man1/slock.1 + @chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1 + +uninstall: + @echo removing executable file from ${DESTDIR}${PREFIX}/bin + @rm -f ${DESTDIR}${PREFIX}/bin/slock + @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 + @rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1 + +.PHONY: all options clean dist install uninstall diff --git a/slock-flexipatch/README b/slock-flexipatch/README new file mode 100644 index 0000000..dcacd01 --- /dev/null +++ b/slock-flexipatch/README @@ -0,0 +1,24 @@ +slock - simple screen locker +============================ +simple screen locker utility for X. + + +Requirements +------------ +In order to build slock you need the Xlib header files. + + +Installation +------------ +Edit config.mk to match your local setup (slock is installed into +the /usr/local namespace by default). + +Afterwards enter the following command to build and install slock +(if necessary as root): + + make clean install + + +Running slock +------------- +Simply invoke the 'slock' command. To get out of it, enter your password. diff --git a/slock-flexipatch/README.md b/slock-flexipatch/README.md new file mode 100644 index 0000000..1eeb0d9 --- /dev/null +++ b/slock-flexipatch/README.md @@ -0,0 +1,117 @@ +Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this slock 1.5 (4f04554, +2022-10-04) project has a different take on patching. It uses preprocessor directives to decide +whether or not to include a patch during build time. Essentially this means that this build, for +better or worse, contains both the patched _and_ the original code. The aim being that you can +select which patches to include and the build will contain that code and nothing more. + +For example to include the `capscolor` patch then you would only need to flip this setting from 0 +to 1 in [patches.h](https://github.com/bakkeby/slock-flexipatch/blob/master/patches.h): +```c +#define CAPSCOLOR_PATCH 1 +``` + +Once you have found out what works for you and what doesn't then you should be in a better position +to choose patches should you want to start patching from scratch. + +Alternatively if you have found the patches you want, but don't want the rest of the flexipatch +entanglement on your plate then you may want to have a look at +[flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer); a custom pre-processor +tool that removes all the unused flexipatch code leaving you with a build that contains the patches +you selected. + +Refer to [https://tools.suckless.org/slock/](https://tools.suckless.org/slock/) for details on the +slock tool, how to install it and how it works. + +--- + +### Changelog: + +2022-03-28 - Added the background image patch + +2021-09-13 - Added the dwm logo patch + +2021-09-09 - Added the auto-timeout, failure-command and secret-password patches + +2021-06-08 - Added the color message patch + +2020-08-03 - Added alpha, keypress_feedback and blur_pixelated_screen patches + +2019-11-27 - Added xresources patch + +2019-10-17 - Added capscolor, control clear, dpms, mediakeys, message, pam auth, quickcancel patches + +2019-10-16 - Introduced [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer) + +### Patches included: + + - [alpha](https://github.com/khuedoan/slock) + - enables transparency for slock + - intended to be combined with a compositor that can blur the transparent background + + - [auto-timeout](https://tools.suckless.org/slock/patches/auto-timeout/) + - allows for a command to be executed after a specified time of inactivity + + - [background_image](https://tools.suckless.org/slock/patches/background-image/) + - sets the lockscreen picture to a background image + + - [blur_pixelated_screen](https://tools.suckless.org/slock/patches/blur-pixelated-screen/) + - sets the lockscreen picture to a blured or pixelated screenshot + + - [capscolor](https://tools.suckless.org/slock/patches/capscolor/) + - adds an additional color to indicate the state of Caps Lock + + - [color-message](https://tools.suckless.org/slock/patches/colormessage/) + - based on the message patch this patch lets you add a message to your lock screen using + 24-bit color ANSI escape codes + + - [control-clear](https://tools.suckless.org/slock/patches/control-clear/) + - with this patch slock will no longer change to the failure color if a control key is pressed + while the buffer is empty + - this may be useful if, for example, you wake your monitor up by pressing a control key and + don't want to spoil the detection of failed unlocking attempts + + - [dpms](https://tools.suckless.org/slock/patches/dpms/) + - interacts with the Display Power Signaling and automatically shuts down the monitor after a + configurable amount of seconds + - the monitor will automatically be activated by pressing a key or moving the mouse and the + password can be entered then + + - [dwmlogo](https://tools.suckless.org/slock/patches/dwmlogo/) + - draws the dwm logo which changes color based on the state + + - [failure-command](https://tools.suckless.org/slock/patches/failure-command/) + - allows for a command to be run after a specified number of incorrect attempts + + - [keypress_feedback](https://tools.suckless.org/slock/patches/keypress-feedback/) + - draws random blocks on the screen to display keypress feedback + + - [mediakeys](https://tools.suckless.org/slock/patches/mediakeys/) + - allows media keys to be used while the screen is locked, e.g. adjust volume or skip to the + next song without having to unlock the screen first + + - [message](https://tools.suckless.org/slock/patches/message/) + - this patch lets you add a custom message to your lock screen + + - [pam-auth](https://tools.suckless.org/slock/patches/pam_auth/) + - replaces shadow support with PAM authentication support + + - [quickcancel](https://tools.suckless.org/slock/patches/quickcancel/) + - cancel slock by moving the mouse within a certain time-period after slock started + - the time-period can be defined in seconds with the setting timetocancel in the config.h + - this can be useful if you forgot to disable xautolock during an activity that requires no + input (e.g. reading text, watching video, etc.) + + - [secret-password](https://tools.suckless.org/slock/patches/secret-password/) + - allows for commands to be executed when the user enters special passwords + + - [terminalkeys](https://tools.suckless.org/slock/patches/terminalkeys/) + - adds key commands that are commonly used in terminal applications (in particular the login + prompt) + + - [unlockscreen](https://tools.suckless.org/slock/patches/unlock_screen/) + - this patch keeps the screen unlocked, but keeps the input locked + - that is, the screen is not affected by slock, but users will not be able to interact with + the X session unless they enter the correct password + + - [xresources](https://tools.suckless.org/slock/patches/xresources/) + - this patch adds the ability to get colors via Xresources diff --git a/slock-flexipatch/arg.h b/slock-flexipatch/arg.h new file mode 100644 index 0000000..0b23c53 --- /dev/null +++ b/slock-flexipatch/arg.h @@ -0,0 +1,65 @@ +/* + * Copy me if you can. + * by 20h + */ + +#ifndef ARG_H__ +#define ARG_H__ + +extern char *argv0; + +/* use main(int argc, char *argv[]) */ +#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ + argv[0] && argv[0][0] == '-'\ + && argv[0][1];\ + argc--, argv++) {\ + char argc_;\ + char **argv_;\ + int brk_;\ + if (argv[0][1] == '-' && argv[0][2] == '\0') {\ + argv++;\ + argc--;\ + break;\ + }\ + for (brk_ = 0, argv[0]++, argv_ = argv;\ + argv[0][0] && !brk_;\ + argv[0]++) {\ + if (argv_ != argv)\ + break;\ + argc_ = argv[0][0];\ + switch (argc_) + +/* Handles obsolete -NUM syntax */ +#define ARGNUM case '0':\ + case '1':\ + case '2':\ + case '3':\ + case '4':\ + case '5':\ + case '6':\ + case '7':\ + case '8':\ + case '9' + +#define ARGEND }\ + } + +#define ARGC() argc_ + +#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX)) + +#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ + ((x), abort(), (char *)0) :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ + (char *)0 :\ + (brk_ = 1, (argv[0][1] != '\0')?\ + (&argv[0][1]) :\ + (argc--, argv++, argv[0]))) + +#define LNGARG() &argv[0][0] + +#endif diff --git a/slock-flexipatch/config.def.h b/slock-flexipatch/config.def.h new file mode 100644 index 0000000..faf3d02 --- /dev/null +++ b/slock-flexipatch/config.def.h @@ -0,0 +1,164 @@ +/* user and group to drop privileges to */ +static const char *user = "nobody"; +static const char *group = "nogroup"; // use "nobody" for arch + +static const char *colorname[NUMCOLS] = { + #if DWM_LOGO_PATCH && !BLUR_PIXELATED_SCREEN_PATCH + [BACKGROUND] = "#2d2d2d", /* after initialization */ + #endif // DWM_LOGO_PATCH + [INIT] = "black", /* after initialization */ + [INPUT] = "#005577", /* during input */ + [FAILED] = "#CC3333", /* wrong password */ + #if CAPSCOLOR_PATCH + [CAPS] = "red", /* CapsLock on */ + #endif // CAPSCOLOR_PATCH + #if PAMAUTH_PATCH + [PAM] = "#9400D3", /* waiting for PAM */ + #endif // PAMAUTH_PATCH + #if KEYPRESS_FEEDBACK_PATCH + [BLOCKS] = "#ffffff", /* key feedback block */ + #endif // KEYPRESS_FEEDBACK_PATCH +}; + +#if MESSAGE_PATCH || COLOR_MESSAGE_PATCH +/* default message */ +static const char * message = "Enter your password."; + +/* text color */ +static const char * text_color = "#ffffff"; + +/* text size (must be a valid size) */ +static const char * font_name = "-misc-hack-medium-r-normal-*-*-120-*-100-m-0-iso10646-1"; +#endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH + +#if BACKGROUND_IMAGE_PATCH +/* Background image path, should be available to the user above */ +static const char * background_image = ""; +#endif // BACKGROUND_IMAGE_PATCH + +#if DWM_LOGO_PATCH +/* insert grid pattern with scale 1:1, the size can be changed with logosize */ +static const int logosize = 75; +static const int logow = 12; /* grid width and height for right center alignment*/ +static const int logoh = 6; + +static XRectangle rectangles[] = { + /* x y w h */ + { 0, 3, 1, 3 }, + { 1, 3, 2, 1 }, + { 0, 5, 8, 1 }, + { 3, 0, 1, 5 }, + { 5, 3, 1, 2 }, + { 7, 3, 1, 2 }, + { 8, 3, 4, 1 }, + { 9, 4, 1, 2 }, + { 11, 4, 1, 2 }, +}; +#endif // DWM_LOGO_PATCH + +#if XRESOURCES_PATCH +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + #if DWM_LOGO_PATCH && !BLUR_PIXELATED_SCREEN_PATCH + { "background", STRING, &colorname[BACKGROUND] }, + #endif //DWM_LOGO_PATCH + #if BACKGROUND_IMAGE_PATCH + { "bg_image", STRING, &background_image }, + #endif // BACKGROUND_IMAGE_PATCH + { "locked", STRING, &colorname[INIT] }, + { "input", STRING, &colorname[INPUT] }, + { "failed", STRING, &colorname[FAILED] }, + #if CAPSCOLOR_PATCH + { "capslock", STRING, &colorname[CAPS] }, + #endif // CAPSCOLOR_PATCH + #if PAMAUTH_PATCH + { "pamauth", STRING, &colorname[PAM] }, + #endif // PAMAUTH_PATCH + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + { "message", STRING, &message }, + { "text_color", STRING, &text_color }, + { "font_name", STRING, &font_name }, + #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH +}; +#endif // XRESOURCES_PATCH + +#if ALPHA_PATCH +/* lock screen opacity */ +static const float alpha = 0.9; +#endif // ALPHA_PATCH + +/* treat a cleared input like a wrong password (color) */ +static const int failonclear = 1; + +#if AUTO_TIMEOUT_PATCH +/* length of time (seconds) until */ +static const int timeoffset = 60; + +/* should [command] be run only once? */ +static const int runonce = 0; + +/* command to be run after [time] has passed */ +static const char *command = "doas poweroff"; +#endif // AUTO_TIMEOUT_PATCH + +#if FAILURE_COMMAND_PATCH +/* number of failed password attempts until failcommand is executed. + Set to 0 to disable */ +static const int failcount = 0; + +/* command to be executed after [failcount] failed password attempts */ +static const char *failcommand = "shutdown"; +#endif // FAILURE_COMMAND_PATCH + +#if SECRET_PASSWORD_PATCH +static const secretpass scom[] = { + /* Password command */ + { "shutdown", "doas poweroff"}, +}; +#endif // SECRET_PASSWORD_PATCH + +#if BLUR_PIXELATED_SCREEN_PATCH +/* Enable blur */ +#define BLUR +/* Set blur radius */ +static const int blurRadius = 5; +/* Enable Pixelation */ +//#define PIXELATION +/* Set pixelation radius */ +static const int pixelSize = 10; +#endif // BLUR_PIXELATED_SCREEN_PATCH + +#if CONTROLCLEAR_PATCH +/* allow control key to trigger fail on clear */ +static const int controlkeyclear = 0; +#endif // CONTROLCLEAR_PATCH + +#if DPMS_PATCH +/* time in seconds before the monitor shuts down */ +static const int monitortime = 5; +#endif // DPMS_PATCH + +#if KEYPRESS_FEEDBACK_PATCH +static short int blocks_enabled = 1; // 0 = don't show blocks +static const int blocks_width = 0; // 0 = full width +static const int blocks_height = 16; + +// position +static const int blocks_x = 0; +static const int blocks_y = 0; + +// Number of blocks +static const int blocks_count = 10; +#endif // KEYPRESS_FEEDBACK_PATCH + +#if PAMAUTH_PATCH +/* PAM service that's used for authentication */ +static const char* pam_service = "login"; +#endif // PAMAUTH_PATCH + +#if QUICKCANCEL_PATCH +/* time in seconds to cancel lock with mouse movement */ +static const int timetocancel = 4; +#endif // QUICKCANCEL_PATCH diff --git a/slock-flexipatch/config.mk b/slock-flexipatch/config.mk new file mode 100644 index 0000000..b314836 --- /dev/null +++ b/slock-flexipatch/config.mk @@ -0,0 +1,48 @@ +# slock version +VERSION = 1.4 + +# Customize below to fit your system + +# paths +PREFIX = /usr/local +MANPREFIX = ${PREFIX}/share/man + +X11INC = /usr/X11R6/include +X11LIB = /usr/X11R6/lib + +# Uncomment for BSD +#BSD=-D_BSD_SOURCE + +# Uncomment for NetBSD +#NETBSD=-D_NETBSD_SOURCE + +# Uncomment for message patch / MESSAGE_PATCH / COLORMESSAGE_PATCH / DWM_LOGO_PATCH +XINERAMA=-lXinerama +XINERAMAFLAGS = -DXINERAMA + +# Uncomment for pam auth patch / PAMAUTH_PATCH +#PAM=-lpam + +# Uncomment for blur pixelated screen and background image patches / BLUR_PIXELATED_SCREEN_PATCH, BACKGROUND_IMAGE_PATCH +IMLIB=-lImlib2 + +# includes and libs +INCS = -I. -I/usr/include -I${X11INC} +LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr ${XINERAMA} ${PAM} ${IMLIB} + +# flags +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS} ${BSD} ${NETBSD} +CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} +LDFLAGS = -s ${LIBS} +COMPATSRC = explicit_bzero.c + +# On OpenBSD and Darwin remove -lcrypt from LIBS +#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr +# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS +# On NetBSD add -D_NETBSD_SOURCE to CPPFLAGS +#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_NETBSD_SOURCE +# On OpenBSD set COMPATSRC to empty +#COMPATSRC = + +# compiler and linker +CC = gcc diff --git a/slock-flexipatch/explicit_bzero.c b/slock-flexipatch/explicit_bzero.c new file mode 100644 index 0000000..3e33ca8 --- /dev/null +++ b/slock-flexipatch/explicit_bzero.c @@ -0,0 +1,19 @@ +/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */ +/* + * Public domain. + * Written by Matthew Dempsky. + */ + +#include + +__attribute__((weak)) void +__explicit_bzero_hook(void *buf, size_t len) +{ +} + +void +explicit_bzero(void *buf, size_t len) +{ + memset(buf, 0, len); + __explicit_bzero_hook(buf, len); +} diff --git a/slock-flexipatch/patch/background_image.c b/slock-flexipatch/patch/background_image.c new file mode 100644 index 0000000..4f64c1f --- /dev/null +++ b/slock-flexipatch/patch/background_image.c @@ -0,0 +1,47 @@ +#include + +Imlib_Image image; + +void +render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image) +{ + if (image) { + lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); + imlib_context_set_display(dpy); + imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); + imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); + imlib_context_set_drawable(lock->bgmap); + imlib_render_image_on_drawable(0, 0); + imlib_free_image(); + } +} + +void +create_lock_image(Display *dpy) +{ + /* Load picture */ + Imlib_Image buffer = imlib_load_image(background_image); + imlib_context_set_image(buffer); + int background_image_width = imlib_image_get_width(); + int background_image_height = imlib_image_get_height(); + + /* Create an image to be rendered */ + Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); + image = imlib_create_image(scr->width, scr->height); + imlib_context_set_image(image); + + /* Fill the image for every X monitor */ + XRRMonitorInfo *monitors; + int number_of_monitors; + monitors = XRRGetMonitors(dpy, RootWindow(dpy, XScreenNumberOfScreen(scr)), True, &number_of_monitors); + + int i; + for (i = 0; i < number_of_monitors; i++) { + imlib_blend_image_onto_image(buffer, 0, 0, 0, background_image_width, background_image_height, monitors[i].x, monitors[i].y, monitors[i].width, monitors[i].height); + } + + /* Clean up */ + imlib_context_set_image(buffer); + imlib_free_image(); + imlib_context_set_image(image); +} \ No newline at end of file diff --git a/slock-flexipatch/patch/background_image.h b/slock-flexipatch/patch/background_image.h new file mode 100644 index 0000000..2a9050f --- /dev/null +++ b/slock-flexipatch/patch/background_image.h @@ -0,0 +1,4 @@ +#include + +static void create_lock_image(Display *dpy); +static void render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image); \ No newline at end of file diff --git a/slock-flexipatch/patch/blur_pixelated_screen.c b/slock-flexipatch/patch/blur_pixelated_screen.c new file mode 100644 index 0000000..3b6d21f --- /dev/null +++ b/slock-flexipatch/patch/blur_pixelated_screen.c @@ -0,0 +1,70 @@ +#include + +Imlib_Image image; + +void +render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image) +{ + if (image) { + lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); + imlib_context_set_image(image); + imlib_context_set_display(dpy); + imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); + imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); + imlib_context_set_drawable(lock->bgmap); + imlib_render_image_on_drawable(0, 0); + imlib_free_image(); + } +} + +void +create_lock_image(Display *dpy) +{ + /* Create screenshot Image */ + Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); + image = imlib_create_image(scr->width,scr->height); + imlib_context_set_image(image); + imlib_context_set_display(dpy); + imlib_context_set_visual(DefaultVisual(dpy,0)); + imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr))); + imlib_copy_drawable_to_image(0,0,0,scr->width,scr->height,0,0,1); + + #ifdef BLUR + /* Blur function */ + imlib_image_blur(blurRadius); + #endif // BLUR + + #ifdef PIXELATION + /* Pixelation */ + int width = scr->width; + int height = scr->height; + + for (int y = 0; y < height; y += pixelSize) { + for (int x = 0; x < width; x += pixelSize) { + int red = 0; + int green = 0; + int blue = 0; + + Imlib_Color pixel; + Imlib_Color* pp; + pp = &pixel; + for (int j = 0; j < pixelSize && j < height; j++) { + for (int i = 0; i < pixelSize && i < width; i++) { + imlib_image_query_pixel(x + i, y + j, pp); + red += pixel.red; + green += pixel.green; + blue += pixel.blue; + } + } + red /= (pixelSize * pixelSize); + green /= (pixelSize * pixelSize); + blue /= (pixelSize * pixelSize); + imlib_context_set_color(red, green, blue, pixel.alpha); + imlib_image_fill_rectangle(x, y, pixelSize, pixelSize); + red = 0; + green = 0; + blue = 0; + } + } + #endif +} \ No newline at end of file diff --git a/slock-flexipatch/patch/blur_pixelated_screen.h b/slock-flexipatch/patch/blur_pixelated_screen.h new file mode 100644 index 0000000..2a9050f --- /dev/null +++ b/slock-flexipatch/patch/blur_pixelated_screen.h @@ -0,0 +1,4 @@ +#include + +static void create_lock_image(Display *dpy); +static void render_lock_image(Display *dpy, struct lock *lock, Imlib_Image image); \ No newline at end of file diff --git a/slock-flexipatch/patch/colormessage.c b/slock-flexipatch/patch/colormessage.c new file mode 100644 index 0000000..0d53537 --- /dev/null +++ b/slock-flexipatch/patch/colormessage.c @@ -0,0 +1,128 @@ +#include + +/* global count to prevent repeated error messages */ +int count_error = 0; + +static int +readescapedint(const char *str, int *i) { + int n = 0; + if (str[*i]) + ++*i; + while(str[*i] && str[*i] != ';' && str[*i] != 'm') { + n = 10 * n + str[*i] - '0'; + ++*i; + } + return n; +} + +static void +writemessage(Display *dpy, Window win, int screen) +{ + int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len; + XGCValues gr_values; + XFontStruct *fontinfo; + XColor color, dummy; + XineramaScreenInfo *xsi; + GC gc; + fontinfo = XLoadQueryFont(dpy, font_name); + + if (fontinfo == NULL) { + if (count_error == 0) { + fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); + fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); + count_error++; + } + return; + } + + tab_size = 8 * XTextWidth(fontinfo, " ", 1); + + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), + text_color, &color, &dummy); + + gr_values.font = fontinfo->fid; + gr_values.foreground = color.pixel; + gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); + + /* To prevent "Uninitialized" warnings. */ + xsi = NULL; + + /* + * Start formatting and drawing text + */ + + len = strlen(message); + + /* Max max line length (cut at '\n') */ + line_len = curr_line_len = 0; + k = 0; + for (i = 0; i < len; i++) { + if (message[i] == '\n') { + curr_line_len = 0; + k++; + } else if (message[i] == 0x1b) { + while (i < len && message[i] != 'm') { + i++; + } + if (i == len) + die("slock: unclosed escape sequence\n"); + } else { + curr_line_len += XTextWidth(fontinfo, message + i, 1); + if (curr_line_len > line_len) + line_len = curr_line_len; + } + } + /* If there is only one line */ + if (line_len == 0) + line_len = len; + + if (XineramaIsActive(dpy)) { + xsi = XineramaQueryScreens(dpy, &i); + s_width = xsi[0].width; + s_height = xsi[0].height; + } else { + s_width = DisplayWidth(dpy, screen); + s_height = DisplayHeight(dpy, screen); + } + height = s_height*3/7 - (k*20)/3; + width = (s_width - line_len)/2; + + line_len = 0; + /* print the text while parsing 24 bit color ANSI escape codes*/ + for (i = k = 0; i < len; i++) { + switch (message[i]) { + case '\n': + line_len = 0; + while (message[i + 1] == '\t') { + line_len += tab_size; + i++; + } + k++; + break; + case 0x1b: + i++; + if (message[i] == '[') { + escaped_int = readescapedint(message, &i); + if (escaped_int == 39) + continue; + if (escaped_int != 38) + die("slock: unknown escape sequence%d\n", escaped_int); + if (readescapedint(message, &i) != 2) + die("slock: only 24 bit color supported\n"); + r = readescapedint(message, &i) & 0xff; + g = readescapedint(message, &i) & 0xff; + b = readescapedint(message, &i) & 0xff; + XSetForeground(dpy, gc, r << 16 | g << 8 | b); + } else + die("slock: unknown escape sequence\n"); + break; + default: + XDrawString(dpy, win, gc, width + line_len, height + 20 * k, message + i, 1); + line_len += XTextWidth(fontinfo, message + i, 1); + } + } + + /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ + if (XineramaIsActive(dpy) && xsi != NULL) + XFree(xsi); +} \ No newline at end of file diff --git a/slock-flexipatch/patch/dwmlogo.c b/slock-flexipatch/patch/dwmlogo.c new file mode 100644 index 0000000..9feb024 --- /dev/null +++ b/slock-flexipatch/patch/dwmlogo.c @@ -0,0 +1,29 @@ +static void +resizerectangles(struct lock *lock) +{ + int i; + + for (i = 0; i < LENGTH(rectangles); i++){ + lock->rectangles[i].x = (rectangles[i].x * logosize) + + lock->xoff + ((lock->mw) / 2) - (logow / 2 * logosize); + lock->rectangles[i].y = (rectangles[i].y * logosize) + + lock->yoff + ((lock->mh) / 2) - (logoh / 2 * logosize); + lock->rectangles[i].width = rectangles[i].width * logosize; + lock->rectangles[i].height = rectangles[i].height * logosize; + } +} + +static void +drawlogo(Display *dpy, struct lock *lock, int color) +{ + #if BLUR_PIXELATED_SCREEN_PATCH + lock->drawable = lock->bgmap; + #else + XSetForeground(dpy, lock->gc, lock->colors[BACKGROUND]); + XFillRectangle(dpy, lock->drawable, lock->gc, 0, 0, lock->x, lock->y); + #endif // BLUR_PIXELATED_SCREEN_PATCH + XSetForeground(dpy, lock->gc, lock->colors[color]); + XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles, LENGTH(rectangles)); + XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock->x, lock->y, 0, 0); + XSync(dpy, False); +} \ No newline at end of file diff --git a/slock-flexipatch/patch/dwmlogo.h b/slock-flexipatch/patch/dwmlogo.h new file mode 100644 index 0000000..4d84ff4 --- /dev/null +++ b/slock-flexipatch/patch/dwmlogo.h @@ -0,0 +1,2 @@ +static void resizerectangles(struct lock *lock); +static void drawlogo(Display *dpy, struct lock *lock, int color); \ No newline at end of file diff --git a/slock-flexipatch/patch/include.c b/slock-flexipatch/patch/include.c new file mode 100644 index 0000000..b932cf8 --- /dev/null +++ b/slock-flexipatch/patch/include.c @@ -0,0 +1,28 @@ +/* Patches */ +#if BACKGROUND_IMAGE_PATCH +#include "background_image.c" +#elif BLUR_PIXELATED_SCREEN_PATCH +#include "blur_pixelated_screen.c" +#endif + +#if COLOR_MESSAGE_PATCH +#include "colormessage.c" +#elif MESSAGE_PATCH +#include "message.c" +#endif + +#if DWM_LOGO_PATCH +#include "dwmlogo.c" +#endif + +#if KEYPRESS_FEEDBACK_PATCH +#include "keypress_feedback.c" +#endif + +#if PAMAUTH_PATCH +#include "pamauth.c" +#endif + +#if XRESOURCES_PATCH +#include "xresources.c" +#endif \ No newline at end of file diff --git a/slock-flexipatch/patch/include.h b/slock-flexipatch/patch/include.h new file mode 100644 index 0000000..c50a402 --- /dev/null +++ b/slock-flexipatch/patch/include.h @@ -0,0 +1,18 @@ +/* Patches */ +#if BACKGROUND_IMAGE_PATCH +#include "background_image.h" +#elif BLUR_PIXELATED_SCREEN_PATCH +#include "blur_pixelated_screen.h" +#endif + +#if DWM_LOGO_PATCH +#include "dwmlogo.h" +#endif + +#if PAMAUTH_PATCH +#include "pamauth.h" +#endif + +#if KEYPRESS_FEEDBACK_PATCH +#include "keypress_feedback.h" +#endif \ No newline at end of file diff --git a/slock-flexipatch/patch/keypress_feedback.c b/slock-flexipatch/patch/keypress_feedback.c new file mode 100644 index 0000000..09cfc0a --- /dev/null +++ b/slock-flexipatch/patch/keypress_feedback.c @@ -0,0 +1,28 @@ +static void +draw_key_feedback(Display *dpy, struct lock **locks, int screen) +{ + XGCValues gr_values; + + Window win = locks[screen]->win; + Window root_win; + + gr_values.foreground = locks[screen]->colors[BLOCKS]; + GC gc = XCreateGC(dpy, win, GCForeground, &gr_values); + + int width = blocks_width, height = blocks_height; + if (blocks_height == 0 || blocks_width == 0) { + int _x, _y; + unsigned int screen_width, screen_height, _b, _d; + XGetGeometry(dpy, win, &root_win, &_x, &_y, &screen_width, &screen_height, &_b, &_d); + width = blocks_width ? blocks_width : screen_width; + height = blocks_height ? blocks_height : screen_height; + } + + unsigned int block_width = width / blocks_count; + unsigned int position = rand() % blocks_count; + + XClearWindow(dpy, win); + XFillRectangle(dpy, win, gc, blocks_x + position*block_width, blocks_y, width, height); + + XFreeGC(dpy, gc); +} \ No newline at end of file diff --git a/slock-flexipatch/patch/keypress_feedback.h b/slock-flexipatch/patch/keypress_feedback.h new file mode 100644 index 0000000..be20690 --- /dev/null +++ b/slock-flexipatch/patch/keypress_feedback.h @@ -0,0 +1 @@ +static void draw_key_feedback(Display *dpy, struct lock **locks, int screen); \ No newline at end of file diff --git a/slock-flexipatch/patch/message.c b/slock-flexipatch/patch/message.c new file mode 100644 index 0000000..43bb2e0 --- /dev/null +++ b/slock-flexipatch/patch/message.c @@ -0,0 +1,94 @@ +#include + +/* global count to prevent repeated error messages */ +int count_error = 0; + +static void +writemessage(Display *dpy, Window win, int screen) +{ + int len, line_len, width, height, s_width, s_height, i, j, k, tab_replace, tab_size; + XGCValues gr_values; + XFontStruct *fontinfo; + XColor color, dummy; + XineramaScreenInfo *xsi; + GC gc; + fontinfo = XLoadQueryFont(dpy, font_name); + + if (fontinfo == NULL) { + if (count_error == 0) { + fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); + fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); + count_error++; + } + return; + } + + tab_size = 8 * XTextWidth(fontinfo, " ", 1); + + XAllocNamedColor(dpy, DefaultColormap(dpy, screen), + text_color, &color, &dummy); + + gr_values.font = fontinfo->fid; + gr_values.foreground = color.pixel; + gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); + + /* To prevent "Uninitialized" warnings. */ + xsi = NULL; + + /* + * Start formatting and drawing text + */ + + len = strlen(message); + + /* Max max line length (cut at '\n') */ + line_len = 0; + k = 0; + for (i = j = 0; i < len; i++) { + if (message[i] == '\n') { + if (i - j > line_len) + line_len = i - j; + k++; + i++; + j = i; + } + } + /* If there is only one line */ + if (line_len == 0) + line_len = len; + + if (XineramaIsActive(dpy)) { + xsi = XineramaQueryScreens(dpy, &i); + s_width = xsi[0].width; + s_height = xsi[0].height; + } else { + s_width = DisplayWidth(dpy, screen); + s_height = DisplayHeight(dpy, screen); + } + + height = s_height*3/7 - (k*20)/3; + width = (s_width - XTextWidth(fontinfo, message, line_len))/2; + + /* Look for '\n' and print the text between them. */ + for (i = j = k = 0; i <= len; i++) { + /* i == len is the special case for the last line */ + if (i == len || message[i] == '\n') { + tab_replace = 0; + while (message[j] == '\t' && j < i) { + tab_replace++; + j++; + } + + XDrawString(dpy, win, gc, width + tab_size*tab_replace, height + 20*k, message + j, i - j); + while (i < len && message[i] == '\n') { + i++; + j = i; + k++; + } + } + } + + /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ + if (XineramaIsActive(dpy) && xsi != NULL) + XFree(xsi); +} \ No newline at end of file diff --git a/slock-flexipatch/patch/pamauth.c b/slock-flexipatch/patch/pamauth.c new file mode 100644 index 0000000..ccd76d5 --- /dev/null +++ b/slock-flexipatch/patch/pamauth.c @@ -0,0 +1,27 @@ +char passwd[256]; + +static int +pam_conv(int num_msg, const struct pam_message **msg, + struct pam_response **resp, void *appdata_ptr) +{ + int retval = PAM_CONV_ERR; + for (int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && + strncmp(msg[i]->msg, "Password: ", 10) == 0) { + struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); + if (!resp_msg) + die("malloc failed\n"); + char *password = malloc(strlen(passwd) + 1); + if (!password) + die("malloc failed\n"); + memset(password, 0, strlen(passwd) + 1); + strcpy(password, passwd); + resp_msg->resp_retcode = 0; + resp_msg->resp = password; + resp[i] = resp_msg; + retval = PAM_SUCCESS; + } + } + return retval; +} + diff --git a/slock-flexipatch/patch/pamauth.h b/slock-flexipatch/patch/pamauth.h new file mode 100644 index 0000000..b87b240 --- /dev/null +++ b/slock-flexipatch/patch/pamauth.h @@ -0,0 +1,5 @@ +#include +#include + +static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); +struct pam_conv pamc = {pam_conv, NULL}; \ No newline at end of file diff --git a/slock-flexipatch/patch/xresources.c b/slock-flexipatch/patch/xresources.c new file mode 100644 index 0000000..c2b9b1c --- /dev/null +++ b/slock-flexipatch/patch/xresources.c @@ -0,0 +1,53 @@ +#include +#include + +int +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) +{ + char **sdst = dst; + int *idst = dst; + float *fdst = dst; + + char fullname[256]; + char fullclass[256]; + char *type; + XrmValue ret; + + snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); + snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; + + XrmGetResource(db, fullname, fullclass, &type, &ret); + if (ret.addr == NULL || strncmp("String", type, 64)) + return 1; + + switch (rtype) { + case STRING: + *sdst = ret.addr; + break; + case INTEGER: + *idst = strtoul(ret.addr, NULL, 10); + break; + case FLOAT: + *fdst = strtof(ret.addr, NULL); + break; + } + return 0; +} + +void +config_init(Display *dpy) +{ + char *resm; + XrmDatabase db; + ResourcePref *p; + + XrmInitialize(); + resm = XResourceManagerString(dpy); + if (!resm) + return; + + db = XrmGetStringDatabase(resm); + for (p = resources; p < resources + LENGTH(resources); p++) + resource_load(db, p->name, p->type, p->dst); +} diff --git a/slock-flexipatch/patches.def.h b/slock-flexipatch/patches.def.h new file mode 100644 index 0000000..9e68401 --- /dev/null +++ b/slock-flexipatch/patches.def.h @@ -0,0 +1,145 @@ +/* + * This file contains patch control flags. + * + * In principle you should be able to mix and match any patches + * you may want. In cases where patches are logically incompatible + * one patch may take precedence over the other as noted in the + * relevant descriptions. + */ + +/* Patches */ + +/* This patch enables transparency for slock. This is intended to be combined + * with a compositor that can blur the transparent background. + * Extrapolated from https://github.com/khuedoan/slock + * https://github.com/khuedoan/slock/commit/5e7a95b50fd72efcf2a40d487278749a17cbb146 + */ +#define ALPHA_PATCH 1 + +/* This patch allows for a command to be executed after a specified time of inactivity. + * https://tools.suckless.org/slock/patches/auto-timeout/ + */ +#define AUTO_TIMEOUT_PATCH 0 + +/* This patch adds a background image for slock. + * This patch depends on the Imlib2 library, uncomment the relevant line in + * config.mk when enabling this patch. + * This patch is a variant of the blur pixelated screen patch and takes precedence over that. + * https://tools.suckless.org/slock/patches/background-image/ + */ +#define BACKGROUND_IMAGE_PATCH 0 + +/* This patch sets the lockscreen picture to a blured or pixelated screenshot. + * This patch depends on the Imlib2 library, uncomment the relevant line in + * config.mk when enabling this patch. + * The background image patch takes precedence over this patch. + * https://tools.suckless.org/slock/patches/blur-pixelated-screen/ + */ +#define BLUR_PIXELATED_SCREEN_PATCH 1 + +/* This patch introduces an additional color to indicate the state of Caps Lock. + * https://tools.suckless.org/slock/patches/capscolor/ + */ +#define CAPSCOLOR_PATCH 1 + +/* Based on the message patch this patch lets you add a message to your lock screen using 24 bit + * color ANSI escape codes. + * + * You can place a default message in config.h and you can also pass a message with the -m command + * line option. + * + * Practical example: + * slock -m "$(printf "text colored \x1b[38;2;0;255;0m green\x1b[39m\n")" + * + * If you enable this then you also need to add the -lXinerama library to the LIBS + * configuration in config.mk. Look for and uncomment the XINERAMA placeholder. + * + * https://tools.suckless.org/slock/patches/colormessage/ + */ +#define COLOR_MESSAGE_PATCH 1 + +/* Adds an additional configuration parameter, controlkeyclear. When set to 1, slock will no + * longer change to the failure color if a control key is pressed while the buffer is empty. + * This may be useful if, for example, you wake your monitor up by pressing a control key + * and don't want to spoil the detection of failed unlocking attempts. + * https://tools.suckless.org/slock/patches/control-clear/ + */ +#define CONTROLCLEAR_PATCH 0 + +/* This patch interacts with the Display Power Signaling and automatically shuts down + * the monitor after a configurable amount of seconds. + * The monitor will automatically be activated by pressing a key or moving the mouse + * and the password can be entered then. + * https://tools.suckless.org/slock/patches/dpms/ + */ +#define DPMS_PATCH 1 + +/* This patch draws the dwm logo which changes color based on the state. + * https://tools.suckless.org/slock/patches/dwmlogo/ + */ +#define DWM_LOGO_PATCH 0 + +/* This patch allows for a command to be run after a specified number of incorrect attempts. + * https://tools.suckless.org/slock/patches/failure-command/ + */ +#define FAILURE_COMMAND_PATCH 0 + +/* Draws random blocks on the screen to display keypress feedback. + * https://tools.suckless.org/slock/patches/keypress-feedback/ + * https://patch-diff.githubusercontent.com/raw/phenax/bslock/pull/2.diff + */ +#define KEYPRESS_FEEDBACK_PATCH 0 + +/* This patch allows media keys to be used while the screen is locked. Allows for volume + * to be adjusted or to skip to the next song without having to unlock the screen first. + * https://tools.suckless.org/slock/patches/mediakeys/ + */ +#define MEDIAKEYS_PATCH 1 + +/* This patch lets you add a message to your lock screen. You can place a default message + * in config.h and you can also pass a message with the -m command line option. + * If you enable this then you also need to add the -lXinerama library to the LIBS + * configuration in config.mk. Look for and uncomment the XINERAMA placeholder. + * https://tools.suckless.org/slock/patches/message/ + */ +#define MESSAGE_PATCH 1 + +/* Replaces shadow support with PAM authentication support. + * Change variable pam_service in config.def.h to the corresponding PAM service. + * The default configuration is for ArchLinux's login service. + * If you enable this then you also need to add the -lpam library to the LIBS configuration + * in config.mk. Look for and uncomment the PAM placeholder. + * https://tools.suckless.org/slock/patches/pam_auth/ + */ +#define PAMAUTH_PATCH 0 + +/* Cancel slock by moving the mouse within a certain time-period after slock started. + * The time-period can be defined in seconds with the setting timetocancel in the config.h. + * This can be useful if you forgot to disable xautolock during an activity that requires + * no input (e.g. reading text, watching video, etc.). + * https://tools.suckless.org/slock/patches/quickcancel/ + */ +#define QUICKCANCEL_PATCH 0 + +/* This patch allows for commands to be executed when the user enters special passwords. + * https://tools.suckless.org/slock/patches/secret-password/ + */ +#define SECRET_PASSWORD_PATCH 0 + +/* Adds key commands that are commonly used in terminal applications (in particular the + * login prompt) to slock. + * https://tools.suckless.org/slock/patches/terminalkeys/ + */ +#define TERMINALKEYS_PATCH 1 + +/* This patch keeps the screen unlocked but keeps the input locked. That is, the screen + * is not affected by slock, but users will not be able to interact with the X session + * unless they enter the correct password. + * https://tools.suckless.org/slock/patches/unlock_screen/ + */ +#define UNLOCKSCREEN_PATCH 0 + +/* This patch adds the ability to get colors via Xresources. + * https://tools.suckless.org/slock/patches/xresources/ + */ +#define XRESOURCES_PATCH 1 diff --git a/slock-flexipatch/slock.1 b/slock-flexipatch/slock.1 new file mode 100644 index 0000000..82cdcd6 --- /dev/null +++ b/slock-flexipatch/slock.1 @@ -0,0 +1,39 @@ +.Dd 2016-08-23 +.Dt SLOCK 1 +.Sh NAME +.Nm slock +.Nd simple X screen locker +.Sh SYNOPSIS +.Nm +.Op Fl v +.Op Ar cmd Op Ar arg ... +.Sh DESCRIPTION +.Nm +is a simple X screen locker. If provided, +.Ar cmd Op Ar arg ... +is executed after the screen has been locked. +.Sh OPTIONS +.Bl -tag -width Ds +.It Fl v +Print version information to stdout and exit. +.El +.Sh SECURITY CONSIDERATIONS +To make sure a locked screen can not be bypassed by switching VTs +or killing the X server with Ctrl+Alt+Backspace, it is recommended +to disable both in +.Xr xorg.conf 5 +for maximum security: +.Bd -literal -offset left +Section "ServerFlags" + Option "DontVTSwitch" "True" + Option "DontZap" "True" +EndSection +.Ed +.Sh EXAMPLES +$ +.Nm +/usr/sbin/s2ram +.Sh CUSTOMIZATION +.Nm +can be customized by creating a custom config.h from config.def.h and +(re)compiling the source code. This keeps it fast, secure and simple. diff --git a/slock-flexipatch/slock.c b/slock-flexipatch/slock.c new file mode 100644 index 0000000..8130954 --- /dev/null +++ b/slock-flexipatch/slock.c @@ -0,0 +1,797 @@ +/* See LICENSE file for license details. */ +#define _XOPEN_SOURCE 500 +#define LENGTH(X) (sizeof X / sizeof X[0]) +#if HAVE_SHADOW_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "patches.h" +#if ALPHA_PATCH +#include +#endif // ALPHA_PATCH +#if KEYPRESS_FEEDBACK_PATCH +#include +#endif // KEYPRESS_FEEDBACK_PATCH +#if CAPSCOLOR_PATCH +#include +#endif // CAPSCOLOR_PATCH +#if MEDIAKEYS_PATCH +#include +#endif // MEDIAKEYS_PATCH +#if QUICKCANCEL_PATCH || AUTO_TIMEOUT_PATCH +#include +#endif // QUICKCANCEL_PATCH / AUTO_TIMEOUT_PATCH +#if DPMS_PATCH +#include +#endif // DPMS_PATCH +#ifdef XINERAMA +#include +#endif + +#include "arg.h" +#include "util.h" + +char *argv0; +#if FAILURE_COMMAND_PATCH +int failtrack = 0; +#endif // FAILURE_COMMAND_PATCH + +#if AUTO_TIMEOUT_PATCH +static time_t lasttouched; +int runflag = 0; +#endif // AUTO_TIMEOUT_PATCH +#if QUICKCANCEL_PATCH +static time_t locktime; +#endif // QUICKCANCEL_PATCH + +enum { + #if DWM_LOGO_PATCH && !BLUR_PIXELATED_SCREEN_PATCH + BACKGROUND, + #endif // DWM_LOGO_PATCH + INIT, + INPUT, + FAILED, + #if CAPSCOLOR_PATCH + CAPS, + #endif // CAPSCOLOR_PATCH + #if PAMAUTH_PATCH + PAM, + #endif // PAMAUTH_PATCH + #if KEYPRESS_FEEDBACK_PATCH + BLOCKS, + #endif // KEYPRESS_FEEDBACK_PATCH + NUMCOLS +}; + +#if XRESOURCES_PATCH +/* Xresources preferences */ +enum resource_type { + STRING = 0, + INTEGER = 1, + FLOAT = 2 +}; + +typedef struct { + char *name; + enum resource_type type; + void *dst; +} ResourcePref; +#endif // XRESOURCES_PATCH + +#if SECRET_PASSWORD_PATCH +typedef struct secretpass secretpass; +struct secretpass { + char *pass; + char *command; +}; +#endif // SECRET_PASSWORD_PATCH + +#include "config.h" + +struct lock { + int screen; + Window root, win; + Pixmap pmap; + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + Pixmap bgmap; + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH + unsigned long colors[NUMCOLS]; + #if DWM_LOGO_PATCH + unsigned int x, y; + unsigned int xoff, yoff, mw, mh; + Drawable drawable; + GC gc; + XRectangle rectangles[LENGTH(rectangles)]; + #endif // DWM_LOGO_PATCH +}; + +struct xrandr { + int active; + int evbase; + int errbase; +}; + +#include "patch/include.h" + +static void +die(const char *errstr, ...) +{ + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(1); +} + +#include "patch/include.c" + +#ifdef __linux__ +#include +#include + +static void +dontkillme(void) +{ + FILE *f; + const char oomfile[] = "/proc/self/oom_score_adj"; + + if (!(f = fopen(oomfile, "w"))) { + if (errno == ENOENT) + return; + die("slock: fopen %s: %s\n", oomfile, strerror(errno)); + } + fprintf(f, "%d", OOM_SCORE_ADJ_MIN); + if (fclose(f)) { + if (errno == EACCES) + die("slock: unable to disable OOM killer. " + "Make sure to suid or sgid slock.\n"); + else + die("slock: fclose %s: %s\n", oomfile, strerror(errno)); + } +} +#endif + +static const char * +gethash(void) +{ + const char *hash; + struct passwd *pw; + + /* Check if the current user has a password entry */ + errno = 0; + if (!(pw = getpwuid(getuid()))) { + if (errno) + die("slock: getpwuid: %s\n", strerror(errno)); + else + die("slock: cannot retrieve password entry\n"); + } + hash = pw->pw_passwd; + +#if HAVE_SHADOW_H + if (!strcmp(hash, "x")) { + struct spwd *sp; + if (!(sp = getspnam(pw->pw_name))) + die("slock: getspnam: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); + hash = sp->sp_pwdp; + } +#else + if (!strcmp(hash, "*")) { +#ifdef __OpenBSD__ + if (!(pw = getpwuid_shadow(getuid()))) + die("slock: getpwnam_shadow: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); + hash = pw->pw_passwd; +#else + die("slock: getpwuid: cannot retrieve shadow entry. " + "Make sure to suid or sgid slock.\n"); +#endif /* __OpenBSD__ */ + } +#endif /* HAVE_SHADOW_H */ + + #if PAMAUTH_PATCH + /* pam, store user name */ + hash = pw->pw_name; + #endif // PAMAUTH_PATCH + return hash; +} + +static void +readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, + const char *hash) +{ + XRRScreenChangeNotifyEvent *rre; + #if PAMAUTH_PATCH + char buf[32]; + int retval; + pam_handle_t *pamh; + #else + char buf[32], passwd[256], *inputhash; + #endif // PAMAUTH_PATCH + int num, screen, running, failure, oldc; + unsigned int len, color; + #if AUTO_TIMEOUT_PATCH + time_t currenttime; + #endif // AUTO_TIMEOUT_PATCH + #if CAPSCOLOR_PATCH + int caps; + unsigned int indicators; + #endif // CAPSCOLOR_PATCH + KeySym ksym; + XEvent ev; + + len = 0; + #if CAPSCOLOR_PATCH + caps = 0; + #endif // CAPSCOLOR_PATCH + running = 1; + failure = 0; + oldc = INIT; + + #if CAPSCOLOR_PATCH + if (!XkbGetIndicatorState(dpy, XkbUseCoreKbd, &indicators)) + caps = indicators & 1; + + #endif // CAPSCOLOR_PATCH + #if AUTO_TIMEOUT_PATCH + while (running) + #else + while (running && !XNextEvent(dpy, &ev)) + #endif // AUTO_TIMEOUT_PATCH + { + #if AUTO_TIMEOUT_PATCH + while (XPending(dpy)) { + XNextEvent(dpy, &ev); + #endif // AUTO_TIMEOUT_PATCH + #if QUICKCANCEL_PATCH + running = !((time(NULL) - locktime < timetocancel) && (ev.type == MotionNotify)); + #endif // QUICKCANCEL_PATCH + if (ev.type == KeyPress) { + #if AUTO_TIMEOUT_PATCH + time(&lasttouched); + #endif // AUTO_TIMEOUT_PATCH + explicit_bzero(&buf, sizeof(buf)); + num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); + if (IsKeypadKey(ksym)) { + if (ksym == XK_KP_Enter) + ksym = XK_Return; + else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) + ksym = (ksym - XK_KP_0) + XK_0; + } + if (IsFunctionKey(ksym) || + IsKeypadKey(ksym) || + IsMiscFunctionKey(ksym) || + IsPFKey(ksym) || + IsPrivateKeypadKey(ksym)) + continue; + #if TERMINALKEYS_PATCH + if (ev.xkey.state & ControlMask) { + switch (ksym) { + case XK_u: + ksym = XK_Escape; + break; + case XK_m: + ksym = XK_Return; + break; + case XK_j: + ksym = XK_Return; + break; + case XK_h: + ksym = XK_BackSpace; + break; + } + } + #endif // TERMINALKEYS_PATCH + switch (ksym) { + case XK_Return: + passwd[len] = '\0'; + errno = 0; + + #if SECRET_PASSWORD_PATCH + for (int i = 0; i < LENGTH(scom); i++) { + if (strcmp(scom[i].pass, passwd) == 0) { + if (system(scom[i].command)); + #if FAILURE_COMMAND_PATCH + failtrack = -1; + #endif // FAILURE_COMMAND_PATCH + } + } + #endif // SECRET_PASSWORD_PATCH + + #if PAMAUTH_PATCH + retval = pam_start(pam_service, hash, &pamc, &pamh); + color = PAM; + for (screen = 0; screen < nscreens; screen++) { + #if DWM_LOGO_PATCH + drawlogo(dpy, locks[screen], color); + #elif BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + if (locks[screen]->bgmap) + XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); + else + XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); + XClearWindow(dpy, locks[screen]->win); + #else + XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); + XClearWindow(dpy, locks[screen]->win); + XRaiseWindow(dpy, locks[screen]->win); + #endif // BLUR_PIXELATED_SCREEN_PATCH + + } + XSync(dpy, False); + + if (retval == PAM_SUCCESS) + retval = pam_authenticate(pamh, 0); + if (retval == PAM_SUCCESS) + retval = pam_acct_mgmt(pamh, 0); + + running = 1; + if (retval == PAM_SUCCESS) + running = 0; + else + fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); + pam_end(pamh, retval); + #else + if (!(inputhash = crypt(passwd, hash))) + fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); + else + running = !!strcmp(inputhash, hash); + #endif // PAMAUTH_PATCH + if (running) { + XBell(dpy, 100); + failure = 1; + #if FAILURE_COMMAND_PATCH + failtrack++; + + if (failtrack >= failcount && failcount != 0) { + system(failcommand); + } + #endif // FAILURE_COMMAND_PATCH + } + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + break; + case XK_Escape: + explicit_bzero(&passwd, sizeof(passwd)); + len = 0; + break; + case XK_BackSpace: + if (len) + passwd[--len] = '\0'; + break; + #if CAPSCOLOR_PATCH + case XK_Caps_Lock: + caps = !caps; + break; + #endif // CAPSCOLOR_PATCH + #if MEDIAKEYS_PATCH + case XF86XK_AudioLowerVolume: + case XF86XK_AudioMute: + case XF86XK_AudioRaiseVolume: + case XF86XK_AudioPlay: + case XF86XK_AudioStop: + case XF86XK_AudioPrev: + case XF86XK_AudioNext: + XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev); + break; + #endif // MEDIAKEYS_PATCH + default: + #if CONTROLCLEAR_PATCH + if (controlkeyclear && iscntrl((int)buf[0])) + continue; + if (num && (len + num < sizeof(passwd))) + #else + if (num && !iscntrl((int)buf[0]) && + (len + num < sizeof(passwd))) + #endif // CONTROLCLEAR_PATCH + { + memcpy(passwd + len, buf, num); + len += num; + } + #if KEYPRESS_FEEDBACK_PATCH + if (blocks_enabled) + for (screen = 0; screen < nscreens; screen++) + draw_key_feedback(dpy, locks, screen); + #endif // KEYPRESS_FEEDBACK_PATCH + break; + } + #if CAPSCOLOR_PATCH + color = len ? (caps ? CAPS : INPUT) : (failure || failonclear ? FAILED : INIT); + #else + color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); + #endif // CAPSCOLOR_PATCH + if (running && oldc != color) { + for (screen = 0; screen < nscreens; screen++) { + #if DWM_LOGO_PATCH + drawlogo(dpy, locks[screen], color); + #elif BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + if (locks[screen]->bgmap) + XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); + else + XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); + XClearWindow(dpy, locks[screen]->win); + #else + XSetWindowBackground(dpy, + locks[screen]->win, + locks[screen]->colors[color]); + XClearWindow(dpy, locks[screen]->win); + #endif // BLUR_PIXELATED_SCREEN_PATCH + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + writemessage(dpy, locks[screen]->win, screen); + #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH + } + oldc = color; + } + } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { + rre = (XRRScreenChangeNotifyEvent*)&ev; + for (screen = 0; screen < nscreens; screen++) { + if (locks[screen]->win == rre->window) { + if (rre->rotation == RR_Rotate_90 || + rre->rotation == RR_Rotate_270) + XResizeWindow(dpy, locks[screen]->win, + rre->height, rre->width); + else + XResizeWindow(dpy, locks[screen]->win, + rre->width, rre->height); + XClearWindow(dpy, locks[screen]->win); + break; + } + } + } else { + for (screen = 0; screen < nscreens; screen++) + XRaiseWindow(dpy, locks[screen]->win); + } + + #if AUTO_TIMEOUT_PATCH + } + + time(¤ttime); + + if (currenttime >= lasttouched + timeoffset) { + if (!runonce || !runflag) { + runflag = 1; + system(command); + } + lasttouched = currenttime; + } + usleep(50); // artificial sleep for 50ms + #endif // AUTO_TIMEOUT_PATCH + } +} + +static struct lock * +lockscreen(Display *dpy, struct xrandr *rr, int screen) +{ + char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; + int i, ptgrab, kbgrab; + struct lock *lock; + XColor color, dummy; + XSetWindowAttributes wa; + Cursor invisible; + #if DWM_LOGO_PATCH + #ifdef XINERAMA + XineramaScreenInfo *info; + int n; + #endif + #endif // DWM_LOGO_PATCH + #if AUTO_TIMEOUT_PATCH + time(&lasttouched); + #endif // AUTO_TIMEOUT_PATCH + + if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) + return NULL; + + lock->screen = screen; + lock->root = RootWindow(dpy, lock->screen); + + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + render_lock_image(dpy, lock, image); + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH + + for (i = 0; i < NUMCOLS; i++) { + XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), + colorname[i], &color, &dummy); + lock->colors[i] = color.pixel; + } + + #if DWM_LOGO_PATCH + lock->x = DisplayWidth(dpy, lock->screen); + lock->y = DisplayHeight(dpy, lock->screen); + #ifdef XINERAMA + if ((info = XineramaQueryScreens(dpy, &n))) { + lock->xoff = info[0].x_org; + lock->yoff = info[0].y_org; + lock->mw = info[0].width; + lock->mh = info[0].height; + } else + #endif // XINERAMA + { + lock->xoff = lock->yoff = 0; + lock->mw = lock->x; + lock->mh = lock->y; + } + lock->drawable = XCreatePixmap(dpy, lock->root, lock->x, lock->y, DefaultDepth(dpy, screen)); + lock->gc = XCreateGC(dpy, lock->root, 0, NULL); + XSetLineAttributes(dpy, lock->gc, 1, LineSolid, CapButt, JoinMiter); + #endif // DWM_LOGO_PATCH + + /* init */ + wa.override_redirect = 1; + #if DWM_LOGO_PATCH && BLUR_PIXELATED_SCREEN_PATCH + #elif DWM_LOGO_PATCH + wa.background_pixel = lock->colors[BACKGROUND]; + #else + wa.background_pixel = lock->colors[INIT]; + #endif // DWM_LOGO_PATCH + lock->win = XCreateWindow(dpy, lock->root, 0, 0, + #if DWM_LOGO_PATCH + lock->x, + lock->y, + #else + DisplayWidth(dpy, lock->screen), + DisplayHeight(dpy, lock->screen), + #endif // DWM_LOGO_PATCH + 0, DefaultDepth(dpy, lock->screen), + CopyFromParent, + DefaultVisual(dpy, lock->screen), + CWOverrideRedirect | CWBackPixel, &wa); + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + if (lock->bgmap) + XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH + lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); + invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, + &color, &color, 0, 0); + XDefineCursor(dpy, lock->win, invisible); + + #if DWM_LOGO_PATCH + resizerectangles(lock); + #endif // DWM_LOGO_PATCH + + /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ + for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { + if (ptgrab != GrabSuccess) { + ptgrab = XGrabPointer(dpy, lock->root, False, + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask, GrabModeAsync, + GrabModeAsync, None, + #if UNLOCKSCREEN_PATCH + None, + #else + invisible, + #endif // UNLOCKSCREEN_PATCH + CurrentTime); + } + if (kbgrab != GrabSuccess) { + kbgrab = XGrabKeyboard(dpy, lock->root, True, + GrabModeAsync, GrabModeAsync, CurrentTime); + } + + /* input is grabbed: we can lock the screen */ + if (ptgrab == GrabSuccess && kbgrab == GrabSuccess) { + #if !UNLOCKSCREEN_PATCH + XMapRaised(dpy, lock->win); + #endif // UNLOCKSCREEN_PATCH + if (rr->active) + XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); + + XSelectInput(dpy, lock->root, SubstructureNotifyMask); + #if QUICKCANCEL_PATCH + locktime = time(NULL); + #endif // QUICKCANCEL_PATCH + #if DWM_LOGO_PATCH + drawlogo(dpy, lock, INIT); + #endif // DWM_LOGO_PATCH + #if ALPHA_PATCH + unsigned int opacity = (unsigned int)(alpha * 0xffffffff); + XChangeProperty(dpy, lock->win, XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False), XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1L); + XSync(dpy, False); + #endif // ALPHA_PATCH + return lock; + } + + /* retry on AlreadyGrabbed but fail on other errors */ + if ((ptgrab != AlreadyGrabbed && ptgrab != GrabSuccess) || + (kbgrab != AlreadyGrabbed && kbgrab != GrabSuccess)) + break; + + usleep(100000); + } + + /* we couldn't grab all input: fail out */ + if (ptgrab != GrabSuccess) + fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", + screen); + if (kbgrab != GrabSuccess) + fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", + screen); + return NULL; +} + +static void +usage(void) +{ + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); + #else + die("usage: slock [-v] [cmd [arg ...]]\n"); + #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH +} + +int +main(int argc, char **argv) { + struct xrandr rr; + struct lock **locks; + struct passwd *pwd; + struct group *grp; + uid_t duid; + gid_t dgid; + const char *hash; + Display *dpy; + int s, nlocks, nscreens; + #if DPMS_PATCH + CARD16 standby, suspend, off; + #endif // DPMS_PATCH + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + int i, count_fonts; + char **font_names; + #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH + ARGBEGIN { + case 'v': + fprintf(stderr, "slock-"VERSION"\n"); + return 0; + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + case 'm': + message = EARGF(usage()); + break; + case 'f': + if (!(dpy = XOpenDisplay(NULL))) + die("slock: cannot open display\n"); + font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts); + for (i=0; ipw_uid; + errno = 0; + if (!(grp = getgrnam(group))) + die("slock: getgrnam %s: %s\n", group, + errno ? strerror(errno) : "group entry not found"); + dgid = grp->gr_gid; + +#ifdef __linux__ + dontkillme(); +#endif + + #if PAMAUTH_PATCH + /* the contents of hash are used to transport the current user name */ + #endif // PAMAUTH_PATCH + hash = gethash(); + errno = 0; + #if !PAMAUTH_PATCH + if (!crypt("", hash)) + die("slock: crypt: %s\n", strerror(errno)); + #endif // PAMAUTH_PATCH + + if (!(dpy = XOpenDisplay(NULL))) + die("slock: cannot open display\n"); + + /* drop privileges */ + if (setgroups(0, NULL) < 0) + die("slock: setgroups: %s\n", strerror(errno)); + if (setgid(dgid) < 0) + die("slock: setgid: %s\n", strerror(errno)); + if (setuid(duid) < 0) + die("slock: setuid: %s\n", strerror(errno)); + + #if XRESOURCES_PATCH + config_init(dpy); + #endif // XRESOURCES_PATCH + + #if BLUR_PIXELATED_SCREEN_PATCH || BACKGROUND_IMAGE_PATCH + create_lock_image(dpy); + #endif // BLUR_PIXELATED_SCREEN_PATCH | BACKGROUND_IMAGE_PATCH + + #if KEYPRESS_FEEDBACK_PATCH + time_t t; + srand((unsigned) time(&t)); + #endif // KEYPRESS_FEEDBACK_PATCH + + /* check for Xrandr support */ + rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); + + /* get number of screens in display "dpy" and blank them */ + nscreens = ScreenCount(dpy); + if (!(locks = calloc(nscreens, sizeof(struct lock *)))) + die("slock: out of memory\n"); + for (nlocks = 0, s = 0; s < nscreens; s++) { + if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) { + #if MESSAGE_PATCH || COLOR_MESSAGE_PATCH + writemessage(dpy, locks[s]->win, s); + #endif // MESSAGE_PATCH | COLOR_MESSAGE_PATCH + nlocks++; + } else { + break; + } + } + XSync(dpy, 0); + + /* did we manage to lock everything? */ + if (nlocks != nscreens) + return 1; + + #if DPMS_PATCH + /* DPMS magic to disable the monitor */ + if (!DPMSCapable(dpy)) + die("slock: DPMSCapable failed\n"); + if (!DPMSEnable(dpy)) + die("slock: DPMSEnable failed\n"); + if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off)) + die("slock: DPMSGetTimeouts failed\n"); + if (!standby || !suspend || !off) + die("slock: at least one DPMS variable is zero\n"); + if (!DPMSSetTimeouts(dpy, monitortime, monitortime, monitortime)) + die("slock: DPMSSetTimeouts failed\n"); + + XSync(dpy, 0); + #endif // DPMS_PATCH + + /* run post-lock command */ + if (argc > 0) { + switch (fork()) { + case -1: + die("slock: fork failed: %s\n", strerror(errno)); + case 0: + if (close(ConnectionNumber(dpy)) < 0) + die("slock: close: %s\n", strerror(errno)); + execvp(argv[0], argv); + fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno)); + _exit(1); + } + } + + /* everything is now blank. Wait for the correct password */ + readpw(dpy, &rr, locks, nscreens, hash); + #if DPMS_PATCH + /* reset DPMS values to inital ones */ + DPMSSetTimeouts(dpy, standby, suspend, off); + XSync(dpy, 0); + #endif // DPMS_PATCH + + #if DWM_LOGO_PATCH + for (nlocks = 0, s = 0; s < nscreens; s++) { + XFreePixmap(dpy, locks[s]->drawable); + XFreeGC(dpy, locks[s]->gc); + } + + XSync(dpy, 0); + XCloseDisplay(dpy); + #endif // DWM_LOGO_PATCH + + return 0; +} diff --git a/slock-flexipatch/util.h b/slock-flexipatch/util.h new file mode 100644 index 0000000..6f748b8 --- /dev/null +++ b/slock-flexipatch/util.h @@ -0,0 +1,2 @@ +#undef explicit_bzero +void explicit_bzero(void *, size_t); diff --git a/st-flexipatch/config.mk b/st-flexipatch/config.mk index b0fe199..051ae2a 100644 --- a/st-flexipatch/config.mk +++ b/st-flexipatch/config.mk @@ -13,7 +13,7 @@ X11LIB = /usr/X11R6/lib PKG_CONFIG = pkg-config # Uncomment this for the alpha patch / ALPHA_PATCH -#XRENDER = -lXrender +XRENDER = -lXrender # Uncomment this for the themed cursor patch / THEMED_CURSOR_PATCH #XCURSOR = -lXcursor diff --git a/st-flexipatch/patches.def.h b/st-flexipatch/patches.def.h index 3444df7..60b0a88 100644 --- a/st-flexipatch/patches.def.h +++ b/st-flexipatch/patches.def.h @@ -22,7 +22,7 @@ * https://github.com/juliusHuelsmann/st-focus/ * https://st.suckless.org/patches/alpha_focus_highlight/ */ -#define ALPHA_FOCUS_HIGHLIGHT_PATCH 1 +#define ALPHA_FOCUS_HIGHLIGHT_PATCH 0 /* Adds gradient transparency to st, depends on the alpha patch. * https://st.suckless.org/patches/gradient/ @@ -274,7 +274,7 @@ * program of choice, e.g. open a file, view an image, open a URL. * https://st.suckless.org/patches/right_click_to_plumb/ */ -#define RIGHTCLICKTOPLUMB_PATCH 1 +#define RIGHTCLICKTOPLUMB_PATCH 0 /* Scroll back through terminal output using Shift+{PageUp, PageDown}. * https://st.suckless.org/patches/scrollback/ @@ -378,7 +378,7 @@ * scroll program. * https://st.suckless.org/patches/universcroll/ */ -#define UNIVERSCROLL_PATCH 0 +#define UNIVERSCROLL_PATCH 1 /* Use XftFontMatch in place of FcFontMatch. * @@ -407,7 +407,7 @@ * https://github.com/juliusHuelsmann/st-history-vim * https://st.suckless.org/patches/vim_browse/ */ -#define VIM_BROWSE_PATCH 1 +#define VIM_BROWSE_PATCH 0 /* Briefly inverts window content on terminal bell event. * https://st.suckless.org/patches/visualbell/ diff --git a/tabbed/.gitignore b/tabbed-flexipatch/.gitignore similarity index 52% rename from tabbed/.gitignore rename to tabbed-flexipatch/.gitignore index 7f45e15..d3d9bd9 100644 --- a/tabbed/.gitignore +++ b/tabbed-flexipatch/.gitignore @@ -1,3 +1,6 @@ *.o tabbed +xembed config.h +patches.h + diff --git a/tabbed/LICENSE b/tabbed-flexipatch/LICENSE similarity index 100% rename from tabbed/LICENSE rename to tabbed-flexipatch/LICENSE diff --git a/tabbed/Makefile b/tabbed-flexipatch/Makefile similarity index 94% rename from tabbed/Makefile rename to tabbed-flexipatch/Makefile index 1b95d15..2db479f 100644 --- a/tabbed/Makefile +++ b/tabbed-flexipatch/Makefile @@ -19,12 +19,16 @@ options: @echo CC $< @${CC} -c ${CFLAGS} $< -${OBJ}: config.h config.mk +${OBJ}: config.h config.mk patches.h config.h: @echo creating $@ from config.def.h @cp config.def.h $@ +patches.h: + @echo creating $@ from patches.def.h + @cp patches.def.h $@ + .o: @echo CC -o $@ @${CC} -o $@ $< ${LDFLAGS} diff --git a/tabbed/README b/tabbed-flexipatch/README similarity index 100% rename from tabbed/README rename to tabbed-flexipatch/README diff --git a/tabbed-flexipatch/README.md b/tabbed-flexipatch/README.md new file mode 100644 index 0000000..bb9ca57 --- /dev/null +++ b/tabbed-flexipatch/README.md @@ -0,0 +1,66 @@ +Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this tabbed 0.7 (5ddbc73, 2022-10-05) project has a different take on patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. + +For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/tabbed-flexipatch/blob/master/patches.def.h): +```c +#define ALPHA_PATCH 1 +``` + +Once you have found out what works for you and what doesn't then you should be in a better position to choose patches should you want to start patching from scratch. + +Alternatively if you have found the patches you want, but don't want the rest of the flexipatch entanglement on your plate then you may want to have a look at [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer); a custom pre-processor tool that removes all the unused flexipatch code leaving you with a build that contains the patches you selected. + +Refer to [https://tools.suckless.org/tabbed/](https://tools.suckless.org/tabbed/) for details on tabbed, how to install it and how it works. + +--- + +### Changelog: + +2022-03-14 - Added the awesomebar patch + +2021-07-29 - Added the bar-height and xresources patches + +2021-07-26 - Added the center patch and the bottom tabs patch + +2020-09-11 - Added icon patch + +2020-04-03 - Added alpha, autohide, clientnumber, hidetabs, keycode and keyrelease patches + +### Patches included: + + - [alpha](https://tools.suckless.org/tabbed/patches/alpha/) + - the alpha patch allows tabbed to handle windows with transparency + + - [autohide](https://tools.suckless.org/tabbed/patches/autohide/) + - hides the tab bar if only one tab is open + + - awesomebar + - evenly divides tab bar space between the tabbed windows + + - [bar-height](https://tools.suckless.org/tabbed/patches/bar-height/) + - allows the height of the bar to be manually specified + + - [bottomtabs](https://github.com/bakkeby/patches/blob/master/tabbed/tabbed-bottomtabs-0.6-20200512-dabf6a2.diff) + - moves the tabs / bar to the bottom of the tabbed window + + - [center](https://github.com/bakkeby/patches/blob/master/tabbed/tabbed-center-0.6-20200512-dabf6a2.diff) + - centers window titles in tabs + + - [clientnumber](https://tools.suckless.org/tabbed/patches/clientnumber/) + - prints the position number of the client before the window title + + - [hidetabs](https://tools.suckless.org/tabbed/patches/hidetabs/) + - this patch hides all the tabs and only shows them when Mod+Shift is pressed + + - [icon](https://tools.suckless.org/tabbed/patches/icon/) + - this patch gives tabbed an icon + - the icon is the currently selected tab's icon + - if the selected tab has no icon (or no tab is selected), use a default icon + + - [keycode](https://tools.suckless.org/tabbed/patches/keycode/) + - with this patch, handling key input is done with keycodes instead of keysyms making the keyboard layout independent + + - [keyrelease](https://tools.suckless.org/tabbed/patches/keyrelease/) + - this patch enables for function handling on KeyRelease events + + - [xresources](https://tools.suckless.org/tabbed/patches/xresources/) + - allows tabbed colors to be defined via Xresources diff --git a/tabbed/TODO b/tabbed-flexipatch/TODO similarity index 100% rename from tabbed/TODO rename to tabbed-flexipatch/TODO diff --git a/tabbed/arg.h b/tabbed-flexipatch/arg.h similarity index 100% rename from tabbed/arg.h rename to tabbed-flexipatch/arg.h diff --git a/tabbed-flexipatch/config.def.h b/tabbed-flexipatch/config.def.h new file mode 100644 index 0000000..1134f61 --- /dev/null +++ b/tabbed-flexipatch/config.def.h @@ -0,0 +1,138 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static char font[] = "Hack Nerd Font:size=12"; +static char* normbgcolor = "#222222"; +static char* normfgcolor = "#cccccc"; +static char* selbgcolor = "#555555"; +static char* selfgcolor = "#ffffff"; +static char* urgbgcolor = "#111111"; +static char* urgfgcolor = "#cc0000"; +static const char before[] = "<"; +static const char after[] = ">"; +static const char titletrim[] = "..."; +#if AWESOMEBAR_PATCH +static int tabwidth = 200; +#else +static const int tabwidth = 200; +#endif // AWESOMEBAR_PATCH +static const Bool foreground = True; +static Bool urgentswitch = False; + +#if BAR_HEIGHT_PATCH +static const int barheight = 0; /* 0 means derive by font (default), otherwise absolute height */ +#endif // BAR_HEIGHT_PATCH + +/* + * Where to place a new tab when it is opened. When npisrelative is True, + * then the current position is changed + newposition. If npisrelative + * is False, then newposition is an absolute position. + */ +static int newposition = 0; +static Bool npisrelative = False; + +#define SETPROP(p) { \ + .v = (char *[]){ "/bin/sh", "-c", \ + "prop=\"`xwininfo -children -id $1 | grep '^ 0x' |" \ + "sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \ + "xargs -0 printf %b | dmenu -l 10 -w $1`\" &&" \ + "xprop -id $1 -f $0 8s -set $0 \"$prop\"", \ + p, winid, NULL \ + } \ +} + +#if XRESOURCES_PATCH +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "font", STRING, &font }, + { "color0", STRING, &normbgcolor }, + { "color4", STRING, &normfgcolor }, + { "color4", STRING, &selbgcolor }, + { "color7", STRING, &selfgcolor }, + { "color2", STRING, &urgbgcolor }, + { "color3", STRING, &urgfgcolor }, +}; +#endif // XRESOURCES_PATCH + +#define MODKEY ControlMask +#if KEYCODE_PATCH +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY|ShiftMask, 36, focusonce, { 0 } }, + { MODKEY|ShiftMask, 36, spawn, { 0 } }, + { MODKEY|ShiftMask, 46, rotate, { .i = +1 } }, + { MODKEY|ShiftMask, 43, rotate, { .i = -1 } }, + { MODKEY|ShiftMask, 44, movetab, { .i = -1 } }, + { MODKEY|ShiftMask, 45, movetab, { .i = +1 } }, + { MODKEY, 23, rotate, { .i = 0 } }, + { MODKEY, 49, spawn, SETPROP("_TABBED_SELECT_TAB") }, + { MODKEY, 10, move, { .i = 0 } }, + { MODKEY, 11, move, { .i = 1 } }, + { MODKEY, 12, move, { .i = 2 } }, + { MODKEY, 13, move, { .i = 3 } }, + { MODKEY, 14, move, { .i = 4 } }, + { MODKEY, 15, move, { .i = 5 } }, + { MODKEY, 16, move, { .i = 6 } }, + { MODKEY, 17, move, { .i = 7 } }, + { MODKEY, 18, move, { .i = 8 } }, + { MODKEY, 19, move, { .i = 9 } }, + { MODKEY, 24, killclient, { 0 } }, + { MODKEY, 30, focusurgent, { .v = NULL } }, + { MODKEY|ShiftMask, 30, toggle, { .v = (void*) &urgentswitch } }, + { 0, 95, fullscreen, { 0 } }, + #if HIDETABS_PATCH + { MODKEY, 50, showbar, { .i = 1 } }, + { ShiftMask, 37, showbar, { .i = 1 } }, + #endif // HIDETABS_PATCH +}; +#else +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY|ShiftMask, XK_Return, focusonce, { 0 } }, + { MODKEY|ShiftMask, XK_Return, spawn, { 0 } }, + + { MODKEY|ShiftMask, XK_l, rotate, { .i = +1 } }, + { MODKEY|ShiftMask, XK_h, rotate, { .i = -1 } }, + { MODKEY|ShiftMask, XK_j, movetab, { .i = -1 } }, + { MODKEY|ShiftMask, XK_k, movetab, { .i = +1 } }, + { MODKEY, XK_Tab, rotate, { .i = 0 } }, + + { MODKEY, XK_grave, spawn, SETPROP("_TABBED_SELECT_TAB") }, + { MODKEY, XK_1, move, { .i = 0 } }, + { MODKEY, XK_2, move, { .i = 1 } }, + { MODKEY, XK_3, move, { .i = 2 } }, + { MODKEY, XK_4, move, { .i = 3 } }, + { MODKEY, XK_5, move, { .i = 4 } }, + { MODKEY, XK_6, move, { .i = 5 } }, + { MODKEY, XK_7, move, { .i = 6 } }, + { MODKEY, XK_8, move, { .i = 7 } }, + { MODKEY, XK_9, move, { .i = 8 } }, + { MODKEY, XK_0, move, { .i = 9 } }, + + { MODKEY, XK_q, killclient, { 0 } }, + + { MODKEY, XK_u, focusurgent, { 0 } }, + { MODKEY|ShiftMask, XK_u, toggle, { .v = (void*) &urgentswitch } }, + + { 0, XK_F11, fullscreen, { 0 } }, + #if HIDETABS_PATCH + { MODKEY, XK_Shift_L, showbar, { .i = 1 } }, + { ShiftMask, XK_Control_L, showbar, { .i = 1 } }, + #endif // HIDETABS_PATCH +}; +#endif // KEYCODE_PATCH + +#if KEYRELEASE_PATCH +static const Key keyreleases[] = { + /* modifier key function argument */ + #if HIDETABS_PATCH + { MODKEY|ShiftMask, XK_Shift_L, showbar, { .i = 0 } }, + { MODKEY|ShiftMask, XK_Control_L, showbar, { .i = 0 } }, + #else + { 0, XK_Shift_L, NULL, { 0 } }, + #endif // HIDETABS_PATCH + +}; +#endif // KEYRELEASE_PATCH diff --git a/tabbed/config.mk b/tabbed-flexipatch/config.mk similarity index 80% rename from tabbed/config.mk rename to tabbed-flexipatch/config.mk index 5477af4..8bd9dab 100644 --- a/tabbed/config.mk +++ b/tabbed-flexipatch/config.mk @@ -1,5 +1,5 @@ # tabbed version -VERSION = 0.6 +VERSION = 0.7 # Customize below to fit your system @@ -16,9 +16,12 @@ FREETYPEINC = /usr/include/freetype2 # OpenBSD (uncomment) #FREETYPEINC = ${X11INC}/freetype2 +# Uncomment this for the alpha patch / ALPHA_PATCH +XRENDER = -lXrender + # includes and libs INCS = -I. -I/usr/include -I$(X11INC) -I${FREETYPEINC} -LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft -lXrender +LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${FREETYPELIBS} ${XRENDER} # flags CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE diff --git a/tabbed-flexipatch/patch/hidebar.c b/tabbed-flexipatch/patch/hidebar.c new file mode 100644 index 0000000..fccfc2d --- /dev/null +++ b/tabbed-flexipatch/patch/hidebar.c @@ -0,0 +1,6 @@ +void +showbar(const Arg *arg) +{ + barvisibility = arg->i; + drawbar(); +} \ No newline at end of file diff --git a/tabbed-flexipatch/patch/hidebar.h b/tabbed-flexipatch/patch/hidebar.h new file mode 100644 index 0000000..b5b4ef0 --- /dev/null +++ b/tabbed-flexipatch/patch/hidebar.h @@ -0,0 +1 @@ +static void showbar(const Arg *arg); \ No newline at end of file diff --git a/tabbed-flexipatch/patch/icon.c b/tabbed-flexipatch/patch/icon.c new file mode 100644 index 0000000..4562c5e --- /dev/null +++ b/tabbed-flexipatch/patch/icon.c @@ -0,0 +1,41 @@ +static unsigned long icon[ICON_WIDTH * ICON_HEIGHT + 2]; + +void +xseticon(void) +{ + Atom ret_type; + XWMHints *wmh, *cwmh; + int ret_format; + unsigned long ret_nitems, ret_nleft; + long offset = 0L; + unsigned char *data; + + wmh = XGetWMHints(dpy, win); + wmh->flags &= ~(IconPixmapHint | IconMaskHint); + wmh->icon_pixmap = wmh->icon_mask = None; + + + if (XGetWindowProperty(dpy, clients[sel]->win, wmatom[WMIcon], offset, LONG_MAX, False, + XA_CARDINAL, &ret_type, &ret_format, &ret_nitems, + &ret_nleft, &data) == Success && + ret_type == XA_CARDINAL && ret_format == 32) + { + XChangeProperty(dpy, win, wmatom[WMIcon], XA_CARDINAL, 32, + PropModeReplace, data, ret_nitems); + } else if ((cwmh = XGetWMHints(dpy, clients[sel]->win)) && cwmh->flags & IconPixmapHint) { + XDeleteProperty(dpy, win, wmatom[WMIcon]); + wmh->flags |= IconPixmapHint; + wmh->icon_pixmap = cwmh->icon_pixmap; + if (cwmh->flags & IconMaskHint) { + wmh->flags |= IconMaskHint; + wmh->icon_mask = cwmh->icon_mask; + } + XFree(cwmh); + } else { + XChangeProperty(dpy, win, wmatom[WMIcon], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) icon, ICON_WIDTH * ICON_HEIGHT + 2); + } + XSetWMHints(dpy, win, wmh); + XFree(wmh); + XFree(data); +} \ No newline at end of file diff --git a/tabbed-flexipatch/patch/icon.h b/tabbed-flexipatch/patch/icon.h new file mode 100644 index 0000000..7a740e5 --- /dev/null +++ b/tabbed-flexipatch/patch/icon.h @@ -0,0 +1,43 @@ +/* GIMP RGBA C-Source image dump (icon.c) */ + +#define ICON_WIDTH (16) +#define ICON_HEIGHT (16) +#define ICON_BYTES_PER_PIXEL (4) /* 2:RGB16, 3:RGB, 4:RGBA */ +#define ICON_COMMENT \ + "GIMP -> Export -> C-Source -> Prefixed name = ICON, Use macros, Save alpha" +#define ICON_PIXEL_DATA ((unsigned char*) ICON_pixel_data) +static const unsigned char ICON_pixel_data[16 * 16 * 4 + 1] = + "\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000" + "\000\377\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000" + "\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000" + "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000" + "\000\377\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377" + "\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000" + "\000\000\377\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377" + "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000" + "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\001\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000" + "\000\000\377\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\377\000\000\000\000\000\000\000" + "\000\000\000\000\000\000\000\000\377\000\000\000\377"; + +static void xseticon(void); \ No newline at end of file diff --git a/tabbed-flexipatch/patch/include.c b/tabbed-flexipatch/patch/include.c new file mode 100644 index 0000000..59a24eb --- /dev/null +++ b/tabbed-flexipatch/patch/include.c @@ -0,0 +1,13 @@ +/* Patches */ +#if HIDETABS_PATCH +#include "hidebar.c" +#endif +#if ICON_PATCH +#include "icon.c" +#endif +#if KEYRELEASE_PATCH +#include "keyrelease.c" +#endif +#if XRESOURCES_PATCH +#include "xresources.c" +#endif \ No newline at end of file diff --git a/tabbed-flexipatch/patch/include.h b/tabbed-flexipatch/patch/include.h new file mode 100644 index 0000000..1ef3327 --- /dev/null +++ b/tabbed-flexipatch/patch/include.h @@ -0,0 +1,13 @@ +/* Patches */ +#if HIDETABS_PATCH +#include "hidebar.h" +#endif +#if ICON_PATCH +#include "icon.h" +#endif +#if KEYRELEASE_PATCH +#include "keyrelease.h" +#endif +#if XRESOURCES_PATCH +#include "xresources.h" +#endif \ No newline at end of file diff --git a/tabbed-flexipatch/patch/keyrelease.c b/tabbed-flexipatch/patch/keyrelease.c new file mode 100644 index 0000000..4cf422c --- /dev/null +++ b/tabbed-flexipatch/patch/keyrelease.c @@ -0,0 +1,15 @@ +void +keyrelease(const XEvent *e) +{ + const XKeyEvent *ev = &e->xkey; + unsigned int i; + KeySym keysym; + + keysym = XkbKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0, 0); + for (i = 0; i < LENGTH(keyreleases); i++) { + if (keysym == keyreleases[i].keysym && + CLEANMASK(keyreleases[i].mod) == CLEANMASK(ev->state) && + keyreleases[i].func) + keyreleases[i].func(&(keyreleases[i].arg)); + } +} \ No newline at end of file diff --git a/tabbed-flexipatch/patch/keyrelease.h b/tabbed-flexipatch/patch/keyrelease.h new file mode 100644 index 0000000..f58d2a3 --- /dev/null +++ b/tabbed-flexipatch/patch/keyrelease.h @@ -0,0 +1 @@ +static void keyrelease(const XEvent *e); \ No newline at end of file diff --git a/tabbed-flexipatch/patch/xresources.c b/tabbed-flexipatch/patch/xresources.c new file mode 100644 index 0000000..5316869 --- /dev/null +++ b/tabbed-flexipatch/patch/xresources.c @@ -0,0 +1,50 @@ +void +config_init(void) +{ + char *resm; + XrmDatabase db; + ResourcePref *p; + + XrmInitialize(); + resm = XResourceManagerString(dpy); + if (!resm) + return; + + db = XrmGetStringDatabase(resm); + for (p = resources; p < resources + LENGTH(resources); p++) + resource_load(db, p->name, p->type, p->dst); +} + +int +resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) +{ + char **sdst = dst; + int *idst = dst; + float *fdst = dst; + + char fullname[256]; + char fullclass[256]; + char *type; + XrmValue ret; + + snprintf(fullname, sizeof(fullname), "%s.%s", "tabbed", name); + snprintf(fullclass, sizeof(fullclass), "%s.%s", "tabbed", name); + fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; + + XrmGetResource(db, fullname, fullclass, &type, &ret); + if (ret.addr == NULL || strncmp("String", type, 64)) + return 1; + + switch (rtype) { + case STRING: + *sdst = ret.addr; + break; + case INTEGER: + *idst = strtoul(ret.addr, NULL, 10); + break; + case FLOAT: + *fdst = strtof(ret.addr, NULL); + break; + } + return 0; +} \ No newline at end of file diff --git a/tabbed-flexipatch/patch/xresources.h b/tabbed-flexipatch/patch/xresources.h new file mode 100644 index 0000000..35c094b --- /dev/null +++ b/tabbed-flexipatch/patch/xresources.h @@ -0,0 +1,17 @@ +#include + +/* Xresources preferences */ +enum resource_type { + STRING = 0, + INTEGER = 1, + FLOAT = 2 +}; + +typedef struct { + char *name; + enum resource_type type; + void *dst; +} ResourcePref; + +static void config_init(void); +static int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst); \ No newline at end of file diff --git a/tabbed-flexipatch/patches.def.h b/tabbed-flexipatch/patches.def.h new file mode 100644 index 0000000..bf0a7fa --- /dev/null +++ b/tabbed-flexipatch/patches.def.h @@ -0,0 +1,83 @@ +/* + * This file contains patch control flags. + * + * In principle you should be able to mix and match any patches + * you may want. In cases where patches are logically incompatible + * one patch may take precedence over the other as noted in the + * relevant descriptions. + */ + +/* Patches */ + +/* This patch allows tabbed to handle windows with transparency. + * You need to uncomment the corresponding line in config.mk to use the -lXrender library + * when including this patch. + * https://tools.suckless.org/tabbed/patches/alpha/ + */ +#define ALPHA_PATCH 1 + +/* This patch hides the tab bar if only one tab is open. + * https://tools.suckless.org/tabbed/patches/autohide/ + */ +#define AUTOHIDE_PATCH 1 + +/* Named after the window title bar patch for dwm this patch divides the + * tab bar space evenly between the tabbed windows. + */ +#define AWESOMEBAR_PATCH 1 + +/* This patch allows the height of the bar to be manually specified. + * https://tools.suckless.org/tabbed/patches/bar-height/ + */ +#define BAR_HEIGHT_PATCH 1 + +/* This patch moves the tabs / bar to the bottom of the tabbed window. + * https://github.com/bakkeby/patches/blob/master/tabbed/tabbed-bottomtabs-0.6-20200512-dabf6a2.diff + */ +#define BOTTOM_TABS_PATCH 0 + +/* This patch centers the tab text. + * https://www.reddit.com/r/suckless/comments/oi4zjl/tabbed_text_alignment/ + * https://github.com/bakkeby/patches/blob/master/tabbed/tabbed-center-0.6-20200512-dabf6a2.diff + */ +#define CENTER_PATCH 1 + +/* This patch prints the position number of the client before the window title. + * https://tools.suckless.org/tabbed/patches/clientnumber/ + */ +#define CLIENTNUMBER_PATCH 1 + +/* This patch hides all the tabs and only shows them when Mod+Shift is pressed. All functions + * with switching, rotating, and creating tabs involve Mod+Shift. When not doing one of these + * functions, visibility of the tabs is not needed. + * This patch relies on the keyrelease patch to support show/hide on keypress/keyrelease. + * https://tools.suckless.org/tabbed/patches/hidetabs/ + */ +#define HIDETABS_PATCH 1 + +/* This patch gives tabbed an icon. This icon is the currently selected tab's icon. + * If the selected tab has no icon (or no tab is selected), use a (admittedly ugly) default icon. + * + * This patch supports both the new EWMH (_NET_WM_ICON) and + * legacy ICCCM (WM_ICON) ways of setting a window's icon. + * + * https://tools.suckless.org/tabbed/patches/icon/ + */ +#define ICON_PATCH 1 + +/* With this patch, handling key input is done with keycodes instead of keysyms making + * the keyboard layout independent. + * https://tools.suckless.org/tabbed/patches/keycode/ + */ +#define KEYCODE_PATCH 0 + +/* This patch enables for function handling on KeyRelease events. + * For example usage see: hidetabs + * https://tools.suckless.org/tabbed/patches/keyrelease/ + */ +#define KEYRELEASE_PATCH 1 + +/* This patch allows tabbed colors to be defined via Xresources. + * https://tools.suckless.org/tabbed/patches/xresources/ + */ +#define XRESOURCES_PATCH 1 diff --git a/tabbed/tabbed.1 b/tabbed-flexipatch/tabbed.1 similarity index 100% rename from tabbed/tabbed.1 rename to tabbed-flexipatch/tabbed.1 diff --git a/tabbed/tabbed.c b/tabbed-flexipatch/tabbed.c similarity index 84% rename from tabbed/tabbed.c rename to tabbed-flexipatch/tabbed.c index c01e0fc..8f15629 100644 --- a/tabbed/tabbed.c +++ b/tabbed-flexipatch/tabbed.c @@ -17,6 +17,7 @@ #include #include +#include "patches.h" #include "arg.h" /* XEMBED messages */ @@ -48,8 +49,19 @@ #define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) enum { ColFG, ColBG, ColLast }; /* color */ -enum { WMProtocols, WMDelete, WMName, WMState, WMFullscreen, - XEmbed, WMSelectTab, WMLast }; /* default atoms */ +enum { + WMProtocols, + WMDelete, + WMName, + WMState, + WMFullscreen, + XEmbed, + WMSelectTab, + #if ICON_PATCH + WMIcon, + #endif // ICON_PATCH + WMLast +}; /* default atoms */ typedef union { int i; @@ -58,7 +70,11 @@ typedef union { typedef struct { unsigned int mod; + #if KEYCODE_PATCH + KeyCode keycode; + #else KeySym keysym; + #endif // KEYCODE_PATCH void (*func)(const Arg *); const Arg arg; } Key; @@ -136,6 +152,8 @@ static void updatetitle(int c); static int xerror(Display *dpy, XErrorEvent *ee); static void xsettitle(Window w, const char *str); +#include "patch/include.h" + /* variables */ static int screen; static void (*handler[LASTEvent]) (const XEvent *) = { @@ -149,10 +167,16 @@ static void (*handler[LASTEvent]) (const XEvent *) = { [Expose] = expose, [FocusIn] = focusin, [KeyPress] = keypress, + #if KEYRELEASE_PATCH + [KeyRelease] = keyrelease, + #endif // KEYRELEASE_PATCH [MapRequest] = maprequest, [PropertyNotify] = propertynotify, }; -static int bh, obh, wx, wy, ww, wh, vbh; +static int bh, obh, wx, wy, ww, wh; +#if AUTOHIDE_PATCH || HIDETABS_PATCH +static int vbh; +#endif // AUTOHIDE_PATCH | HIDETABS_PATCH static unsigned int numlockmask; static Bool running = True, nextfocus, doinitspawn = True, fillagain = False, closelastclient = False, @@ -169,15 +193,22 @@ static char winid[64]; static char **cmd; static char *wmname = "tabbed"; static const char *geometry; +#if HIDETABS_PATCH +static Bool barvisibility = False; +#endif // HIDETABS_PATCH +#if ALPHA_PATCH static Colormap cmap; static Visual *visual = NULL; +#endif // ALPHA_PATCH char *argv0; /* configuration, allows nested code to access above variables */ #include "config.h" +#include "patch/include.c" + void buttonpress(const XEvent *e) { @@ -185,7 +216,11 @@ buttonpress(const XEvent *e) int i, fc; Arg arg; + #if BOTTOM_TABS_PATCH + if (ev->y < wh - bh) + #else if (ev->y < 0 || ev->y > bh) + #endif // BOTTOM_TABS_PATCH return; if (((fc = getfirsttab()) > 0 && ev->x < TEXTW(before)) || ev->x < 0) @@ -257,8 +292,14 @@ configurenotify(const XEvent *e) ww = ev->width; wh = ev->height; XFreePixmap(dpy, dc.drawable); + #if ALPHA_PATCH dc.drawable = XCreatePixmap(dpy, win, ww, wh, 32); + #else + dc.drawable = XCreatePixmap(dpy, root, ww, wh, + DefaultDepth(dpy, screen)); + #endif // ALPHA_PATCH + if (!obh && (wh <= bh)) { obh = bh; bh = 0; @@ -326,31 +367,67 @@ void drawbar(void) { XftColor *col; - int c, cc, fc, width, nbh, i; + int c, cc, fc, width; + #if AUTOHIDE_PATCH || HIDETABS_PATCH + int nbh; + #endif // AUTOHIDE_PATCH | HIDETABS_PATCH char *name = NULL; - char tabtitle[256]; + #if CLIENTNUMBER_PATCH + char tabtitle[312]; + #endif // CLIENTNUMBER_PATCH + #if BOTTOM_TABS_PATCH + int by = wh - bh; + #else + int by = 0; + #endif // BOTTOM_TABS_PATCH + + #if AUTOHIDE_PATCH || HIDETABS_PATCH + #if AUTOHIDE_PATCH && HIDETABS_PATCH + nbh = barvisibility && nclients > 1 ? vbh : 0; + #elif HIDETABS_PATCH + nbh = barvisibility ? vbh : 0; + #elif AUTOHIDE_PATCH + nbh = nclients > 1 ? vbh : 0; + #endif + if (nbh != bh) { + bh = nbh; + #if BOTTOM_TABS_PATCH + by = wh - bh; + #endif // BOTTOM_TABS_PATCH + for (c = 0; c < nclients; c++) + #if BOTTOM_TABS_PATCH + XMoveResizeWindow(dpy, clients[c]->win, 0, 0, ww, wh - bh); + #else + XMoveResizeWindow(dpy, clients[c]->win, 0, bh, ww, wh - bh); + #endif // BOTTOM_TABS_PATCH + } + #endif // AUTOHIDE_PATCH | HIDETABS_PATCH if (nclients == 0) { dc.x = 0; dc.w = ww; XFetchName(dpy, win, &name); drawtext(name ? name : "", dc.norm); - XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, vbh, 0, 0); + #if AUTOHIDE_PATCH + XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, vbh, 0, by); + #else + XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, by); + #endif // AUTOHIDE_PATCH XSync(dpy, False); return; } - nbh = nclients > 1 ? vbh : 0; - if (bh != nbh) { - bh = nbh; - for (i = 0; i < nclients; i++) - XMoveResizeWindow(dpy, clients[i]->win, 0, bh, ww, wh - bh); - } + #if AUTOHIDE_PATCH || HIDETABS_PATCH if (bh == 0) return; + #endif // AUTOHIDE_PATCH | HIDETABS_PATCH width = ww; + + #if AWESOMEBAR_PATCH + tabwidth = ww / nclients; + #endif // AWESOMEBAR_PATCH cc = ww / tabwidth; if (nclients > cc) cc = (ww - TEXTW(before) - TEXTW(after)) / tabwidth; @@ -379,13 +456,17 @@ drawbar(void) } else { col = clients[c]->urgent ? dc.urg : dc.norm; } + #if CLIENTNUMBER_PATCH snprintf(tabtitle, sizeof(tabtitle), "%d: %s", c + 1, clients[c]->name); drawtext(tabtitle, col); + #else + drawtext(clients[c]->name, col); + #endif // CLIENTNUMBER_PATCH dc.x += dc.w; clients[c]->tabx = dc.x; } - XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, 0); + XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, by); XSync(dpy, False); } @@ -416,12 +497,18 @@ drawtext(const char *text, XftColor col[ColLast]) memcpy(buf, text, len); if (len < olen) { - for (i = len, j = strlen(titletrim); j && i; - buf[--i] = titletrim[--j]) - ; + for (i = len, j = strlen(titletrim); j && i; buf[--i] = titletrim[--j]); } + #if CENTER_PATCH + else + x += (dc.w - TEXTW(buf)) / 2; // center text + #endif // CENTER_PATCH + #if ALPHA_PATCH d = XftDrawCreate(dpy, dc.drawable, visual, cmap); + #else + d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen)); + #endif // ALPHA_PATCH XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); XftDrawDestroy(d); } @@ -469,6 +556,10 @@ focus(int c) n += snprintf(&buf[n], sizeof(buf) - n, " %s", cmd[i]); xsettitle(win, buf); + #if ICON_PATCH + XChangeProperty(dpy, win, wmatom[WMIcon], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) icon, ICON_WIDTH * ICON_HEIGHT + 2); + #endif // ICON_PATCH XRaiseWindow(dpy, win); return; @@ -488,6 +579,9 @@ focus(int c) lastsel = sel; sel = c; } + #if ICON_PATCH + xseticon(); + #endif // ICON_PATCH if (clients[c]->urgent && (wmh = XGetWMHints(dpy, clients[c]->win))) { wmh->flags &= ~XUrgencyHint; @@ -589,7 +683,11 @@ getcolor(const char *colstr) { XftColor color; - if (!XftColorAllocName(dpy, visual, cmap, colstr, &color)) + #if ALPHA_PATCH + if (!XftColorAllocName(dpy, visual, cmap, colstr, &color)) + #else + if (!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) + #endif // ALPHA_PATCH die("%s: cannot allocate color '%s'\n", argv0, colstr); return color; @@ -676,11 +774,18 @@ keypress(const XEvent *e) { const XKeyEvent *ev = &e->xkey; unsigned int i; + #if !KEYCODE_PATCH KeySym keysym; keysym = XkbKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0, 0); + #endif // KEYCODE_PATCH for (i = 0; i < LENGTH(keys); i++) { - if (keysym == keys[i].keysym && + if ( + #if KEYCODE_PATCH + ev->keycode == keys[i].keycode && + #else + keysym == keys[i].keysym && + #endif // KEYCODE_PATCH CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) && keys[i].func) keys[i].func(&(keys[i].arg)); @@ -717,7 +822,9 @@ manage(Window w) int i, j, nextpos; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask | LockMask }; + #if !KEYCODE_PATCH KeyCode code; + #endif // KEYCODE_PATCH Client *c; XEvent e; @@ -728,6 +835,13 @@ manage(Window w) XSync(dpy, False); for (i = 0; i < LENGTH(keys); i++) { + #if KEYCODE_PATCH + for (j = 0; j < LENGTH(modifiers); ++j) { + XGrabKey(dpy, keys[i].keycode, + keys[i].mod | modifiers[j], w, + True, GrabModeAsync, GrabModeAsync); + } + #else if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) { for (j = 0; j < LENGTH(modifiers); j++) { XGrabKey(dpy, code, keys[i].mod | @@ -735,8 +849,21 @@ manage(Window w) GrabModeAsync, GrabModeAsync); } } + #endif // KEYCODE_PATCH } + #if KEYRELEASE_PATCH + for (i = 0; i < LENGTH(keyreleases); i++) { + if ((code = XKeysymToKeycode(dpy, keyreleases[i].keysym))) { + for (j = 0; j < LENGTH(modifiers); j++) { + XGrabKey(dpy, code, keyreleases[i].mod | + modifiers[j], w, True, + GrabModeAsync, GrabModeAsync); + } + } + } + #endif // KEYRELEASE_PATCH + c = ecalloc(1, sizeof *c); c->win = w; @@ -882,9 +1009,17 @@ propertynotify(const XEvent *e) } } XFree(wmh); + #if ICON_PATCH + if (c == sel) + xseticon(); + #endif // ICON_PATCH } else if (ev->state != PropertyDelete && ev->atom == XA_WM_NAME && (c = getclient(ev->window)) > -1) { updatetitle(c); + #if ICON_PATCH + } else if (ev->atom == wmatom[WMIcon] && (c = getclient(ev->window)) > -1 && c == sel) { + xseticon(); + #endif // ICON_PATCH } } @@ -895,7 +1030,11 @@ resize(int c, int w, int h) XWindowChanges wc; ce.x = 0; + #if BOTTOM_TABS_PATCH + ce.y = wc.y = 0; + #else ce.y = wc.y = bh; + #endif // BOTTOM_TABS_PATCH ce.width = wc.width = w; ce.height = wc.height = h; ce.type = ConfigureNotify; @@ -998,7 +1137,16 @@ setup(void) screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); initfont(font); - vbh = dc.h = dc.font.height + 2; + #if BAR_HEIGHT_PATCH + dc.h = (barheight ? barheight : dc.font.height + 2); + #else + dc.h = dc.font.height + 2; + #endif // BAR_HEIGHT_PATCH + #if AUTOHIDE_PATCH || HIDETABS_PATCH + vbh = dc.h; + #else + bh = dc.h; + #endif // AUTOHIDE_PATCH | HIDETABS_PATCH /* init atoms */ wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); @@ -1009,6 +1157,9 @@ setup(void) wmatom[WMSelectTab] = XInternAtom(dpy, "_TABBED_SELECT_TAB", False); wmatom[WMState] = XInternAtom(dpy, "_NET_WM_STATE", False); wmatom[XEmbed] = XInternAtom(dpy, "_XEMBED", False); + #if ICON_PATCH + wmatom[WMIcon] = XInternAtom(dpy, "_NET_WM_ICON", False); + #endif // ICON_PATCH /* init appearance */ wx = 0; @@ -1044,6 +1195,7 @@ setup(void) wy = dh + wy - wh - 1; } + #if ALPHA_PATCH XVisualInfo *vis; XRenderPictFormat *fmt; int nvi; @@ -1072,13 +1224,15 @@ setup(void) } cmap = XCreateColormap( dpy, root, visual, None); + #endif // ALPHA_PATCH + dc.norm[ColBG] = getcolor(normbgcolor); dc.norm[ColFG] = getcolor(normfgcolor); dc.sel[ColBG] = getcolor(selbgcolor); dc.sel[ColFG] = getcolor(selfgcolor); dc.urg[ColBG] = getcolor(urgbgcolor); dc.urg[ColFG] = getcolor(urgfgcolor); - + #if ALPHA_PATCH XSetWindowAttributes attrs; attrs.background_pixel = dc.norm[ColBG].pixel; attrs.border_pixel = dc.norm[ColFG].pixel; @@ -1086,21 +1240,29 @@ setup(void) attrs.event_mask = FocusChangeMask | KeyPressMask | ExposureMask | VisibilityChangeMask | StructureNotifyMask | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; - attrs.background_pixmap = None ; + attrs.background_pixmap = None; attrs.colormap = cmap; - win = XCreateWindow(dpy, root, wx, wy, - ww, wh, 0, 32, InputOutput, - visual, CWBackPixmap | CWBorderPixel | CWBitGravity - | CWEventMask | CWColormap, &attrs); + win = XCreateWindow(dpy, root, wx, wy, ww, wh, 0, 32, InputOutput, + visual, CWBackPixmap | CWBorderPixel | CWBitGravity + | CWEventMask | CWColormap, &attrs); - dc.drawable = XCreatePixmap(dpy, win, ww, wh, - 32); + dc.drawable = XCreatePixmap(dpy, win, ww, wh, 32); dc.gc = XCreateGC(dpy, dc.drawable, 0, 0); + #else + dc.drawable = XCreatePixmap(dpy, root, ww, wh, + DefaultDepth(dpy, screen)); + dc.gc = XCreateGC(dpy, root, 0, 0); + win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, + dc.norm[ColFG].pixel, dc.norm[ColBG].pixel); + #endif // ALPHA_PATCH XMapRaised(dpy, win); XSelectInput(dpy, win, SubstructureNotifyMask | FocusChangeMask | ButtonPressMask | ExposureMask | KeyPressMask | + #if KEYRELEASE_PATCH + KeyReleaseMask | + #endif // KEYRELEASE_PATCH PropertyChangeMask | StructureNotifyMask | SubstructureRedirectMask); xerrorxlib = XSetErrorHandler(xerror); @@ -1130,6 +1292,19 @@ setup(void) snprintf(winid, sizeof(winid), "%lu", win); setenv("XEMBED", winid, 1); + #if ICON_PATCH + /* change icon from RGBA to ARGB */ + icon[0] = ICON_WIDTH; + icon[1] = ICON_HEIGHT; + for (int i = 0; i < ICON_WIDTH * ICON_HEIGHT; ++i) { + icon[i + 2] = + ICON_PIXEL_DATA[i * 4 + 3] << 24 | + ICON_PIXEL_DATA[i * 4 + 0] << 0 | + ICON_PIXEL_DATA[i * 4 + 1] << 8 | + ICON_PIXEL_DATA[i * 4 + 2] << 16 ; + } + #endif // ICON_PATCH + nextfocus = foreground; focus(-1); } @@ -1410,6 +1585,9 @@ main(int argc, char *argv[]) if (!(dpy = XOpenDisplay(NULL))) die("%s: cannot open display\n", argv0); + #if XRESOURCES_PATCH + config_init(); + #endif // XRESOURCES_PATCH setup(); printf("0x%lx\n", win); fflush(NULL); diff --git a/tabbed/xembed.1 b/tabbed-flexipatch/xembed.1 similarity index 100% rename from tabbed/xembed.1 rename to tabbed-flexipatch/xembed.1 diff --git a/tabbed/xembed.c b/tabbed-flexipatch/xembed.c similarity index 100% rename from tabbed/xembed.c rename to tabbed-flexipatch/xembed.c diff --git a/tabbed/config.def.h b/tabbed/config.def.h deleted file mode 100644 index 69aea65..0000000 --- a/tabbed/config.def.h +++ /dev/null @@ -1,66 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const char font[] = "terminus-font:size=12"; -static const char* normbgcolor = "#222222"; -static const char* normfgcolor = "#cccccc"; -static const char* selbgcolor = "#555555"; -static const char* selfgcolor = "#ffffff"; -static const char* urgbgcolor = "#111111"; -static const char* urgfgcolor = "#cc0000"; -static const char before[] = "<"; -static const char after[] = ">"; -static const char titletrim[] = "..."; -static const int tabwidth = 200; -static const Bool foreground = True; -static Bool urgentswitch = False; - -/* - * Where to place a new tab when it is opened. When npisrelative is True, - * then the current position is changed + newposition. If npisrelative - * is False, then newposition is an absolute position. - */ -static int newposition = 0; -static Bool npisrelative = False; - -#define SETPROP(p) { \ - .v = (char *[]){ "/bin/sh", "-c", \ - "prop=\"`xwininfo -children -id $1 | grep '^ 0x' |" \ - "sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \ - "xargs -0 printf %b | dmenu -l 10 -w $1`\" &&" \ - "xprop -id $1 -f $0 8s -set $0 \"$prop\"", \ - p, winid, NULL \ - } \ -} - -#define MODKEY ControlMask -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_Return, focusonce, { 0 } }, - { MODKEY|ShiftMask, XK_Return, spawn, { 0 } }, - - { MODKEY|ShiftMask, XK_l, rotate, { .i = +1 } }, - { MODKEY|ShiftMask, XK_h, rotate, { .i = -1 } }, - { MODKEY|ShiftMask, XK_j, movetab, { .i = -1 } }, - { MODKEY|ShiftMask, XK_k, movetab, { .i = +1 } }, - { MODKEY, XK_Tab, rotate, { .i = 0 } }, - - { MODKEY, XK_grave, spawn, SETPROP("_TABBED_SELECT_TAB") }, - { MODKEY, XK_1, move, { .i = 0 } }, - { MODKEY, XK_2, move, { .i = 1 } }, - { MODKEY, XK_3, move, { .i = 2 } }, - { MODKEY, XK_4, move, { .i = 3 } }, - { MODKEY, XK_5, move, { .i = 4 } }, - { MODKEY, XK_6, move, { .i = 5 } }, - { MODKEY, XK_7, move, { .i = 6 } }, - { MODKEY, XK_8, move, { .i = 7 } }, - { MODKEY, XK_9, move, { .i = 8 } }, - { MODKEY, XK_0, move, { .i = 9 } }, - - { MODKEY, XK_q, killclient, { 0 } }, - - { MODKEY, XK_u, focusurgent, { 0 } }, - { MODKEY|ShiftMask, XK_u, toggle, { .v = (void*) &urgentswitch } }, - - { 0, XK_F11, fullscreen, { 0 } }, -}; diff --git a/tabbed/patches/alpha.diff b/tabbed/patches/alpha.diff deleted file mode 100644 index 3ce77a7..0000000 --- a/tabbed/patches/alpha.diff +++ /dev/null @@ -1,122 +0,0 @@ -diff --git a/config.mk b/config.mk -index 3a71529..095cead 100644 ---- a/config.mk -+++ b/config.mk -@@ -9,7 +9,7 @@ MANPREFIX = ${PREFIX}/share/man - - # includes and libs - INCS = -I. -I/usr/include -I/usr/include/freetype2 --LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft -+LIBS = -L/usr/lib -lc -lX11 -lfontconfig -lXft -lXrender - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -diff --git a/tabbed.c b/tabbed.c -index 9a44795..b4d47d1 100644 ---- a/tabbed.c -+++ b/tabbed.c -@@ -170,6 +170,9 @@ static char **cmd; - static char *wmname = "tabbed"; - static const char *geometry; - -+static Colormap cmap; -+static Visual *visual = NULL; -+ - char *argv0; - - /* configuration, allows nested code to access above variables */ -@@ -255,8 +258,8 @@ configurenotify(const XEvent *e) - ww = ev->width; - wh = ev->height; - XFreePixmap(dpy, dc.drawable); -- dc.drawable = XCreatePixmap(dpy, root, ww, wh, -- DefaultDepth(dpy, screen)); -+ dc.drawable = XCreatePixmap(dpy, win, ww, wh, -+ 32); - if (sel > -1) - resize(sel, ww, wh - bh); - XSync(dpy, False); -@@ -399,7 +402,7 @@ drawtext(const char *text, XftColor col[ColLast]) - ; - } - -- d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen)); -+ d = XftDrawCreate(dpy, dc.drawable, visual, cmap); - XftDrawStringUtf8(d, &col[ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len); - XftDrawDestroy(d); - } -@@ -564,7 +567,7 @@ getcolor(const char *colstr) - { - XftColor color; - -- if (!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color)) -+ if (!XftColorAllocName(dpy, visual, cmap, colstr, &color)) - die("%s: cannot allocate color '%s'\n", argv0, colstr); - - return color; -@@ -1016,18 +1019,60 @@ setup(void) - wy = dh + wy - wh - 1; - } - -+ XVisualInfo *vis; -+ XRenderPictFormat *fmt; -+ int nvi; -+ int i; -+ -+ XVisualInfo tpl = { -+ .screen = screen, -+ .depth = 32, -+ .class = TrueColor -+ }; -+ -+ vis = XGetVisualInfo(dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &tpl, &nvi); -+ for(i = 0; i < nvi; i ++) { -+ fmt = XRenderFindVisualFormat(dpy, vis[i].visual); -+ if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) { -+ visual = vis[i].visual; -+ break; -+ } -+ } -+ -+ XFree(vis); -+ -+ if (! visual) { -+ fprintf(stderr, "Couldn't find ARGB visual.\n"); -+ exit(1); -+ } -+ -+ cmap = XCreateColormap( dpy, root, visual, None); - dc.norm[ColBG] = getcolor(normbgcolor); - dc.norm[ColFG] = getcolor(normfgcolor); - dc.sel[ColBG] = getcolor(selbgcolor); - dc.sel[ColFG] = getcolor(selfgcolor); - dc.urg[ColBG] = getcolor(urgbgcolor); - dc.urg[ColFG] = getcolor(urgfgcolor); -- dc.drawable = XCreatePixmap(dpy, root, ww, wh, -- DefaultDepth(dpy, screen)); -- dc.gc = XCreateGC(dpy, root, 0, 0); - -- win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, -- dc.norm[ColFG].pixel, dc.norm[ColBG].pixel); -+ XSetWindowAttributes attrs; -+ attrs.background_pixel = dc.norm[ColBG].pixel; -+ attrs.border_pixel = dc.norm[ColFG].pixel; -+ attrs.bit_gravity = NorthWestGravity; -+ attrs.event_mask = FocusChangeMask | KeyPressMask -+ | ExposureMask | VisibilityChangeMask | StructureNotifyMask -+ | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; -+ attrs.background_pixmap = None ; -+ attrs.colormap = cmap; -+ -+ win = XCreateWindow(dpy, root, wx, wy, -+ ww, wh, 0, 32, InputOutput, -+ visual, CWBackPixmap | CWBorderPixel | CWBitGravity -+ | CWEventMask | CWColormap, &attrs); -+ -+ dc.drawable = XCreatePixmap(dpy, win, ww, wh, -+ 32); -+ dc.gc = XCreateGC(dpy, dc.drawable, 0, 0); -+ - XMapRaised(dpy, win); - XSelectInput(dpy, win, SubstructureNotifyMask | FocusChangeMask | - ButtonPressMask | ExposureMask | KeyPressMask | diff --git a/tabbed/patches/tabbed-autohide.diff b/tabbed/patches/tabbed-autohide.diff deleted file mode 100644 index d9f71ba..0000000 --- a/tabbed/patches/tabbed-autohide.diff +++ /dev/null @@ -1,54 +0,0 @@ -diff --git a/tabbed.c b/tabbed.c -index eafe28a..b0b9662 100644 ---- a/tabbed.c -+++ b/tabbed.c -@@ -152,7 +152,7 @@ static void (*handler[LASTEvent]) (const XEvent *) = { - [MapRequest] = maprequest, - [PropertyNotify] = propertynotify, - }; --static int bh, obh, wx, wy, ww, wh; -+static int bh, obh, wx, wy, ww, wh, vbh; - static unsigned int numlockmask; - static Bool running = True, nextfocus, doinitspawn = True, - fillagain = False, closelastclient = False, -@@ -324,7 +324,7 @@ void - drawbar(void) - { - XftColor *col; -- int c, cc, fc, width; -+ int c, cc, fc, width, nbh, i; - char *name = NULL; - - if (nclients == 0) { -@@ -332,12 +332,21 @@ drawbar(void) - dc.w = ww; - XFetchName(dpy, win, &name); - drawtext(name ? name : "", dc.norm); -- XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, 0); -+ XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, vbh, 0, 0); - XSync(dpy, False); - - return; - } - -+ nbh = nclients > 1 ? vbh : 0; -+ if (bh != nbh) { -+ bh = nbh; -+ for (i = 0; i < nclients; i++) -+ XMoveResizeWindow(dpy, clients[i]->win, 0, bh, ww, wh - bh); -+ } -+ if (bh == 0) -+ return; -+ - width = ww; - cc = ww / tabwidth; - if (nclients > cc) -@@ -984,7 +993,7 @@ setup(void) - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - initfont(font); -- bh = dc.h = dc.font.height + 2; -+ vbh = dc.h = dc.font.height + 2; - - /* init atoms */ - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); diff --git a/tabbed/patches/tabbed-clientnumber.diff b/tabbed/patches/tabbed-clientnumber.diff deleted file mode 100644 index 430245c..0000000 --- a/tabbed/patches/tabbed-clientnumber.diff +++ /dev/null @@ -1,23 +0,0 @@ -diff --git a/tabbed.c b/tabbed.c -index d30206b..70642cb 100644 ---- a/tabbed.c -+++ b/tabbed.c -@@ -308,6 +308,7 @@ drawbar(void) { - unsigned long *col; - int c, fc, width, n = 0; - char *name = NULL; -+ char tabtitle[256]; - - if(nclients == 0) { - dc.x = 0; -@@ -353,7 +354,9 @@ drawbar(void) { - } else { - col = dc.norm; - } -- drawtext(clients[c]->name, col); -+ snprintf(tabtitle, sizeof(tabtitle), "%d: %s", -+ c + 1, clients[c]->name); -+ drawtext(tabtitle, col); - dc.x += dc.w; - clients[c]->tabx = dc.x; - } diff --git a/tabbed/tabbed b/tabbed/tabbed deleted file mode 100755 index 94422afe9d296b7c1d38f85a0438f0a05e51517c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32440 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 z zf|E~Hpb8twW`!@7o|rIGmOa#;OUHSHW0dDdGtE!_4uj`07tZ6Eb=)6~bA|aK;`4V0 zIy(~bJYw_LK&a;PcLx0Z!Der;XF1H|X` zfZNaI^g;eLnA^(ewXz})|Q{p`n>0zR&Ntn>PJlK6hA$=-f$z;{5vOJzQ< zw-<=d>n+!Bzy9wLznco=^;;)Gf$XSa%tp18d=I!7Kj!my3m4kJ z2uYLY%8B`mi;z{#=lh)^@rNr^DKU@nV;f)Bb?K-3C6vdh(kk