From 9b343357774c450a4864a4732e61540efa169955 Mon Sep 17 00:00:00 2001 From: coast Date: Fri, 3 Oct 2025 17:11:00 +0330 Subject: [PATCH] updates --- .gitignore | 2 + config/init.vim | 143 - config/init.vim.root | 144 - config/nvim/init.vim | 11 - config/nvim/pack/graft/start/colorizer | 1 + config/nvim/pack/graft/start/nerdtree | 1 + config/nvim/pack/graft/start/vim-closetag | 1 + config/nvim/pack/graft/start/vim-commentary | 1 + config/nvim/pack/graft/start/vim-endwise | 1 + config/nvim/pack/graft/start/vim-fugitive | 1 + config/nvim/pack/graft/start/vim-lsp | 1 + config/nvim/pack/graft/start/vim-lsp-settings | 1 + config/nvim/pack/graft/start/vim-surround | 1 + config/nvim/pack/graft/start/vim-vinegar | 1 + config/qtile/config.py | 37 +- config/starship.root.toml | 36 - config/user-dirs.dirs | 15 - dwl-bak/.gitea/issue_template/bug_report.yml | 62 - .../issue_template/enhancement-idea.yml | 9 - dwl-bak/.gitignore | 6 - dwl-bak/.mailmap | 1 - dwl-bak/CHANGELOG.md | 200 - dwl-bak/LICENSE | 692 ---- dwl-bak/LICENSE.dwm | 39 - dwl-bak/LICENSE.sway | 19 - dwl-bak/LICENSE.tinywl | 127 - dwl-bak/Makefile | 78 - dwl-bak/README.md | 201 - dwl-bak/client.h | 408 -- dwl-bak/config.def.h | 212 - dwl-bak/config.def.h.orig | 210 - dwl-bak/config.mk | 17 - dwl-bak/drwl.h | 311 -- dwl-bak/dwl-patches/LICENSE | 692 ---- dwl-bak/dwl-patches/LICENSE.dwm | 39 - dwl-bak/dwl-patches/LICENSE.sway | 19 - dwl-bak/dwl-patches/LICENSE.tinywl | 127 - dwl-bak/dwl-patches/README.md | 87 - .../patches/accessnthmon/README.md | 9 - .../patches/accessnthmon/accessnthmon.patch | 122 - .../patches/alwayscenter/README.md | 9 - .../patches/alwayscenter/alwayscenter.patch | 39 - .../patches/attachbottom/README.md | 10 - .../patches/attachbottom/attachbottom.patch | 29 - .../patches/attachfocused/README.md | 11 - .../patches/attachfocused/attachfocused.patch | 29 - .../dwl-patches/patches/attachtop/README.md | 13 - .../patches/attachtop/attachtop.patch | 36 - .../dwl-patches/patches/autostart/README.md | 14 - .../patches/autostart/autostart-0.7.patch | 154 - .../patches/autostart/autostart.patch | 148 - .../dwl-patches/patches/bar-systray/README.md | 19 - .../patches/bar-systray/bar-systray-0.7.patch | 3023 -------------- dwl-bak/dwl-patches/patches/bar/README.md | 34 - dwl-bak/dwl-patches/patches/bar/bar-0.6.patch | 1245 ------ dwl-bak/dwl-patches/patches/bar/bar-0.7.patch | 1245 ------ dwl-bak/dwl-patches/patches/bar/bar.patch | 1266 ------ dwl-bak/dwl-patches/patches/bar/bar.png | Bin 3486 -> 0 bytes .../dwl-patches/patches/barborder/README.md | 10 - .../patches/barborder/barborder.patch | 136 - .../dwl-patches/patches/barcolors/README.md | 9 - .../patches/barcolors/barcolors.patch | 144 - .../dwl-patches/patches/barpadding/README.md | 10 - .../patches/barpadding/barpadding.patch | 73 - .../patches/bartruecenteredtitle/README.md | 11 - .../bartruecenteredtitle.patch | 46 - .../bartruecenteredtitle/centeredtitle.webp | Bin 25596 -> 0 bytes .../patches/better-resize/README.md | 48 - .../better-resize/better-resize-0.7.patch | 107 - dwl-bak/dwl-patches/patches/borders/README.md | 37 - .../dwl-patches/patches/borders/borders.patch | 213 - .../dwl-patches/patches/bottomstack/README.md | 27 - .../patches/bottomstack/bottomstack.patch | 140 - dwl-bak/dwl-patches/patches/btrtile/README.md | 103 - .../patches/btrtile/btrtile-v0.7-gaps.patch | 922 ----- .../patches/btrtile/btrtile-v0.7.patch | 903 ---- .../patches/buttonbystate/README.md | 10 - .../patches/buttonbystate/buttonbystate.patch | 78 - .../patches/center-terminal/README.md | 13 - .../center-terminal/center-terminal.patch | 103 - .../patches/centeredmaster/README.md | 33 - .../centeredmaster/centeredmaster.patch | 135 - .../dwl-patches/patches/cfact-snail/README.md | 13 - .../patches/cfact-snail/cfact-snail.patch | 68 - dwl-bak/dwl-patches/patches/cfact/README.md | 25 - .../patches/cfact/cfact-v0.6.patch | 121 - .../patches/cfact/cfact-v0.7-gaps.patch | 155 - .../patches/cfact/cfact-v0.7.patch | 121 - dwl-bak/dwl-patches/patches/cfact/cfact.patch | 121 - .../dwl-patches/patches/chainkeys/README.md | 15 - .../patches/chainkeys/chainkeys.patch | 157 - .../patches/client-opacity/README.md | 18 - .../client-opacity/client-opacity.patch | 181 - dwl-bak/dwl-patches/patches/column/README.md | 9 - .../dwl-patches/patches/column/column.patch | 79 - .../dwl-patches/patches/coredump/README.md | 11 - .../patches/coredump/coredump-0.7.patch | 65 - .../patches/coredump/coredump.patch | 65 - .../dwl-patches/patches/cursortheme/README.md | 17 - .../patches/cursortheme/cursortheme.patch | 46 - .../dwl-patches/patches/customfloat/README.md | 24 - .../patches/customfloat/customfloat.patch | 93 - .../patches/dim-unfocused/README.md | 19 - .../dim-unfocused-20230516.patch | 213 - .../dim-unfocused-20240416.patch | 177 - .../dim-unfocused-20240714.patch | 199 - .../dim-unfocused-20240903.patch | 216 - .../patches/dim-unfocused/dim-unfocused.patch | 216 - .../README.md | 11 - ...keybindings-on-fullscreen-toggle-0.7.patch | 71 - .../README.md | 9 - .../disable-keybindings-on-fullscreen.patch | 82 - .../dwl-patches/patches/dragmfact/README.md | 11 - .../patches/dragmfact/dragmfact-v0.6.patch | 59 - .../patches/dragmfact/dragmfact-v0.7.patch | 59 - .../patches/dragmfact/dragmfact.patch | 59 - .../dwl-patches/patches/dragresize/README.md | 12 - .../patches/dragresize/dragresize.patch | 210 - .../dwl-patches/patches/en-keycodes/README.md | 11 - .../patches/en-keycodes/en-keycodes.patch | 73 - dwl-bak/dwl-patches/patches/envcfg/README.md | 8 - .../dwl-patches/patches/envcfg/envcfg.patch | 302 -- .../patches/fakefullscreenclient/README.md | 8 - .../fakefullscreenclient.patch | 87 - .../dwl-patches/patches/fallback/README.md | 8 - .../patches/fallback/fallback.patch | 44 - .../dwl-patches/patches/focusdir/README.md | 9 - .../patches/focusdir/focusdir.patch | 98 - dwl-bak/dwl-patches/patches/follow/README.md | 10 - .../dwl-patches/patches/follow/follow.patch | 38 - .../dwl-patches/patches/follow/follow.webp | Bin 621614 -> 0 bytes .../foreign-toplevel-management/README.md | 9 - .../foreign-toplevel-management.patch | 507 --- .../patches/fullscreenadaptivesync/README.md | 29 - .../fullscreenadaptivesync-v0.7.patch | 122 - .../dwl-patches/patches/gaplessgrid/README.md | 19 - .../gaplessgrid/gaplessgrid-20230801.patch | 97 - .../gaplessgrid/gaplessgrid-20240714.patch | 89 - .../patches/gaplessgrid/gaplessgrid.patch | 89 - dwl-bak/dwl-patches/patches/gaps/README.md | 14 - dwl-bak/dwl-patches/patches/gaps/gaps.patch | 127 - .../dwl-patches/patches/genericgaps/README.md | 25 - .../patches/genericgaps/genericgaps-0.7.patch | 375 -- .../patches/genericgaps/genericgaps.patch | 350 -- .../dwl-patches/patches/gestures/README.md | 23 - .../patches/gestures/gestures.patch | 169 - .../dwl-patches/patches/globalkey/README.md | 33 - .../patches/globalkey/globalkey.patch | 131 - .../dwl-patches/patches/headless/README.md | 11 - .../patches/headless/headless.patch | 130 - .../patches/hide-behind-fullscreen/README.md | 12 - .../hide-behind-fullscreen-0.7.patch | 73 - .../hide-behind-fullscreen.patch | 73 - .../patches/hide-behind-monocle/README.md | 10 - .../hide-behind-monocle-0.7.patch | 332 -- .../hide-behind-monocle.patch | 332 -- .../patches/hide_vacant_tags/README.md | 11 - .../hide_vacant_tags/hide_vacant_tags.patch | 69 - .../dwl-patches/patches/hiderule/README.md | 9 - .../patches/hiderule/hiderule.patch | 57 - .../dwl-patches/patches/hot-reload/README.md | 110 - .../patches/hot-reload/hot-reload-0.7.patch | 770 ---- .../patches/hot-reload/hot-reload.patch | 1029 ----- .../patches/inputdevicerules/README.md | 18 - .../inputdevicerules-v0.6.patch | 173 - .../inputdevicerules-v0.7.patch | 173 - dwl-bak/dwl-patches/patches/ipc/README.md | 28 - .../patches/ipc/focus-tagset-output.patch | 24 - dwl-bak/dwl-patches/patches/ipc/ipc.patch | 597 --- .../dwl-patches/patches/ipc/ipcpertag.patch | 97 - .../dwl-patches/patches/kblayout/README.md | 32 - .../patches/kblayout/kblayout.patch | 187 - .../keyboardshortcutsinhibit/README.md | 11 - .../keyboardshortcutsinhibit.patch | 101 - .../dwl-patches/patches/keycodes/README.md | 20 - .../patches/keycodes/keycodes-0.7.patch | 883 ---- .../patches/keycodes/keycodes.patch | 883 ---- .../dwl-patches/patches/launchtag/README.md | 12 - .../patches/launchtag/launchtag.patch | 49 - .../patches/limitnmaster/README.md | 8 - .../patches/limitnmaster/limitnmaster.patch | 33 - .../dwl-patches/patches/lockedkeys/README.md | 23 - .../patches/lockedkeys/lockedkeys.patch | 79 - .../patches/mastercolumn/README.md | 16 - .../mastercolumn/mastercolumn-gaps.patch | 63 - .../patches/mastercolumn/mastercolumn.patch | 87 - dwl-bak/dwl-patches/patches/menu/README.md | 18 - dwl-bak/dwl-patches/patches/menu/menu.patch | 227 - .../dwl-patches/patches/menurule/README.md | 70 - .../patches/menurule/menurule.patch | 167 - .../dwl-patches/patches/menurule/menurule.png | Bin 179351 -> 0 bytes dwl-bak/dwl-patches/patches/meson/README.md | 19 - dwl-bak/dwl-patches/patches/meson/meson.patch | 135 - .../patches/minimalborders/README.md | 34 - .../minimalborders/minimalborders.patch | 161 - dwl-bak/dwl-patches/patches/modes/README.md | 35 - dwl-bak/dwl-patches/patches/modes/modes.patch | 165 - .../patches/monitorconfig/README.md | 9 - .../patches/monitorconfig/monitorconfig.patch | 95 - .../patches/mouse-trackpad-split/README.md | 8 - .../mouse-trackpad-split-0.7.patch | 96 - .../dwl-patches/patches/movecenter/README.md | 28 - .../patches/movecenter/movecenter.patch | 82 - .../patches/moveresizekb/README.md | 20 - .../patches/moveresizekb/moveresizekb.patch | 70 - .../dwl-patches/patches/movestack/README.md | 13 - .../patches/movestack/movestack.patch | 87 - .../patches/namedscratchpads/README.md | 19 - .../namedscratchpads/namedscratchpads.patch | 278 -- .../dwl-patches/patches/nextlayout/README.md | 9 - .../patches/nextlayout/nextlayout.patch | 65 - .../patches/numlock-capslock/README.md | 10 - .../numlock-capslock-0.7.patch | 84 - .../numlock-capslock/numlock-capslock.patch | 84 - .../dwl-patches/patches/passthrough/README.md | 13 - .../patches/passthrough/passthrough.patch | 82 - .../patches/perinputconfig/README.md | 12 - .../perinputconfig/perinputconfig-v0.5.patch | 173 - .../perinputconfig/perinputconfig.patch | 295 -- dwl-bak/dwl-patches/patches/pertag/README.md | 12 - .../dwl-patches/patches/pertag/pertag.patch | 170 - .../pointer-gestures-unstable-v1/README.md | 16 - .../pointer-gestures-unstable-v1.patch | 186 - .../patches/primaryselection/README.md | 10 - .../primaryselection/primaryselection.patch | 50 - dwl-bak/dwl-patches/patches/push/README.md | 11 - .../dwl-patches/patches/push/push-0.7.patch | 127 - dwl-bak/dwl-patches/patches/push/push.patch | 127 - .../dwl-patches/patches/regexrules/README.md | 19 - .../patches/regexrules/regexrules.patch | 76 - dwl-bak/dwl-patches/patches/regions/README.md | 11 - .../dwl-patches/patches/regions/regions.patch | 71 - .../patches/relative-mouse-resize/README.md | 13 - .../relative-mouse-resize.patch | 102 - .../patches/restore-monitor/README.md | 8 - .../restore-monitor/restore-monitor.patch | 82 - dwl-bak/dwl-patches/patches/right/README.md | 8 - dwl-bak/dwl-patches/patches/right/right.patch | 50 - .../dwl-patches/patches/rlimit_max/README.md | 11 - .../patches/rlimit_max/rlimit_max.patch | 91 - .../patches/rotate-clients/README.md | 14 - .../rotate-clients/rotate-clients.patch | 56 - .../dwl-patches/patches/rotatetags/README.md | 9 - .../patches/rotatetags/rotatetags.patch | 91 - dwl-bak/dwl-patches/patches/scenefx/README.md | 113 - .../dwl-patches/patches/scenefx/scenefx.patch | 700 ---- dwl-bak/dwl-patches/patches/setrule/README.md | 46 - .../dwl-patches/patches/setrule/setrule.patch | 155 - .../dwl-patches/patches/setupenv/README.md | 8 - .../patches/setupenv/setupenv.patch | 54 - .../dwl-patches/patches/shiftview/README.md | 9 - .../patches/shiftview/shiftview.patch | 76 - .../patches/simple_scratchpad/README.md | 25 - .../simple_scratchpad-v0.7.patch | 211 - .../patches/simpleborders/README.md | 13 - .../simpleborders/simpleborders-v0.6.patch | 73 - .../simpleborders/simpleborders-v0.7.patch | 73 - .../patches/singlemaster/README.md | 9 - .../patches/singlemaster/singlemaster.patch | 155 - .../patches/singletagset-pertag/README.md | 22 - .../singletagset-pertag.patch | 261 -- .../patches/singletagset-sticky/README.md | 13 - .../singletagset-sticky.patch | 27 - .../patches/singletagset/README.md | 19 - .../singletagset/singletagset-v0.6.patch | 293 -- .../singletagset/singletagset-v0.7.patch | 312 -- .../dwl-patches/patches/skipfocus/README.md | 18 - .../skipfocus/skipfocus-20240714.patch | 81 - .../patches/skipfocus/skipfocus.patch | 81 - .../patches/skipfocus/skipfocus20240108.patch | 62 - .../patches/smartborders/README.md | 14 - .../smartborders/smartborders-0.7.patch | 204 - .../patches/smartborders/smartborders.patch | 203 - .../dwl-patches/patches/snail-gaps/README.md | 15 - .../patches/snail-gaps/snail-gaps.patch | 160 - dwl-bak/dwl-patches/patches/snail/README.md | 9 - dwl-bak/dwl-patches/patches/snail/snail.patch | 250 -- .../dwl-patches/patches/spawninfo/README.md | 41 - .../dwl-patches/patches/spawninfo/pamixerc | 134 - .../patches/spawninfo/screenshotwin | 21 - .../patches/spawninfo/spawninfo.patch | 110 - dwl-bak/dwl-patches/patches/stacker/README.md | 28 - .../dwl-patches/patches/stacker/stacker.patch | 212 - dwl-bak/dwl-patches/patches/stairs/README.md | 42 - .../dwl-patches/patches/stairs/stairs.patch | 136 - .../dwl-patches/patches/startargv/README.md | 13 - .../patches/startargv/startargv.patch | 58 - dwl-bak/dwl-patches/patches/sticky/README.md | 13 - .../dwl-patches/patches/sticky/sticky.patch | 85 - dwl-bak/dwl-patches/patches/swallow/README.md | 53 - .../patches/swallow/swallow-freebsd.patch | 54 - .../dwl-patches/patches/swallow/swallow.patch | 351 -- .../patches/swapandfocusdir/README.md | 14 - .../swapandfocusdir/swapandfocusdir.patch | 221 - .../dwl-patches/patches/switchtotag/README.md | 9 - .../patches/switchtotag/switchtotag.patch | 116 - dwl-bak/dwl-patches/patches/systemd/README.md | 33 - .../patches/systemd/systemd-0.7.patch | 64 - dwl-bak/dwl-patches/patches/tab/README.md | 24 - .../dwl-patches/patches/tab/tab-0.7-bar.patch | 767 ---- dwl-bak/dwl-patches/patches/tab/tab-0.7.patch | 1252 ------ dwl-bak/dwl-patches/patches/tab/tab.patch | 1252 ------ .../patches/tablet-input/README.md | 25 - .../tablet-input/tablet-input-0.7.patch | 355 -- .../patches/tablet-input/tablet-input.patch | 372 -- .../dwl-patches/patches/tagshift/README.md | 10 - .../patches/tagshift/tagshift.patch | 83 - dwl-bak/dwl-patches/patches/tearing/README.md | 17 - .../dwl-patches/patches/tearing/tearing.patch | 362 -- .../dwl-patches/patches/titleurgent/README.md | 11 - .../patches/titleurgent/titleurgent.patch | 80 - .../patches/tmux-borders/README.md | 15 - .../patches/tmux-borders/screenshot1.png | Bin 483118 -> 0 bytes .../patches/tmux-borders/screenshot2.png | Bin 492963 -> 0 bytes .../tmux-borders/tmux-borders-0.7.patch | 489 --- .../patches/toggle_constraints/README.md | 17 - .../toggle_constraints.patch | 86 - .../togglekblayoutandoptions/README.md | 9 - .../togglekblayoutandoptions.patch | 160 - .../dwl-patches/patches/touch-input/README.md | 20 - .../patches/touch-input/touch-input.patch | 260 -- .../dwl-patches/patches/unclutter/README.md | 11 - .../patches/unclutter/unclutter.patch | 192 - .../patches/ungroup-keyboards/README.md | 15 - .../ungroup-keyboards/ungroup-keyboards.patch | 97 - .../dwl-patches/patches/vanitygaps/README.md | 12 - .../patches/vanitygaps/vanitygaps-0.7.patch | 358 -- .../patches/vanitygaps/vanitygaps.patch | 357 -- dwl-bak/dwl-patches/patches/varcol/README.md | 15 - .../dwl-patches/patches/varcol/varcol.patch | 618 --- .../patches/viewnextocctag/README.md | 9 - .../viewnextocctag/viewnextocctag.patch | 92 - .../patches/virtual-pointer/README.md | 12 - .../virtual-pointer/virtual-pointer.patch | 126 - .../dwl-patches/patches/warpcursor/README.md | 15 - .../patches/warpcursor/warpcursor.patch | 71 - .../patches/wayland-socket-handover/README.md | 21 - .../wayland-socket-handover.patch | 81 - dwl-bak/dwl-patches/patches/winview/README.md | 35 - .../patches/winview/winview-20240606.patch | 42 - .../dwl-patches/patches/winview/winview.patch | 42 - .../xwayland-handle-minimize/README.md | 9 - .../xwayland-handle-minimize.patch | 91 - .../dwl-patches/patches/zoomswap/README.md | 54 - .../patches/zoomswap/zoomswap-v0.6.patch | 55 - .../patches/zoomswap/zoomswap-v0.7.patch | 55 - .../patches/zoomswap/zoomswap.patch | 55 - .../stale-patches/bar-systray-old/README.md | 33 - .../bar-systray-old/bar-systray-0.7.patch | 398 -- .../stale-patches/bar-systray-old/systray.png | Bin 22944 -> 0 bytes .../stale-patches/master-right/README.md | 13 - .../master-right/master-right-0.7.patch | 35 - .../master-right/master-right.patch | 35 - .../press_repeat_release/README.md | 15 - .../press_repeat_release.patch | 108 - .../stale-patches/remembertags/README.md | 16 - .../remembertags/remembertags.patch | 105 - .../stale-patches/tab-pango/README.md | 10 - .../stale-patches/tab-pango/tab.patch | 461 --- .../stale-patches/togglekblayout/README.md | 14 - .../togglekblayout/togglekblayout.patch | 107 - dwl-bak/dwl.1 | 158 - dwl-bak/dwl.c | 3645 ----------------- dwl-bak/dwl.c.orig | 3618 ---------------- dwl-bak/dwl.desktop | 5 - .../protocols/wlr-layer-shell-unstable-v1.xml | 390 -- ...lr-output-power-management-unstable-v1.xml | 128 - dwl-bak/util.c | 51 - dwl-bak/util.h | 5 - 369 files changed, 27 insertions(+), 54461 deletions(-) delete mode 100644 config/init.vim delete mode 100644 config/init.vim.root create mode 160000 config/nvim/pack/graft/start/colorizer create mode 160000 config/nvim/pack/graft/start/nerdtree create mode 160000 config/nvim/pack/graft/start/vim-closetag create mode 160000 config/nvim/pack/graft/start/vim-commentary create mode 160000 config/nvim/pack/graft/start/vim-endwise create mode 160000 config/nvim/pack/graft/start/vim-fugitive create mode 160000 config/nvim/pack/graft/start/vim-lsp create mode 160000 config/nvim/pack/graft/start/vim-lsp-settings create mode 160000 config/nvim/pack/graft/start/vim-surround create mode 160000 config/nvim/pack/graft/start/vim-vinegar delete mode 100644 config/starship.root.toml delete mode 100644 config/user-dirs.dirs delete mode 100644 dwl-bak/.gitea/issue_template/bug_report.yml delete mode 100644 dwl-bak/.gitea/issue_template/enhancement-idea.yml delete mode 100644 dwl-bak/.gitignore delete mode 100644 dwl-bak/.mailmap delete mode 100644 dwl-bak/CHANGELOG.md delete mode 100644 dwl-bak/LICENSE delete mode 100644 dwl-bak/LICENSE.dwm delete mode 100644 dwl-bak/LICENSE.sway delete mode 100644 dwl-bak/LICENSE.tinywl delete mode 100644 dwl-bak/Makefile delete mode 100644 dwl-bak/README.md delete mode 100644 dwl-bak/client.h delete mode 100644 dwl-bak/config.def.h delete mode 100644 dwl-bak/config.def.h.orig delete mode 100644 dwl-bak/config.mk delete mode 100644 dwl-bak/drwl.h delete mode 100644 dwl-bak/dwl-patches/LICENSE delete mode 100644 dwl-bak/dwl-patches/LICENSE.dwm delete mode 100644 dwl-bak/dwl-patches/LICENSE.sway delete mode 100644 dwl-bak/dwl-patches/LICENSE.tinywl delete mode 100644 dwl-bak/dwl-patches/README.md delete mode 100644 dwl-bak/dwl-patches/patches/accessnthmon/README.md delete mode 100644 dwl-bak/dwl-patches/patches/accessnthmon/accessnthmon.patch delete mode 100644 dwl-bak/dwl-patches/patches/alwayscenter/README.md delete mode 100644 dwl-bak/dwl-patches/patches/alwayscenter/alwayscenter.patch delete mode 100644 dwl-bak/dwl-patches/patches/attachbottom/README.md delete mode 100644 dwl-bak/dwl-patches/patches/attachbottom/attachbottom.patch delete mode 100644 dwl-bak/dwl-patches/patches/attachfocused/README.md delete mode 100644 dwl-bak/dwl-patches/patches/attachfocused/attachfocused.patch delete mode 100644 dwl-bak/dwl-patches/patches/attachtop/README.md delete mode 100644 dwl-bak/dwl-patches/patches/attachtop/attachtop.patch delete mode 100644 dwl-bak/dwl-patches/patches/autostart/README.md delete mode 100644 dwl-bak/dwl-patches/patches/autostart/autostart-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/autostart/autostart.patch delete mode 100644 dwl-bak/dwl-patches/patches/bar-systray/README.md delete mode 100644 dwl-bak/dwl-patches/patches/bar-systray/bar-systray-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/bar/README.md delete mode 100644 dwl-bak/dwl-patches/patches/bar/bar-0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/bar/bar-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/bar/bar.patch delete mode 100644 dwl-bak/dwl-patches/patches/bar/bar.png delete mode 100644 dwl-bak/dwl-patches/patches/barborder/README.md delete mode 100644 dwl-bak/dwl-patches/patches/barborder/barborder.patch delete mode 100644 dwl-bak/dwl-patches/patches/barcolors/README.md delete mode 100644 dwl-bak/dwl-patches/patches/barcolors/barcolors.patch delete mode 100644 dwl-bak/dwl-patches/patches/barpadding/README.md delete mode 100644 dwl-bak/dwl-patches/patches/barpadding/barpadding.patch delete mode 100644 dwl-bak/dwl-patches/patches/bartruecenteredtitle/README.md delete mode 100644 dwl-bak/dwl-patches/patches/bartruecenteredtitle/bartruecenteredtitle.patch delete mode 100644 dwl-bak/dwl-patches/patches/bartruecenteredtitle/centeredtitle.webp delete mode 100644 dwl-bak/dwl-patches/patches/better-resize/README.md delete mode 100644 dwl-bak/dwl-patches/patches/better-resize/better-resize-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/borders/README.md delete mode 100644 dwl-bak/dwl-patches/patches/borders/borders.patch delete mode 100644 dwl-bak/dwl-patches/patches/bottomstack/README.md delete mode 100644 dwl-bak/dwl-patches/patches/bottomstack/bottomstack.patch delete mode 100644 dwl-bak/dwl-patches/patches/btrtile/README.md delete mode 100644 dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7-gaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/buttonbystate/README.md delete mode 100644 dwl-bak/dwl-patches/patches/buttonbystate/buttonbystate.patch delete mode 100644 dwl-bak/dwl-patches/patches/center-terminal/README.md delete mode 100644 dwl-bak/dwl-patches/patches/center-terminal/center-terminal.patch delete mode 100644 dwl-bak/dwl-patches/patches/centeredmaster/README.md delete mode 100644 dwl-bak/dwl-patches/patches/centeredmaster/centeredmaster.patch delete mode 100644 dwl-bak/dwl-patches/patches/cfact-snail/README.md delete mode 100644 dwl-bak/dwl-patches/patches/cfact-snail/cfact-snail.patch delete mode 100644 dwl-bak/dwl-patches/patches/cfact/README.md delete mode 100644 dwl-bak/dwl-patches/patches/cfact/cfact-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/cfact/cfact-v0.7-gaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/cfact/cfact-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/cfact/cfact.patch delete mode 100644 dwl-bak/dwl-patches/patches/chainkeys/README.md delete mode 100644 dwl-bak/dwl-patches/patches/chainkeys/chainkeys.patch delete mode 100644 dwl-bak/dwl-patches/patches/client-opacity/README.md delete mode 100644 dwl-bak/dwl-patches/patches/client-opacity/client-opacity.patch delete mode 100644 dwl-bak/dwl-patches/patches/column/README.md delete mode 100644 dwl-bak/dwl-patches/patches/column/column.patch delete mode 100644 dwl-bak/dwl-patches/patches/coredump/README.md delete mode 100644 dwl-bak/dwl-patches/patches/coredump/coredump-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/coredump/coredump.patch delete mode 100644 dwl-bak/dwl-patches/patches/cursortheme/README.md delete mode 100644 dwl-bak/dwl-patches/patches/cursortheme/cursortheme.patch delete mode 100644 dwl-bak/dwl-patches/patches/customfloat/README.md delete mode 100644 dwl-bak/dwl-patches/patches/customfloat/customfloat.patch delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/README.md delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20230516.patch delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240416.patch delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240714.patch delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240903.patch delete mode 100644 dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused.patch delete mode 100644 dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/README.md delete mode 100644 dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/disable-keybindings-on-fullscreen-toggle-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/README.md delete mode 100644 dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/disable-keybindings-on-fullscreen.patch delete mode 100644 dwl-bak/dwl-patches/patches/dragmfact/README.md delete mode 100644 dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/dragmfact/dragmfact.patch delete mode 100644 dwl-bak/dwl-patches/patches/dragresize/README.md delete mode 100644 dwl-bak/dwl-patches/patches/dragresize/dragresize.patch delete mode 100644 dwl-bak/dwl-patches/patches/en-keycodes/README.md delete mode 100644 dwl-bak/dwl-patches/patches/en-keycodes/en-keycodes.patch delete mode 100644 dwl-bak/dwl-patches/patches/envcfg/README.md delete mode 100644 dwl-bak/dwl-patches/patches/envcfg/envcfg.patch delete mode 100644 dwl-bak/dwl-patches/patches/fakefullscreenclient/README.md delete mode 100644 dwl-bak/dwl-patches/patches/fakefullscreenclient/fakefullscreenclient.patch delete mode 100644 dwl-bak/dwl-patches/patches/fallback/README.md delete mode 100644 dwl-bak/dwl-patches/patches/fallback/fallback.patch delete mode 100644 dwl-bak/dwl-patches/patches/focusdir/README.md delete mode 100644 dwl-bak/dwl-patches/patches/focusdir/focusdir.patch delete mode 100644 dwl-bak/dwl-patches/patches/follow/README.md delete mode 100644 dwl-bak/dwl-patches/patches/follow/follow.patch delete mode 100644 dwl-bak/dwl-patches/patches/follow/follow.webp delete mode 100644 dwl-bak/dwl-patches/patches/foreign-toplevel-management/README.md delete mode 100644 dwl-bak/dwl-patches/patches/foreign-toplevel-management/foreign-toplevel-management.patch delete mode 100644 dwl-bak/dwl-patches/patches/fullscreenadaptivesync/README.md delete mode 100644 dwl-bak/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/gaplessgrid/README.md delete mode 100644 dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20230801.patch delete mode 100644 dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20240714.patch delete mode 100644 dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid.patch delete mode 100644 dwl-bak/dwl-patches/patches/gaps/README.md delete mode 100644 dwl-bak/dwl-patches/patches/gaps/gaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/genericgaps/README.md delete mode 100644 dwl-bak/dwl-patches/patches/genericgaps/genericgaps-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/genericgaps/genericgaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/gestures/README.md delete mode 100644 dwl-bak/dwl-patches/patches/gestures/gestures.patch delete mode 100644 dwl-bak/dwl-patches/patches/globalkey/README.md delete mode 100644 dwl-bak/dwl-patches/patches/globalkey/globalkey.patch delete mode 100644 dwl-bak/dwl-patches/patches/headless/README.md delete mode 100644 dwl-bak/dwl-patches/patches/headless/headless.patch delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-fullscreen/README.md delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen.patch delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-monocle/README.md delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle.patch delete mode 100644 dwl-bak/dwl-patches/patches/hide_vacant_tags/README.md delete mode 100644 dwl-bak/dwl-patches/patches/hide_vacant_tags/hide_vacant_tags.patch delete mode 100644 dwl-bak/dwl-patches/patches/hiderule/README.md delete mode 100644 dwl-bak/dwl-patches/patches/hiderule/hiderule.patch delete mode 100644 dwl-bak/dwl-patches/patches/hot-reload/README.md delete mode 100644 dwl-bak/dwl-patches/patches/hot-reload/hot-reload-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/hot-reload/hot-reload.patch delete mode 100644 dwl-bak/dwl-patches/patches/inputdevicerules/README.md delete mode 100644 dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/ipc/README.md delete mode 100644 dwl-bak/dwl-patches/patches/ipc/focus-tagset-output.patch delete mode 100644 dwl-bak/dwl-patches/patches/ipc/ipc.patch delete mode 100644 dwl-bak/dwl-patches/patches/ipc/ipcpertag.patch delete mode 100644 dwl-bak/dwl-patches/patches/kblayout/README.md delete mode 100644 dwl-bak/dwl-patches/patches/kblayout/kblayout.patch delete mode 100644 dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/README.md delete mode 100644 dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/keyboardshortcutsinhibit.patch delete mode 100644 dwl-bak/dwl-patches/patches/keycodes/README.md delete mode 100644 dwl-bak/dwl-patches/patches/keycodes/keycodes-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/keycodes/keycodes.patch delete mode 100644 dwl-bak/dwl-patches/patches/launchtag/README.md delete mode 100644 dwl-bak/dwl-patches/patches/launchtag/launchtag.patch delete mode 100644 dwl-bak/dwl-patches/patches/limitnmaster/README.md delete mode 100644 dwl-bak/dwl-patches/patches/limitnmaster/limitnmaster.patch delete mode 100644 dwl-bak/dwl-patches/patches/lockedkeys/README.md delete mode 100644 dwl-bak/dwl-patches/patches/lockedkeys/lockedkeys.patch delete mode 100644 dwl-bak/dwl-patches/patches/mastercolumn/README.md delete mode 100644 dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn-gaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn.patch delete mode 100644 dwl-bak/dwl-patches/patches/menu/README.md delete mode 100644 dwl-bak/dwl-patches/patches/menu/menu.patch delete mode 100644 dwl-bak/dwl-patches/patches/menurule/README.md delete mode 100644 dwl-bak/dwl-patches/patches/menurule/menurule.patch delete mode 100644 dwl-bak/dwl-patches/patches/menurule/menurule.png delete mode 100644 dwl-bak/dwl-patches/patches/meson/README.md delete mode 100644 dwl-bak/dwl-patches/patches/meson/meson.patch delete mode 100644 dwl-bak/dwl-patches/patches/minimalborders/README.md delete mode 100644 dwl-bak/dwl-patches/patches/minimalborders/minimalborders.patch delete mode 100644 dwl-bak/dwl-patches/patches/modes/README.md delete mode 100644 dwl-bak/dwl-patches/patches/modes/modes.patch delete mode 100644 dwl-bak/dwl-patches/patches/monitorconfig/README.md delete mode 100644 dwl-bak/dwl-patches/patches/monitorconfig/monitorconfig.patch delete mode 100644 dwl-bak/dwl-patches/patches/mouse-trackpad-split/README.md delete mode 100644 dwl-bak/dwl-patches/patches/mouse-trackpad-split/mouse-trackpad-split-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/movecenter/README.md delete mode 100644 dwl-bak/dwl-patches/patches/movecenter/movecenter.patch delete mode 100644 dwl-bak/dwl-patches/patches/moveresizekb/README.md delete mode 100644 dwl-bak/dwl-patches/patches/moveresizekb/moveresizekb.patch delete mode 100644 dwl-bak/dwl-patches/patches/movestack/README.md delete mode 100644 dwl-bak/dwl-patches/patches/movestack/movestack.patch delete mode 100644 dwl-bak/dwl-patches/patches/namedscratchpads/README.md delete mode 100644 dwl-bak/dwl-patches/patches/namedscratchpads/namedscratchpads.patch delete mode 100644 dwl-bak/dwl-patches/patches/nextlayout/README.md delete mode 100644 dwl-bak/dwl-patches/patches/nextlayout/nextlayout.patch delete mode 100644 dwl-bak/dwl-patches/patches/numlock-capslock/README.md delete mode 100644 dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock.patch delete mode 100644 dwl-bak/dwl-patches/patches/passthrough/README.md delete mode 100644 dwl-bak/dwl-patches/patches/passthrough/passthrough.patch delete mode 100644 dwl-bak/dwl-patches/patches/perinputconfig/README.md delete mode 100644 dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch delete mode 100644 dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig.patch delete mode 100644 dwl-bak/dwl-patches/patches/pertag/README.md delete mode 100644 dwl-bak/dwl-patches/patches/pertag/pertag.patch delete mode 100644 dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/README.md delete mode 100644 dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch delete mode 100644 dwl-bak/dwl-patches/patches/primaryselection/README.md delete mode 100644 dwl-bak/dwl-patches/patches/primaryselection/primaryselection.patch delete mode 100644 dwl-bak/dwl-patches/patches/push/README.md delete mode 100644 dwl-bak/dwl-patches/patches/push/push-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/push/push.patch delete mode 100644 dwl-bak/dwl-patches/patches/regexrules/README.md delete mode 100644 dwl-bak/dwl-patches/patches/regexrules/regexrules.patch delete mode 100644 dwl-bak/dwl-patches/patches/regions/README.md delete mode 100644 dwl-bak/dwl-patches/patches/regions/regions.patch delete mode 100644 dwl-bak/dwl-patches/patches/relative-mouse-resize/README.md delete mode 100644 dwl-bak/dwl-patches/patches/relative-mouse-resize/relative-mouse-resize.patch delete mode 100644 dwl-bak/dwl-patches/patches/restore-monitor/README.md delete mode 100644 dwl-bak/dwl-patches/patches/restore-monitor/restore-monitor.patch delete mode 100644 dwl-bak/dwl-patches/patches/right/README.md delete mode 100644 dwl-bak/dwl-patches/patches/right/right.patch delete mode 100644 dwl-bak/dwl-patches/patches/rlimit_max/README.md delete mode 100644 dwl-bak/dwl-patches/patches/rlimit_max/rlimit_max.patch delete mode 100644 dwl-bak/dwl-patches/patches/rotate-clients/README.md delete mode 100644 dwl-bak/dwl-patches/patches/rotate-clients/rotate-clients.patch delete mode 100644 dwl-bak/dwl-patches/patches/rotatetags/README.md delete mode 100644 dwl-bak/dwl-patches/patches/rotatetags/rotatetags.patch delete mode 100644 dwl-bak/dwl-patches/patches/scenefx/README.md delete mode 100644 dwl-bak/dwl-patches/patches/scenefx/scenefx.patch delete mode 100644 dwl-bak/dwl-patches/patches/setrule/README.md delete mode 100644 dwl-bak/dwl-patches/patches/setrule/setrule.patch delete mode 100644 dwl-bak/dwl-patches/patches/setupenv/README.md delete mode 100644 dwl-bak/dwl-patches/patches/setupenv/setupenv.patch delete mode 100644 dwl-bak/dwl-patches/patches/shiftview/README.md delete mode 100644 dwl-bak/dwl-patches/patches/shiftview/shiftview.patch delete mode 100644 dwl-bak/dwl-patches/patches/simple_scratchpad/README.md delete mode 100644 dwl-bak/dwl-patches/patches/simple_scratchpad/simple_scratchpad-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/simpleborders/README.md delete mode 100644 dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/singlemaster/README.md delete mode 100644 dwl-bak/dwl-patches/patches/singlemaster/singlemaster.patch delete mode 100644 dwl-bak/dwl-patches/patches/singletagset-pertag/README.md delete mode 100644 dwl-bak/dwl-patches/patches/singletagset-pertag/singletagset-pertag.patch delete mode 100644 dwl-bak/dwl-patches/patches/singletagset-sticky/README.md delete mode 100644 dwl-bak/dwl-patches/patches/singletagset-sticky/singletagset-sticky.patch delete mode 100644 dwl-bak/dwl-patches/patches/singletagset/README.md delete mode 100644 dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/skipfocus/README.md delete mode 100644 dwl-bak/dwl-patches/patches/skipfocus/skipfocus-20240714.patch delete mode 100644 dwl-bak/dwl-patches/patches/skipfocus/skipfocus.patch delete mode 100644 dwl-bak/dwl-patches/patches/skipfocus/skipfocus20240108.patch delete mode 100644 dwl-bak/dwl-patches/patches/smartborders/README.md delete mode 100644 dwl-bak/dwl-patches/patches/smartborders/smartborders-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/smartborders/smartborders.patch delete mode 100644 dwl-bak/dwl-patches/patches/snail-gaps/README.md delete mode 100644 dwl-bak/dwl-patches/patches/snail-gaps/snail-gaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/snail/README.md delete mode 100644 dwl-bak/dwl-patches/patches/snail/snail.patch delete mode 100644 dwl-bak/dwl-patches/patches/spawninfo/README.md delete mode 100755 dwl-bak/dwl-patches/patches/spawninfo/pamixerc delete mode 100755 dwl-bak/dwl-patches/patches/spawninfo/screenshotwin delete mode 100644 dwl-bak/dwl-patches/patches/spawninfo/spawninfo.patch delete mode 100644 dwl-bak/dwl-patches/patches/stacker/README.md delete mode 100644 dwl-bak/dwl-patches/patches/stacker/stacker.patch delete mode 100644 dwl-bak/dwl-patches/patches/stairs/README.md delete mode 100644 dwl-bak/dwl-patches/patches/stairs/stairs.patch delete mode 100644 dwl-bak/dwl-patches/patches/startargv/README.md delete mode 100644 dwl-bak/dwl-patches/patches/startargv/startargv.patch delete mode 100644 dwl-bak/dwl-patches/patches/sticky/README.md delete mode 100644 dwl-bak/dwl-patches/patches/sticky/sticky.patch delete mode 100644 dwl-bak/dwl-patches/patches/swallow/README.md delete mode 100644 dwl-bak/dwl-patches/patches/swallow/swallow-freebsd.patch delete mode 100644 dwl-bak/dwl-patches/patches/swallow/swallow.patch delete mode 100644 dwl-bak/dwl-patches/patches/swapandfocusdir/README.md delete mode 100644 dwl-bak/dwl-patches/patches/swapandfocusdir/swapandfocusdir.patch delete mode 100644 dwl-bak/dwl-patches/patches/switchtotag/README.md delete mode 100644 dwl-bak/dwl-patches/patches/switchtotag/switchtotag.patch delete mode 100644 dwl-bak/dwl-patches/patches/systemd/README.md delete mode 100644 dwl-bak/dwl-patches/patches/systemd/systemd-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/tab/README.md delete mode 100644 dwl-bak/dwl-patches/patches/tab/tab-0.7-bar.patch delete mode 100644 dwl-bak/dwl-patches/patches/tab/tab-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/tab/tab.patch delete mode 100644 dwl-bak/dwl-patches/patches/tablet-input/README.md delete mode 100644 dwl-bak/dwl-patches/patches/tablet-input/tablet-input-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/tablet-input/tablet-input.patch delete mode 100644 dwl-bak/dwl-patches/patches/tagshift/README.md delete mode 100644 dwl-bak/dwl-patches/patches/tagshift/tagshift.patch delete mode 100644 dwl-bak/dwl-patches/patches/tearing/README.md delete mode 100644 dwl-bak/dwl-patches/patches/tearing/tearing.patch delete mode 100644 dwl-bak/dwl-patches/patches/titleurgent/README.md delete mode 100644 dwl-bak/dwl-patches/patches/titleurgent/titleurgent.patch delete mode 100644 dwl-bak/dwl-patches/patches/tmux-borders/README.md delete mode 100644 dwl-bak/dwl-patches/patches/tmux-borders/screenshot1.png delete mode 100644 dwl-bak/dwl-patches/patches/tmux-borders/screenshot2.png delete mode 100644 dwl-bak/dwl-patches/patches/tmux-borders/tmux-borders-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/toggle_constraints/README.md delete mode 100644 dwl-bak/dwl-patches/patches/toggle_constraints/toggle_constraints.patch delete mode 100644 dwl-bak/dwl-patches/patches/togglekblayoutandoptions/README.md delete mode 100644 dwl-bak/dwl-patches/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch delete mode 100644 dwl-bak/dwl-patches/patches/touch-input/README.md delete mode 100644 dwl-bak/dwl-patches/patches/touch-input/touch-input.patch delete mode 100644 dwl-bak/dwl-patches/patches/unclutter/README.md delete mode 100644 dwl-bak/dwl-patches/patches/unclutter/unclutter.patch delete mode 100644 dwl-bak/dwl-patches/patches/ungroup-keyboards/README.md delete mode 100644 dwl-bak/dwl-patches/patches/ungroup-keyboards/ungroup-keyboards.patch delete mode 100644 dwl-bak/dwl-patches/patches/vanitygaps/README.md delete mode 100644 dwl-bak/dwl-patches/patches/vanitygaps/vanitygaps-0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/vanitygaps/vanitygaps.patch delete mode 100644 dwl-bak/dwl-patches/patches/varcol/README.md delete mode 100644 dwl-bak/dwl-patches/patches/varcol/varcol.patch delete mode 100644 dwl-bak/dwl-patches/patches/viewnextocctag/README.md delete mode 100644 dwl-bak/dwl-patches/patches/viewnextocctag/viewnextocctag.patch delete mode 100644 dwl-bak/dwl-patches/patches/virtual-pointer/README.md delete mode 100644 dwl-bak/dwl-patches/patches/virtual-pointer/virtual-pointer.patch delete mode 100644 dwl-bak/dwl-patches/patches/warpcursor/README.md delete mode 100644 dwl-bak/dwl-patches/patches/warpcursor/warpcursor.patch delete mode 100644 dwl-bak/dwl-patches/patches/wayland-socket-handover/README.md delete mode 100644 dwl-bak/dwl-patches/patches/wayland-socket-handover/wayland-socket-handover.patch delete mode 100644 dwl-bak/dwl-patches/patches/winview/README.md delete mode 100644 dwl-bak/dwl-patches/patches/winview/winview-20240606.patch delete mode 100644 dwl-bak/dwl-patches/patches/winview/winview.patch delete mode 100644 dwl-bak/dwl-patches/patches/xwayland-handle-minimize/README.md delete mode 100644 dwl-bak/dwl-patches/patches/xwayland-handle-minimize/xwayland-handle-minimize.patch delete mode 100644 dwl-bak/dwl-patches/patches/zoomswap/README.md delete mode 100644 dwl-bak/dwl-patches/patches/zoomswap/zoomswap-v0.6.patch delete mode 100644 dwl-bak/dwl-patches/patches/zoomswap/zoomswap-v0.7.patch delete mode 100644 dwl-bak/dwl-patches/patches/zoomswap/zoomswap.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/bar-systray-old/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/bar-systray-old/bar-systray-0.7.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/bar-systray-old/systray.png delete mode 100644 dwl-bak/dwl-patches/stale-patches/master-right/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/master-right/master-right-0.7.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/master-right/master-right.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/press_repeat_release/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/press_repeat_release/press_repeat_release.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/remembertags/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/remembertags/remembertags.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/tab-pango/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/tab-pango/tab.patch delete mode 100644 dwl-bak/dwl-patches/stale-patches/togglekblayout/README.md delete mode 100644 dwl-bak/dwl-patches/stale-patches/togglekblayout/togglekblayout.patch delete mode 100644 dwl-bak/dwl.1 delete mode 100644 dwl-bak/dwl.c delete mode 100644 dwl-bak/dwl.c.orig delete mode 100644 dwl-bak/dwl.desktop delete mode 100644 dwl-bak/protocols/wlr-layer-shell-unstable-v1.xml delete mode 100644 dwl-bak/protocols/wlr-output-power-management-unstable-v1.xml delete mode 100644 dwl-bak/util.c delete mode 100644 dwl-bak/util.h diff --git a/.gitignore b/.gitignore index 636b0e0..6ec2a4c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ config/nvim/plugged +config/nvim/pack +config/nvim/undodir config/qtile/__pycache__ diff --git a/config/init.vim b/config/init.vim deleted file mode 100644 index b32e54b..0000000 --- a/config/init.vim +++ /dev/null @@ -1,143 +0,0 @@ -source ~/.config/nvim/plugged/plug.vim - -set nocompatible -filetype plugin indent on -syntax enable -set encoding=utf-8 -set number relativenumber -set numberwidth=4 -set tabstop=4 shiftwidth=4 expandtab smartindent -set incsearch hlsearch ignorecase smartcase -set wrap -set mouse=a -set scrolloff=5 -set cursorline -set noshowmode -set shortmess+=I -set autoindent - -set statusline=%#StatusLineMode# -set statusline+=\ %{ModeName()} -set statusline+=%#StatusLine# -set statusline+=\ %f\ %m\ %r\ %y -set statusline+=%= -set statusline+=\ Ln:%l/%L\ Col:%c\ \[%p%%] - -hi Normal guibg=NONE ctermbg=NONE guifg=#dcdfe4 ctermfg=245 -hi NormalNC guibg=NONE ctermbg=NONE guifg=#b0b3b8 ctermfg=245 -hi LineNr guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi CursorLine guibg=#3c3f41 ctermbg=59 guifg=NONE ctermfg=NONE -hi VertSplit guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi StatusLine guibg=#3c3f41 guifg=#dcdfe4 ctermbg=59 ctermfg=245 -hi StatusLineMode guibg=#5a7f9a guifg=#3c3f41 ctermbg=66 ctermfg=33 gui=bold -hi Visual guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi VisualNOS guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi VisualSB guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi Search guibg=NONE ctermbg=NONE guifg=#5c8cba ctermfg=66 -hi IncSearch guibg=NONE ctermbg=NONE guifg=#7fb3c8 ctermfg=32 -hi Pmenu guibg=NONE ctermbg=NONE guifg=#dcdfe4 ctermfg=245 -hi PmenuSel guibg=NONE ctermbg=NONE guifg=#3c3f41 ctermbg=59 -hi WildMenu guibg=NONE ctermbg=NONE guifg=#5c8cba ctermfg=66 -hi Folded guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi SignColumn guibg=NONE ctermbg=NONE guifg=#b0b3b8 ctermfg=245 - -hi Error guibg=NONE ctermbg=NONE guifg=#ff6c6b ctermfg=167 -hi Warning guibg=NONE ctermbg=NONE guifg=#e0af68 ctermfg=180 -hi DiagnosticError guibg=NONE ctermbg=NONE guifg=#ff6c6b ctermfg=167 -hi DiagnosticWarn guibg=NONE ctermbg=NONE guifg=#e0af68 ctermfg=180 -hi DiagnosticHint guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi DiagnosticInfo guibg=NONE ctermbg=NONE guifg=#7fb3c8 ctermfg=32 - -hi InsertMode guibg=#7f0000 ctermbg=167 guifg=NONE ctermfg=NONE - -function! ModeName() -let modeval = mode() -return modeval ==# 'n' ? 'NML ' : -\ modeval ==# 'i' ? 'INT ' : -\ modeval ==# 'v' ? 'VSL ' : -\ modeval ==# 'V' ? 'VLI ' : -\ modeval ==# "\" ? 'VBL ' : -\ modeval ==# 'R' ? 'RPL ' : -\ modeval ==# 'c' ? 'CMD ' : -\ 'UNKNOWN' -endfunction - -let mapleader = "\" -nnoremap w \:w -nnoremap q \:q -nnoremap h \:nohlsearch -nnoremap n \:set relativenumber! -nnoremap h -nnoremap j -nnoremap k -nnoremap l -nnoremap cd :Ex - -map j gj -map k gk - -set termguicolors -set list -set listchars= - -set backupdir=~/.cache/nvim/backup -set directory=~/.cache/nvim/swap -set undodir=~/.cache/nvim/undo -set undofile -set wrapscan -set shortmess+=c -set autoread -set cmdheight=1 -set belloff=all -set laststatus=2 -set smoothscroll -set scrolljump=3 -set hidden -set splitbelow -set splitright -set nobackup -set nowritebackup -set lazyredraw - -call plug#begin('~/.config/nvim/plugged') -Plug 'tpope/vim-sensible' -Plug 'junegunn/fzf.vim' -Plug 'tpope/vim-surround' -Plug 'tpope/vim-commentary' -Plug 'jiangmiao/auto-pairs' -Plug 'tpope/vim-repeat' -Plug 'mattn/emmet-vim' -Plug 'norcalli/nvim-colorizer.lua' -Plug 'nvim-treesitter/nvim-treesitter-textobjects' -Plug 'nvim-treesitter/nvim-treesitter-refactor' -Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} -call plug#end() - -lua << EOF -require'colorizer'.setup() -EOF - -lua << EOF -local parsers = require'nvim-treesitter.parsers'.get_parser_configs() -local ensure_installed = {} - -for lang, _ in pairs(parsers) do - if lang ~= "verilog" and lang ~= "ipkg" and lang ~= "gdshader" and - lang ~= "latex" and lang ~= "swift" and lang ~= "mlir" and - lang ~= "ocamllex" and lang ~= "unison" and lang ~= "teal" and - lang ~= "scfg" then - table.insert(ensure_installed, lang) - end -end - -require'nvim-treesitter.configs'.setup { - ensure_installed = ensure_installed, - highlight = { - enable = true, - additional_vim_regex_highlighting = false, - }, - indent = { - enable = true, - }, -} -EOF diff --git a/config/init.vim.root b/config/init.vim.root deleted file mode 100644 index 9ff3044..0000000 --- a/config/init.vim.root +++ /dev/null @@ -1,144 +0,0 @@ -source ~/.config/nvim/plugged/plug.vim - -set nocompatible -filetype plugin indent on -syntax enable -set encoding=utf-8 -set number relativenumber -set numberwidth=4 -set tabstop=4 shiftwidth=4 expandtab smartindent -set incsearch hlsearch ignorecase smartcase -set wrap -set mouse=a -set scrolloff=5 -set cursorline -set noshowmode -set shortmess+=I -set autoindent - -set statusline=%#StatusLineMode# -set statusline+=\ %{ModeName()} -set statusline+=%#StatusLine# -set statusline+=\ %f\ %m\ %r\ %y -set statusline+=%= -set statusline+=\ Ln:%l/%L\ Col:%c\ \[%p%%] - -hi Normal guibg=NONE ctermbg=NONE guifg=#dcdfe4 ctermfg=245 -hi NormalNC guibg=NONE ctermbg=NONE guifg=#b0b3b8 ctermfg=245 -hi LineNr guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi CursorLine guibg=#3c3f41 ctermbg=59 guifg=NONE ctermfg=NONE -hi VertSplit guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi StatusLine guibg=#3c3f41 guifg=#dcdfe4 ctermbg=59 ctermfg=245 -hi StatusLineMode guibg=#d85e5e guifg=#ffffff ctermbg=196 ctermfg=15 gui=bold -hi Visual guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi VisualNOS guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi VisualSB guibg=#4a545c guifg=NONE ctermbg=67 ctermfg=67 -hi Search guibg=NONE ctermbg=NONE guifg=#5c8cba ctermfg=66 -hi IncSearch guibg=NONE ctermbg=NONE guifg=#7fb3c8 ctermfg=32 -hi Pmenu guibg=NONE ctermbg=NONE guifg=#dcdfe4 ctermfg=245 -hi PmenuSel guibg=NONE ctermbg=NONE guifg=#3c3f41 ctermbg=59 -hi WildMenu guibg=NONE ctermbg=NONE guifg=#5c8cba ctermfg=66 -hi Folded guibg=NONE ctermbg=NONE guifg=#a6a8ab ctermfg=245 -hi SignColumn guibg=NONE ctermbg=NONE guifg=#b0b3b8 ctermfg=245 - -hi StatusLine guibg=#5c2f2f guifg=#ffffff ctermbg=88 ctermfg=15 -hi StatusLineMode guibg=#5c2f2f guifg=#ffffff ctermbg=88 ctermfg=15 gui=bold -hi LineNr guibg=NONE ctermbg=NONE guifg=#5c2f2f ctermfg=88 -hi CursorLine guibg=#5c2f2f ctermbg=88 guifg=NONE ctermfg=NONE -hi VertSplit guibg=NONE ctermbg=NONE guifg=#5c2f2f ctermfg=88 -hi Error guibg=NONE ctermbg=NONE guifg=#ff6c6b ctermfg=167 -hi Warning guibg=NONE ctermbg=NONE guifg=#e0af68 ctermfg=180 - -autocmd VimEnter * if $USER == "root" | highlight Normal guibg=#5c2f2f guifg=#ffffff | endif - -function! ModeName() -let modeval = mode() -return modeval ==# 'n' ? 'NML ' : -\ modeval ==# 'i' ? 'INT ' : -\ modeval ==# 'v' ? 'VSL ' : -\ modeval ==# 'V' ? 'VLI ' : -\ modeval ==# "\" ? 'VBL ' : -\ modeval ==# 'R' ? 'RPL ' : -\ modeval ==# 'c' ? 'CMD ' : -\ 'UNKNOWN' -endfunction - -let mapleader = "\" -nnoremap w \:w -nnoremap q \:q -nnoremap h \:nohlsearch -nnoremap n \:set relativenumber! -nnoremap h -nnoremap j -nnoremap k -nnoremap l -nnoremap cd :Ex - -map j gj -map k gk - -set termguicolors -set list -set listchars= - -set backupdir=~/.cache/nvim/backup -set directory=~/.cache/nvim/swap -set undodir=~/.cache/nvim/undo -set undofile -set wrapscan -set shortmess+=c -set autoread -set cmdheight=1 -set belloff=all -set laststatus=2 -set smoothscroll -set scrolljump=3 -set hidden -set splitbelow -set splitright -set nobackup -set nowritebackup -set lazyredraw - -call plug#begin('~/.config/nvim/plugged') -Plug 'tpope/vim-sensible' -Plug 'junegunn/fzf.vim' -Plug 'tpope/vim-surround' -Plug 'tpope/vim-commentary' -Plug 'jiangmiao/auto-pairs' -Plug 'tpope/vim-repeat' -Plug 'mattn/emmet-vim' -Plug 'norcalli/nvim-colorizer.lua' -Plug 'nvim-treesitter/nvim-treesitter-textobjects' -Plug 'nvim-treesitter/nvim-treesitter-refactor' -Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} -call plug#end() - -lua << EOF -require'colorizer'.setup() -EOF - -lua << EOF -local parsers = require'nvim-treesitter.parsers'.get_parser_configs() -local ensure_installed = {} - -for lang, _ in pairs(parsers) do - if lang ~= "verilog" and lang ~= "ipkg" and lang ~= "gdshader" and - lang ~= "latex" and lang ~= "swift" and lang ~= "mlir" and - lang ~= "ocamllex" and lang ~= "unison" and lang ~= "teal" and - lang ~= "scfg" then - table.insert(ensure_installed, lang) - end -end - -require'nvim-treesitter.configs'.setup { - ensure_installed = ensure_installed, - highlight = { - enable = true, - additional_vim_regex_highlighting = false, - }, - indent = { - enable = true, - }, -} -EOF diff --git a/config/nvim/init.vim b/config/nvim/init.vim index 653b05e..13e11d9 100644 --- a/config/nvim/init.vim +++ b/config/nvim/init.vim @@ -16,16 +16,6 @@ se softtabstop=4 se tabstop=4 se smartindent -syntax on - -if !isdirectory(expand("~/.config/nvim/undodir")) - call mkdir(expand("~/.config/nvim/undodir")) -endif - -let g:minimap_width = 10 -let g:minimap_auto_start = 1 -let g:minimap_auto_start_win_enter = 1 - nnoremap cd :ex if executable('nil') @@ -35,4 +25,3 @@ if executable('nil') \ 'whitelist': ['nix'], \ }) endif - diff --git a/config/nvim/pack/graft/start/colorizer b/config/nvim/pack/graft/start/colorizer new file mode 160000 index 0000000..72790a0 --- /dev/null +++ b/config/nvim/pack/graft/start/colorizer @@ -0,0 +1 @@ +Subproject commit 72790a003d5a706c287486a1a81e3a6b32158b54 diff --git a/config/nvim/pack/graft/start/nerdtree b/config/nvim/pack/graft/start/nerdtree new file mode 160000 index 0000000..690d061 --- /dev/null +++ b/config/nvim/pack/graft/start/nerdtree @@ -0,0 +1 @@ +Subproject commit 690d061b591525890f1471c6675bcb5bdc8cdff9 diff --git a/config/nvim/pack/graft/start/vim-closetag b/config/nvim/pack/graft/start/vim-closetag new file mode 160000 index 0000000..d0a562f --- /dev/null +++ b/config/nvim/pack/graft/start/vim-closetag @@ -0,0 +1 @@ +Subproject commit d0a562f8bdb107a50595aefe53b1a690460c3822 diff --git a/config/nvim/pack/graft/start/vim-commentary b/config/nvim/pack/graft/start/vim-commentary new file mode 160000 index 0000000..64a654e --- /dev/null +++ b/config/nvim/pack/graft/start/vim-commentary @@ -0,0 +1 @@ +Subproject commit 64a654ef4a20db1727938338310209b6a63f60c9 diff --git a/config/nvim/pack/graft/start/vim-endwise b/config/nvim/pack/graft/start/vim-endwise new file mode 160000 index 0000000..eab5301 --- /dev/null +++ b/config/nvim/pack/graft/start/vim-endwise @@ -0,0 +1 @@ +Subproject commit eab530110d7a0d985902a3964894816b50dbf31a diff --git a/config/nvim/pack/graft/start/vim-fugitive b/config/nvim/pack/graft/start/vim-fugitive new file mode 160000 index 0000000..61b51c0 --- /dev/null +++ b/config/nvim/pack/graft/start/vim-fugitive @@ -0,0 +1 @@ +Subproject commit 61b51c09b7c9ce04e821f6cf76ea4f6f903e3cf4 diff --git a/config/nvim/pack/graft/start/vim-lsp b/config/nvim/pack/graft/start/vim-lsp new file mode 160000 index 0000000..be06c95 --- /dev/null +++ b/config/nvim/pack/graft/start/vim-lsp @@ -0,0 +1 @@ +Subproject commit be06c952810226f372149ea1af68b628c662c65a diff --git a/config/nvim/pack/graft/start/vim-lsp-settings b/config/nvim/pack/graft/start/vim-lsp-settings new file mode 160000 index 0000000..a80c2f9 --- /dev/null +++ b/config/nvim/pack/graft/start/vim-lsp-settings @@ -0,0 +1 @@ +Subproject commit a80c2f9dd7b2be95c63b70f6ecd4cd4f0c7f4fd5 diff --git a/config/nvim/pack/graft/start/vim-surround b/config/nvim/pack/graft/start/vim-surround new file mode 160000 index 0000000..3d188ed --- /dev/null +++ b/config/nvim/pack/graft/start/vim-surround @@ -0,0 +1 @@ +Subproject commit 3d188ed2113431cf8dac77be61b842acb64433d9 diff --git a/config/nvim/pack/graft/start/vim-vinegar b/config/nvim/pack/graft/start/vim-vinegar new file mode 160000 index 0000000..bb1bcdd --- /dev/null +++ b/config/nvim/pack/graft/start/vim-vinegar @@ -0,0 +1 @@ +Subproject commit bb1bcddf43cfebe05eb565a84ab069b357d0b3d6 diff --git a/config/qtile/config.py b/config/qtile/config.py index caae539..7fd9913 100644 --- a/config/qtile/config.py +++ b/config/qtile/config.py @@ -5,10 +5,14 @@ from libqtile.utils import guess_terminal from libqtile.bar import Bar, Gap import subprocess +#run commands on startup +subprocess.run("/home/coast/.local/src/local/bin/start_qtile.sh") + +#define terminal and super key mod = "mod4" terminal = "footclient" -subprocess.run("/home/coast/.local/src/local/bin/start_qtile.sh") +#keybinds keys = [ Key([mod], "h", lazy.layout.left(), desc="Move focus to left"), Key([mod], "j", lazy.layout.right(), desc="Move focus to right"), @@ -33,16 +37,11 @@ keys = [ lazy.layout.toggle_split(), desc="Toggle between split and unsplit sides of stack", ), - Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"), + Key([mod], "Return", lazy.spawn(terminal), desc="Launch foot"), Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"), Key([mod], "s", lazy.window.kill(), desc="Kill focused window"), - Key( - [mod], - "f", - lazy.window.toggle_fullscreen(), - desc="Toggle fullscreen on the focused window", - ), - Key([mod], "t", lazy.window.toggle_floating(), desc="Toggle floating on the focused window"), + Key([mod], "f", lazy.window.toggle_fullscreen(), desc="Toggle fullscreen on the focused window"), + Key([mod], "space", lazy.window.toggle_floating(), desc="Toggle floating on the focused window"), Key([mod, "control"], "r", lazy.reload_config(), desc="Reload the config"), Key([mod, "shift"], "q", lazy.shutdown(), desc="Shutdown Qtile"), Key([mod], "r", lazy.spawn("wmenu-run -f \"Ubuntu 14\" -N #000000"), desc="Spawn a command using wmenu"), @@ -50,14 +49,7 @@ keys = [ ] for vt in range(1, 8): - keys.append( - Key( - ["control", "mod1"], - f"f{vt}", - lazy.core.change_vt(vt).when(func=lambda: qtile.core.name == "wayland"), - desc=f"Switch to VT{vt}", - ) - ) + keys.append(Key(["control", "mod1"], f"f{vt}", lazy.core.change_vt(vt).when(func=lambda: qtile.core.name == "wayland"), desc=f"Switch to VT{vt}")) @hook.subscribe.client_new def set_opacity(window): @@ -110,16 +102,17 @@ screens = [ Screen( top=bar.Bar( [ - widget.CurrentLayout(), - widget.GroupBox(), + widget.GroupBox(font = "JetBrains Mono Nerd Font", margin_y = 5, margin_x = 5, padding_y = 0, padding_x = 2, borderwidth = 3, rounded = False, highlight_method = "line", inactive = ["#ffffff"], ), + widget.TextBox(text = '|', font = "JetBrains Mono Nerd Font", padding = 2,), + widget.CurrentLayout(font = "JetBrains Mono Nerd Font",), + widget.TextBox(text = '|', font = "JetBrains Mono Nerd Font", padding = 2,), widget.Prompt(), - widget.WindowName(), + widget.WindowName(font = "JetBrains Mono Nerd Font"), widget.Chord( chords_colors={ "launch": ("#ff0000", "#ffffff"), }, - name_transform=lambda name: name.upper(), - ), + name_transform=lambda name: name.upper()), widget.StatusNotifier(), widget.Clock(format="%I:%M %p"), widget.QuickExit(), diff --git a/config/starship.root.toml b/config/starship.root.toml deleted file mode 100644 index 9269195..0000000 --- a/config/starship.root.toml +++ /dev/null @@ -1,36 +0,0 @@ -format = """ -[](#5c0000)\ -$os\ -$username\ -[](bg:#ff4444 fg:#5c0000)\ -$directory\ -[](fg:#ff4444 bg:#ff4444)\ -[](fg:#ff4444 bg:#8e44ad)\ -[](fg:#8e44ad bg:#5c0000)\ -[](fg:#5c0000 bg:#8e44ad)\ -$time\ -[ ](fg:#8e44ad)\ -""" - -[username] -show_always = true -style_user = "bg:#5c0000" -style_root = "bg:#5c0000 fg:#ffaaaa" -format = '[$user ]($style)' -disabled = false - -[os] -style = "bg:#5c0000" -disabled = true - -[directory] -style = "fg:#1a0000 bg:#ff4444" -format = "[ $path ]($style)" -truncation_length = 3 -truncation_symbol = "…/" - -[directory.substitutions] -"Documents" = "󰈙 " -"Downloads" = " " -"Music" = " " -"Pictures" = " " \ No newline at end of file diff --git a/config/user-dirs.dirs b/config/user-dirs.dirs deleted file mode 100644 index e734b9f..0000000 --- a/config/user-dirs.dirs +++ /dev/null @@ -1,15 +0,0 @@ -# This file is written by xdg-user-dirs-update -# If you want to change or add directories, just edit the line you're -# interested in. All local changes will be retained on the next run. -# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped -# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an -# absolute path. No other format is supported. -# -XDG_DESKTOP_DIR="$HOME/files/desktop" -XDG_DOWNLOAD_DIR="$HOME/dl" -XDG_DOCUMENTS_DIR="$HOME/files/docs" -XDG_MUSIC_DIR="$HOME/files/music" -XDG_PICTURES_DIR="$HOME/files/pics" -XDG_VIDEOS_DIR="$HOME/files/vids" -XDG_TEMPLATES_DIR="$HOME/files/templates" -XDG_PUBLICSHARE_DIR="$HOME/files/public" diff --git a/dwl-bak/.gitea/issue_template/bug_report.yml b/dwl-bak/.gitea/issue_template/bug_report.yml deleted file mode 100644 index 77ce108..0000000 --- a/dwl-bak/.gitea/issue_template/bug_report.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Bug Report -about: Something in dwl isn't working correctly -title: -labels: - - 'Kind/Bug' -body: - - type: markdown - attributes: - value: | - - Only report bugs that can be reproduced on the main (or wlroots-next) branch without patches. - - Proprietary graphics drivers, including nvidia, are not supported. Please use the open source equivalents, such as nouveau, if you would like to use dwl. - - Report patch issues to their respective authors. - - - type: input - id: dwl_version - attributes: - label: 'dwl version:' - placeholder: '`dwl -v`' - validations: - required: true - - - type: input - id: wlroots_version - attributes: - label: 'wlroots version:' - validations: - required: true - - - type: input - id: distro - attributes: - label: What distro (and version) are you using? - validations: - required: false - - - type: textarea - attributes: - label: Description - value: | - The steps you took to reproduce the problem. - validations: - required: false - - - type: textarea - id: debug_log - attributes: - label: Debug Log - value: | - Run `dwl -d 2> ~/dwl.log` from a TTY and attach the **full** (do not truncate it) file here, or upload it to a pastebin. - Please try to keep the reproduction as brief as possible and exit dwl. - validations: - required: false - - - type: textarea - id: backtrace - attributes: - label: Stack Trace - value: | - - Only required if dwl crashes. - - If the lines mentioning dwl or wlroots have `??`. Please compile both dwl and wlroots from source (enabling debug symbols) and try to reproduce. - validations: - required: false diff --git a/dwl-bak/.gitea/issue_template/enhancement-idea.yml b/dwl-bak/.gitea/issue_template/enhancement-idea.yml deleted file mode 100644 index be1bbf2..0000000 --- a/dwl-bak/.gitea/issue_template/enhancement-idea.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: Enhancement idea -about: Suggest a feature or improvement -title: -labels: - - 'Kind/Feature' -body: - - type: textarea - attributes: - label: Description diff --git a/dwl-bak/.gitignore b/dwl-bak/.gitignore deleted file mode 100644 index 0dde90e..0000000 --- a/dwl-bak/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -dwl -*.o -*-protocol.c -*-protocol.h -.ccls-cache -config.h diff --git a/dwl-bak/.mailmap b/dwl-bak/.mailmap deleted file mode 100644 index 911248c..0000000 --- a/dwl-bak/.mailmap +++ /dev/null @@ -1 +0,0 @@ -Lennart Jablonka diff --git a/dwl-bak/CHANGELOG.md b/dwl-bak/CHANGELOG.md deleted file mode 100644 index 3a299c4..0000000 --- a/dwl-bak/CHANGELOG.md +++ /dev/null @@ -1,200 +0,0 @@ -# Changelog - -* [0.7](#0.7) -* [0.6](#0.6) -* [0.5](#0.5) - - -## 0.7 - -See also [0.6](#0.6) release notes. 0.7 builds against wlroots 0.18.x. - -### Added - -* Add support for the alpha-modifier-v1 protocol ([wlroots!4616][wlroots!4616]). -* dwl now will survive GPU resets ([#601][601]). - -[wlroots!4616]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4616 -[601]: https://codeberg.org/dwl/dwl/issues/601 - - -### Fixed - -* Crash when re-mapping unmapped clients. - - -### Contributors - -Guido Cella -Lennart Jablonka - - -## 0.6 - -### Added - -* Add `rootcolor` to change the default background color ([#544][544]). -* Implement the wlr-virtual-pointer-unstable-v1 protocol ([#574][574]). -* Implement the pointer-constraints and relative-pointer protocols ([#317][317]) -* Implement the wlr-output-power-management protocol ([#599][599]) - -[544]: https://codeberg.org/dwl/dwl/pulls/544 -[574]: https://codeberg.org/dwl/dwl/pulls/574 -[317]: https://codeberg.org/dwl/dwl/issues/317 -[599]: https://codeberg.org/dwl/dwl/issues/559 - - -### Changed - -* Keyboards are now managed through keyboard groups ([#549][549]). -* Only the first matched keybinding is executed. -* Allow toggling the layout before selecting a different one ([#570][570]). -* Fullscreen clients are now rendered above wlr_layer_surfaces in the top layer - ([#609][609]). -* The default menu was changed from `bemenu-run` to `wmenu-run` ([#553][553]). -* The option `sloppyfocus` now replicates the dwm behavior ([#599][599]). -* Allow configure position of monitors with negative values. (-1, -1) is - used to auto-configure them ([#635][635]). -* dwl now kills the entire process group of `startup_cmd` -* The O_NONBLOCK flag is set for stdout. - -[549]: https://codeberg.org/dwl/dwl/pulls/549 -[570]: https://codeberg.org/dwl/dwl/pulls/570 -[609]: https://codeberg.org/dwl/dwl/pulls/609 -[553]: https://codeberg.org/dwl/dwl/issues/553 -[599]: https://codeberg.org/dwl/dwl/pulls/599 -[635]: https://codeberg.org/dwl/dwl/pulls/635 - - -### Removed - -* The SLOC limit is now removed ([#497][497]). - -[497]: https://codeberg.org/dwl/dwl/pulls/497 - - -### Fixed - -* Clients not having the correct border color when mapping. -* Compliance with the xdg-decoration-unstable-v1 ([#546][546]). -* dwl no longer sends negative values in xdg_toplevel.configure events. -* Crashes with disabled monitors ([#472][472]). - -[546]: https://codeberg.org/dwl/dwl/pulls/546 -[472]: https://codeberg.org/dwl/dwl/issues/472 - - -### Contributors - -Ben Jargowsky -Benjamin Chausse -David Donahue -Devin J. Pohly -Dima Krasner -Emil Miler -Forrest Bushstone -Guido Cella -Peter Hofmann -Rutherther -Squibid -choc -fictitiousexistence -korei999 -sewn -thanatos - - -## 0.5 - -### Added - -* Allow configure x and y position of outputs ([#301][301]) -* Implement repeatable keybindings ([#368][368]) -* Print app id in printstatus() output ([#381][381]) -* Display client count in monocle symbol ([#387][387]) -* Export XCURSOR_SIZE to fix apps using an older version of Qt ([#425][425]) -* Support for wp-fractional-scale-v1 (through wlr_scene: [wlroots!3511][wlroots!3511]) -* dwl now sends `wl_surface.preferred_buffer_scale` (through wlr_scene: [wlroots!4269][wlroots!4269]) -* Add support for xdg-shell v6 ([#465][465]) -* Add support for wp-cursor-shape-v1 ([#444][444]) -* Add desktop file ([#484][484]) -* Add macro to easily configure colors ([#466][466]) -* Color of urgent clients are now red ([#494][494]) -* New flag `-d` and option `log_level` to change the wlroots debug level -* Add CHANGELOG.md ([#501][501]) - -[301]: https://github.com/djpohly/dwl/pull/301 -[368]: https://github.com/djpohly/dwl/pull/368 -[381]: https://github.com/djpohly/dwl/pull/381 -[387]: https://github.com/djpohly/dwl/issues/387 -[425]: https://github.com/djpohly/dwl/pull/425 -[wlroots!4269]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4269 -[wlroots!3511]: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3511 -[465]: https://github.com/djpohly/dwl/pull/465 -[444]: https://github.com/djpohly/dwl/pull/444 -[484]: https://github.com/djpohly/dwl/pull/484 -[466]: https://github.com/djpohly/dwl/issues/466 -[494]: https://github.com/djpohly/dwl/pull/494 -[501]: https://github.com/djpohly/dwl/pull/501 - - -### Changed - -* Replace `tags` with `TAGCOUNT` in config.def.h ([#403][403]) -* Pop ups are now destroyed when focusing another client ([#408][408]) -* dwl does not longer respect size hints, instead clip windows if they are - larger than they should be ([#455][455]) -* The version of wlr-layer-shell-unstable-v1 was lowered to 3 (from 4) -* Use the same border color as dwm ([#494][494]) - -[403]: https://github.com/djpohly/dwl/pull/403 -[408]: https://github.com/djpohly/dwl/pull/409 -[455]: https://github.com/djpohly/dwl/pull/455 -[494]: https://github.com/djpohly/dwl/pull/494 - - -### Removed - -* Remove unused `rootcolor` option ([#401][401]) -* Remove support for wlr-input-inhibitor-unstable-v1 ([#430][430]) -* Remove support for KDE idle protocol ([#431][431]) - -[401]: https://github.com/djpohly/dwl/pull/401 -[430]: https://github.com/djpohly/dwl/pull/430 -[431]: https://github.com/djpohly/dwl/pull/431 - - -### Fixed - -* Fix crash when creating a layer surface with all outputs disabled - ([#421][421]) -* Fix other clients being shown as focused if the focused client have pop ups - open ([#408][408]) -* Resize fullscreen clients when updating monitor mode -* dwl no longer crash at exit like sometimes did -* Fullscreen background appearing above clients ([#487][487]) -* Fix a segfault when user provides invalid xkb_rules ([#518][518]) - -[421]: https://github.com/djpohly/dwl/pull/421 -[408]: https://github.com/djpohly/dwl/issues/408 -[487]: https://github.com/djpohly/dwl/issues/487 -[518]: https://github.com/djpohly/dwl/pull/518 - - -### Contributors - -* A Frederick Christensen -* Angelo Antony -* Ben Collerson -* Devin J. Pohly -* Forrest Bushstone -* gan-of-culture -* godalming123 -* Job79 -* link2xt -* Micah Gorrell -* Nikita Ivanov -* Palanix -* pino-desktop -* Weiseguy -* Yves Zoundi diff --git a/dwl-bak/LICENSE b/dwl-bak/LICENSE deleted file mode 100644 index 658085a..0000000 --- a/dwl-bak/LICENSE +++ /dev/null @@ -1,692 +0,0 @@ -dwl - dwm for Wayland - -Copyright © 2020 dwl team - -See also the files LICENSE.tinywl, LICENSE.dwm and LICENSE.sway. - -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 3 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. - ----- - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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. But first, please read -. diff --git a/dwl-bak/LICENSE.dwm b/dwl-bak/LICENSE.dwm deleted file mode 100644 index 507e4dc..0000000 --- a/dwl-bak/LICENSE.dwm +++ /dev/null @@ -1,39 +0,0 @@ -Portions of dwl based on dwm code are used under the following license: - -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2009 Jukka Salmi -© 2006-2007 Sander van Dijk -© 2007-2011 Peter Hartlich -© 2007-2009 Szabolcs Nagy -© 2007-2009 Christof Musik -© 2007-2009 Premysl Hruby -© 2007-2008 Enno Gottox Boland -© 2008 Martin Hurton -© 2008 Neale Pickett -© 2009 Mate Nagy -© 2010-2016 Hiltjo Posthuma -© 2010-2012 Connor Lane Smith -© 2011 Christoph Lohmann <20h@r-36.net> -© 2015-2016 Quentin Rameau -© 2015-2016 Eric Pruitt -© 2016-2017 Markus Teich - -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/dwl-bak/LICENSE.sway b/dwl-bak/LICENSE.sway deleted file mode 100644 index 3e0cacc..0000000 --- a/dwl-bak/LICENSE.sway +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016-2017 Drew DeVault - -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/dwl-bak/LICENSE.tinywl b/dwl-bak/LICENSE.tinywl deleted file mode 100644 index 7023690..0000000 --- a/dwl-bak/LICENSE.tinywl +++ /dev/null @@ -1,127 +0,0 @@ -dwl is originally based on TinyWL, which is used under the following license: - -This work is licensed under CC0, which effectively puts it in the public domain. - ---- - -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/dwl-bak/Makefile b/dwl-bak/Makefile deleted file mode 100644 index 9bc67db..0000000 --- a/dwl-bak/Makefile +++ /dev/null @@ -1,78 +0,0 @@ -.POSIX: -.SUFFIXES: - -include config.mk - -# flags for compiling -DWLCPPFLAGS = -I. -DWLR_USE_UNSTABLE -D_POSIX_C_SOURCE=200809L \ - -DVERSION=\"$(VERSION)\" $(XWAYLAND) -DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wno-unused-parameter -Wshadow -Wunused-macros -Werror=strict-prototypes \ - -Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types \ - -Wfloat-conversion - -# CFLAGS / LDFLAGS -PKGS = wlroots-0.18 wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) -DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) -LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -all: dwl -dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ -dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -util.o: util.c util.h - -# wayland-scanner is a tool which generates C headers and rigging for Wayland -# protocols, which are specified in XML. wlroots requires you to rig these up -# to your build system yourself and provide them in the include path. -WAYLAND_SCANNER = `$(PKG_CONFIG) --variable=wayland_scanner wayland-scanner` -WAYLAND_PROTOCOLS = `$(PKG_CONFIG) --variable=pkgdatadir wayland-protocols` - -cursor-shape-v1-protocol.h: - $(WAYLAND_SCANNER) enum-header \ - $(WAYLAND_PROTOCOLS)/staging/cursor-shape/cursor-shape-v1.xml $@ -pointer-constraints-unstable-v1-protocol.h: - $(WAYLAND_SCANNER) enum-header \ - $(WAYLAND_PROTOCOLS)/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml $@ -wlr-layer-shell-unstable-v1-protocol.h: - $(WAYLAND_SCANNER) enum-header \ - protocols/wlr-layer-shell-unstable-v1.xml $@ -wlr-output-power-management-unstable-v1-protocol.h: - $(WAYLAND_SCANNER) server-header \ - protocols/wlr-output-power-management-unstable-v1.xml $@ -xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ - -config.h: - cp config.def.h $@ -clean: - rm -f dwl *.o *-protocol.h - -dist: clean - mkdir -p dwl-$(VERSION) - cp -R LICENSE* Makefile CHANGELOG.md README.md client.h config.def.h \ - config.mk protocols dwl.1 dwl.c util.c util.h dwl.desktop \ - dwl-$(VERSION) - tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION) - rm -rf dwl-$(VERSION) - -install: dwl - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dwl $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl - mkdir -p $(DESTDIR)$(MANDIR)/man1 - cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1 - chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1 - mkdir -p $(DESTDIR)$(DATADIR)/wayland-sessions - cp -f dwl.desktop $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - chmod 644 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 \ - $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - -.SUFFIXES: .c .o -.c.o: - $(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -c $< diff --git a/dwl-bak/README.md b/dwl-bak/README.md deleted file mode 100644 index aa95bab..0000000 --- a/dwl-bak/README.md +++ /dev/null @@ -1,201 +0,0 @@ -# dwl - dwm for Wayland - -Join us on our IRC channel: [#dwl on Libera Chat] -Or on our [Discord server]. - -dwl is a compact, hackable compositor for [Wayland] based on [wlroots]. It is -intended to fill the same space in the Wayland world that dwm does in X11, -primarily in terms of functionality, and secondarily in terms of -philosophy. Like dwm, dwl is: - -- Easy to understand, hack on, and extend with patches -- One C source file (or a very small number) configurable via `config.h` -- Tied to as few external dependencies as possible - -## Getting Started: - -### **dwl branch 0.7 and releases based upon 0.7 build against [wlroots] 0.18** - -### Latest semi-stable [release] -This is probably where you want to start. This builds against the dependent -packages' versions currently shipping in major distributions. If your -distribution's wlroots version is older, use an earlier dwl [release] or [0.x -branch]. - -### Development branch [main] -Active development progresses on the `main` branch. The `main` branch is built -against a late (and often changing) git commit of wlroots. While the adventurous -are welcome to use `main`, it is a rocky road. Using `main` requires that the -user be willing to chase git commits of wlroots. Testing development pull -requests may involve merging unmerged pull requests in [wlroots]' git repository -and/or git commits of wayland. - -### Building dwl -dwl has the following dependencies: -- libinput -- wayland -- wlroots (compiled with the libinput backend) -- xkbcommon -- wayland-protocols (compile-time only) -- pkg-config (compile-time only) - -dwl has the following additional dependencies if XWayland support is enabled: -- libxcb -- libxcb-wm -- wlroots (compiled with X11 support) -- Xwayland (runtime only) - -Install these (and their `-devel` versions if your distro has separate -development packages) and run `make`. If you wish to build against a released -version of wlroots (*you probably do*), use a [release] or a [0.x branch]. If -you want to use the unstable development `main` branch, you need to use the git -version of [wlroots]. - -To enable XWayland, you should uncomment its flags in `config.mk`. - -## Configuration - -All configuration is done by editing `config.h` and recompiling, in the same -manner as dwm. There is no way to separately restart the window manager in -Wayland without restarting the entire display server, so any changes will take -effect the next time dwl is executed. - -As in the dwm community, we encourage users to share patches they have -created. Check out the [dwl-patches] repository! - -## Running dwl - -dwl can be run on any of the backends supported by wlroots. This means you can -run it as a separate window inside either an X11 or Wayland session, as well as -directly from a VT console. Depending on your distro's setup, you may need to -add your user to the `video` and `input` groups before you can run dwl on a -VT. If you are using `elogind` or `systemd-logind` you need to install polkit; -otherwise you need to add yourself in the `seat` group and enable/start the -seatd daemon. - -When dwl is run with no arguments, it will launch the server and begin handling -any shortcuts configured in `config.h`. There is no status bar or other -decoration initially; these are instead clients that can be run within the -Wayland session. Do note that the default background color is black. This can be -modified in `config.h`. - -If you would like to run a script or command automatically at startup, you can -specify the command using the `-s` option. This command will be executed as a -shell command using `/bin/sh -c`. It serves a similar function to `.xinitrc`, -but differs in that the display server will not shut down when this process -terminates. Instead, dwl will send this process a SIGTERM at shutdown and wait -for it to terminate (if it hasn't already). This makes it ideal for execing into -a user service manager like [s6], [anopa], [runit], [dinit], or [`systemd ---user`]. - -Note: The `-s` command is run as a *child process* of dwl, which means that it -does not have the ability to affect the environment of dwl or of any processes -that it spawns. If you need to set environment variables that affect the entire -dwl session, these must be set prior to running dwl. For example, Wayland -requires a valid `XDG_RUNTIME_DIR`, which is usually set up by a session manager -such as `elogind` or `systemd-logind`. If your system doesn't do this -automatically, you will need to configure it prior to launching `dwl`, e.g.: - - export XDG_RUNTIME_DIR=/tmp/xdg-runtime-$(id -u) - mkdir -p $XDG_RUNTIME_DIR - dwl - -### Status information - -Information about selected layouts, current window title, app-id, and -selected/occupied/urgent tags is written to the stdin of the `-s` command (see -the `printstatus()` function for details). This information can be used to -populate an external status bar with a script that parses the -information. Failing to read this information will cause dwl to block, so if you -do want to run a startup command that does not consume the status information, -you can close standard input with the `<&-` shell redirection, for example: - - dwl -s 'foot --server <&-' - -If your startup command is a shell script, you can achieve the same inside the -script with the line - - exec <&- - -To get a list of status bars that work with dwl consult our [wiki]. - -## Replacements for X applications - -You can find a [list of useful resources on our wiki]. - -## Background - -dwl is not meant to provide every feature under the sun. Instead, like dwm, it -sticks to features which are necessary, simple, and straightforward to implement -given the base on which it is built. Implemented default features are: - -- Any features provided by dwm/Xlib: simple window borders, tags, keybindings, - client rules, mouse move/resize. Providing a built-in status bar is an - exception to this goal, to avoid dependencies on font rendering and/or drawing - libraries when an external bar could work well. -- Configurable multi-monitor layout support, including position and rotation -- Configurable HiDPI/multi-DPI support -- Idle-inhibit protocol which lets applications such as mpv disable idle - monitoring -- Provide information to external status bars via stdout/stdin -- Urgency hints via xdg-activate protocol -- Support screen lockers via ext-session-lock-v1 protocol -- Various Wayland protocols -- XWayland support as provided by wlroots (can be enabled in `config.mk`) -- Zero flickering - Wayland users naturally expect that "every frame is perfect" -- Layer shell popups (used by Waybar) -- Damage tracking provided by scenegraph API - -Given the Wayland architecture, dwl has to implement features from dwm **and** -the xorg-server. Because of this, it is impossible to maintain the original -project goal of 2000 SLOC and have a reasonably complete compositor with -features comparable to dwm. However, this does not mean that the code will grow -indiscriminately. We will try to keep the code as small as possible. - -Features under consideration (possibly as patches) are: - -- Protocols made trivial by wlroots -- Implement the text-input and input-method protocols to support IME once ibus - implements input-method v2 (see https://github.com/ibus/ibus/pull/2256 and - https://codeberg.org/dwl/dwl/pulls/235) - -Feature *non-goals* for the main codebase include: - -- Client-side decoration (any more than is necessary to tell the clients not to) -- Client-initiated window management, such as move, resize, and close, which can - be done through the compositor -- Animations and visual effects - -## Acknowledgements - -dwl began by extending the TinyWL example provided (CC0) by the sway/wlroots -developers. This was made possible in many cases by looking at how sway -accomplished something, then trying to do the same in as suckless a way as -possible. - -Many thanks to suckless.org and the dwm developers and community for the -inspiration, and to the various contributors to the project, including: - -- **Devin J. Pohly for creating and nurturing the fledgling project** -- Alexander Courtis for the XWayland implementation -- Guido Cella for the layer-shell protocol implementation, patch maintenance, - and for helping to keep the project running -- Stivvo for output management and fullscreen support, and patch maintenance - - -[`systemd --user`]: https://wiki.archlinux.org/title/Systemd/User -[#dwl on Libera Chat]: https://web.libera.chat/?channels=#dwl -[0.7-rc1]: https://codeberg.org/dwl/dwl/releases/tag/v0.7-rc1 -[0.x branch]: https://codeberg.org/dwl/dwl/branches -[anopa]: https://jjacky.com/anopa/ -[dinit]: https://davmac.org/projects/dinit/ -[dwl-patches]: https://codeberg.org/dwl/dwl-patches -[list of useful resources on our wiki]: https://codeberg.org/dwl/dwl/wiki/Home#migrating-from-x -[main]: https://codeberg.org/dwl/dwl/src/branch/main -[release]: https://codeberg.org/dwl/dwl/releases -[runit]: http://smarden.org/runit/faq.html#userservices -[s6]: https://skarnet.org/software/s6/ -[wlroots]: https://gitlab.freedesktop.org/wlroots/wlroots/ -[wiki]: https://codeberg.org/dwl/dwl/wiki/Home#compatible-status-bars -[Discord server]: https://discord.gg/jJxZnrGPWN -[Wayland]: https://wayland.freedesktop.org/ diff --git a/dwl-bak/client.h b/dwl-bak/client.h deleted file mode 100644 index 42f225f..0000000 --- a/dwl-bak/client.h +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Attempt to consolidate unavoidable suck into one file, away from dwl.c. This - * file is not meant to be pretty. We use a .h file with static inline - * functions instead of a separate .c module, or function pointers like sway, so - * that they will simply compile out if the chosen #defines leave them unused. - */ - -/* Leave these functions first; they're used in the others */ -static inline int -client_is_x11(Client *c) -{ -#ifdef XWAYLAND - return c->type == X11; -#endif - return 0; -} - -static inline struct wlr_surface * -client_surface(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return c->surface.xwayland->surface; -#endif - return c->surface.xdg->surface; -} - -static inline int -toplevel_from_wlr_surface(struct wlr_surface *s, Client **pc, LayerSurface **pl) -{ - struct wlr_xdg_surface *xdg_surface, *tmp_xdg_surface; - struct wlr_surface *root_surface; - struct wlr_layer_surface_v1 *layer_surface; - Client *c = NULL; - LayerSurface *l = NULL; - int type = -1; -#ifdef XWAYLAND - struct wlr_xwayland_surface *xsurface; -#endif - - if (!s) - return -1; - root_surface = wlr_surface_get_root_surface(s); - -#ifdef XWAYLAND - if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(root_surface))) { - c = xsurface->data; - type = c->type; - goto end; - } -#endif - - if ((layer_surface = wlr_layer_surface_v1_try_from_wlr_surface(root_surface))) { - l = layer_surface->data; - type = LayerShell; - goto end; - } - - xdg_surface = wlr_xdg_surface_try_from_wlr_surface(root_surface); - while (xdg_surface) { - tmp_xdg_surface = NULL; - switch (xdg_surface->role) { - case WLR_XDG_SURFACE_ROLE_POPUP: - if (!xdg_surface->popup || !xdg_surface->popup->parent) - return -1; - - tmp_xdg_surface = wlr_xdg_surface_try_from_wlr_surface(xdg_surface->popup->parent); - - if (!tmp_xdg_surface) - return toplevel_from_wlr_surface(xdg_surface->popup->parent, pc, pl); - - xdg_surface = tmp_xdg_surface; - break; - case WLR_XDG_SURFACE_ROLE_TOPLEVEL: - c = xdg_surface->data; - type = c->type; - goto end; - case WLR_XDG_SURFACE_ROLE_NONE: - return -1; - } - } - -end: - if (pl) - *pl = l; - if (pc) - *pc = c; - return type; -} - -/* The others */ -static inline void -client_activate_surface(struct wlr_surface *s, int activated) -{ - struct wlr_xdg_toplevel *toplevel; -#ifdef XWAYLAND - struct wlr_xwayland_surface *xsurface; - if ((xsurface = wlr_xwayland_surface_try_from_wlr_surface(s))) { - wlr_xwayland_surface_activate(xsurface, activated); - return; - } -#endif - if ((toplevel = wlr_xdg_toplevel_try_from_wlr_surface(s))) - wlr_xdg_toplevel_set_activated(toplevel, activated); -} - -static inline uint32_t -client_set_bounds(Client *c, int32_t width, int32_t height) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return 0; -#endif - if (wl_resource_get_version(c->surface.xdg->toplevel->resource) >= - XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION && width >= 0 && height >= 0 - && (c->bounds.width != width || c->bounds.height != height)) { - c->bounds.width = width; - c->bounds.height = height; - return wlr_xdg_toplevel_set_bounds(c->surface.xdg->toplevel, width, height); - } - return 0; -} - -static inline const char * -client_get_appid(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return c->surface.xwayland->class; -#endif - return c->surface.xdg->toplevel->app_id; -} - -static inline void -client_get_clip(Client *c, struct wlr_box *clip) -{ - struct wlr_box xdg_geom = {0}; - *clip = (struct wlr_box){ - .x = 0, - .y = 0, - .width = c->geom.width - c->bw, - .height = c->geom.height - c->bw, - }; - -#ifdef XWAYLAND - if (client_is_x11(c)) - return; -#endif - - wlr_xdg_surface_get_geometry(c->surface.xdg, &xdg_geom); - clip->x = xdg_geom.x; - clip->y = xdg_geom.y; -} - -static inline void -client_get_geometry(Client *c, struct wlr_box *geom) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) { - geom->x = c->surface.xwayland->x; - geom->y = c->surface.xwayland->y; - geom->width = c->surface.xwayland->width; - geom->height = c->surface.xwayland->height; - return; - } -#endif - wlr_xdg_surface_get_geometry(c->surface.xdg, geom); -} - -static inline Client * -client_get_parent(Client *c) -{ - Client *p = NULL; -#ifdef XWAYLAND - if (client_is_x11(c)) { - if (c->surface.xwayland->parent) - toplevel_from_wlr_surface(c->surface.xwayland->parent->surface, &p, NULL); - return p; - } -#endif - if (c->surface.xdg->toplevel->parent) - toplevel_from_wlr_surface(c->surface.xdg->toplevel->parent->base->surface, &p, NULL); - return p; -} - -static inline int -client_has_children(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return !wl_list_empty(&c->surface.xwayland->children); -#endif - /* surface.xdg->link is never empty because it always contains at least the - * surface itself. */ - return wl_list_length(&c->surface.xdg->link) > 1; -} - -static inline const char * -client_get_title(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return c->surface.xwayland->title; -#endif - return c->surface.xdg->toplevel->title; -} - -static inline int -client_is_float_type(Client *c) -{ - struct wlr_xdg_toplevel *toplevel; - struct wlr_xdg_toplevel_state state; - -#ifdef XWAYLAND - if (client_is_x11(c)) { - struct wlr_xwayland_surface *surface = c->surface.xwayland; - xcb_size_hints_t *size_hints = surface->size_hints; - size_t i; - if (surface->modal) - return 1; - - for (i = 0; i < surface->window_type_len; i++) - if (surface->window_type[i] == netatom[NetWMWindowTypeDialog] - || surface->window_type[i] == netatom[NetWMWindowTypeSplash] - || surface->window_type[i] == netatom[NetWMWindowTypeToolbar] - || surface->window_type[i] == netatom[NetWMWindowTypeUtility]) - return 1; - - return size_hints && size_hints->min_width > 0 && size_hints->min_height > 0 - && (size_hints->max_width == size_hints->min_width - || size_hints->max_height == size_hints->min_height); - } -#endif - - toplevel = c->surface.xdg->toplevel; - state = toplevel->current; - return toplevel->parent || (state.min_width != 0 && state.min_height != 0 - && (state.min_width == state.max_width - || state.min_height == state.max_height)); -} - -static inline int -client_is_rendered_on_mon(Client *c, Monitor *m) -{ - /* This is needed for when you don't want to check formal assignment, - * but rather actual displaying of the pixels. - * Usually VISIBLEON suffices and is also faster. */ - struct wlr_surface_output *s; - int unused_lx, unused_ly; - if (!wlr_scene_node_coords(&c->scene->node, &unused_lx, &unused_ly)) - return 0; - wl_list_for_each(s, &client_surface(c)->current_outputs, link) - if (s->output == m->wlr_output) - return 1; - return 0; -} - -static inline int -client_is_stopped(Client *c) -{ - int pid; - siginfo_t in = {0}; -#ifdef XWAYLAND - if (client_is_x11(c)) - return 0; -#endif - - wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL); - if (waitid(P_PID, pid, &in, WNOHANG|WCONTINUED|WSTOPPED|WNOWAIT) < 0) { - /* This process is not our child process, while is very unluckely that - * it is stopped, in order to do not skip frames assume that it is. */ - if (errno == ECHILD) - return 1; - } else if (in.si_pid) { - if (in.si_code == CLD_STOPPED || in.si_code == CLD_TRAPPED) - return 1; - if (in.si_code == CLD_CONTINUED) - return 0; - } - - return 0; -} - -static inline int -client_is_unmanaged(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return c->surface.xwayland->override_redirect; -#endif - return 0; -} - -static inline void -client_notify_enter(struct wlr_surface *s, struct wlr_keyboard *kb) -{ - if (kb) - wlr_seat_keyboard_notify_enter(seat, s, kb->keycodes, - kb->num_keycodes, &kb->modifiers); - else - wlr_seat_keyboard_notify_enter(seat, s, NULL, 0, NULL); -} - -static inline void -client_restack_surface(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - wlr_xwayland_surface_restack(c->surface.xwayland, NULL, - XCB_STACK_MODE_ABOVE); -#endif - return; -} - -static inline void -client_send_close(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) { - wlr_xwayland_surface_close(c->surface.xwayland); - return; - } -#endif - wlr_xdg_toplevel_send_close(c->surface.xdg->toplevel); -} - -static inline void -client_set_border_color(Client *c, const float color[static 4]) -{ - int i; - for (i = 0; i < 4; i++) - wlr_scene_rect_set_color(c->border[i], color); -} - -static inline void -client_set_fullscreen(Client *c, int fullscreen) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) { - wlr_xwayland_surface_set_fullscreen(c->surface.xwayland, fullscreen); - return; - } -#endif - wlr_xdg_toplevel_set_fullscreen(c->surface.xdg->toplevel, fullscreen); -} - -static inline uint32_t -client_set_size(Client *c, uint32_t width, uint32_t height) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) { - wlr_xwayland_surface_configure(c->surface.xwayland, - c->geom.x + c->bw, c->geom.y + c->bw, width, height); - return 0; - } -#endif - if ((int32_t)width == c->surface.xdg->toplevel->current.width - && (int32_t)height == c->surface.xdg->toplevel->current.height) - return 0; - return wlr_xdg_toplevel_set_size(c->surface.xdg->toplevel, (int32_t)width, (int32_t)height); -} - -static inline void -client_set_tiled(Client *c, uint32_t edges) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return; -#endif - if (wl_resource_get_version(c->surface.xdg->toplevel->resource) - >= XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION) { - wlr_xdg_toplevel_set_tiled(c->surface.xdg->toplevel, edges); - } else { - wlr_xdg_toplevel_set_maximized(c->surface.xdg->toplevel, edges != WLR_EDGE_NONE); - } -} - -static inline void -client_set_suspended(Client *c, int suspended) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return; -#endif - - wlr_xdg_toplevel_set_suspended(c->surface.xdg->toplevel, suspended); -} - -static inline int -client_wants_focus(Client *c) -{ -#ifdef XWAYLAND - return client_is_unmanaged(c) - && wlr_xwayland_or_surface_wants_focus(c->surface.xwayland) - && wlr_xwayland_icccm_input_model(c->surface.xwayland) != WLR_ICCCM_INPUT_MODEL_NONE; -#endif - return 0; -} - -static inline int -client_wants_fullscreen(Client *c) -{ -#ifdef XWAYLAND - if (client_is_x11(c)) - return c->surface.xwayland->fullscreen; -#endif - return c->surface.xdg->toplevel->requested.fullscreen; -} diff --git a/dwl-bak/config.def.h b/dwl-bak/config.def.h deleted file mode 100644 index 5008b91..0000000 --- a/dwl-bak/config.def.h +++ /dev/null @@ -1,212 +0,0 @@ -/* Taken from https://github.com/djpohly/dwl/issues/466 */ -#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \ - ((hex >> 16) & 0xFF) / 255.0f, \ - ((hex >> 8) & 0xFF) / 255.0f, \ - (hex & 0xFF) / 255.0f } -/* appearance */ -static const int sloppyfocus = 1; /* focus follows mouse */ -static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -static int gaps = 1; /* 1 means gaps between windows are added */ -static const unsigned int gappx = 10; /* gap pixel between windows */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = {"monospace:size=10"}; -static const float rootcolor[] = COLOR(0x000000ff); -/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ -static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -static uint32_t colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, - [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, - [SchemeUrg] = { 0, 0, 0x770000ff }, -}; - -/* tagging - TAGCOUNT must be no greater than 31 */ -static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -/* logging */ -static int log_level = WLR_ERROR; - -/* Autostart */ -static const char *const autostart[] = { - "wbg", "/path/to/your/image", NULL, - NULL /* terminate */ -}; - - -/* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ -static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - /* examples: */ - { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -}; - -/* layout(s) */ -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* monitors */ -/* (x=-1, y=-1) is reserved as an "autoconfigure" monitor position indicator - * WARNING: negative values other than (-1, -1) cause problems with Xwayland clients - * https://gitlab.freedesktop.org/xorg/xserver/-/issues/899 -*/ -/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ -static const MonitorRule monrules[] = { - /* name mfact nmaster scale layout rotate/reflect x y */ - /* example of a HiDPI laptop monitor: - { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - */ - /* defaults */ - { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -}; - -/* keyboard */ -static const struct xkb_rule_names xkb_rules = { - /* can specify fields: rules, model, layout, variant, options */ - /* example: - .options = "ctrl:nocaps", - */ - .options = NULL, -}; - -static const int repeat_rate = 25; -static const int repeat_delay = 600; - -/* Trackpad */ -static const int tap_to_click = 1; -static const int tap_and_drag = 1; -static const int drag_lock = 1; -static const int natural_scrolling = 0; -static const int disable_while_typing = 1; -static const int left_handed = 0; -static const int middle_button_emulation = 0; -/* You can choose between: -LIBINPUT_CONFIG_SCROLL_NO_SCROLL -LIBINPUT_CONFIG_SCROLL_2FG -LIBINPUT_CONFIG_SCROLL_EDGE -LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN -*/ -static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG; - -/* You can choose between: -LIBINPUT_CONFIG_CLICK_METHOD_NONE -LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS -LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER -*/ -static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; - -/* You can choose between: -LIBINPUT_CONFIG_SEND_EVENTS_ENABLED -LIBINPUT_CONFIG_SEND_EVENTS_DISABLED -LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE -*/ -static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; - -/* You can choose between: -LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT -LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE -*/ -static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; -static const double accel_speed = 0.0; - -/* You can choose between: -LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle -LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right -*/ -static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; - -/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ -#define MODKEY WLR_MODIFIER_ALT - -#define TAGKEYS(KEY,SKEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static const char *termcmd[] = { "foot", NULL }; -static const char *menucmd[] = { "wmenu-run", NULL }; - -static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_J, movestack, {.i = +1} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, movestack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY, XKB_KEY_g, togglegaps, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 40, 0, 0 }}}, - { MODKEY, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, -40, 0, 0 }}}, - { MODKEY, XKB_KEY_Right, moveresizekb, {.v = (int []){ 40, 0, 0, 0 }}}, - { MODKEY, XKB_KEY_Left, moveresizekb, {.v = (int []){ -40, 0, 0, 0 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 0, 0, 40 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, 0, 0, -40 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, moveresizekb, {.v = (int []){ 0, 0, 40, 0 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, moveresizekb, {.v = (int []){ 0, 0, -40, 0 }}}, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), - TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3), - TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4), - TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5), - TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), - TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), - TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ - { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is - * do not remove them. - */ -#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } - CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -}; - -static const Button buttons[] = { - { ClkLtSymbol, 0, BTN_LEFT, setlayout, {.v = &layouts[0]} }, - { ClkLtSymbol, 0, BTN_RIGHT, setlayout, {.v = &layouts[2]} }, - { ClkTitle, 0, BTN_MIDDLE, zoom, {0} }, - { ClkStatus, 0, BTN_MIDDLE, spawn, {.v = termcmd} }, - { ClkClient, MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { ClkClient, MODKEY, BTN_MIDDLE, togglefloating, {0} }, - { ClkClient, MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - { ClkTagBar, 0, BTN_LEFT, view, {0} }, - { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, - { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, - { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, -}; diff --git a/dwl-bak/config.def.h.orig b/dwl-bak/config.def.h.orig deleted file mode 100644 index 87594bc..0000000 --- a/dwl-bak/config.def.h.orig +++ /dev/null @@ -1,210 +0,0 @@ -/* Taken from https://github.com/djpohly/dwl/issues/466 */ -#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \ - ((hex >> 16) & 0xFF) / 255.0f, \ - ((hex >> 8) & 0xFF) / 255.0f, \ - (hex & 0xFF) / 255.0f } -/* appearance */ -static const int sloppyfocus = 1; /* focus follows mouse */ -static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -static int gaps = 1; /* 1 means gaps between windows are added */ -static const unsigned int gappx = 10; /* gap pixel between windows */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = {"monospace:size=10"}; -static const float rootcolor[] = COLOR(0x000000ff); -/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ -static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -static uint32_t colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, - [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, - [SchemeUrg] = { 0, 0, 0x770000ff }, -}; - -/* tagging - TAGCOUNT must be no greater than 31 */ -static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -/* logging */ -static int log_level = WLR_ERROR; - -/* Autostart */ -static const char *const autostart[] = { - "wbg", "/path/to/your/image", NULL, - NULL /* terminate */ -}; - - -/* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ -static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - /* examples: */ - { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -}; - -/* layout(s) */ -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* monitors */ -/* (x=-1, y=-1) is reserved as an "autoconfigure" monitor position indicator - * WARNING: negative values other than (-1, -1) cause problems with Xwayland clients - * https://gitlab.freedesktop.org/xorg/xserver/-/issues/899 -*/ -/* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ -static const MonitorRule monrules[] = { - /* name mfact nmaster scale layout rotate/reflect x y */ - /* example of a HiDPI laptop monitor: - { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - */ - /* defaults */ - { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -}; - -/* keyboard */ -static const struct xkb_rule_names xkb_rules = { - /* can specify fields: rules, model, layout, variant, options */ - /* example: - .options = "ctrl:nocaps", - */ - .options = NULL, -}; - -static const int repeat_rate = 25; -static const int repeat_delay = 600; - -/* Trackpad */ -static const int tap_to_click = 1; -static const int tap_and_drag = 1; -static const int drag_lock = 1; -static const int natural_scrolling = 0; -static const int disable_while_typing = 1; -static const int left_handed = 0; -static const int middle_button_emulation = 0; -/* You can choose between: -LIBINPUT_CONFIG_SCROLL_NO_SCROLL -LIBINPUT_CONFIG_SCROLL_2FG -LIBINPUT_CONFIG_SCROLL_EDGE -LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN -*/ -static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG; - -/* You can choose between: -LIBINPUT_CONFIG_CLICK_METHOD_NONE -LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS -LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER -*/ -static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; - -/* You can choose between: -LIBINPUT_CONFIG_SEND_EVENTS_ENABLED -LIBINPUT_CONFIG_SEND_EVENTS_DISABLED -LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE -*/ -static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; - -/* You can choose between: -LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT -LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE -*/ -static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; -static const double accel_speed = 0.0; - -/* You can choose between: -LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle -LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right -*/ -static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; - -/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ -#define MODKEY WLR_MODIFIER_ALT - -#define TAGKEYS(KEY,SKEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static const char *termcmd[] = { "foot", NULL }; -static const char *menucmd[] = { "wmenu-run", NULL }; - -static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY, XKB_KEY_g, togglegaps, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 40, 0, 0 }}}, - { MODKEY, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, -40, 0, 0 }}}, - { MODKEY, XKB_KEY_Right, moveresizekb, {.v = (int []){ 40, 0, 0, 0 }}}, - { MODKEY, XKB_KEY_Left, moveresizekb, {.v = (int []){ -40, 0, 0, 0 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 0, 0, 40 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, 0, 0, -40 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, moveresizekb, {.v = (int []){ 0, 0, 40, 0 }}}, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, moveresizekb, {.v = (int []){ 0, 0, -40, 0 }}}, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), - TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3), - TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4), - TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5), - TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), - TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), - TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ - { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is - * do not remove them. - */ -#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } - CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -}; - -static const Button buttons[] = { - { ClkLtSymbol, 0, BTN_LEFT, setlayout, {.v = &layouts[0]} }, - { ClkLtSymbol, 0, BTN_RIGHT, setlayout, {.v = &layouts[2]} }, - { ClkTitle, 0, BTN_MIDDLE, zoom, {0} }, - { ClkStatus, 0, BTN_MIDDLE, spawn, {.v = termcmd} }, - { ClkClient, MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { ClkClient, MODKEY, BTN_MIDDLE, togglefloating, {0} }, - { ClkClient, MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - { ClkTagBar, 0, BTN_LEFT, view, {0} }, - { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, - { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, - { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, -}; diff --git a/dwl-bak/config.mk b/dwl-bak/config.mk deleted file mode 100644 index 169bb16..0000000 --- a/dwl-bak/config.mk +++ /dev/null @@ -1,17 +0,0 @@ -_VERSION = 0.7 -VERSION = `git describe --tags --dirty 2>/dev/null || echo $(_VERSION)` - -PKG_CONFIG = pkg-config - -# paths -PREFIX = /usr/local -MANDIR = $(PREFIX)/share/man -DATADIR = $(PREFIX)/share - -#XWAYLAND = -#XLIBS = -# Uncomment to build XWayland support -XWAYLAND = -DXWAYLAND -XLIBS = xcb xcb-icccm - -CC = /usr/lib/llvm/20/bin/clang diff --git a/dwl-bak/drwl.h b/dwl-bak/drwl.h deleted file mode 100644 index b06a736..0000000 --- a/dwl-bak/drwl.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - * drwl - https://codeberg.org/sewn/drwl - * - * Copyright (c) 2023-2024 sewn - * Copyright (c) 2024 notchoc - * - * 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. - * - * The UTF-8 Decoder included is from Bjoern Hoehrmann: - * Copyright (c) 2008-2010 Bjoern Hoehrmann - * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. - */ -#pragma once - -#include -#include -#include - -enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ - -typedef struct fcft_font Fnt; -typedef pixman_image_t Img; - -typedef struct { - Img *image; - Fnt *font; - uint32_t *scheme; -} Drwl; - -#define UTF8_ACCEPT 0 -#define UTF8_REJECT 12 -#define UTF8_INVALID 0xFFFD - -static const uint8_t utf8d[] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, - - 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, - 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, - 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, - 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, - 12,36,12,12,12,12,12,12,12,12,12,12, -}; - -static inline uint32_t -utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -{ - uint32_t type = utf8d[byte]; - - *codep = (*state != UTF8_ACCEPT) ? - (byte & 0x3fu) | (*codep << 6) : - (0xff >> type) & (byte); - - *state = utf8d[256 + *state + type]; - return *state; -} - -static int -drwl_init(void) -{ - fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); - return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -} - -static Drwl * -drwl_create(void) -{ - Drwl *drwl; - - if (!(drwl = calloc(1, sizeof(Drwl)))) - return NULL; - - return drwl; -} - -static void -drwl_setfont(Drwl *drwl, Fnt *font) -{ - if (drwl) - drwl->font = font; -} - -static void -drwl_setimage(Drwl *drwl, Img *image) -{ - if (drwl) - drwl->image = image; -} - -static Fnt * -drwl_font_create(Drwl *drwl, size_t count, - const char *names[static count], const char *attributes) -{ - Fnt *font = fcft_from_name(count, names, attributes); - if (drwl) - drwl_setfont(drwl, font); - return font; -} - -static void -drwl_font_destroy(Fnt *font) -{ - fcft_destroy(font); -} - -static inline pixman_color_t -convert_color(uint32_t clr) -{ - return (pixman_color_t){ - ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, - ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, - ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, - (clr & 0xFF) * 0x101 - }; -} - -static void -drwl_setscheme(Drwl *drwl, uint32_t *scm) -{ - if (drwl) - drwl->scheme = scm; -} - -static Img * -drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -{ - Img *image; - pixman_region32_t clip; - - image = pixman_image_create_bits_no_clear( - PIXMAN_a8r8g8b8, w, h, bits, w * 4); - if (!image) - return NULL; - pixman_region32_init_rect(&clip, 0, 0, w, h); - pixman_image_set_clip_region32(image, &clip); - pixman_region32_fini(&clip); - - if (drwl) - drwl_setimage(drwl, image); - return image; -} - -static void -drwl_rect(Drwl *drwl, - int x, int y, unsigned int w, unsigned int h, - int filled, int invert) -{ - pixman_color_t clr; - if (!drwl || !drwl->scheme || !drwl->image) - return; - - clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); - if (filled) - pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, - &(pixman_rectangle16_t){x, y, w, h}); - else - pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, - (pixman_rectangle16_t[4]){ - { x, y, w, 1 }, - { x, y + h - 1, w, 1 }, - { x, y, 1, h }, - { x + w - 1, y, 1, h }}); -} - -static int -drwl_text(Drwl *drwl, - int x, int y, unsigned int w, unsigned int h, - unsigned int lpad, const char *text, int invert) -{ - int ty; - int render = x || y || w || h; - long x_kern; - uint32_t cp = 0, last_cp = 0, state; - pixman_color_t clr; - pixman_image_t *fg_pix = NULL; - int noellipsis = 0; - const struct fcft_glyph *glyph, *eg = NULL; - int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; - - if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); - fg_pix = pixman_image_create_solid_fill(&clr); - - drwl_rect(drwl, x, y, w, h, 1, !invert); - - x += lpad; - w -= lpad; - } - - if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) - fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; - - if (render) - eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); - - for (const char *p = text, *pp; pp = p, *p; p++) { - for (state = UTF8_ACCEPT; *p && - utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) - ; - if (!*p || state == UTF8_REJECT) { - cp = UTF8_INVALID; - if (p > pp) - p--; - } - - glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); - if (!glyph) - continue; - - x_kern = 0; - if (last_cp) - fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); - last_cp = cp; - - ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; - - if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && - *(p + 1) != '\0') { - /* cannot fit ellipsis after current codepoint */ - if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { - noellipsis = 1; - } else { - w -= eg->advance.x; - pixman_image_composite32( - PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, - x + eg->x, ty - eg->y, eg->width, eg->height); - } - } - - if ((x_kern + glyph->advance.x) > w) - break; - - x += x_kern; - - if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) - /* pre-rendered glyphs (eg. emoji) */ - pixman_image_composite32( - PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, - x + glyph->x, ty - glyph->y, glyph->width, glyph->height); - else if (render) - pixman_image_composite32( - PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, - x + glyph->x, ty - glyph->y, glyph->width, glyph->height); - - x += glyph->advance.x; - w -= glyph->advance.x; - } - - if (render) - pixman_image_unref(fg_pix); - - return x + (render ? w : 0); -} - -static unsigned int -drwl_font_getwidth(Drwl *drwl, const char *text) -{ - if (!drwl || !drwl->font || !text) - return 0; - return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -} - -static void -drwl_image_destroy(Img *image) -{ - pixman_image_unref(image); -} - -static void -drwl_destroy(Drwl *drwl) -{ - if (drwl->font) - drwl_font_destroy(drwl->font); - if (drwl->image) - drwl_image_destroy(drwl->image); - free(drwl); -} - -static void -drwl_fini(void) -{ - fcft_fini(); -} diff --git a/dwl-bak/dwl-patches/LICENSE b/dwl-bak/dwl-patches/LICENSE deleted file mode 100644 index 658085a..0000000 --- a/dwl-bak/dwl-patches/LICENSE +++ /dev/null @@ -1,692 +0,0 @@ -dwl - dwm for Wayland - -Copyright © 2020 dwl team - -See also the files LICENSE.tinywl, LICENSE.dwm and LICENSE.sway. - -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 3 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. - ----- - - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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. But first, please read -. diff --git a/dwl-bak/dwl-patches/LICENSE.dwm b/dwl-bak/dwl-patches/LICENSE.dwm deleted file mode 100644 index 507e4dc..0000000 --- a/dwl-bak/dwl-patches/LICENSE.dwm +++ /dev/null @@ -1,39 +0,0 @@ -Portions of dwl based on dwm code are used under the following license: - -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2009 Jukka Salmi -© 2006-2007 Sander van Dijk -© 2007-2011 Peter Hartlich -© 2007-2009 Szabolcs Nagy -© 2007-2009 Christof Musik -© 2007-2009 Premysl Hruby -© 2007-2008 Enno Gottox Boland -© 2008 Martin Hurton -© 2008 Neale Pickett -© 2009 Mate Nagy -© 2010-2016 Hiltjo Posthuma -© 2010-2012 Connor Lane Smith -© 2011 Christoph Lohmann <20h@r-36.net> -© 2015-2016 Quentin Rameau -© 2015-2016 Eric Pruitt -© 2016-2017 Markus Teich - -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/dwl-bak/dwl-patches/LICENSE.sway b/dwl-bak/dwl-patches/LICENSE.sway deleted file mode 100644 index 3e0cacc..0000000 --- a/dwl-bak/dwl-patches/LICENSE.sway +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2016-2017 Drew DeVault - -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/dwl-bak/dwl-patches/LICENSE.tinywl b/dwl-bak/dwl-patches/LICENSE.tinywl deleted file mode 100644 index 7023690..0000000 --- a/dwl-bak/dwl-patches/LICENSE.tinywl +++ /dev/null @@ -1,127 +0,0 @@ -dwl is originally based on TinyWL, which is used under the following license: - -This work is licensed under CC0, which effectively puts it in the public domain. - ---- - -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/dwl-bak/dwl-patches/README.md b/dwl-bak/dwl-patches/README.md deleted file mode 100644 index bdfa62a..0000000 --- a/dwl-bak/dwl-patches/README.md +++ /dev/null @@ -1,87 +0,0 @@ -# dwl-patches -* A general [dwl wiki](https://codeberg.org/dwl/dwl/wiki) is available at the main [dwl] repository. -* This repository is exclusively for dwl PATCHES. - -*Note: All patches are user-submitted content. The authors of dwl do not continually monitor them. You are responsible for downloading and reviewing a patch before using it!* - -## Reporting Issues -- Issues with existing patches can be generated here in the dwl-patches [issues]. Please be sure to "@" reference the patch author in your issue. - -## Contributing Patches to `dwl-patches` -Since dwl follows [suckless](https://suckless.org/) philosophy, it doesn't provide every feature under the sun. To broaden dwl's functionality, one needs to get familiar with the concept of patching. To get your feet wet, consult [the hacking page](https://suckless.org/hacking/) of the suckless website. - -Patches should normally target the latest dwl [release]. -If you target an older release, specify that in the `Download` link on your `README.md` page. -If you target the unstable `main` branch, specify that in the `Download` link on your `README.md` page. - -0. Starting from a local clone of [dwl] (not dwl-patches) -1. If you do not have it already, add the remote for the main dwl repository in your local copy and fetch it: - `git remote add --fetch upstream https://codeberg.org/dwl/dwl` -2. Use git to create a branch for your new patch and hack away creating your patched version of [dwl]. -3. In your local clone of dwl, create a .patch file - `git format-patch upstream/main... --stdout > PATCHNAME.patch` -4. Now fork [dwl-patches] (not dwl) in Codeberg and clone it locally -5. Configure your `dwl-patches` local clone - `git config --local pull.rebase true` -6. In your local `dwl-patches` clone, add a directory called `patches/PATCHNAME`. Place the `PATCHNAME.patch` you created in step (2) into the `patches/PATCHNAME` directory. -7. Add a `README.md` page to the `PATCHNAME` directory using this template (add/remove sections as you like): - ```markdown - ### Description - Insert a short summary of changes that your patch implements. - - ### Download - - [git branch](/USERNAME/dwl/src/branch/PATCHNAME) - ^^^^^^^^^^ OPTIONAL: Patchers are no longer obligated to maintain public `dwl` branches devoted to their patches - - [0.7](/dwl/dwl-patches/raw/branch/main/patches/PATCHNAME/PATCHNAME.patch) - Use the ^RAW^ patch link here - ^^^ "0.7" is an example. Use the release that your patch targets - - [main YYYY-MM-DD](/dwl/dwl-patches/raw/branch/main/patches/PATCHNAME/PATCHNAME.patch) - ^^^^^^^^^^ Patches targeting the unstable "main" branch include a YYYY-MM-DD indicator - ### Authors - latest at top [Codeberg nick is mandatory; other contact methods optional] - - [YOUR_NICK](https://codeberg.org/USERNAME) - your_email@if_you_wish_to.share.it - your_irc_nick at [Libera IRC dwl channel](https://web.libera.chat/?channels=#dwl) - your_discord_handle at [dwl Discord](https://discord.gg/jJxZnrGPWN) - ``` - You may choose to include screenshots (hosted in your patch's subdirectory) in your `README.md`. The process is described [here](https://docs.codeberg.org/markdown/using-images/). - -8. Use the Codeberg web interface to send a pull request to [dwl-patches] (NOT to [dwl]) -9. WHEN YOUR PULL REQUEST IS APPROVED, your Codeberg account will also be granted commit access to [dwl-patches]. Once you have write access, you can make direct modifications/upates to your patches and you are free to create new patches rather than creating pull requests. - -Individuals who have made known that they no longer intend to maintain their patches will have commit access to the [dwl-pathces] repository removed. - -A returning user who formerly had commit access is welcome to open an issue on [dwl-patches] requesting commit access be reinstated. When doing so, please link to the original issue opened that granted commit access. - -## Updating/Modifying/Adopting Existing Patches -- If the existing patch is already being maintained by another author, do not make modifications to it. -- Create an issue at [issues] @mentioning the current maintainer. -- If you receive no reply for seven days, you may assume the patch abandoned and you may adopt the patch. -- Modify the `README.md` with new links for your raw patch and for your git branch. - - **LEAVE PREVIOUS AUTHOR(S)' NICKS/LINKS INTACT UNDER THE "Authors" HEADING!** - - Add your own nick/link to the top of the "Authors" list. - -## Deprecating Existing Patches -- Patches will not be removed from this archive but may instead be deprecated if the author(s)/maintainer(s) of a patch so desire. -- Please do not open issues or contact maintainers to request deprecation of a patch. -- Deprecation of a patch will only occur if *all* authors or current maintainers of the patch agree to the decision to deprecate. -- In such a circumstance the author(s)/maintainer(s): - - Will create a commit moving the patch to the `stale-patches` directory - - May explain in the associated `README.md` any relevant details of the decision to deprecate the patch. -- This process allows current or future users of the patch the option to adopt, modify, or integrate stale/historical code or portions thereof. - -## stale-patches -Deprecated or unmaintained patches are held in the [stale-patches] directory. -Currently, this directory also contains `.md` description files from ancient patches predating the move to Codeberg. - -If you have the inclination to revive one of these, please follow the same procedures outlined below for contributing new patches. - -In your initial pull request (or in the commit that revives the stale patch if you already have write access), remove the corresponding `.md` file or the patch directory from [stale-patches]. - -[stale-patches]: https://codeberg.org/dwl/dwl-patches/src/branch/main/stale-patches -[dwl]: https://codeberg.org/dwl/dwl -[dwl-patches]: https://codeberg.org/dwl/dwl-patches -[issues]: https://codeberg.org/dwl/dwl-patches/issues -[release]: https://codeberg.org/dwl/dwl/releases -[Codeberg]: https://codeberg.org - -## diff --git a/dwl-bak/dwl-patches/patches/accessnthmon/README.md b/dwl-bak/dwl-patches/patches/accessnthmon/README.md deleted file mode 100644 index b7cd6a9..0000000 --- a/dwl-bak/dwl-patches/patches/accessnthmon/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Port of dwm's accessnthmon. Adds functions to tag and focus monitor by index. - -### Download -- [git branch](https://codeberg.org/Rutherther/dwl/src/branch/patch/accessnthmonitor) -- [2024-05-10](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/accessnthmon/accessnthmon.patch) -### Authors -- [Rutherther](https://codeberg.org/Rutherther) -- [Palanix](https://codeberg.org/Palanix) diff --git a/dwl-bak/dwl-patches/patches/accessnthmon/accessnthmon.patch b/dwl-bak/dwl-patches/patches/accessnthmon/accessnthmon.patch deleted file mode 100644 index f69f57d..0000000 --- a/dwl-bak/dwl-patches/patches/accessnthmon/accessnthmon.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 5f531bfb1387ded7b8817faf7df760d3b998742b Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Sat, 27 Apr 2024 21:25:16 +0200 -Subject: [PATCH] feat: access nth monitor - ---- - config.def.h | 4 +++- - dwl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 49 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 8847e58..4709c5d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -108,7 +108,9 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } -+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }, \ -+ { WLR_MODIFIER_ALT, KEY, focusnthmon, {.ui = TAG} }, \ -+ { WLR_MODIFIER_ALT|WLR_MODIFIER_SHIFT, SKEY, tagnthmon, {.ui = TAG} } - - /* helper for spawning shell commands in the pre dwm-5.0 fashion */ - #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } -diff --git a/dwl.c b/dwl.c -index bf763df..1d42caf 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -278,8 +279,10 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static Monitor *numtomon(int num); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); -+static void focusnthmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); -@@ -329,6 +332,7 @@ static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -+static void tagnthmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -@@ -1233,6 +1237,25 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+Monitor * -+numtomon(int num) -+{ -+ Monitor *m = NULL; -+ int found = 0; -+ int i = 0; -+ -+ wl_list_for_each(m, &mons, link) { -+ if (!m->wlr_output->enabled) -+ i--; -+ else if (i == num) { -+ found = true; -+ break; -+ } -+ i++; -+ } -+ return found ? m : NULL; -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1320,6 +1343,16 @@ focusmon(const Arg *arg) - focusclient(focustop(selmon), 1); - } - -+void -+focusnthmon(const Arg *arg) -+{ -+ Monitor *m = numtomon(arg->i); -+ if (!m || m == selmon) -+ return; -+ selmon = m; -+ focusclient(focustop(selmon), 1); -+} -+ - void - focusstack(const Arg *arg) - { -@@ -2569,6 +2602,19 @@ tagmon(const Arg *arg) - setmon(sel, dirtomon(arg->i), 0); - } - -+void -+tagnthmon(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ Monitor *m = numtomon(arg->i); -+ if (!m || !sel) -+ return; -+ setmon(sel, m, 0); -+ -+ arrange(selmon); -+ arrange(m); -+} -+ - void - tile(Monitor *m) - { --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/alwayscenter/README.md b/dwl-bak/dwl-patches/patches/alwayscenter/README.md deleted file mode 100644 index 63d6f86..0000000 --- a/dwl-bak/dwl-patches/patches/alwayscenter/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Automatically center floating windows. - -### Download -- [git branch](https://codeberg.org/guidocella/dwl/src/branch/alwayscenter) -- [2024-06-05](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/alwayscenter/alwayscenter.patch) - -### Authors -- [Guido Cella](https://codeberg.org/guidocella) diff --git a/dwl-bak/dwl-patches/patches/alwayscenter/alwayscenter.patch b/dwl-bak/dwl-patches/patches/alwayscenter/alwayscenter.patch deleted file mode 100644 index 59a83dc..0000000 --- a/dwl-bak/dwl-patches/patches/alwayscenter/alwayscenter.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f43a49324c2ddd21100d6308d1adde9d894746e2 Mon Sep 17 00:00:00 2001 -From: Guido Cella -Date: Wed, 5 Jun 2024 12:05:16 +0200 -Subject: [PATCH] center floating windows - ---- - dwl.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/dwl.c b/dwl.c -index 12f441e..c377c67 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -499,6 +499,11 @@ applyrules(Client *c) - } - } - -+ if (mon) { -+ c->geom.x = (mon->w.width - c->geom.width) / 2 + mon->m.x; -+ c->geom.y = (mon->w.height - c->geom.height) / 2 + mon->m.y; -+ } -+ - c->isfloating |= client_is_float_type(c); - setmon(c, mon, newtags); - } -@@ -1787,6 +1792,10 @@ mapnotify(struct wl_listener *listener, void *data) - * If there is no parent, apply rules */ - if ((p = client_get_parent(c))) { - c->isfloating = 1; -+ if (p->mon) { -+ c->geom.x = (p->mon->w.width - c->geom.width) / 2 + p->mon->m.x; -+ c->geom.y = (p->mon->w.height - c->geom.height) / 2 + p->mon->m.y; -+ } - setmon(c, p->mon, p->tags); - } else { - applyrules(c); --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/attachbottom/README.md b/dwl-bak/dwl-patches/patches/attachbottom/README.md deleted file mode 100644 index 80e12a0..0000000 --- a/dwl-bak/dwl-patches/patches/attachbottom/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Newly created windows are placed at the bottom of the client tile stack. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/attachbottom) -- [2024-05-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/attachbottom/attachbottom.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) -- [Aurel Weinhold](https://github.com/AurelWeinhold) diff --git a/dwl-bak/dwl-patches/patches/attachbottom/attachbottom.patch b/dwl-bak/dwl-patches/patches/attachbottom/attachbottom.patch deleted file mode 100644 index 470a79b..0000000 --- a/dwl-bak/dwl-patches/patches/attachbottom/attachbottom.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0dda3ed8634154fd3887b71133b451d66a11b61d Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Thu, 4 Jan 2024 23:31:41 +1000 -Subject: [PATCH] attachbottom - ---- - dwl.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index bf763dfc..12e08e2b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1605,7 +1605,11 @@ mapnotify(struct wl_listener *listener, void *data) - c->geom.height += 2 * c->bw; - - /* Insert this client into client lists. */ -- wl_list_insert(&clients, &c->link); -+ if (clients.prev) -+ // tile at the bottom -+ wl_list_insert(clients.prev, &c->link); -+ else -+ wl_list_insert(&clients, &c->link); - wl_list_insert(&fstack, &c->flink); - - /* Set initial monitor, tags, floating status, and focus: --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/attachfocused/README.md b/dwl-bak/dwl-patches/patches/attachfocused/README.md deleted file mode 100644 index a4f6049..0000000 --- a/dwl-bak/dwl-patches/patches/attachfocused/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Makes windows attach below the currently active window. - -KNOWN ISSUES: Upon closing the last client when using multiple monitors, the last client will briefly flash on all -monitors before closing. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/attachfocused/attachfocused.patch) - -### Authors -- [MayOrMayNotBeACat](https://codeberg.org/MayOrMayNotBeACat) diff --git a/dwl-bak/dwl-patches/patches/attachfocused/attachfocused.patch b/dwl-bak/dwl-patches/patches/attachfocused/attachfocused.patch deleted file mode 100644 index 2b8cd38..0000000 --- a/dwl-bak/dwl-patches/patches/attachfocused/attachfocused.patch +++ /dev/null @@ -1,29 +0,0 @@ -From d03851c14073874f5b3d19a095e184dc24d219cd Mon Sep 17 00:00:00 2001 -From: MayOrMayNotBeACat -Date: Sun, 11 May 2025 20:24:51 -0400 -Subject: [PATCH] Make new windows attach to active client - ---- - dwl.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index cf3ef70..1907c5f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1726,7 +1726,11 @@ mapnotify(struct wl_listener *listener, void *data) - c->geom.height += 2 * c->bw; - - /* Insert this client into client lists. */ -- wl_list_insert(&clients, &c->link); -+ Client* focused = focustop(selmon); -+ if (focused) -+ wl_list_insert(&focused->link, &c->link); -+ else -+ wl_list_insert(&clients, &c->link); - wl_list_insert(&fstack, &c->flink); - - /* Set initial monitor, tags, floating status, and focus: --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/attachtop/README.md b/dwl-bak/dwl-patches/patches/attachtop/README.md deleted file mode 100644 index 0241b7d..0000000 --- a/dwl-bak/dwl-patches/patches/attachtop/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -This is a port of attachtop patch for dwm: https://dwm.suckless.org/patches/attachtop - -New client attaches below the last master/on top of the stack. - -Behavior feels very intuitive as it doesn't disrupt existing masters no matter the amount of them, it only pushes the clients in stack down. - -### Download -- [git branch](https://codeberg.org/nikitaivanov/dwl/src/branch/attachtop) -- [2025-06-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/attachtop/attachtop.patch) - -### Authors -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) diff --git a/dwl-bak/dwl-patches/patches/attachtop/attachtop.patch b/dwl-bak/dwl-patches/patches/attachtop/attachtop.patch deleted file mode 100644 index d447246..0000000 --- a/dwl-bak/dwl-patches/patches/attachtop/attachtop.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 29e6a4bef02c473cc5bd04804fe508bda265077d Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Sun, 7 Apr 2024 21:10:17 +0200 -Subject: [PATCH] New client are attached on top of the stack - ---- - dwl.c | 13 ++++++++++++- - 1 file changed, 12 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index bf763df..02e3d07 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1605,7 +1605,18 @@ mapnotify(struct wl_listener *listener, void *data) - c->geom.height += 2 * c->bw; - - /* Insert this client into client lists. */ -- wl_list_insert(&clients, &c->link); -+ i = 0; -+ wl_list_for_each(w, &clients, link) { -+ if (!VISIBLEON(w, selmon) || w->isfloating) -+ continue; -+ p = w; -+ if (++i >= selmon->nmaster) -+ break; -+ } -+ if (i > 0) -+ wl_list_insert(&p->link, &c->link); -+ else -+ wl_list_insert(&clients, &c->link); - wl_list_insert(&fstack, &c->flink); - - /* Set initial monitor, tags, floating status, and focus: --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/autostart/README.md b/dwl-bak/dwl-patches/patches/autostart/README.md deleted file mode 100644 index 1fd26d3..0000000 --- a/dwl-bak/dwl-patches/patches/autostart/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Description -Allow dwl to execute commands from autostart array in your config.h file. And when you exit dwl all processes from autostart array will be killed. - -Note: Commands from array are executed using execvp(). So if you need to execute shell command you need to prefix it with "sh", "-c" (change sh to any shell you like). - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/autostart) -- [2025-01-20](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/autostart/autostart.patch) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/autostart/autostart-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) -- [Rayan Nakib](https://nakibrayan2.pages.dev/) -- [NFVblog](https://github.com/nf02) diff --git a/dwl-bak/dwl-patches/patches/autostart/autostart-0.7.patch b/dwl-bak/dwl-patches/patches/autostart/autostart-0.7.patch deleted file mode 100644 index 12e6d7e..0000000 --- a/dwl-bak/dwl-patches/patches/autostart/autostart-0.7.patch +++ /dev/null @@ -1,154 +0,0 @@ -From 787f7252d63945996f009828aff3c44afd0f7781 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sat, 8 Jul 2023 17:11:36 -0600 -Subject: [PATCH] port autostart patch from dwm -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -https://dwm.suckless.org/patches/cool_autostart/ -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 7 +++++++ - dwl.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++----- - 2 files changed, 61 insertions(+), 5 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..8dc6502 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,13 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+/* Autostart */ -+static const char *const autostart[] = { -+ "wbg", "/path/to/your/image", NULL, -+ NULL /* terminate */ -+}; -+ -+ - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ -diff --git a/dwl.c b/dwl.c -index 5bf995e..e8b8727 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -249,6 +249,7 @@ static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -+static void autostartexec(void); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); -@@ -432,6 +433,9 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+static pid_t *autostart_pids; -+static size_t autostart_len; -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -580,6 +584,27 @@ arrangelayers(Monitor *m) - } - } - -+void -+autostartexec(void) { -+ const char *const *p; -+ size_t i = 0; -+ -+ /* count entries */ -+ for (p = autostart; *p; autostart_len++, p++) -+ while (*++p); -+ -+ autostart_pids = calloc(autostart_len, sizeof(pid_t)); -+ for (p = autostart; *p; i++, p++) { -+ if ((autostart_pids[i] = fork()) == 0) { -+ setsid(); -+ execvp(*p, (char *const *)p); -+ die("dwl: execvp %s:", *p); -+ } -+ /* skip arguments */ -+ while (*++p); -+ } -+} -+ - void - axisnotify(struct wl_listener *listener, void *data) - { -@@ -676,11 +701,21 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ size_t i; - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; - #endif - wl_display_destroy_clients(dpy); -+ -+ /* kill child processes */ -+ for (i = 0; i < autostart_len; i++) { -+ if (0 < autostart_pids[i]) { -+ kill(autostart_pids[i], SIGTERM); -+ waitpid(autostart_pids[i], NULL, 0); -+ } -+ } -+ - if (child_pid > 0) { - kill(-child_pid, SIGTERM); - waitpid(child_pid, NULL, 0); -@@ -1497,18 +1532,31 @@ void - handlesig(int signo) - { - if (signo == SIGCHLD) { --#ifdef XWAYLAND - siginfo_t in; - /* wlroots expects to reap the XWayland process itself, so we - * use WNOWAIT to keep the child waitable until we know it's not - * XWayland. - */ - while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid -- && (!xwayland || in.si_pid != xwayland->server->pid)) -- waitpid(in.si_pid, NULL, 0); --#else -- while (waitpid(-1, NULL, WNOHANG) > 0); -+#ifdef XWAYLAND -+ && (!xwayland || in.si_pid != xwayland->server->pid) - #endif -+ ) { -+ pid_t *p, *lim; -+ waitpid(in.si_pid, NULL, 0); -+ if (in.si_pid == child_pid) -+ child_pid = -1; -+ if (!(p = autostart_pids)) -+ continue; -+ lim = &p[autostart_len]; -+ -+ for (; p < lim; p++) { -+ if (*p == in.si_pid) { -+ *p = -1; -+ break; -+ } -+ } -+ } - } else if (signo == SIGINT || signo == SIGTERM) { - quit(NULL); - } -@@ -2224,6 +2272,7 @@ run(char *startup_cmd) - die("startup: backend_start"); - - /* Now that the socket exists and the backend is started, run the startup command */ -+ autostartexec(); - if (startup_cmd) { - int piperw[2]; - if (pipe(piperw) < 0) --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/autostart/autostart.patch b/dwl-bak/dwl-patches/patches/autostart/autostart.patch deleted file mode 100644 index 71d8718..0000000 --- a/dwl-bak/dwl-patches/patches/autostart/autostart.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 3b0b0249d900121a90528616f4d11f733c7a5ca2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sat, 8 Jul 2023 17:11:36 -0600 -Subject: [PATCH] port autostart patch from dwm -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -https://dwm.suckless.org/patches/cool_autostart/ -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 7 +++++++ - dwl.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++--- - 2 files changed, 62 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..8dc6502c 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,13 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+/* Autostart */ -+static const char *const autostart[] = { -+ "wbg", "/path/to/your/image", NULL, -+ NULL /* terminate */ -+}; -+ -+ - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ -diff --git a/dwl.c b/dwl.c -index ad21e1ba..3118e07f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -246,6 +246,7 @@ static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -+static void autostartexec(void); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); -@@ -455,6 +456,9 @@ static struct wlr_xwayland *xwayland; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+static pid_t *autostart_pids; -+static size_t autostart_len; -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -599,6 +603,27 @@ arrangelayers(Monitor *m) - } - } - -+void -+autostartexec(void) { -+ const char *const *p; -+ size_t i = 0; -+ -+ /* count entries */ -+ for (p = autostart; *p; autostart_len++, p++) -+ while (*++p); -+ -+ autostart_pids = calloc(autostart_len, sizeof(pid_t)); -+ for (p = autostart; *p; i++, p++) { -+ if ((autostart_pids[i] = fork()) == 0) { -+ setsid(); -+ execvp(*p, (char *const *)p); -+ die("dwl: execvp %s:", *p); -+ } -+ /* skip arguments */ -+ while (*++p); -+ } -+} -+ - void - axisnotify(struct wl_listener *listener, void *data) - { -@@ -695,12 +720,23 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ size_t i; -+ - cleanuplisteners(); - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; - #endif - wl_display_destroy_clients(dpy); -+ -+ /* kill child processes */ -+ for (i = 0; i < autostart_len; i++) { -+ if (0 < autostart_pids[i]) { -+ kill(autostart_pids[i], SIGTERM); -+ waitpid(autostart_pids[i], NULL, 0); -+ } -+ } -+ - if (child_pid > 0) { - kill(-child_pid, SIGTERM); - waitpid(child_pid, NULL, 0); -@@ -1551,10 +1587,25 @@ gpureset(struct wl_listener *listener, void *data) - void - handlesig(int signo) - { -- if (signo == SIGCHLD) -- while (waitpid(-1, NULL, WNOHANG) > 0); -- else if (signo == SIGINT || signo == SIGTERM) -+ if (signo == SIGCHLD) { -+ pid_t pid, *p, *lim; -+ while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { -+ if (pid == child_pid) -+ child_pid = -1; -+ if (!(p = autostart_pids)) -+ continue; -+ lim = &p[autostart_len]; -+ -+ for (; p < lim; p++) { -+ if (*p == pid) { -+ *p = -1; -+ break; -+ } -+ } -+ } -+ } else if (signo == SIGINT || signo == SIGTERM) { - quit(NULL); -+ } - } - - void -@@ -2241,6 +2292,7 @@ run(char *startup_cmd) - die("startup: backend_start"); - - /* Now that the socket exists and the backend is started, run the startup command */ -+ autostartexec(); - if (startup_cmd) { - int piperw[2]; - if (pipe(piperw) < 0) --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/bar-systray/README.md b/dwl-bak/dwl-patches/patches/bar-systray/README.md deleted file mode 100644 index b504173..0000000 --- a/dwl-bak/dwl-patches/patches/bar-systray/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Add a system tray to the [bar](/dwl/dwl-patches/src/branch/main/patches/bar). - -To keep dependencies to minimum, icon(svg) loading from the filesystem is not -supported. Applications that expect this will show the initial letter of the -program name, instead of a real icon. - -Menus for the icons are handled by a dmenu-like program of the user's choice. - -### Dependencies -- [bar.patch](/dwl/dwl-patches/src/branch/main/patches/bar) -- [libdbus](https://gitlab.freedesktop.org/dbus/dbus) - -### Download -- [git branch](/janetski/dwl/src/branch/0.7-bar-systray) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/bar-systray/bar-systray-0.7.patch) - -### Authors -- [janetski](https://codeberg.org/janetski) ([.vetu](https://discordapp.com/users/355488216469471242) on discord) diff --git a/dwl-bak/dwl-patches/patches/bar-systray/bar-systray-0.7.patch b/dwl-bak/dwl-patches/patches/bar-systray/bar-systray-0.7.patch deleted file mode 100644 index 1dda4c6..0000000 --- a/dwl-bak/dwl-patches/patches/bar-systray/bar-systray-0.7.patch +++ /dev/null @@ -1,3023 +0,0 @@ -From cf228147250f4616d150fbe5276088c5f9969bba Mon Sep 17 00:00:00 2001 -From: vetu104 -Date: Sat, 29 Mar 2025 19:22:37 +0200 -Subject: [PATCH] Add a system tray next to sewn's bar - ---- - Makefile | 23 +- - config.def.h | 5 + - dbus.c | 242 +++++++++++++++ - dbus.h | 10 + - dwl.c | 107 ++++++- - systray/helpers.c | 43 +++ - systray/helpers.h | 12 + - systray/icon.c | 149 +++++++++ - systray/icon.h | 26 ++ - systray/item.c | 403 ++++++++++++++++++++++++ - systray/item.h | 46 +++ - systray/menu.c | 757 ++++++++++++++++++++++++++++++++++++++++++++++ - systray/menu.h | 11 + - systray/tray.c | 237 +++++++++++++++ - systray/tray.h | 37 +++ - systray/watcher.c | 551 +++++++++++++++++++++++++++++++++ - systray/watcher.h | 35 +++ - 17 files changed, 2681 insertions(+), 13 deletions(-) - create mode 100644 dbus.c - create mode 100644 dbus.h - create mode 100644 systray/helpers.c - create mode 100644 systray/helpers.h - create mode 100644 systray/icon.c - create mode 100644 systray/icon.h - create mode 100644 systray/item.c - create mode 100644 systray/item.h - create mode 100644 systray/menu.c - create mode 100644 systray/menu.h - create mode 100644 systray/tray.c - create mode 100644 systray/tray.h - create mode 100644 systray/watcher.c - create mode 100644 systray/watcher.h - -diff --git a/Makefile b/Makefile -index 9bc67db..9d50189 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,17 +12,28 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wlroots-0.18 wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) -+PKGS = wlroots-0.18 wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) dbus-1 - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -+TRAYOBJS = systray/watcher.o systray/tray.o systray/item.o systray/icon.o systray/menu.o systray/helpers.o -+TRAYDEPS = systray/watcher.h systray/tray.h systray/item.h systray/icon.h systray/menu.h systray/helpers.h -+ - all: dwl --dwl: dwl.o util.o -- $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ --dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ -+dwl: dwl.o util.o dbus.o $(TRAYOBJS) $(TRAYDEPS) -+ $(CC) dwl.o util.o dbus.o $(TRAYOBJS) $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ -+dwl.o: dwl.c client.h dbus.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h \ -+ $(TRAYDEPS) - util.o: util.c util.h -+dbus.o: dbus.c dbus.h -+systray/watcher.o: systray/watcher.c $(TRAYDEPS) -+systray/tray.o: systray/tray.c $(TRAYDEPS) -+systray/item.o: systray/item.c $(TRAYDEPS) -+systray/icon.o: systray/icon.c $(TRAYDEPS) -+systray/menu.o: systray/menu.c $(TRAYDEPS) -+systray/helpers.o: systray/helpers.c $(TRAYDEPS) - - # wayland-scanner is a tool which generates C headers and rigging for Wayland - # protocols, which are specified in XML. wlroots requires you to rig these up -@@ -49,7 +60,7 @@ xdg-shell-protocol.h: - config.h: - cp config.def.h $@ - clean: -- rm -f dwl *.o *-protocol.h -+ rm -f dwl *.o *-protocol.h systray/*.o - - dist: clean - mkdir -p dwl-$(VERSION) -diff --git a/config.def.h b/config.def.h -index 5d1dc2b..451643e 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,8 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int systrayspacing = 2; /* systray spacing */ -+static const int showsystray = 1; /* 0 means no systray */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ - static const char *fonts[] = {"monospace:size=10"}; -@@ -127,6 +129,7 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - /* commands */ - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "wmenu-run", NULL }; -+static const char *dmenucmd[] = { "wmenu", NULL }; - - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -@@ -188,4 +191,6 @@ static const Button buttons[] = { - { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, - { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, - { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, -+ { ClkTray, 0, BTN_LEFT, trayactivate, {0} }, -+ { ClkTray, 0, BTN_RIGHT, traymenu, {0} }, - }; -diff --git a/dbus.c b/dbus.c -new file mode 100644 -index 0000000..125312c ---- /dev/null -+++ b/dbus.c -@@ -0,0 +1,242 @@ -+#include "dbus.h" -+ -+#include "util.h" -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+static void -+close_pipe(void *data) -+{ -+ int *pipefd = data; -+ -+ close(pipefd[0]); -+ close(pipefd[1]); -+ free(pipefd); -+} -+ -+static int -+dwl_dbus_dispatch(int fd, unsigned int mask, void *data) -+{ -+ DBusConnection *conn = data; -+ -+ int pending; -+ DBusDispatchStatus oldstatus, newstatus; -+ -+ oldstatus = dbus_connection_get_dispatch_status(conn); -+ newstatus = dbus_connection_dispatch(conn); -+ -+ /* Don't clear pending flag if status didn't change */ -+ if (oldstatus == newstatus) -+ return 0; -+ -+ if (read(fd, &pending, sizeof(int)) < 0) { -+ perror("read"); -+ die("Error in dbus dispatch"); -+ } -+ -+ return 0; -+} -+ -+static int -+dwl_dbus_watch_handle(int fd, uint32_t mask, void *data) -+{ -+ DBusWatch *watch = data; -+ -+ uint32_t flags = 0; -+ -+ if (!dbus_watch_get_enabled(watch)) -+ return 0; -+ -+ if (mask & WL_EVENT_READABLE) -+ flags |= DBUS_WATCH_READABLE; -+ if (mask & WL_EVENT_WRITABLE) -+ flags |= DBUS_WATCH_WRITABLE; -+ if (mask & WL_EVENT_HANGUP) -+ flags |= DBUS_WATCH_HANGUP; -+ if (mask & WL_EVENT_ERROR) -+ flags |= DBUS_WATCH_ERROR; -+ -+ dbus_watch_handle(watch, flags); -+ -+ return 0; -+} -+ -+static dbus_bool_t -+dwl_dbus_add_watch(DBusWatch *watch, void *data) -+{ -+ struct wl_event_loop *loop = data; -+ -+ int fd; -+ struct wl_event_source *watch_source; -+ uint32_t mask = 0, flags; -+ -+ if (!dbus_watch_get_enabled(watch)) -+ return TRUE; -+ -+ flags = dbus_watch_get_flags(watch); -+ if (flags & DBUS_WATCH_READABLE) -+ mask |= WL_EVENT_READABLE; -+ if (flags & DBUS_WATCH_WRITABLE) -+ mask |= WL_EVENT_WRITABLE; -+ -+ fd = dbus_watch_get_unix_fd(watch); -+ watch_source = wl_event_loop_add_fd(loop, fd, mask, -+ dwl_dbus_watch_handle, watch); -+ -+ dbus_watch_set_data(watch, watch_source, NULL); -+ -+ return TRUE; -+} -+ -+static void -+dwl_dbus_remove_watch(DBusWatch *watch, void *data) -+{ -+ struct wl_event_source *watch_source = dbus_watch_get_data(watch); -+ -+ if (watch_source) -+ wl_event_source_remove(watch_source); -+} -+ -+static int -+dwl_dbus_timeout_handle(void *data) -+{ -+ DBusTimeout *timeout = data; -+ -+ if (dbus_timeout_get_enabled(timeout)) -+ dbus_timeout_handle(timeout); -+ -+ return 0; -+} -+ -+static dbus_bool_t -+dwl_dbus_add_timeout(DBusTimeout *timeout, void *data) -+{ -+ struct wl_event_loop *loop = data; -+ -+ int r, interval; -+ struct wl_event_source *timeout_source; -+ -+ if (!dbus_timeout_get_enabled(timeout)) -+ return TRUE; -+ -+ interval = dbus_timeout_get_interval(timeout); -+ -+ timeout_source = -+ wl_event_loop_add_timer(loop, dwl_dbus_timeout_handle, timeout); -+ -+ r = wl_event_source_timer_update(timeout_source, interval); -+ if (r < 0) { -+ wl_event_source_remove(timeout_source); -+ return FALSE; -+ } -+ -+ dbus_timeout_set_data(timeout, timeout_source, NULL); -+ -+ return TRUE; -+} -+ -+static void -+dwl_dbus_remove_timeout(DBusTimeout *timeout, void *data) -+{ -+ struct wl_event_source *timeout_source; -+ -+ timeout_source = dbus_timeout_get_data(timeout); -+ -+ if (timeout_source) { -+ wl_event_source_timer_update(timeout_source, 0); -+ wl_event_source_remove(timeout_source); -+ } -+} -+ -+static void -+dwl_dbus_dispatch_status(DBusConnection *conn, DBusDispatchStatus status, -+ void *data) -+{ -+ int *pipefd = data; -+ -+ if (status != DBUS_DISPATCH_COMPLETE) { -+ int pending = 1; -+ if (write(pipefd[1], &pending, sizeof(int)) < 0) { -+ perror("write"); -+ die("Error in dispatch status"); -+ } -+ } -+} -+ -+struct wl_event_source * -+startbus(DBusConnection *conn, struct wl_event_loop *loop) -+{ -+ int *pipefd; -+ int pending = 1, flags; -+ struct wl_event_source *bus_source = NULL; -+ -+ pipefd = ecalloc(2, sizeof(int)); -+ -+ /* -+ * Libdbus forbids calling dbus_connection_dipatch from the -+ * DBusDispatchStatusFunction directly. Notify the event loop of -+ * updates via a self-pipe. -+ */ -+ if (pipe(pipefd) < 0) -+ goto fail; -+ if (((flags = fcntl(pipefd[0], F_GETFD)) < 0) || -+ fcntl(pipefd[0], F_SETFD, flags | FD_CLOEXEC) < 0 || -+ ((flags = fcntl(pipefd[1], F_GETFD)) < 0) || -+ fcntl(pipefd[1], F_SETFD, flags | FD_CLOEXEC) < 0) { -+ goto fail; -+ } -+ -+ dbus_connection_set_exit_on_disconnect(conn, FALSE); -+ -+ bus_source = wl_event_loop_add_fd(loop, pipefd[0], WL_EVENT_READABLE, -+ dwl_dbus_dispatch, conn); -+ if (!bus_source) -+ goto fail; -+ -+ dbus_connection_set_dispatch_status_function(conn, -+ dwl_dbus_dispatch_status, -+ pipefd, close_pipe); -+ if (!dbus_connection_set_watch_functions(conn, dwl_dbus_add_watch, -+ dwl_dbus_remove_watch, NULL, -+ loop, NULL)) { -+ goto fail; -+ } -+ if (!dbus_connection_set_timeout_functions(conn, dwl_dbus_add_timeout, -+ dwl_dbus_remove_timeout, -+ NULL, loop, NULL)) { -+ goto fail; -+ } -+ if (dbus_connection_get_dispatch_status(conn) != DBUS_DISPATCH_COMPLETE) -+ if (write(pipefd[1], &pending, sizeof(int)) < 0) -+ goto fail; -+ -+ return bus_source; -+ -+fail: -+ if (bus_source) -+ wl_event_source_remove(bus_source); -+ dbus_connection_set_timeout_functions(conn, NULL, NULL, NULL, NULL, -+ NULL); -+ dbus_connection_set_watch_functions(conn, NULL, NULL, NULL, NULL, NULL); -+ dbus_connection_set_dispatch_status_function(conn, NULL, NULL, NULL); -+ -+ return NULL; -+} -+ -+void -+stopbus(DBusConnection *conn, struct wl_event_source *bus_source) -+{ -+ wl_event_source_remove(bus_source); -+ dbus_connection_set_watch_functions(conn, NULL, NULL, NULL, NULL, NULL); -+ dbus_connection_set_timeout_functions(conn, NULL, NULL, NULL, NULL, -+ NULL); -+ dbus_connection_set_dispatch_status_function(conn, NULL, NULL, NULL); -+} -diff --git a/dbus.h b/dbus.h -new file mode 100644 -index 0000000..b374b98 ---- /dev/null -+++ b/dbus.h -@@ -0,0 +1,10 @@ -+#ifndef DWLDBUS_H -+#define DWLDBUS_H -+ -+#include -+#include -+ -+struct wl_event_source* startbus (DBusConnection *conn, struct wl_event_loop *loop); -+void stopbus (DBusConnection *conn, struct wl_event_source *bus_source); -+ -+#endif /* DWLDBUS_H */ -diff --git a/dwl.c b/dwl.c -index ece537a..7753ef6 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,7 @@ - /* - * See LICENSE file for copyright and license details. - */ -+#include - #include - #include - #include -@@ -71,6 +72,9 @@ - - #include "util.h" - #include "drwl.h" -+#include "dbus.h" -+#include "systray/tray.h" -+#include "systray/watcher.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -89,7 +93,7 @@ enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ --enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* clicks */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot, ClkTray }; /* clicks */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -218,6 +222,7 @@ struct Monitor { - int real_width, real_height; /* non-scaled */ - float scale; - } b; /* bar area */ -+ Tray *tray; - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -@@ -376,6 +381,9 @@ static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); -+static void trayactivate(const Arg *arg); -+static void traymenu(const Arg *arg); -+static void traynotify(void *data); - static void unlocksession(struct wl_listener *listener, void *data); - static void unmaplayersurfacenotify(struct wl_listener *listener, void *data); - static void unmapnotify(struct wl_listener *listener, void *data); -@@ -451,6 +459,10 @@ static Monitor *selmon; - static char stext[256]; - static struct wl_event_source *status_event_source; - -+static DBusConnection *bus_conn; -+static struct wl_event_source *bus_source; -+static Watcher watcher = {.running = 0}; -+ - static const struct wlr_buffer_impl buffer_impl = { - .destroy = bufdestroy, - .begin_data_ptr_access = bufdatabegin, -@@ -721,8 +733,8 @@ bufrelease(struct wl_listener *listener, void *data) - void - buttonpress(struct wl_listener *listener, void *data) - { -- unsigned int i = 0, x = 0; -- double cx; -+ unsigned int i = 0, x = 0, ti = 0; -+ double cx, tx = 0; - unsigned int click; - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; -@@ -732,6 +744,7 @@ buttonpress(struct wl_listener *listener, void *data) - Arg arg = {0}; - Client *c; - const Button *b; -+ int traywidth; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -@@ -751,6 +764,8 @@ buttonpress(struct wl_listener *listener, void *data) - (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && - (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { - cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ traywidth = tray_get_width(selmon->tray); -+ - do - x += TEXTW(selmon, tags[i]); - while (cx >= x && ++i < LENGTH(tags)); -@@ -759,8 +774,16 @@ buttonpress(struct wl_listener *listener, void *data) - arg.ui = 1 << i; - } else if (cx < x + TEXTW(selmon, selmon->ltsymbol)) - click = ClkLtSymbol; -- else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2)) { -+ else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2) && cx < selmon->b.width - traywidth) { - click = ClkStatus; -+ } else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2)) { -+ unsigned int tray_n_items = watcher_get_n_items(&watcher); -+ tx = selmon->b.width - traywidth; -+ do -+ tx += tray_n_items ? (int)(traywidth / tray_n_items) : 0; -+ while (cx >= tx && ++ti < tray_n_items); -+ click = ClkTray; -+ arg.ui = ti; - } else - click = ClkTitle; - } -@@ -774,7 +797,12 @@ buttonpress(struct wl_listener *listener, void *data) - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { - if (CLEANMASK(mods) == CLEANMASK(b->mod) && event->button == b->button && click == b->click && b->func) { -- b->func(click == ClkTagBar && b->arg.i == 0 ? &arg : &b->arg); -+ if (click == ClkTagBar && b->arg.i == 0) -+ b->func(&arg); -+ else if (click == ClkTray && b->arg.i == 0) -+ b->func(&arg); -+ else -+ b->func(&b->arg); - return; - } - } -@@ -840,6 +868,14 @@ cleanup(void) - - destroykeyboardgroup(&kb_group->destroy, NULL); - -+ if (watcher.running) -+ watcher_stop(&watcher); -+ -+ if (showbar && showsystray) { -+ stopbus(bus_conn, bus_source); -+ dbus_connection_unref(bus_conn); -+ } -+ - /* If it's not destroyed manually it will cause a use-after-free of wlr_seat. - * Destroy it until it's fixed in the wlroots side */ - wlr_backend_destroy(backend); -@@ -868,6 +904,9 @@ cleanupmon(struct wl_listener *listener, void *data) - for (i = 0; i < LENGTH(m->pool); i++) - wlr_buffer_drop(&m->pool[i]->base); - -+ if (showsystray) -+ destroytray(m->tray); -+ - drwl_setimage(m->drw, NULL); - drwl_destroy(m->drw); - -@@ -1506,6 +1545,7 @@ dirtomon(enum wlr_direction dir) - void - drawbar(Monitor *m) - { -+ int traywidth = 0; - int x, w, tw = 0; - int boxs = m->drw->font->height / 9; - int boxw = m->drw->font->height / 6 + 2; -@@ -1518,11 +1558,13 @@ drawbar(Monitor *m) - if (!(buf = bufmon(m))) - return; - -+ traywidth = tray_get_width(m->tray); -+ - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drwl_setscheme(m->drw, colors[SchemeNorm]); - tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -- drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -+ drwl_text(m->drw, m->b.width - (tw + traywidth), 0, tw, m->b.height, 0, stext, 0); - } - - wl_list_for_each(c, &clients, link) { -@@ -1548,7 +1590,7 @@ drawbar(Monitor *m) - drwl_setscheme(m->drw, colors[SchemeNorm]); - x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); - -- if ((w = m->b.width - tw - x) > m->b.height) { -+ if ((w = m->b.width - (tw + x + traywidth)) > m->b.height) { - if (c) { - drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); - drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -@@ -1560,6 +1602,15 @@ drawbar(Monitor *m) - } - } - -+ if (traywidth > 0) { -+ pixman_image_composite32(PIXMAN_OP_SRC, -+ m->tray->image, NULL, m->drw->image, -+ 0, 0, -+ 0, 0, -+ m->b.width - traywidth, 0, -+ traywidth, m->b.height); -+ } -+ - wlr_scene_buffer_set_dest_size(m->scene_buffer, - m->b.real_width, m->b.real_height); - wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x, -@@ -1568,6 +1619,26 @@ drawbar(Monitor *m) - wlr_buffer_unlock(&buf->base); - } - -+void -+traynotify(void *data) -+{ -+ Monitor *m = data; -+ -+ drawbar(m); -+} -+ -+void -+trayactivate(const Arg *arg) -+{ -+ tray_leftclicked(selmon->tray, arg->ui); -+} -+ -+void -+traymenu(const Arg *arg) -+{ -+ tray_rightclicked(selmon->tray, arg->ui, dmenucmd); -+} -+ - void - drawbars(void) - { -@@ -2818,6 +2889,15 @@ setup(void) - status_event_source = wl_event_loop_add_fd(wl_display_get_event_loop(dpy), - STDIN_FILENO, WL_EVENT_READABLE, statusin, NULL); - -+ bus_conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); -+ if (!bus_conn) -+ die("Failed to connect to bus"); -+ bus_source = startbus(bus_conn, event_loop); -+ if (!bus_source) -+ die("Failed to start listening to bus events"); -+ if (showbar && showsystray) -+ watcher_start(&watcher, bus_conn, event_loop); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -3160,6 +3240,7 @@ updatebar(Monitor *m) - size_t i; - int rw, rh; - char fontattrs[12]; -+ Tray *tray; - - wlr_output_transformed_resolution(m->wlr_output, &rw, &rh); - m->b.width = rw; -@@ -3185,6 +3266,18 @@ updatebar(Monitor *m) - m->lrpad = m->drw->font->height; - m->b.height = m->drw->font->height + 2; - m->b.real_height = (int)((float)m->b.height / m->wlr_output->scale); -+ -+ if (showsystray) { -+ if (m->tray) -+ destroytray(m->tray); -+ tray = createtray(m, -+ m->b.height, systrayspacing, colors[SchemeNorm], fonts, fontattrs, -+ &traynotify, &watcher); -+ if (!tray) -+ die("Couldn't create tray for monitor"); -+ m->tray = tray; -+ wl_list_insert(&watcher.trays, &tray->link); -+ } - } - - void -diff --git a/systray/helpers.c b/systray/helpers.c -new file mode 100644 -index 0000000..d1af9f8 ---- /dev/null -+++ b/systray/helpers.c -@@ -0,0 +1,43 @@ -+#include "helpers.h" -+ -+#include -+ -+#include -+#include -+ -+// IWYU pragma: no_include "dbus/dbus-protocol.h" -+// IWYU pragma: no_include "dbus/dbus-shared.h" -+ -+int -+request_property(DBusConnection *conn, const char *busname, const char *busobj, -+ const char *prop, const char *iface, PropHandler handler, -+ void *data) -+{ -+ DBusMessage *msg = NULL; -+ DBusPendingCall *pending = NULL; -+ int r; -+ -+ if (!(msg = dbus_message_new_method_call(busname, busobj, -+ DBUS_INTERFACE_PROPERTIES, -+ "Get")) || -+ !dbus_message_append_args(msg, DBUS_TYPE_STRING, &iface, -+ DBUS_TYPE_STRING, &prop, -+ DBUS_TYPE_INVALID) || -+ !dbus_connection_send_with_reply(conn, msg, &pending, -1) || -+ !dbus_pending_call_set_notify(pending, handler, data, NULL)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_unref(msg); -+ return 0; -+ -+fail: -+ if (pending) { -+ dbus_pending_call_cancel(pending); -+ dbus_pending_call_unref(pending); -+ } -+ if (msg) -+ dbus_message_unref(msg); -+ return r; -+} -diff --git a/systray/helpers.h b/systray/helpers.h -new file mode 100644 -index 0000000..2c592e0 ---- /dev/null -+++ b/systray/helpers.h -@@ -0,0 +1,12 @@ -+#ifndef HELPERS_H -+#define HELPERS_H -+ -+#include -+ -+typedef void (*PropHandler)(DBusPendingCall *pcall, void *data); -+ -+int request_property (DBusConnection *conn, const char *busname, -+ const char *busobj, const char *prop, const char *iface, -+ PropHandler handler, void *data); -+ -+#endif /* HELPERS_H */ -diff --git a/systray/icon.c b/systray/icon.c -new file mode 100644 -index 0000000..1b97866 ---- /dev/null -+++ b/systray/icon.c -@@ -0,0 +1,149 @@ -+#include "icon.h" -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#define PREMUL_ALPHA(chan, alpha) (chan * alpha + 127) / 255 -+ -+/* -+ * Converts pixels from uint8_t[4] to uint32_t and -+ * straight alpha to premultiplied alpha. -+ */ -+static uint32_t * -+to_pixman(const uint8_t *src, int n_pixels, size_t *pix_size) -+{ -+ uint32_t *dest = NULL; -+ -+ *pix_size = n_pixels * sizeof(uint32_t); -+ dest = malloc(*pix_size); -+ if (!dest) -+ return NULL; -+ -+ for (int i = 0; i < n_pixels; i++) { -+ uint8_t a = src[i * 4 + 0]; -+ uint8_t r = src[i * 4 + 1]; -+ uint8_t g = src[i * 4 + 2]; -+ uint8_t b = src[i * 4 + 3]; -+ -+ /* -+ * Skip premultiplying fully opaque and fully transparent -+ * pixels. -+ */ -+ if (a == 0) { -+ dest[i] = 0; -+ -+ } else if (a == 255) { -+ dest[i] = ((uint32_t)a << 24) | ((uint32_t)r << 16) | -+ ((uint32_t)g << 8) | ((uint32_t)b); -+ -+ } else { -+ dest[i] = ((uint32_t)a << 24) | -+ ((uint32_t)PREMUL_ALPHA(r, a) << 16) | -+ ((uint32_t)PREMUL_ALPHA(g, a) << 8) | -+ ((uint32_t)PREMUL_ALPHA(b, a)); -+ } -+ } -+ -+ return dest; -+} -+ -+Icon * -+createicon(const uint8_t *buf, int width, int height, int size) -+{ -+ Icon *icon = NULL; -+ -+ int n_pixels; -+ pixman_image_t *img = NULL; -+ size_t pixbuf_size; -+ uint32_t *buf_pixman = NULL; -+ uint8_t *buf_orig = NULL; -+ -+ n_pixels = size / 4; -+ -+ icon = calloc(1, sizeof(Icon)); -+ buf_orig = malloc(size); -+ buf_pixman = to_pixman(buf, n_pixels, &pixbuf_size); -+ if (!icon || !buf_orig || !buf_pixman) -+ goto fail; -+ -+ img = pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height, -+ buf_pixman, width * 4); -+ if (!img) -+ goto fail; -+ -+ memcpy(buf_orig, buf, size); -+ -+ icon->buf_orig = buf_orig; -+ icon->buf_pixman = buf_pixman; -+ icon->img = img; -+ icon->size_orig = size; -+ icon->size_pixman = pixbuf_size; -+ -+ return icon; -+ -+fail: -+ free(buf_orig); -+ if (img) -+ pixman_image_unref(img); -+ free(buf_pixman); -+ free(icon); -+ return NULL; -+} -+ -+void -+destroyicon(Icon *icon) -+{ -+ if (icon->img) -+ pixman_image_unref(icon->img); -+ free(icon->buf_orig); -+ free(icon->buf_pixman); -+ free(icon); -+} -+ -+FallbackIcon * -+createfallbackicon(const char *appname, int fgcolor, struct fcft_font *font) -+{ -+ const struct fcft_glyph *glyph; -+ char initial; -+ -+ if ((unsigned char)appname[0] > 127) { -+ /* first character is not ascii */ -+ initial = '?'; -+ } else { -+ initial = toupper(*appname); -+ } -+ -+ glyph = fcft_rasterize_char_utf32(font, initial, FCFT_SUBPIXEL_DEFAULT); -+ if (!glyph) -+ return NULL; -+ -+ return glyph; -+} -+ -+int -+resize_image(pixman_image_t *image, int new_width, int new_height) -+{ -+ int src_width = pixman_image_get_width(image); -+ int src_height = pixman_image_get_height(image); -+ pixman_transform_t transform; -+ pixman_fixed_t scale_x, scale_y; -+ -+ if (src_width == new_width && src_height == new_height) -+ return 0; -+ -+ scale_x = pixman_double_to_fixed((double)src_width / new_width); -+ scale_y = pixman_double_to_fixed((double)src_height / new_height); -+ -+ pixman_transform_init_scale(&transform, scale_x, scale_y); -+ if (!pixman_image_set_filter(image, PIXMAN_FILTER_BEST, NULL, 0) || -+ !pixman_image_set_transform(image, &transform)) { -+ return -1; -+ } -+ -+ return 0; -+} -diff --git a/systray/icon.h b/systray/icon.h -new file mode 100644 -index 0000000..20f281b ---- /dev/null -+++ b/systray/icon.h -@@ -0,0 +1,26 @@ -+#ifndef ICON_H -+#define ICON_H -+ -+#include -+#include -+ -+#include -+#include -+ -+typedef const struct fcft_glyph FallbackIcon; -+ -+typedef struct { -+ pixman_image_t *img; -+ uint32_t *buf_pixman; -+ uint8_t *buf_orig; -+ size_t size_orig; -+ size_t size_pixman; -+} Icon; -+ -+Icon *createicon (const uint8_t *buf, int width, int height, int size); -+FallbackIcon *createfallbackicon (const char *appname, int fgcolor, -+ struct fcft_font *font); -+void destroyicon (Icon *icon); -+int resize_image (pixman_image_t *orig, int new_width, int new_height); -+ -+#endif /* ICON_H */ -diff --git a/systray/item.c b/systray/item.c -new file mode 100644 -index 0000000..4359a28 ---- /dev/null -+++ b/systray/item.c -@@ -0,0 +1,403 @@ -+#include "item.h" -+ -+#include "helpers.h" -+#include "icon.h" -+#include "watcher.h" -+ -+#include -+ -+#include -+#include -+#include -+#include -+ -+// IWYU pragma: no_include "dbus/dbus-protocol.h" -+// IWYU pragma: no_include "dbus/dbus-shared.h" -+ -+#define RULEBSIZE 256 -+#define MIN(A, B) ((A) < (B) ? (A) : (B)) -+ -+static const char *match_string = -+ "type='signal'," -+ "sender='%s'," -+ "interface='" SNI_NAME -+ "'," -+ "member='NewIcon'"; -+ -+static Watcher * -+item_get_watcher(const Item *item) -+{ -+ if (!item) -+ return NULL; -+ -+ return item->watcher; -+} -+ -+static DBusConnection * -+item_get_connection(const Item *item) -+{ -+ if (!item || !item->watcher) -+ return NULL; -+ -+ return item->watcher->conn; -+} -+ -+static const uint8_t * -+extract_image(DBusMessageIter *iter, dbus_int32_t *width, dbus_int32_t *height, -+ int *size) -+{ -+ DBusMessageIter vals, bytes; -+ const uint8_t *buf; -+ -+ dbus_message_iter_recurse(iter, &vals); -+ if (dbus_message_iter_get_arg_type(&vals) != DBUS_TYPE_INT32) -+ goto fail; -+ dbus_message_iter_get_basic(&vals, width); -+ -+ dbus_message_iter_next(&vals); -+ if (dbus_message_iter_get_arg_type(&vals) != DBUS_TYPE_INT32) -+ goto fail; -+ dbus_message_iter_get_basic(&vals, height); -+ -+ dbus_message_iter_next(&vals); -+ if (dbus_message_iter_get_arg_type(&vals) != DBUS_TYPE_ARRAY) -+ goto fail; -+ dbus_message_iter_recurse(&vals, &bytes); -+ if (dbus_message_iter_get_arg_type(&bytes) != DBUS_TYPE_BYTE) -+ goto fail; -+ dbus_message_iter_get_fixed_array(&bytes, &buf, size); -+ if (size == 0) -+ goto fail; -+ -+ return buf; -+ -+fail: -+ return NULL; -+} -+ -+static int -+select_image(DBusMessageIter *iter, int target_width) -+{ -+ DBusMessageIter vals; -+ dbus_int32_t cur_width; -+ int i = 0; -+ -+ do { -+ dbus_message_iter_recurse(iter, &vals); -+ if (dbus_message_iter_get_arg_type(&vals) != DBUS_TYPE_INT32) -+ return -1; -+ dbus_message_iter_get_basic(&vals, &cur_width); -+ if (cur_width >= target_width) -+ return i; -+ -+ i++; -+ } while (dbus_message_iter_next(iter)); -+ -+ /* return last index if desired not found */ -+ return --i; -+} -+ -+static void -+menupath_ready_handler(DBusPendingCall *pending, void *data) -+{ -+ Item *item = data; -+ -+ DBusError err = DBUS_ERROR_INIT; -+ DBusMessage *reply = NULL; -+ DBusMessageIter iter, opath; -+ char *path_dup = NULL; -+ const char *path; -+ -+ reply = dbus_pending_call_steal_reply(pending); -+ if (!reply) -+ goto fail; -+ -+ if (dbus_set_error_from_message(&err, reply)) { -+ fprintf(stderr, "DBus Error: %s - %s: Couldn't get menupath\n", -+ err.name, err.message); -+ goto fail; -+ } -+ -+ dbus_message_iter_init(reply, &iter); -+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) -+ goto fail; -+ dbus_message_iter_recurse(&iter, &opath); -+ if (dbus_message_iter_get_arg_type(&opath) != DBUS_TYPE_OBJECT_PATH) -+ goto fail; -+ dbus_message_iter_get_basic(&opath, &path); -+ -+ path_dup = strdup(path); -+ if (!path_dup) -+ goto fail; -+ -+ item->menu_busobj = path_dup; -+ -+ dbus_message_unref(reply); -+ dbus_pending_call_unref(pending); -+ return; -+ -+fail: -+ free(path_dup); -+ dbus_error_free(&err); -+ if (reply) -+ dbus_message_unref(reply); -+ if (pending) -+ dbus_pending_call_unref(pending); -+} -+ -+/* -+ * Gets the Id dbus property, which is the name of the application, -+ * most of the time... -+ * The initial letter will be used as a fallback icon -+ */ -+static void -+id_ready_handler(DBusPendingCall *pending, void *data) -+{ -+ Item *item = data; -+ -+ DBusError err = DBUS_ERROR_INIT; -+ DBusMessage *reply = NULL; -+ DBusMessageIter iter, string; -+ Watcher *watcher; -+ char *id_dup = NULL; -+ const char *id; -+ -+ watcher = item_get_watcher(item); -+ -+ reply = dbus_pending_call_steal_reply(pending); -+ if (!reply) -+ goto fail; -+ -+ if (dbus_set_error_from_message(&err, reply)) { -+ fprintf(stderr, "DBus Error: %s - %s: Couldn't get appid\n", -+ err.name, err.message); -+ goto fail; -+ } -+ -+ dbus_message_iter_init(reply, &iter); -+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) -+ goto fail; -+ dbus_message_iter_recurse(&iter, &string); -+ if (dbus_message_iter_get_arg_type(&string) != DBUS_TYPE_STRING) -+ goto fail; -+ dbus_message_iter_get_basic(&string, &id); -+ -+ id_dup = strdup(id); -+ if (!id_dup) -+ goto fail; -+ item->appid = id_dup; -+ -+ /* Don't trigger update if this item already has a real icon */ -+ if (!item->icon) -+ watcher_update_trays(watcher); -+ -+ dbus_message_unref(reply); -+ dbus_pending_call_unref(pending); -+ return; -+ -+fail: -+ dbus_error_free(&err); -+ if (id_dup) -+ free(id_dup); -+ if (reply) -+ dbus_message_unref(reply); -+ if (pending) -+ dbus_pending_call_unref(pending); -+} -+ -+static void -+pixmap_ready_handler(DBusPendingCall *pending, void *data) -+{ -+ Item *item = data; -+ -+ DBusMessage *reply = NULL; -+ DBusMessageIter iter, array, select, strct; -+ Icon *icon = NULL; -+ Watcher *watcher; -+ dbus_int32_t width, height; -+ int selected_index, size; -+ const uint8_t *buf; -+ -+ watcher = item_get_watcher(item); -+ -+ reply = dbus_pending_call_steal_reply(pending); -+ if (!reply || dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) -+ goto fail; -+ dbus_message_iter_init(reply, &iter); -+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) -+ goto fail; -+ dbus_message_iter_recurse(&iter, &array); -+ if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY) -+ goto fail; -+ dbus_message_iter_recurse(&array, &select); -+ if (dbus_message_iter_get_arg_type(&select) != DBUS_TYPE_STRUCT) -+ goto fail; -+ selected_index = select_image(&select, 22); // Get the 22*22 image -+ if (selected_index < 0) -+ goto fail; -+ -+ dbus_message_iter_recurse(&array, &strct); -+ if (dbus_message_iter_get_arg_type(&strct) != DBUS_TYPE_STRUCT) -+ goto fail; -+ for (int i = 0; i < selected_index; i++) -+ dbus_message_iter_next(&strct); -+ buf = extract_image(&strct, &width, &height, &size); -+ if (!buf) -+ goto fail; -+ -+ if (!item->icon) { -+ /* First icon */ -+ icon = createicon(buf, width, height, size); -+ if (!icon) -+ goto fail; -+ item->icon = icon; -+ watcher_update_trays(watcher); -+ -+ } else if (memcmp(item->icon->buf_orig, buf, -+ MIN(item->icon->size_orig, (size_t)size)) != 0) { -+ /* New icon */ -+ destroyicon(item->icon); -+ item->icon = NULL; -+ icon = createicon(buf, width, height, size); -+ if (!icon) -+ goto fail; -+ item->icon = icon; -+ watcher_update_trays(watcher); -+ -+ } else { -+ /* Icon didn't change */ -+ } -+ -+ dbus_message_unref(reply); -+ dbus_pending_call_unref(pending); -+ return; -+ -+fail: -+ if (icon) -+ destroyicon(icon); -+ if (reply) -+ dbus_message_unref(reply); -+ if (pending) -+ dbus_pending_call_unref(pending); -+} -+ -+static DBusHandlerResult -+handle_newicon(Item *item, DBusConnection *conn, DBusMessage *msg) -+{ -+ const char *sender = dbus_message_get_sender(msg); -+ -+ if (sender && strcmp(sender, item->busname) == 0) { -+ request_property(conn, item->busname, item->busobj, -+ "IconPixmap", SNI_IFACE, pixmap_ready_handler, -+ item); -+ -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+ } else { -+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -+ } -+} -+ -+static DBusHandlerResult -+filter_bus(DBusConnection *conn, DBusMessage *msg, void *data) -+{ -+ Item *item = data; -+ -+ if (dbus_message_is_signal(msg, SNI_IFACE, "NewIcon")) -+ return handle_newicon(item, conn, msg); -+ else -+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -+} -+ -+Item * -+createitem(const char *busname, const char *busobj, Watcher *watcher) -+{ -+ DBusConnection *conn; -+ Item *item; -+ char *busname_dup = NULL; -+ char *busobj_dup = NULL; -+ char match_rule[RULEBSIZE]; -+ -+ item = calloc(1, sizeof(Item)); -+ busname_dup = strdup(busname); -+ busobj_dup = strdup(busobj); -+ if (!item || !busname_dup || !busobj_dup) -+ goto fail; -+ -+ conn = watcher->conn; -+ item->busname = busname_dup; -+ item->busobj = busobj_dup; -+ item->watcher = watcher; -+ -+ request_property(conn, busname, busobj, "IconPixmap", SNI_IFACE, -+ pixmap_ready_handler, item); -+ -+ request_property(conn, busname, busobj, "Id", SNI_IFACE, -+ id_ready_handler, item); -+ -+ request_property(conn, busname, busobj, "Menu", SNI_IFACE, -+ menupath_ready_handler, item); -+ -+ if (snprintf(match_rule, sizeof(match_rule), match_string, busname) >= -+ RULEBSIZE) { -+ goto fail; -+ } -+ -+ if (!dbus_connection_add_filter(conn, filter_bus, item, NULL)) -+ goto fail; -+ dbus_bus_add_match(conn, match_rule, NULL); -+ -+ return item; -+ -+fail: -+ free(busname_dup); -+ free(busobj_dup); -+ return NULL; -+} -+ -+void -+destroyitem(Item *item) -+{ -+ DBusConnection *conn; -+ char match_rule[RULEBSIZE]; -+ -+ conn = item_get_connection(item); -+ -+ if (snprintf(match_rule, sizeof(match_rule), match_string, -+ item->busname) < RULEBSIZE) { -+ dbus_bus_remove_match(conn, match_rule, NULL); -+ dbus_connection_remove_filter(conn, filter_bus, item); -+ } -+ if (item->icon) -+ destroyicon(item->icon); -+ free(item->menu_busobj); -+ free(item->busname); -+ free(item->busobj); -+ free(item->appid); -+ free(item); -+} -+ -+void -+item_activate(Item *item) -+{ -+ DBusConnection *conn; -+ DBusMessage *msg = NULL; -+ dbus_int32_t x = 0, y = 0; -+ -+ conn = item_get_connection(item); -+ -+ if (!(msg = dbus_message_new_method_call(item->busname, item->busobj, -+ SNI_IFACE, "Activate")) || -+ !dbus_message_append_args(msg, DBUS_TYPE_INT32, &x, DBUS_TYPE_INT32, -+ &y, DBUS_TYPE_INVALID) || -+ !dbus_connection_send_with_reply(conn, msg, NULL, -1)) { -+ goto fail; -+ } -+ -+ dbus_message_unref(msg); -+ return; -+ -+fail: -+ if (msg) -+ dbus_message_unref(msg); -+} -diff --git a/systray/item.h b/systray/item.h -new file mode 100644 -index 0000000..dc22e25 ---- /dev/null -+++ b/systray/item.h -@@ -0,0 +1,46 @@ -+#ifndef ITEM_H -+#define ITEM_H -+ -+#include "icon.h" -+#include "watcher.h" -+ -+#include -+ -+/* -+ * The FDO spec says "org.freedesktop.StatusNotifierItem"[1], -+ * but both the client libraries[2,3] actually use "org.kde.StatusNotifierItem" -+ * -+ * [1] https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/ -+ * [2] https://github.com/AyatanaIndicators/libayatana-appindicator-glib -+ * [3] https://invent.kde.org/frameworks/kstatusnotifieritem -+ * -+ */ -+#define SNI_NAME "org.kde.StatusNotifierItem" -+#define SNI_OPATH "/StatusNotifierItem" -+#define SNI_IFACE "org.kde.StatusNotifierItem" -+ -+typedef struct Item { -+ struct wl_list icons; -+ char *busname; -+ char *busobj; -+ char *menu_busobj; -+ char *appid; -+ Icon *icon; -+ FallbackIcon *fallback_icon; -+ -+ Watcher *watcher; -+ -+ int fgcolor; -+ -+ int ready; -+ -+ struct wl_list link; -+} Item; -+ -+Item *createitem (const char *busname, const char *busobj, Watcher *watcher); -+void destroyitem (Item *item); -+ -+void item_activate (Item *item); -+void item_show_menu (Item *item); -+ -+#endif /* ITEM_H */ -diff --git a/systray/menu.c b/systray/menu.c -new file mode 100644 -index 0000000..ff3bfb5 ---- /dev/null -+++ b/systray/menu.c -@@ -0,0 +1,757 @@ -+#include "menu.h" -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+// IWYU pragma: no_include "dbus/dbus-protocol.h" -+// IWYU pragma: no_include "dbus/dbus-shared.h" -+ -+#define DBUSMENU_IFACE "com.canonical.dbusmenu" -+#define BUFSIZE 512 -+#define LABEL_MAX 64 -+ -+typedef struct { -+ struct wl_array layout; -+ DBusConnection *conn; -+ struct wl_event_loop *loop; -+ char *busname; -+ char *busobj; -+ const char **menucmd; -+} Menu; -+ -+typedef struct { -+ char label[LABEL_MAX]; -+ dbus_int32_t id; -+ struct wl_array submenu; -+ int has_submenu; -+} MenuItem; -+ -+typedef struct { -+ struct wl_event_loop *loop; -+ struct wl_event_source *fd_source; -+ struct wl_array *layout_node; -+ Menu *menu; -+ pid_t menu_pid; -+ int fd; -+} MenuShowContext; -+ -+static int extract_menu (DBusMessageIter *av, struct wl_array *menu); -+static int real_show_menu (Menu *menu, struct wl_array *m); -+static void submenus_destroy_recursive (struct wl_array *m); -+ -+static void -+menuitem_init(MenuItem *mi) -+{ -+ wl_array_init(&mi->submenu); -+ mi->id = -1; -+ *mi->label = '\0'; -+ mi->has_submenu = 0; -+} -+ -+static void -+submenus_destroy_recursive(struct wl_array *layout_node) -+{ -+ MenuItem *mi; -+ -+ wl_array_for_each(mi, layout_node) { -+ if (mi->has_submenu) { -+ submenus_destroy_recursive(&mi->submenu); -+ wl_array_release(&mi->submenu); -+ } -+ } -+} -+ -+static void -+menu_destroy(Menu *menu) -+{ -+ submenus_destroy_recursive(&menu->layout); -+ wl_array_release(&menu->layout); -+ free(menu->busname); -+ free(menu->busobj); -+ free(menu); -+} -+ -+static void -+menu_show_ctx_finalize(MenuShowContext *ctx, int error) -+{ -+ if (ctx->fd_source) -+ wl_event_source_remove(ctx->fd_source); -+ -+ if (ctx->fd >= 0) -+ close(ctx->fd); -+ -+ if (ctx->menu_pid >= 0) { -+ if (waitpid(ctx->menu_pid, NULL, WNOHANG) == 0) -+ kill(ctx->menu_pid, SIGTERM); -+ } -+ -+ if (error) -+ menu_destroy(ctx->menu); -+ -+ free(ctx); -+} -+ -+static void -+remove_newline(char *buf) -+{ -+ size_t len; -+ -+ len = strlen(buf); -+ if (len > 0 && buf[len - 1] == '\n') -+ buf[len - 1] = '\0'; -+} -+ -+static void -+send_clicked(const char *busname, const char *busobj, int itemid, -+ DBusConnection *conn) -+{ -+ DBusMessage *msg = NULL; -+ DBusMessageIter iter = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ DBusMessageIter sub = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ const char *data = ""; -+ const char *eventid = "clicked"; -+ time_t timestamp; -+ -+ timestamp = time(NULL); -+ -+ msg = dbus_message_new_method_call(busname, busobj, DBUSMENU_IFACE, -+ "Event"); -+ if (!msg) -+ goto fail; -+ -+ dbus_message_iter_init_append(msg, &iter); -+ if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &itemid) || -+ !dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, -+ &eventid) || -+ !dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, -+ DBUS_TYPE_STRING_AS_STRING, -+ &sub) || -+ !dbus_message_iter_append_basic(&sub, DBUS_TYPE_STRING, &data) || -+ !dbus_message_iter_close_container(&iter, &sub) || -+ !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, -+ ×tamp)) { -+ goto fail; -+ } -+ -+ if (!dbus_connection_send_with_reply(conn, msg, NULL, -1)) -+ goto fail; -+ -+ dbus_message_unref(msg); -+ return; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(&iter, &sub); -+ if (msg) -+ dbus_message_unref(msg); -+} -+ -+static void -+menuitem_selected(const char *label, struct wl_array *m, Menu *menu) -+{ -+ MenuItem *mi; -+ -+ wl_array_for_each(mi, m) { -+ if (strcmp(mi->label, label) == 0) { -+ if (mi->has_submenu) { -+ real_show_menu(menu, &mi->submenu); -+ -+ } else { -+ send_clicked(menu->busname, menu->busobj, -+ mi->id, menu->conn); -+ menu_destroy(menu); -+ } -+ -+ return; -+ } -+ } -+} -+ -+static int -+read_pipe(int fd, uint32_t mask, void *data) -+{ -+ MenuShowContext *ctx = data; -+ -+ char buf[BUFSIZE]; -+ ssize_t bytes_read; -+ -+ bytes_read = read(fd, buf, BUFSIZE); -+ /* 0 == Got EOF, menu program closed without writing to stdout */ -+ if (bytes_read <= 0) -+ goto fail; -+ -+ buf[bytes_read] = '\0'; -+ remove_newline(buf); -+ -+ menuitem_selected(buf, ctx->layout_node, ctx->menu); -+ menu_show_ctx_finalize(ctx, 0); -+ return 0; -+ -+fail: -+ menu_show_ctx_finalize(ctx, 1); -+ return 0; -+} -+ -+static MenuShowContext * -+prepare_show_ctx(struct wl_event_loop *loop, int monitor_fd, int dmenu_pid, -+ struct wl_array *layout_node, Menu *menu) -+{ -+ MenuShowContext *ctx = NULL; -+ struct wl_event_source *fd_src = NULL; -+ -+ ctx = calloc(1, sizeof(MenuShowContext)); -+ if (!ctx) -+ goto fail; -+ -+ fd_src = wl_event_loop_add_fd(menu->loop, monitor_fd, WL_EVENT_READABLE, -+ read_pipe, ctx); -+ if (!fd_src) -+ goto fail; -+ -+ ctx->fd_source = fd_src; -+ ctx->fd = monitor_fd; -+ ctx->menu_pid = dmenu_pid; -+ ctx->layout_node = layout_node; -+ ctx->menu = menu; -+ -+ return ctx; -+ -+fail: -+ if (fd_src) -+ wl_event_source_remove(fd_src); -+ free(ctx); -+ return NULL; -+} -+ -+static int -+write_dmenu_buf(char *buf, struct wl_array *layout_node) -+{ -+ MenuItem *mi; -+ int r; -+ size_t curlen = 0; -+ -+ *buf = '\0'; -+ -+ wl_array_for_each(mi, layout_node) { -+ curlen += strlen(mi->label) + -+ 2; /* +2 is newline + nul terminator */ -+ if (curlen + 1 > BUFSIZE) { -+ r = -1; -+ goto fail; -+ } -+ -+ strcat(buf, mi->label); -+ strcat(buf, "\n"); -+ } -+ remove_newline(buf); -+ -+ return 0; -+ -+fail: -+ fprintf(stderr, "Failed to construct dmenu input\n"); -+ return r; -+} -+ -+static int -+real_show_menu(Menu *menu, struct wl_array *layout_node) -+{ -+ MenuShowContext *ctx = NULL; -+ char buf[BUFSIZE]; -+ int to_pipe[2], from_pipe[2]; -+ pid_t pid; -+ -+ if (pipe(to_pipe) < 0 || pipe(from_pipe) < 0) -+ goto fail; -+ -+ pid = fork(); -+ if (pid < 0) { -+ goto fail; -+ } else if (pid == 0) { -+ dup2(to_pipe[0], STDIN_FILENO); -+ dup2(from_pipe[1], STDOUT_FILENO); -+ -+ close(to_pipe[0]); -+ close(to_pipe[1]); -+ close(from_pipe[1]); -+ close(from_pipe[0]); -+ -+ if (execvp(menu->menucmd[0], (char *const *)menu->menucmd)) { -+ perror("Error spawning menu program"); -+ exit(EXIT_FAILURE); -+ } -+ } -+ -+ ctx = prepare_show_ctx(menu->loop, from_pipe[0], pid, layout_node, -+ menu); -+ if (!ctx) -+ goto fail; -+ -+ if (write_dmenu_buf(buf, layout_node) < 0 || -+ write(to_pipe[1], buf, strlen(buf)) < 0) { -+ goto fail; -+ } -+ -+ close(to_pipe[0]); -+ close(to_pipe[1]); -+ close(from_pipe[1]); -+ return 0; -+ -+fail: -+ close(to_pipe[0]); -+ close(to_pipe[1]); -+ close(from_pipe[1]); -+ menu_show_ctx_finalize(ctx, 1); -+ return -1; -+} -+ -+static void -+createmenuitem(MenuItem *mi, dbus_int32_t id, const char *label, -+ int toggle_state, int has_submenu) -+{ -+ char *tok; -+ char temp[LABEL_MAX]; -+ -+ if (toggle_state == 0) -+ strcpy(mi->label, "☐ "); -+ else if (toggle_state == 1) -+ strcpy(mi->label, "✓ "); -+ else -+ strcpy(mi->label, " "); -+ -+ /* Remove "mnemonics" (underscores which mark keyboard shortcuts) */ -+ strcpy(temp, label); -+ tok = strtok(temp, "_"); -+ do { -+ strcat(mi->label, tok); -+ } while ((tok = strtok(NULL, "_"))); -+ -+ if (has_submenu) { -+ mi->has_submenu = 1; -+ strcat(mi->label, " →"); -+ } -+ -+ mi->id = id; -+} -+ -+/** -+ * Populates the passed in menuitem based on the dictionary contents. -+ * -+ * @param[in] dict -+ * @param[in] itemid -+ * @param[in] mi -+ * @param[out] has_submenu -+ * @param[out] status <0 on error, 0 on success, >0 if menuitem was skipped -+ */ -+static int -+read_dict(DBusMessageIter *dict, dbus_int32_t itemid, MenuItem *mi, -+ int *has_submenu) -+{ -+ DBusMessageIter member, val; -+ const char *children_display = NULL, *label = NULL, *toggle_type = NULL; -+ const char *key; -+ dbus_bool_t visible = TRUE, enabled = TRUE; -+ dbus_int32_t toggle_state = 1; -+ int r; -+ -+ do { -+ dbus_message_iter_recurse(dict, &member); -+ if (dbus_message_iter_get_arg_type(&member) != -+ DBUS_TYPE_STRING) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&member, &key); -+ -+ dbus_message_iter_next(&member); -+ if (dbus_message_iter_get_arg_type(&member) != -+ DBUS_TYPE_VARIANT) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_recurse(&member, &val); -+ -+ if (strcmp(key, "visible") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_BOOLEAN) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &visible); -+ -+ } else if (strcmp(key, "enabled") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_BOOLEAN) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &enabled); -+ -+ } else if (strcmp(key, "toggle-type") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_STRING) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &toggle_type); -+ -+ } else if (strcmp(key, "toggle-state") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_INT32) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &toggle_state); -+ -+ } else if (strcmp(key, "children-display") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_STRING) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &children_display); -+ -+ if (strcmp(children_display, "submenu") == 0) -+ *has_submenu = 1; -+ -+ } else if (strcmp(key, "label") == 0) { -+ if (dbus_message_iter_get_arg_type(&val) != -+ DBUS_TYPE_STRING) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &label); -+ } -+ } while (dbus_message_iter_next(dict)); -+ -+ /* Skip hidden etc items */ -+ if (!label || !visible || !enabled) -+ return 1; -+ -+ /* -+ * 4 characters for checkmark and submenu indicator, -+ * 1 for nul terminator -+ */ -+ if (strlen(label) + 5 > LABEL_MAX) { -+ fprintf(stderr, "Too long menu entry label: %s! Skipping...\n", -+ label); -+ return 1; -+ } -+ -+ if (toggle_type && strcmp(toggle_type, "checkmark") == 0) -+ createmenuitem(mi, itemid, label, toggle_state, *has_submenu); -+ else -+ createmenuitem(mi, itemid, label, -1, *has_submenu); -+ -+ return 0; -+ -+fail: -+ fprintf(stderr, "Error parsing menu data\n"); -+ return r; -+} -+ -+/** -+ * Extracts a menuitem from a DBusMessage -+ * -+ * @param[in] strct -+ * @param[in] mi -+ * @param[out] status <0 on error, 0 on success, >0 if menuitem was skipped -+ */ -+static int -+extract_menuitem(DBusMessageIter *strct, MenuItem *mi) -+{ -+ DBusMessageIter val, dict; -+ dbus_int32_t itemid; -+ int has_submenu = 0; -+ int r; -+ -+ dbus_message_iter_recurse(strct, &val); -+ if (dbus_message_iter_get_arg_type(&val) != DBUS_TYPE_INT32) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&val, &itemid); -+ -+ if (!dbus_message_iter_next(&val) || -+ dbus_message_iter_get_arg_type(&val) != DBUS_TYPE_ARRAY) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_recurse(&val, &dict); -+ if (dbus_message_iter_get_arg_type(&dict) != DBUS_TYPE_DICT_ENTRY) { -+ r = -1; -+ goto fail; -+ } -+ -+ r = read_dict(&dict, itemid, mi, &has_submenu); -+ if (r < 0) { -+ goto fail; -+ -+ } else if (r == 0 && has_submenu) { -+ dbus_message_iter_next(&val); -+ if (dbus_message_iter_get_arg_type(&val) != DBUS_TYPE_ARRAY) -+ goto fail; -+ r = extract_menu(&val, &mi->submenu); -+ if (r < 0) -+ goto fail; -+ } -+ -+ return r; -+ -+fail: -+ return r; -+} -+ -+static int -+extract_menu(DBusMessageIter *av, struct wl_array *layout_node) -+{ -+ DBusMessageIter variant, menuitem; -+ MenuItem *mi; -+ int r; -+ -+ dbus_message_iter_recurse(av, &variant); -+ if (dbus_message_iter_get_arg_type(&variant) != DBUS_TYPE_VARIANT) { -+ r = -1; -+ goto fail; -+ } -+ -+ mi = wl_array_add(layout_node, sizeof(MenuItem)); -+ if (!mi) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ menuitem_init(mi); -+ -+ do { -+ dbus_message_iter_recurse(&variant, &menuitem); -+ if (dbus_message_iter_get_arg_type(&menuitem) != -+ DBUS_TYPE_STRUCT) { -+ r = -1; -+ goto fail; -+ } -+ -+ r = extract_menuitem(&menuitem, mi); -+ if (r < 0) -+ goto fail; -+ else if (r == 0) { -+ mi = wl_array_add(layout_node, sizeof(MenuItem)); -+ if (!mi) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ menuitem_init(mi); -+ } -+ /* r > 0: no action was performed on mi */ -+ } while (dbus_message_iter_next(&variant)); -+ -+ return 0; -+ -+fail: -+ return r; -+} -+ -+static void -+layout_ready(DBusPendingCall *pending, void *data) -+{ -+ Menu *menu = data; -+ -+ DBusMessage *reply = NULL; -+ DBusMessageIter iter, strct; -+ dbus_uint32_t revision; -+ int r; -+ -+ reply = dbus_pending_call_steal_reply(pending); -+ if (!reply || dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) { -+ r = -1; -+ goto fail; -+ } -+ -+ dbus_message_iter_init(reply, &iter); -+ if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_get_basic(&iter, &revision); -+ -+ if (!dbus_message_iter_next(&iter) || -+ dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRUCT) { -+ r = -1; -+ goto fail; -+ } -+ dbus_message_iter_recurse(&iter, &strct); -+ -+ /* -+ * id 0 is the root, which contains nothing of interest. -+ * Traverse past it. -+ */ -+ if (dbus_message_iter_get_arg_type(&strct) != DBUS_TYPE_INT32 || -+ !dbus_message_iter_next(&strct) || -+ dbus_message_iter_get_arg_type(&strct) != DBUS_TYPE_ARRAY || -+ !dbus_message_iter_next(&strct) || -+ dbus_message_iter_get_arg_type(&strct) != DBUS_TYPE_ARRAY) { -+ r = -1; -+ goto fail; -+ } -+ -+ /* Root traversed over, extract the menu */ -+ wl_array_init(&menu->layout); -+ r = extract_menu(&strct, &menu->layout); -+ if (r < 0) -+ goto fail; -+ -+ r = real_show_menu(menu, &menu->layout); -+ if (r < 0) -+ goto fail; -+ -+ dbus_message_unref(reply); -+ dbus_pending_call_unref(pending); -+ return; -+ -+fail: -+ menu_destroy(menu); -+ if (reply) -+ dbus_message_unref(reply); -+ if (pending) -+ dbus_pending_call_unref(pending); -+} -+ -+static int -+request_layout(Menu *menu) -+{ -+ DBusMessage *msg = NULL; -+ DBusMessageIter iter = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ DBusMessageIter strings = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ DBusPendingCall *pending = NULL; -+ dbus_int32_t parentid, depth; -+ int r; -+ -+ parentid = 0; -+ depth = -1; -+ -+ /* menu busobj request answer didn't arrive yet. */ -+ if (!menu->busobj) { -+ r = -1; -+ goto fail; -+ } -+ -+ msg = dbus_message_new_method_call(menu->busname, menu->busobj, -+ DBUSMENU_IFACE, "GetLayout"); -+ if (!msg) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_iter_init_append(msg, &iter); -+ if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, -+ &parentid) || -+ !dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &depth) || -+ !dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, -+ DBUS_TYPE_STRING_AS_STRING, -+ &strings) || -+ !dbus_message_iter_close_container(&iter, &strings)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ if (!dbus_connection_send_with_reply(menu->conn, msg, &pending, -1) || -+ !dbus_pending_call_set_notify(pending, layout_ready, menu, NULL)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_unref(msg); -+ return 0; -+ -+fail: -+ if (pending) { -+ dbus_pending_call_cancel(pending); -+ dbus_pending_call_unref(pending); -+ } -+ dbus_message_iter_abandon_container_if_open(&iter, &strings); -+ if (msg) -+ dbus_message_unref(msg); -+ menu_destroy(menu); -+ return r; -+} -+ -+static void -+about_to_show_handle(DBusPendingCall *pending, void *data) -+{ -+ Menu *menu = data; -+ -+ DBusMessage *reply = NULL; -+ -+ reply = dbus_pending_call_steal_reply(pending); -+ if (!reply) -+ goto fail; -+ -+ if (request_layout(menu) < 0) -+ goto fail; -+ -+ dbus_message_unref(reply); -+ dbus_pending_call_unref(pending); -+ return; -+ -+fail: -+ if (reply) -+ dbus_message_unref(reply); -+ if (pending) -+ dbus_pending_call_unref(pending); -+ menu_destroy(menu); -+} -+ -+void -+menu_show(DBusConnection *conn, struct wl_event_loop *loop, const char *busname, -+ const char *busobj, const char **menucmd) -+{ -+ DBusMessage *msg = NULL; -+ DBusPendingCall *pending = NULL; -+ Menu *menu = NULL; -+ char *busname_dup = NULL, *busobj_dup = NULL; -+ dbus_int32_t parentid = 0; -+ -+ menu = calloc(1, sizeof(Menu)); -+ busname_dup = strdup(busname); -+ busobj_dup = strdup(busobj); -+ if (!menu || !busname_dup || !busobj_dup) -+ goto fail; -+ -+ menu->conn = conn; -+ menu->loop = loop; -+ menu->busname = busname_dup; -+ menu->busobj = busobj_dup; -+ menu->menucmd = menucmd; -+ -+ msg = dbus_message_new_method_call(menu->busname, menu->busobj, -+ DBUSMENU_IFACE, "AboutToShow"); -+ if (!msg) -+ goto fail; -+ -+ if (!dbus_message_append_args(msg, DBUS_TYPE_INT32, &parentid, -+ DBUS_TYPE_INVALID) || -+ !dbus_connection_send_with_reply(menu->conn, msg, &pending, -1) || -+ !dbus_pending_call_set_notify(pending, about_to_show_handle, menu, -+ NULL)) { -+ goto fail; -+ } -+ -+ dbus_message_unref(msg); -+ return; -+ -+fail: -+ if (pending) -+ dbus_pending_call_unref(pending); -+ if (msg) -+ dbus_message_unref(msg); -+ free(menu); -+} -diff --git a/systray/menu.h b/systray/menu.h -new file mode 100644 -index 0000000..7f48ada ---- /dev/null -+++ b/systray/menu.h -@@ -0,0 +1,11 @@ -+#ifndef MENU_H -+#define MENU_H -+ -+#include -+#include -+ -+/* The menu is built on demand and not kept around */ -+void menu_show (DBusConnection *conn, struct wl_event_loop *loop, -+ const char *busname, const char *busobj, const char **menucmd); -+ -+#endif /* MENU_H */ -diff --git a/systray/tray.c b/systray/tray.c -new file mode 100644 -index 0000000..7f9b1b0 ---- /dev/null -+++ b/systray/tray.c -@@ -0,0 +1,237 @@ -+#include "tray.h" -+ -+#include "icon.h" -+#include "item.h" -+#include "menu.h" -+#include "watcher.h" -+ -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#define PIXMAN_COLOR(hex) \ -+ { .red = ((hex >> 24) & 0xff) * 0x101, \ -+ .green = ((hex >> 16) & 0xff) * 0x101, \ -+ .blue = ((hex >> 8) & 0xff) * 0x101, \ -+ .alpha = (hex & 0xff) * 0x101 } -+ -+static Watcher * -+tray_get_watcher(const Tray *tray) -+{ -+ if (!tray) -+ return NULL; -+ -+ return tray->watcher; -+} -+ -+static pixman_image_t * -+createcanvas(int width, int height, int bgcolor) -+{ -+ pixman_image_t *src, *dest; -+ pixman_color_t bgcolor_pix = PIXMAN_COLOR(bgcolor); -+ -+ dest = pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height, NULL, -+ 0); -+ src = pixman_image_create_solid_fill(&bgcolor_pix); -+ -+ pixman_image_composite32(PIXMAN_OP_SRC, src, NULL, dest, 0, 0, 0, 0, 0, -+ 0, width, height); -+ -+ pixman_image_unref(src); -+ return dest; -+} -+ -+void -+tray_update(Tray *tray) -+{ -+ Item *item; -+ Watcher *watcher; -+ int icon_size, i = 0, canvas_width, canvas_height, n_items, spacing; -+ pixman_image_t *canvas = NULL, *img; -+ -+ watcher = tray_get_watcher(tray); -+ n_items = watcher_get_n_items(watcher); -+ -+ if (!n_items) { -+ if (tray->image) { -+ pixman_image_unref(tray->image); -+ tray->image = NULL; -+ } -+ tray->cb(tray->monitor); -+ return; -+ } -+ -+ icon_size = tray->height; -+ spacing = tray->spacing; -+ canvas_width = n_items * (icon_size + spacing) + spacing; -+ canvas_height = tray->height; -+ -+ canvas = createcanvas(canvas_width, canvas_height, tray->scheme[1]); -+ if (!canvas) -+ goto fail; -+ -+ wl_list_for_each(item, &watcher->items, link) { -+ int slot_x_start = spacing + i * (icon_size + spacing); -+ int slot_x_end = slot_x_start + icon_size + spacing; -+ int slot_x_width = slot_x_end - slot_x_start; -+ -+ int slot_y_start = 0; -+ int slot_y_end = canvas_height; -+ int slot_y_width = slot_y_end - slot_y_start; -+ -+ if (item->icon) { -+ /* Real icon */ -+ img = item->icon->img; -+ if (resize_image(img, icon_size, icon_size) < 0) -+ goto fail; -+ pixman_image_composite32(PIXMAN_OP_OVER, img, NULL, -+ canvas, 0, 0, 0, 0, -+ slot_x_start, 0, canvas_width, -+ canvas_height); -+ -+ } else if (item->appid) { -+ /* Font glyph alpha mask */ -+ const struct fcft_glyph *g; -+ int pen_y, pen_x; -+ pixman_color_t fg_color = PIXMAN_COLOR(tray->scheme[0]); -+ pixman_image_t *fg; -+ -+ if (item->fallback_icon) { -+ g = item->fallback_icon; -+ } else { -+ g = createfallbackicon(item->appid, -+ item->fgcolor, -+ tray->font); -+ if (!g) -+ goto fail; -+ item->fallback_icon = g; -+ } -+ -+ pen_x = slot_x_start + (slot_x_width - g->width) / 2; -+ pen_y = slot_y_start + (slot_y_width - g->height) / 2; -+ -+ fg = pixman_image_create_solid_fill(&fg_color); -+ pixman_image_composite32(PIXMAN_OP_OVER, fg, g->pix, -+ canvas, 0, 0, 0, 0, pen_x, -+ pen_y, canvas_width, -+ canvas_height); -+ pixman_image_unref(fg); -+ } -+ i++; -+ } -+ -+ if (tray->image) -+ pixman_image_unref(tray->image); -+ tray->image = canvas; -+ tray->cb(tray->monitor); -+ -+ return; -+ -+fail: -+ if (canvas) -+ pixman_image_unref(canvas); -+ return; -+} -+ -+void -+destroytray(Tray *tray) -+{ -+ if (tray->image) -+ pixman_image_unref(tray->image); -+ if (tray->font) -+ fcft_destroy(tray->font); -+ free(tray); -+} -+ -+Tray * -+createtray(void *monitor, int height, int spacing, uint32_t *colorscheme, -+ const char **fonts, const char *fontattrs, TrayNotifyCb cb, -+ Watcher *watcher) -+{ -+ Tray *tray = NULL; -+ char fontattrs_my[128]; -+ struct fcft_font *font = NULL; -+ -+ sprintf(fontattrs_my, "%s:%s", fontattrs, "weight:bold"); -+ -+ tray = calloc(1, sizeof(Tray)); -+ font = fcft_from_name(1, fonts, fontattrs_my); -+ if (!tray || !font) -+ goto fail; -+ -+ tray->monitor = monitor; -+ tray->height = height; -+ tray->spacing = spacing; -+ tray->scheme = colorscheme; -+ tray->cb = cb; -+ tray->watcher = watcher; -+ tray->font = font; -+ -+ return tray; -+ -+fail: -+ if (font) -+ fcft_destroy(font); -+ free(tray); -+ return NULL; -+} -+ -+int -+tray_get_width(const Tray *tray) -+{ -+ if (tray && tray->image) -+ return pixman_image_get_width(tray->image); -+ else -+ return 0; -+} -+ -+int -+tray_get_icon_width(const Tray *tray) -+{ -+ if (!tray) -+ return 0; -+ -+ return tray->height; -+} -+ -+void -+tray_rightclicked(Tray *tray, unsigned int index, const char **menucmd) -+{ -+ Item *item; -+ Watcher *watcher; -+ unsigned int count = 0; -+ -+ watcher = tray_get_watcher(tray); -+ -+ wl_list_for_each(item, &watcher->items, link) { -+ if (count == index) { -+ menu_show(watcher->conn, watcher->loop, item->busname, -+ item->menu_busobj, menucmd); -+ return; -+ } -+ count++; -+ } -+} -+ -+void -+tray_leftclicked(Tray *tray, unsigned int index) -+{ -+ Item *item; -+ Watcher *watcher; -+ unsigned int count = 0; -+ -+ watcher = tray_get_watcher(tray); -+ -+ wl_list_for_each(item, &watcher->items, link) { -+ if (count == index) { -+ item_activate(item); -+ return; -+ } -+ count++; -+ } -+} -diff --git a/systray/tray.h b/systray/tray.h -new file mode 100644 -index 0000000..af4e5e3 ---- /dev/null -+++ b/systray/tray.h -@@ -0,0 +1,37 @@ -+#ifndef TRAY_H -+#define TRAY_H -+ -+#include "watcher.h" -+ -+#include -+#include -+ -+#include -+ -+typedef void (*TrayNotifyCb)(void *data); -+ -+typedef struct { -+ pixman_image_t *image; -+ struct fcft_font *font; -+ uint32_t *scheme; -+ TrayNotifyCb cb; -+ Watcher *watcher; -+ void *monitor; -+ int height; -+ int spacing; -+ -+ struct wl_list link; -+} Tray; -+ -+Tray *createtray (void *monitor, int height, int spacing, uint32_t *colorscheme, -+ const char **fonts, const char *fontattrs, TrayNotifyCb cb, -+ Watcher *watcher); -+void destroytray (Tray *tray); -+ -+int tray_get_width (const Tray *tray); -+int tray_get_icon_width (const Tray *tray); -+void tray_update (Tray *tray); -+void tray_leftclicked (Tray *tray, unsigned int index); -+void tray_rightclicked (Tray *tray, unsigned int index, const char **menucmd); -+ -+#endif /* TRAY_H */ -diff --git a/systray/watcher.c b/systray/watcher.c -new file mode 100644 -index 0000000..8dd84b9 ---- /dev/null -+++ b/systray/watcher.c -@@ -0,0 +1,551 @@ -+#include "watcher.h" -+ -+#include "item.h" -+#include "tray.h" -+ -+#include -+#include -+ -+#include -+#include -+#include -+ -+// IWYU pragma: no_include "dbus/dbus-protocol.h" -+// IWYU pragma: no_include "dbus/dbus-shared.h" -+ -+static const char *const match_rule = -+ "type='signal'," -+ "interface='" DBUS_INTERFACE_DBUS -+ "'," -+ "member='NameOwnerChanged'"; -+ -+static const char *const snw_xml = -+ "\n" -+ "\n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ " \n" -+ "\n"; -+ -+static void -+unregister_item(Watcher *watcher, Item *item) -+{ -+ wl_list_remove(&item->link); -+ destroyitem(item); -+ -+ watcher_update_trays(watcher); -+} -+ -+static Item * -+item_name_to_ptr(const Watcher *watcher, const char *busname) -+{ -+ Item *item; -+ -+ wl_list_for_each(item, &watcher->items, link) { -+ if (!item || !item->busname) -+ return NULL; -+ if (strcmp(item->busname, busname) == 0) -+ return item; -+ } -+ -+ return NULL; -+} -+ -+static DBusHandlerResult -+handle_nameowner_changed(Watcher *watcher, DBusConnection *conn, -+ DBusMessage *msg) -+{ -+ char *name, *old_owner, *new_owner; -+ Item *item; -+ -+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name, -+ DBUS_TYPE_STRING, &old_owner, -+ DBUS_TYPE_STRING, &new_owner, -+ DBUS_TYPE_INVALID)) { -+ return DBUS_HANDLER_RESULT_HANDLED; -+ } -+ -+ if (*new_owner != '\0' || *name == '\0') -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+ item = item_name_to_ptr(watcher, name); -+ if (!item) -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+ unregister_item(watcher, item); -+ -+ return DBUS_HANDLER_RESULT_HANDLED; -+} -+ -+static DBusHandlerResult -+filter_bus(DBusConnection *conn, DBusMessage *msg, void *data) -+{ -+ Watcher *watcher = data; -+ -+ if (dbus_message_is_signal(msg, DBUS_INTERFACE_DBUS, -+ "NameOwnerChanged")) -+ return handle_nameowner_changed(watcher, conn, msg); -+ -+ else -+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -+} -+ -+static DBusHandlerResult -+respond_register_item(Watcher *watcher, DBusConnection *conn, DBusMessage *msg) -+{ -+ DBusHandlerResult res = DBUS_HANDLER_RESULT_HANDLED; -+ -+ DBusMessage *reply = NULL; -+ Item *item; -+ const char *sender, *param, *busobj, *registree_name; -+ -+ if (!(sender = dbus_message_get_sender(msg)) || -+ !dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, ¶m, -+ DBUS_TYPE_INVALID)) { -+ reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, -+ "Malformed message"); -+ goto send; -+ } -+ -+ switch (*param) { -+ case '/': -+ registree_name = sender; -+ busobj = param; -+ break; -+ case ':': -+ registree_name = param; -+ busobj = SNI_OPATH; -+ break; -+ default: -+ reply = dbus_message_new_error_printf(msg, -+ DBUS_ERROR_INVALID_ARGS, -+ "Bad argument: \"%s\"", -+ param); -+ goto send; -+ } -+ -+ if (*registree_name != ':' || -+ !dbus_validate_bus_name(registree_name, NULL)) { -+ reply = dbus_message_new_error_printf(msg, -+ DBUS_ERROR_INVALID_ARGS, -+ "Invalid busname %s", -+ registree_name); -+ goto send; -+ } -+ -+ if (item_name_to_ptr(watcher, registree_name)) { -+ reply = dbus_message_new_error_printf(msg, -+ DBUS_ERROR_INVALID_ARGS, -+ "%s already tracked", -+ registree_name); -+ goto send; -+ } -+ -+ item = createitem(registree_name, busobj, watcher); -+ wl_list_insert(&watcher->items, &item->link); -+ watcher_update_trays(watcher); -+ -+ reply = dbus_message_new_method_return(msg); -+ -+send: -+ if (!reply || !dbus_connection_send(conn, reply, NULL)) -+ res = DBUS_HANDLER_RESULT_NEED_MEMORY; -+ -+ if (reply) -+ dbus_message_unref(reply); -+ return res; -+} -+ -+static int -+get_registered_items(const Watcher *watcher, DBusMessageIter *iter) -+{ -+ DBusMessageIter names = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ Item *item; -+ int r; -+ -+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, -+ DBUS_TYPE_STRING_AS_STRING, -+ &names)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ wl_list_for_each(item, &watcher->items, link) { -+ if (!dbus_message_iter_append_basic(&names, DBUS_TYPE_STRING, -+ &item->busname)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ } -+ -+ dbus_message_iter_close_container(iter, &names); -+ return 0; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(iter, &names); -+ return r; -+} -+ -+static int -+get_registered_items_variant(const Watcher *watcher, DBusMessageIter *iter) -+{ -+ DBusMessageIter variant = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ int r; -+ -+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "as", -+ &variant) || -+ get_registered_items(watcher, &variant) < 0) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_iter_close_container(iter, &variant); -+ return 0; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(iter, &variant); -+ return r; -+} -+ -+static int -+get_isregistered(DBusMessageIter *iter) -+{ -+ DBusMessageIter variant = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ dbus_bool_t is_registered = TRUE; -+ int r; -+ -+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, -+ DBUS_TYPE_BOOLEAN_AS_STRING, -+ &variant) || -+ !dbus_message_iter_append_basic(&variant, DBUS_TYPE_BOOLEAN, -+ &is_registered)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_iter_close_container(iter, &variant); -+ return 0; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(iter, &variant); -+ return r; -+} -+ -+static int -+get_version(DBusMessageIter *iter) -+{ -+ DBusMessageIter variant = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ dbus_int32_t protovers = 0; -+ int r; -+ -+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, -+ DBUS_TYPE_INT32_AS_STRING, -+ &variant) || -+ !dbus_message_iter_append_basic(&variant, DBUS_TYPE_INT32, -+ &protovers)) { -+ r = -ENOMEM; -+ goto fail; -+ } -+ -+ dbus_message_iter_close_container(iter, &variant); -+ return 0; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(iter, &variant); -+ return r; -+} -+ -+static DBusHandlerResult -+respond_get_prop(Watcher *watcher, DBusConnection *conn, DBusMessage *msg) -+{ -+ DBusError err = DBUS_ERROR_INIT; -+ DBusMessage *reply = NULL; -+ DBusMessageIter iter = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ const char *iface, *prop; -+ -+ if (!dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &iface, -+ DBUS_TYPE_STRING, &prop, -+ DBUS_TYPE_INVALID)) { -+ reply = dbus_message_new_error(msg, err.name, err.message); -+ dbus_error_free(&err); -+ goto send; -+ } -+ -+ if (strcmp(iface, SNW_IFACE) != 0) { -+ reply = dbus_message_new_error_printf( -+ msg, DBUS_ERROR_UNKNOWN_INTERFACE, -+ "Unknown interface \"%s\"", iface); -+ goto send; -+ } -+ -+ reply = dbus_message_new_method_return(msg); -+ if (!reply) -+ goto fail; -+ -+ if (strcmp(prop, "ProtocolVersion") == 0) { -+ dbus_message_iter_init_append(reply, &iter); -+ if (get_version(&iter) < 0) -+ goto fail; -+ -+ } else if (strcmp(prop, "IsStatusNotifierHostRegistered") == 0) { -+ dbus_message_iter_init_append(reply, &iter); -+ if (get_isregistered(&iter) < 0) -+ goto fail; -+ -+ } else if (strcmp(prop, "RegisteredStatusNotifierItems") == 0) { -+ dbus_message_iter_init_append(reply, &iter); -+ if (get_registered_items_variant(watcher, &iter) < 0) -+ goto fail; -+ -+ } else { -+ dbus_message_unref(reply); -+ reply = dbus_message_new_error_printf( -+ reply, DBUS_ERROR_UNKNOWN_PROPERTY, -+ "Property \"%s\" does not exist", prop); -+ } -+ -+send: -+ if (!reply || !dbus_connection_send(conn, reply, NULL)) -+ goto fail; -+ -+ if (reply) -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+fail: -+ if (reply) -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_NEED_MEMORY; -+} -+ -+static DBusHandlerResult -+respond_all_props(Watcher *watcher, DBusConnection *conn, DBusMessage *msg) -+{ -+ DBusMessage *reply = NULL; -+ DBusMessageIter array = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ DBusMessageIter dict = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ DBusMessageIter iter = DBUS_MESSAGE_ITER_INIT_CLOSED; -+ const char *prop; -+ -+ reply = dbus_message_new_method_return(msg); -+ if (!reply) -+ goto fail; -+ dbus_message_iter_init_append(reply, &iter); -+ -+ if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", -+ &array)) -+ goto fail; -+ -+ prop = "ProtocolVersion"; -+ if (!dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, -+ NULL, &dict) || -+ !dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &prop) || -+ get_version(&dict) < 0 || -+ !dbus_message_iter_close_container(&array, &dict)) { -+ goto fail; -+ } -+ -+ prop = "IsStatusNotifierHostRegistered"; -+ if (!dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, -+ NULL, &dict) || -+ !dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &prop) || -+ get_isregistered(&dict) < 0 || -+ !dbus_message_iter_close_container(&array, &dict)) { -+ goto fail; -+ } -+ -+ prop = "RegisteredStatusNotifierItems"; -+ if (!dbus_message_iter_open_container(&array, DBUS_TYPE_DICT_ENTRY, -+ NULL, &dict) || -+ !dbus_message_iter_append_basic(&dict, DBUS_TYPE_STRING, &prop) || -+ get_registered_items_variant(watcher, &dict) < 0 || -+ !dbus_message_iter_close_container(&array, &dict)) { -+ goto fail; -+ } -+ -+ if (!dbus_message_iter_close_container(&iter, &array) || -+ !dbus_connection_send(conn, reply, NULL)) { -+ goto fail; -+ } -+ -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+fail: -+ dbus_message_iter_abandon_container_if_open(&array, &dict); -+ dbus_message_iter_abandon_container_if_open(&iter, &array); -+ if (reply) -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_NEED_MEMORY; -+} -+ -+static DBusHandlerResult -+respond_introspect(DBusConnection *conn, DBusMessage *msg) -+{ -+ DBusMessage *reply = NULL; -+ -+ reply = dbus_message_new_method_return(msg); -+ if (!reply) -+ goto fail; -+ -+ if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &snw_xml, -+ DBUS_TYPE_INVALID) || -+ !dbus_connection_send(conn, reply, NULL)) { -+ goto fail; -+ } -+ -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_HANDLED; -+ -+fail: -+ if (reply) -+ dbus_message_unref(reply); -+ return DBUS_HANDLER_RESULT_NEED_MEMORY; -+} -+ -+static DBusHandlerResult -+snw_message_handler(DBusConnection *conn, DBusMessage *msg, void *data) -+{ -+ Watcher *watcher = data; -+ -+ if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, -+ "Introspect")) -+ return respond_introspect(conn, msg); -+ -+ else if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, -+ "GetAll")) -+ return respond_all_props(watcher, conn, msg); -+ -+ else if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, -+ "Get")) -+ return respond_get_prop(watcher, conn, msg); -+ -+ else if (dbus_message_is_method_call(msg, SNW_IFACE, -+ "RegisterStatusNotifierItem")) -+ return respond_register_item(watcher, conn, msg); -+ -+ else -+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -+} -+ -+static const DBusObjectPathVTable snw_vtable = { .message_function = -+ snw_message_handler }; -+ -+void -+watcher_start(Watcher *watcher, DBusConnection *conn, -+ struct wl_event_loop *loop) -+{ -+ DBusError err = DBUS_ERROR_INIT; -+ int r, flags; -+ -+ wl_list_init(&watcher->items); -+ wl_list_init(&watcher->trays); -+ watcher->conn = conn; -+ watcher->loop = loop; -+ -+ flags = DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE; -+ r = dbus_bus_request_name(conn, SNW_NAME, -+ flags, NULL); -+ if (r != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) -+ goto fail; -+ -+ if (!dbus_connection_add_filter(conn, filter_bus, watcher, NULL)) { -+ dbus_bus_release_name(conn, SNW_NAME, NULL); -+ goto fail; -+ } -+ -+ dbus_bus_add_match(conn, match_rule, &err); -+ if (dbus_error_is_set(&err)) { -+ dbus_connection_remove_filter(conn, filter_bus, watcher); -+ dbus_bus_release_name(conn, SNW_NAME, NULL); -+ goto fail; -+ } -+ -+ if (!dbus_connection_register_object_path(conn, SNW_OPATH, &snw_vtable, -+ watcher)) { -+ dbus_bus_remove_match(conn, match_rule, NULL); -+ dbus_connection_remove_filter(conn, filter_bus, watcher); -+ dbus_bus_release_name(conn, SNW_NAME, NULL); -+ goto fail; -+ } -+ -+ watcher->running = 1; -+ return; -+ -+fail: -+ fprintf(stderr, "Couldn't start watcher, systray not available\n"); -+ dbus_error_free(&err); -+ return; -+} -+ -+void -+watcher_stop(Watcher *watcher) -+{ -+ dbus_connection_unregister_object_path(watcher->conn, SNW_OPATH); -+ dbus_bus_remove_match(watcher->conn, match_rule, NULL); -+ dbus_connection_remove_filter(watcher->conn, filter_bus, watcher); -+ dbus_bus_release_name(watcher->conn, SNW_NAME, NULL); -+ watcher->running = 0; -+} -+ -+int -+watcher_get_n_items(const Watcher *watcher) -+{ -+ return wl_list_length(&watcher->items); -+} -+ -+void -+watcher_update_trays(Watcher *watcher) -+{ -+ Tray *tray; -+ -+ wl_list_for_each(tray, &watcher->trays, link) -+ tray_update(tray); -+} -diff --git a/systray/watcher.h b/systray/watcher.h -new file mode 100644 -index 0000000..127eb64 ---- /dev/null -+++ b/systray/watcher.h -@@ -0,0 +1,35 @@ -+#ifndef WATCHER_H -+#define WATCHER_H -+ -+#include -+#include -+#include -+ -+/* -+ * The FDO spec says "org.freedesktop.StatusNotifierWatcher"[1], -+ * but both the client libraries[2,3] actually use "org.kde.StatusNotifierWatcher" -+ * -+ * [1] https://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/ -+ * [2] https://github.com/AyatanaIndicators/libayatana-appindicator-glib -+ * [3] https://invent.kde.org/frameworks/kstatusnotifieritem -+ */ -+#define SNW_NAME "org.kde.StatusNotifierWatcher" -+#define SNW_OPATH "/StatusNotifierWatcher" -+#define SNW_IFACE "org.kde.StatusNotifierWatcher" -+ -+typedef struct { -+ struct wl_list items; -+ struct wl_list trays; -+ struct wl_event_loop *loop; -+ DBusConnection *conn; -+ int running; -+} Watcher; -+ -+void watcher_start (Watcher *watcher, DBusConnection *conn, -+ struct wl_event_loop *loop); -+void watcher_stop (Watcher *watcher); -+ -+int watcher_get_n_items (const Watcher *watcher); -+void watcher_update_trays (Watcher *watcher); -+ -+#endif /* WATCHER_H */ --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/bar/README.md b/dwl-bak/dwl-patches/patches/bar/README.md deleted file mode 100644 index 4955753..0000000 --- a/dwl-bak/dwl-patches/patches/bar/README.md +++ /dev/null @@ -1,34 +0,0 @@ -### Description - -Add a bar identical to dwm's bar. - -To use a status-bar, you can pass in status text via stdin: -``` -slstatus -s | dwl -``` - -### Dependencies -* tllist (build dependency, required & pulled automatically by fcft) -* fcft -* pixman - -### Download -- [main 2025-07-29](/dwl/dwl-patches/raw/branch/main/patches/bar/bar.patch) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/bar/bar-0.7.patch) -- [0.6](/dwl/dwl-patches/raw/branch/main/patches/bar/bar-0.6.patch) - -It is required to remove, regenerate or update `config.h` after applying the patch, -since it makes changes to the configuration structure. -For example, in the `pertag` patch, `TAGCOUNT` must be replaced with `LENGTH(tags)`. - -Below is a preview of the patch. - -![bar patch preview](bar.png) - -### Authors -- [sewn](https://codeberg.org/sewn) - -### Credits -- [MadcowOG](https://github.com/MadcowOG) -- [kolumni](https://github.com/kolunmi/dwlb) - diff --git a/dwl-bak/dwl-patches/patches/bar/bar-0.6.patch b/dwl-bak/dwl-patches/patches/bar/bar-0.6.patch deleted file mode 100644 index 70c9f12..0000000 --- a/dwl-bak/dwl-patches/patches/bar/bar-0.6.patch +++ /dev/null @@ -1,1245 +0,0 @@ -From 85e40afc2ad8acba453ce8c57233542e340c1c2b Mon Sep 17 00:00:00 2001 -From: sewn -Date: Fri, 23 Aug 2024 09:42:04 +0300 -Subject: [PATCH] Implement dwm bar clone - ---- - Makefile | 2 +- - config.def.h | 31 +++- - drwl.h | 311 ++++++++++++++++++++++++++++++++++++ - dwl.c | 442 +++++++++++++++++++++++++++++++++++++++++---------- - 4 files changed, 691 insertions(+), 95 deletions(-) - create mode 100644 drwl.h - -diff --git a/Makefile b/Makefile -index 0d651e7..2a11396 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wlroots wayland-server xkbcommon libinput $(XLIBS) -+PKGS = wlroots wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -diff --git a/config.def.h b/config.def.h -index 22d2171..5d1dc2b 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,15 +7,21 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static const int showbar = 1; /* 0 means no bar */ -+static const int topbar = 1; /* 0 means bottom bar */ -+static const char *fonts[] = {"monospace:size=10"}; -+static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static uint32_t colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, -+ [SchemeUrg] = { 0, 0, 0x770000ff }, -+}; - - /* tagging - TAGCOUNT must be no greater than 31 */ --#define TAGCOUNT (9) -+static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - - /* logging */ - static int log_level = WLR_ERROR; -@@ -127,6 +133,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -@@ -170,7 +177,15 @@ static const Key keys[] = { - }; - - static const Button buttons[] = { -- { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -- { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkLtSymbol, 0, BTN_LEFT, setlayout, {.v = &layouts[0]} }, -+ { ClkLtSymbol, 0, BTN_RIGHT, setlayout, {.v = &layouts[2]} }, -+ { ClkTitle, 0, BTN_MIDDLE, zoom, {0} }, -+ { ClkStatus, 0, BTN_MIDDLE, spawn, {.v = termcmd} }, -+ { ClkClient, MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -+ { ClkClient, MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { ClkClient, MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkTagBar, 0, BTN_LEFT, view, {0} }, -+ { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, -+ { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, -+ { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, - }; -diff --git a/drwl.h b/drwl.h -new file mode 100644 -index 0000000..b06a736 ---- /dev/null -+++ b/drwl.h -@@ -0,0 +1,311 @@ -+/* -+ * drwl - https://codeberg.org/sewn/drwl -+ * -+ * Copyright (c) 2023-2024 sewn -+ * Copyright (c) 2024 notchoc -+ * -+ * 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. -+ * -+ * The UTF-8 Decoder included is from Bjoern Hoehrmann: -+ * Copyright (c) 2008-2010 Bjoern Hoehrmann -+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. -+ */ -+#pragma once -+ -+#include -+#include -+#include -+ -+enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ -+ -+typedef struct fcft_font Fnt; -+typedef pixman_image_t Img; -+ -+typedef struct { -+ Img *image; -+ Fnt *font; -+ uint32_t *scheme; -+} Drwl; -+ -+#define UTF8_ACCEPT 0 -+#define UTF8_REJECT 12 -+#define UTF8_INVALID 0xFFFD -+ -+static const uint8_t utf8d[] = { -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, -+ -+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, -+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, -+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, -+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, -+ 12,36,12,12,12,12,12,12,12,12,12,12, -+}; -+ -+static inline uint32_t -+utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -+{ -+ uint32_t type = utf8d[byte]; -+ -+ *codep = (*state != UTF8_ACCEPT) ? -+ (byte & 0x3fu) | (*codep << 6) : -+ (0xff >> type) & (byte); -+ -+ *state = utf8d[256 + *state + type]; -+ return *state; -+} -+ -+static int -+drwl_init(void) -+{ -+ fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); -+ return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -+} -+ -+static Drwl * -+drwl_create(void) -+{ -+ Drwl *drwl; -+ -+ if (!(drwl = calloc(1, sizeof(Drwl)))) -+ return NULL; -+ -+ return drwl; -+} -+ -+static void -+drwl_setfont(Drwl *drwl, Fnt *font) -+{ -+ if (drwl) -+ drwl->font = font; -+} -+ -+static void -+drwl_setimage(Drwl *drwl, Img *image) -+{ -+ if (drwl) -+ drwl->image = image; -+} -+ -+static Fnt * -+drwl_font_create(Drwl *drwl, size_t count, -+ const char *names[static count], const char *attributes) -+{ -+ Fnt *font = fcft_from_name(count, names, attributes); -+ if (drwl) -+ drwl_setfont(drwl, font); -+ return font; -+} -+ -+static void -+drwl_font_destroy(Fnt *font) -+{ -+ fcft_destroy(font); -+} -+ -+static inline pixman_color_t -+convert_color(uint32_t clr) -+{ -+ return (pixman_color_t){ -+ ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ (clr & 0xFF) * 0x101 -+ }; -+} -+ -+static void -+drwl_setscheme(Drwl *drwl, uint32_t *scm) -+{ -+ if (drwl) -+ drwl->scheme = scm; -+} -+ -+static Img * -+drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -+{ -+ Img *image; -+ pixman_region32_t clip; -+ -+ image = pixman_image_create_bits_no_clear( -+ PIXMAN_a8r8g8b8, w, h, bits, w * 4); -+ if (!image) -+ return NULL; -+ pixman_region32_init_rect(&clip, 0, 0, w, h); -+ pixman_image_set_clip_region32(image, &clip); -+ pixman_region32_fini(&clip); -+ -+ if (drwl) -+ drwl_setimage(drwl, image); -+ return image; -+} -+ -+static void -+drwl_rect(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ int filled, int invert) -+{ -+ pixman_color_t clr; -+ if (!drwl || !drwl->scheme || !drwl->image) -+ return; -+ -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ if (filled) -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, -+ &(pixman_rectangle16_t){x, y, w, h}); -+ else -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, -+ (pixman_rectangle16_t[4]){ -+ { x, y, w, 1 }, -+ { x, y + h - 1, w, 1 }, -+ { x, y, 1, h }, -+ { x + w - 1, y, 1, h }}); -+} -+ -+static int -+drwl_text(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ unsigned int lpad, const char *text, int invert) -+{ -+ int ty; -+ int render = x || y || w || h; -+ long x_kern; -+ uint32_t cp = 0, last_cp = 0, state; -+ pixman_color_t clr; -+ pixman_image_t *fg_pix = NULL; -+ int noellipsis = 0; -+ const struct fcft_glyph *glyph, *eg = NULL; -+ int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; -+ -+ if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) -+ return 0; -+ -+ if (!render) { -+ w = invert ? invert : ~invert; -+ } else { -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ fg_pix = pixman_image_create_solid_fill(&clr); -+ -+ drwl_rect(drwl, x, y, w, h, 1, !invert); -+ -+ x += lpad; -+ w -= lpad; -+ } -+ -+ if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) -+ fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; -+ -+ if (render) -+ eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); -+ -+ for (const char *p = text, *pp; pp = p, *p; p++) { -+ for (state = UTF8_ACCEPT; *p && -+ utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) -+ ; -+ if (!*p || state == UTF8_REJECT) { -+ cp = UTF8_INVALID; -+ if (p > pp) -+ p--; -+ } -+ -+ glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); -+ if (!glyph) -+ continue; -+ -+ x_kern = 0; -+ if (last_cp) -+ fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); -+ last_cp = cp; -+ -+ ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; -+ -+ if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && -+ *(p + 1) != '\0') { -+ /* cannot fit ellipsis after current codepoint */ -+ if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { -+ noellipsis = 1; -+ } else { -+ w -= eg->advance.x; -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, -+ x + eg->x, ty - eg->y, eg->width, eg->height); -+ } -+ } -+ -+ if ((x_kern + glyph->advance.x) > w) -+ break; -+ -+ x += x_kern; -+ -+ if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) -+ /* pre-rendered glyphs (eg. emoji) */ -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ else if (render) -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ -+ x += glyph->advance.x; -+ w -= glyph->advance.x; -+ } -+ -+ if (render) -+ pixman_image_unref(fg_pix); -+ -+ return x + (render ? w : 0); -+} -+ -+static unsigned int -+drwl_font_getwidth(Drwl *drwl, const char *text) -+{ -+ if (!drwl || !drwl->font || !text) -+ return 0; -+ return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -+} -+ -+static void -+drwl_image_destroy(Img *image) -+{ -+ pixman_image_unref(image); -+} -+ -+static void -+drwl_destroy(Drwl *drwl) -+{ -+ if (drwl->font) -+ drwl_font_destroy(drwl->font); -+ if (drwl->image) -+ drwl_image_destroy(drwl->image); -+ free(drwl); -+} -+ -+static void -+drwl_fini(void) -+{ -+ fcft_fini(); -+} -diff --git a/dwl.c b/dwl.c -index 145fd01..ab1bc31 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -57,6 +58,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -67,6 +69,7 @@ - #endif - - #include "util.h" -+#include "drwl.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -75,14 +78,17 @@ - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) --#define TAGMASK ((1u << TAGCOUNT) - 1) -+#define TAGMASK ((1u << LENGTH(tags)) - 1) - #define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) -+#define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) - - /* enums */ -+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* clicks */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -96,6 +102,7 @@ typedef union { - } Arg; - - typedef struct { -+ unsigned int click; - unsigned int mod; - unsigned int button; - void (*func)(const Arg *); -@@ -185,10 +192,19 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - struct Monitor { - struct wl_list link; - struct wlr_output *wlr_output; - struct wlr_scene_output *scene_output; -+ struct wlr_scene_buffer *scene_buffer; /* bar buffer */ - struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */ - struct wl_listener frame; - struct wl_listener destroy; -@@ -196,6 +212,11 @@ struct Monitor { - struct wl_listener destroy_lock_surface; - struct wlr_session_lock_surface_v1 *lock_surface; - struct wlr_box m; /* monitor area, layout-relative */ -+ struct { -+ int width, height; -+ int real_width, real_height; /* non-scaled */ -+ float scale; -+ } b; /* bar area */ - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -@@ -207,6 +228,9 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int lrpad; - }; - - typedef struct { -@@ -249,6 +273,13 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static bool baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy); -+static void bufdestroy(struct wlr_buffer *buffer); -+static bool bufdatabegin(struct wlr_buffer *buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride); -+static void bufdataend(struct wlr_buffer *buffer); -+static Buffer *bufmon(Monitor *m); -+static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -282,6 +313,8 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawbar(Monitor *m); -+static void drawbars(void); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -309,7 +342,6 @@ static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int - static void outputmgrtest(struct wl_listener *listener, void *data); - static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); --static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); - static void rendermon(struct wl_listener *listener, void *data); -@@ -331,9 +363,11 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static int statusin(int fd, unsigned int mask, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -342,6 +376,7 @@ static void unlocksession(struct wl_listener *listener, void *data); - static void unmaplayersurfacenotify(struct wl_listener *listener, void *data); - static void unmapnotify(struct wl_listener *listener, void *data); - static void updatemons(struct wl_listener *listener, void *data); -+static void updatebar(Monitor *m); - static void updatetitle(struct wl_listener *listener, void *data); - static void urgent(struct wl_listener *listener, void *data); - static void view(const Arg *arg); -@@ -408,6 +443,15 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static char stext[256]; -+static struct wl_event_source *status_event_source; -+ -+static const struct wlr_buffer_impl buffer_impl = { -+ .destroy = bufdestroy, -+ .begin_data_ptr_access = bufdatabegin, -+ .end_data_ptr_access = bufdataend, -+}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -548,6 +592,11 @@ arrangelayers(Monitor *m) - if (!m->wlr_output->enabled) - return; - -+ if (m->scene_buffer->node.enabled) { -+ usable_area.height -= m->b.real_height; -+ usable_area.y += topbar ? m->b.real_height : 0; -+ } -+ - /* Arrange exclusive surfaces from top->bottom */ - for (i = 3; i >= 0; i--) - arrangelayer(m, &m->layers[i], &usable_area, 1); -@@ -590,17 +639,102 @@ axisnotify(struct wl_listener *listener, void *data) - event->delta_discrete, event->source); - } - -+bool -+baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy) -+{ -+ return true; -+} -+ -+void -+bufdestroy(struct wlr_buffer *wlr_buffer) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ if (buf->busy) -+ wl_list_remove(&buf->release.link); -+ drwl_image_destroy(buf->image); -+ free(buf); -+} -+ -+bool -+bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ -+ if (flags & WLR_BUFFER_DATA_PTR_ACCESS_WRITE) return false; -+ -+ *data = buf->data; -+ *stride = wlr_buffer->width * 4; -+ *format = DRM_FORMAT_ARGB8888; -+ -+ return true; -+} -+ -+void -+bufdataend(struct wlr_buffer *wlr_buffer) -+{ -+} -+ -+Buffer * -+bufmon(Monitor *m) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(m->pool); i++) { -+ if (m->pool[i]) { -+ if (m->pool[i]->busy) -+ continue; -+ buf = m->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (m->b.width * 4 * m->b.height)); -+ buf->image = drwl_image_create(NULL, m->b.width, m->b.height, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, m->b.width, m->b.height); -+ m->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(m->drw, buf->image); -+ return buf; -+} -+ -+void -+bufrelease(struct wl_listener *listener, void *data) -+{ -+ Buffer *buf = wl_container_of(listener, buf, release); -+ buf->busy = false; -+ wl_list_remove(&buf->release.link); -+} -+ - void - buttonpress(struct wl_listener *listener, void *data) - { -+ unsigned int i = 0, x = 0; -+ double cx; -+ unsigned int click; - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; -+ struct wlr_scene_node *node; -+ struct wlr_scene_buffer *buffer; - uint32_t mods; -+ Arg arg = {0}; - Client *c; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -+ click = ClkRoot; -+ xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -+ if (c) -+ click = ClkClient; -+ - switch (event->state) { - case WLR_BUTTON_PRESSED: - cursor_mode = CurPressed; -@@ -608,17 +742,34 @@ buttonpress(struct wl_listener *listener, void *data) - if (locked) - break; - -+ if (!c && !exclusive_focus && -+ (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && -+ (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { -+ cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ do -+ x += TEXTW(selmon, tags[i]); -+ while (cx >= x && ++i < LENGTH(tags)); -+ if (i < LENGTH(tags)) { -+ click = ClkTagBar; -+ arg.ui = 1 << i; -+ } else if (cx < x + TEXTW(selmon, selmon->ltsymbol)) -+ click = ClkLtSymbol; -+ else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2)) { -+ click = ClkStatus; -+ } else -+ click = ClkTitle; -+ } -+ - /* Change focus if the button was _pressed_ over a client */ - xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -- if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) -+ if (click == ClkClient && (!client_is_unmanaged(c) || client_wants_focus(c))) - focusclient(c, 1); - - keyboard = wlr_seat_get_keyboard(seat); - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { -- if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -- b->func(&b->arg); -+ if (CLEANMASK(mods) == CLEANMASK(b->mod) && event->button == b->button && click == b->click && b->func) { -+ b->func(click == ClkTagBar && b->arg.i == 0 ? &arg : &b->arg); - return; - } - } -@@ -689,6 +840,8 @@ cleanup(void) - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -+ -+ drwl_fini(); - } - - void -@@ -704,6 +857,12 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_layer_surface_v1_destroy(l->layer_surface); - } - -+ for (i = 0; i < LENGTH(m->pool); i++) -+ wlr_buffer_drop(&m->pool[i]->base); -+ -+ drwl_setimage(m->drw, NULL); -+ drwl_destroy(m->drw); -+ - wl_list_remove(&m->destroy.link); - wl_list_remove(&m->frame.link); - wl_list_remove(&m->link); -@@ -714,6 +873,7 @@ cleanupmon(struct wl_listener *listener, void *data) - - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); -+ wlr_scene_node_destroy(&m->scene_buffer->node); - free(m); - } - -@@ -743,7 +903,7 @@ closemon(Monitor *m) - setmon(c, selmon, c->tags); - } - focusclient(focustop(selmon), 1); -- printstatus(); -+ drawbars(); - } - - void -@@ -980,8 +1140,15 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_commit_state(wlr_output, &state); - wlr_output_state_finish(&state); - -+ if (!(m->drw = drwl_create())) -+ die("failed to create drwl context"); -+ -+ m->scene_buffer = wlr_scene_buffer_create(layers[LyrBottom], NULL); -+ m->scene_buffer->point_accepts_input = baracceptsinput; -+ updatebar(m); -+ - wl_list_insert(&mons, &m->link); -- printstatus(); -+ drawbars(); - - /* The xdg-protocol specifies: - * -@@ -1312,6 +1479,80 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+drawbar(Monitor *m) -+{ -+ int x, w, tw = 0; -+ int boxs = m->drw->font->height / 9; -+ int boxw = m->drw->font->height / 6 + 2; -+ uint32_t i, occ = 0, urg = 0; -+ Client *c; -+ Buffer *buf; -+ -+ if (!m->scene_buffer->node.enabled) -+ return; -+ if (!(buf = bufmon(m))) -+ return; -+ -+ /* draw status first so it can be overdrawn by tags later */ -+ if (m == selmon) { /* status is only drawn on selected monitor */ -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -+ drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ occ |= c->tags; -+ if (c->isurgent) -+ urg |= c->tags; -+ } -+ x = 0; -+ c = focustop(m); -+ for (i = 0; i < LENGTH(tags); i++) { -+ w = TEXTW(m, tags[i]); -+ drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); -+ if (occ & 1 << i) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, -+ m == selmon && c && c->tags & 1 << i, -+ urg & 1 << i); -+ x += w; -+ } -+ w = TEXTW(m, m->ltsymbol); -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); -+ -+ if ((w = m->b.width - tw - x) > m->b.height) { -+ if (c) { -+ drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -+ if (c && c->isfloating) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); -+ } else { -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); -+ } -+ } -+ -+ wlr_scene_buffer_set_dest_size(m->scene_buffer, -+ m->b.real_width, m->b.real_height); -+ wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x, -+ m->m.y + (topbar ? 0 : m->m.height - m->b.real_height)); -+ wlr_scene_buffer_set_buffer(m->scene_buffer, &buf->base); -+ wlr_buffer_unlock(&buf->base); -+} -+ -+void -+drawbars(void) -+{ -+ Monitor *m = NULL; -+ -+ wl_list_for_each(m, &mons, link) -+ drawbar(m); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1347,13 +1588,13 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeSel][ColBorder])); - } - - /* Deactivate old client if focus is changing */ - if (old && (!c || client_surface(c) != old)) { - /* If an overlay is focused, don't focus or activate the client, -- * but only update its position in fstack to render its border with focuscolor -+ * but only update its position in fstack to render its border with its color - * and focus it after the overlay is closed. */ - if (old_client_type == LayerShell && wlr_scene_node_coords( - &old_l->scene->node, &unused_lx, &unused_ly) -@@ -1364,12 +1605,11 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -- -+ client_set_border_color(old_c, (float[])COLOR(colors[SchemeNorm][ColBorder])); - client_activate_surface(old, 0); - } - } -- printstatus(); -+ drawbars(); - - if (!c) { - /* With no client, all we have left is to clear focus */ -@@ -1666,7 +1906,7 @@ mapnotify(struct wl_listener *listener, void *data) - - for (i = 0; i < 4; i++) { - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, -- c->isurgent ? urgentcolor : bordercolor); -+ (float[])COLOR(colors[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder])); - c->border[i]->node.data = c; - } - -@@ -1689,7 +1929,7 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -- printstatus(); -+ drawbars(); - - unset_fullscreen: - m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -@@ -1982,46 +2222,6 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - wlr_seat_pointer_notify_motion(seat, time, sx, sy); - } - --void --printstatus(void) --{ -- Monitor *m = NULL; -- Client *c; -- uint32_t occ, urg, sel; -- const char *appid, *title; -- -- wl_list_for_each(m, &mons, link) { -- occ = urg = 0; -- wl_list_for_each(c, &clients, link) { -- if (c->mon != m) -- continue; -- occ |= c->tags; -- if (c->isurgent) -- urg |= c->tags; -- } -- if ((c = focustop(m))) { -- title = client_get_title(c); -- appid = client_get_appid(c); -- printf("%s title %s\n", m->wlr_output->name, title ? title : broken); -- printf("%s appid %s\n", m->wlr_output->name, appid ? appid : broken); -- printf("%s fullscreen %d\n", m->wlr_output->name, c->isfullscreen); -- printf("%s floating %d\n", m->wlr_output->name, c->isfloating); -- sel = c->tags; -- } else { -- printf("%s title \n", m->wlr_output->name); -- printf("%s appid \n", m->wlr_output->name); -- printf("%s fullscreen \n", m->wlr_output->name); -- printf("%s floating \n", m->wlr_output->name); -- sel = 0; -- } -- -- printf("%s selmon %u\n", m->wlr_output->name, m == selmon); -- printf("%s tags %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"\n", -- m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); -- printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol); -- } -- fflush(stdout); --} - - void - powermgrsetmode(struct wl_listener *listener, void *data) -@@ -2175,30 +2375,17 @@ run(char *startup_cmd) - - /* Now that the socket exists and the backend is started, run the startup command */ - if (startup_cmd) { -- int piperw[2]; -- if (pipe(piperw) < 0) -- die("startup: pipe:"); - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ close(STDIN_FILENO); - setsid(); -- dup2(piperw[0], STDIN_FILENO); -- close(piperw[0]); -- close(piperw[1]); - execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL); - die("startup: execl:"); - } -- dup2(piperw[1], STDOUT_FILENO); -- close(piperw[1]); -- close(piperw[0]); - } - -- /* Mark stdout as non-blocking to avoid people who does not close stdin -- * nor consumes it in their startup script getting dwl frozen */ -- if (fd_set_nonblock(STDOUT_FILENO) < 0) -- close(STDOUT_FILENO); -- -- printstatus(); -+ drawbars(); - - /* At this point the outputs are initialized, choose initial selmon based on - * cursor position, and set default cursor image */ -@@ -2262,7 +2449,7 @@ setfloating(Client *c, int floating) - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen - ? LyrFS : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2285,7 +2472,7 @@ setfullscreen(Client *c, int fullscreen) - resize(c, c->prev, 0); - } - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2310,7 +2497,7 @@ setlayout(const Arg *arg) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); -- printstatus(); -+ drawbar(selmon); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2383,6 +2570,7 @@ setup(void) - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -+ - wlr_log_init(log_level, NULL); - - /* The Wayland display is managed by libwayland. It handles accepting -@@ -2569,6 +2757,11 @@ setup(void) - - wlr_scene_set_presentation(scene, wlr_presentation_create(dpy, backend)); - -+ drwl_init(); -+ -+ status_event_source = wl_event_loop_add_fd(wl_display_get_event_loop(dpy), -+ STDIN_FILENO, WL_EVENT_READABLE, statusin, NULL); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2593,6 +2786,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ close(STDIN_FILENO); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -2611,6 +2805,30 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+int -+statusin(int fd, unsigned int mask, void *data) -+{ -+ char status[1024]; -+ ssize_t n; -+ -+ if (mask & WL_EVENT_ERROR) -+ die("status in event error"); -+ if (mask & WL_EVENT_HANGUP) -+ wl_event_source_remove(status_event_source); -+ -+ n = read(fd, status, sizeof(status) - 1); -+ if (n < 0 && errno != EWOULDBLOCK) -+ die("read:"); -+ -+ status[n] = '\0'; -+ status[strcspn(status, "\n")] = '\0'; -+ -+ strncpy(stext, status, sizeof(stext)); -+ drawbars(); -+ -+ return 0; -+} -+ - void - tag(const Arg *arg) - { -@@ -2621,7 +2839,7 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2666,6 +2884,14 @@ tile(Monitor *m) - } - } - -+void -+togglebar(const Arg *arg) -+{ -+ wlr_scene_node_set_enabled(&selmon->scene_buffer->node, -+ !selmon->scene_buffer->node.enabled); -+ arrangelayers(selmon); -+} -+ - void - togglefloating(const Arg *arg) - { -@@ -2694,7 +2920,7 @@ toggletag(const Arg *arg) - sel->tags = newtags; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2707,7 +2933,7 @@ toggleview(const Arg *arg) - selmon->tagset[selmon->seltags] = newtagset; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2755,7 +2981,7 @@ unmapnotify(struct wl_listener *listener, void *data) - } - - wlr_scene_node_destroy(&c->scene->node); -- printstatus(); -+ drawbars(); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -2855,6 +3081,13 @@ updatemons(struct wl_listener *listener, void *data) - } - } - -+ if (stext[0] == '\0') -+ strncpy(stext, "dwl-"VERSION, sizeof(stext)); -+ wl_list_for_each(m, &mons, link) { -+ updatebar(m); -+ drawbar(m); -+ } -+ - /* FIXME: figure out why the cursor image is at 0,0 after turning all - * the monitors on. - * Move the cursor image where it used to be. It does not generate a -@@ -2865,12 +3098,45 @@ updatemons(struct wl_listener *listener, void *data) - wlr_output_manager_v1_set_configuration(output_mgr, config); - } - -+void -+updatebar(Monitor *m) -+{ -+ size_t i; -+ int rw, rh; -+ char fontattrs[12]; -+ -+ wlr_output_transformed_resolution(m->wlr_output, &rw, &rh); -+ m->b.width = rw; -+ m->b.real_width = (int)((float)m->b.width / m->wlr_output->scale); -+ -+ wlr_scene_node_set_enabled(&m->scene_buffer->node, m->wlr_output->enabled ? showbar : 0); -+ -+ for (i = 0; i < LENGTH(m->pool); i++) -+ if (m->pool[i]) { -+ wlr_buffer_drop(&m->pool[i]->base); -+ m->pool[i] = NULL; -+ } -+ -+ if (m->b.scale == m->wlr_output->scale && m->drw) -+ return; -+ -+ drwl_font_destroy(m->drw->font); -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * m->wlr_output->scale); -+ if (!(drwl_font_create(m->drw, LENGTH(fonts), fonts, fontattrs))) -+ die("Could not load font"); -+ -+ m->b.scale = m->wlr_output->scale; -+ m->lrpad = m->drw->font->height; -+ m->b.height = m->drw->font->height + 2; -+ m->b.real_height = (int)((float)m->b.height / m->wlr_output->scale); -+} -+ - void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) -- printstatus(); -+ drawbars(); - } - - void -@@ -2883,10 +3149,10 @@ urgent(struct wl_listener *listener, void *data) - return; - - c->isurgent = 1; -- printstatus(); -+ drawbars(); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void -@@ -2899,7 +3165,7 @@ view(const Arg *arg) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2940,6 +3206,7 @@ xytonode(double x, double y, struct wlr_surface **psurface, - { - struct wlr_scene_node *node, *pnode; - struct wlr_surface *surface = NULL; -+ struct wlr_scene_surface *scene_surface = NULL; - Client *c = NULL; - LayerSurface *l = NULL; - int layer; -@@ -2948,9 +3215,12 @@ xytonode(double x, double y, struct wlr_surface **psurface, - if (!(node = wlr_scene_node_at(&layers[layer]->node, x, y, nx, ny))) - continue; - -- if (node->type == WLR_SCENE_NODE_BUFFER) -- surface = wlr_scene_surface_try_from_buffer( -- wlr_scene_buffer_from_node(node))->surface; -+ if (node->type == WLR_SCENE_NODE_BUFFER) { -+ scene_surface = wlr_scene_surface_try_from_buffer( -+ wlr_scene_buffer_from_node(node)); -+ if (!scene_surface) continue; -+ surface = scene_surface->surface; -+ } - /* Walk the tree to find a node that knows the client */ - for (pnode = node; pnode && !c; pnode = &pnode->parent->node) - c = pnode->data; -@@ -3089,10 +3359,10 @@ sethints(struct wl_listener *listener, void *data) - return; - - c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); -- printstatus(); -+ drawbars(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/bar/bar-0.7.patch b/dwl-bak/dwl-patches/patches/bar/bar-0.7.patch deleted file mode 100644 index 523ca36..0000000 --- a/dwl-bak/dwl-patches/patches/bar/bar-0.7.patch +++ /dev/null @@ -1,1245 +0,0 @@ -From 1431cf1e9e03c8e59050af3b37514a6a2293d71d Mon Sep 17 00:00:00 2001 -From: sewn -Date: Fri, 23 Aug 2024 09:42:04 +0300 -Subject: [PATCH] Implement dwm bar clone - ---- - Makefile | 2 +- - config.def.h | 31 +++- - drwl.h | 311 ++++++++++++++++++++++++++++++++++++ - dwl.c | 442 +++++++++++++++++++++++++++++++++++++++++---------- - 4 files changed, 691 insertions(+), 95 deletions(-) - create mode 100644 drwl.h - -diff --git a/Makefile b/Makefile -index 3358bae..9bc67db 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wlroots-0.18 wayland-server xkbcommon libinput $(XLIBS) -+PKGS = wlroots-0.18 wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -diff --git a/config.def.h b/config.def.h -index 22d2171..5d1dc2b 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,15 +7,21 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static const int showbar = 1; /* 0 means no bar */ -+static const int topbar = 1; /* 0 means bottom bar */ -+static const char *fonts[] = {"monospace:size=10"}; -+static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static uint32_t colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, -+ [SchemeUrg] = { 0, 0, 0x770000ff }, -+}; - - /* tagging - TAGCOUNT must be no greater than 31 */ --#define TAGCOUNT (9) -+static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - - /* logging */ - static int log_level = WLR_ERROR; -@@ -127,6 +133,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -@@ -170,7 +177,15 @@ static const Key keys[] = { - }; - - static const Button buttons[] = { -- { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -- { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkLtSymbol, 0, BTN_LEFT, setlayout, {.v = &layouts[0]} }, -+ { ClkLtSymbol, 0, BTN_RIGHT, setlayout, {.v = &layouts[2]} }, -+ { ClkTitle, 0, BTN_MIDDLE, zoom, {0} }, -+ { ClkStatus, 0, BTN_MIDDLE, spawn, {.v = termcmd} }, -+ { ClkClient, MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -+ { ClkClient, MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { ClkClient, MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkTagBar, 0, BTN_LEFT, view, {0} }, -+ { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, -+ { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, -+ { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, - }; -diff --git a/drwl.h b/drwl.h -new file mode 100644 -index 0000000..b06a736 ---- /dev/null -+++ b/drwl.h -@@ -0,0 +1,311 @@ -+/* -+ * drwl - https://codeberg.org/sewn/drwl -+ * -+ * Copyright (c) 2023-2024 sewn -+ * Copyright (c) 2024 notchoc -+ * -+ * 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. -+ * -+ * The UTF-8 Decoder included is from Bjoern Hoehrmann: -+ * Copyright (c) 2008-2010 Bjoern Hoehrmann -+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. -+ */ -+#pragma once -+ -+#include -+#include -+#include -+ -+enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ -+ -+typedef struct fcft_font Fnt; -+typedef pixman_image_t Img; -+ -+typedef struct { -+ Img *image; -+ Fnt *font; -+ uint32_t *scheme; -+} Drwl; -+ -+#define UTF8_ACCEPT 0 -+#define UTF8_REJECT 12 -+#define UTF8_INVALID 0xFFFD -+ -+static const uint8_t utf8d[] = { -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, -+ -+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, -+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, -+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, -+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, -+ 12,36,12,12,12,12,12,12,12,12,12,12, -+}; -+ -+static inline uint32_t -+utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -+{ -+ uint32_t type = utf8d[byte]; -+ -+ *codep = (*state != UTF8_ACCEPT) ? -+ (byte & 0x3fu) | (*codep << 6) : -+ (0xff >> type) & (byte); -+ -+ *state = utf8d[256 + *state + type]; -+ return *state; -+} -+ -+static int -+drwl_init(void) -+{ -+ fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); -+ return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -+} -+ -+static Drwl * -+drwl_create(void) -+{ -+ Drwl *drwl; -+ -+ if (!(drwl = calloc(1, sizeof(Drwl)))) -+ return NULL; -+ -+ return drwl; -+} -+ -+static void -+drwl_setfont(Drwl *drwl, Fnt *font) -+{ -+ if (drwl) -+ drwl->font = font; -+} -+ -+static void -+drwl_setimage(Drwl *drwl, Img *image) -+{ -+ if (drwl) -+ drwl->image = image; -+} -+ -+static Fnt * -+drwl_font_create(Drwl *drwl, size_t count, -+ const char *names[static count], const char *attributes) -+{ -+ Fnt *font = fcft_from_name(count, names, attributes); -+ if (drwl) -+ drwl_setfont(drwl, font); -+ return font; -+} -+ -+static void -+drwl_font_destroy(Fnt *font) -+{ -+ fcft_destroy(font); -+} -+ -+static inline pixman_color_t -+convert_color(uint32_t clr) -+{ -+ return (pixman_color_t){ -+ ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ (clr & 0xFF) * 0x101 -+ }; -+} -+ -+static void -+drwl_setscheme(Drwl *drwl, uint32_t *scm) -+{ -+ if (drwl) -+ drwl->scheme = scm; -+} -+ -+static Img * -+drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -+{ -+ Img *image; -+ pixman_region32_t clip; -+ -+ image = pixman_image_create_bits_no_clear( -+ PIXMAN_a8r8g8b8, w, h, bits, w * 4); -+ if (!image) -+ return NULL; -+ pixman_region32_init_rect(&clip, 0, 0, w, h); -+ pixman_image_set_clip_region32(image, &clip); -+ pixman_region32_fini(&clip); -+ -+ if (drwl) -+ drwl_setimage(drwl, image); -+ return image; -+} -+ -+static void -+drwl_rect(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ int filled, int invert) -+{ -+ pixman_color_t clr; -+ if (!drwl || !drwl->scheme || !drwl->image) -+ return; -+ -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ if (filled) -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, -+ &(pixman_rectangle16_t){x, y, w, h}); -+ else -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, -+ (pixman_rectangle16_t[4]){ -+ { x, y, w, 1 }, -+ { x, y + h - 1, w, 1 }, -+ { x, y, 1, h }, -+ { x + w - 1, y, 1, h }}); -+} -+ -+static int -+drwl_text(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ unsigned int lpad, const char *text, int invert) -+{ -+ int ty; -+ int render = x || y || w || h; -+ long x_kern; -+ uint32_t cp = 0, last_cp = 0, state; -+ pixman_color_t clr; -+ pixman_image_t *fg_pix = NULL; -+ int noellipsis = 0; -+ const struct fcft_glyph *glyph, *eg = NULL; -+ int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; -+ -+ if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) -+ return 0; -+ -+ if (!render) { -+ w = invert ? invert : ~invert; -+ } else { -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ fg_pix = pixman_image_create_solid_fill(&clr); -+ -+ drwl_rect(drwl, x, y, w, h, 1, !invert); -+ -+ x += lpad; -+ w -= lpad; -+ } -+ -+ if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) -+ fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; -+ -+ if (render) -+ eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); -+ -+ for (const char *p = text, *pp; pp = p, *p; p++) { -+ for (state = UTF8_ACCEPT; *p && -+ utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) -+ ; -+ if (!*p || state == UTF8_REJECT) { -+ cp = UTF8_INVALID; -+ if (p > pp) -+ p--; -+ } -+ -+ glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); -+ if (!glyph) -+ continue; -+ -+ x_kern = 0; -+ if (last_cp) -+ fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); -+ last_cp = cp; -+ -+ ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; -+ -+ if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && -+ *(p + 1) != '\0') { -+ /* cannot fit ellipsis after current codepoint */ -+ if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { -+ noellipsis = 1; -+ } else { -+ w -= eg->advance.x; -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, -+ x + eg->x, ty - eg->y, eg->width, eg->height); -+ } -+ } -+ -+ if ((x_kern + glyph->advance.x) > w) -+ break; -+ -+ x += x_kern; -+ -+ if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) -+ /* pre-rendered glyphs (eg. emoji) */ -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ else if (render) -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ -+ x += glyph->advance.x; -+ w -= glyph->advance.x; -+ } -+ -+ if (render) -+ pixman_image_unref(fg_pix); -+ -+ return x + (render ? w : 0); -+} -+ -+static unsigned int -+drwl_font_getwidth(Drwl *drwl, const char *text) -+{ -+ if (!drwl || !drwl->font || !text) -+ return 0; -+ return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -+} -+ -+static void -+drwl_image_destroy(Img *image) -+{ -+ pixman_image_unref(image); -+} -+ -+static void -+drwl_destroy(Drwl *drwl) -+{ -+ if (drwl->font) -+ drwl_font_destroy(drwl->font); -+ if (drwl->image) -+ drwl_image_destroy(drwl->image); -+ free(drwl); -+} -+ -+static void -+drwl_fini(void) -+{ -+ fcft_fini(); -+} -diff --git a/dwl.c b/dwl.c -index a2711f6..ece537a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -58,6 +59,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -68,6 +70,7 @@ - #endif - - #include "util.h" -+#include "drwl.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -76,14 +79,17 @@ - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) --#define TAGMASK ((1u << TAGCOUNT) - 1) -+#define TAGMASK ((1u << LENGTH(tags)) - 1) - #define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) -+#define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) - - /* enums */ -+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* clicks */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -97,6 +103,7 @@ typedef union { - } Arg; - - typedef struct { -+ unsigned int click; - unsigned int mod; - unsigned int button; - void (*func)(const Arg *); -@@ -186,10 +193,19 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - struct Monitor { - struct wl_list link; - struct wlr_output *wlr_output; - struct wlr_scene_output *scene_output; -+ struct wlr_scene_buffer *scene_buffer; /* bar buffer */ - struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */ - struct wl_listener frame; - struct wl_listener destroy; -@@ -197,6 +213,11 @@ struct Monitor { - struct wl_listener destroy_lock_surface; - struct wlr_session_lock_surface_v1 *lock_surface; - struct wlr_box m; /* monitor area, layout-relative */ -+ struct { -+ int width, height; -+ int real_width, real_height; /* non-scaled */ -+ float scale; -+ } b; /* bar area */ - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -@@ -208,6 +229,9 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int lrpad; - }; - - typedef struct { -@@ -250,6 +274,13 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static bool baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy); -+static void bufdestroy(struct wlr_buffer *buffer); -+static bool bufdatabegin(struct wlr_buffer *buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride); -+static void bufdataend(struct wlr_buffer *buffer); -+static Buffer *bufmon(Monitor *m); -+static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -285,6 +316,8 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawbar(Monitor *m); -+static void drawbars(void); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -313,7 +346,6 @@ static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int - static void outputmgrtest(struct wl_listener *listener, void *data); - static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); --static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); - static void rendermon(struct wl_listener *listener, void *data); -@@ -335,9 +367,11 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static int statusin(int fd, unsigned int mask, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -346,6 +380,7 @@ static void unlocksession(struct wl_listener *listener, void *data); - static void unmaplayersurfacenotify(struct wl_listener *listener, void *data); - static void unmapnotify(struct wl_listener *listener, void *data); - static void updatemons(struct wl_listener *listener, void *data); -+static void updatebar(Monitor *m); - static void updatetitle(struct wl_listener *listener, void *data); - static void urgent(struct wl_listener *listener, void *data); - static void view(const Arg *arg); -@@ -413,6 +448,15 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static char stext[256]; -+static struct wl_event_source *status_event_source; -+ -+static const struct wlr_buffer_impl buffer_impl = { -+ .destroy = bufdestroy, -+ .begin_data_ptr_access = bufdatabegin, -+ .end_data_ptr_access = bufdataend, -+}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -553,6 +597,11 @@ arrangelayers(Monitor *m) - if (!m->wlr_output->enabled) - return; - -+ if (m->scene_buffer->node.enabled) { -+ usable_area.height -= m->b.real_height; -+ usable_area.y += topbar ? m->b.real_height : 0; -+ } -+ - /* Arrange exclusive surfaces from top->bottom */ - for (i = 3; i >= 0; i--) - arrangelayer(m, &m->layers[i], &usable_area, 1); -@@ -595,17 +644,102 @@ axisnotify(struct wl_listener *listener, void *data) - event->delta_discrete, event->source, event->relative_direction); - } - -+bool -+baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy) -+{ -+ return true; -+} -+ -+void -+bufdestroy(struct wlr_buffer *wlr_buffer) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ if (buf->busy) -+ wl_list_remove(&buf->release.link); -+ drwl_image_destroy(buf->image); -+ free(buf); -+} -+ -+bool -+bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ -+ if (flags & WLR_BUFFER_DATA_PTR_ACCESS_WRITE) return false; -+ -+ *data = buf->data; -+ *stride = wlr_buffer->width * 4; -+ *format = DRM_FORMAT_ARGB8888; -+ -+ return true; -+} -+ -+void -+bufdataend(struct wlr_buffer *wlr_buffer) -+{ -+} -+ -+Buffer * -+bufmon(Monitor *m) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(m->pool); i++) { -+ if (m->pool[i]) { -+ if (m->pool[i]->busy) -+ continue; -+ buf = m->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (m->b.width * 4 * m->b.height)); -+ buf->image = drwl_image_create(NULL, m->b.width, m->b.height, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, m->b.width, m->b.height); -+ m->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(m->drw, buf->image); -+ return buf; -+} -+ -+void -+bufrelease(struct wl_listener *listener, void *data) -+{ -+ Buffer *buf = wl_container_of(listener, buf, release); -+ buf->busy = false; -+ wl_list_remove(&buf->release.link); -+} -+ - void - buttonpress(struct wl_listener *listener, void *data) - { -+ unsigned int i = 0, x = 0; -+ double cx; -+ unsigned int click; - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; -+ struct wlr_scene_node *node; -+ struct wlr_scene_buffer *buffer; - uint32_t mods; -+ Arg arg = {0}; - Client *c; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -+ click = ClkRoot; -+ xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -+ if (c) -+ click = ClkClient; -+ - switch (event->state) { - case WL_POINTER_BUTTON_STATE_PRESSED: - cursor_mode = CurPressed; -@@ -613,17 +747,34 @@ buttonpress(struct wl_listener *listener, void *data) - if (locked) - break; - -+ if (!c && !exclusive_focus && -+ (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && -+ (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { -+ cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ do -+ x += TEXTW(selmon, tags[i]); -+ while (cx >= x && ++i < LENGTH(tags)); -+ if (i < LENGTH(tags)) { -+ click = ClkTagBar; -+ arg.ui = 1 << i; -+ } else if (cx < x + TEXTW(selmon, selmon->ltsymbol)) -+ click = ClkLtSymbol; -+ else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2)) { -+ click = ClkStatus; -+ } else -+ click = ClkTitle; -+ } -+ - /* Change focus if the button was _pressed_ over a client */ - xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -- if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) -+ if (click == ClkClient && (!client_is_unmanaged(c) || client_wants_focus(c))) - focusclient(c, 1); - - keyboard = wlr_seat_get_keyboard(seat); - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { -- if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -- b->func(&b->arg); -+ if (CLEANMASK(mods) == CLEANMASK(b->mod) && event->button == b->button && click == b->click && b->func) { -+ b->func(click == ClkTagBar && b->arg.i == 0 ? &arg : &b->arg); - return; - } - } -@@ -697,6 +848,8 @@ cleanup(void) - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -+ -+ drwl_fini(); - } - - void -@@ -712,6 +865,12 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_layer_surface_v1_destroy(l->layer_surface); - } - -+ for (i = 0; i < LENGTH(m->pool); i++) -+ wlr_buffer_drop(&m->pool[i]->base); -+ -+ drwl_setimage(m->drw, NULL); -+ drwl_destroy(m->drw); -+ - wl_list_remove(&m->destroy.link); - wl_list_remove(&m->frame.link); - wl_list_remove(&m->link); -@@ -722,6 +881,7 @@ cleanupmon(struct wl_listener *listener, void *data) - - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); -+ wlr_scene_node_destroy(&m->scene_buffer->node); - free(m); - } - -@@ -751,7 +911,7 @@ closemon(Monitor *m) - setmon(c, selmon, c->tags); - } - focusclient(focustop(selmon), 1); -- printstatus(); -+ drawbars(); - } - - void -@@ -1022,8 +1182,15 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_commit_state(wlr_output, &state); - wlr_output_state_finish(&state); - -+ if (!(m->drw = drwl_create())) -+ die("failed to create drwl context"); -+ -+ m->scene_buffer = wlr_scene_buffer_create(layers[LyrBottom], NULL); -+ m->scene_buffer->point_accepts_input = baracceptsinput; -+ updatebar(m); -+ - wl_list_insert(&mons, &m->link); -- printstatus(); -+ drawbars(); - - /* The xdg-protocol specifies: - * -@@ -1336,6 +1503,80 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+drawbar(Monitor *m) -+{ -+ int x, w, tw = 0; -+ int boxs = m->drw->font->height / 9; -+ int boxw = m->drw->font->height / 6 + 2; -+ uint32_t i, occ = 0, urg = 0; -+ Client *c; -+ Buffer *buf; -+ -+ if (!m->scene_buffer->node.enabled) -+ return; -+ if (!(buf = bufmon(m))) -+ return; -+ -+ /* draw status first so it can be overdrawn by tags later */ -+ if (m == selmon) { /* status is only drawn on selected monitor */ -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -+ drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ occ |= c->tags; -+ if (c->isurgent) -+ urg |= c->tags; -+ } -+ x = 0; -+ c = focustop(m); -+ for (i = 0; i < LENGTH(tags); i++) { -+ w = TEXTW(m, tags[i]); -+ drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); -+ if (occ & 1 << i) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, -+ m == selmon && c && c->tags & 1 << i, -+ urg & 1 << i); -+ x += w; -+ } -+ w = TEXTW(m, m->ltsymbol); -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); -+ -+ if ((w = m->b.width - tw - x) > m->b.height) { -+ if (c) { -+ drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -+ if (c && c->isfloating) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); -+ } else { -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); -+ } -+ } -+ -+ wlr_scene_buffer_set_dest_size(m->scene_buffer, -+ m->b.real_width, m->b.real_height); -+ wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x, -+ m->m.y + (topbar ? 0 : m->m.height - m->b.real_height)); -+ wlr_scene_buffer_set_buffer(m->scene_buffer, &buf->base); -+ wlr_buffer_unlock(&buf->base); -+} -+ -+void -+drawbars(void) -+{ -+ Monitor *m = NULL; -+ -+ wl_list_for_each(m, &mons, link) -+ drawbar(m); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1371,13 +1612,13 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeSel][ColBorder])); - } - - /* Deactivate old client if focus is changing */ - if (old && (!c || client_surface(c) != old)) { - /* If an overlay is focused, don't focus or activate the client, -- * but only update its position in fstack to render its border with focuscolor -+ * but only update its position in fstack to render its border with its color - * and focus it after the overlay is closed. */ - if (old_client_type == LayerShell && wlr_scene_node_coords( - &old_l->scene->node, &unused_lx, &unused_ly) -@@ -1388,12 +1629,11 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -- -+ client_set_border_color(old_c, (float[])COLOR(colors[SchemeNorm][ColBorder])); - client_activate_surface(old, 0); - } - } -- printstatus(); -+ drawbars(); - - if (!c) { - /* With no client, all we have left is to clear focus */ -@@ -1715,7 +1955,7 @@ mapnotify(struct wl_listener *listener, void *data) - - for (i = 0; i < 4; i++) { - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, -- c->isurgent ? urgentcolor : bordercolor); -+ (float[])COLOR(colors[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder])); - c->border[i]->node.data = c; - } - -@@ -1738,7 +1978,7 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -- printstatus(); -+ drawbars(); - - unset_fullscreen: - m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -@@ -2032,46 +2272,6 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - wlr_seat_pointer_notify_motion(seat, time, sx, sy); - } - --void --printstatus(void) --{ -- Monitor *m = NULL; -- Client *c; -- uint32_t occ, urg, sel; -- const char *appid, *title; -- -- wl_list_for_each(m, &mons, link) { -- occ = urg = 0; -- wl_list_for_each(c, &clients, link) { -- if (c->mon != m) -- continue; -- occ |= c->tags; -- if (c->isurgent) -- urg |= c->tags; -- } -- if ((c = focustop(m))) { -- title = client_get_title(c); -- appid = client_get_appid(c); -- printf("%s title %s\n", m->wlr_output->name, title ? title : broken); -- printf("%s appid %s\n", m->wlr_output->name, appid ? appid : broken); -- printf("%s fullscreen %d\n", m->wlr_output->name, c->isfullscreen); -- printf("%s floating %d\n", m->wlr_output->name, c->isfloating); -- sel = c->tags; -- } else { -- printf("%s title \n", m->wlr_output->name); -- printf("%s appid \n", m->wlr_output->name); -- printf("%s fullscreen \n", m->wlr_output->name); -- printf("%s floating \n", m->wlr_output->name); -- sel = 0; -- } -- -- printf("%s selmon %u\n", m->wlr_output->name, m == selmon); -- printf("%s tags %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"\n", -- m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); -- printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol); -- } -- fflush(stdout); --} - - void - powermgrsetmode(struct wl_listener *listener, void *data) -@@ -2226,30 +2426,17 @@ run(char *startup_cmd) - - /* Now that the socket exists and the backend is started, run the startup command */ - if (startup_cmd) { -- int piperw[2]; -- if (pipe(piperw) < 0) -- die("startup: pipe:"); - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ close(STDIN_FILENO); - setsid(); -- dup2(piperw[0], STDIN_FILENO); -- close(piperw[0]); -- close(piperw[1]); - execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL); - die("startup: execl:"); - } -- dup2(piperw[1], STDOUT_FILENO); -- close(piperw[1]); -- close(piperw[0]); - } - -- /* Mark stdout as non-blocking to avoid people who does not close stdin -- * nor consumes it in their startup script getting dwl frozen */ -- if (fd_set_nonblock(STDOUT_FILENO) < 0) -- close(STDOUT_FILENO); -- -- printstatus(); -+ drawbars(); - - /* At this point the outputs are initialized, choose initial selmon based on - * cursor position, and set default cursor image */ -@@ -2315,7 +2502,7 @@ setfloating(Client *c, int floating) - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2338,7 +2525,7 @@ setfullscreen(Client *c, int fullscreen) - resize(c, c->prev, 0); - } - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2363,7 +2550,7 @@ setlayout(const Arg *arg) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); -- printstatus(); -+ drawbar(selmon); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2436,6 +2623,7 @@ setup(void) - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -+ - wlr_log_init(log_level, NULL); - - /* The Wayland display is managed by libwayland. It handles accepting -@@ -2625,6 +2813,11 @@ setup(void) - LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply); - LISTEN_STATIC(&output_mgr->events.test, outputmgrtest); - -+ drwl_init(); -+ -+ status_event_source = wl_event_loop_add_fd(wl_display_get_event_loop(dpy), -+ STDIN_FILENO, WL_EVENT_READABLE, statusin, NULL); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2649,6 +2842,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ close(STDIN_FILENO); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -2667,6 +2861,30 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+int -+statusin(int fd, unsigned int mask, void *data) -+{ -+ char status[1024]; -+ ssize_t n; -+ -+ if (mask & WL_EVENT_ERROR) -+ die("status in event error"); -+ if (mask & WL_EVENT_HANGUP) -+ wl_event_source_remove(status_event_source); -+ -+ n = read(fd, status, sizeof(status) - 1); -+ if (n < 0 && errno != EWOULDBLOCK) -+ die("read:"); -+ -+ status[n] = '\0'; -+ status[strcspn(status, "\n")] = '\0'; -+ -+ strncpy(stext, status, sizeof(stext)); -+ drawbars(); -+ -+ return 0; -+} -+ - void - tag(const Arg *arg) - { -@@ -2677,7 +2895,7 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2722,6 +2940,14 @@ tile(Monitor *m) - } - } - -+void -+togglebar(const Arg *arg) -+{ -+ wlr_scene_node_set_enabled(&selmon->scene_buffer->node, -+ !selmon->scene_buffer->node.enabled); -+ arrangelayers(selmon); -+} -+ - void - togglefloating(const Arg *arg) - { -@@ -2750,7 +2976,7 @@ toggletag(const Arg *arg) - sel->tags = newtags; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2763,7 +2989,7 @@ toggleview(const Arg *arg) - selmon->tagset[selmon->seltags] = newtagset; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2811,7 +3037,7 @@ unmapnotify(struct wl_listener *listener, void *data) - } - - wlr_scene_node_destroy(&c->scene->node); -- printstatus(); -+ drawbars(); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -2911,6 +3137,13 @@ updatemons(struct wl_listener *listener, void *data) - } - } - -+ if (stext[0] == '\0') -+ strncpy(stext, "dwl-"VERSION, sizeof(stext)); -+ wl_list_for_each(m, &mons, link) { -+ updatebar(m); -+ drawbar(m); -+ } -+ - /* FIXME: figure out why the cursor image is at 0,0 after turning all - * the monitors on. - * Move the cursor image where it used to be. It does not generate a -@@ -2921,12 +3154,45 @@ updatemons(struct wl_listener *listener, void *data) - wlr_output_manager_v1_set_configuration(output_mgr, config); - } - -+void -+updatebar(Monitor *m) -+{ -+ size_t i; -+ int rw, rh; -+ char fontattrs[12]; -+ -+ wlr_output_transformed_resolution(m->wlr_output, &rw, &rh); -+ m->b.width = rw; -+ m->b.real_width = (int)((float)m->b.width / m->wlr_output->scale); -+ -+ wlr_scene_node_set_enabled(&m->scene_buffer->node, m->wlr_output->enabled ? showbar : 0); -+ -+ for (i = 0; i < LENGTH(m->pool); i++) -+ if (m->pool[i]) { -+ wlr_buffer_drop(&m->pool[i]->base); -+ m->pool[i] = NULL; -+ } -+ -+ if (m->b.scale == m->wlr_output->scale && m->drw) -+ return; -+ -+ drwl_font_destroy(m->drw->font); -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * m->wlr_output->scale); -+ if (!(drwl_font_create(m->drw, LENGTH(fonts), fonts, fontattrs))) -+ die("Could not load font"); -+ -+ m->b.scale = m->wlr_output->scale; -+ m->lrpad = m->drw->font->height; -+ m->b.height = m->drw->font->height + 2; -+ m->b.real_height = (int)((float)m->b.height / m->wlr_output->scale); -+} -+ - void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) -- printstatus(); -+ drawbars(); - } - - void -@@ -2939,10 +3205,10 @@ urgent(struct wl_listener *listener, void *data) - return; - - c->isurgent = 1; -- printstatus(); -+ drawbars(); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void -@@ -2955,7 +3221,7 @@ view(const Arg *arg) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2996,6 +3262,7 @@ xytonode(double x, double y, struct wlr_surface **psurface, - { - struct wlr_scene_node *node, *pnode; - struct wlr_surface *surface = NULL; -+ struct wlr_scene_surface *scene_surface = NULL; - Client *c = NULL; - LayerSurface *l = NULL; - int layer; -@@ -3004,9 +3271,12 @@ xytonode(double x, double y, struct wlr_surface **psurface, - if (!(node = wlr_scene_node_at(&layers[layer]->node, x, y, nx, ny))) - continue; - -- if (node->type == WLR_SCENE_NODE_BUFFER) -- surface = wlr_scene_surface_try_from_buffer( -- wlr_scene_buffer_from_node(node))->surface; -+ if (node->type == WLR_SCENE_NODE_BUFFER) { -+ scene_surface = wlr_scene_surface_try_from_buffer( -+ wlr_scene_buffer_from_node(node)); -+ if (!scene_surface) continue; -+ surface = scene_surface->surface; -+ } - /* Walk the tree to find a node that knows the client */ - for (pnode = node; pnode && !c; pnode = &pnode->parent->node) - c = pnode->data; -@@ -3145,10 +3415,10 @@ sethints(struct wl_listener *listener, void *data) - return; - - c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); -- printstatus(); -+ drawbars(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/bar/bar.patch b/dwl-bak/dwl-patches/patches/bar/bar.patch deleted file mode 100644 index c9527c1..0000000 --- a/dwl-bak/dwl-patches/patches/bar/bar.patch +++ /dev/null @@ -1,1266 +0,0 @@ -From 8906a73dbc8996dd1bfff15f5b26aaee6d45fd61 Mon Sep 17 00:00:00 2001 -From: sewn -Date: Tue, 29 Jul 2025 15:21:19 +0300 -Subject: [PATCH] Implement dwm bar clone - -Signed-off-by: sewn ---- - Makefile | 2 +- - config.def.h | 33 ++-- - drwl.h | 311 ++++++++++++++++++++++++++++++++++++ - dwl.c | 441 +++++++++++++++++++++++++++++++++++++++++---------- - 4 files changed, 695 insertions(+), 92 deletions(-) - create mode 100644 drwl.h - -diff --git a/Makefile b/Makefile -index 578194f..279b1c0 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -Wpedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wayland-server xkbcommon libinput $(XLIBS) -+PKGS = wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS) - -diff --git a/config.def.h b/config.def.h -index 95c2afa..1b7472d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,15 +7,21 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static const int showbar = 1; /* 0 means no bar */ -+static const int topbar = 1; /* 0 means bottom bar */ -+static const char *fonts[] = {"monospace:size=10"}; -+static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You can also use glsl colors */ -+static uint32_t colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, -+ [SchemeUrg] = { 0, 0, 0x770000ff }, -+}; - --/* tagging - TAGCOUNT must be no greater than 31 */ --#define TAGCOUNT (9) -+/* tagging */ -+static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - - /* logging */ - static int log_level = WLR_ERROR; -@@ -127,6 +133,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -@@ -170,7 +177,15 @@ static const Key keys[] = { - }; - - static const Button buttons[] = { -- { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -- { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkLtSymbol, 0, BTN_LEFT, setlayout, {.v = &layouts[0]} }, -+ { ClkLtSymbol, 0, BTN_RIGHT, setlayout, {.v = &layouts[2]} }, -+ { ClkTitle, 0, BTN_MIDDLE, zoom, {0} }, -+ { ClkStatus, 0, BTN_MIDDLE, spawn, {.v = termcmd} }, -+ { ClkClient, MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -+ { ClkClient, MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { ClkClient, MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { ClkTagBar, 0, BTN_LEFT, view, {0} }, -+ { ClkTagBar, 0, BTN_RIGHT, toggleview, {0} }, -+ { ClkTagBar, MODKEY, BTN_LEFT, tag, {0} }, -+ { ClkTagBar, MODKEY, BTN_RIGHT, toggletag, {0} }, - }; -diff --git a/drwl.h b/drwl.h -new file mode 100644 -index 0000000..90cc35b ---- /dev/null -+++ b/drwl.h -@@ -0,0 +1,311 @@ -+/* -+ * drwl - https://codeberg.org/sewn/drwl -+ * -+ * Copyright (c) 2023-2025 sewn -+ * Copyright (c) 2024 notchoc -+ * -+ * 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. -+ * -+ * The UTF-8 Decoder included is from Bjoern Hoehrmann: -+ * Copyright (c) 2008-2010 Bjoern Hoehrmann -+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. -+ */ -+#pragma once -+ -+#include -+#include -+#include -+ -+enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ -+ -+typedef struct fcft_font Fnt; -+typedef pixman_image_t Img; -+ -+typedef struct { -+ Img *image; -+ Fnt *font; -+ uint32_t *scheme; -+} Drwl; -+ -+#define UTF8_ACCEPT 0 -+#define UTF8_REJECT 12 -+#define UTF8_INVALID 0xFFFD -+ -+static const uint8_t utf8d[] = { -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, -+ -+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, -+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, -+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, -+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, -+ 12,36,12,12,12,12,12,12,12,12,12,12, -+}; -+ -+static inline uint32_t -+utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -+{ -+ uint32_t type = utf8d[byte]; -+ -+ *codep = (*state != UTF8_ACCEPT) ? -+ (byte & 0x3fu) | (*codep << 6) : -+ (0xff >> type) & (byte); -+ -+ *state = utf8d[256 + *state + type]; -+ return *state; -+} -+ -+static int -+drwl_init(void) -+{ -+ fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); -+ return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -+} -+ -+static Drwl * -+drwl_create(void) -+{ -+ Drwl *drwl; -+ -+ if (!(drwl = calloc(1, sizeof(Drwl)))) -+ return NULL; -+ -+ return drwl; -+} -+ -+static void -+drwl_setfont(Drwl *drwl, Fnt *font) -+{ -+ if (drwl) -+ drwl->font = font; -+} -+ -+static void -+drwl_setimage(Drwl *drwl, Img *image) -+{ -+ if (drwl) -+ drwl->image = image; -+} -+ -+static Fnt * -+drwl_font_create(Drwl *drwl, size_t count, -+ const char *names[static count], const char *attributes) -+{ -+ Fnt *font = fcft_from_name(count, names, attributes); -+ if (drwl) -+ drwl_setfont(drwl, font); -+ return font; -+} -+ -+static void -+drwl_font_destroy(Fnt *font) -+{ -+ fcft_destroy(font); -+} -+ -+static inline pixman_color_t -+convert_color(uint32_t clr) -+{ -+ return (pixman_color_t){ -+ ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ (clr & 0xFF) * 0x101 -+ }; -+} -+ -+static void -+drwl_setscheme(Drwl *drwl, uint32_t *scm) -+{ -+ if (drwl) -+ drwl->scheme = scm; -+} -+ -+static Img * -+drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -+{ -+ Img *image; -+ pixman_region32_t clip; -+ -+ image = pixman_image_create_bits_no_clear( -+ PIXMAN_a8r8g8b8, w, h, bits, w * 4); -+ if (!image) -+ return NULL; -+ pixman_region32_init_rect(&clip, 0, 0, w, h); -+ pixman_image_set_clip_region32(image, &clip); -+ pixman_region32_fini(&clip); -+ -+ if (drwl) -+ drwl_setimage(drwl, image); -+ return image; -+} -+ -+static void -+drwl_rect(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ int filled, int invert) -+{ -+ pixman_color_t clr; -+ if (!drwl || !drwl->scheme || !drwl->image) -+ return; -+ -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ if (filled) -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, -+ &(pixman_rectangle16_t){x, y, w, h}); -+ else -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, -+ (pixman_rectangle16_t[4]){ -+ { x, y, w, 1 }, -+ { x, y + h - 1, w, 1 }, -+ { x, y, 1, h }, -+ { x + w - 1, y, 1, h }}); -+} -+ -+static int -+drwl_text(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ unsigned int lpad, const char *text, int invert) -+{ -+ int ty; -+ int render = x || y || w || h; -+ long x_kern; -+ uint32_t cp = 0, last_cp = 0, state; -+ pixman_color_t clr; -+ pixman_image_t *fg_pix = NULL; -+ int noellipsis = 0; -+ const struct fcft_glyph *glyph, *eg = NULL; -+ int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; -+ -+ if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) -+ return 0; -+ -+ if (!render) { -+ w = invert ? invert : ~invert; -+ } else { -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ fg_pix = pixman_image_create_solid_fill(&clr); -+ -+ drwl_rect(drwl, x, y, w, h, 1, !invert); -+ -+ x += lpad; -+ w -= lpad; -+ } -+ -+ if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) -+ fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; -+ -+ if (render) -+ eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); -+ -+ for (const char *p = text, *pp; pp = p, *p; p++) { -+ for (state = UTF8_ACCEPT; *p && -+ utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) -+ ; -+ if (!*p || state == UTF8_REJECT) { -+ cp = UTF8_INVALID; -+ if (p > pp) -+ p--; -+ } -+ -+ glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); -+ if (!glyph) -+ continue; -+ -+ x_kern = 0; -+ if (last_cp) -+ fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); -+ last_cp = cp; -+ -+ ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; -+ -+ if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && -+ *(p + 1) != '\0') { -+ /* cannot fit ellipsis after current codepoint */ -+ if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { -+ noellipsis = 1; -+ } else { -+ w -= eg->advance.x; -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, -+ x + eg->x, ty - eg->y, eg->width, eg->height); -+ } -+ } -+ -+ if ((x_kern + glyph->advance.x) > w) -+ break; -+ -+ x += x_kern; -+ -+ if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) -+ /* pre-rendered glyphs (eg. emoji) */ -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ else if (render) -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ -+ x += glyph->advance.x; -+ w -= glyph->advance.x; -+ } -+ -+ if (render) -+ pixman_image_unref(fg_pix); -+ -+ return x + (render ? w : 0); -+} -+ -+static unsigned int -+drwl_font_getwidth(Drwl *drwl, const char *text) -+{ -+ if (!drwl || !drwl->font || !text) -+ return 0; -+ return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -+} -+ -+static void -+drwl_image_destroy(Img *image) -+{ -+ pixman_image_unref(image); -+} -+ -+static void -+drwl_destroy(Drwl *drwl) -+{ -+ if (drwl->font) -+ drwl_font_destroy(drwl->font); -+ if (drwl->image) -+ drwl_image_destroy(drwl->image); -+ free(drwl); -+} -+ -+static void -+drwl_fini(void) -+{ -+ fcft_fini(); -+} -diff --git a/dwl.c b/dwl.c -index 12f441e..bf340d8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -59,6 +60,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -69,6 +71,7 @@ - #endif - - #include "util.h" -+#include "drwl.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -77,14 +80,17 @@ - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) --#define TAGMASK ((1u << TAGCOUNT) - 1) -+#define TAGMASK ((1u << LENGTH(tags)) - 1) - #define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) - #define LISTEN_STATIC(E, H) do { struct wl_listener *_l = ecalloc(1, sizeof(*_l)); _l->notify = (H); wl_signal_add((E), _l); } while (0) -+#define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) - - /* enums */ -+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* clicks */ - - typedef union { - int i; -@@ -94,6 +100,7 @@ typedef union { - } Arg; - - typedef struct { -+ unsigned int click; - unsigned int mod; - unsigned int button; - void (*func)(const Arg *); -@@ -183,10 +190,19 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - struct Monitor { - struct wl_list link; - struct wlr_output *wlr_output; - struct wlr_scene_output *scene_output; -+ struct wlr_scene_buffer *scene_buffer; /* bar buffer */ - struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */ - struct wl_listener frame; - struct wl_listener destroy; -@@ -194,6 +210,11 @@ struct Monitor { - struct wl_listener destroy_lock_surface; - struct wlr_session_lock_surface_v1 *lock_surface; - struct wlr_box m; /* monitor area, layout-relative */ -+ struct { -+ int width, height; -+ int real_width, real_height; /* non-scaled */ -+ float scale; -+ } b; /* bar area */ - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -@@ -205,6 +226,9 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int lrpad; - }; - - typedef struct { -@@ -247,6 +271,13 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static bool baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy); -+static void bufdestroy(struct wlr_buffer *buffer); -+static bool bufdatabegin(struct wlr_buffer *buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride); -+static void bufdataend(struct wlr_buffer *buffer); -+static Buffer *bufmon(Monitor *m); -+static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -282,6 +313,8 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawbar(Monitor *m); -+static void drawbars(void); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -310,7 +343,6 @@ static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int - static void outputmgrtest(struct wl_listener *listener, void *data); - static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); --static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); - static void rendermon(struct wl_listener *listener, void *data); -@@ -331,9 +363,11 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static int statusin(int fd, unsigned int mask, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -342,6 +376,7 @@ static void unlocksession(struct wl_listener *listener, void *data); - static void unmaplayersurfacenotify(struct wl_listener *listener, void *data); - static void unmapnotify(struct wl_listener *listener, void *data); - static void updatemons(struct wl_listener *listener, void *data); -+static void updatebar(Monitor *m); - static void updatetitle(struct wl_listener *listener, void *data); - static void urgent(struct wl_listener *listener, void *data); - static void view(const Arg *arg); -@@ -406,6 +441,15 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static char stext[256]; -+static struct wl_event_source *status_event_source; -+ -+static const struct wlr_buffer_impl buffer_impl = { -+ .destroy = bufdestroy, -+ .begin_data_ptr_access = bufdatabegin, -+ .end_data_ptr_access = bufdataend, -+}; -+ - /* global event handlers */ - static struct wl_listener cursor_axis = {.notify = axisnotify}; - static struct wl_listener cursor_button = {.notify = buttonpress}; -@@ -521,7 +565,7 @@ arrange(Monitor *m) - wlr_scene_node_set_enabled(&m->fullscreen_bg->node, - (c = focustop(m)) && c->isfullscreen); - -- strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); -+ strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof(m->ltsymbol)); - - /* We move all clients (except fullscreen and unmanaged) to LyrTile while - * in floating layout to avoid "real" floating clients be always on top */ -@@ -576,6 +620,11 @@ arrangelayers(Monitor *m) - if (!m->wlr_output->enabled) - return; - -+ if (m->scene_buffer->node.enabled) { -+ usable_area.height -= m->b.real_height; -+ usable_area.y += topbar ? m->b.real_height : 0; -+ } -+ - /* Arrange exclusive surfaces from top->bottom */ - for (i = 3; i >= 0; i--) - arrangelayer(m, &m->layers[i], &usable_area, 1); -@@ -618,17 +667,102 @@ axisnotify(struct wl_listener *listener, void *data) - event->delta_discrete, event->source, event->relative_direction); - } - -+bool -+baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy) -+{ -+ return true; -+} -+ -+void -+bufdestroy(struct wlr_buffer *wlr_buffer) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ if (buf->busy) -+ wl_list_remove(&buf->release.link); -+ drwl_image_destroy(buf->image); -+ free(buf); -+} -+ -+bool -+bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ -+ if (flags & WLR_BUFFER_DATA_PTR_ACCESS_WRITE) return false; -+ -+ *data = buf->data; -+ *stride = wlr_buffer->width * 4; -+ *format = DRM_FORMAT_ARGB8888; -+ -+ return true; -+} -+ -+void -+bufdataend(struct wlr_buffer *wlr_buffer) -+{ -+} -+ -+Buffer * -+bufmon(Monitor *m) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(m->pool); i++) { -+ if (m->pool[i]) { -+ if (m->pool[i]->busy) -+ continue; -+ buf = m->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (m->b.width * 4 * m->b.height)); -+ buf->image = drwl_image_create(NULL, m->b.width, m->b.height, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, m->b.width, m->b.height); -+ m->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(m->drw, buf->image); -+ return buf; -+} -+ -+void -+bufrelease(struct wl_listener *listener, void *data) -+{ -+ Buffer *buf = wl_container_of(listener, buf, release); -+ buf->busy = false; -+ wl_list_remove(&buf->release.link); -+} -+ - void - buttonpress(struct wl_listener *listener, void *data) - { -+ unsigned int i = 0, x = 0; -+ double cx; -+ unsigned int click; - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; -+ struct wlr_scene_node *node; -+ struct wlr_scene_buffer *buffer; - uint32_t mods; -+ Arg arg = {0}; - Client *c; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -+ click = ClkRoot; -+ xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -+ if (c) -+ click = ClkClient; -+ - switch (event->state) { - case WL_POINTER_BUTTON_STATE_PRESSED: - cursor_mode = CurPressed; -@@ -636,17 +770,34 @@ buttonpress(struct wl_listener *listener, void *data) - if (locked) - break; - -+ if (!c && !exclusive_focus && -+ (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && -+ (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { -+ cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ do -+ x += TEXTW(selmon, tags[i]); -+ while (cx >= x && ++i < LENGTH(tags)); -+ if (i < LENGTH(tags)) { -+ click = ClkTagBar; -+ arg.ui = 1 << i; -+ } else if (cx < x + TEXTW(selmon, selmon->ltsymbol)) -+ click = ClkLtSymbol; -+ else if (cx > selmon->b.width - (TEXTW(selmon, stext) - selmon->lrpad + 2)) { -+ click = ClkStatus; -+ } else -+ click = ClkTitle; -+ } -+ - /* Change focus if the button was _pressed_ over a client */ - xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -- if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) -+ if (click == ClkClient && (!client_is_unmanaged(c) || client_wants_focus(c))) - focusclient(c, 1); - - keyboard = wlr_seat_get_keyboard(seat); - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { -- if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -- b->func(&b->arg); -+ if (CLEANMASK(mods) == CLEANMASK(b->mod) && event->button == b->button && click == b->click && b->func) { -+ b->func(click == ClkTagBar && b->arg.i == 0 ? &arg : &b->arg); - return; - } - } -@@ -721,6 +872,8 @@ cleanup(void) - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -+ -+ drwl_fini(); - } - - void -@@ -736,6 +889,12 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_layer_surface_v1_destroy(l->layer_surface); - } - -+ for (i = 0; i < LENGTH(m->pool); i++) -+ wlr_buffer_drop(&m->pool[i]->base); -+ -+ drwl_setimage(m->drw, NULL); -+ drwl_destroy(m->drw); -+ - wl_list_remove(&m->destroy.link); - wl_list_remove(&m->frame.link); - wl_list_remove(&m->link); -@@ -748,6 +907,7 @@ cleanupmon(struct wl_listener *listener, void *data) - - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); -+ wlr_scene_node_destroy(&m->scene_buffer->node); - free(m); - } - -@@ -814,7 +974,7 @@ closemon(Monitor *m) - setmon(c, selmon, c->tags); - } - focusclient(focustop(selmon), 1); -- printstatus(); -+ drawbars(); - } - - void -@@ -1066,7 +1226,7 @@ createmon(struct wl_listener *listener, void *data) - m->nmaster = r->nmaster; - m->lt[0] = r->lt; - m->lt[1] = &layouts[LENGTH(layouts) > 1 && r->lt != &layouts[1]]; -- strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); -+ strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof(m->ltsymbol)); - wlr_output_state_set_scale(&state, r->scale); - wlr_output_state_set_transform(&state, r->rr); - break; -@@ -1088,8 +1248,15 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_commit_state(wlr_output, &state); - wlr_output_state_finish(&state); - -+ if (!(m->drw = drwl_create())) -+ die("failed to create drwl context"); -+ -+ m->scene_buffer = wlr_scene_buffer_create(layers[LyrBottom], NULL); -+ m->scene_buffer->point_accepts_input = baracceptsinput; -+ updatebar(m); -+ - wl_list_insert(&mons, &m->link); -- printstatus(); -+ drawbars(); - - /* The xdg-protocol specifies: - * -@@ -1399,6 +1566,80 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+drawbar(Monitor *m) -+{ -+ int x, w, tw = 0; -+ int boxs = m->drw->font->height / 9; -+ int boxw = m->drw->font->height / 6 + 2; -+ uint32_t i, occ = 0, urg = 0; -+ Client *c; -+ Buffer *buf; -+ -+ if (!m->scene_buffer->node.enabled) -+ return; -+ if (!(buf = bufmon(m))) -+ return; -+ -+ /* draw status first so it can be overdrawn by tags later */ -+ if (m == selmon) { /* status is only drawn on selected monitor */ -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -+ drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ occ |= c->tags; -+ if (c->isurgent) -+ urg |= c->tags; -+ } -+ x = 0; -+ c = focustop(m); -+ for (i = 0; i < LENGTH(tags); i++) { -+ w = TEXTW(m, tags[i]); -+ drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); -+ if (occ & 1 << i) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, -+ m == selmon && c && c->tags & 1 << i, -+ urg & 1 << i); -+ x += w; -+ } -+ w = TEXTW(m, m->ltsymbol); -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); -+ -+ if ((w = m->b.width - tw - x) > m->b.height) { -+ if (c) { -+ drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); -+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -+ if (c && c->isfloating) -+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); -+ } else { -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); -+ } -+ } -+ -+ wlr_scene_buffer_set_dest_size(m->scene_buffer, -+ m->b.real_width, m->b.real_height); -+ wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x, -+ m->m.y + (topbar ? 0 : m->m.height - m->b.real_height)); -+ wlr_scene_buffer_set_buffer(m->scene_buffer, &buf->base); -+ wlr_buffer_unlock(&buf->base); -+} -+ -+void -+drawbars(void) -+{ -+ Monitor *m = NULL; -+ -+ wl_list_for_each(m, &mons, link) -+ drawbar(m); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1433,13 +1674,13 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeSel][ColBorder])); - } - - /* Deactivate old client if focus is changing */ - if (old && (!c || client_surface(c) != old)) { - /* If an overlay is focused, don't focus or activate the client, -- * but only update its position in fstack to render its border with focuscolor -+ * but only update its position in fstack to render its border with its color - * and focus it after the overlay is closed. */ - if (old_client_type == LayerShell && wlr_scene_node_coords( - &old_l->scene->node, &unused_lx, &unused_ly) -@@ -1450,12 +1691,11 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -- -+ client_set_border_color(old_c, (float[])COLOR(colors[SchemeNorm][ColBorder])); - client_activate_surface(old, 0); - } - } -- printstatus(); -+ drawbars(); - - if (!c) { - /* With no client, all we have left is to clear focus */ -@@ -1768,7 +2008,7 @@ mapnotify(struct wl_listener *listener, void *data) - - for (i = 0; i < 4; i++) { - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, -- c->isurgent ? urgentcolor : bordercolor); -+ (float[])COLOR(colors[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder])); - c->border[i]->node.data = c; - } - -@@ -1791,7 +2031,7 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -- printstatus(); -+ drawbars(); - - unset_fullscreen: - m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -@@ -2084,44 +2324,6 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - wlr_seat_pointer_notify_motion(seat, time, sx, sy); - } - --void --printstatus(void) --{ -- Monitor *m = NULL; -- Client *c; -- uint32_t occ, urg, sel; -- -- wl_list_for_each(m, &mons, link) { -- occ = urg = 0; -- wl_list_for_each(c, &clients, link) { -- if (c->mon != m) -- continue; -- occ |= c->tags; -- if (c->isurgent) -- urg |= c->tags; -- } -- if ((c = focustop(m))) { -- printf("%s title %s\n", m->wlr_output->name, client_get_title(c)); -- printf("%s appid %s\n", m->wlr_output->name, client_get_appid(c)); -- printf("%s fullscreen %d\n", m->wlr_output->name, c->isfullscreen); -- printf("%s floating %d\n", m->wlr_output->name, c->isfloating); -- sel = c->tags; -- } else { -- printf("%s title \n", m->wlr_output->name); -- printf("%s appid \n", m->wlr_output->name); -- printf("%s fullscreen \n", m->wlr_output->name); -- printf("%s floating \n", m->wlr_output->name); -- sel = 0; -- } -- -- printf("%s selmon %u\n", m->wlr_output->name, m == selmon); -- printf("%s tags %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"\n", -- m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); -- printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol); -- } -- fflush(stdout); --} -- - void - powermgrsetmode(struct wl_listener *listener, void *data) - { -@@ -2250,22 +2452,14 @@ run(char *startup_cmd) - - /* Now that the socket exists and the backend is started, run the startup command */ - if (startup_cmd) { -- int piperw[2]; -- if (pipe(piperw) < 0) -- die("startup: pipe:"); - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ close(STDIN_FILENO); - setsid(); -- dup2(piperw[0], STDIN_FILENO); -- close(piperw[0]); -- close(piperw[1]); - execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL); - die("startup: execl:"); - } -- dup2(piperw[1], STDOUT_FILENO); -- close(piperw[1]); -- close(piperw[0]); - } - - /* Mark stdout as non-blocking to avoid the startup script -@@ -2275,7 +2469,7 @@ run(char *startup_cmd) - if (fd_set_nonblock(STDOUT_FILENO) < 0) - close(STDOUT_FILENO); - -- printstatus(); -+ drawbars(); - - /* At this point the outputs are initialized, choose initial selmon based on - * cursor position, and set default cursor image */ -@@ -2341,7 +2535,7 @@ setfloating(Client *c, int floating) - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2364,7 +2558,7 @@ setfullscreen(Client *c, int fullscreen) - resize(c, c->prev, 0); - } - arrange(c->mon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2376,9 +2570,9 @@ setlayout(const Arg *arg) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; -- strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); -+ strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof(selmon->ltsymbol)); - arrange(selmon); -- printstatus(); -+ drawbar(selmon); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2451,6 +2645,7 @@ setup(void) - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -+ - wlr_log_init(log_level, NULL); - - /* The Wayland display is managed by libwayland. It handles accepting -@@ -2645,6 +2840,11 @@ setup(void) - wl_signal_add(&output_mgr->events.apply, &output_mgr_apply); - wl_signal_add(&output_mgr->events.test, &output_mgr_test); - -+ drwl_init(); -+ -+ status_event_source = wl_event_loop_add_fd(wl_display_get_event_loop(dpy), -+ STDIN_FILENO, WL_EVENT_READABLE, statusin, NULL); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2669,6 +2869,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ close(STDIN_FILENO); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -2687,6 +2888,30 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+int -+statusin(int fd, unsigned int mask, void *data) -+{ -+ char status[256]; -+ ssize_t n; -+ -+ if (mask & WL_EVENT_ERROR) -+ die("status in event error"); -+ if (mask & WL_EVENT_HANGUP) -+ wl_event_source_remove(status_event_source); -+ -+ n = read(fd, status, sizeof(status) - 1); -+ if (n < 0 && errno != EWOULDBLOCK) -+ die("read:"); -+ -+ status[n] = '\0'; -+ status[strcspn(status, "\n")] = '\0'; -+ -+ strncpy(stext, status, sizeof(stext)); -+ drawbars(); -+ -+ return 0; -+} -+ - void - tag(const Arg *arg) - { -@@ -2697,7 +2922,7 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2742,6 +2967,14 @@ tile(Monitor *m) - } - } - -+void -+togglebar(const Arg *arg) -+{ -+ wlr_scene_node_set_enabled(&selmon->scene_buffer->node, -+ !selmon->scene_buffer->node.enabled); -+ arrangelayers(selmon); -+} -+ - void - togglefloating(const Arg *arg) - { -@@ -2770,7 +3003,7 @@ toggletag(const Arg *arg) - sel->tags = newtags; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2783,7 +3016,7 @@ toggleview(const Arg *arg) - selmon->tagset[selmon->seltags] = newtagset; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -2831,7 +3064,7 @@ unmapnotify(struct wl_listener *listener, void *data) - } - - wlr_scene_node_destroy(&c->scene->node); -- printstatus(); -+ drawbars(); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -2931,6 +3164,13 @@ updatemons(struct wl_listener *listener, void *data) - } - } - -+ if (stext[0] == '\0') -+ strncpy(stext, "dwl-"VERSION, sizeof(stext)); -+ wl_list_for_each(m, &mons, link) { -+ updatebar(m); -+ drawbar(m); -+ } -+ - /* FIXME: figure out why the cursor image is at 0,0 after turning all - * the monitors on. - * Move the cursor image where it used to be. It does not generate a -@@ -2941,12 +3181,45 @@ updatemons(struct wl_listener *listener, void *data) - wlr_output_manager_v1_set_configuration(output_mgr, config); - } - -+void -+updatebar(Monitor *m) -+{ -+ size_t i; -+ int rw, rh; -+ char fontattrs[12]; -+ -+ wlr_output_transformed_resolution(m->wlr_output, &rw, &rh); -+ m->b.width = rw; -+ m->b.real_width = (int)((float)m->b.width / m->wlr_output->scale); -+ -+ wlr_scene_node_set_enabled(&m->scene_buffer->node, m->wlr_output->enabled ? showbar : 0); -+ -+ for (i = 0; i < LENGTH(m->pool); i++) -+ if (m->pool[i]) { -+ wlr_buffer_drop(&m->pool[i]->base); -+ m->pool[i] = NULL; -+ } -+ -+ if (m->b.scale == m->wlr_output->scale && m->drw) -+ return; -+ -+ drwl_font_destroy(m->drw->font); -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * m->wlr_output->scale); -+ if (!(drwl_font_create(m->drw, LENGTH(fonts), fonts, fontattrs))) -+ die("Could not load font"); -+ -+ m->b.scale = m->wlr_output->scale; -+ m->lrpad = m->drw->font->height; -+ m->b.height = m->drw->font->height + 2; -+ m->b.real_height = (int)((float)m->b.height / m->wlr_output->scale); -+} -+ - void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) -- printstatus(); -+ drawbars(); - } - - void -@@ -2959,10 +3232,10 @@ urgent(struct wl_listener *listener, void *data) - return; - - c->isurgent = 1; -- printstatus(); -+ drawbars(); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void -@@ -2975,7 +3248,7 @@ view(const Arg *arg) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -- printstatus(); -+ drawbars(); - } - - void -@@ -3016,6 +3289,7 @@ xytonode(double x, double y, struct wlr_surface **psurface, - { - struct wlr_scene_node *node, *pnode; - struct wlr_surface *surface = NULL; -+ struct wlr_scene_surface *scene_surface = NULL; - Client *c = NULL; - LayerSurface *l = NULL; - int layer; -@@ -3024,9 +3298,12 @@ xytonode(double x, double y, struct wlr_surface **psurface, - if (!(node = wlr_scene_node_at(&layers[layer]->node, x, y, nx, ny))) - continue; - -- if (node->type == WLR_SCENE_NODE_BUFFER) -- surface = wlr_scene_surface_try_from_buffer( -- wlr_scene_buffer_from_node(node))->surface; -+ if (node->type == WLR_SCENE_NODE_BUFFER) { -+ scene_surface = wlr_scene_surface_try_from_buffer( -+ wlr_scene_buffer_from_node(node)); -+ if (!scene_surface) continue; -+ surface = scene_surface->surface; -+ } - /* Walk the tree to find a node that knows the client */ - for (pnode = node; pnode && !c; pnode = &pnode->parent->node) - c = pnode->data; -@@ -3159,10 +3436,10 @@ sethints(struct wl_listener *listener, void *data) - return; - - c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); -- printstatus(); -+ drawbars(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void --- -2.50.0 - diff --git a/dwl-bak/dwl-patches/patches/bar/bar.png b/dwl-bak/dwl-patches/patches/bar/bar.png deleted file mode 100644 index 276256bee51d06615845587df05141ff641a6611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3486 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 -Date: Fri, 23 Aug 2024 14:11:37 +0300 -Subject: [PATCH] add border to bar - ---- - config.def.h | 3 ++- - dwl.c | 32 +++++++++++++++++++------------- - 2 files changed, 21 insertions(+), 14 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 5d1dc2b..4763482 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,7 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ --static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int borderpx = 1; /* border pixel of windows & bar */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ - static const char *fonts[] = {"monospace:size=10"}; -@@ -18,6 +18,7 @@ static uint32_t colors[][3] = { - [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, - [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, - [SchemeUrg] = { 0, 0, 0x770000ff }, -+ [SchemeBar] = { 0, 0, 0x557700ff }, - }; - - /* tagging - TAGCOUNT must be no greater than 31 */ -diff --git a/dwl.c b/dwl.c -index ece537a..c637da4 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -85,7 +85,7 @@ - #define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) - - /* enums */ --enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ -+enum { SchemeNorm, SchemeSel, SchemeUrg, SchemeBar }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -@@ -750,7 +750,7 @@ buttonpress(struct wl_listener *listener, void *data) - if (!c && !exclusive_focus && - (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && - (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { -- cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ cx = (cursor->x - selmon->m.x - borderpx) * selmon->wlr_output->scale; - do - x += TEXTW(selmon, tags[i]); - while (cx >= x && ++i < LENGTH(tags)); -@@ -1506,10 +1506,12 @@ dirtomon(enum wlr_direction dir) - void - drawbar(Monitor *m) - { -- int x, w, tw = 0; -+ int x, y = borderpx, w, tw = 0; -+ int mh = m->b.height - borderpx * 2, mw = m->b.width - borderpx * 2; - int boxs = m->drw->font->height / 9; - int boxw = m->drw->font->height / 6 + 2; - uint32_t i, occ = 0, urg = 0; -+ uint32_t borderscm[] = { colors[SchemeBar][ColBorder] }; - Client *c; - Buffer *buf; - -@@ -1518,11 +1520,15 @@ drawbar(Monitor *m) - if (!(buf = bufmon(m))) - return; - -+ drwl_setscheme(m->drw, borderscm); -+ drwl_rect(m->drw, 0, 0, m->b.width, m->b.height, 1, 0); -+ drwl_setscheme(m->drw, colors[SchemeNorm]); -+ - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drwl_setscheme(m->drw, colors[SchemeNorm]); - tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -- drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -+ drwl_text(m->drw, borderpx + mw - tw, y, tw, mh, 0, stext, 0); - } - - wl_list_for_each(c, &clients, link) { -@@ -1532,31 +1538,31 @@ drawbar(Monitor *m) - if (c->isurgent) - urg |= c->tags; - } -- x = 0; -+ x = borderpx; - c = focustop(m); - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(m, tags[i]); - drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); -+ drwl_text(m->drw, x, y, w, mh, m->lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) -- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, -+ drwl_rect(m->drw, x + boxs, y + boxs, boxw, boxw, - m == selmon && c && c->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m, m->ltsymbol); - drwl_setscheme(m->drw, colors[SchemeNorm]); -- x = drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, m->ltsymbol, 0); -+ x = drwl_text(m->drw, x, y, w, mh, m->lrpad / 2, m->ltsymbol, 0); - -- if ((w = m->b.width - tw - x) > m->b.height) { -+ if ((w = mw - tw - x + borderpx) > mh) { - if (c) { - drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); -- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -+ drwl_text(m->drw, x, y, w, mh, m->lrpad / 2, client_get_title(c), 0); - if (c && c->isfloating) -- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); -+ drwl_rect(m->drw, x + boxs, y + boxs, boxw, boxw, 0, 0); - } else { - drwl_setscheme(m->drw, colors[SchemeNorm]); -- drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); -+ drwl_rect(m->drw, x, y, w, mh, 1, 1); - } - } - -@@ -3183,7 +3189,7 @@ updatebar(Monitor *m) - - m->b.scale = m->wlr_output->scale; - m->lrpad = m->drw->font->height; -- m->b.height = m->drw->font->height + 2; -+ m->b.height = m->drw->font->height + 2 + borderpx * 2; - m->b.real_height = (int)((float)m->b.height / m->wlr_output->scale); - } - --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/barcolors/README.md b/dwl-bak/dwl-patches/patches/barcolors/README.md deleted file mode 100644 index 640961b..0000000 --- a/dwl-bak/dwl-patches/patches/barcolors/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Add support for colored status text to the [bar](/dwl/dwl-patches/src/branch/main/patches/bar). Text can be colored in the same manner as with dwlb, namely by wrapping it between `^fg(color)` and `^fg()` or `^bg(color)` and `^bg()`, where `color` is a 6-digit hexadecimal value. - -### Download -- [git branch](/kerberoge/dwl/src/branch/barcolors) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/barcolors/barcolors.patch) - -### Authors -- [kerberoge](https://codeberg.org/kerberoge) diff --git a/dwl-bak/dwl-patches/patches/barcolors/barcolors.patch b/dwl-bak/dwl-patches/patches/barcolors/barcolors.patch deleted file mode 100644 index b95f78e..0000000 --- a/dwl-bak/dwl-patches/patches/barcolors/barcolors.patch +++ /dev/null @@ -1,144 +0,0 @@ -From d2b529d9ebee6b2e625afd5c89c2ede5bb0ca91b Mon Sep 17 00:00:00 2001 -From: Kerberoge -Date: Sun, 25 Aug 2024 22:41:55 +0200 -Subject: [PATCH 1/1] updated barcolors - ---- - dwl.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 87 insertions(+), 6 deletions(-) - -diff --git a/dwl.c b/dwl.c -index ece537a..6663399 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -83,6 +83,7 @@ - #define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - #define TEXTW(mon, text) (drwl_font_getwidth(mon->drw, text) + mon->lrpad) -+#define PREFIX(str, prefix) !strncmp(str, prefix, strlen(prefix)) - - /* enums */ - enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ -@@ -318,6 +319,7 @@ static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void drawbar(Monitor *m); - static void drawbars(void); -+static int drawstatus(Monitor *m); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -448,7 +450,7 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - --static char stext[256]; -+static char stext[512]; - static struct wl_event_source *status_event_source; - - static const struct wlr_buffer_impl buffer_impl = { -@@ -1519,11 +1521,8 @@ drawbar(Monitor *m) - return; - - /* draw status first so it can be overdrawn by tags later */ -- if (m == selmon) { /* status is only drawn on selected monitor */ -- drwl_setscheme(m->drw, colors[SchemeNorm]); -- tw = TEXTW(m, stext) - m->lrpad + 2; /* 2px right padding */ -- drwl_text(m->drw, m->b.width - tw, 0, tw, m->b.height, 0, stext, 0); -- } -+ if (m == selmon) /* status is only drawn on selected monitor */ -+ tw = drawstatus(m); - - wl_list_for_each(c, &clients, link) { - if (c->mon != m) -@@ -1577,6 +1576,88 @@ drawbars(void) - drawbar(m); - } - -+int -+drawstatus(Monitor *m) -+{ -+ int x, tw, iw; -+ char rstext[512] = ""; -+ char *p, *argstart, *argend, *itext; -+ uint32_t scheme[3], *color; -+ -+ /* calculate real width of stext */ -+ for (p = stext; *p; p++) { -+ if (PREFIX(p, "^^")) { -+ strncat(rstext, p, 2); -+ p++; -+ } else if (PREFIX(p, "^fg(") || PREFIX(p, "^bg(")) { -+ argend = strchr(p, ')'); -+ if (!argend) { /* ignore this command */ -+ argstart = strchr(p, '(') + 1; -+ strncat(rstext, p, argstart - p); -+ p = argstart - 1; -+ } else { -+ p = argend; -+ } -+ } else { -+ strncat(rstext, p, 1); -+ } -+ } -+ tw = TEXTW(m, rstext) - m->lrpad; -+ -+ x = m->b.width - tw; -+ itext = stext; -+ scheme[0] = colors[SchemeNorm][0]; -+ scheme[1] = colors[SchemeNorm][1]; -+ drwl_setscheme(m->drw, scheme); -+ for (p = stext; *p; p++) { -+ if (PREFIX(p, "^^")) { -+ p++; -+ } else if (PREFIX(p, "^fg(") || PREFIX(p, "^bg(")) { -+ argstart = strchr(p, '(') + 1; -+ argend = strchr(argstart, ')'); -+ if (!argend) { /* ignore this command */ -+ p = argstart - 1; -+ continue; -+ } -+ -+ *p = '\0'; -+ iw = TEXTW(m, itext) - m->lrpad; -+ if (*itext) /* only draw text if there is something to draw */ -+ x = drwl_text(m->drw, x, 0, iw, m->b.height, 0, itext, 0); -+ *p = '^'; -+ -+ if (PREFIX(p, "^fg(")) -+ color = &scheme[0]; -+ else -+ color = &scheme[1]; -+ -+ if (argend != argstart) { -+ *argend = '\0'; -+ *color = strtoul(argstart, NULL, 16); -+ *color = *color << 8 | 0xff; /* add alpha channel */ -+ *argend = ')'; -+ } else { -+ *color = 0; /* reset */ -+ } -+ -+ /* reset color back to normal if none was provided */ -+ if (!scheme[0]) -+ scheme[0] = colors[SchemeNorm][0]; -+ if (!scheme[1]) -+ scheme[1] = colors[SchemeNorm][1]; -+ -+ itext = argend + 1; -+ drwl_setscheme(m->drw, scheme); -+ p = argend; -+ } -+ } -+ iw = TEXTW(m, itext) - m->lrpad; -+ if (*itext) -+ drwl_text(m->drw, x, 0, iw, m->b.height, 0, itext, 0); -+ -+ return tw; -+} -+ - void - focusclient(Client *c, int lift) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/barpadding/README.md b/dwl-bak/dwl-patches/patches/barpadding/README.md deleted file mode 100644 index 1d0f17b..0000000 --- a/dwl-bak/dwl-patches/patches/barpadding/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description - -Add vertical and horizontal space between the [bar](/dwl/dwl-patches/wiki/bar) and the edge of the screen. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/barpadding/barpadding.patch) - -### Authors -- [sewn](https://codeberg.org/sewn) - diff --git a/dwl-bak/dwl-patches/patches/barpadding/barpadding.patch b/dwl-bak/dwl-patches/patches/barpadding/barpadding.patch deleted file mode 100644 index e5cc185..0000000 --- a/dwl-bak/dwl-patches/patches/barpadding/barpadding.patch +++ /dev/null @@ -1,73 +0,0 @@ -From f01cea73042155e856b2f41452724fe5c895eee4 Mon Sep 17 00:00:00 2001 -From: sewn -Date: Fri, 23 Aug 2024 09:59:03 +0300 -Subject: [PATCH] add vertical and horizontal spacing to bar - -https://dwm.suckless.org/patches/barpadding/ ---- - config.def.h | 2 ++ - dwl.c | 14 +++++++------- - 2 files changed, 9 insertions(+), 7 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 5d1dc2b..756b1ae 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -9,6 +9,8 @@ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -+static const int vertpad = 10; /* vertical padding of bar */ -+static const int sidepad = 10; /* horizontal padding of bar */ - static const char *fonts[] = {"monospace:size=10"}; - static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ -diff --git a/dwl.c b/dwl.c -index ece537a..380549a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -598,8 +598,8 @@ arrangelayers(Monitor *m) - return; - - if (m->scene_buffer->node.enabled) { -- usable_area.height -= m->b.real_height; -- usable_area.y += topbar ? m->b.real_height : 0; -+ usable_area.height -= m->b.real_height + vertpad; -+ usable_area.y += topbar ? m->b.real_height + vertpad : 0; - } - - /* Arrange exclusive surfaces from top->bottom */ -@@ -750,7 +750,7 @@ buttonpress(struct wl_listener *listener, void *data) - if (!c && !exclusive_focus && - (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && - (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { -- cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -+ cx = (cursor->x - selmon->m.x - sidepad) * selmon->wlr_output->scale; - do - x += TEXTW(selmon, tags[i]); - while (cx >= x && ++i < LENGTH(tags)); -@@ -1562,8 +1562,8 @@ drawbar(Monitor *m) - - wlr_scene_buffer_set_dest_size(m->scene_buffer, - m->b.real_width, m->b.real_height); -- wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x, -- m->m.y + (topbar ? 0 : m->m.height - m->b.real_height)); -+ wlr_scene_node_set_position(&m->scene_buffer->node, m->m.x + sidepad, -+ m->m.y + (topbar ? vertpad : m->m.height - m->b.real_height - vertpad)); - wlr_scene_buffer_set_buffer(m->scene_buffer, &buf->base); - wlr_buffer_unlock(&buf->base); - } -@@ -3162,8 +3162,8 @@ updatebar(Monitor *m) - char fontattrs[12]; - - wlr_output_transformed_resolution(m->wlr_output, &rw, &rh); -- m->b.width = rw; -- m->b.real_width = (int)((float)m->b.width / m->wlr_output->scale); -+ m->b.width = rw - (2 * sidepad); -+ m->b.real_width = (int)((float)rw / m->wlr_output->scale) - (2 * sidepad); - - wlr_scene_node_set_enabled(&m->scene_buffer->node, m->wlr_output->enabled ? showbar : 0); - --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/bartruecenteredtitle/README.md b/dwl-bak/dwl-patches/patches/bartruecenteredtitle/README.md deleted file mode 100644 index 94bfcd9..0000000 --- a/dwl-bak/dwl-patches/patches/bartruecenteredtitle/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -A homegrown port of dwm's _truecenteredtitle_ patch, with the addition of a config option to toggle its effects.
Requires [the bar patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/bar) to be applied beforehand. - -![](centeredtitle.webp) - -### Download -- [v0.7/v0.6](/dwl/dwl-patches/raw/branch/main/patches/bartruecenteredtitle/bartruecenteredtitle.patch)
Works on both v0.7 and v0.6. - -### Author -- [moonsabre](https://codeberg.org/moonsabre) -- [sewn](https://codeberg.org/sewn) diff --git a/dwl-bak/dwl-patches/patches/bartruecenteredtitle/bartruecenteredtitle.patch b/dwl-bak/dwl-patches/patches/bartruecenteredtitle/bartruecenteredtitle.patch deleted file mode 100644 index ce02a51..0000000 --- a/dwl-bak/dwl-patches/patches/bartruecenteredtitle/bartruecenteredtitle.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 17501c9f28226b1f332d6842be0d7f50ba618a29 Mon Sep 17 00:00:00 2001 -From: moonsabre -Date: Fri, 14 Mar 2025 16:04:25 -0700 -Subject: [PATCH] Bar title centering parameter. - ---- - config.def.h | 1 + - dwl.c | 9 +++++++-- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 5d1dc2b..8ac3a8b 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -9,6 +9,7 @@ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -+static const int centeredtitle = 1; /* 1 means centered title */ - static const char *fonts[] = {"monospace:size=10"}; - static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ -diff --git a/dwl.c b/dwl.c -index ece537a..9eb816b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1551,9 +1551,14 @@ drawbar(Monitor *m) - if ((w = m->b.width - tw - x) > m->b.height) { - if (c) { - drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]); -- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0); -+ tw = TEXTW(selmon, client_get_title(c)); -+ drwl_text(m->drw, x, 0, w, m->b.height, -+ !centeredtitle || tw > w ? m->lrpad / 2 : (w - tw) / 2, -+ client_get_title(c), 0); - if (c && c->isfloating) -- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0); -+ drwl_rect(m->drw, -+ !centeredtitle || tw > w ? x + boxs : x + ((w - tw) / 2 - boxs * 8), -+ boxs, boxw, boxw, 0, 0); - } else { - drwl_setscheme(m->drw, colors[SchemeNorm]); - drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1); --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/bartruecenteredtitle/centeredtitle.webp b/dwl-bak/dwl-patches/patches/bartruecenteredtitle/centeredtitle.webp deleted file mode 100644 index b1ad696a2e7665e902773945aad85e7cf37b5375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25596 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 -Date: Thu, 17 Jul 2025 11:59:18 +0200 -Subject: [PATCH] Add configurable window resize - -Signed-off-by: mmistika ---- - config.def.h | 12 ++++++++++++ - dwl.c | 45 +++++++++++++++++++++++++++++++++++++-------- - 2 files changed, 49 insertions(+), 8 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..e404549 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,18 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+/* window resizing */ -+/* resize_corner: -+ * 0: top-left -+ * 1: top-right -+ * 2: bottom-left -+ * 3: bottom-right -+ * 4: closest to the cursor -+ */ -+static const int resize_corner = 4; -+static const int warp_cursor = 1; /* 1: warp to corner, 0: don’t warp */ -+static const int lock_cursor = 0; /* 1: lock cursor, 0: don't lock */ -+ - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ -diff --git a/dwl.c b/dwl.c -index c717c1d..aacd074 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -407,6 +407,7 @@ static KeyboardGroup *kb_group; - static unsigned int cursor_mode; - static Client *grabc; - static int grabcx, grabcy; /* client-relative */ -+static int rzcorner; - - static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; -@@ -1873,8 +1874,24 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - .width = grabc->geom.width, .height = grabc->geom.height}, 1); - return; - } else if (cursor_mode == CurResize) { -- resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -+ int cdx = (int)round(cursor->x) - grabcx; -+ int cdy = (int)round(cursor->y) - grabcy; -+ -+ const struct wlr_box box = { -+ .x = grabc->geom.x + (rzcorner & 1 ? 0 : cdx), -+ .y = grabc->geom.y + (rzcorner & 2 ? 0 : cdy), -+ .width = grabc->geom.width + (rzcorner & 1 ? cdx : -cdx), -+ .height = grabc->geom.height + (rzcorner & 2 ? cdy : -cdy) -+ }; -+ resize(grabc, box, 1); -+ -+ if (!lock_cursor) { -+ grabcx += cdx; -+ grabcy += cdy; -+ } else { -+ wlr_cursor_warp_closest(cursor, NULL, grabcx, grabcy); -+ } -+ - return; - } - -@@ -1920,12 +1937,24 @@ moveresize(const Arg *arg) - wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); - break; - case CurResize: -- /* Doesn't work for X11 output - the next absolute motion event -- * returns the cursor to where it started */ -- wlr_cursor_warp_closest(cursor, NULL, -- grabc->geom.x + grabc->geom.width, -- grabc->geom.y + grabc->geom.height); -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ const char *cursors[] = { "nw-resize", "ne-resize", "sw-resize", "se-resize" }; -+ -+ rzcorner = resize_corner; -+ grabcx = (int)round(cursor->x); -+ grabcy = (int)round(cursor->y); -+ -+ if (rzcorner == 4) -+ /* identify the closest corner index */ -+ rzcorner = (grabcx - grabc->geom.x < grabc->geom.x + grabc->geom.width - grabcx ? 0 : 1) -+ + (grabcy - grabc->geom.y < grabc->geom.y + grabc->geom.height - grabcy ? 0 : 2); -+ -+ if (warp_cursor) { -+ grabcx = rzcorner & 1 ? grabc->geom.x + grabc->geom.width : grabc->geom.x; -+ grabcy = rzcorner & 2 ? grabc->geom.y + grabc->geom.height : grabc->geom.y; -+ wlr_cursor_warp_closest(cursor, NULL, grabcx, grabcy); -+ } -+ -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, cursors[rzcorner]); - break; - } - } --- -2.50.1 - diff --git a/dwl-bak/dwl-patches/patches/borders/README.md b/dwl-bak/dwl-patches/patches/borders/README.md deleted file mode 100644 index b046307..0000000 --- a/dwl-bak/dwl-patches/patches/borders/README.md +++ /dev/null @@ -1,37 +0,0 @@ -### Description -Adds 2 more borders to each side (top, bottom, left, right) of every window. - - - -
-Preview -
-With the following config:
-
-```c
-static const unsigned int borderpx         = 9;  /* border pixel of windows */
-static const unsigned int borderspx        = 3;  /* width of the border that start from outside the windows */
-static const unsigned int borderepx        = 3;  /* width of the border that start from inside the windows */
-```
-
-and `border_color_type` set to `BrdOriginal`:
-
-
-and `border_color_type` set to `BrdStart`:
-
-
-and `border_color_type` set to `BrdEnd`:
-
-
-and `border_color_type` set to `BrdStartEnd`:
-
-
-
- -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/borders) -- [2024-06-04](https://codeberg.org/dwl/dwl-patches/raw/commit/1a6825f2b8cd23044312c8040d0bf63ee7f85bc5/patches/borders/borders.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/borders/borders.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/borders/borders.patch b/dwl-bak/dwl-patches/patches/borders/borders.patch deleted file mode 100644 index c8cc847..0000000 --- a/dwl-bak/dwl-patches/patches/borders/borders.patch +++ /dev/null @@ -1,213 +0,0 @@ -From b12cfff672f0705d8259cf26b3a574faa5ca43ae Mon Sep 17 00:00:00 2001 -From: wochap -Date: Tue, 4 Jun 2024 16:02:25 -0500 -Subject: [PATCH] implement borders patch - -tihs patch adds 2 extra borders relative to the client, they don't -change the size of the client ---- - client.h | 16 +++++++++++++--- - config.def.h | 8 ++++++++ - dwl.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++---- - 3 files changed, 70 insertions(+), 7 deletions(-) - -diff --git a/client.h b/client.h -index 800b867..33fd579 100644 ---- a/client.h -+++ b/client.h -@@ -325,11 +325,21 @@ client_send_close(Client *c) - } - - static inline void --client_set_border_color(Client *c, const float color[static 4]) -+client_set_border_color(Client *c, const float color[static 4], const float colors[static 4], const float colore[static 4]) - { - int i; -- for (i = 0; i < 4; i++) -- wlr_scene_rect_set_color(c->border[i], color); -+ for (i = 0; i < 4; i++) { -+ if (border_color_type == BrdOriginal) { -+ wlr_scene_rect_set_color(c->border[i], color); -+ } else if (border_color_type == BrdStart) { -+ wlr_scene_rect_set_color(c->borders[i], colors); -+ } else if (border_color_type == BrdEnd) { -+ wlr_scene_rect_set_color(c->bordere[i], colore); -+ } else if (border_color_type == BrdStartEnd) { -+ wlr_scene_rect_set_color(c->borders[i], colors); -+ wlr_scene_rect_set_color(c->bordere[i], colore); -+ } -+ } - } - - static inline void -diff --git a/config.def.h b/config.def.h -index 8847e58..2d6bbe5 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,8 +7,16 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int borderspx = 0; /* width of the border that start from outside the windows */ -+static const unsigned int borderepx = 0; /* width of the border that start from inside the windows */ -+static const unsigned int borderspx_offset = 0; /* offset of the border that start from outside the windows */ -+static const unsigned int borderepx_negative_offset = 0; /* offset of the border that start from inside the windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); -+static const float borderscolor[] = COLOR(0x444444ff); /* color of the border that start from outside the windows */ -+static const float borderecolor[] = COLOR(0x444444ff); /* color of the border that start from inside the windows */ -+static const int border_color_type = BrdOriginal; /* borders to be colored (focuscolor, urgentcolor) */ -+static const int borders_only_floating = 0; - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ -diff --git a/dwl.c b/dwl.c -index bf763df..303832a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -86,6 +86,7 @@ enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ - #endif -+enum { BrdOriginal, BrdStart, BrdEnd, BrdStartEnd }; - - typedef union { - int i; -@@ -109,6 +110,8 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *borders[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *bordere[4]; /* top, bottom, left, right */ - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -136,6 +139,8 @@ typedef struct { - struct wl_listener set_hints; - #endif - unsigned int bw; -+ unsigned int bws; -+ unsigned int bwe; - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -@@ -973,6 +978,8 @@ createnotify(struct wl_listener *listener, void *data) - c = xdg_surface->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = xdg_surface; - c->bw = borderpx; -+ c->bws = borders_only_floating ? 0 : borderspx; -+ c->bwe = borders_only_floating ? 0 : borderepx; - - wlr_xdg_toplevel_set_wm_capabilities(xdg_surface->toplevel, - WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); -@@ -1268,7 +1275,7 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, focuscolor, focuscolor, focuscolor); - } - - /* Deactivate old client if focus is changing */ -@@ -1285,7 +1292,7 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -+ client_set_border_color(old_c, bordercolor, borderscolor, borderecolor); - - client_activate_surface(old, 0); - } -@@ -1597,6 +1604,12 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, - c->isurgent ? urgentcolor : bordercolor); - c->border[i]->node.data = c; -+ -+ c->borders[i] = wlr_scene_rect_create(c->scene, 0, 0, borderscolor); -+ c->borders[i]->node.data = c; -+ -+ c->bordere[i] = wlr_scene_rect_create(c->scene, 0, 0, borderecolor); -+ c->bordere[i]->node.data = c; - } - - /* Initialize client geometry with room for border */ -@@ -1618,6 +1631,12 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -+ -+ if (borders_only_floating) { -+ c->bws = c->isfloating ? borderspx : 0; -+ c->bwe = c->isfloating ? borderepx : 0; -+ } -+ - printstatus(); - - unset_fullscreen: -@@ -2051,6 +2070,24 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); - -+ wlr_scene_rect_set_size(c->borders[0], c->geom.width - 2 * borderspx_offset, c->bws); -+ wlr_scene_rect_set_size(c->borders[1], c->geom.width - 2 * borderspx_offset, c->bws); -+ wlr_scene_rect_set_size(c->borders[2], c->bws, c->geom.height - 2 * c->bws - 2 * borderspx_offset); -+ wlr_scene_rect_set_size(c->borders[3], c->bws, c->geom.height - 2 * c->bws - 2 * borderspx_offset); -+ wlr_scene_node_set_position(&c->borders[0]->node, borderspx_offset, borderspx_offset); -+ wlr_scene_node_set_position(&c->borders[1]->node, borderspx_offset, c->geom.height - c->bws - borderspx_offset); -+ wlr_scene_node_set_position(&c->borders[2]->node, borderspx_offset, c->bws + borderspx_offset); -+ wlr_scene_node_set_position(&c->borders[3]->node, c->geom.width - c->bws - borderspx_offset, c->bws + borderspx_offset); -+ -+ wlr_scene_rect_set_size(c->bordere[0], c->geom.width - (c->bw - c->bwe) * 2 + borderepx_negative_offset * 2, c->bwe); -+ wlr_scene_rect_set_size(c->bordere[1], c->geom.width - (c->bw - c->bwe) * 2 + borderepx_negative_offset * 2, c->bwe); -+ wlr_scene_rect_set_size(c->bordere[2], c->bwe, c->geom.height - 2 * c->bw + 2 * borderepx_negative_offset); -+ wlr_scene_rect_set_size(c->bordere[3], c->bwe, c->geom.height - 2 * c->bw + 2 * borderepx_negative_offset); -+ wlr_scene_node_set_position(&c->bordere[0]->node, c->bw - c->bwe - borderepx_negative_offset, c->bw - c->bwe - borderepx_negative_offset); -+ wlr_scene_node_set_position(&c->bordere[1]->node, c->bw - c->bwe - borderepx_negative_offset, c->geom.height - c->bw + borderepx_negative_offset); -+ wlr_scene_node_set_position(&c->bordere[2]->node, c->bw - c->bwe - borderepx_negative_offset, c->bw - borderepx_negative_offset); -+ wlr_scene_node_set_position(&c->bordere[3]->node, c->geom.width - c->bw + borderepx_negative_offset, c->bw - borderepx_negative_offset); -+ - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, - c->geom.height - 2 * c->bw); -@@ -2151,6 +2188,12 @@ setfloating(Client *c, int floating) - c->isfloating = floating; - if (!c->mon) - return; -+ -+ if (borders_only_floating) { -+ c->bws = c->isfloating ? borderspx : 0; -+ c->bwe = c->isfloating ? borderepx : 0; -+ } -+ - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen || - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); -@@ -2165,6 +2208,8 @@ setfullscreen(Client *c, int fullscreen) - if (!c->mon) - return; - c->bw = fullscreen ? 0 : borderpx; -+ c->bws = fullscreen ? 0 : borderspx; -+ c->bwe = fullscreen ? 0 : borderepx; - client_set_fullscreen(c, fullscreen); - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen - ? LyrFS : c->isfloating ? LyrFloat : LyrTile]); -@@ -2819,7 +2864,7 @@ urgent(struct wl_listener *listener, void *data) - printstatus(); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, urgentcolor, urgentcolor, urgentcolor); - } - - void -@@ -3023,7 +3068,7 @@ sethints(struct wl_listener *listener, void *data) - printstatus(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, urgentcolor, urgentcolor, urgentcolor); - } - - void --- -2.44.1 diff --git a/dwl-bak/dwl-patches/patches/bottomstack/README.md b/dwl-bak/dwl-patches/patches/bottomstack/README.md deleted file mode 100644 index fa9ede6..0000000 --- a/dwl-bak/dwl-patches/patches/bottomstack/README.md +++ /dev/null @@ -1,27 +0,0 @@ -### Description -bstack and bstackhoriz are two stack layouts for dwl. -### Scheme -``` -bstack (TTT) bstackhoriz (===) -+-----------------+ +-----------------+ -| | | | -| | | | -| | | | -+-----+-----+-----+ +-----------------+ -| | | | +-----------------+ -| | | | +-----------------+ -+-----+-----+-----+ +-----------------+ -``` - - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.6-b/bottomstack) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/20de07dc8759200c8a4c9651475acb331d245890/patches/bottomstack/bottomstack.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/0f4e40fee49d1b8b430778e241b29496ae3b3b70/bottomstack/bottomstack.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/5368aa392c7ebf8d7d24c232b80cfae1be457d41/bottomstack/bottomstack.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [DanielMowitz](https://github.com/DanielMowitz) -- [Abanoub8](https://github.com/Abanoub8) - diff --git a/dwl-bak/dwl-patches/patches/bottomstack/bottomstack.patch b/dwl-bak/dwl-patches/patches/bottomstack/bottomstack.patch deleted file mode 100644 index c2b9331..0000000 --- a/dwl-bak/dwl-patches/patches/bottomstack/bottomstack.patch +++ /dev/null @@ -1,140 +0,0 @@ -From b352fb08f40b1ee2d8c4748be4922df711e3aaa9 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 10:44:29 -0500 -Subject: [PATCH] implement bottomstack - ---- - config.def.h | 4 +++ - dwl.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 88 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..5aac3e9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,8 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "TTT", bstack }, -+ { "===", bstackhoriz }, - }; - - /* monitors */ -@@ -139,6 +141,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_u, setlayout, {.v = &layouts[3]} }, -+ { MODKEY, XKB_KEY_o, setlayout, {.v = &layouts[4]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index dc0437e..5648d5f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -57,6 +57,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -351,6 +352,8 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void bstack(Monitor *m); -+static void bstackhoriz(Monitor *m); - - /* variables */ - static const char broken[] = "broken"; -@@ -3160,3 +3163,84 @@ main(int argc, char *argv[]) - usage: - die("Usage: %s [-v] [-d] [-s startup command]", argv[0]); - } -+ -+static void -+bstack(Monitor *m) -+{ -+ int w, h, mh, mx, tx, ty, tw; -+ int i, n = 0; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating) -+ n++; -+ if (n == 0) -+ return; -+ -+ if (n > m->nmaster) { -+ mh = (int)round(m->nmaster ? m->mfact * m->w.height : 0); -+ tw = m->w.width / (n - m->nmaster); -+ ty = m->w.y + mh; -+ } else { -+ mh = m->w.height; -+ tw = m->w.width; -+ ty = m->w.y; -+ } -+ -+ i = mx = 0; -+ tx = m-> w.x; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating) -+ continue; -+ if (i < m->nmaster) { -+ w = (m->w.width - mx) / (MIN(n, m->nmaster) - i); -+ resize(c, (struct wlr_box) { .x = m->w.x + mx, .y = m->w.y, .width = w, .height = mh }, 0); -+ mx += c->geom.width; -+ } else { -+ h = m->w.height - mh; -+ resize(c, (struct wlr_box) { .x = tx, .y = ty, .width = tw, .height = h }, 0); -+ if (tw != m->w.width) -+ tx += c->geom.width; -+ } -+ i++; -+ } -+} -+ -+static void -+bstackhoriz(Monitor *m) { -+ int w, mh, mx, tx, ty, th; -+ int i, n = 0; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating) -+ n ++; -+ if (n == 0) -+ return; -+ -+ if (n > m->nmaster) { -+ mh = (int)round(m->nmaster ? m->mfact * m->w.height : 0); -+ th = (m->w.height - mh) / (n - m->nmaster); -+ ty = m->w.y + mh; -+ } else { -+ th = mh = m->w.height; -+ ty = m->w.y; -+ } -+ -+ i = mx = 0; -+ tx = m-> w.x; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c,m) || c->isfloating) -+ continue; -+ if (i < m->nmaster) { -+ w = (m->w.width - mx) / (MIN(n, m->nmaster) - i); -+ resize(c, (struct wlr_box) { .x = m->w.x + mx, .y = m->w.y, .width = w, .height = mh }, 0); -+ mx += c->geom.width; -+ } else { -+ resize(c, (struct wlr_box) { .x = tx, .y = ty, .width = m->w.width, .height = th }, 0); -+ if (th != m->w.height) -+ ty += c->geom.height; -+ } -+ i++; -+ } -+} --- -2.45.1 diff --git a/dwl-bak/dwl-patches/patches/btrtile/README.md b/dwl-bak/dwl-patches/patches/btrtile/README.md deleted file mode 100644 index 4766aa7..0000000 --- a/dwl-bak/dwl-patches/patches/btrtile/README.md +++ /dev/null @@ -1,103 +0,0 @@ -### Description - -# btrtile — A Focus-Driven Tiling Layout - -It provides a focus-driven, mouse- and keyboard-friendly tiling layout that grants you granular control over how clients are placed and resized. - -![btrtile in action](https://github.com/julmajustus/dwl-patches/blob/main/demos/btrtiledemo.gif?raw=true) - ---- - -# Why btrtile - -While dwl’s patches folder is full of different layouts, I couldn't find suitable layout that would work well with my workflow and single ultrawide monitor setup. btrtile aims to solve that by introducing a layout strategy that splits clients according to user focus and pointer position. - ---- - -# Features - -- **Combined Tiling and Management** - Combines tiling layout and management of clients under one patchset. - -- **Focus-Driven Splits** - When you add a new client, btrtile checks where your pointer is relative to the focused client’s geometry. - - If the pointer is on the left half (for a horizontally large client), the new client spawns on the left side, and vice versa. - - By default, new splits are 50/50. - -- **Adaptive Splitting** - - If the area to be split is wider than its height, btrtile does a vertical split. - - Otherwise, it does a horizontal split. - -- **Keyboard and Mouse Driven** - - Supports keyboard-based commands for quick ratio adjustments and client swapping. - - Mouse-based resizing and moving are integrated for more intuitive manipulation. - ---- - -# How It Works - -btrtile organizes clients using a binary tree data structure that represents splits either vertically or horizontally. - -When a new client appears: -1. **Focused Client Detection** - btrtile checks your pointer location to find which client (if any) you’re interacting with. -2. **Split Creation** - - If there’s a focused client, btrtile creates a split node around it, placing the new client on the side where your pointer is. - -3. **Ratio Management** - Each split node has a `split_ratio` (defaulting to 0.5). This ratio defines how much space is allocated to each child node. You can adjust this ratio using keyboard or mouse actions. - ---- - -# What It Doesn’t Handle - -- **Suckless philosophy** - - Yea, it's a bloat. I tried to hide the suck inside a single file as much I could. While this approach is not ideal, it's how it's at least for now. - ---- - -# Configuring btrtile - -btrtile adds couple variables to config.h to fine tune the mouse resizing of tiled clients. - -1. **resize_factor** - - A multiplier to transfer pointer movement to client weight ratio. Depends heavily on mouse sensivity. - Defaults to 0.0002f. - -2. **resize_interval_ms** - - A time based resize call limiter. Depends on framerate and screen refresh rate. - Defaults to 16ms. (~60 resize updates per second) - -Fine tune these values to find the best values for your setup, smoother resizing can significally increase cpu overhead. -If mouse resizing feels sluggish, you can try compiling dwl with more aggressive optimization flags like -O2/-O3. - ---- - -# Patch recommendations - -1. **Patches that I use with my btrtile** - - - [focusdir](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/focusdir) - Great patch to move focus between clients. - - - [rotatetags](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/rotatetags) - Good patch to rotate the view or shift clients between tags. - - - [warpcursor](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/warpcursor) - Moves cursor location to focused client. - - - [pertag](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/pertag) - Allows each tag to have individual layout setups. - - - [gaps](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/gaps) - Add gaps between clients. - ---- - -### Download -- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/btrtile-dev) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/btrtile/btrtile-v0.7.patch) -- [0.7 WITH gaps](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/btrtile/btrtile-v0.7-gaps.patch) - -### Authors -- [julmajustus](https://codeberg.org/julmajustus) diff --git a/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7-gaps.patch b/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7-gaps.patch deleted file mode 100644 index 90354d1..0000000 --- a/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7-gaps.patch +++ /dev/null @@ -1,922 +0,0 @@ -From 858ef20d36c2d5e6a23a69b3b5909a80fab05f97 Mon Sep 17 00:00:00 2001 -From: julmajustus -Date: Thu, 13 Feb 2025 23:25:20 +0200 -Subject: [PATCH] btrtile-gaps with multi-tag support - ---- - btrtile.c | 582 +++++++++++++++++++++++++++++++++++++++++++++++++++ - config.def.h | 12 ++ - dwl.c | 152 +++++++++++--- - 3 files changed, 717 insertions(+), 29 deletions(-) - create mode 100644 btrtile.c - -diff --git a/btrtile.c b/btrtile.c -new file mode 100644 -index 0000000..650cab5 ---- /dev/null -+++ b/btrtile.c -@@ -0,0 +1,582 @@ -+/* ************************************************************************** */ -+/* */ -+/* ::: :::::::: */ -+/* btrtile.c :+: :+: :+: */ -+/* +:+ +:+ +:+ */ -+/* By: jmakkone +#+ +:+ +#+ */ -+/* +#+#+#+#+#+ +#+ */ -+/* Created: 2024/12/15 00:26:07 by jmakkone #+# #+# */ -+/* Updated: 2025/02/13 23:25:03 by jmakkone ### ########.fr */ -+/* */ -+/* ************************************************************************** */ -+ -+typedef struct LayoutNode { -+ unsigned int is_client_node; -+ unsigned int is_split_vertically; -+ float split_ratio; -+ struct LayoutNode *left; -+ struct LayoutNode *right; -+ struct LayoutNode *split_node; -+ Client *client; -+} LayoutNode; -+ -+static void apply_layout(Monitor *m, LayoutNode *node, -+ struct wlr_box area, unsigned int is_root); -+static void btrtile(Monitor *m); -+static LayoutNode *create_client_node(Client *c); -+static LayoutNode *create_split_node(unsigned int is_split_vertically, -+ LayoutNode *left, LayoutNode *right); -+static void destroy_node(LayoutNode *node); -+static void destroy_tree(Monitor *m); -+static LayoutNode *find_client_node(LayoutNode *node, Client *c); -+static LayoutNode *find_suitable_split(LayoutNode *start, unsigned int need_vert); -+static void init_tree(Monitor *m); -+static void insert_client(Monitor *m, Client *focused_client, Client *new_client); -+static LayoutNode *remove_client_node(LayoutNode *node, Client *c); -+static void remove_client(Monitor *m, Client *c); -+static void setratio_h(const Arg *arg); -+static void setratio_v(const Arg *arg); -+static void swapclients(const Arg *arg); -+static unsigned int visible_count(LayoutNode *node, Monitor *m); -+static Client *xytoclient(double x, double y); -+ -+static int resizing_from_mouse = 0; -+static double resize_last_update_x, resize_last_update_y; -+static uint32_t last_resize_time = 0; -+ -+void -+apply_layout(Monitor *m, LayoutNode *node, -+ struct wlr_box area, unsigned int is_root) -+{ -+ Client *c; -+ float ratio; -+ unsigned int left_count, right_count, mid, e = m->gaps; -+ struct wlr_box left_area, right_area; -+ -+ if (!node) -+ return; -+ -+ if (is_root && e) { -+ area.x += gappx; -+ area.y += gappx; -+ area.width -= 2 * gappx; -+ area.height -= 2 * gappx; -+ } -+ -+ /* If this node is a client node, check if it is visible. */ -+ if (node->is_client_node) { -+ c = node->client; -+ if (!c || !VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ return; -+ resize(c, area, 0); -+ c->old_geom = area; -+ return; -+ } -+ -+ /* For a split node, we see how many visible children are on each side: */ -+ left_count = visible_count(node->left, m); -+ right_count = visible_count(node->right, m); -+ -+ if (left_count == 0 && right_count == 0) { -+ return; -+ } else if (left_count > 0 && right_count == 0) { -+ apply_layout(m, node->left, area, 0); -+ return; -+ } else if (left_count == 0 && right_count > 0) { -+ apply_layout(m, node->right, area, 0); -+ return; -+ } -+ -+ /* If we’re here, we have visible clients in both subtrees. */ -+ ratio = node->split_ratio; -+ if (ratio < 0.05f) -+ ratio = 0.05f; -+ if (ratio > 0.95f) -+ ratio = 0.95f; -+ -+ memset(&left_area, 0, sizeof(left_area)); -+ memset(&right_area, 0, sizeof(right_area)); -+ -+ if (node->is_split_vertically) { -+ mid = (unsigned int)(area.width * ratio); -+ left_area.x = area.x; -+ left_area.y = area.y; -+ left_area.width = mid; -+ left_area.height = area.height; -+ -+ right_area.x = area.x + mid; -+ right_area.y = area.y; -+ right_area.width = area.width - mid; -+ right_area.height = area.height; -+ -+ if (e) { -+ left_area.width -= gappx / 2; -+ right_area.x += gappx / 2; -+ right_area.width -= gappx / 2; -+ } -+ } else { -+ /* horizontal split */ -+ mid = (unsigned int)(area.height * ratio); -+ left_area.x = area.x; -+ left_area.y = area.y; -+ left_area.width = area.width; -+ left_area.height = mid; -+ -+ right_area.x = area.x; -+ right_area.y = area.y + mid; -+ right_area.width = area.width; -+ right_area.height= area.height - mid; -+ -+ if (e) { -+ left_area.height -= gappx / 2; -+ right_area.y += gappx / 2; -+ right_area.height -= gappx / 2; -+ } -+ } -+ -+ apply_layout(m, node->left, left_area, 0); -+ apply_layout(m, node->right, right_area, 0); -+} -+ -+void -+btrtile(Monitor *m) -+{ -+ Client *c, *focused = NULL; -+ int n = 0; -+ LayoutNode *found; -+ struct wlr_box full_area; -+ -+ if (!m || !m->root) -+ return; -+ -+ /* Remove non tiled clients from tree. */ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon == m && !c->isfloating && !c->isfullscreen) { -+ } else { -+ remove_client(m, c); -+ } -+ } -+ -+ /* If no client is found under cursor, fallback to focustop(m) */ -+ if (!(focused = xytoclient(cursor->x, cursor->y))) -+ focused = focustop(m); -+ -+ /* Insert visible clients that are not part of the tree. */ -+ wl_list_for_each(c, &clients, link) { -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen && c->mon == m) { -+ found = find_client_node(m->root, c); -+ if (!found) { -+ insert_client(m, focused, c); -+ } -+ n++; -+ } -+ } -+ -+ if (n == 0) -+ return; -+ -+ full_area = m->w; -+ apply_layout(m, m->root, full_area, 1); -+} -+ -+LayoutNode * -+create_client_node(Client *c) -+{ -+ LayoutNode *node = calloc(1, sizeof(LayoutNode)); -+ -+ if (!node) -+ return NULL; -+ node->is_client_node = 1; -+ node->split_ratio = 0.5f; -+ node->client = c; -+ return node; -+} -+ -+LayoutNode * -+create_split_node(unsigned int is_split_vertically, -+ LayoutNode *left, LayoutNode *right) -+{ -+ LayoutNode *node = calloc(1, sizeof(LayoutNode)); -+ -+ if (!node) -+ return NULL; -+ node->is_client_node = 0; -+ node->split_ratio = 0.5f; -+ node->is_split_vertically = is_split_vertically; -+ node->left = left; -+ node->right = right; -+ if (left) -+ left->split_node = node; -+ if (right) -+ right->split_node = node; -+ return node; -+} -+ -+void -+destroy_node(LayoutNode *node) -+{ -+ if (!node) -+ return; -+ if (!node->is_client_node) { -+ destroy_node(node->left); -+ destroy_node(node->right); -+ } -+ free(node); -+} -+ -+void -+destroy_tree(Monitor *m) -+{ -+ if (!m || !m->root) -+ return; -+ destroy_node(m->root); -+ m->root = NULL; -+} -+ -+LayoutNode * -+find_client_node(LayoutNode *node, Client *c) -+{ -+ LayoutNode *res; -+ -+ if (!node || !c) -+ return NULL; -+ if (node->is_client_node) { -+ return (node->client == c) ? node : NULL; -+ } -+ res = find_client_node(node->left, c); -+ return res ? res : find_client_node(node->right, c); -+} -+ -+LayoutNode * -+find_suitable_split(LayoutNode *start_node, unsigned int need_vertical) -+{ -+ LayoutNode *n = start_node; -+ /* if we started from a client node, jump to its parent: */ -+ if (n && n->is_client_node) -+ n = n->split_node; -+ -+ while (n) { -+ if (!n->is_client_node && n->is_split_vertically == need_vertical && -+ visible_count(n->left, selmon) > 0 && visible_count(n->right, selmon) > 0) -+ return n; -+ n = n->split_node; -+ } -+ return NULL; -+} -+ -+void -+init_tree(Monitor *m) -+{ -+ if (!m) -+ return; -+ m->root = calloc(1, sizeof(LayoutNode)); -+ if (!m->root) -+ m->root = NULL; -+} -+ -+void -+insert_client(Monitor *m, Client *focused_client, Client *new_client) -+{ -+ Client *old_client; -+ LayoutNode **root = &m->root, *old_root, -+ *focused_node, *new_client_node, *old_client_node; -+ unsigned int wider, mid_x, mid_y; -+ -+ /* If no root , new client becomes the root. */ -+ if (!*root) { -+ *root = create_client_node(new_client); -+ return; -+ } -+ -+ /* Find the focused_client node, -+ * if not found split the root. */ -+ focused_node = focused_client ? -+ find_client_node(*root, focused_client) : NULL; -+ if (!focused_node) { -+ old_root = *root; -+ new_client_node = create_client_node(new_client); -+ *root = create_split_node(1, old_root, new_client_node); -+ return; -+ } -+ -+ /* Turn focused node from a client node into a split node, -+ * and attach old_client + new_client. */ -+ old_client = focused_node->client; -+ old_client_node = create_client_node(old_client); -+ new_client_node = create_client_node(new_client); -+ -+ /* Decide split direction. */ -+ wider = (focused_client->geom.width >= focused_client->geom.height); -+ focused_node->is_client_node = 0; -+ focused_node->client = NULL; -+ focused_node->is_split_vertically = (wider ? 1 : 0); -+ -+ /* Pick new_client side depending on the cursor position. */ -+ mid_x = focused_client->geom.x + focused_client->geom.width / 2; -+ mid_y = focused_client->geom.y + focused_client->geom.height / 2; -+ -+ if (wider) { -+ /* vertical split => left vs right */ -+ if (cursor->x <= mid_x) { -+ focused_node->left = new_client_node; -+ focused_node->right = old_client_node; -+ } else { -+ focused_node->left = old_client_node; -+ focused_node->right = new_client_node; -+ } -+ } else { -+ /* horizontal split => top vs bottom */ -+ if (cursor->y <= mid_y) { -+ focused_node->left = new_client_node; -+ focused_node->right = old_client_node; -+ } else { -+ focused_node->left = old_client_node; -+ focused_node->right = new_client_node; -+ } -+ } -+ old_client_node->split_node = focused_node; -+ new_client_node->split_node = focused_node; -+ focused_node->split_ratio = 0.5f; -+} -+ -+LayoutNode * -+remove_client_node(LayoutNode *node, Client *c) -+{ -+ LayoutNode *tmp; -+ if (!node) -+ return NULL; -+ if (node->is_client_node) { -+ /* If this client_node is the client we're removing, -+ * return NULL to remove it */ -+ if (node->client == c) { -+ free(node); -+ return NULL; -+ } -+ return node; -+ } -+ -+ node->left = remove_client_node(node->left, c); -+ node->right = remove_client_node(node->right, c); -+ -+ /* If one of the client node is NULL after removal and the other is not, -+ * we "lift" the other client node up to replace this split node. */ -+ if (!node->left && node->right) { -+ tmp = node->right; -+ -+ /* Save pointer to split node */ -+ if (tmp) -+ tmp->split_node = node->split_node; -+ -+ free(node); -+ return tmp; -+ } -+ -+ if (!node->right && node->left) { -+ tmp = node->left; -+ -+ /* Save pointer to split node */ -+ if (tmp) -+ tmp->split_node = node->split_node; -+ -+ free(node); -+ return tmp; -+ } -+ -+ /* If both children exist or both are NULL (empty tree), -+ * return node as is. */ -+ return node; -+} -+ -+void -+remove_client(Monitor *m, Client *c) -+{ -+ if (!m->root || !c) -+ return; -+ m->root = remove_client_node(m->root, c); -+} -+ -+void -+setratio_h(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ LayoutNode *client_node, *split_node; -+ float new_ratio; -+ -+ if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ client_node = find_client_node(selmon->root, sel); -+ if (!client_node) -+ return; -+ -+ split_node = find_suitable_split(client_node, 1); -+ if (!split_node) -+ return; -+ -+ new_ratio = (arg->f != 0.0f) ? (split_node->split_ratio + arg->f) : 0.5f; -+ if (new_ratio < 0.05f) -+ new_ratio = 0.05f; -+ if (new_ratio > 0.95f) -+ new_ratio = 0.95f; -+ split_node->split_ratio = new_ratio; -+ -+ /* Skip the arrange if done resizing by mouse, -+ * we call arrange from motionotify */ -+ if (!resizing_from_mouse) { -+ arrange(selmon); -+ } -+} -+ -+void -+setratio_v(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ LayoutNode *client_node, *split_node; -+ float new_ratio; -+ -+ if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ client_node = find_client_node(selmon->root, sel); -+ if (!client_node) -+ return; -+ -+ split_node = find_suitable_split(client_node, 0); -+ if (!split_node) -+ return; -+ -+ new_ratio = (arg->f != 0.0f) ? (split_node->split_ratio + arg->f) : 0.5f; -+ if (new_ratio < 0.05f) -+ new_ratio = 0.05f; -+ if (new_ratio > 0.95f) -+ new_ratio = 0.95f; -+ split_node->split_ratio = new_ratio; -+ -+ /* Skip the arrange if done resizing by mouse, -+ * we call arrange from motionotify */ -+ if (!resizing_from_mouse) { -+ arrange(selmon); -+ } -+} -+ -+void swapclients(const Arg *arg) { -+ Client *c, *tmp, *target = NULL, *sel = focustop(selmon); -+ LayoutNode *sel_node, *target_node; -+ int closest_dist = INT_MAX, dist, sel_center_x, sel_center_y, -+ cand_center_x, cand_center_y; -+ -+ if (!sel || sel->isfullscreen || -+ !selmon->root || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ -+ /* Get the center coordinates of the selected client */ -+ sel_center_x = sel->geom.x + sel->geom.width / 2; -+ sel_center_y = sel->geom.y + sel->geom.height / 2; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, selmon) || c->isfloating || c->isfullscreen || c == sel) -+ continue; -+ -+ /* Get the center of candidate client */ -+ cand_center_x = c->geom.x + c->geom.width / 2; -+ cand_center_y = c->geom.y + c->geom.height / 2; -+ -+ /* Check that the candidate lies in the requested direction. */ -+ switch (arg->ui) { -+ case 0: -+ if (cand_center_x >= sel_center_x) -+ continue; -+ break; -+ case 1: -+ if (cand_center_x <= sel_center_x) -+ continue; -+ break; -+ case 2: -+ if (cand_center_y >= sel_center_y) -+ continue; -+ break; -+ case 3: -+ if (cand_center_y <= sel_center_y) -+ continue; -+ break; -+ default: -+ continue; -+ } -+ -+ /* Get distance between the centers */ -+ dist = abs(sel_center_x - cand_center_x) + abs(sel_center_y - cand_center_y); -+ if (dist < closest_dist) { -+ closest_dist = dist; -+ target = c; -+ } -+ } -+ -+ /* If target is found, swap the two clients’ positions in the layout tree */ -+ if (target) { -+ sel_node = find_client_node(selmon->root, sel); -+ target_node = find_client_node(selmon->root, target); -+ if (sel_node && target_node) { -+ tmp = sel_node->client; -+ sel_node->client = target_node->client; -+ target_node->client = tmp; -+ arrange(selmon); -+ } -+ } -+} -+ -+unsigned int -+visible_count(LayoutNode *node, Monitor *m) -+{ -+ Client *c; -+ -+ if (!node) -+ return 0; -+ /* Check if this client is visible. */ -+ if (node->is_client_node) { -+ c = node->client; -+ if (c && VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ return 1; -+ return 0; -+ } -+ /* Else it’s a split node. */ -+ return visible_count(node->left, m) + visible_count(node->right, m); -+} -+ -+Client * -+xytoclient(double x, double y) { -+ Client *c, *closest = NULL; -+ double dist, mindist = INT_MAX, dx, dy; -+ -+ wl_list_for_each_reverse(c, &clients, link) { -+ if (VISIBLEON(c, selmon) && !c->isfloating && !c->isfullscreen && -+ x >= c->geom.x && x <= (c->geom.x + c->geom.width) && -+ y >= c->geom.y && y <= (c->geom.y + c->geom.height)){ -+ return c; -+ } -+ } -+ -+ /* If no client was found at cursor position fallback to closest. */ -+ wl_list_for_each_reverse(c, &clients, link) { -+ if (VISIBLEON(c, selmon) && !c->isfloating && !c->isfullscreen) { -+ dx = 0, dy = 0; -+ -+ if (x < c->geom.x) -+ dx = c->geom.x - x; -+ else if (x > (c->geom.x + c->geom.width)) -+ dx = x - (c->geom.x + c->geom.width); -+ -+ if (y < c->geom.y) -+ dy = c->geom.y - y; -+ else if (y > (c->geom.y + c->geom.height)) -+ dy = y - (c->geom.y + c->geom.height); -+ -+ dist = sqrt(dx * dx + dy * dy); -+ if (dist < mindist) { -+ mindist = dist; -+ closest = c; -+ } -+ } -+ } -+ return closest; -+} -diff --git a/config.def.h b/config.def.h -index 22d2171..92f3ad6 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,7 +13,10 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float resize_factor = 0.0002f; /* Resize multiplier for mouse resizing, depends on mouse sensivity. */ -+static const uint32_t resize_interval_ms = 16; /* Resize interval depends on framerate and screen refresh rate. */ - -+enum Direction { DIR_LEFT, DIR_RIGHT, DIR_UP, DIR_DOWN }; - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -31,6 +34,7 @@ static const Rule rules[] = { - /* layout(s) */ - static const Layout layouts[] = { - /* symbol arrange function */ -+ { "|w|", btrtile }, - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -@@ -148,6 +152,14 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, swapclients, {.i = DIR_UP} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, swapclients, {.i = DIR_DOWN} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, swapclients, {.i = DIR_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, swapclients, {.i = DIR_LEFT} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Right, setratio_h, {.f = +0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Left, setratio_h, {.f = -0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Up, setratio_v, {.f = -0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Down, setratio_v, {.f = +0.025f} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -diff --git a/dwl.c b/dwl.c -index a2711f6..e49a061 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,7 @@ - /* - * See LICENSE file for copyright and license details. - */ -+#include - #include - #include - #include -@@ -103,6 +104,7 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct LayoutNode LayoutNode; - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -139,8 +141,9 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, was_tiled; - uint32_t resize; /* configure serial of a pending resize */ -+ struct wlr_box old_geom; - } Client; - - typedef struct { -@@ -208,6 +211,7 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ LayoutNode *root; - }; - - typedef struct { -@@ -250,6 +254,7 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static void btrtile(Monitor *m); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -333,6 +338,9 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); -+static void setratio_h(const Arg *arg); -+static void setratio_v(const Arg *arg); -+static void swapclients(const Arg *arg); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -431,6 +439,7 @@ static xcb_atom_t netatom[NetLast]; - - /* attempt to encapsulate suck into one file */ - #include "client.h" -+#include "btrtile.c" - - /* function implementations */ - void -@@ -601,7 +610,7 @@ buttonpress(struct wl_listener *listener, void *data) - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; - uint32_t mods; -- Client *c; -+ Client *c, *target = NULL; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); -@@ -622,7 +631,7 @@ buttonpress(struct wl_listener *listener, void *data) - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { - if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -+ event->button == b->button && b->func) { - b->func(&b->arg); - return; - } -@@ -632,15 +641,36 @@ buttonpress(struct wl_listener *listener, void *data) - /* If you released any buttons, we exit interactive move/resize mode. */ - /* TODO should reset to the pointer focus's current setcursor */ - if (!locked && cursor_mode != CurNormal && cursor_mode != CurPressed) { -+ c = grabc; -+ if (c && c->was_tiled && !strcmp(selmon->ltsymbol, "|w|")) { -+ if (cursor_mode == CurMove && c->isfloating) { -+ target = xytoclient(cursor->x, cursor->y); -+ -+ if (target && !target->isfloating && !target->isfullscreen) -+ insert_client(selmon, target, c); -+ else -+ selmon->root = create_client_node(c); -+ -+ setfloating(c, 0); -+ arrange(selmon); -+ -+ } else if (cursor_mode == CurResize && !c->isfloating) { -+ resizing_from_mouse = 0; -+ } -+ } else { -+ if (cursor_mode == CurResize && resizing_from_mouse) -+ resizing_from_mouse = 0; -+ } -+ /* Default behaviour */ - wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); - cursor_mode = CurNormal; - /* Drop the window off on its new monitor */ - selmon = xytomon(cursor->x, cursor->y); - setmon(grabc, selmon, 0); -+ grabc = NULL; - return; -- } else { -- cursor_mode = CurNormal; - } -+ cursor_mode = CurNormal; - break; - } - /* If the event wasn't handled by the compositor, notify the client with -@@ -720,6 +750,7 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); - -+ destroy_tree(m); - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); - free(m); -@@ -1024,6 +1055,7 @@ createmon(struct wl_listener *listener, void *data) - - wl_list_insert(&mons, &m->link); - printstatus(); -+ init_tree(m); - - /* The xdg-protocol specifies: - * -@@ -1263,6 +1295,10 @@ destroynotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->destroy.link); - wl_list_remove(&c->set_title.link); - wl_list_remove(&c->fullscreen.link); -+ /* We check if the destroyed client was part of any tiled_list, to catch -+ * client removals even if they would not be currently managed by btrtile */ -+ if (selmon && selmon->root) -+ remove_client(selmon, c); - #ifdef XWAYLAND - if (c->type != XDGShell) { - wl_list_remove(&c->activate.link); -@@ -1809,7 +1845,8 @@ void - motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double dy, - double dx_unaccel, double dy_unaccel) - { -- double sx = 0, sy = 0, sx_confined, sy_confined; -+ int tiled = 0; -+ double sx = 0, sy = 0, sx_confined, sy_confined, dx_total, dy_total; - Client *c = NULL, *w = NULL; - LayerSurface *l = NULL; - struct wlr_surface *surface = NULL; -@@ -1863,18 +1900,56 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - /* Update drag icon's position */ - wlr_scene_node_set_position(&drag_icon->node, (int)round(cursor->x), (int)round(cursor->y)); - -- /* If we are currently grabbing the mouse, handle and return */ -+ /* Skip if internal call or already resizing */ -+ if (time == 0 && resizing_from_mouse) -+ goto focus; -+ -+ tiled = grabc && !grabc->isfloating && !grabc->isfullscreen; - if (cursor_mode == CurMove) { - /* Move the grabbed client to the new position. */ -- resize(grabc, (struct wlr_box){.x = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, -- .width = grabc->geom.width, .height = grabc->geom.height}, 1); -- return; -+ if (grabc && grabc->isfloating) { -+ resize(grabc, (struct wlr_box){ -+ .x = (int)round(cursor->x) - grabcx, -+ .y = (int)round(cursor->y) - grabcy, -+ .width = grabc->geom.width, -+ .height = grabc->geom.height -+ }, 1); -+ return; -+ } - } else if (cursor_mode == CurResize) { -- resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -- return; -+ if (tiled && resizing_from_mouse) { -+ dx_total = cursor->x - resize_last_update_x; -+ dy_total = cursor->y - resize_last_update_y; -+ -+ if (time - last_resize_time >= resize_interval_ms) { -+ Arg a = {0}; -+ if (fabs(dx_total) > fabs(dy_total)) { -+ a.f = (float)(dx_total * resize_factor); -+ setratio_h(&a); -+ } else { -+ a.f = (float)(dy_total * resize_factor); -+ setratio_v(&a); -+ } -+ arrange(selmon); -+ -+ last_resize_time = time; -+ resize_last_update_x = cursor->x; -+ resize_last_update_y = cursor->y; -+ } -+ -+ } else if (grabc && grabc->isfloating) { -+ /* Floating resize as original */ -+ resize(grabc, (struct wlr_box){ -+ .x = grabc->geom.x, -+ .y = grabc->geom.y, -+ .width = (int)round(cursor->x) - grabc->geom.x, -+ .height = (int)round(cursor->y) - grabc->geom.y -+ }, 1); -+ return; -+ } - } - -+focus: - /* If there's no client surface under the cursor, set the cursor image to a - * default. This is what makes the cursor image appear when you move it - * off of a client or over its border. */ -@@ -1908,22 +1983,41 @@ moveresize(const Arg *arg) - if (!grabc || client_is_unmanaged(grabc) || grabc->isfullscreen) - return; - -- /* Float the window and tell motionnotify to grab it */ -- setfloating(grabc, 1); -- switch (cursor_mode = arg->ui) { -- case CurMove: -- grabcx = (int)round(cursor->x) - grabc->geom.x; -- grabcy = (int)round(cursor->y) - grabc->geom.y; -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -- break; -- case CurResize: -- /* Doesn't work for X11 output - the next absolute motion event -- * returns the cursor to where it started */ -- wlr_cursor_warp_closest(cursor, NULL, -- grabc->geom.x + grabc->geom.width, -- grabc->geom.y + grabc->geom.height); -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -- break; -+ cursor_mode = arg->ui; -+ grabc->was_tiled = (!grabc->isfloating && !grabc->isfullscreen); -+ -+ if (grabc->was_tiled) { -+ switch (cursor_mode) { -+ case CurMove: -+ setfloating(grabc, 1); -+ grabcx = (int)round(cursor->x) - grabc->geom.x; -+ grabcy = (int)round(cursor->y) - grabc->geom.y; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -+ break; -+ case CurResize: -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ resize_last_update_x = cursor->x; -+ resize_last_update_y = cursor->y; -+ resizing_from_mouse = 1; -+ break; -+ } -+ } else { -+ /* Default floating logic */ -+ /* Float the window and tell motionnotify to grab it */ -+ setfloating(grabc, 1); -+ switch (cursor_mode) { -+ case CurMove: -+ grabcx = (int)round(cursor->x) - grabc->geom.x; -+ grabcy = (int)round(cursor->y) - grabc->geom.y; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -+ break; -+ case CurResize: -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x + grabc->geom.width, -+ grabc->geom.y + grabc->geom.height); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ break; -+ } - } - } - --- -2.45.3 - diff --git a/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7.patch b/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7.patch deleted file mode 100644 index b85473e..0000000 --- a/dwl-bak/dwl-patches/patches/btrtile/btrtile-v0.7.patch +++ /dev/null @@ -1,903 +0,0 @@ -From b9789420f166c20579f29ecd171a8956c681848d Mon Sep 17 00:00:00 2001 -From: julmajustus -Date: Thu, 13 Feb 2025 23:23:40 +0200 -Subject: [PATCH] btrtile with multi-tag support - ---- - btrtile.c | 563 +++++++++++++++++++++++++++++++++++++++++++++++++++ - config.def.h | 12 ++ - dwl.c | 152 +++++++++++--- - 3 files changed, 698 insertions(+), 29 deletions(-) - create mode 100644 btrtile.c - -diff --git a/btrtile.c b/btrtile.c -new file mode 100644 -index 0000000..03f4680 ---- /dev/null -+++ b/btrtile.c -@@ -0,0 +1,563 @@ -+/* ************************************************************************** */ -+/* */ -+/* ::: :::::::: */ -+/* btrtile.c :+: :+: :+: */ -+/* +:+ +:+ +:+ */ -+/* By: jmakkone +#+ +:+ +#+ */ -+/* +#+#+#+#+#+ +#+ */ -+/* Created: 2024/12/15 00:26:07 by jmakkone #+# #+# */ -+/* Updated: 2025/02/13 23:22:33 by jmakkone ### ########.fr */ -+/* */ -+/* ************************************************************************** */ -+ -+typedef struct LayoutNode { -+ unsigned int is_client_node; -+ unsigned int is_split_vertically; -+ float split_ratio; -+ struct LayoutNode *left; -+ struct LayoutNode *right; -+ struct LayoutNode *split_node; -+ Client *client; -+} LayoutNode; -+ -+static void apply_layout(Monitor *m, LayoutNode *node, -+ struct wlr_box area, unsigned int is_root); -+static void btrtile(Monitor *m); -+static LayoutNode *create_client_node(Client *c); -+static LayoutNode *create_split_node(unsigned int is_split_vertically, -+ LayoutNode *left, LayoutNode *right); -+static void destroy_node(LayoutNode *node); -+static void destroy_tree(Monitor *m); -+static LayoutNode *find_client_node(LayoutNode *node, Client *c); -+static LayoutNode *find_suitable_split(LayoutNode *start, unsigned int need_vert); -+static void init_tree(Monitor *m); -+static void insert_client(Monitor *m, Client *focused_client, Client *new_client); -+static LayoutNode *remove_client_node(LayoutNode *node, Client *c); -+static void remove_client(Monitor *m, Client *c); -+static void setratio_h(const Arg *arg); -+static void setratio_v(const Arg *arg); -+static void swapclients(const Arg *arg); -+static unsigned int visible_count(LayoutNode *node, Monitor *m); -+static Client *xytoclient(double x, double y); -+ -+static int resizing_from_mouse = 0; -+static double resize_last_update_x, resize_last_update_y; -+static uint32_t last_resize_time = 0; -+ -+void -+apply_layout(Monitor *m, LayoutNode *node, -+ struct wlr_box area, unsigned int is_root) -+{ -+ Client *c; -+ float ratio; -+ unsigned int left_count, right_count, mid; -+ struct wlr_box left_area, right_area; -+ -+ if (!node) -+ return; -+ -+ /* If this node is a client node, check if it is visible. */ -+ if (node->is_client_node) { -+ c = node->client; -+ if (!c || !VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ return; -+ resize(c, area, 0); -+ c->old_geom = area; -+ return; -+ } -+ -+ /* For a split node, we see how many visible children are on each side: */ -+ left_count = visible_count(node->left, m); -+ right_count = visible_count(node->right, m); -+ -+ if (left_count == 0 && right_count == 0) { -+ return; -+ } else if (left_count > 0 && right_count == 0) { -+ apply_layout(m, node->left, area, 0); -+ return; -+ } else if (left_count == 0 && right_count > 0) { -+ apply_layout(m, node->right, area, 0); -+ return; -+ } -+ -+ /* If we’re here, we have visible clients in both subtrees. */ -+ ratio = node->split_ratio; -+ if (ratio < 0.05f) -+ ratio = 0.05f; -+ if (ratio > 0.95f) -+ ratio = 0.95f; -+ -+ memset(&left_area, 0, sizeof(left_area)); -+ memset(&right_area, 0, sizeof(right_area)); -+ -+ if (node->is_split_vertically) { -+ mid = (unsigned int)(area.width * ratio); -+ left_area.x = area.x; -+ left_area.y = area.y; -+ left_area.width = mid; -+ left_area.height = area.height; -+ -+ right_area.x = area.x + mid; -+ right_area.y = area.y; -+ right_area.width = area.width - mid; -+ right_area.height = area.height; -+ } else { -+ /* horizontal split */ -+ mid = (unsigned int)(area.height * ratio); -+ left_area.x = area.x; -+ left_area.y = area.y; -+ left_area.width = area.width; -+ left_area.height = mid; -+ -+ right_area.x = area.x; -+ right_area.y = area.y + mid; -+ right_area.width = area.width; -+ right_area.height= area.height - mid; -+ } -+ -+ apply_layout(m, node->left, left_area, 0); -+ apply_layout(m, node->right, right_area, 0); -+} -+ -+void -+btrtile(Monitor *m) -+{ -+ Client *c, *focused = NULL; -+ int n = 0; -+ LayoutNode *found; -+ struct wlr_box full_area; -+ -+ if (!m || !m->root) -+ return; -+ -+ /* Remove non tiled clients from tree. */ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon == m && !c->isfloating && !c->isfullscreen) { -+ } else { -+ remove_client(m, c); -+ } -+ } -+ -+ /* If no client is found under cursor, fallback to focustop(m) */ -+ if (!(focused = xytoclient(cursor->x, cursor->y))) -+ focused = focustop(m); -+ -+ /* Insert visible clients that are not part of the tree. */ -+ wl_list_for_each(c, &clients, link) { -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen && c->mon == m) { -+ found = find_client_node(m->root, c); -+ if (!found) { -+ insert_client(m, focused, c); -+ } -+ n++; -+ } -+ } -+ -+ if (n == 0) -+ return; -+ -+ full_area = m->w; -+ apply_layout(m, m->root, full_area, 1); -+} -+ -+LayoutNode * -+create_client_node(Client *c) -+{ -+ LayoutNode *node = calloc(1, sizeof(LayoutNode)); -+ -+ if (!node) -+ return NULL; -+ node->is_client_node = 1; -+ node->split_ratio = 0.5f; -+ node->client = c; -+ return node; -+} -+ -+LayoutNode * -+create_split_node(unsigned int is_split_vertically, -+ LayoutNode *left, LayoutNode *right) -+{ -+ LayoutNode *node = calloc(1, sizeof(LayoutNode)); -+ -+ if (!node) -+ return NULL; -+ node->is_client_node = 0; -+ node->split_ratio = 0.5f; -+ node->is_split_vertically = is_split_vertically; -+ node->left = left; -+ node->right = right; -+ if (left) -+ left->split_node = node; -+ if (right) -+ right->split_node = node; -+ return node; -+} -+ -+void -+destroy_node(LayoutNode *node) -+{ -+ if (!node) -+ return; -+ if (!node->is_client_node) { -+ destroy_node(node->left); -+ destroy_node(node->right); -+ } -+ free(node); -+} -+ -+void -+destroy_tree(Monitor *m) -+{ -+ if (!m || !m->root) -+ return; -+ destroy_node(m->root); -+ m->root = NULL; -+} -+ -+LayoutNode * -+find_client_node(LayoutNode *node, Client *c) -+{ -+ LayoutNode *res; -+ -+ if (!node || !c) -+ return NULL; -+ if (node->is_client_node) { -+ return (node->client == c) ? node : NULL; -+ } -+ res = find_client_node(node->left, c); -+ return res ? res : find_client_node(node->right, c); -+} -+ -+LayoutNode * -+find_suitable_split(LayoutNode *start_node, unsigned int need_vertical) -+{ -+ LayoutNode *n = start_node; -+ /* if we started from a client node, jump to its parent: */ -+ if (n && n->is_client_node) -+ n = n->split_node; -+ -+ while (n) { -+ if (!n->is_client_node && n->is_split_vertically == need_vertical && -+ visible_count(n->left, selmon) > 0 && visible_count(n->right, selmon) > 0) -+ return n; -+ n = n->split_node; -+ } -+ return NULL; -+} -+ -+void -+init_tree(Monitor *m) -+{ -+ if (!m) -+ return; -+ m->root = calloc(1, sizeof(LayoutNode)); -+ if (!m->root) -+ m->root = NULL; -+} -+ -+void -+insert_client(Monitor *m, Client *focused_client, Client *new_client) -+{ -+ Client *old_client; -+ LayoutNode **root = &m->root, *old_root, -+ *focused_node, *new_client_node, *old_client_node; -+ unsigned int wider, mid_x, mid_y; -+ -+ /* If no root , new client becomes the root. */ -+ if (!*root) { -+ *root = create_client_node(new_client); -+ return; -+ } -+ -+ /* Find the focused_client node, -+ * if not found split the root. */ -+ focused_node = focused_client ? -+ find_client_node(*root, focused_client) : NULL; -+ if (!focused_node) { -+ old_root = *root; -+ new_client_node = create_client_node(new_client); -+ *root = create_split_node(1, old_root, new_client_node); -+ return; -+ } -+ -+ /* Turn focused node from a client node into a split node, -+ * and attach old_client + new_client. */ -+ old_client = focused_node->client; -+ old_client_node = create_client_node(old_client); -+ new_client_node = create_client_node(new_client); -+ -+ /* Decide split direction. */ -+ wider = (focused_client->geom.width >= focused_client->geom.height); -+ focused_node->is_client_node = 0; -+ focused_node->client = NULL; -+ focused_node->is_split_vertically = (wider ? 1 : 0); -+ -+ /* Pick new_client side depending on the cursor position. */ -+ mid_x = focused_client->geom.x + focused_client->geom.width / 2; -+ mid_y = focused_client->geom.y + focused_client->geom.height / 2; -+ -+ if (wider) { -+ /* vertical split => left vs right */ -+ if (cursor->x <= mid_x) { -+ focused_node->left = new_client_node; -+ focused_node->right = old_client_node; -+ } else { -+ focused_node->left = old_client_node; -+ focused_node->right = new_client_node; -+ } -+ } else { -+ /* horizontal split => top vs bottom */ -+ if (cursor->y <= mid_y) { -+ focused_node->left = new_client_node; -+ focused_node->right = old_client_node; -+ } else { -+ focused_node->left = old_client_node; -+ focused_node->right = new_client_node; -+ } -+ } -+ old_client_node->split_node = focused_node; -+ new_client_node->split_node = focused_node; -+ focused_node->split_ratio = 0.5f; -+} -+ -+LayoutNode * -+remove_client_node(LayoutNode *node, Client *c) -+{ -+ LayoutNode *tmp; -+ if (!node) -+ return NULL; -+ if (node->is_client_node) { -+ /* If this client_node is the client we're removing, -+ * return NULL to remove it */ -+ if (node->client == c) { -+ free(node); -+ return NULL; -+ } -+ return node; -+ } -+ -+ node->left = remove_client_node(node->left, c); -+ node->right = remove_client_node(node->right, c); -+ -+ /* If one of the client node is NULL after removal and the other is not, -+ * we "lift" the other client node up to replace this split node. */ -+ if (!node->left && node->right) { -+ tmp = node->right; -+ -+ /* Save pointer to split node */ -+ if (tmp) -+ tmp->split_node = node->split_node; -+ -+ free(node); -+ return tmp; -+ } -+ -+ if (!node->right && node->left) { -+ tmp = node->left; -+ -+ /* Save pointer to split node */ -+ if (tmp) -+ tmp->split_node = node->split_node; -+ -+ free(node); -+ return tmp; -+ } -+ -+ /* If both children exist or both are NULL (empty tree), -+ * return node as is. */ -+ return node; -+} -+ -+void -+remove_client(Monitor *m, Client *c) -+{ -+ if (!m->root || !c) -+ return; -+ m->root = remove_client_node(m->root, c); -+} -+ -+void -+setratio_h(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ LayoutNode *client_node, *split_node; -+ float new_ratio; -+ -+ if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ client_node = find_client_node(selmon->root, sel); -+ if (!client_node) -+ return; -+ -+ split_node = find_suitable_split(client_node, 1); -+ if (!split_node) -+ return; -+ -+ new_ratio = (arg->f != 0.0f) ? (split_node->split_ratio + arg->f) : 0.5f; -+ if (new_ratio < 0.05f) -+ new_ratio = 0.05f; -+ if (new_ratio > 0.95f) -+ new_ratio = 0.95f; -+ split_node->split_ratio = new_ratio; -+ -+ /* Skip the arrange if done resizing by mouse, -+ * we call arrange from motionotify */ -+ if (!resizing_from_mouse) { -+ arrange(selmon); -+ } -+} -+ -+void -+setratio_v(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ LayoutNode *client_node, *split_node; -+ float new_ratio; -+ -+ if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ client_node = find_client_node(selmon->root, sel); -+ if (!client_node) -+ return; -+ -+ split_node = find_suitable_split(client_node, 0); -+ if (!split_node) -+ return; -+ -+ new_ratio = (arg->f != 0.0f) ? (split_node->split_ratio + arg->f) : 0.5f; -+ if (new_ratio < 0.05f) -+ new_ratio = 0.05f; -+ if (new_ratio > 0.95f) -+ new_ratio = 0.95f; -+ split_node->split_ratio = new_ratio; -+ -+ /* Skip the arrange if done resizing by mouse, -+ * we call arrange from motionotify */ -+ if (!resizing_from_mouse) { -+ arrange(selmon); -+ } -+} -+ -+void swapclients(const Arg *arg) { -+ Client *c, *tmp, *target = NULL, *sel = focustop(selmon); -+ LayoutNode *sel_node, *target_node; -+ int closest_dist = INT_MAX, dist, sel_center_x, sel_center_y, -+ cand_center_x, cand_center_y; -+ -+ if (!sel || sel->isfullscreen || -+ !selmon->root || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ -+ -+ /* Get the center coordinates of the selected client */ -+ sel_center_x = sel->geom.x + sel->geom.width / 2; -+ sel_center_y = sel->geom.y + sel->geom.height / 2; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, selmon) || c->isfloating || c->isfullscreen || c == sel) -+ continue; -+ -+ /* Get the center of candidate client */ -+ cand_center_x = c->geom.x + c->geom.width / 2; -+ cand_center_y = c->geom.y + c->geom.height / 2; -+ -+ /* Check that the candidate lies in the requested direction. */ -+ switch (arg->ui) { -+ case 0: -+ if (cand_center_x >= sel_center_x) -+ continue; -+ break; -+ case 1: -+ if (cand_center_x <= sel_center_x) -+ continue; -+ break; -+ case 2: -+ if (cand_center_y >= sel_center_y) -+ continue; -+ break; -+ case 3: -+ if (cand_center_y <= sel_center_y) -+ continue; -+ break; -+ default: -+ continue; -+ } -+ -+ /* Get distance between the centers */ -+ dist = abs(sel_center_x - cand_center_x) + abs(sel_center_y - cand_center_y); -+ if (dist < closest_dist) { -+ closest_dist = dist; -+ target = c; -+ } -+ } -+ -+ /* If target is found, swap the two clients’ positions in the layout tree */ -+ if (target) { -+ sel_node = find_client_node(selmon->root, sel); -+ target_node = find_client_node(selmon->root, target); -+ if (sel_node && target_node) { -+ tmp = sel_node->client; -+ sel_node->client = target_node->client; -+ target_node->client = tmp; -+ arrange(selmon); -+ } -+ } -+} -+ -+unsigned int -+visible_count(LayoutNode *node, Monitor *m) -+{ -+ Client *c; -+ -+ if (!node) -+ return 0; -+ /* Check if this client is visible. */ -+ if (node->is_client_node) { -+ c = node->client; -+ if (c && VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ return 1; -+ return 0; -+ } -+ /* Else it’s a split node. */ -+ return visible_count(node->left, m) + visible_count(node->right, m); -+} -+ -+Client * -+xytoclient(double x, double y) { -+ Client *c, *closest = NULL; -+ double dist, mindist = INT_MAX, dx, dy; -+ -+ wl_list_for_each_reverse(c, &clients, link) { -+ if (VISIBLEON(c, selmon) && !c->isfloating && !c->isfullscreen && -+ x >= c->geom.x && x <= (c->geom.x + c->geom.width) && -+ y >= c->geom.y && y <= (c->geom.y + c->geom.height)){ -+ return c; -+ } -+ } -+ -+ /* If no client was found at cursor position fallback to closest. */ -+ wl_list_for_each_reverse(c, &clients, link) { -+ if (VISIBLEON(c, selmon) && !c->isfloating && !c->isfullscreen) { -+ dx = 0, dy = 0; -+ -+ if (x < c->geom.x) -+ dx = c->geom.x - x; -+ else if (x > (c->geom.x + c->geom.width)) -+ dx = x - (c->geom.x + c->geom.width); -+ -+ if (y < c->geom.y) -+ dy = c->geom.y - y; -+ else if (y > (c->geom.y + c->geom.height)) -+ dy = y - (c->geom.y + c->geom.height); -+ -+ dist = sqrt(dx * dx + dy * dy); -+ if (dist < mindist) { -+ mindist = dist; -+ closest = c; -+ } -+ } -+ } -+ return closest; -+} -diff --git a/config.def.h b/config.def.h -index 22d2171..92f3ad6 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,7 +13,10 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float resize_factor = 0.0002f; /* Resize multiplier for mouse resizing, depends on mouse sensivity. */ -+static const uint32_t resize_interval_ms = 16; /* Resize interval depends on framerate and screen refresh rate. */ - -+enum Direction { DIR_LEFT, DIR_RIGHT, DIR_UP, DIR_DOWN }; - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -31,6 +34,7 @@ static const Rule rules[] = { - /* layout(s) */ - static const Layout layouts[] = { - /* symbol arrange function */ -+ { "|w|", btrtile }, - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -@@ -148,6 +152,14 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, swapclients, {.i = DIR_UP} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, swapclients, {.i = DIR_DOWN} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, swapclients, {.i = DIR_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, swapclients, {.i = DIR_LEFT} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Right, setratio_h, {.f = +0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Left, setratio_h, {.f = -0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Up, setratio_v, {.f = -0.025f} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Down, setratio_v, {.f = +0.025f} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -diff --git a/dwl.c b/dwl.c -index a2711f6..e49a061 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,7 @@ - /* - * See LICENSE file for copyright and license details. - */ -+#include - #include - #include - #include -@@ -103,6 +104,7 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct LayoutNode LayoutNode; - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -139,8 +141,9 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, was_tiled; - uint32_t resize; /* configure serial of a pending resize */ -+ struct wlr_box old_geom; - } Client; - - typedef struct { -@@ -208,6 +211,7 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ LayoutNode *root; - }; - - typedef struct { -@@ -250,6 +254,7 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static void btrtile(Monitor *m); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -333,6 +338,9 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); -+static void setratio_h(const Arg *arg); -+static void setratio_v(const Arg *arg); -+static void swapclients(const Arg *arg); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -431,6 +439,7 @@ static xcb_atom_t netatom[NetLast]; - - /* attempt to encapsulate suck into one file */ - #include "client.h" -+#include "btrtile.c" - - /* function implementations */ - void -@@ -601,7 +610,7 @@ buttonpress(struct wl_listener *listener, void *data) - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; - uint32_t mods; -- Client *c; -+ Client *c, *target = NULL; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); -@@ -622,7 +631,7 @@ buttonpress(struct wl_listener *listener, void *data) - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; - for (b = buttons; b < END(buttons); b++) { - if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -+ event->button == b->button && b->func) { - b->func(&b->arg); - return; - } -@@ -632,15 +641,36 @@ buttonpress(struct wl_listener *listener, void *data) - /* If you released any buttons, we exit interactive move/resize mode. */ - /* TODO should reset to the pointer focus's current setcursor */ - if (!locked && cursor_mode != CurNormal && cursor_mode != CurPressed) { -+ c = grabc; -+ if (c && c->was_tiled && !strcmp(selmon->ltsymbol, "|w|")) { -+ if (cursor_mode == CurMove && c->isfloating) { -+ target = xytoclient(cursor->x, cursor->y); -+ -+ if (target && !target->isfloating && !target->isfullscreen) -+ insert_client(selmon, target, c); -+ else -+ selmon->root = create_client_node(c); -+ -+ setfloating(c, 0); -+ arrange(selmon); -+ -+ } else if (cursor_mode == CurResize && !c->isfloating) { -+ resizing_from_mouse = 0; -+ } -+ } else { -+ if (cursor_mode == CurResize && resizing_from_mouse) -+ resizing_from_mouse = 0; -+ } -+ /* Default behaviour */ - wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); - cursor_mode = CurNormal; - /* Drop the window off on its new monitor */ - selmon = xytomon(cursor->x, cursor->y); - setmon(grabc, selmon, 0); -+ grabc = NULL; - return; -- } else { -- cursor_mode = CurNormal; - } -+ cursor_mode = CurNormal; - break; - } - /* If the event wasn't handled by the compositor, notify the client with -@@ -720,6 +750,7 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); - -+ destroy_tree(m); - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); - free(m); -@@ -1024,6 +1055,7 @@ createmon(struct wl_listener *listener, void *data) - - wl_list_insert(&mons, &m->link); - printstatus(); -+ init_tree(m); - - /* The xdg-protocol specifies: - * -@@ -1263,6 +1295,10 @@ destroynotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->destroy.link); - wl_list_remove(&c->set_title.link); - wl_list_remove(&c->fullscreen.link); -+ /* We check if the destroyed client was part of any tiled_list, to catch -+ * client removals even if they would not be currently managed by btrtile */ -+ if (selmon && selmon->root) -+ remove_client(selmon, c); - #ifdef XWAYLAND - if (c->type != XDGShell) { - wl_list_remove(&c->activate.link); -@@ -1809,7 +1845,8 @@ void - motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double dy, - double dx_unaccel, double dy_unaccel) - { -- double sx = 0, sy = 0, sx_confined, sy_confined; -+ int tiled = 0; -+ double sx = 0, sy = 0, sx_confined, sy_confined, dx_total, dy_total; - Client *c = NULL, *w = NULL; - LayerSurface *l = NULL; - struct wlr_surface *surface = NULL; -@@ -1863,18 +1900,56 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - /* Update drag icon's position */ - wlr_scene_node_set_position(&drag_icon->node, (int)round(cursor->x), (int)round(cursor->y)); - -- /* If we are currently grabbing the mouse, handle and return */ -+ /* Skip if internal call or already resizing */ -+ if (time == 0 && resizing_from_mouse) -+ goto focus; -+ -+ tiled = grabc && !grabc->isfloating && !grabc->isfullscreen; - if (cursor_mode == CurMove) { - /* Move the grabbed client to the new position. */ -- resize(grabc, (struct wlr_box){.x = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, -- .width = grabc->geom.width, .height = grabc->geom.height}, 1); -- return; -+ if (grabc && grabc->isfloating) { -+ resize(grabc, (struct wlr_box){ -+ .x = (int)round(cursor->x) - grabcx, -+ .y = (int)round(cursor->y) - grabcy, -+ .width = grabc->geom.width, -+ .height = grabc->geom.height -+ }, 1); -+ return; -+ } - } else if (cursor_mode == CurResize) { -- resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -- return; -+ if (tiled && resizing_from_mouse) { -+ dx_total = cursor->x - resize_last_update_x; -+ dy_total = cursor->y - resize_last_update_y; -+ -+ if (time - last_resize_time >= resize_interval_ms) { -+ Arg a = {0}; -+ if (fabs(dx_total) > fabs(dy_total)) { -+ a.f = (float)(dx_total * resize_factor); -+ setratio_h(&a); -+ } else { -+ a.f = (float)(dy_total * resize_factor); -+ setratio_v(&a); -+ } -+ arrange(selmon); -+ -+ last_resize_time = time; -+ resize_last_update_x = cursor->x; -+ resize_last_update_y = cursor->y; -+ } -+ -+ } else if (grabc && grabc->isfloating) { -+ /* Floating resize as original */ -+ resize(grabc, (struct wlr_box){ -+ .x = grabc->geom.x, -+ .y = grabc->geom.y, -+ .width = (int)round(cursor->x) - grabc->geom.x, -+ .height = (int)round(cursor->y) - grabc->geom.y -+ }, 1); -+ return; -+ } - } - -+focus: - /* If there's no client surface under the cursor, set the cursor image to a - * default. This is what makes the cursor image appear when you move it - * off of a client or over its border. */ -@@ -1908,22 +1983,41 @@ moveresize(const Arg *arg) - if (!grabc || client_is_unmanaged(grabc) || grabc->isfullscreen) - return; - -- /* Float the window and tell motionnotify to grab it */ -- setfloating(grabc, 1); -- switch (cursor_mode = arg->ui) { -- case CurMove: -- grabcx = (int)round(cursor->x) - grabc->geom.x; -- grabcy = (int)round(cursor->y) - grabc->geom.y; -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -- break; -- case CurResize: -- /* Doesn't work for X11 output - the next absolute motion event -- * returns the cursor to where it started */ -- wlr_cursor_warp_closest(cursor, NULL, -- grabc->geom.x + grabc->geom.width, -- grabc->geom.y + grabc->geom.height); -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -- break; -+ cursor_mode = arg->ui; -+ grabc->was_tiled = (!grabc->isfloating && !grabc->isfullscreen); -+ -+ if (grabc->was_tiled) { -+ switch (cursor_mode) { -+ case CurMove: -+ setfloating(grabc, 1); -+ grabcx = (int)round(cursor->x) - grabc->geom.x; -+ grabcy = (int)round(cursor->y) - grabc->geom.y; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -+ break; -+ case CurResize: -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ resize_last_update_x = cursor->x; -+ resize_last_update_y = cursor->y; -+ resizing_from_mouse = 1; -+ break; -+ } -+ } else { -+ /* Default floating logic */ -+ /* Float the window and tell motionnotify to grab it */ -+ setfloating(grabc, 1); -+ switch (cursor_mode) { -+ case CurMove: -+ grabcx = (int)round(cursor->x) - grabc->geom.x; -+ grabcy = (int)round(cursor->y) - grabc->geom.y; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -+ break; -+ case CurResize: -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x + grabc->geom.width, -+ grabc->geom.y + grabc->geom.height); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ break; -+ } - } - } - --- -2.45.3 - diff --git a/dwl-bak/dwl-patches/patches/buttonbystate/README.md b/dwl-bak/dwl-patches/patches/buttonbystate/README.md deleted file mode 100644 index cbb0eee..0000000 --- a/dwl-bak/dwl-patches/patches/buttonbystate/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Adds "state" (`enum wlr_button_state`) to configure a button action on either press or release. -This basically enables release to be used for button actions. - -### Download -- [git branch](https://codeberg.org/nullsystem/dwl/src/branch/main_buttonbystate) -- [2024-04-06](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/buttonbystate/buttonbystate.patch) - -### Authors -- [nullsystem](https://codeberg.org/nullsystem) diff --git a/dwl-bak/dwl-patches/patches/buttonbystate/buttonbystate.patch b/dwl-bak/dwl-patches/patches/buttonbystate/buttonbystate.patch deleted file mode 100644 index d669aff..0000000 --- a/dwl-bak/dwl-patches/patches/buttonbystate/buttonbystate.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 4141aa9455e4b4a5b4a235475c70e8c100ec663e Mon Sep 17 00:00:00 2001 -From: nullsystem -Date: Sat, 6 Apr 2024 02:03:49 +0100 -Subject: [PATCH] buttonbystate - allow config for release (and press) - -- Adds "state" (enum wlr_button_state) to configure a button action on - either press or release. This basically enables release to be used - for button actions. ---- - config.def.h | 6 +++--- - dwl.c | 22 ++++++++++++---------- - 2 files changed, 15 insertions(+), 13 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 8847e58..cc989cf 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -165,7 +165,7 @@ static const Key keys[] = { - }; - - static const Button buttons[] = { -- { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -- { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, -+ { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove}, WLR_BUTTON_PRESSED }, -+ { MODKEY, BTN_MIDDLE, togglefloating, {0}, WLR_BUTTON_PRESSED }, -+ { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize}, WLR_BUTTON_PRESSED }, - }; -diff --git a/dwl.c b/dwl.c -index bf763df..6b60ccf 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -99,6 +99,7 @@ typedef struct { - unsigned int button; - void (*func)(const Arg *); - const Arg arg; -+ enum wlr_button_state state; - } Button; - - typedef struct Monitor Monitor; -@@ -595,16 +596,6 @@ buttonpress(struct wl_listener *listener, void *data) - xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); - if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) - focusclient(c, 1); -- -- keyboard = wlr_seat_get_keyboard(seat); -- mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; -- for (b = buttons; b < END(buttons); b++) { -- if (CLEANMASK(mods) == CLEANMASK(b->mod) && -- event->button == b->button && b->func) { -- b->func(&b->arg); -- return; -- } -- } - break; - case WLR_BUTTON_RELEASED: - held_grab = NULL; -@@ -622,6 +613,17 @@ buttonpress(struct wl_listener *listener, void *data) - } - break; - } -+ -+ keyboard = wlr_seat_get_keyboard(seat); -+ mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; -+ for (b = buttons; b < END(buttons); b++) { -+ if (b->state == event->state && CLEANMASK(mods) == CLEANMASK(b->mod) && -+ event->button == b->button && b->func) { -+ b->func(&b->arg); -+ return; -+ } -+ } -+ - /* If the event wasn't handled by the compositor, notify the client with - * pointer focus that a button press has occurred */ - wlr_seat_pointer_notify_button(seat, --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/center-terminal/README.md b/dwl-bak/dwl-patches/patches/center-terminal/README.md deleted file mode 100644 index cfd70a2..0000000 --- a/dwl-bak/dwl-patches/patches/center-terminal/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -Add a keybinding that toggles centering the terminally horizontally when -it's the only window, while still tiling multiple windows. - -This limits the width of long text making it easier to read, and avoids -covering the wallpaper more than necessary. - -### Download -- [git branch](https://codeberg.org/guidocella/dwl/src/branch/center-terminal) -- [2024-02-06](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/center-terminal/center-terminal.patch) - -### Authors -- [Guido Cella](https://codeberg.org/guidocella) diff --git a/dwl-bak/dwl-patches/patches/center-terminal/center-terminal.patch b/dwl-bak/dwl-patches/patches/center-terminal/center-terminal.patch deleted file mode 100644 index 214eaf2..0000000 --- a/dwl-bak/dwl-patches/patches/center-terminal/center-terminal.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 340cc5ef90dfcc495bdad045f3f76ae07405cffd Mon Sep 17 00:00:00 2001 -From: Guido Cella -Date: Tue, 6 Feb 2024 09:20:48 +0100 -Subject: [PATCH] add a keybinding to center the terminal - -Add a keybinding that toggles centering the terminally horizontally when -it's the only window, while still tiling multiple windows. - -This limits the width of long text making it easier to read, and avoids -covering the wallpaper more than necessary. ---- - config.def.h | 1 + - dwl.c | 20 ++++++++++++++++++++ - 2 files changed, 21 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..8229fcc 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -142,6 +142,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_v, togglecenter, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index 12f441e..3b15748 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -138,6 +139,7 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ bool centered; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -334,6 +336,7 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void togglecenter(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -436,6 +439,8 @@ static struct wl_listener request_start_drag = {.notify = requeststartdrag}; - static struct wl_listener start_drag = {.notify = startdrag}; - static struct wl_listener new_session_lock = {.notify = locksession}; - -+static bool center; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -499,6 +504,9 @@ applyrules(Client *c) - } - } - -+ if (!strcasecmp(appid, termcmd[0])) -+ c->centered = true; -+ - c->isfloating |= client_is_float_type(c); - setmon(c, mon, newtags); - } -@@ -2730,6 +2738,11 @@ tile(Monitor *m) - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { -+ if (n == 1 && center && c->centered) { -+ resize(c, (struct wlr_box){.x = m->w.width / 4, .y = m->w.y, -+ .width = m->w.width / 2, .height = m->w.height - 2 * c->bw}, 0); -+ return; -+ } - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, - .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); - my += c->geom.height; -@@ -2742,6 +2755,13 @@ tile(Monitor *m) - } - } - -+void -+togglecenter(const Arg *arg) -+{ -+ center = !center; -+ tile(selmon); -+} -+ - void - togglefloating(const Arg *arg) - { --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/centeredmaster/README.md b/dwl-bak/dwl-patches/patches/centeredmaster/README.md deleted file mode 100644 index 2ba6dd9..0000000 --- a/dwl-bak/dwl-patches/patches/centeredmaster/README.md +++ /dev/null @@ -1,33 +0,0 @@ -### Description -This is a port of centeredmaster patch for dwm: - -centeredmaster centers the nmaster area on screen, using mfact * monitor -width & height, with the stacked windows distributed to the left and -right. It can be selected with `Alt+c`. - -With one and two clients in master respectively this results in: - -``` -+------------------------------+ +------------------------------+ -|+--------++--------++--------+| |+--------++--------++--------+| -|| || || || || || || || -|| || || || || || M1 || || -|| || || || || || || || -|| S2 || M || S1 || || |+--------+| || -|| || || || || |+--------+| || -|| || || || || || || || -|| || || || || || M2 || || -|| || || || || || || || -|+--------++--------++--------+| |+--------++--------++--------+| -+------------------------------+ +------------------------------+ -``` - - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/centeredmaster/centeredmaster.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/b104a580a80ebaf9f7e8917fe574e3e97ddd019a/centeredmaster/centeredmaster.patch) -- [0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/0f4e40fee49d1b8b430778e241b29496ae3b3b70/centeredmaster/centeredmaster.patch) - -### Authors -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/centeredmaster/centeredmaster.patch b/dwl-bak/dwl-patches/patches/centeredmaster/centeredmaster.patch deleted file mode 100644 index c29bd5f..0000000 --- a/dwl-bak/dwl-patches/patches/centeredmaster/centeredmaster.patch +++ /dev/null @@ -1,135 +0,0 @@ -From b1ca46930756b59c1ebba0b8c7871b85ff84f62f Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Sat, 8 Feb 2025 16:10:25 +0100 -Subject: [PATCH] Add centeredmaster layout - -This is a port of centeredmaster patch for dwm: - https://dwm.suckless.org/patches/centeredmaster - -centeredmaster centers the nmaster area on screen, using mfact * monitor -width & height, with the stacked windows distributed to the left and -right. It can be selected with [Alt]+[c]. - -With one and two clients in master respectively this results in: - -+------------------------------+ +------------------------------+ -|+--------++--------++--------+| |+--------++--------++--------+| -|| || || || || || || || -|| || || || || || M1 || || -|| || || || || || || || -|| S2 || M || S1 || || |+--------+| || -|| || || || || |+--------+| || -|| || || || || || || || -|| || || || || || M2 || || -|| || || || || || || || -|+--------++--------++--------+| |+--------++--------++--------+| -+------------------------------+ +------------------------------+ ---- - config.def.h | 2 ++ - dwl.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 65 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..9a3b0c5 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "|M|", centeredmaster }, - }; - - /* monitors */ -@@ -139,6 +140,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_c, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index def2562..c2456dd 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -251,6 +251,7 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); -+static void centeredmaster(Monitor *m); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); - static void cleanup(void); -@@ -649,6 +650,68 @@ buttonpress(struct wl_listener *listener, void *data) - event->time_msec, event->button, event->state); - } - -+void -+centeredmaster(Monitor *m) -+{ -+ int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ n = 0; -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ if (n == 0) -+ return; -+ -+ /* initialize areas */ -+ mw = m->w.width; -+ mx = 0; -+ my = 0; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; -+ tw = m->w.width - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->w.width - mw) / 2; -+ tw = (m->w.width - mw) / 2; -+ } -+ } -+ -+ i = 0; -+ oty = 0; -+ ety = 0; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->w.height - my) / (MIN(n, m->nmaster) - i); -+ resize(c, (struct wlr_box){.x = m->w.x + mx, .y = m->w.y + my, .width = mw, -+ .height = h}, 0); -+ my += c->geom.height; -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2) { -+ h = (m->w.height - ety) / ( (1 + n - i) / 2); -+ resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + ety, .width = tw, -+ .height = h}, 0); -+ ety += c->geom.height; -+ } else { -+ h = (m->w.height - oty) / ((1 + n - i) / 2); -+ resize(c, (struct wlr_box){.x = m->w.x + mx + mw, .y = m->w.y + oty, .width = tw, -+ .height = h}, 0); -+ oty += c->geom.height; -+ } -+ } -+ i++; -+ } -+} -+ - void - chvt(const Arg *arg) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/cfact-snail/README.md b/dwl-bak/dwl-patches/patches/cfact-snail/README.md deleted file mode 100644 index 488ab98..0000000 --- a/dwl-bak/dwl-patches/patches/cfact-snail/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -This patch implements [cfact][cfact] for [snail][snail] layout. -This patch must be applied on top of cfact and snail patches. - -[cfact]: /dwl/dwl-patches/src/branch/main/patches/cfact -[snail]: /dwl/dwl-patches/src/branch/main/patches/snail - - -### Download - - [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/cfact-snail/cfact-snail.patch) - -### Authors -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/cfact-snail/cfact-snail.patch b/dwl-bak/dwl-patches/patches/cfact-snail/cfact-snail.patch deleted file mode 100644 index 213c3fd..0000000 --- a/dwl-bak/dwl-patches/patches/cfact-snail/cfact-snail.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 9f8109182a7d173d2a2cb30c089a7e7b9ffe0a5e Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Tue, 25 Mar 2025 02:24:32 +0100 -Subject: [PATCH] cfact patch for snail layout - ---- - dwl.c | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 4f8c493..37aa935 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2699,10 +2699,10 @@ snail(Monitor *m) - * Split the previous horizontally and put the current window on the right - */ - } else if (dir == WLR_DIRECTION_RIGHT) { -- c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -+ c->geom = (struct wlr_box){.x = prev->geom.x + (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.width), .y = prev->geom.y, -+ .width = (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.width), .height = prev->geom.height}; - prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -+ .width = (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.width), .height = prev->geom.height}; - /* - * If it's a stack window or the first narrow window in the master - * area, put the next one below it -@@ -2713,28 +2713,28 @@ snail(Monitor *m) - * Split the previous vertically and put the current window below it - */ - } else if (dir == WLR_DIRECTION_DOWN) { -- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.height), -+ .width = prev->geom.width, .height = (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.height)}; - prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -+ .width = prev->geom.width, .height = (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.height)}; - dir = WLR_DIRECTION_LEFT; - /* - * Split the previous horizontally and put the current window on the left - */ - } else if (dir == WLR_DIRECTION_LEFT) { - c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -- prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -+ .width = (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.width), .height = prev->geom.height}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x + (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.width), .y = prev->geom.y, -+ .width = (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.width), .height = prev->geom.height}; - dir = WLR_DIRECTION_UP; - /* - * Split the previous vertically and put the current window above it - */ - } else { - c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -+ .width = prev->geom.width, .height = (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.height)}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + (int)(c->cweight / (c->cweight + prev->cweight) * prev->geom.height), -+ .width = prev->geom.width, .height = (int)(prev->cweight / (prev->cweight + c->cweight) * prev->geom.height)}; - dir = WLR_DIRECTION_RIGHT; - } - i++; --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/cfact/README.md b/dwl-bak/dwl-patches/patches/cfact/README.md deleted file mode 100644 index 166b4e2..0000000 --- a/dwl-bak/dwl-patches/patches/cfact/README.md +++ /dev/null @@ -1,25 +0,0 @@ -### Description -A port of the [dwm cfacts patch](https://dwm.suckless.org/patches/cfacts/) (with the limits removed) - -Clients with higher weight are allocated more space! -``` -+---------------------+ -| | 0.5 | -| 1.0 +----------+ -+----------+ | -| | 1.0 | -| +----------+ -| 2.0 | | -| | 1.0 | -+----------+----------+` -``` -### Download -- [git branch](https://codeberg.org/Palanix/dwl/src/branch/cfact) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/cfact/cfact-v0.7.patch) -- [v0.7-gaps](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/cfact/cfact-v0.7-gaps.patch) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/cfact/cfact-v0.6.patch) -- [2024-02-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/cfact/cfact.patch) - -### Authors -- [dev-gm](https://codeberg.org/dev-gm) -- [Palanix](https://codeberg.org/Palanix) diff --git a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.6.patch b/dwl-bak/dwl-patches/patches/cfact/cfact-v0.6.patch deleted file mode 100644 index c1505fb..0000000 --- a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.6.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 52d8ed5ece7c96ea02441faaa4da2b0f51c8ebc4 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 24 Nov 2023 21:16:56 +0100 -Subject: [PATCH] cweights to allow different size clients in normal layouts - ---- - config.def.h | 3 +++ - dwl.c | 32 ++++++++++++++++++++++++++++++-- - 2 files changed, 33 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..d1bc596 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -133,6 +133,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_H, setcfact, {.f = +0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_L, setcfact, {.f = -0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, setcfact, {.f = 0.0f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index 145fd01..68e35d2 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -140,6 +140,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ float cweight; - } Client; - - typedef struct { -@@ -318,6 +319,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void setcfact(const Arg *arg); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -1041,6 +1043,7 @@ createnotify(struct wl_listener *listener, void *data) - c = xdg_surface->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = xdg_surface; - c->bw = borderpx; -+ c->cweight = 1.0; - - wlr_xdg_toplevel_set_wm_capabilities(xdg_surface->toplevel, - WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); -@@ -2218,6 +2221,19 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+setcfact(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ -+ if(!arg || !sel || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ sel->cweight = (float) (arg->f ? sel->cweight + arg->f : 1.0); -+ if (sel->cweight < 0) -+ sel->cweight = 0; -+ arrange(selmon); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2637,6 +2653,7 @@ tile(Monitor *m) - { - unsigned int mw, my, ty; - int i, n = 0; -+ float mweight = 0, tweight = 0; - Client *c; - - wl_list_for_each(c, &clients, link) -@@ -2649,17 +2666,27 @@ tile(Monitor *m) - mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; - else - mw = m->w.width; -+ i = 0; -+ wl_list_for_each(c, &clients, link){ -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) -+ mweight += c->cweight; -+ else -+ tweight += c->cweight; -+ i++; -+ } - i = my = ty = 0; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -+ .height = (int) ((c->cweight / mweight) * m->w.height)}, 0); - my += c->geom.height; - } else { - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ .width = m->w.width - mw, .height = (int) ((c->cweight / tweight) * m->w.height) }, 0); - ty += c->geom.height; - } - i++; -@@ -3047,6 +3074,7 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->cweight = 1.0; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7-gaps.patch b/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7-gaps.patch deleted file mode 100644 index e080238..0000000 --- a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7-gaps.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 31d0ceb3f7dea83282e61e556d71d06b7f43d753 Mon Sep 17 00:00:00 2001 -From: Gavin M -Date: Sat, 16 Nov 2024 08:47:02 -0500 -Subject: [PATCH] Add cfact to gaps - ---- - config.def.h | 3 +++ - dwl.c | 63 +++++++++++++++++++++++++++++++++++++++++----------- - 2 files changed, 53 insertions(+), 13 deletions(-) - -diff --git a/config.def.h b/config.def.h -index b388b4e..a871364 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -136,6 +136,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_H, setcfact, {.f = +0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_L, setcfact, {.f = -0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, setcfact, {.f = 0.0f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY, XKB_KEY_g, togglegaps, {0} }, -diff --git a/dwl.c b/dwl.c -index dc851df..b5313c1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -140,6 +140,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ float cweight; - } Client; - - typedef struct { -@@ -319,6 +320,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void setcfact(const Arg *arg); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -1045,6 +1047,7 @@ createnotify(struct wl_listener *listener, void *data) - c = xdg_surface->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = xdg_surface; - c->bw = borderpx; -+ c->cweight = 1.0; - - wlr_xdg_toplevel_set_wm_capabilities(xdg_surface->toplevel, - WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); -@@ -2223,6 +2226,19 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+setcfact(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ -+ if(!arg || !sel || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ sel->cweight = (float) (arg->f ? sel->cweight + arg->f : 1.0); -+ if (sel->cweight < 0) -+ sel->cweight = 0; -+ arrange(selmon); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2642,38 +2658,58 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int h, r, e = m->gaps, mw, my, ty; -+ unsigned int e = m->gaps, mw, my, ty; - int i, n = 0; -- Client *c; -+ float mweight = 0, tweight = 0; -+ Client *c, *sel = NULL; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (VISIBLEON(c, m) && !c->isfullscreen) { -+ if (!sel) -+ sel = c; -+ if (!c->isfloating) -+ n++; -+ } -+ } - -- wl_list_for_each(c, &clients, link) -- if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -- n++; - if (n == 0) - return; -+ - if (smartgaps == n) - e = 0; - - if (n > m->nmaster) - mw = m->nmaster ? (int)roundf((m->w.width + gappx*e) * m->mfact) : 0; - else -- mw = m->w.width; -+ mw = m->w.width - gappx*e; -+ -+ i = 0; -+ wl_list_for_each(c, &clients, link){ -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) -+ mweight += c->cweight; -+ else -+ tweight += c->cweight; -+ i++; -+ } -+ - i = 0; - my = ty = gappx*e; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { -- r = MIN(n, m->nmaster) - i; -- h = (m->w.height - my - gappx*e - gappx*e * (r - 1)) / r; - resize(c, (struct wlr_box){.x = m->w.x + gappx*e, .y = m->w.y + my, -- .width = mw - 2*gappx*e, .height = h}, 0); -+ .width = mw - gappx*e, -+ .height = (int)((c->cweight / mweight) * (float)(m->w.height - gappx*e)) - gappx*e -+ }, 0); - my += c->geom.height + gappx*e; - } else { -- r = n - i; -- h = (m->w.height - ty - gappx*e - gappx*e * (r - 1)) / r; -- resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw - gappx*e, .height = h}, 0); -+ resize(c, (struct wlr_box){.x = m->w.x + mw + gappx*e, .y = m->w.y + ty, -+ .width = m->w.width - mw - 2*gappx*e, -+ .height = (int)((c->cweight / tweight) * (float)(m->w.height - gappx*e)) - gappx*e -+ }, 0); - ty += c->geom.height + gappx*e; - } - i++; -@@ -3068,6 +3104,7 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->cweight = 1.0; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.47.0 - diff --git a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7.patch b/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7.patch deleted file mode 100644 index 7d28a8b..0000000 --- a/dwl-bak/dwl-patches/patches/cfact/cfact-v0.7.patch +++ /dev/null @@ -1,121 +0,0 @@ -From e82e15860c36a70539625b8fe7b4bd54d0721705 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 24 Nov 2023 21:16:56 +0100 -Subject: [PATCH] cweights to allow different size clients in normal layouts - ---- - config.def.h | 3 +++ - dwl.c | 32 ++++++++++++++++++++++++++++++-- - 2 files changed, 33 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..d1bc596 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -133,6 +133,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_H, setcfact, {.f = +0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_L, setcfact, {.f = -0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, setcfact, {.f = 0.0f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index 5bf995e..5a17343 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -141,6 +141,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ float cweight; - } Client; - - typedef struct { -@@ -322,6 +323,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void setcfact(const Arg *arg); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -1060,6 +1062,7 @@ createnotify(struct wl_listener *listener, void *data) - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->cweight = 1.0; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -2268,6 +2271,19 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+setcfact(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ -+ if(!arg || !sel || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ sel->cweight = (float) (arg->f ? sel->cweight + arg->f : 1.0); -+ if (sel->cweight < 0) -+ sel->cweight = 0; -+ arrange(selmon); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2692,6 +2708,7 @@ tile(Monitor *m) - { - unsigned int mw, my, ty; - int i, n = 0; -+ float mweight = 0, tweight = 0; - Client *c; - - wl_list_for_each(c, &clients, link) -@@ -2704,17 +2721,27 @@ tile(Monitor *m) - mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; - else - mw = m->w.width; -+ i = 0; -+ wl_list_for_each(c, &clients, link){ -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) -+ mweight += c->cweight; -+ else -+ tweight += c->cweight; -+ i++; -+ } - i = my = ty = 0; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -+ .height = (int) ((c->cweight / mweight) * m->w.height)}, 0); - my += c->geom.height; - } else { - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ .width = m->w.width - mw, .height = (int) ((c->cweight / tweight) * m->w.height) }, 0); - ty += c->geom.height; - } - i++; -@@ -3102,6 +3129,7 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->cweight = 1.0; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/cfact/cfact.patch b/dwl-bak/dwl-patches/patches/cfact/cfact.patch deleted file mode 100644 index c91d3c0..0000000 --- a/dwl-bak/dwl-patches/patches/cfact/cfact.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 98fe302cd240b519c28c886250273854844ab2c7 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 24 Nov 2023 21:16:56 +0100 -Subject: [PATCH] cweights to allow different size clients in normal layouts - ---- - config.def.h | 3 +++ - dwl.c | 32 ++++++++++++++++++++++++++++++-- - 2 files changed, 33 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..27ff521 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -128,6 +128,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_H, setcfact, {.f = +0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_L, setcfact, {.f = -0.25f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, setcfact, {.f = 0.0f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index fa76db2..9bdb438 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -136,6 +136,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ float cweight; - } Client; - - typedef struct { -@@ -301,6 +302,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void setcfact(const Arg *arg); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -956,6 +958,7 @@ createnotify(struct wl_listener *listener, void *data) - c = xdg_surface->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = xdg_surface; - c->bw = borderpx; -+ c->cweight = 1.0; - - wlr_xdg_toplevel_set_wm_capabilities(xdg_surface->toplevel, - WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN); -@@ -2009,6 +2012,19 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+setcfact(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ -+ if(!arg || !sel || !selmon->lt[selmon->sellt]->arrange) -+ return; -+ sel->cweight = (float) (arg->f ? sel->cweight + arg->f : 1.0); -+ if (sel->cweight < 0) -+ sel->cweight = 0; -+ arrange(selmon); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2468,6 +2484,7 @@ tile(Monitor *m) - { - unsigned int mw, my, ty; - int i, n = 0; -+ float mweight = 0, tweight = 0; - Client *c; - - wl_list_for_each(c, &clients, link) -@@ -2480,17 +2497,27 @@ tile(Monitor *m) - mw = m->nmaster ? ROUND(m->w.width * m->mfact) : 0; - else - mw = m->w.width; -+ i = 0; -+ wl_list_for_each(c, &clients, link){ -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) -+ mweight += c->cweight; -+ else -+ tweight += c->cweight; -+ i++; -+ } - i = my = ty = 0; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -+ .height = (int) ((c->cweight / mweight) * m->w.height)}, 0); - my += c->geom.height; - } else { - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ .width = m->w.width - mw, .height = (int) ((c->cweight / tweight) * m->w.height) }, 0); - ty += c->geom.height; - } - i++; -@@ -2872,6 +2899,7 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = borderpx; -+ c->cweight = 1.0; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.43.1 - diff --git a/dwl-bak/dwl-patches/patches/chainkeys/README.md b/dwl-bak/dwl-patches/patches/chainkeys/README.md deleted file mode 100644 index fa6d185..0000000 --- a/dwl-bak/dwl-patches/patches/chainkeys/README.md +++ /dev/null @@ -1,15 +0,0 @@ -### Description -Implements chained keybindings (like the dwm -[keychain](https://dwm.suckless.org/patches/keychain/) patch). - -Bindings can share a leading chain key. This chain key will be triggered when -Mod+chain is pressed. A subsequent keypress will be matched against bindings -for that chain key. If it is configured the action will be triggered, otherwise -the keypress will be ignored. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/chainkeys) -- [2024-05-20](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/chainkeys/chainkeys.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) diff --git a/dwl-bak/dwl-patches/patches/chainkeys/chainkeys.patch b/dwl-bak/dwl-patches/patches/chainkeys/chainkeys.patch deleted file mode 100644 index a0daefd..0000000 --- a/dwl-bak/dwl-patches/patches/chainkeys/chainkeys.patch +++ /dev/null @@ -1,157 +0,0 @@ -From 226e204ec7fb6d6840a984ef8e8ec1d2514e985f Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Tue, 2 Jan 2024 10:33:59 +1000 -Subject: [PATCH] chainkeys - ---- - config.def.h | 62 ++++++++++++++++++++++++++-------------------------- - dwl.c | 23 ++++++++++++++++++- - 2 files changed, 53 insertions(+), 32 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 8f498d2f..1c182547 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -105,10 +105,10 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - #define MODKEY WLR_MODIFIER_ALT - - #define TAGKEYS(KEY,SKEY,TAG) \ -- { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } -+ { MODKEY, -1, KEY, view, {.ui = 1 << TAG} }, \ -+ { MODKEY|WLR_MODIFIER_CTRL, -1, KEY, toggleview, {.ui = 1 << TAG} }, \ -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, SKEY, tag, {.ui = 1 << TAG} }, \ -+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,-1,SKEY,toggletag, {.ui = 1 << TAG} } - - /* helper for spawning shell commands in the pre dwm-5.0 fashion */ - #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } -@@ -119,30 +119,30 @@ static const char *menucmd[] = { "wmenu-run", NULL }; - - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -- /* modifier key function argument */ -- { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -- { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, -- { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -- { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -- { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, -- { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -- { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -- { MODKEY, XKB_KEY_Return, zoom, {0} }, -- { MODKEY, XKB_KEY_Tab, view, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -- { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, -- { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -- { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -- { MODKEY, XKB_KEY_space, setlayout, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -- { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, -- { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ /* modifier chain, key function argument */ -+ { MODKEY, -1, XKB_KEY_p, spawn, {.v = menucmd} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, -1, XKB_KEY_j, focusstack, {.i = +1} }, -+ { MODKEY, -1, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY, -1, XKB_KEY_i, incnmaster, {.i = +1} }, -+ { MODKEY, -1, XKB_KEY_d, incnmaster, {.i = -1} }, -+ { MODKEY, -1, XKB_KEY_h, setmfact, {.f = -0.05f} }, -+ { MODKEY, -1, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY, -1, XKB_KEY_Return, zoom, {0} }, -+ { MODKEY, -1, XKB_KEY_Tab, view, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_C, killclient, {0} }, -+ { MODKEY, -1, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, -+ { MODKEY, -1, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -+ { MODKEY, -1, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, -1, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_space, togglefloating, {0} }, -+ { MODKEY, -1, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, -1, XKB_KEY_0, view, {.ui = ~0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_parenright, tag, {.ui = ~0} }, -+ { MODKEY, -1, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY, -1, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -@@ -152,14 +152,14 @@ static const Key keys[] = { - TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), - TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), - TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, -1, XKB_KEY_Q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ -- { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, -+ { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,-1,XKB_KEY_Terminate_Server, quit, {0} }, - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is - * do not remove them. - */ --#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } -+#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,-1,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } - CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), - }; -diff --git a/dwl.c b/dwl.c -index bf763dfc..05e667f8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -143,6 +143,7 @@ typedef struct { - - typedef struct { - uint32_t mod; -+ int chain; - xkb_keysym_t keysym; - void (*func)(const Arg *); - const Arg arg; -@@ -353,6 +354,7 @@ static const char broken[] = "broken"; - static pid_t child_pid = -1; - static int locked; - static void *exclusive_focus; -+static int chainkey = -1; - static struct wl_display *dpy; - static struct wlr_backend *backend; - static struct wlr_scene *scene; -@@ -1438,11 +1440,30 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - const Key *k; - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) -- && sym == k->keysym && k->func) { -+ && sym == k->keysym -+ && chainkey == -1 -+ && k->chain == -1 -+ && k->func) { - k->func(&k->arg); - return 1; - } -+ else if (sym == k->keysym -+ && chainkey != -1 -+ && k->chain == chainkey -+ && k->func) { -+ k->func(&k->arg); -+ chainkey = -1; -+ return 1; -+ } -+ else if (CLEANMASK(mods) == CLEANMASK(k->mod) -+ && k->chain == (int)sym -+ && chainkey == -1 -+ && k->func) { -+ chainkey = sym; -+ return 1; -+ } - } -+ chainkey = -1; - return 0; - } - --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/client-opacity/README.md b/dwl-bak/dwl-patches/patches/client-opacity/README.md deleted file mode 100644 index ed82d81..0000000 --- a/dwl-bak/dwl-patches/patches/client-opacity/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Description -This patch adds default transparency parameters to config.h which specify the starting transparencies of all windows. - -It also adds opacities to the ruleset, enabling override of the opacities on a per client basis. - -Additionally, it adds some shortcuts: -``` -[MODKEY]+[o] -> increase focus opacity of currently focused window -[MODKEY]+[Shift]+[o] -> decrease focus opacity of currently focused window -``` - - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/client-opacity) -- [2025-01-20](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/client-opacity/client-opacity.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/client-opacity/client-opacity.patch b/dwl-bak/dwl-patches/patches/client-opacity/client-opacity.patch deleted file mode 100644 index da2faf7..0000000 --- a/dwl-bak/dwl-patches/patches/client-opacity/client-opacity.patch +++ /dev/null @@ -1,181 +0,0 @@ -From ba3172875d379ff4f2db69753f50067cecfc8293 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Tue, 25 Jul 2023 12:48:22 -0600 -Subject: [PATCH] add default transparency for windows and rules for override - the transparency -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 9 ++++++--- - dwl.c | 39 +++++++++++++++++++++++++++++++++++++++ - 2 files changed, 45 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..0eb86874 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,7 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float default_opacity = 0.75; - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -@@ -22,10 +23,10 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating alpha monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, default_opacity, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 1.0, -1 }, /* Start on ONLY tag "9" */ - }; - - /* layout(s) */ -@@ -133,6 +134,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY, XKB_KEY_o, setopacity, {.f = +0.1f} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, setopacity, {.f = -0.1f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index ad21e1ba..0554fcdf 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -138,6 +138,7 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ float opacity; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -227,6 +228,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ float opacity; - int monitor; - } Rule; - -@@ -319,6 +321,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void scenebuffersetopacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -326,6 +329,7 @@ static void setfullscreen(Client *c, int fullscreen); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); -+static void setopacity(const Arg *arg); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); -@@ -491,6 +495,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->opacity = r->opacity; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -499,6 +504,8 @@ applyrules(Client *c) - } - } - } -+ if (c->scene_surface) -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c); - setmon(c, mon, newtags); - } - -@@ -874,6 +881,9 @@ commitnotify(struct wl_listener *listener, void *data) - - resize(c, c->geom, (c->isfloating && !c->isfullscreen)); - -+ if (c->scene_surface) -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c); -+ - /* mark a pending resize as completed */ - if (c->resize && c->resize <= c->surface.xdg->current.configure_serial) - c->resize = 0; -@@ -1120,6 +1130,7 @@ createnotify(struct wl_listener *listener, void *data) - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->opacity = default_opacity; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -2285,6 +2296,15 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+scenebuffersetopacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *data) -+{ -+ Client *c = data; -+ /* xdg-popups are children of Client.scene, we do not have to worry about -+ messing with them. */ -+ wlr_scene_buffer_set_opacity(buffer, c->isfullscreen ? 1 : c->opacity); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2353,6 +2373,7 @@ setfullscreen(Client *c, int fullscreen) - * client positions are set by the user and cannot be recalculated */ - resize(c, c->prev, 0); - } -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, scenebuffersetopacity, c); - arrange(c->mon); - printstatus(); - } -@@ -2409,6 +2430,23 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - focusclient(focustop(selmon), 1); - } - -+void -+setopacity(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ if (!sel) -+ return; -+ -+ sel->opacity += arg->f; -+ if (sel->opacity > 1.0) -+ sel->opacity = 1.0f; -+ -+ if (sel->opacity < 0.1) -+ sel->opacity = 0.1f; -+ -+ wlr_scene_node_for_each_buffer(&sel->scene_surface->node, scenebuffersetopacity, sel); -+} -+ - void - setpsel(struct wl_listener *listener, void *data) - { -@@ -3120,6 +3158,7 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->opacity = default_opacity; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/column/README.md b/dwl-bak/dwl-patches/patches/column/README.md deleted file mode 100644 index 9d1b205..0000000 --- a/dwl-bak/dwl-patches/patches/column/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -A column layout patch. This patch just puts the visible clients into equal-width columns on the screen. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/column) -- [2024-01-02](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/column/column.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/column/column.patch b/dwl-bak/dwl-patches/patches/column/column.patch deleted file mode 100644 index 0f6a531..0000000 --- a/dwl-bak/dwl-patches/patches/column/column.patch +++ /dev/null @@ -1,79 +0,0 @@ -From d1eb2061c619d0bbd7a0ecda0fe77409f3a6c399 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Fri, 29 Dec 2023 19:02:11 +1000 -Subject: [PATCH] column layout - ---- - config.def.h | 2 ++ - dwl.c | 28 ++++++++++++++++++++++++++++ - 2 files changed, 30 insertions(+) - -diff --git a/config.def.h b/config.def.h -index a8ed61d9..edb30cae 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "||", col }, - }; - - /* monitors */ -@@ -134,6 +135,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_c, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index 4d19357f..63d80da7 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -243,6 +243,7 @@ static void checkidleinhibitor(struct wlr_surface *exclude); - static void cleanup(void); - static void cleanupmon(struct wl_listener *listener, void *data); - static void closemon(Monitor *m); -+static void col(Monitor *m); - static void commitlayersurfacenotify(struct wl_listener *listener, void *data); - static void commitnotify(struct wl_listener *listener, void *data); - static void createdecoration(struct wl_listener *listener, void *data); -@@ -704,6 +705,33 @@ closemon(Monitor *m) - printstatus(); - } - -+void -+col(Monitor *m) -+{ -+ Client *c; -+ unsigned int n = 0, i = 0; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ resize( -+ c, -+ (struct wlr_box){ -+ .x = m->w.x + i * m->w.width / n, -+ .y = m->w.y, -+ .width = m->w.width / n, -+ .height = m->w.height -+ }, -+ 0 -+ ); -+ i++; -+ } -+} -+ - void - commitlayersurfacenotify(struct wl_listener *listener, void *data) - { --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/coredump/README.md b/dwl-bak/dwl-patches/patches/coredump/README.md deleted file mode 100644 index 5300890..0000000 --- a/dwl-bak/dwl-patches/patches/coredump/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Generate a coredump if dwl exited abnormally (to be more usefull you need to -compile dwl and wlroots with debug symbols) - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/coredump) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/coredump/coredump.patch) -- [coredump-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/coredump/coredump-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/coredump/coredump-0.7.patch b/dwl-bak/dwl-patches/patches/coredump/coredump-0.7.patch deleted file mode 100644 index f39e7af..0000000 --- a/dwl-bak/dwl-patches/patches/coredump/coredump-0.7.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 2abde87f9159ec3318a0489ac0ed512f166ef8c8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Wed, 5 Oct 2022 23:07:13 -0500 -Subject: [PATCH] increase RLIMIT_CORE (generate a coredump) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - dwl.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/dwl.c b/dwl.c -index a2711f67..cfbb0bb8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -358,6 +359,8 @@ static void zoom(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -+static struct rlimit oldrlimit; -+static struct rlimit newrlimit; - static pid_t child_pid = -1; - static int locked; - static void *exclusive_focus; -@@ -2232,6 +2235,7 @@ run(char *startup_cmd) - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ setrlimit(RLIMIT_CORE, &oldrlimit); - setsid(); - dup2(piperw[0], STDIN_FILENO); - close(piperw[0]); -@@ -2649,6 +2653,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ setrlimit(RLIMIT_CORE, &oldrlimit); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -3189,6 +3194,10 @@ main(int argc, char *argv[]) - char *startup_cmd = NULL; - int c; - -+ getrlimit(RLIMIT_CORE, &oldrlimit); -+ newrlimit.rlim_cur = newrlimit.rlim_max = oldrlimit.rlim_max; -+ setrlimit(RLIMIT_CORE, &newrlimit); -+ - while ((c = getopt(argc, argv, "s:hdv")) != -1) { - if (c == 's') - startup_cmd = optarg; --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/coredump/coredump.patch b/dwl-bak/dwl-patches/patches/coredump/coredump.patch deleted file mode 100644 index 98ffbd8..0000000 --- a/dwl-bak/dwl-patches/patches/coredump/coredump.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 6d5017888891957615160fe7c015adf7a6f0fd45 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Wed, 5 Oct 2022 23:07:13 -0500 -Subject: [PATCH] increase RLIMIT_CORE (generate a coredump) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - dwl.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/dwl.c b/dwl.c -index ad21e1ba..940fbeff 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -353,6 +354,8 @@ static void xytonode(double x, double y, struct wlr_surface **psurface, - static void zoom(const Arg *arg); - - /* variables */ -+static struct rlimit oldrlimit; -+static struct rlimit newrlimit; - static pid_t child_pid = -1; - static int locked; - static void *exclusive_focus; -@@ -2248,6 +2251,7 @@ run(char *startup_cmd) - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ setrlimit(RLIMIT_CORE, &oldrlimit); - setsid(); - dup2(piperw[0], STDIN_FILENO); - close(piperw[0]); -@@ -2659,6 +2663,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ setrlimit(RLIMIT_CORE, &oldrlimit); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -3178,6 +3183,10 @@ main(int argc, char *argv[]) - char *startup_cmd = NULL; - int c; - -+ getrlimit(RLIMIT_CORE, &oldrlimit); -+ newrlimit.rlim_cur = newrlimit.rlim_max = oldrlimit.rlim_max; -+ setrlimit(RLIMIT_CORE, &newrlimit); -+ - while ((c = getopt(argc, argv, "s:hdv")) != -1) { - if (c == 's') - startup_cmd = optarg; --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/cursortheme/README.md b/dwl-bak/dwl-patches/patches/cursortheme/README.md deleted file mode 100644 index ac94800..0000000 --- a/dwl-bak/dwl-patches/patches/cursortheme/README.md +++ /dev/null @@ -1,17 +0,0 @@ -### Description -Adds ability to change cursor's theme and size. - -```c -static const char *cursor_theme = NULL; -static const char cursor_size[] = "24"; /* Make sure it's a valid integer, otherwise things will break */ -``` - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/cursortheme) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/cursortheme/cursortheme.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/b828e21717fa584affeb3245359c3ab615759fa4/cursortheme/cursortheme.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/c676de59d51e613bd52ac46c77a24b1cac9a61a1/cursortheme/cursortheme.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [egorguslyan](https://github.com/egorguslyan) diff --git a/dwl-bak/dwl-patches/patches/cursortheme/cursortheme.patch b/dwl-bak/dwl-patches/patches/cursortheme/cursortheme.patch deleted file mode 100644 index 3c34222..0000000 --- a/dwl-bak/dwl-patches/patches/cursortheme/cursortheme.patch +++ /dev/null @@ -1,46 +0,0 @@ -From f08376a2a04929a3907612e6c1f980ad3cdf939f Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 11:10:39 -0500 -Subject: [PATCH] implement cursortheme - ---- - config.def.h | 2 ++ - dwl.c | 8 ++++++-- - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..1f9ff56 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,8 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const char *cursor_theme = NULL; -+static const char cursor_size[] = "24"; /* Make sure it's a valid integer, otherwise things will break */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -diff --git a/dwl.c b/dwl.c -index dc0437e..a91d42b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2522,8 +2522,12 @@ setup(void) - * Xcursor themes to source cursor images from and makes sure that cursor - * images are available at all scale factors on the screen (necessary for - * HiDPI support). Scaled cursors will be loaded with each output. */ -- cursor_mgr = wlr_xcursor_manager_create(NULL, 24); -- setenv("XCURSOR_SIZE", "24", 1); -+ cursor_mgr = wlr_xcursor_manager_create(cursor_theme, atoi(cursor_size)); -+ setenv("XCURSOR_SIZE", cursor_size, 1); -+ if (cursor_theme) -+ setenv("XCURSOR_THEME", cursor_theme, 1); -+ else -+ unsetenv("XCURSOR_THEME"); - - /* - * wlr_cursor *only* displays an image on screen. It does not move around --- -2.45.1 - - diff --git a/dwl-bak/dwl-patches/patches/customfloat/README.md b/dwl-bak/dwl-patches/patches/customfloat/README.md deleted file mode 100644 index 9f2bda5..0000000 --- a/dwl-bak/dwl-patches/patches/customfloat/README.md +++ /dev/null @@ -1,24 +0,0 @@ -### Description -Rules for floating windows support default x, y, width, height. Defaults to the center of the screen and the client size. - -If the width or height is less than or equal to 1, then the value will be interpreted as a percentage. For example, 0.5 represents 50%, 0.25 represents 25%, and 1 represents 100%. **NOTE**: Some clients, like Thunar, have minimum width/height - -The variable `center_relative_to_monitor` allows the user to choose whether to center relative to the monitor or relative to the window area. - -
-Explanation of center_relative_to_monitor: -
-The "Monitor area" refers to the space enclosed by the green rectangle, while the "Window area" refers to the space enclosed by the red rectangle.
-
-
-
- -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/customfloat) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/customfloat/customfloat.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/98cba933c9f4099202e54f39acbf17e05bde828a/customfloat/customfloat.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/bf098459219e7a473d8edb4c0435aeb6a4b82e38/customfloat/customfloat.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [Stivvo](https://github.com/Stivvo) diff --git a/dwl-bak/dwl-patches/patches/customfloat/customfloat.patch b/dwl-bak/dwl-patches/patches/customfloat/customfloat.patch deleted file mode 100644 index d295571..0000000 --- a/dwl-bak/dwl-patches/patches/customfloat/customfloat.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 4f19f5499610d56f2616da5d44039403ac9d4c06 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Tue, 9 Jul 2024 10:52:37 -0500 -Subject: [PATCH] implement customfloat and generate patches - ---- - config.def.h | 7 ++++--- - dwl.c | 27 +++++++++++++++++++++++++++ - 2 files changed, 31 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..dee53f4 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,7 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const int respect_monitor_reserved_area = 0; /* 1 to monitor center while respecting the monitor's reserved area, 0 to monitor center */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -@@ -22,10 +23,10 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating monitor x y width height */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, -1, 0, 0, 1000, 0.75 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1, 0, 0, 0, 0 },/* Start on ONLY tag "9" */ - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index dc0437e..be0340f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -230,6 +230,10 @@ typedef struct { - uint32_t tags; - int isfloating; - int monitor; -+ int x; -+ int y; -+ float w; -+ float h; - } Rule; - - typedef struct { -@@ -454,6 +458,11 @@ applyrules(Client *c) - int i; - const Rule *r; - Monitor *mon = selmon, *m; -+ int newwidth; -+ int newheight; -+ int newx; -+ int newy; -+ int apply_resize = 0; - - c->isfloating = client_is_float_type(c); - if (!(appid = client_get_appid(c))) -@@ -471,9 +480,27 @@ applyrules(Client *c) - if (r->monitor == i++) - mon = m; - } -+ if (c->isfloating || !mon->lt[mon->sellt]->arrange) { -+ /* client is floating or in floating layout */ -+ struct wlr_box b = respect_monitor_reserved_area ? mon->w : mon->m; -+ newwidth = (int)round(r->w ? (r->w <= 1 ? b.width * r->w : r->w) : c->geom.width); -+ newheight = (int)round(r->h ? (r->h <= 1 ? b.height * r->h : r->h) : c->geom.height); -+ newx = (int)round(r->x ? (r->x <= 1 ? b.width * r->x + b.x : r->x + b.x) : c->geom.x); -+ newy = (int)round(r->y ? (r->y <= 1 ? b.height * r->y + b.y : r->y + b.y) : c->geom.y); -+ apply_resize = 1; -+ -+ } - } - } - setmon(c, mon, newtags); -+ if (apply_resize) { -+ resize(c, (struct wlr_box){ -+ .x = newx, -+ .y = newy, -+ .width = newwidth, -+ .height = newheight, -+ }, 1); -+ } - } - - void --- -2.45.1 diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/README.md b/dwl-bak/dwl-patches/patches/dim-unfocused/README.md deleted file mode 100644 index dad3ef0..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Implements dimming of clients which are unfocused. - -The code also allows any color dimming. There is also an additional option in `Rule`, which allows you to keep the client `neverdim`, that is, as if it is focused. - -There are also two functions that can be bound to a `Key` or `Button`, -1. `toggledimming`: Which toggles dimming for all windows (except for `Rule`s) -2. `toggledimmingclient`: Which toggles dimming for the focused window, as if the client had `neverdim` applied to it. This overwrites an applied `Rule`. - -### Download -- [2024-09-18](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dim-unfocused/dim-unfocused.patch) -- [2024-09-03](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dim-unfocused/dim-unfocused-20240903.patch) -- [2024-07-14](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dim-unfocused/dim-unfocused-20240714.patch) -- [2024-05-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dim-unfocused/dim-unfocused-20240516.patch) -- [2024-04-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dim-unfocused/dim-unfocused-20240416.patch) -- [git branch](https://codeberg.org/dhruva_sambrani/dwl/src/branch/dim-unfocused) - -### Authors -- [Dhruva Sambrani](https://codeberg.org/dhruva_sambrani) diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20230516.patch b/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20230516.patch deleted file mode 100644 index 88504cd..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20230516.patch +++ /dev/null @@ -1,213 +0,0 @@ -From cd3b5580dbf38f54b54d5bfb6039e0039cbd6b21 Mon Sep 17 00:00:00 2001 -From: Dhruva Sambrani <44899822+DhruvaSambrani@users.noreply.github.com> -Date: Thu, 16 May 2024 12:26:05 +0200 -Subject: [PATCH] clean git history - ---- - client.h | 6 ++++++ - config.def.h | 13 ++++++++----- - dwl.c | 40 +++++++++++++++++++++++++++++++++++----- - 3 files changed, 49 insertions(+), 10 deletions(-) - -diff --git a/client.h b/client.h -index 800b867..4d83248 100644 ---- a/client.h -+++ b/client.h -@@ -332,6 +332,12 @@ client_set_border_color(Client *c, const float color[static 4]) - wlr_scene_rect_set_color(c->border[i], color); - } - -+static inline void -+client_set_dimmer_state(Client *c, const int dim) -+{ -+ wlr_scene_node_set_enabled(&c->dimmer->node, DIMOPT && !c->neverdim && dim); -+} -+ - static inline void - client_set_fullscreen(Client *c, int fullscreen) - { -diff --git a/config.def.h b/config.def.h -index 8f498d2..d3950f9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -+static const float unfocuseddim[] = COLOR(0x00000088); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -21,10 +22,11 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - static int log_level = WLR_ERROR; - - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -- /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ /* app_id title tags mask isfloating neverdim monitor */ -+ /* examples: -+ { "Gimp_example", NULL, 0, 1, 0, -1 }, -+ */ -+ { "firefox_example", NULL, 1 << 8, 0, 1, -1 }, - }; - - /* layout(s) */ -@@ -135,8 +137,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_apostrophe, toggledimming, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index bf763df..ca88ad0 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -109,6 +109,7 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *dimmer; - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -137,7 +138,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, neverdim; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -227,6 +228,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int neverdim; - int monitor; - } Rule; - -@@ -330,6 +332,7 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void toggledimming(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -404,6 +407,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static int DIMOPT = 1; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -462,6 +466,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->neverdim = r-> neverdim; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1267,8 +1272,10 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ client_set_dimmer_state(c, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1286,7 +1293,7 @@ focusclient(Client *c, int lift) - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); -- -+ client_set_dimmer_state(old_c, 1); - client_activate_surface(old, 0); - } - } -@@ -1566,7 +1573,7 @@ mapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is mapped, or ready to display on-screen. */ - Client *p = NULL; -- Client *w, *c = wl_container_of(listener, c, map); -+ Client *w, *d, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; - -@@ -1599,6 +1606,10 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ c->dimmer = wlr_scene_rect_create(c->scene, 0, 0, unfocuseddim); -+ c->dimmer->node.data = c; -+ client_set_dimmer_state(c, 1); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -1617,6 +1628,10 @@ mapnotify(struct wl_listener *listener, void *data) - setmon(c, p->mon, p->tags); - } else { - applyrules(c); -+ d = focustop(selmon); -+ if (d) { -+ client_set_dimmer_state(d, 0); -+ } - } - printstatus(); - -@@ -2040,7 +2055,7 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom = geo; - applybounds(c, bbox); - -- /* Update scene-graph, including borders */ -+ /* Update scene-graph, including borders and dimmer*/ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); - wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -@@ -2050,6 +2065,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_rect_set_size(c->dimmer, c->geom.width, c-> geom.height); -+ wlr_scene_node_set_position(&c->dimmer->node, 0, 0); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -@@ -2603,6 +2620,19 @@ tile(Monitor *m) - } - } - -+void toggledimming(const Arg *arg) -+{ -+ Client *c; -+ DIMOPT ^= 1; -+ wl_list_for_each(c, &clients, link) -+ { -+ client_set_dimmer_state(c, 1); -+ } -+ c = focustop(selmon); -+ if (c) -+ client_set_dimmer_state(c, 0); -+} -+ - void - togglefloating(const Arg *arg) - { --- -2.45.1 - diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240416.patch b/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240416.patch deleted file mode 100644 index 701c450..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240416.patch +++ /dev/null @@ -1,177 +0,0 @@ -diff --git a/client.h b/client.h -index 800b867..4d83248 100644 ---- a/client.h -+++ b/client.h -@@ -332,6 +332,12 @@ client_set_border_color(Client *c, const float color[static 4]) - wlr_scene_rect_set_color(c->border[i], color); - } - -+static inline void -+client_set_dimmer_state(Client *c, const int dim) -+{ -+ wlr_scene_node_set_enabled(&c->dimmer->node, DIMOPT && !c->neverdim && dim); -+} -+ - static inline void - client_set_fullscreen(Client *c, int fullscreen) - { -diff --git a/config.def.h b/config.def.h -index 8847e58..36ac2a1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -+static const float unfocuseddim[] = COLOR(0x00000088); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -21,10 +22,11 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - static int log_level = WLR_ERROR; - - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -- /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ /* app_id title tags mask isfloating neverdim monitor */ -+ /* examples: -+ { "Gimp_example", NULL, 0, 1, 0, -1 }, -+ */ -+ { "firefox_example", NULL, 1 << 8, 0, 1, -1 }, - }; - - /* layout(s) */ -@@ -135,8 +137,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_apostrophe, toggledimming, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index bf763df..abd7112 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -109,6 +109,7 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *dimmer; - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -137,7 +138,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, neverdim; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -227,6 +228,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int neverdim; - int monitor; - } Rule; - -@@ -330,6 +332,7 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void toggledimming(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -404,6 +407,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static int DIMOPT = 1; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -462,6 +466,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->neverdim = r-> neverdim; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1267,8 +1272,10 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ client_set_dimmer_state(c, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1286,7 +1293,7 @@ focusclient(Client *c, int lift) - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); -- -+ client_set_dimmer_state(old_c, 1); - client_activate_surface(old, 0); - } - } -@@ -1599,6 +1606,10 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ c->dimmer = wlr_scene_rect_create(c->scene, 0, 0, unfocuseddim); -+ c->dimmer->node.data = c; -+ client_set_dimmer_state(c, 1); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -2040,7 +2051,7 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom = geo; - applybounds(c, bbox); - -- /* Update scene-graph, including borders */ -+ /* Update scene-graph, including borders and dimmer*/ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); - wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -@@ -2050,6 +2061,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_rect_set_size(c->dimmer, c->geom.width, c-> geom.height); -+ wlr_scene_node_set_position(&c->dimmer->node, 0, 0); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -@@ -2603,6 +2616,17 @@ tile(Monitor *m) - } - } - -+void toggledimming(const Arg *arg) -+{ -+ Client *c; -+ DIMOPT ^= 1; -+ wl_list_for_each(c, &clients, link) -+ { -+ client_set_dimmer_state(c, 1); -+ } -+ client_set_dimmer_state(focustop(selmon), 0); -+} -+ - void - togglefloating(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240714.patch b/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240714.patch deleted file mode 100644 index 0b60d60..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240714.patch +++ /dev/null @@ -1,199 +0,0 @@ -diff --git a/client.h b/client.h -index f0e5445..04b8d31 100644 ---- a/client.h -+++ b/client.h -@@ -320,6 +320,12 @@ client_set_border_color(Client *c, const float color[static 4]) - wlr_scene_rect_set_color(c->border[i], color); - } - -+static inline void -+client_set_dimmer_state(Client *c, const int dim) -+{ -+ wlr_scene_node_set_enabled(&c->dimmer->node, DIMOPT && !c->neverdim && dim); -+} -+ - static inline void - client_set_fullscreen(Client *c, int fullscreen) - { -diff --git a/config.def.h b/config.def.h -index 22d2171..e1b2bf0 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -+static const float unfocuseddim[] = COLOR(0x00000088); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -22,10 +23,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -- /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ /* app_id title tags mask isfloating neverdim monitor */ -+ /* examples: -+ { "Gimp_example", NULL, 0, 1, 0, -1 }, -+ */ -+ { "firefox_example", NULL, 1 << 8, 0, 1, -1 }, - }; - - /* layout(s) */ -@@ -140,8 +142,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_apostrophe, toggledimming, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index 145fd01..6c65860 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -110,6 +110,7 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *dimmer; - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -138,7 +139,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, neverdim; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -229,6 +230,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int neverdim; - int monitor; - } Rule; - -@@ -334,6 +336,7 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void toggledimming(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -407,6 +410,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static int DIMOPT = 1; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -465,6 +469,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->neverdim = r-> neverdim; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1346,8 +1351,10 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ client_set_dimmer_state(c, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1365,7 +1372,7 @@ focusclient(Client *c, int lift) - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); -- -+ client_set_dimmer_state(old_c, 1); - client_activate_surface(old, 0); - } - } -@@ -1638,7 +1645,7 @@ void - mapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is mapped, or ready to display on-screen. */ -- Client *p, *w, *c = wl_container_of(listener, c, map); -+ Client *p, *w, *d, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; - -@@ -1670,6 +1677,10 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ c->dimmer = wlr_scene_rect_create(c->scene, 0, 0, unfocuseddim); -+ c->dimmer->node.data = c; -+ client_set_dimmer_state(c, 1); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -1688,6 +1699,10 @@ mapnotify(struct wl_listener *listener, void *data) - setmon(c, p->mon, p->tags); - } else { - applyrules(c); -+ d = focustop(selmon); -+ if (d) { -+ client_set_dimmer_state(d, 0); -+ } - } - printstatus(); - -@@ -2141,7 +2156,7 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom = geo; - applybounds(c, bbox); - -- /* Update scene-graph, including borders */ -+ /* Update scene-graph, including borders and dimmer*/ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); - wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -@@ -2151,6 +2166,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_rect_set_size(c->dimmer, c->geom.width - 2*c->bw, c-> geom.height - 2*c->bw); -+ wlr_scene_node_set_position(&c->dimmer->node, c->bw, c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -@@ -2666,6 +2683,19 @@ tile(Monitor *m) - } - } - -+void toggledimming(const Arg *arg) -+{ -+ Client *c; -+ DIMOPT ^= 1; -+ wl_list_for_each(c, &clients, link) -+ { -+ client_set_dimmer_state(c, 1); -+ } -+ c = focustop(selmon); -+ if (c) -+ client_set_dimmer_state(c, 0); -+} -+ - void - togglefloating(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240903.patch b/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240903.patch deleted file mode 100644 index fc48b0b..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused-20240903.patch +++ /dev/null @@ -1,216 +0,0 @@ -diff --git a/client.h b/client.h -index dabea35..3a31c25 100644 ---- a/client.h -+++ b/client.h -@@ -319,6 +319,12 @@ client_set_border_color(Client *c, const float color[static 4]) - wlr_scene_rect_set_color(c->border[i], color); - } - -+static inline void -+client_set_dimmer_state(Client *c, const int dim) -+{ -+ wlr_scene_node_set_enabled(&c->dimmer->node, DIMOPT && !c->neverdim && dim); -+} -+ - static inline void - client_set_fullscreen(Client *c, int fullscreen) - { -diff --git a/config.def.h b/config.def.h -index 22d2171..4ca21c9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -+static const float unfocuseddim[] = COLOR(0x00000088); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -22,10 +23,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -- /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ /* app_id title tags mask isfloating neverdim monitor */ -+ /* examples: -+ { "Gimp_example", NULL, 0, 1, 0, -1 }, -+ */ -+ { "firefox_example", NULL, 1 << 8, 0, 1, -1 }, - }; - - /* layout(s) */ -@@ -140,8 +142,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_apostrophe, toggledimming, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -@@ -172,5 +175,6 @@ static const Key keys[] = { - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { MODKEY|ShiftMask, BTN_MIDDLE, toggledimmingclient, {0} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -diff --git a/dwl.c b/dwl.c -index 9021e44..e1f32e9 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -112,6 +112,7 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *dimmer; - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -141,7 +142,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, neverdim; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -231,6 +232,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int neverdim; - int monitor; - } Rule; - -@@ -338,6 +340,8 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void toggledimming(const Arg *arg); -+static void toggledimmingclient(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -410,6 +414,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static int DIMOPT = 1; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -466,6 +471,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->neverdim = r-> neverdim; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1366,8 +1372,10 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ client_set_dimmer_state(c, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1385,7 +1393,7 @@ focusclient(Client *c, int lift) - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); -- -+ client_set_dimmer_state(old_c, 1); - client_activate_surface(old, 0); - } - } -@@ -1682,8 +1690,7 @@ void - mapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is mapped, or ready to display on-screen. */ -- Client *p = NULL; -- Client *w, *c = wl_container_of(listener, c, map); -+ Client *p, *w, *d, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; - -@@ -1717,6 +1724,10 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ c->dimmer = wlr_scene_rect_create(c->scene, 0, 0, unfocuseddim); -+ c->dimmer->node.data = c; -+ client_set_dimmer_state(c, 1); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -1735,6 +1746,10 @@ mapnotify(struct wl_listener *listener, void *data) - setmon(c, p->mon, p->tags); - } else { - applyrules(c); -+ d = focustop(selmon); -+ if (d) { -+ client_set_dimmer_state(d, 0); -+ } - } - printstatus(); - -@@ -2161,7 +2176,7 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom = geo; - applybounds(c, bbox); - -- /* Update scene-graph, including borders */ -+ /* Update scene-graph, including borders and dimmer*/ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); - wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -@@ -2171,6 +2186,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_rect_set_size(c->dimmer, c->geom.width - 2*c->bw, c-> geom.height - 2*c->bw); -+ wlr_scene_node_set_position(&c->dimmer->node, c->bw, c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -@@ -2682,6 +2699,27 @@ tile(Monitor *m) - } - } - -+void toggledimming(const Arg *arg) -+{ -+ Client *c; -+ DIMOPT ^= 1; -+ wl_list_for_each(c, &clients, link) -+ { -+ client_set_dimmer_state(c, 1); -+ } -+ c = focustop(selmon); -+ if (c) -+ client_set_dimmer_state(c, 0); -+} -+ -+void -+toggledimmingclient(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ if (sel) -+ sel -> neverdim ^= 1; -+} -+ - void - togglefloating(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused.patch b/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused.patch deleted file mode 100644 index f73d886..0000000 --- a/dwl-bak/dwl-patches/patches/dim-unfocused/dim-unfocused.patch +++ /dev/null @@ -1,216 +0,0 @@ -diff --git a/client.h b/client.h -index dabea35..3a31c25 100644 ---- a/client.h -+++ b/client.h -@@ -319,6 +319,12 @@ client_set_border_color(Client *c, const float color[static 4]) - wlr_scene_rect_set_color(c->border[i], color); - } - -+static inline void -+client_set_dimmer_state(Client *c, const int dim) -+{ -+ wlr_scene_node_set_enabled(&c->dimmer->node, DIMOPT && !c->neverdim && dim); -+} -+ - static inline void - client_set_fullscreen(Client *c, int fullscreen) - { -diff --git a/config.def.h b/config.def.h -index 22d2171..4ca21c9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -+static const float unfocuseddim[] = COLOR(0x00000088); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -22,10 +23,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -- /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ /* app_id title tags mask isfloating neverdim monitor */ -+ /* examples: -+ { "Gimp_example", NULL, 0, 1, 0, -1 }, -+ */ -+ { "firefox_example", NULL, 1 << 8, 0, 1, -1 }, - }; - - /* layout(s) */ -@@ -140,8 +142,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_apostrophe, toggledimming, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -@@ -172,5 +175,6 @@ static const Key keys[] = { - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { MODKEY|ShiftMask, BTN_MIDDLE, toggledimmingclient, {0} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -diff --git a/dwl.c b/dwl.c -index dc0c861..dcc3ece 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -112,6 +112,7 @@ typedef struct { - Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ -+ struct wlr_scene_rect *dimmer; - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; -@@ -141,7 +142,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, neverdim; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -231,6 +232,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int neverdim; - int monitor; - } Rule; - -@@ -338,6 +340,8 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void toggledimming(const Arg *arg); -+static void toggledimmingclient(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -410,6 +414,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static int DIMOPT = 1; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -466,6 +471,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->neverdim = r-> neverdim; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1365,8 +1371,10 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ client_set_dimmer_state(c, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1384,7 +1392,7 @@ focusclient(Client *c, int lift) - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); -- -+ client_set_dimmer_state(old_c, 1); - client_activate_surface(old, 0); - } - } -@@ -1681,8 +1689,7 @@ void - mapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is mapped, or ready to display on-screen. */ -- Client *p = NULL; -- Client *w, *c = wl_container_of(listener, c, map); -+ Client *p, *w, *d, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; - -@@ -1716,6 +1723,10 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ c->dimmer = wlr_scene_rect_create(c->scene, 0, 0, unfocuseddim); -+ c->dimmer->node.data = c; -+ client_set_dimmer_state(c, 1); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -1734,6 +1745,10 @@ mapnotify(struct wl_listener *listener, void *data) - setmon(c, p->mon, p->tags); - } else { - applyrules(c); -+ d = focustop(selmon); -+ if (d) { -+ client_set_dimmer_state(d, 0); -+ } - } - printstatus(); - -@@ -2160,7 +2175,7 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom = geo; - applybounds(c, bbox); - -- /* Update scene-graph, including borders */ -+ /* Update scene-graph, including borders and dimmer*/ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); - wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -@@ -2170,6 +2185,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_rect_set_size(c->dimmer, c->geom.width - 2*c->bw, c-> geom.height - 2*c->bw); -+ wlr_scene_node_set_position(&c->dimmer->node, c->bw, c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -@@ -2681,6 +2698,27 @@ tile(Monitor *m) - } - } - -+void toggledimming(const Arg *arg) -+{ -+ Client *c; -+ DIMOPT ^= 1; -+ wl_list_for_each(c, &clients, link) -+ { -+ client_set_dimmer_state(c, 1); -+ } -+ c = focustop(selmon); -+ if (c) -+ client_set_dimmer_state(c, 0); -+} -+ -+void -+toggledimmingclient(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ if (sel) -+ sel -> neverdim ^= 1; -+} -+ - void - togglefloating(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/README.md b/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/README.md deleted file mode 100644 index c6588ee..0000000 --- a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -This patch changes the default behavior of the [disable-keybindings-on-fullscreen](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/disable-keybindings-on-fullscreen) patch by only taking effect when you explicitly toggle the functionality. -You must apply that patch prior to applying this one. - -### Download -- [git branch](https://github.com/Shringe/dwl/tree/disable-keybindings-on-fullscreen-toggle) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/disable-keybindings-on-fullscreen-toggle/disable-keybindings-on-fullscreen-toggle-0.7.patch) - -### Authors -- [Shringe](https://codeberg.org/Shringe) -- shringe_ at [dwl Discord](https://discord.gg/jJxZnrGPWN) diff --git a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/disable-keybindings-on-fullscreen-toggle-0.7.patch b/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/disable-keybindings-on-fullscreen-toggle-0.7.patch deleted file mode 100644 index 272d906..0000000 --- a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen-toggle/disable-keybindings-on-fullscreen-toggle-0.7.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 71809cee0e27f1b3620773e1745afed8023f71c9 Mon Sep 17 00:00:00 2001 -From: Shringe -Date: Mon, 23 Jun 2025 18:50:40 -0500 -Subject: [PATCH] Implemented functionality for patch - ---- - config.def.h | 1 + - dwl.c | 14 ++++++++++++-- - 2 files changed, 13 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..dda4ad0 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -142,6 +142,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_G, togglefullscreenkeyinhibit, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index f11de4b..5deb9c7 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -341,6 +341,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglefullscreenkeyinhibit(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -414,6 +415,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static int fullscreen_key_inhibit_enabled = 0; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -1583,8 +1586,9 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) - && sym == k->keysym && k->func) { -- if (c && c->isfullscreen) { -- if (k->func == togglefullscreen) { -+ if (fullscreen_key_inhibit_enabled -+ && c && c->isfullscreen) { -+ if (k->func == togglefullscreenkeyinhibit) { - k->func(&k->arg); - return 1; - } -@@ -2763,6 +2767,12 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglefullscreenkeyinhibit(const Arg *arg) -+{ -+ fullscreen_key_inhibit_enabled = !fullscreen_key_inhibit_enabled; -+} -+ - void - toggletag(const Arg *arg) - { --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/README.md b/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/README.md deleted file mode 100644 index 9c438bb..0000000 --- a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -This patch disables all keybindings except `togglefullscreen` when the focused window is fullscreen. -Might help prevent fat-fingering. - -### Download -- [git branch](https://codeberg.org/korei999/dwl/src/branch/disable-keybindings-on-fullscreen) -- [2025-02-09](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/disable-keybindings-on-fullscreen/disable-keybindings-on-fullscreen.patch) -### Authors -- [korei999](https://codeberg.org/korei999) diff --git a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/disable-keybindings-on-fullscreen.patch b/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/disable-keybindings-on-fullscreen.patch deleted file mode 100644 index 57a18e1..0000000 --- a/dwl-bak/dwl-patches/patches/disable-keybindings-on-fullscreen/disable-keybindings-on-fullscreen.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 2d6b845701091d3238774747c718df7fef135986 Mon Sep 17 00:00:00 2001 -From: korei999 -Date: Sun, 9 Feb 2025 14:59:33 +0200 -Subject: [PATCH] disable keybindings on fullscreen - ---- - dwl.c | 23 ++++++++++++++++++++++- - 1 file changed, 22 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index ec4ca86..8c771e8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -282,6 +282,7 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static Client *firstfocused(void); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -620,11 +621,15 @@ buttonpress(struct wl_listener *listener, void *data) - struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; - uint32_t mods; -- Client *c; -+ Client *c, *focused; - const Button *b; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -+ focused = firstfocused(); -+ if (focused && focused->isfullscreen) -+ goto skip_click; -+ - switch (event->state) { - case WL_POINTER_BUTTON_STATE_PRESSED: - cursor_mode = CurPressed; -@@ -664,6 +669,7 @@ buttonpress(struct wl_listener *listener, void *data) - } - /* If the event wasn't handled by the compositor, notify the client with - * pointer focus that a button press has occurred */ -+skip_click: - wlr_seat_pointer_notify_button(seat, - event->time_msec, event->button, event->state); - } -@@ -1393,6 +1399,13 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+Client * -+firstfocused(void) -+{ -+ Client *c = wl_container_of(fstack.next, c, flink); -+ return c; -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1607,10 +1620,18 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - * processing keys, rather than passing them on to the client for its own - * processing. - */ -+ Client *c = firstfocused(); - const Key *k; - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) - && sym == k->keysym && k->func) { -+ if (c && c->isfullscreen) { -+ if (k->func == togglefullscreen) { -+ k->func(&k->arg); -+ return 1; -+ } -+ return 0; -+ } - k->func(&k->arg); - return 1; - } --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/dragmfact/README.md b/dwl-bak/dwl-patches/patches/dragmfact/README.md deleted file mode 100644 index 3112d44..0000000 --- a/dwl-bak/dwl-patches/patches/dragmfact/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Change mfact by dragging the mouse. - -### Download -- [git branch](https://codeberg.org/Palanix/dwl/src/branch/dragmfact) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dragmfact/dragmfact-v0.7.patch) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dragmfact/dragmfact-v0.6.patch) -- [2024-02-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dragmfact/dragmfact.patch) - -### Authors -- [Palanix](https://codeberg.org/Palanix) diff --git a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.6.patch b/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.6.patch deleted file mode 100644 index 2435cbf..0000000 --- a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.6.patch +++ /dev/null @@ -1,59 +0,0 @@ -From aeee958aec3e0774f3ea8baefe028e1a8cc2d2ce Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 25 Mar 2022 23:45:10 +0100 -Subject: [PATCH] Change mfact using Middle mouse - ---- - config.def.h | 2 +- - dwl.c | 9 ++++++++- - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..c9071a5 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -171,6 +171,6 @@ static const Key keys[] = { - - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { MODKEY, BTN_MIDDLE, moveresize, {.ui = Curmfact} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -diff --git a/dwl.c b/dwl.c -index 145fd01..0a3d140 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -80,7 +80,7 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ --enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -+enum { CurNormal, CurPressed, CurMove, CurResize, Curmfact }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - #ifdef XWAYLAND -@@ -1823,6 +1823,9 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, - .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); - return; -+ } else if (cursor_mode == Curmfact && time) { -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - - /* If there's no client surface under the cursor, set the cursor image to a -@@ -1874,6 +1877,10 @@ moveresize(const Arg *arg) - grabc->geom.y + grabc->geom.height); - wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); - break; -+ case Curmfact: -+ setfloating(grabc, 0); -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - } - --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.7.patch b/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.7.patch deleted file mode 100644 index f0ea5d3..0000000 --- a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact-v0.7.patch +++ /dev/null @@ -1,59 +0,0 @@ -From ae44bfc181fc1532d2f0c4deb20e20634050a661 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 25 Mar 2022 23:45:10 +0100 -Subject: [PATCH] Change mfact using Middle mouse - ---- - config.def.h | 2 +- - dwl.c | 9 ++++++++- - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..c9071a5 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -171,6 +171,6 @@ static const Key keys[] = { - - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { MODKEY, BTN_MIDDLE, moveresize, {.ui = Curmfact} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -diff --git a/dwl.c b/dwl.c -index 5bf995e..dfb0754 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -81,7 +81,7 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ --enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -+enum { CurNormal, CurPressed, CurMove, CurResize, Curmfact }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - #ifdef XWAYLAND -@@ -1872,6 +1872,9 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, - .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); - return; -+ } else if (cursor_mode == Curmfact && time) { -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - - /* If there's no client surface under the cursor, set the cursor image to a -@@ -1923,6 +1926,10 @@ moveresize(const Arg *arg) - grabc->geom.y + grabc->geom.height); - wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); - break; -+ case Curmfact: -+ setfloating(grabc, 0); -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - } - --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact.patch b/dwl-bak/dwl-patches/patches/dragmfact/dragmfact.patch deleted file mode 100644 index e2fdbac..0000000 --- a/dwl-bak/dwl-patches/patches/dragmfact/dragmfact.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 435cdf673e5a8080123109dbf874aac2ccef1498 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Fri, 25 Mar 2022 23:45:10 +0100 -Subject: [PATCH] Change mfact using Middle mouse - ---- - config.def.h | 2 +- - dwl.c | 9 ++++++++- - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..3c26522 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -166,6 +166,6 @@ static const Key keys[] = { - - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, -- { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -+ { MODKEY, BTN_MIDDLE, moveresize, {.ui = Curmfact} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -diff --git a/dwl.c b/dwl.c -index fa76db2..528e102 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -76,7 +76,7 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ --enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -+enum { CurNormal, CurPressed, CurMove, CurResize, Curmfact }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrFS, LyrTop, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - #ifdef XWAYLAND -@@ -1639,6 +1639,9 @@ motionnotify(uint32_t time) - resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, - .width = ROUND(cursor->x) - grabc->geom.x, .height = ROUND(cursor->y) - grabc->geom.y}, 1); - return; -+ } else if (cursor_mode == Curmfact && time) { -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - - /* Find the client under the pointer and send the event along. */ -@@ -1701,6 +1704,10 @@ moveresize(const Arg *arg) - grabc->geom.y + grabc->geom.height); - wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); - break; -+ case Curmfact: -+ setfloating(grabc, 0); -+ selmon->mfact = (float) (cursor->x / selmon->m.width); -+ arrange(selmon); - } - } - --- -2.43.2 - diff --git a/dwl-bak/dwl-patches/patches/dragresize/README.md b/dwl-bak/dwl-patches/patches/dragresize/README.md deleted file mode 100644 index c890ce7..0000000 --- a/dwl-bak/dwl-patches/patches/dragresize/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### Description -implement rio-like window resizing - -select window to resize (mod+middleclick by default) then drag out an area for it to occupy - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/dragresize) -- [2024-07-10](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/dragresize/dragresize.patch) -- [2024-06-19](https://codeberg.org/dwl/dwl-patches/raw/commit/8c75e6dbc1728bf70d42547222464f496d9ea613/patches/dragresize/dragresize.patch) - -### Authors -- [notchoc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/dragresize/dragresize.patch b/dwl-bak/dwl-patches/patches/dragresize/dragresize.patch deleted file mode 100644 index 1e4cfe0..0000000 --- a/dwl-bak/dwl-patches/patches/dragresize/dragresize.patch +++ /dev/null @@ -1,210 +0,0 @@ -From 83ae7d4816a49f46063ab16ffecd32b2e7e61784 Mon Sep 17 00:00:00 2001 -From: choc -Date: Fri, 15 Sep 2023 11:45:16 +0800 -Subject: [PATCH] dragresize: implement rio-like window resizing - -select window to resize then drag out an area for it to occupy ---- - dwl.c | 132 +++++++++++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 98 insertions(+), 34 deletions(-) - -diff --git a/dwl.c b/dwl.c -index dc0437e..843aa7a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -80,7 +80,7 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ --enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -+enum { CurNormal, CurPressed, CurSelect, CurMove, CurResize, CurBind }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - #ifdef XWAYLAND -@@ -603,15 +603,21 @@ buttonpress(struct wl_listener *listener, void *data) - - switch (event->state) { - case WLR_BUTTON_PRESSED: -- cursor_mode = CurPressed; - selmon = xytomon(cursor->x, cursor->y); -- if (locked) -+ if (locked) { -+ cursor_mode = CurPressed; - break; -+ } - -- /* Change focus if the button was _pressed_ over a client */ -- xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -- if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) -- focusclient(c, 1); -+ if (cursor_mode == CurNormal) -+ cursor_mode = CurPressed; -+ -+ if (cursor_mode != CurResize) { -+ /* Change focus if the button was _pressed_ over a client */ -+ xytonode(cursor->x, cursor->y, NULL, &c, NULL, NULL, NULL); -+ if (c && (!client_is_unmanaged(c) || client_wants_focus(c))) -+ focusclient(c, 1); -+ } - - keyboard = wlr_seat_get_keyboard(seat); - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; -@@ -624,17 +630,42 @@ buttonpress(struct wl_listener *listener, void *data) - } - break; - case WLR_BUTTON_RELEASED: -+ if (locked) { -+ cursor_mode = CurNormal; -+ break; -+ } - /* If you released any buttons, we exit interactive move/resize mode. */ -- /* TODO should reset to the pointer focus's current setcursor */ -- if (!locked && cursor_mode != CurNormal && cursor_mode != CurPressed) { -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); -+ switch (cursor_mode) { -+ case CurPressed: - cursor_mode = CurNormal; -- /* Drop the window off on its new monitor */ -- selmon = xytomon(cursor->x, cursor->y); -- setmon(grabc, selmon, 0); -+ case CurNormal: -+ break; -+ case CurSelect: - return; -- } else { -+ case CurResize: -+ /* a label can only be part of a statement - Wpedantic */ -+ { -+ int nw = abs((int) cursor->x - grabcx); -+ int nh = abs((int) cursor->y - grabcy); -+ if (nw > 1 && nh > 1) { -+ setfloating(grabc, 1); -+ resize(grabc, (struct wlr_box){.x = MIN(ROUND(cursor->x), grabcx), -+ .y = MIN(ROUND(cursor->y), grabcy), -+ .width = nw, .height = nh}, 1); -+ } -+ } -+ /* fallthrough */ -+ default: -+ /* TODO should reset to the pointer focus's current setcursor */ -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); -+ /* Drop the window off on its new monitor */ -+ if (grabc && cursor_mode != CurBind) { -+ selmon = xytomon(cursor->x, cursor->y); -+ setmon(grabc, selmon, 0); -+ grabc = NULL; -+ } - cursor_mode = CurNormal; -+ return; - } - break; - } -@@ -1815,15 +1846,33 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - wlr_scene_node_set_position(&drag_icon->node, (int)round(cursor->x), (int)round(cursor->y)); - - /* If we are currently grabbing the mouse, handle and return */ -- if (cursor_mode == CurMove) { -+ switch (cursor_mode) { -+ case CurSelect: -+ return; -+ case CurMove: - /* Move the grabbed client to the new position. */ - resize(grabc, (struct wlr_box){.x = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, - .width = grabc->geom.width, .height = grabc->geom.height}, 1); - return; -- } else if (cursor_mode == CurResize) { -- resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -- return; -+ case CurResize: -+ { -+ int w, h, x, y; -+ if (!grabc) -+ return; -+ w = abs(grabcx - (int)round(cursor->x)); -+ h = abs(grabcy - (int)round(cursor->y)); -+ x = MIN(grabcx, (int)round(cursor->x)) - grabc->geom.x; -+ y = MIN(grabcy, (int)round(cursor->y)) - grabc->geom.y; -+ wlr_scene_rect_set_size(grabc->border[0], w, grabc->bw); -+ wlr_scene_rect_set_size(grabc->border[1], w, grabc->bw); -+ wlr_scene_rect_set_size(grabc->border[2], grabc->bw, h - 2 * grabc->bw); -+ wlr_scene_rect_set_size(grabc->border[3], grabc->bw, h - 2 * grabc->bw); -+ wlr_scene_node_set_position(&grabc->border[0]->node, x, y); -+ wlr_scene_node_set_position(&grabc->border[1]->node, x, y + h - grabc->bw); -+ wlr_scene_node_set_position(&grabc->border[2]->node, x, y + grabc->bw); -+ wlr_scene_node_set_position(&grabc->border[3]->node, x + w - grabc->bw, y + grabc->bw); -+ return; -+ } - } - - /* If there's no client surface under the cursor, set the cursor image to a -@@ -1853,29 +1902,43 @@ motionrelative(struct wl_listener *listener, void *data) - void - moveresize(const Arg *arg) - { -- if (cursor_mode != CurNormal && cursor_mode != CurPressed) -- return; -- xytonode(cursor->x, cursor->y, NULL, &grabc, NULL, NULL, NULL); -- if (!grabc || client_is_unmanaged(grabc) || grabc->isfullscreen) -+ /* Consider global select bool instead of this + CurSelect enum */ -+ bool selected = (cursor_mode == CurSelect); -+ if (!selected) { -+ if (cursor_mode != CurNormal && cursor_mode != CurPressed) -+ return; -+ xytonode(cursor->x, cursor->y, NULL, &grabc, NULL, NULL, NULL); -+ } -+ -+ if (!grabc || client_is_unmanaged(grabc) || grabc->isfullscreen) { -+ grabc = NULL; -+ cursor_mode = CurNormal; - return; -+ } - -- /* Float the window and tell motionnotify to grab it */ -- setfloating(grabc, 1); -+ /* TODO: factor out selected bool */ - switch (cursor_mode = arg->ui) { -+ case CurResize: -+ if (!selected) break; -+ grabcx = ROUND(cursor->x); -+ grabcy = ROUND(cursor->y); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "tcross"); -+ return; - case CurMove: - grabcx = (int)round(cursor->x) - grabc->geom.x; - grabcy = (int)round(cursor->y) - grabc->geom.y; -+ setfloating(grabc, 1); - wlr_cursor_set_xcursor(cursor, cursor_mgr, "fleur"); -- break; -- case CurResize: -- /* Doesn't work for X11 output - the next absolute motion event -- * returns the cursor to where it started */ -- wlr_cursor_warp_closest(cursor, NULL, -- grabc->geom.x + grabc->geom.width, -- grabc->geom.y + grabc->geom.height); -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -- break; -+ return; -+ default: -+ grabc = NULL; -+ cursor_mode = CurNormal; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); -+ return; - } -+ -+ cursor_mode = CurSelect; -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "crosshair"); - } - - void -@@ -2149,6 +2212,7 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_rect_set_size(c->border[1], c->geom.width, c->bw); - wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - 2 * c->bw); - wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - 2 * c->bw); -+ wlr_scene_node_set_position(&c->border[0]->node, 0, 0); - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); - wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); - wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/en-keycodes/README.md b/dwl-bak/dwl-patches/patches/en-keycodes/README.md deleted file mode 100644 index ee3aae4..0000000 --- a/dwl-bak/dwl-patches/patches/en-keycodes/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Always use the English keymap to get keycodes, so key bindings work even when using a non-English keyboard layout. - -### Download -- [git branch](https://codeberg.org/ForzCross/dwl/src/branch/en-keycodes.patch) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/en-keycodes/en-keycodes.patch) - -### Authors -- [ForzCross](https://codeberg.org/ForzCross) -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) -- [dimkr](https://codeberg.org/dimkr) () diff --git a/dwl-bak/dwl-patches/patches/en-keycodes/en-keycodes.patch b/dwl-bak/dwl-patches/patches/en-keycodes/en-keycodes.patch deleted file mode 100644 index 445d900..0000000 --- a/dwl-bak/dwl-patches/patches/en-keycodes/en-keycodes.patch +++ /dev/null @@ -1,73 +0,0 @@ -From cd61fac9cb6e9d0172e2f7a01e6a514d676ba5f0 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Tue, 4 Feb 2025 23:53:11 +0100 -Subject: [PATCH] Always use the English keymap to get keycodes - ---- - dwl.c | 23 +++++++++++++++++++---- - 1 file changed, 19 insertions(+), 4 deletions(-) - -diff --git a/dwl.c b/dwl.c -index def2562..c299365 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -413,6 +413,11 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static const struct xkb_rule_names en_rules = {.layout = "us"}; -+static struct xkb_context *en_context; -+static struct xkb_keymap *en_keymap; -+static struct xkb_state *en_state; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -694,6 +699,9 @@ cleanup(void) - wlr_backend_destroy(backend); - - wl_display_destroy(dpy); -+ xkb_state_unref(en_state); -+ xkb_keymap_unref(en_keymap); -+ xkb_context_unref(en_context); - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -@@ -1582,16 +1590,19 @@ keypress(struct wl_listener *listener, void *data) - /* This event is raised when a key is pressed or released. */ - KeyboardGroup *group = wl_container_of(listener, group, key); - struct wlr_keyboard_key_event *event = data; -+ int nsyms, handled; - - /* Translate libinput keycode -> xkbcommon */ - uint32_t keycode = event->keycode + 8; - /* Get a list of keysyms based on the keymap for this keyboard */ - const xkb_keysym_t *syms; -- int nsyms = xkb_state_key_get_syms( -- group->wlr_group->keyboard.xkb_state, keycode, &syms); -- -- int handled = 0; - uint32_t mods = wlr_keyboard_get_modifiers(&group->wlr_group->keyboard); -+ xkb_state_update_key(en_state, keycode, -+ (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) -+ ? XKB_KEY_DOWN : XKB_KEY_UP); -+ nsyms = xkb_state_key_get_syms(en_state, keycode, &syms); -+ -+ handled = 0; - - wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - -@@ -2607,6 +2618,10 @@ setup(void) - * pointer, touch, and drawing tablet device. We also rig up a listener to - * let us know when new input devices are available on the backend. - */ -+ en_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); -+ en_keymap = xkb_keymap_new_from_names(en_context, &en_rules, -+ XKB_KEYMAP_COMPILE_NO_FLAGS); -+ en_state = xkb_state_new(en_keymap); - LISTEN_STATIC(&backend->events.new_input, inputdevice); - virtual_keyboard_mgr = wlr_virtual_keyboard_manager_v1_create(dpy); - LISTEN_STATIC(&virtual_keyboard_mgr->events.new_virtual_keyboard, virtualkeyboard); --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/envcfg/README.md b/dwl-bak/dwl-patches/patches/envcfg/README.md deleted file mode 100644 index 07e5547..0000000 --- a/dwl-bak/dwl-patches/patches/envcfg/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Input device configuration (click method, tap-and-drag, acceleration, etc), border size and colors via environment variables. - -### Download -- [2024-02-11](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/envcfg/envcfg.patch) - -### Authors -- [Dima Krasner](https://codeberg.org/dimkr) () diff --git a/dwl-bak/dwl-patches/patches/envcfg/envcfg.patch b/dwl-bak/dwl-patches/patches/envcfg/envcfg.patch deleted file mode 100644 index ca9328d..0000000 --- a/dwl-bak/dwl-patches/patches/envcfg/envcfg.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 3c3ea42cd50bfa5111be69b3c1f71afa0443bb53 Mon Sep 17 00:00:00 2001 -From: Dima Krasner -Date: Sat, 30 Dec 2023 10:49:48 +0200 -Subject: [PATCH] allow environment variables to override config.h - ---- - Makefile | 1 + - config.def.h | 10 +-- - dwl.c | 5 ++ - env.c | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 228 insertions(+), 5 deletions(-) - create mode 100644 env.c - -diff --git a/Makefile b/Makefile -index 9308656..c66d376 100644 ---- a/Makefile -+++ b/Makefile -@@ -22,6 +22,7 @@ dwl: dwl.o util.o - dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+dwl.o: env.c - util.o: util.c util.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland -diff --git a/config.def.h b/config.def.h -index a784eb4..e0f10de 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,11 +6,11 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ --static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static unsigned int borderpx = 1; /* border pixel of windows */ -+static float rootcolor[] = COLOR(0x222222ff); -+static float bordercolor[] = COLOR(0x444444ff); -+static float focuscolor[] = COLOR(0x005577ff); -+static float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ - -diff --git a/dwl.c b/dwl.c -index d48bf40..de33dfe 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -429,6 +429,8 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+#include "env.c" -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -1082,6 +1084,8 @@ createpointer(struct wlr_pointer *pointer) - libinput_device_config_accel_set_profile(device, accel_profile); - libinput_device_config_accel_set_speed(device, accel_speed); - } -+ -+ inputconfig(device); - } - - wlr_cursor_attach_input_device(cursor, &pointer->base); -@@ -3141,6 +3145,7 @@ main(int argc, char *argv[]) - /* Wayland requires XDG_RUNTIME_DIR for creating its communications socket */ - if (!getenv("XDG_RUNTIME_DIR")) - die("XDG_RUNTIME_DIR must be set"); -+ loadtheme(); - setup(); - run(startup_cmd); - cleanup(); -diff --git a/env.c b/env.c -new file mode 100644 -index 0000000..618f81e ---- /dev/null -+++ b/env.c -@@ -0,0 +1,217 @@ -+static int -+isenabled(const char *val, int def) -+{ -+ return ((def && (!val || !val[0] || (val[0] != '0'))) || (!def && (val && val[0] && (val[0] != '0')))); -+} -+ -+static void -+setclickmethod(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ long l; -+ char *end = NULL; -+ -+ val = getenv("LIBINPUT_DEFAULT_CLICK_METHOD"); -+ if (!val || !val[0]) -+ return; -+ -+ errno = 0; -+ l = strtol(val, &end, 10); -+ if (errno || (end && *end)) -+ return; -+ -+ libinput_device_config_click_set_method(libinput_device, -+ (enum libinput_config_click_method)l); -+} -+ -+static void -+settap(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_TAP"); -+ if (val) { -+ if (!val[0]) -+ return; -+ -+ libinput_device_config_tap_set_enabled(libinput_device, -+ isenabled(val, 1) ? LIBINPUT_CONFIG_TAP_ENABLED : -+ LIBINPUT_CONFIG_TAP_DISABLED); -+ } else if (tap_to_click && libinput_device_config_tap_get_finger_count(libinput_device)) -+ libinput_device_config_tap_set_enabled(libinput_device, -+ LIBINPUT_CONFIG_TAP_ENABLED); -+} -+ -+static void -+settapanddrag(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_DRAG"); -+ if (val && val[0]) -+ libinput_device_config_tap_set_drag_enabled(libinput_device, -+ isenabled(val, 1) ? LIBINPUT_CONFIG_DRAG_ENABLED : -+ LIBINPUT_CONFIG_DRAG_DISABLED); -+} -+ -+static void -+setnaturalscroll(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_NATURAL_SCROLL"); -+ if (val && val[0]) -+ libinput_device_config_scroll_set_natural_scroll_enabled( -+ libinput_device, isenabled(val, 0)); -+ else if (!val && libinput_device_config_scroll_has_natural_scroll(libinput_device)) -+ libinput_device_config_scroll_set_natural_scroll_enabled( -+ libinput_device, natural_scrolling); -+} -+ -+static void -+setaccelprofile(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ double profile; -+ char *end = NULL; -+ -+ val = getenv("LIBINPUT_DEFAULT_ACCELERATION_PROFILE"); -+ if (!val || !val[0]) -+ return; -+ -+ errno = 0; -+ profile = strtod(val, &end); -+ if (errno || (end && *end)) -+ return; -+ -+ libinput_device_config_accel_set_profile(libinput_device, -+ (enum libinput_config_accel_profile)profile); -+} -+ -+static void -+setaccelspeed(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ double accel = 0; -+ char *end = NULL; -+ -+ val = getenv("LIBINPUT_DEFAULT_ACCELERATION"); -+ if (!val || !val[0]) -+ return; -+ -+ errno = 0; -+ accel = strtod(val, &end); -+ if (errno || (end && *end) || (accel < -1) || (accel > 1)) -+ return; -+ -+ libinput_device_config_accel_set_speed(libinput_device, accel); -+} -+ -+static void -+setscrollmethod(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ long l; -+ char *end = NULL; -+ -+ val = getenv("LIBINPUT_DEFAULT_SCROLL_METHOD"); -+ if (!val || !val[0]) -+ return; -+ -+ errno = 0; -+ l = strtol(val, &end, 10); -+ if (errno || (end && *end)) -+ return; -+ -+ libinput_device_config_scroll_set_method(libinput_device, -+ (enum libinput_config_scroll_method)l); -+} -+ -+static void -+setdwt(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_DISABLE_WHILE_TYPING"); -+ if (val && val[0]) -+ libinput_device_config_dwt_set_enabled(libinput_device, -+ isenabled(val, false) ? LIBINPUT_CONFIG_DWT_ENABLED : -+ LIBINPUT_CONFIG_DWT_DISABLED); -+} -+ -+static void -+setmiddleemul(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_MIDDLE_EMULATION"); -+ if (val && val[0]) -+ libinput_device_config_middle_emulation_set_enabled(libinput_device, -+ isenabled(val, false) ? LIBINPUT_CONFIG_MIDDLE_EMULATION_ENABLED : -+ LIBINPUT_CONFIG_MIDDLE_EMULATION_DISABLED); -+} -+ -+static void -+setlefthanded(struct libinput_device *libinput_device) -+{ -+ const char *val; -+ -+ val = getenv("LIBINPUT_DEFAULT_LEFT_HANDED"); -+ if (val && val[0]) -+ libinput_device_config_left_handed_set(libinput_device, -+ isenabled(val, 0)); -+} -+ -+static void -+inputconfig(struct libinput_device *libinput_device) -+{ -+ setclickmethod(libinput_device); -+ settap(libinput_device); -+ settapanddrag(libinput_device); -+ setnaturalscroll(libinput_device); -+ setaccelprofile(libinput_device); -+ setaccelspeed(libinput_device); -+ setscrollmethod(libinput_device); -+ setdwt(libinput_device); -+ setmiddleemul(libinput_device); -+ setlefthanded(libinput_device); -+} -+ -+static void -+parsecolor(const char *val, float color[4]) -+{ -+ uint8_t r, g, b; -+ if (sscanf(val, "#%02hhx%02hhx%02hhx", &r, &g, &b) == 3) { -+ color[0] = (float)r / 0xFF; -+ color[1] = (float)g / 0xFF; -+ color[2] = (float)b / 0xFF; -+ color[3] = 1.0; -+ } -+} -+ -+static void -+loadtheme(void) -+{ -+ const char *val; -+ unsigned int tmp; -+ -+ val = getenv("DWL_ROOT_COLOR"); -+ if (val) -+ parsecolor(val, rootcolor); -+ -+ val = getenv("DWL_BORDER_COLOR"); -+ if (val) -+ parsecolor(val, bordercolor); -+ -+ val = getenv("DWL_FOCUS_COLOR"); -+ if (val) -+ parsecolor(val, focuscolor); -+ -+ val = getenv("DWL_URGENT_COLOR"); -+ if (val) -+ parsecolor(val, urgentcolor); -+ -+ val = getenv("DWL_BORDER"); -+ if (val && sscanf(val, "%u", &tmp) == 1) -+ borderpx = tmp; -+} --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/fakefullscreenclient/README.md b/dwl-bak/dwl-patches/patches/fakefullscreenclient/README.md deleted file mode 100644 index 6a98f0d..0000000 --- a/dwl-bak/dwl-patches/patches/fakefullscreenclient/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Allow setting fake fullscreen per client - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/fakefullscreenclient) -- [2024-03-29](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/fakefullscreenclient/fakefullscreenclient.patch) -### Authors -- [notchoc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/fakefullscreenclient/fakefullscreenclient.patch b/dwl-bak/dwl-patches/patches/fakefullscreenclient/fakefullscreenclient.patch deleted file mode 100644 index 848f350..0000000 --- a/dwl-bak/dwl-patches/patches/fakefullscreenclient/fakefullscreenclient.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 2ec6d0c668b4daee601337f8da45ccfa3a7d5fc6 Mon Sep 17 00:00:00 2001 -From: choc -Date: Fri, 29 Mar 2024 22:50:00 +0800 -Subject: [PATCH] implement fakefullscreenclient - ---- - config.def.h | 1 + - dwl.c | 23 ++++++++++++++++++++++- - 2 files changed, 23 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..8c220eb 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -137,6 +137,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_E, togglefakefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index 5867b0c..1e78491 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -137,7 +137,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, isfakefullscreen; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -318,6 +318,7 @@ static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); - static void setfullscreen(Client *c, int fullscreen); -+static void setfakefullscreen(Client *c, int fullscreen); - static void setgamma(struct wl_listener *listener, void *data); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); -@@ -332,6 +333,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglefakefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -2181,6 +2183,17 @@ setfullscreen(Client *c, int fullscreen) - printstatus(); - } - -+void -+setfakefullscreen(Client *c, int fullscreen) -+{ -+ c->isfakefullscreen = fullscreen; -+ if (!c->mon) -+ return; -+ if (c->isfullscreen) -+ setfullscreen(c, 0); -+ client_set_fullscreen(c, fullscreen); -+} -+ - void - setgamma(struct wl_listener *listener, void *data) - { -@@ -2620,6 +2633,14 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglefakefullscreen(const Arg *arg) -+{ -+ Client *sel = focustop(selmon); -+ if (sel) -+ setfakefullscreen(sel, !sel->isfakefullscreen); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/fallback/README.md b/dwl-bak/dwl-patches/patches/fallback/README.md deleted file mode 100644 index e9de8f4..0000000 --- a/dwl-bak/dwl-patches/patches/fallback/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Tries a different display mode if the preferred mode doesn't work. - -### Download -- [2024-02-11](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/fallback/fallback.patch) - -### Authors -- [Dima Krasner](https://codeberg.org/dimkr) () diff --git a/dwl-bak/dwl-patches/patches/fallback/fallback.patch b/dwl-bak/dwl-patches/patches/fallback/fallback.patch deleted file mode 100644 index b734625..0000000 --- a/dwl-bak/dwl-patches/patches/fallback/fallback.patch +++ /dev/null @@ -1,44 +0,0 @@ -From a94c52af879027e654f67c36621a8c9b2f338f56 Mon Sep 17 00:00:00 2001 -From: Dima Krasner -Date: Sat, 2 Dec 2023 10:36:35 +0200 -Subject: [PATCH] fall back to a lower output mode if needed - (swaywm/sway@4cdc4ac) - ---- - dwl.c | 13 ++++++++++++- - 1 file changed, 12 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index d48bf40..7719f7e 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -920,6 +920,7 @@ createmon(struct wl_listener *listener, void *data) - /* This event is raised by the backend when a new output (aka a display or - * monitor) becomes available. */ - struct wlr_output *wlr_output = data; -+ struct wlr_output_mode *preferred_mode, *mode; - const MonitorRule *r; - size_t i; - struct wlr_output_state state; -@@ -956,7 +957,17 @@ createmon(struct wl_listener *listener, void *data) - * monitor supports only a specific set of modes. We just pick the - * monitor's preferred mode; a more sophisticated compositor would let - * the user configure it. */ -- wlr_output_state_set_mode(&state, wlr_output_preferred_mode(wlr_output)); -+ preferred_mode = wlr_output_preferred_mode(wlr_output); -+ wlr_output_state_set_mode(&state, preferred_mode); -+ if (!wlr_output_test_state(wlr_output, &state) && !wl_list_empty(&wlr_output->modes)) { -+ wl_list_for_each(mode, &wlr_output->modes, link) { -+ if (mode != preferred_mode) { -+ wlr_output_state_set_mode(&state, mode); -+ if (wlr_output_test_state(wlr_output, &state)) -+ break; -+ } -+ } -+ } - - /* Set up event listeners */ - LISTEN(&wlr_output->events.frame, &m->frame, rendermon); --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/focusdir/README.md b/dwl-bak/dwl-patches/patches/focusdir/README.md deleted file mode 100644 index a2ed478..0000000 --- a/dwl-bak/dwl-patches/patches/focusdir/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Focus the window to the left, right, above or below the current focused window - -### Download -- [git branch](https://codeberg.org/ldev105/dwl/src/branch/focusdir) -- [2023-01-22](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/focusdir/focusdir.patch) - -### Authors -- [ldev105](https://codeberg.org/ldev105) diff --git a/dwl-bak/dwl-patches/patches/focusdir/focusdir.patch b/dwl-bak/dwl-patches/patches/focusdir/focusdir.patch deleted file mode 100644 index 72b8c5a..0000000 --- a/dwl-bak/dwl-patches/patches/focusdir/focusdir.patch +++ /dev/null @@ -1,98 +0,0 @@ -From a0e71a687b7fcaebdaf1da80c09bf5563bff46b1 Mon Sep 17 00:00:00 2001 -From: ldev -Date: Mon, 12 Feb 2024 21:50:24 +0100 -Subject: [PATCH] focusdir - ---- - config.def.h | 4 ++++ - dwl.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 49 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9009517..2a1a82e 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -124,6 +124,10 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_h, focusdir, {.ui = 0} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_l, focusdir, {.ui = 1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_k, focusdir, {.ui = 2} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_j, focusdir, {.ui = 3} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -diff --git a/dwl.c b/dwl.c -index bf02a6d..64d5de7 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,7 @@ - /* - * See LICENSE file for copyright and license details. - */ -+#include - #include - #include - #include -@@ -268,6 +269,7 @@ static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -+static void focusdir(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -1271,6 +1273,49 @@ focusstack(const Arg *arg) - focusclient(c, 1); - } - -+void focusdir(const Arg *arg) -+{ -+ /* Focus the left, right, up, down client relative to the current focused client on selmon */ -+ Client *c, *sel = focustop(selmon); -+ if (!sel || sel->isfullscreen) -+ return; -+ -+ int dist=INT_MAX; -+ Client *newsel = NULL; -+ int newdist=INT_MAX; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, selmon)) -+ continue; /* skip non visible windows */ -+ -+ if (arg->ui == 0 && sel->geom.x <= c->geom.x) { -+ /* Client isn't on our left */ -+ continue; -+ } -+ if (arg->ui == 1 && sel->geom.x >= c->geom.x) { -+ /* Client isn't on our right */ -+ continue; -+ } -+ if (arg->ui == 2 && sel->geom.y <= c->geom.y) { -+ /* Client isn't above us */ -+ continue; -+ } -+ if (arg->ui == 3 && sel->geom.y >= c->geom.y) { -+ /* Client isn't below us */ -+ continue; -+ } -+ -+ dist=abs(sel->geom.x-c->geom.x)+abs(sel->geom.y-c->geom.y); -+ if (dist < newdist){ -+ newdist = dist; -+ newsel=c; -+ } -+ } -+ if (newsel != NULL){ -+ focusclient(newsel, 1); -+ } -+} -+ -+ - /* We probably should change the name of this, it sounds like - * will focus the topmost client of this mon, when actually will - * only return that client */ --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/follow/README.md b/dwl-bak/dwl-patches/patches/follow/README.md deleted file mode 100644 index d2597cd..0000000 --- a/dwl-bak/dwl-patches/patches/follow/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -An extremely simple patch that adds the option to change DWL's window sending behavior; when active, sent windows will be followed, i.e. when a window is sent to another tag, the view changes to that tag.
No dependencies. - -![](follow.webp) - -### Download -- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/follow/follow.patch)
Targets tag v0.7, but also works on git master and v0.6. - -### Author -- [moonsabre](https://codeberg.org/moonsabre) diff --git a/dwl-bak/dwl-patches/patches/follow/follow.patch b/dwl-bak/dwl-patches/patches/follow/follow.patch deleted file mode 100644 index d260a75..0000000 --- a/dwl-bak/dwl-patches/patches/follow/follow.patch +++ /dev/null @@ -1,38 +0,0 @@ -From c4de366aa5e2a465f5e2963f4ffed7adde77929a Mon Sep 17 00:00:00 2001 -From: moonsabre -Date: Thu, 13 Mar 2025 14:36:49 -0700 -Subject: [PATCH] Add parameter for following sent windows. - ---- - config.def.h | 1 + - dwl.c | 2 ++ - 2 files changed, 3 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..cdbdc72 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,6 +6,7 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -+static const int follow = 1; /* 1 means follow windows when sent to another tag */ - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); -diff --git a/dwl.c b/dwl.c -index a2711f6..d2cf8ba 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2677,6 +2677,8 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -+ if (follow == 1) -+ view(arg); - printstatus(); - } - --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/follow/follow.webp b/dwl-bak/dwl-patches/patches/follow/follow.webp deleted file mode 100644 index b629315a913e61616e498c1945ac87a09a265a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621614 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 IxTZjy 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ℜbZw4ch07HS$n%*|!6X-CFf22*xPz{+>9;u@Q-tMl+~ zbqS;)x-@ze2OIzhV{!zUq+(g3V=8=tG!_+jFaR~ zWA(z-c+G5Dtu9CW-iE9M-o%yVc)3eveumgsetn%a2GJ5fHywxtQdpGP?RJHVcZdGh=P^*NWiRO>_{`8@i;vMpt5Rty@U|b zmgrMyVTXC8)OH&Bx-+^4_tlGg>?>Jwu?IgitX2+dj#Kny>oJKlwRP+sggV zed8us-8Z{}PumPEQXI#vl=+ZT!`y<)Z*bRQ5GWty9Z~EOLTGl#NT#B5p#`f4LC|{A@2#8fgg?5u`9jwqVI$a(`@ml7Zk} z|BX?$o3aq7rQJ{`H}4SV2Ugdn%Zx@Xi;i;|9h}^3ui+37{R;usAQsqu&7?JZ!S1KYi}}rIwgtk-RD9G{4vT zR-8l`qN}TYm?ObA2&BHU-T&%{_rdsVi}F)k>H}-d-7|XjRv)_|+#<{JBU`d;1(x9j ziVt=b6TE5ET9xu4_H~82I7#>;P0GY$N@-1^w9Ou#6dy?>`e79E%>s6ofEC7;a~P^z zZx{^x1-+EX*EDcYvi?zQeAa$RcMb=OaPBNM;E=D}~{rUze0IfKmX zCw0^YA5^(;DlH@`u}wB342FpB46)EWA3;wBChBnnzZF3J+WMx^QIdNNE#9POdYc+s zCR%a$k+_6uM`}US3OchEy!kZEcNTwo#`*T)4J%<#XS4mI-$7~RX9PNYmOM+2PQjld zlw8%xgIN3X8X3h&N3C&_lMJ2xIw`9M4YEk5lou$CYAIIsKjr*{s_8AwdXL$3GOF%D zp6R#y#nAgEG2|jKZvnSBiY6+_fwHS!<2CpIdGC%=J|u^&&abAuWe?xHU671+dgTXC z^3}W~D7 zPm=^KJ#g*+H6H&R94`wR#|)dI#m7I=8Jv=eHh%jek0NSOvgo^Zx78Ufdu^b+>yVQL z#nN{jt~Z~MBN-s}QSMhmtIUV%3>_@+-01y_HjE!FuyQ>QpGes;Q$x?n9rzxbZM>i= zAYE)WZGmY)leZ~Pc92<2-c?awxcID4yO>l#h*tZ66hIC9i3eQA6=<@QoP7aO-WBAn1s z8p0LYIF_GHo%fX`W=T`S3#N3Py2S0)%^=pscaw@*!5n1%4rx<*TWI}vPq^6U{0j)L z9rgWl3%2mikwR!fCcB44t2tjR=tNxuA2E4+925B`xvl^vw;-#or+FLiy%%Jhp~)A! zBSC)Q5k_;fhH1S9P0=?|!0TD!82I)Py$bGS=_LTb8*++V8WjGTdmEpt`&MCD3MKL5 z*nzaX%$M&Yu#5B+ZGo=tf|sMwMO)l2;&V(t9QJO3dsYj^`0{>l74~i=Ny*3R6Dvu% zRfwvO5xDCRb-5mU8D7!M?q6VmtzU}b1n%_g3hw7A^}#<{F0faz<26;gqR3-sb03Dx zTS$GoQnE45DQ)bNY+cH*AR@d%b){$zfW^Qw+DVq7W!vIH8!>YbNFC(m{85nZu+Msr zM;em1X%?1w*?W3!%FO6y-M;CX7|~R%0k&U$j22iYaQRnG4pX!SE4*Q-a_8r9 zWZmMh(hW=w%ZN3!|%7IZV;Qu|#RONVyY8GX1s#)JFrPK>Vn4 za=Oxbs8lN+LZVO%w~k&MX012FZ1iKrygyH5WPw4{{%oZKIE4x!I0@)!W_H!IM+4 zQTvSi6I+gz$GNfUCD+U=V2;#`JG1RF5%zKAqBPlIUcedy&s~3JrD0*GIS!(h9txVQ z!jT51uSe{n%kK@!7x}28n*<=0(B$d%!dS-ykpn0{CaQe<2*G=hm5xnbdhbuOPcwD` zQop|dt!*MN42A+gB?c7*NczAagOJSU>O(tPVE@$4Pt{hTfrj`NZ(A$i(T{bz9)lOY zWAg5O(MVtw8W3lv-&6?#&N1_tfiBodtdNpok9SY{RYZeF?ziEBEn#atpTVe^A3O17 z>+enW89>Fhl9*r(1|$ug+xNbAX1=z7VyMwM0Xv%V z8zTRXp2O!%vRhs07`m(I#NYMI9U50Qs7?5GSZ);lFf5A6+;!sqLnFv>I>nk05Yon6 zRDG+$2Zmy>5HxSBix$S|yu?ZN7EaIkSb4|4^&!Fxt6gRpP7t73d?Hu#SZwekbg+R9 zMkT;Cx@n%PkKc<%sv%%%0RWFx$GQRv`T;^hk&>Nh0q#6eVXeIxp0IXxq)M^W^-fWs*mEOZ}Pl zda|ogN1B2$)O!3dWfQX_EB}1|{-xQZ zsP~h3O$KaMN3`XDeuOu&b9r;1q7C&TX{YU1 z<5aE3`i773}u?Bcwqtg$#TWu(O*TF1wa;qM1cS2)@;4hIoW31|@Z^C?!?1s-#b_O^t0} z1Vs&BWt)m-*x2nzFrL}~yGq z=u20;?zqgoMwb@0tcgxTXdR!jTM5q&Ydfk8xUbeAhra`?kh|7kyfsG6TG|GxQ`f=< z^`-?^K-jKhi0RYH+qaa7(4^+%Yxk1Cy z%keSjCe|d@;6Q0f0_vl3(RR@2Ss)*iae6;M(kSrX&gSjaPsc{aaHd_{oAS5$S^_DU)9lxXt1>w&>OJb~{eO zTPeB|gnKS}u`-gE>GP#7RPpvtj#(*FhVJv!ehsJryD#gK-(kYDF#U1q8!t}{Vw6gp zw_aCfOOyv~!s@9a7}bfsy))HfzF~>7laa+EU;R+XP`v=qqd+05LXPjZT5VHFeor?Y z)CF7ewHI4u{`y0~jciB8WI%J~xJ7g-s9rDnQ_WBI+F@$DNyVtGt}nOY zLVdP6fkipyPuE(mj>WCu+%qE@p7b11Sw4O$?Q=beogE@8`nw$YX>EbMcnzBOkQ8fB z3wVKyS?}MegjJlX#`;ULhf&iz0-xy%?XV+McsU^vscMH@iz#{einhg#>LCn-M%+`F z?HU@rud5|`2cElART5y?L%`-xQ@<`7G=cC8)$1bP#5yNfsl{2hA)hAahP7Ckt8Jhe zPGBjhViv2bu##VNz_@@xz|I=m>+$bzA!U3g_7QDAbVcsoo0Wo49-bL^`_j?#jPfnB zjDy}AdMvc5s5+&;+M84tM6K?@KOMis)nfhZXqv>r5>NK0{v#&H&KD&MJy<4iYUfbb z*J?_q7_nTTr-_o`l0Fn0VVl;vMp26XNT-ho5aQO@@SxsjAs|=OpS50qr$jm9p%$qX z@N-=PgAo>bNs6s9jA>2jKEe|zTRvQgEZ%Ez34|~L^!WJli8++c?Z5nngDiK`JD_8+ z%DF1LKNH(ZXKhZ{d}fK`K+A&)&ybsmDp$;IGQ3BFNes-)NUKv~;8 z;A}Aky3gD4lRLq$w!2Nn^MR(Zgvg~0sB-*bLa@!j%`)QJU6X{~GT9*oRsVwW8bRlR zpTTEqW*%@ax&*0#yONA;ob#?K%YF+QlTM`AKqE#`oa%x z@hQC+P-_(aOEo7{OO&GZT+>fSh%4#Z@16;YH$|X*=EP^mHIUNE4`Je}vD@H6$q^|0 z)!z&g;}P!Trs(gz9-yc8RE&+sGG1%fluJTg4)Xw$zBz_BwbQfnk~8B(RMJFk#XM`% zg?(YY@cZd6%Mjh?cgwcVO#x1)btY4p)F&(`xZAJnlpaX71z4LV#kU#3J<_Ifg^z4H7TO!aI3^C%RmkWFAW zQ%#~Et365Uy?b*~YoxqShOlQ?_)C|d!K4;7czE%seha0}&buNuKkbg|8vW$@WWUeTt_`#C;BjG23*WkN^h3c41kPi$2bkOrBA}?LNW84Vk z2bMJ8^YBI%9Tu>O(@s0y`!BZryyb5_0)rN&Ow5>OE(wj+w&`~d8T8DnecBDf&N$ZF zbSoy!;q`WjXa6CHY4AOGQT?n6489G1eqHJn+l9Rnr*lY^&CQ5k57P2H?=74cPxF6H zYm`Pxr1y(A3c-VA$*gr`h6mjysBcJGS3vM^)c!)o;w7KmW!>S`?MuE@&uTw}Z8pii zfgRza!*Qa5AE)+Iu=Tn9!9ZLK`YR<>jf`QG*J zZNPZE0FU?Hay;v<`>QupP(f#LV)#*Vge~3V@rWRYVWm&jCt~bU#qi_aq|(K-fbqCD z;U^l2gy7l_81VtLoljw%<1RJOs5Pi{DiV+68rS~fBMzY68txe+)m($Q5`KOkh_U_Z zqGJ=&T@%7I+UqbF6mSD%MmWvRWvsDinW~YRP;#{vAs9(wO-sjwp0}Q1FuGSlSBb*>Pr7AZZL0p{Ome!z zvqeexA6Fn0>W=sP&|xq$YKMEX+Tw5|842>Kox z8|F*wcQL;>l2Wk?6M}R!9;RSeD_;oczV&H)`hlF=SL4f{3Uqo zy(y7f`}_;Rg&h<#wN;WZY*8n7gJUQMvz-xs%nX947i#dHHuv;ArZ%fTq&`2@V=T1T zYWu3jn7-`NvpIAS$xQ-PM9ju2-h4(ms0^JD@ymmXmWx3!7i#@uD7-vI_%!%w9Q4UB z>RtNX+6@jhC&iNrYf|Cr2c@>|HlkHTJ>7GC=bbUuTaF{jX9-`;?{$ipa$@CO{@<%^ z2|nODGA&&WcSE-hXNNS)Pyir*rCfTBOr0;NXKQ@Fru82+#BVgZOvtsu%%wFfTtMFn zi_MhR?hOmd+2nfQrV&RWt6Her*LoW%`zl83QnoKShhG`9>FRTV#+Q@}d=r1}Ys)i1 z8Y%!fgsD^Sc4C)4yqM`qb7`dqq{OeFWw0KJhmc6o6FIz9n}BX1EwtRuTTs^|Iq{~D zK-^%9!>SwDqqnM{3ae_T2gF9Se46umh01F{dtxuT5W;9&Ya23f^A{dIR(=~8cVpQ< z8E-+J-y25f89K=`UD0!eflWzgkbpMy6F=_EZx1}du%R#jNI4H`DyTO&Y%nj>aze1G zFa|GvT9M$pZs&j?x(SG}!xeG}$SdgUwZxN$pHL_bt73$08}Miotgd-JLdtE>Mksup z&q&mDa0pvr?CVnLT`dR1^PU+mz&f!>if)~O(Hzc$`=4I%R>oxJ zUh=16+C&M%ML99wi59{u)swpue7PSyN*1|m!b64vwx%-^p-a^@$Ok~P$-WI+8Y^xG zjTN^o|MK#xf&6y;gUp?UFq1e~-s+Z%;xqXfnBOOO2Sb!fWIs0GBDg$g&h;zo${isO zvlPBs_tJ{Y2a`ZnJ4r3xd)vC#+2+lWayurSezpo^rj*eYFgNa-{E$XHem!tsFiRBs zHjg$KP{=vbU5`f(RB(h6v7yJS2XbgU&9H>)0};^QV;rV;o_nR^e4LIe+rJ;gjD+7G zSBra&DE+7DX^-+zYis}jYQ-r7`u{<9Iyo2jp6mEwi^|!RW!bZx!PKMaNj`h|mD-N!EFi%*qo+$yzE(V~scPEnu{Oo%Ux!c?R+T48tSn zopr6T{U+BuYpVcxC20!uV&QGF1O3aftLl)*LkW(4922=ydDA^+mr1$WV1LmckD^F5 zeftIW(8CeIU&s7Pg)@l=T2weBnor=FN%w{yNrmbN4s;S9`a`vzFkVT<2<*|$~Az(ORn8MVdFf--Xe&bw?eX5bV zKUKl<;)JvKHID%RN0aaY06hC;HbWYTFrALVB`7pru_HxIw5|)&x5!|{jn;>r$Enlw zbdxw(@Z8SmVCE&d7Y>7`PwuCBan9ViKj-mW@Y$(<*PBBZ8-T}D46FC{;t>Hq5598b zKF=-++Ga)r9Z+FQQaBBTvFZT6Z*s*y%uiB2UhNLTk_~;XgNhJFqow5hqD-(%ctUyg z{f9pjE-!QC;aD0Cs>-z@jiX5(8ogCAh?xU_C+s}_Q=LVk357RBikeKZs~gE?Zb;kA z)|OqigEsMEE!OO3UxOgbIRpv>^Ll7+V3sS0kBbKT77AX4YkaUj6^UM-aqguKZ0CC zt1fduwoy$)kUOF0*&-&00x78M?Yw?s3O^Ou*o`Jr_mK^G5wR_s?wgAc}9 z78Nx&UtR)o7&&t^Xb91(_k5Q?Y+Z$4=KHD8G%0mwxb4_vk0lCU4Zzjz%#tpQ$P-$NjUCIA44R2ELekL!-lwdiK)N%R4Gc@!9&*Y;+>aFtT; z!~;v}VENR~rqa!vqF|sA)d+-UGIH`|B4*|rP-VH@V*@>ROKgi6!NMCsyE$H1N}Ky8 z^ecJWdj|bHb4qLRQlhDzBKHB=KJV;3@LBIg{@$xO_0A@M3;?JD05)KN%=g*czjmt# zyg&bowa0*5>N_Pc56Z>4^EYLWSN&(psBoOf$B2{&V|MrRx8jqO)sx87JstM>2t&j|kJ>ahjO`iraQlhB{bS5ZMe&vc!tvY?v5yHf!kji5=8@;!>_clkZfHUT;g)FEGy(59^_OfSy$Ns+QHPQ`X$NHc^srS@z@N@o& z!P69kl&bQk3h!}ks>Jwr6^;*(nOb`eLJ}*pKR=I)JM-BP1}IDFW2!XDDLAM|b?T}O zBRIEgT_&V+@JC+tq&M|T-!J_mq0!PP*?vz^T7thq<>{B0>n+vMq0WMZyK2eDOIj1e zW44K_b~lV|#?*|xpFMCMTbIedGc|8`{24A}Ta{tml_3RP8 zE}q|R8*KilWyaBU5jNa)B3SMrpcZKXbGfdsK zvPP?Nt5=jl7dKmxc3LPLxKL-jqvtcpf#w*b_O?fg=V_jq8qmI?tr4N^*k#s4%>umL z>GpXP;XXL)*pug{2}d|wtsp8kgdn7ipfgdJx+E{2NMf!#^Sq3o`B6G>)>{gJD}L?k zve!E&dUg6{Tx;|Cv$|uV+!P&(4Dkr%=Z`IG@Hg%s-!__?h#6QUU0~pU6xuE#J&WL+ zZ|8d7os^8f%Aghk=DBvjQ)OHLf-~O`svI_|vN|@L!migI?g&9{cdJ%<(us4O+Hyr{ zjcBiYsS$aQ4DSmN%O7|JPj|)j=98a_?h(DC%O~1@mEb(un{x2id1^)2VRSQ7g>^1! z>z|ZXIH@o2eE3R`P=`3Q3}tc=2$0rbPO-HY;@2OEuIV~73e;N-1|p5hr+f`n*a64l zI)E-#B>M3o{DEk(Sjpd1-JooM4> zJSJn#=5h+;yj}&#S`5nvBN~eGMH$^DA013lx46L)8rb}VC`FjOI?v{Xi_ z!7Vqe36^yS&*x+)s>{bRP8_bEV63Q9M{s9eXe9xX+UVzKc8vYsB1;gnCslUbLr-5l zG)m>slfmMmk><`6?YZ|0GX4DRGrw88A9!)tz3S-Wn)C?_wm&cY6hwWM2G#(51b~^S zOfz-N4L(4gp~>^sTx?F#Cy%ry8i}`5+!rpP4Ht|?cLGJD(6cX&<-efxDPa@ z=1*Gb!ORnXjuQ92b)=J6nML(Kc;%FtF z>P7QG+gdbDd(yg%G&IKqWuw}3me$f?XhIHDuUU4o)WKjXi9wM2f0Sh}d}Ca(lR6@k z2T8;?GEIgljD+=exjRUQP*W&R1k;r)<5A-S2@6v<7Ak0nQ=s}4pC!qsKi*dHCdzP= zS)bGYR*IfZEVT-PD&5Elmgq-&1(GvsC_{phvhJu2^XR{$@+s%my9&;%4Ni525_YnX zhi~xp;#9Yw{dL2JA~I@B@ex*DSe0%K4kavDIa0tPg~l!1iIy_LVOaa_y9~%tU?)B8 zYQi8euxYzyihFLc*_eCmBt4Yn!g|6xPF?$}y0f-M2)r7S)E+79tHmdzBKnxzLCrtq)|_ z>eZ9O=q4TYP^tve8#X%BziDY`ziC z2VpqidglGTBJYgt!Hk4SKPJ|l1IzMFp1Q6F7gL`WMhN98HiQcv%2eF?HauJ0b*N|0 z`0}W|wv4sp>f8#EK*y`5NnB7KC5n{gyiM!n_lP-R%VL?Fc0C5=Nm5e`?iydO!rkaC2FgEO3MMRpO9K}X{Qs$5!AG7oR8G0SZnx& zdp(B@H>dG`jBGvcj6bT3zehGj5Z?EZjW|*iG=*m0=beTw))oO&DJ6BgeYZU_0}d$v z;{IB2dU$#K*b4u~cSm(5koeXL41EE-_}mHjU~RScx0k;OdTH8=?Y`;j_P@G63+&q5 z(%bV)d20Y!`kr@nJBS9n>%6OP+TMzfNET43*U82)& z4Px=UWcnJaoOD=s*feZ0CV%n;iZwX|YI8NIA^L)%MlSOYf#SYBOG>D}1nI9?Wp_awhKg_xr`sPY_ofe2Y2=-U^&_ROXJt>& z3E}p`>RuWj2+0?~W_=zv&o~dMW``3AdFeLD%e>SX9oFK7g_f|4fKh_ypRuVcjPswO zb9iu@L_gaB6}%6~`|=JVvF{3wkB0b&dz(={qKnc&t}og;msC`E-2Iwi?7TzYH2p64 zsWH$QfBO2`HL&x$$SJB_H?Mx_K_@9k)06vvcz1*u4V4&*vYm=Ij^s!eN6lfuA7?Y7eG$yBG(+JP?XlU>p`SOpGw2 z9A@Hi%Iyv>Td759)!}@3?%2v>sug}`N^VJcKyxSDXz3^OWyTY`I6TZtW?elVR?}U@YZ#}HMq-^vMbFM z0E*ZwWJXrQ4T{^72xG)ZG5RHO6A7K9J@wZ$jw%-wU!-cDJ`#FnP8g$lj}~heU%`0^ z2k2pb?oJcFG=`_?@UF(`(GMnYt?G_QjGq@~s{82qvUk_NJRb53)%)=Fp5>@1eQ;j^t8I1}-zEeqnp zOrlDT8qLF?)If@g1eV=!JTBv6w0BMcvCGf;2DvHQC#GF_>4xxM4!3L0)+3#aHN~e^ z5-dF{IrI(}N}DA1@!9mA5$3qVr>GYXj#&&ucKn^6qbpVgNn}`2v$(ys{m=fk(LV*kQ1>bXVGa zSuJRAL;ZqGN|hD{{2 zK(^s^G_ad@^zq0PkcF%smM&y4=_dA_!A@r7CFRiVXH*}F`m*Swj7eEiGh*0RC92PM1g@pz@8hWVb?Bp5;`*4siu`IH5Sz=d3&Lys{AgFu$ zG)I;9=}T=)gk{W=R8~FWpnla9&It$62st;-G3TL=-1`q_z7?XhJyMTRyMJ@t2!swp zTHZXUcdvTVZ%?j>eChnuo`*y@D^HV>S4%48rpr!3%|R%fNm2FK*@nFDxLQDd0`W~S zfs$Z?Ynf)^aToaJYpobkpn>+eq(SY{RBHJY&|X^EpA`D`fTGr*<%H*6Y9g@PZMn-VuVlNa{;CfZ z(!Jqmi{I|cuqfupL@FJCyBleCL4G>n6!N0oBJY*b)s2fp$})6l5mnC2X!GBvG_^W zs&EWpQ2&6RH}LiCdBtF<@C!m!=VDe6!V!7u2S$X!Ezx87cliB|lm*}GP~-e3QsxEW zSE77pwN)|v6Dju(CbvW-i(e27y~Vr|T}Iu3Jwrku_P=R(_keAJ`XoJTY%}<0t^?7V zmR==JBTq1AUlrbD`pd5GN`WY?0?DqvZrgWJ5B%VIBTp!6!B0e(y#RqAparn#b$Pz| z6?m@ujXx4t`)0X8_6T*y@R;uCZQmLW{3N)Wlk#M@O9DH4Ox9|wj2Mw>>}&|J7G;l% zAg}%gZZmgL0PMlV;T8pW>Z`+qfo=by>XsPGk2K zS+|O3PK@|qF&~krcA=|B7tcUwE52#&Si97^wrTEvl!K{dG1RMU9a|)|{bfnw-}2l< zc>doiBFW8e9!L-4s*$8K_WR01k`$SMJbP#OR0RI-zxkQLWz;x)L9-KM48T}ZdzKHeFehPj@ z#Me+PolPC3FQ^DfvDh_MRI%oS@CAZj8Fe-SNoeOli-IgF3P!fo?OtD3M3zc}wDS)k z{#|$B7)JEBqz>v8w@fO@oBC`8sGp0bEcUQnH~E)8E~~9t|3#kvXx^X@#+~>ECvmH> z^WR$eJH!7~82?eB|My8TDe?{gjr3AuerhdFm&^S&1pj_&Qu%ErFf5%z9c`5{h*Q3o zgkOJ4`!AvY%W3KlyOIVAsFGn~wAk2>!(7E<&Ekw7lquzDq=tJhk!bS(YHsjgvA z95=Zn-Q<+gKrYSp?zCpMuS7{JitYODQh;pQU`~5S!|$^mPaiJZ1)GhETyT#u?AU9{ zOB;@^$uB~30sS$T#k%ktwY}1XKoeZIX6STv-pnSJmV~TR7$9b@)pnibs!)PA>(ePpgfTzB*x;h9GDgIQj4@$DNoXZZ zz{K%qoEs*YFkFK*jJFyzMAkmdMLi14CW1CRI|GCUTw8KvncsUd0N4uVA_zqr269~T zawCt;@J<#F5|t-6Pfo28hysop7VZq455U|ex?C~hk_v)c9QI2iqrt60tUhEt)gaL0ksT@Sr{TfY1hbLrSn0ci`KuEy2Rf& z*OGdjw>3w&uJce^|E9FUO?`py!&kzDIwYA*xCd68q)*{CV$d(K1LQ;yk;a*Wr-;K8 zvoQAvOud7SpP~N`VecGW*|WS4pV+o-dt%$RZQGb&;$$+hZQC{`nIsc?;)#v(%Upi$ z{oZ%I{YTEu*}c1~pL(iS?>e=r?yco_F@i&bi9dvw0s+KEg|%u{K|FrFn}-G;3If3M z>(&+6XgRdQCVw~Z(VMqAi~H`uIULEznt+eULoYT6%v`b#x!WjHi9h!j}luahSP9CS>r8a?m1Wc4)A7kzB&0%KW7=v>PZ3kI~3@cNz4d3pwceASdV5T zkvdx(RjDZeD+{t&D^%1X7+huf7=tc6S;KO#{(NPe6K4Fg8|}?l6SneK8T1Tv{D6+D z5QeAi7dg0I@$LAhw{l1;vC>h-Z~pmEg4}!S<*i;GjfT9#kVPg8tGsv*NUd)f(Bv=( zO%vWSjMHrgWLgpdIz>Sy5@(r~+sjxd9`h^9v++_XVmjSR%|v&>Dx)1@lq(4rx@Va8 zEmWnta;KMDJ;Xa{vx&q9VmeQ{k}Jj4?EowFm;l6`WqYc93`OfKH0p({|!SL;}ta*9Bs> z^@U|6TlDDzvn0z~_iBrnXkA#)fmms=93~qQ26wI|&+PAqxzaNKek=EGG8I3~s4(4z zSI52|8|tijB#aqan&Y!2GjJn3?M2MqK@kvQ!(toZ4*WzDd+kdp3QJl3fvXB5B!R8t zt9~6?c2e}{khS2{NATp-J~>1AadUe=cTdb_6{bmBBDxisHRy3V23ZL+gMYe5uYs`C z2bL|41n+bylwpHFQL%4yj^GHIrzFy+Nd;wYb;U+#Ad1_Abd5yK`<~Ev#h0ol>(;EG zi-)%dDWNvwBlvo@zr&;CYM5?>3Y>D>0fzN6I0L2*xDf$Nz@s|^=jRS%z_@>obi=~j zAHD+!6M{ZG74;u(j5S5RR^SQzY+Grom+H&V_aI}}&XlcjRP9^_DmcvNG?q*xH*Fs@P^qn14=Q-cX0b_o->{?J34ONDZiUC>( z>p=Xw+I%FzWNXe+FTQW!VL#f1Al-iIgB)pd;p}4M+*=0cMnso?hI*B|%++cj4!_MT z<$%cpd@BA(peNji0^B%Hhc*~t%o4svY8C5ys z;fdq;9dXCgoPVoM2NTr&i)Ydphm((wHyuf{@Am9G57ZpI0n*=>F=s!qH2YC;>NlxU zYr9FvoXzX0bvsS>P_|4#E-p%PlO9*eDDA9? za9h%G5wNC>H>@HnEhzXZa)K(OElFqvuFj|rTjBA&{@QJ`JErFvsf+{mZ|7-+kK8l2 zZ-36yePB=@nNuheB|;FeV*hcVmgW>y{roBnlo@cI=@AJF}AfXnET!s@WY$#o$7AzHP;X;uh;gi<6vQlkhW+2 zUGgRVx8yIbvA`1`y5Gv<_&Ze@)`8%3?-oIIqn5fskT=hsQC`} z(E2=DIC~oq@^1N7`S$RjIF3|@v~M^MTnKc(r+agJMZ#7r1{MN`-+i~C9=Gn8?tv@4 zWCCe|rNGR0s5h#&ttWx`Ufz$qE4r_qeUjI}-?_KFUGGnR)0kzaSheI2x;)t) zC!SasPzX@h<5eAw&27PRbrVnQH|VR4l22XuBzOHr4Zc9AcclB)8KtsZ@6AaMWnAG(jYiH(@JS@G z?6N1uqZGw>eF;c|n}iwhfuBC0cB8meNWu%$YYK6qwT4^C$rEAWDxy@V+LY+>g(#y< zpJGI1>(*4SG99ueBP5f?{`YW_`q{0hUcFg!EaHM3LN!+8B#B!Ff}>{!$)h35>dA|X z@&BAJmi%8&;}l#?V3)OLby_;@{|v9}=v|s1En=8UF6ewi1aZRSMJY8s`bf*nXn0#R&^}(=(YSVvV`OAR$krZ6!=+Hr}T*xQte~oMNeNZdo|7h`V)3Y^O zgCqE-`|LZ$XGrdrq`8StHP;__S8DxT=eeKadHAZmNqJI@ zr?>kDs{#KO;3o2>`J0;VCu2trcItiWD^)ojqJQ%!fzwu=;5z%v+rVb&KSuq-l63D; zt?RDE|G^oST^ExJ!hq1XJ+XmJ8!P3pg%6o6Q-1vu4{1WT&Ss#{9ok=s_RsNy8+EKM zOebzM>i@>#SPF=L&wxMlt&o->i@7x;1KoxFvAl!;#YG0}hx|WSp%@jKo2B|M%>Tn2 z{yyv^_+!Zj(;9~Uf%Ko#4#-nc#K*KJ=C z7_t;8f^htDF&6L5h;4ZXFzwGL)!R3@#TD(_oW1U=_9=~7?__WZd@JnKh2SOfN<>V6 zHxjf4+RAbw;&p2IG&!5B#!Qds>_-|+LFojr(cA8iH6F%Gf|A$VmE>_RAyz_A5GskS zQOrUA){oTbh`W54Na!@5#6yO0PnXd$_g<&#(XO_xP0g7w2(Jlsph4rc)bX)BdC&s+ zX4h&qCK5?M6t?e;Y;^(tg`CU`pp-j@!BbZxi(|TSz~P`eJHsv$rCEiU_9kT3#UBxL zmsW|e;GcVs+_?^ofg^|~SK9o0-(}tyOkP0jT!3CU1W%4=Dl80=^sTkrgG3icrE_Bd zu>w2{v$&98DKh)zQ!w6Z!kKalkcNl-W_7FlcJPeKxA1;LQ!gK(Ul4~i{sUY>&WGCc9yvyZ0^d(;tfbp<@E4X=Cc=l6AIkZX}aD$OqZbE;C`= zmLm9#`H0$c5%fo*|9Jz!tU0d_@Hzt?fkhQ^+?2k4P|YjWV*2UC*LXw!3JS(a0V?qX zUW^a`F&i4_d;2J5&}O`*=W~RCOWN9uILr*iUT`pWd`!x;5~g%q6Skd^`B6!rhhMR? zpkzE8bdo3|=!J6qhT9|}cENtR=Rs!!>&Da+>87AZgKR7zlSj@a#Y2NSbT3!dmqd8s z^Jj2i`kQ!w;2iJ;!EU0CZ>oFT$KQ}ha83-I5^wG}th#c+JX){+OTK(%mGb8RSUf03 zhjC<6E^LdH$QN`LxeOXmL(y6t0I&J! zk>5Ukg>A_28{O_+xHEW-`-;g7KihqdQ8#YbJ<)GyDNEI3C(#cA4;o<47iaCJ)oR7l zrZ|BL<)7xUce!nj1?67QJlHFUC!OG%qG|M*{2rC>!z&3OtgWZpg^b^+rfQfy>8;Ra zSu2pn95H1u#EoaHiPf7%tkW3cJ57m9g1v#T=>6iyGU3YZtVCcr;rftwnA6J=ms0}- zvflX(vDGOrQUfq6y-slie};0o9a=)d)?MeTPQI3EDc0>}XK|l@rNk`S&EOo^=kRsN zQpqtBwI-N>!MU15IxH!ooxCmkx;?Jdcv8dK`S6up7l(rggdqU~Tmf>2n8w8yd(AXg z&!&UA_K3l533C*?BQgyPQt?`n^xn!fefa7Jdo}0yco0DsIB&5&>pT4zPWey_k*% zyEZUI-WQ`d55t9vbz7$G9!5%ipj`S*Hw!lz=dq>lkckmyYf5zw*94jgc!D;JzRROH zUZY#~7*DWev_Sk)MhO1E=7om5vP(cgajVMJe&@r7(5jgo0ufE~WfbA5@9u#tUp}?JQ zCI@IUR)SUdL`2_Ui^hm`kLIXW#y>=&h zecgm6OJjpNV{xXu*YE>5jwD;vOZ|(P^*j#@Dfj$sAW>a-&yac04X7x7WRDJjxPxx6>DCzZY;qwhOiswH0 zFs@S#@*Lecc2~_G1c+<5H<_cwjtg{@53wQBybHXm#Vq!%jfHGXpdhiNQjMHA#bw@44-^FHQ9&TgePt-;pUH_L zMkIwqM7)D2Gie%~L^s`jd7|dA3AKR%nx%(bNzSdDNCy!kt5@Irk#iQ5O;YQVIVtt~TV0dev zmFtMw&KFbT)shrWqE_NYR&KmK;|iABW`PnGdkxZn+Fb$R{X#ybBr$+w%M9SYLpO8< zWo?r*-pB=Mm51HVP*%vXe<|s4GWaqT2V!O7YRP33wb`WGUDUTF;~_-f=3+K_q`|lP z^(FgP91o1d76JF=ytX(OoRn~4U%^u!W!NhFa#OS-uIunXE`j1kF4_-NCOqh0Wa-_V zD0Y6N+(IxNczq=bx zybADTc3G&9a5h#BWZ!v#<}lrRto^A^L=9`a-?c< z7^%WSd8`V;Aa1hsV_n6f49k-f5z&}vAT9GVNwfX!Lvqr8`GvD1;y+S}@;M?~g z{dBncjRE}Fpr{r-@SAit&}Yok-NRj~&TxE+8^c3)Ya0jy%!S`uy)$c~T+V2H24;$3 z0W;HhNN$HS(#PixdV5)GEhOfe)_Z#}f=m++C&uk8eX@0x5j_1U6}!q&3+hYFZpDY^ z-EJwnm9d*c)BFLWhG&}oqVwd4vRjcsnx*n?&63p??x8c~^Fh@xun-e|)`pu9kMPVt z0IJyZ;4MWr8w^1|lhMY$FA@+>=VZ~pcfZ(W~jBflZ z6bHFK2SPZP#-2A7$ig?m{;cr#uL~=m15up+Hmu!+=WFXAaNvgD1C16I8oNLBP$JS- zix4crQ;1v0_KEjfJ?&(xtWK%kIovu-3i2WWExoK%wk{n4zhT8)SqM3I9ef?cce-z? zpA_vezC-IZV!W*KgiMZBP{z!z3{@5k2_|okKDR9>Lhs;$FV)3EB_7HuZMUiTY}VzIn!brrof*B zF5UddT)~I*54W%~{X7PX82)nJ3pH_~=C3N}z6yTNzrsDIvVDOjxIe+*uZ_y!iRlaS`%EljA=i+LR)z&?&7 zVYS*sMC9A>oM;2k#!^UpkUrZh$IK^jky5$a491B%INfK15MHAApj#a)Zu&dzx%@QU zXRIR2#-Ivfn#PIL`#blY(z7FRLBJ{~Mu=5jfN$;NHw3H?zCAg*3LFt`DXl^O)JY2Z~) zoURIw=Fa?~_H6CU%BPZajZVw&TN=BhgYvtox{0l)EkzXID&z>nGuQ+K_1p|j5626E zj6(ciZn(G=w6l1ATfpD5%wInNBG7XEo%Kg-*Ugr$*yh53YUeNi)ZM@X4u6e`euIpl z!Vnc%A_|CiNzoJ~x7KGL8R;5+!Le=$ieuSRM^toriA~BxX=uJLV!hsie!(fZzgJnW zDAF9|;d%>stowhT4dB8596>>43Io5sj5KPCO+W@mRza8o>$y1GP6)+kn>d0h-ipE&WiV8EHHIp3>!CsqtjH%TMlT zkkjjB6h^7~m454%9A3-WT6d!2@(?Vrkx*YO930>ro;oJXuzCs?e0xT0!kUN-^MI(! zG;mQEetb+Qk-GuMbVZF`O5hw_i|g6rWPpPUNm_Ii|0M~xkE`&~VjwI@al!~8ce%+; zOfZzgZ1gR6=~_Q>v#uf;*DdHb3a?&V5R^hiJsLUq$OWa+P9f3qB^FzAvod<)WF!yx zX4J1pT7~!HayPgpyRT6>qc;97i5QbSnMkLcauP+`=tC)w3QnRJ+d8kRVDT=%A~_~mS|(&I z&ONAwv-V0%>_zRQQ)V6E&3}GYsiRqb{GqXy<^1(6u-#`8%{|EXM^PJPAZJj1Hq}ig z)D)7N5Js?L#UUM*PuQS80F9!by{iNZ#;21oXYS6hJ&k*jH26}X1k?*ddo)Uc*x?1F zC|PU4%AL5;#nfvNXTYW+S#gIQS5v?CK&__kwK9S`TlOEaqbQU8;V4el*K z=D;i?$-E*?al|BAJN0<3T%I4~T@b>*`c$0(>9Tj}>;-D=_^TDkCGA}z{e}Rnue*cX zDhGqeNpE-@1fGa6AUA#Fvl(C2J#x`z8>u z39@sB*I-C^OLZ44#xI$y|x zu<7!H5RvtZ^QbG)wF%y32F&t)5lmD={M_aztJPuqmD(%{moW{m<%w0ct!*B+VW}P<01t$kAjo5g$o^z?TfKjzdI}5nJa7 z^waqAa&PTdGg^#cm`yCalOcFXyHb&{q~R=T^y0GUEo_dko6HU79qOq?sTMKcwjU#wmBe0mk1sn& zWBL?GwcF6u#dl_|GVo=bq!Vg*gn2Waf-QL6j%i_pl;-AdZ$^eD%gV?;k?pjLnm`)N z8V*kxLu$-Mn42BPZo0v57h50!_30IjZ2RDvAYeoxS~v36CLcS;kj(5E40Q+?4Sz$e zPbMs4XA>kFJNe_9x=-f<&*~e}@v;bF&sVjUR54oBN93_OiY5!`^?N(_+$w6B<8m|N zk22}aBPKa$IG1{Q%9)tyV0`FE)e5q5MSBq za@+E-}rriB)*1i?4Z-fkL9RRW*D8#UU~%>c{a8O)1NHT zD;*_~3?a5~RxC^yT-G-f>*$29dm6?h8VB1CVO=Q^R-KvWh}^$%Gg)3=z_9;Z6`VYOTVxNl|wQ|od0L?-Mg3R2U-0* z7UYlv%IjM9GgASVZqySCTg2Ig#Py}YU*elb@~K*MBDO*34ei-9kn#18PyTX|xa$A_ z^=s3KM%baP8dx5A<9AFiPU<7cUvqS1^o(2krA;HF#(JODt{CeCsm*R1WE>(s3qWx3 zt9@*G_)opVsGK9zNYjcS|9L!Cq|g!YkxO;!i`v4t++()e z8>6^!0o))RY*Q}Mz<2#tNaEb(;BVOFP=mtOI(eoRtBs3Q zR=AQ28TPzLaS+x1ADjZkh zD^aI^g$)SaxK93dRh}19bJR%C;!oG2&Xdw^=7ESwv~4w~LfQ>nx;vL+#gVLr)B)_N zGZU`!&jE3@EBg_gAuPM5Cc5V_4^3qzvnQ5;sdbDQgLaFiGSx1$=V6uMx&7o2xo(K1 zaEPXn2a2=gYs4W8NcC#&_*VUZplY* zoCo(ybY&CvKvm36lM{m)7jr-)w0D2XO5vAZsuRYZNptIhN6zALsn}CMh)eC5d6f%# zHFr64Jhz;8P4%vCD!-Vcw>XQ#@k&d~2iEF|mwIMj&}5VtFTF0XGjDC-oye9W>%*)9**cDd}qLwXNC*~>?Ua1J=4Z>*&<#2^Zt>Bv}GlAXO$!r^%tvCN=mT^;6V=s8L6aP#-Zsqo&`<=#Aa~Q&?v` zI8xg!L%!%KA@RdD`@^&|KaJ_Hp+Ph1bF)LQzA<-#z$RRkqf%G%;h+OuN5v)^bmuM} zr>Ec4*VKv1V+Z!Cj&jqQ0kw*s(C)>S_HstdWyfyCq-5u?jxe!l7#I+Jk0db$cqN zi!zK0i^JFY_iYXwV_ZYK%ZN1F6S+j~5u;6{j#Ts?DBC;uPz*HizM2-(&pUU!m$@1>_80V_lc|$V=;^DKqe>JZ2Er7I&c z8p^l!xdI!tei`3NwYBgrF!yD^AxkOxl9l}sSzg@!B$wOpZQ$QQ2E=y zyGcP7T6vLqRiu8>!SO#ZSAv!76Ngj)j3oV zNt!QG240yziOV4k!U-E1(OdPxG#=YFSi^>gfja>|pONN}71@_| zt^)z2R%+9)$Q!LPJgle+PVo)UN`+pB81|E!Q6AyUtue}0E>FNd({7_31v@0D7G+hk ztyf?XvEm6(l3siO#Kl>s*4v{jmq`bWW&N{zGuTYmy<5eg#K!92ZBUdtm?tqxTMD7v zWWB!ctp=Lk+LyYyr8jbx$Q;|nx~a|-J-Kn-4SN+(unEMxazSum{$*+gN-A1 zmrif$FyahlA3P=Fbw^|-5ZrO4mk|34&oX52daYYt>_ovue#JGVUH!thMIa#}VYkW+&5trlAQlkW)SV(b!woNZ$Zmf=;n8(fUC3 zSKytM$#-c?Cekl+JvB4vZ_DV4##f~}?sRKwRWb6w&xb+|8T?(Uv0rw;ZmHs*KR;B) z$8vtLVg?mwm)V*>lA6-P*fX&Q4{#GavMju&TLN)86ngoNMVv9x?Hk#sawZ*&H95gH z!xuVJF@Xn4VrSYO70Oa(Z0n+-d z@UhsAzOOTBd7cw-pwk~22}Q2_qZ&{BaLhCo48!``>Eos29AiTzqXfu|gfr@kYBmWULHSc&OXVESH>E1iiqZ6Qljb4^RNxOAtH?YX?C-E?7WJ zx2Mhn3jZ7&xJf34RBaZu#8y-XTD4-P!mpXg@1U05xO=HlKX@<;x&&`{D!f`Anm|K7 zm$51ZBcnSegkjmWHJ8y*m-eAR#Vz*@l(BTJjEYTjDmDszRBqq;j6h}{0%4v#{3?Vr zoe8`nnseGzvfJWUhd~gJnXBLZh0&76*{i-HqHKy1-@so_pt+4pO$4>-CL399s<;KP zHAnmQR2mW!F9ppV1n63}w06H6Dt^R4~TuUlSoMYTV=Ja0Po`&lCU*dt zO{TUffnY)3>S2ijnhrsnU~T$BAt4BV>I057^D!<1nBWE=NNv*gwoncpWALk&ox=f) zH>Gb>m#uWA@eA23QP5kYNa~zZyn!Eo9{EB}6Dcz`D{e)g*FrO@Vc~Y*!rLVi(WkhQ z0r>m(H3PndP5hp_V?)?}0y#=62-CqBk*B!jnXlPdO(UXG_V#D(4({L6K4WXJ3x9Jd z0?-@(1O)+#22`hO;z$Q%k?RkbsN*ioHV68iR+#z-cMU`FVx_)uT=v#$UG9nz?HaT4 z=JJZzSaW?so9;c76Dp?sEg13II_lOtG7#`eY&oIVu*>+9-$wL2oJRyR>qi0Z7=#}C z-LgVbJE+>CUA2exIT)+4786=!qMwJC!mOpNunfm#RReGyHdOKo9G?dUTVKHP%nLWF z8O=jmo0Q2{E?-8>2J;TNL1!Ze^Vgda7(u>Kb45kp?v1k0TwR8(s#k;f{)9*Ch z#PZ19AqyBf^luX0>rmWm?AqnWCV~;y;3>qO(iJTf*=&dar;2?xPtcfkEKMW&CxQ!$ z)k&olP0e9)tur=>EaCUV;yr{!j(SW|A=pMwY{E{TBPkePfDh9{wL%_MFwZ~a)vATUxLizEOgQ%CeO zNd=@{!VDt}8LArP!EAtZW8N*5qr8M!k=SIPzr5W}EIv>n--Luc%g_(LCA; zL|bn?#LoC%mOu<(HNYe&p56*vk#V-)&Qy$a9r=AKj>l44z6Ifoa~i@B3y$3qKrg1HS+>rG8jkd(Xi3-sNygNBzII*#r|9B57BP``5X`;R zW!~3=PoWFo?J_=IlcR}2YqxU|SrY!d(B+kfUk`}fQ``iVwR@?q+qmxs%dP) zDC-7Mh&%k{U%pT7f|6_4r5TD@A}>8cYZiQb4GQD#Uf+LASyA@RHiF^9DPD!)el-??JOp#JeB zE+HJje(^wBH@eKkg&sJ>yCGlK;O{v+h&WmYeyd@t5gR6@zeN{^Q2znoPy2{227>%6 zy7=wmo4-dFgC?y>B$2-X7x>IH?l`?+(J2dnXhxBeh86Rg1y&2$=(yzB&&tqvhxpXh zZn5ufBT;GzlfBi>D#LKowBF58DGu?K_HxzV+AP&pAbFopEhpA2)sDppoChzG)UaX;{pq73W!9sPMyX`<%gaI-zkar1iN3#WcsCo|ABq?GTgy0JP<6e`tg?kntFe68TdPpP2da&^}c*9 zdtJFgG|?Lk{CooU6o12XWBAQ5xmTA-XRmcD@Fx)G4B{+sNpKeE3d8|szSI_sJ`nBs zOTS(`A3g_O=5}uF{;g`GBvA1I?OO3U_i2-HOA_b^6n*9D!@Al!-Z}-g2d2GcKAXHp zzXv`t-4fjZ_kbVmO7Z66Huo;DA6Wea^=|&w`EL0Dyv}*nffdD{RE9;V{k!Z^7T#rJCvQ!{7CHGt~1g zLq60XT_qY>azUU5VTHd}#w4&)(U3Yt)_%<%m?qSi)GWXeEtUS! z47k1&bVmY;J2B~rkob?F=nsV{za;qv+`Dp+N-qg+q?@{pPV{8bXzqlfA*azO&oSuV zK9_QYLS?z$X@$vpbJXoSoX~wyz!I?$gR{qe za%ej`#!Om2Ok*#DhZWiUne~N2eRo3kf5`#pX&Q$WpPD->EsP>r-a-1rjUWRq(~pR1Gt0q%@$!r-UHC_L8g_M`2?xOZksmvU&ssEw4KSO+KwNM7B`|pSU1D$^h z{+GE*4-cpQ3&nr+Gp8_>)AZ7C8pm6K`8!4a2Xlg|l`1c2w>LkG?q6X3AB>ky^1gm* z443-<#^3`Q2K}J7f&a~FxAMpHTg(cYuWgh=+4u7+(4^(kfk_4|K|2O6S zzE^?k^Kk|J|G-=@a2c$pl4tjCqy4MGqzT7CDuZVqbXud-V{6;v5-HsEb8F4T*oj#7 z^FxY7U@}bzctgnq(KtuH>lpY;`tv(6q^sHpCU=yS+~ZLi!36<=MEj7nyAZg=czH(d zMgC%)AZfEx@2IfoOs-Eor|;d2H-3{5m7JY)B)dxxYU?#`^H%#MYH@vx{+fu9Lpa84 z5#x-!ja+$b?$2F6CDkyB3-ZomkPir=u|Y63R?kb)CFmwiNqp`ko8DI_^N_Ibe^`*$ z=t?IEx6gE^veyKW8}Km;4Gc{0w4C_Tvi<;rj_OKkefo>vnx}GvZ6GO@m31Tv!`1cc{-WKA>rN%e{cb-0b*=^4pCQ4g)nA(2TcBFpr z-KglOnHasD@lO#v$6j%-ywEEN?#MQT9GHOB?V1hB6`)peL$F4|o9Pq(S$>DZI z*}K1NmVcw99<3ALJ=UuYQMFAZZQAV+qICg+pKAYm>2jy@)Qr1^GrB7;-G6X{?}ze5F_XiTryA+uDB<{~QJ>VN7E!+>q4K20dPruL-Xl)lei^_CU`Z@XL& zs<&}qdz+Pw67H zr4~&D_!$w z6v+x))mq2s*@0^#+y}1iJLc>ZEWPZ9Bq)0z@5;Lv~dm zVJkph=}axR*IlpE7_GOo$*-1rFc-!$Qj7>v_Ah7=XjZ1@zF8&DwsXq1BPt4XKeb)D zP8TcMW2yPbPF>yM#^OcfC|*F~Y+Hl`Ci`7C649RrH1*!ZF)8(Pc~&je0hq4MHP=PC z7;bl=bcB{T>a``K#DK{|oIzI+^K!?iUdGOrUjp&I`i$20wglRGX!%#} zl{5@pvXB~os))@ukeqAmx(O9x?7dj_g;QbZnXs>kI5+Nkq`IvFJ{o|6yUqPiJtncn zk>2rQ2L{!me3X&`n0-0f6uZrK^dVMAO5dr{U(|9vc48z+cL{vr4xw^`%c--zQ3U4y z_{h8TJ7ZZpenCb#x$|1HrHJQdjKjgd?M7-wL840HElr&_)lZ=d4@{NhTT8yKc5$wO zQt)$Qu$?1{3Q69Yu}8A&LWNR1z&Me&Wx;N3mTisepnDM$)D!SxS=b1R6oU8mY%^h} ziy8!?jW*WYP@ItLHZQd0ja+V7YJ<-mQj@utVeZVQ?}e_15M&sHnPgG7!f?<0T@KkN z4`HMJo~xSO$>_@|x#DgC&`8IIjPvNv>zZ{?Vx_M7DE7@LN8l4N;czT-Je|4Jraqc* z*|Lw9JPzN|ZnKvV_;OX59?RHfw7+Qf%cBjINo3Kj_~TCmOg*Fk78K^0yVD_T4hdBG z#@Wy@L1oXXAbOzswKR1sLNcOla}?nvCv$i?wa=oSK}c@e6-Zg>d3n)9bKkV4{f8rM zSo)23rV!}r(n?G(j%Si0qarx`B~L8UBpO2~3V9flHW-!U3%xohxhT3;1-Mi=b-fyN zBD}Im844+O!LSmk7>oE{yL07RhtoTXEWrQi{J8|Xz8g+vCj-+pk=%-)%7-5A!hBm? zNalMjB9sXzxjOpr*~rMbdL|;Q@4KOW8O!G_7xV>tHw)PX0>q8XKxRQbWkoa-?UU`T z1k~e-NG&XxlNr57R!G#40!uzsXR$W3GzL`s zH4hb8YOo-i4KGY!Gi9$GqExmg$-Y-@=s6-6(QNFu9#?}5&lGqLDogEElGWR+T4u~+ z9}Oedq_JLQ{;i?tiL@NjbFds$HEQIM1S)ralM+ml`b9cw7_bh}RO~tmM7nfNP8w#@ z?uc;LOo|p`v;ByOlQC>Lmmx>U-)5*bp=hE~=#0himFn{Q*FyWt<`K+M+3Q%+OEabr zoQ#m1ZQxf;tUN7NFKrU}#Mu<|>_R2$=6hMTVS?xy@^N+YD3VU&b!lO?d{~hkr>ldJ z5!<*-lMnDS%qQ#=#pD{}y9HmIN_d~WrA&FU!6tI@Vgu$6ntxW<(-_fvTgK2zRB0^6 zFTUiH5?49sPoAGoVLE!{4Y)-(<+f8wLqSR5O%mczYgL&Vq0Jy(&mV0(R}FX5=0*5^-J~6WzZjnf6~I7X-;vaOV=%W6iHWv!J(II%T!uN`K{0Y zvi51u+&~GwFVOvM0cqaIPfE}}J>dm3Fknlv^KpH_X{?KPKnMfn7%u=8Ozli5u*GnX zqUiSy;2u3!4>?_wOq|_0e|lzAVdTQP!re?Rpjk)i?L5GgG{UESos>;ca>;O#P+AL8 z9JZ9Ceew4csCHIVrOq`*h1&zF!#Xacn#=Pcx4D1*qzHj z(A|qKUe`a&LQTDbFsZH&8B__AJEn{$uDGjZVcK|-c7^Sgee*MNmZ&bIvT~gHp23&( z*Y0s~3P4jj2qF1SL=xU+MHSc#H@%^Hkv9=FX&TbR$lNh7v~xkz1|xFhizKmJ z?Os>V3qAJFaA4!B>~TYHm=*^cB&OuN=JHwWCw{)O2S2h!ofN-Y6;~#x4)R_f`ci+2 zcp|j7Qj7KUKw}Cq%X1))W{vvYC_7S6hf4_1b)qhqKdSi!vDr%fVrIfshRswmV@}9B z(%oh)#PY5J-7N#u?}t_CRK3I&dgX4(gyLta)yE~lgRTZ0dr`L)$*0@0-x^UfP1g(p zQ9+NMw0nE>LOCixP2qi!NYRji{`5wkN0<7FN(oa4|Np3atME9MEN!>M%xp0;qs3@h z%*-rVEZJgai_v0cwwRfjS+ba!x$4*6-P1GkPtSSI#ko0A7r8Pr5+hb-WaL}lGECpC z03jf2wMcMVh?&H@=BGolOo+2TV1-)ffLgRmr^;AF+DXG*r}exoD)S&~A&`w|LK`uk z1CpCFf5YFRpHLsnr>fo3b_#~U6UpDYXlo?P&I?^$mR6q4*e2wUCrruFH#fy$xYz}C z+d&?)S86*5+)oAL?$kcZBL@3Yu`y2Cw$sBhAp79ddYznbCV#~`{brCA>jHqVzzd0P zX>Dc+(Am-Ffq;>MR*qS$FEC3o&@q>P>|Lz$tet+p@F6J1;Px6Vu2ZFXd1-^wG=qk8uR>bG57xMs!Ii2; z07&@#Ckt0N|oR#NOK1UORWCQ?I){x_{7Ec6|Lth4~$+?O7C zL9Yv^8a3guHZo8#5q6?1JUbAfUO$Wa2?{<(A(21kMvYyuD1{p{Y33U1mP6U*n!u6c zeD&cND@702wZ+0}9F^ZnYWEo%EmaYFmMYe8t5>j54+g3`YZ;eOX3h64P&;%D$)E~o zM*~uOP~3*~Kj;{d=YjRQfW9-lF+WaJ$|Bhs5ZO(0k5LPl{6vIE6;lx-0G|?SAg-wF z8$oG296vOvja-ws!*8$?wQk1~(Sv;z9IR~3WS-b?+PwOewf`suPXCSQc4xJqM>#%a zY9N@bJ+Owg+yl=~e25Lr#-&S4QYPKEYSNZKMuUt#0aoAX=}WJz%O5fKZ7%`^_+?c; zZ752sA;alditcf`J;$e2tfKv0Qq{p~_(>!F29Y4Dr%wP#F>|S(*0HLrWx4Kdh)(A5 zwefs3w<}0P7WUY|8YUXoYzO3MFN~=UQx37X$s1i1!f(YAmR2>~o_z>p%hQ&7j^?xZv_k-}4}^zPYy$>_Ro z2Sx2!3<8=jK4o#!m z=2e(gPQ*V{V+~R(Sx9uy6Q-RZlXB%8j%e@V7nXnjGH#b4$HcTARQnU0yNIR)eOofh z=rRVTu1>>s3ZVRrMtWKR6Y$)`#HNH6b}42Ce~jFlea|Dn^D4}zUGjktd>b_fhKWl; zVN<4pTU<qrZRZ-1u){|Qa~d2npHG->1Y=c}{}$6ZWUXljSwnW3$Lg>8rc=9J4&=%pWJ-iiwj3Pf;3w-P6n`otE0j#o+5gtA1rbtf~Zug>xy^b>jdR{?KWO z4Wv!$&tTu!C#dRB0^>2uIE?hQ6rwx!%-ni7xq?;?uzKKdtLVW+uHHcccZzvsWKNJ) zZL)ytSV4?TV)#vMJR-+)6^Z`aYY9{b|0UGRyZ+@9!r9s{u;84EqDZ3o5LvgjknpdO z;G=DR-;}V9W65kM>~4kjxULVys;7#@@ipMOCC;dvfl+POgD!VZu_&1uTP}?j-H%AM z_?|Kn{EF?mH4ZXd!7p=5xk8T8B&HJa>#H~J`D_&g34gfc|C~lzqGug%s*h04w$!|q zoJY0T-I&WS5y6p5uY6~U&(w(G&;&lV)Y=a~OpCbU%G6SDdE>P_>{sa*A z=Tw5W*9xv*ZFvwz&A1a(wXsfcUcKT}Jri%{SUDj{`k)T;PSE_Q%x+;& zKT6eeuOSVXKv?VX9yv2>p4lR%xA%`lpZ+EIY5C&j3wJC@RwXQ((EvhB>ge7e{^Xpw zH958jVf?gU7c`g}=%ku;*{DP@R*=ow@j9UuO@G1X(V{Xz28)F=(3FdUfGS&9#qMVi zsKll#8#>>aet*u`s))T)y9$jKt&(M#Zzs;iYpiLKF8O5iG%q-=#6lNU2d8oiz0($z zxkO^lXiHWNcP+G#X`;J1TzalFcqZoeb+Nv9|Lk zNx2@n0o(n#<|A-*s67zFC%oA}c8UoA`3m=G4P7D&JS-Y0L;geTGb`qK1KV~|?sBbm z|1Cjfa8NFc@rX6XxKkrGdJtg*WrYIk=(46Xstd!f8vY@ABO@A-|F=aA>jhn>6K@DR zy>Td@N$NDR#O%|Y92pu-2JJM(!YaUqQ)O?rL+M;o91_n-Ws4c>73XsR|0O}#>!y6j z;kf}v$bTh%#4Cgf4qj-*bI~&O^z-bTs1ALkHAL&(uR!N zlvC_x!i`wxHbVeF{DDw7K^uPIqugs7WTL%37X)hj(6`}_c}VV9AASIUyBT-do#Y7s zphNl7pEn*h@v&Pd)ZenHdiyD2#NSqS1gaH5?2QkeXQO1tgIpRJ#c=T#n zK_Rn;HrD1qrK7x=uH2mt@YI6MUoD@L@_Z*D2O$i8;ML(G)|1pqfBI})h+eoS_6uge ztK-5^NlhjGI>p0~9wy52un|9|;0sNIf4Ah@h)N(Ovij@9EgOtj|ozIP z@31SfU+)Uxc0g2`F(59Tix|s=(VQ|L)ClIo=L%L8ZR@F&R7JVZ1SC3P;SmOEp82_` z`?oA?H` zDL*M>F1!#s!Tp#aqF5tbwB2Uc^e#_GNkJZEcW1jE-(`=b|EUcH0Oo<~wbsg$%6 zbD9Bfdd26spTC`awoVuL^|c{)XI~r+h6IuwpXQt)UF`UV0UTN~;2y^YqzcY66i{&^ zwzGr22=yGmXW-2oP@E>ZOiiSZ_Zm+{ZPnN|N3PX|S%__35F0_G$PobT@R&oIfBh}&t<+^ZJ@B)iYK0vnVvbHRe>MvH zcT~)Aru)qd%4D~W=t_1bXCt?rbZ<^;p@KH*Q1nv*a@xAE5PbD%b*$XvcB5KSQU7B645U11!nMjf8}KY`s$2|B&SJ>Sxa^wTXR_(IcY zLO79t(;iyCfnYhVGLiv=4K5AQud@o6VU`gfu{NNDwbspc`;dMo9}H<@ojW_kueFj3 z5u)j1lt6O0EC|}1r7?rSx+?w2&sdB=qdtBw|0-5Uf9S_6QAE;l-O|QlN>o-a}nALZ^HA^erKkpUe4CuA>TRAEPhk zDGP*4K}1xud_lFX)I*$~7)5Wt)G)j6J*H4sI>&auljx($jh50XkAp2K>l}#v!ONxm zwm}aCk2;}QQsYxCa92f%B6`y=L*kKJdi%-d$Fg+I2jwk2zO*34N(1ayuSc8bwcMXl z({+pt<-Wt*+y-n(!CfOt@uuYeM^g>^4VhJU9IdsL&GBDAZdu)WVB6sj`k8@D%bE=jGmoG!VHs{AW+q-sm%C^b`rMT0=9Mld zyL=TLMQ+i&G3kEjcuJi0F2S1qRQJSJK``TSSZfaSg$5!}J^8S7wp(@Hh7|+!TBnQ) zn~~0ixq3WWmmT`APw$^`x;gC18p%Y2x0?1)q^J85252C{NT>3IqlZ>Btx(ULGcLrn zH{rpu>v5U~T4F!>h7`{w*!Kr#vFXZH#fL>ZW@nL3BNCD9j?heeseYR;sO@%bAoMPi zjpH5uxstj^!40&rdxf!|C*OQA_1utnevcfZ4h$1hd4wRmV~sJ&1qE+yVSPux(tt-y z>4TvX#X)fFf7JAQ2$l_kHmT_BR%N3(g@TkBRKf}`c|m#{xK9oCOkSfFFQRaI0A6r4 z%h&|(O-P(&qJ#0E)KIh)t*2Rub1=686|^0)d^}SiQ{UCPV|U)G4Rl;1ilhlwo$ZoXuS5IAZ#hjQ$TI}}wIGDO3 zI`n+`Jdl*&{a%B#cAOcSFO~wrWpOF zX8&o25BZhRGYW$Xe$2QRJC=4%u`=ZFGp zrQk$Hj!!OHIEm6orK-$v8a&IOi7H-?e9=m~lshp4H_t-$1mvNo<|xifv&9TT63VnQ+6#bG(PR!y4!ercM^W~bo7wA0vi8A$%S{n})YNYH3&xZxrk!eMboe5C5 z{drB7_WO|7C!Cn0#k_JCralNDj{d2nUN^%w1(Ay7J+=(-vU#!3(&^V* z%%VZpa$Wf6SZ<$iZq#dN4Heo(43E`5YX;c5W%XxQ%`K z7F3t;uv=-Z_#()jn2kkkOWTwd1aT*OFIz8k9R~Srb=hT>y~(QVD+JNyyh;jth8YqX zr&Bw-WvC@y{qX9GiIFASe2QP*0c|Gs_s&noAW<8PwsoyJ63^K~r_=)nIv<0s$XZ2C z3W7NuB#H0bX^`{FJ@u#*y@UYzih9D1(I3Z6j(V%iGJQwBj0=5#-kex@X#>6Kih@^n zzu1H3nr=JXr#MgjgFkx=RzMpJq&?s-A=eOHAuXh({!S+0;cCHWyhIOQE?gNOZ_`89 zykVrD+$?^pOK2YcYN8=$tZQt)bR$;-NbMCE`n`(4IuT&eMi(scoigVe9MMto!%5J|S1d9Uu>vSXwo-Cg6!C<}mut$Tx_#Kbu_c3pILr@>vMxPKQniMTY< zA*J%10s1v`@ukiSxZnJ%-re z?VHm5K6+hpgJ34;_HeHs6M}0-)k5H0$3I(#>X~GER#MbEAd+5bwtC}PcsKr!eV!PGM>IdrDQmVar^s|=ajtq@n5``Y@FU2IT zXVARIfx58LQ}qw9oHACS&>8zip0*^z-3NyAD(NlZ%~4E z4pwq!@kGEkeh5L)7DJOu;FGzSF3b=wEyC76Gd*(Mpv=QkQ`hXQ%hEh=WD49KaQqe< zS#>&`gWv`tS6~_xv-{pcTG>$4H|W9H15{=U zpka5&fyO{vs!btUP3xAR1%Sh|%$76M`vJg~3~F;ey2^j)oQBYT7=NdK=$!ugu>aCI z{Y$(5pCqE)M|_`xt4%BT4S~l-)s(isbo;@wesz{gZ=y@2XBAA794}UjE;k?XTNUok zR!_>pIlXP9FQ42@hI6O^F_z^j`WKv zAXZd}RYXLii;L*?@Eo^Ze(;7eD9rW-pQtVpjGT^recWGXSsb$?Kk&ptgW$L4v)R5e zq5O8A4L6_r7qfyeq!>dni4`M)&v&pMTjV~9ef@#Xg<%Ep6;cHuamBWi5=Zqh*``(E zuX0-Xp(oSgqL||K=nAzDebmyKXLOqIX1U?xc>>;=UA0C|yRNyc@P9=Tu=!v#Rl)y3 zA^wN*Dcq+hzmLd7zb=O+ICo{N6!wA0;{53^ZK<1b*f%QjJkVAh)^EOSP3w0{K$Y2{ zf-Zif{lZ(~Xy0nk*LSlki#O&yW+TbWj^7VN6GHl_<*#DT#OK*fpk!iF-@Z4`x0(n0 z9pWdVoUUXLFNpiu>Y4AJ^+7Lg73KxBWMCL$0xSpSzY$+rJWNS2p9?^~4ZSM7ZeAI* z8SHg-3&nvXKtd-luf&f&tiIA9gIAR+h&St(rdNft&0~-WFd0L{gw@jDe~VQ+r|3yNBNmPEKU z0Oi$gDR9uVk$L(woLBvp@e6zBTE#DBqr>`ejDzN;4)j%lR-T!0G!~C9+=j41tBW<| z1V6HC=@IYH5H!dB$aZ(!fA&0adYs?C{0YQRN$xCW_LkRwQHePJ-4NlquNwL1W|h#O zWRBoLP7&+q{+EhPPolQ=NUEIWhi%)Oi9Qe@Yb{w(n{L~G^os%AL|ectam|ieyv8u$ z)66MD(V8PKWdvl(VvLp<*ILl)pA<%`cKCGR&U?vK&M;hDf}`}h9`(8AXS0+Ww)?%j z#n0{tz*Z2f@cicye4H~zR+^A2-LD9;(xmM;=-_kcVfIk{e)au%_&pB62ETI$)@*DX znw&74%IixUvoj`K{l41ETtnt4RQqqvZqCab(nV>H-4A7ROgnQ+9_OPZ) z9wK5LVIMWO13EV3UL^!QooU{c=8d;bJVNd>*uMNX4(e~L6jINi_o8RZZ#g0ti8ZxA z3UQo6rV>94_5x}q@4qrU{|PvX99CJo;B0-?!Q)wAh58N;9<*W(phg4m$iSQb-bsQm z`cL5QUqo3W9kmq3EW%LsjYBoKk(HmSdX1l6zcG4Kftvka(Bnro*!8J4PMg}X{nvTRZ|_DdP~$as zNA9D`-)^AaMQras|EmzoF+Y zn*Qc<|1FOB7ePp_V~v8n{3p}we`y1MUqh$5up!I4Q-l|uF!Y4-b{ZTauhOjGXk5bgbUP4r(?EcD%)?HAgw|7ZB|3-MZq1OES@ zdH;zoo)H@dTMoS$L@)Y8YjOAwH9C#~jj?RBe|SRkCsjs33(dBd(A53lDDn++)&}5Ww%gq0$5B>81N!an8vpW;s4VckpaHQ`K zZ1~BznolHx zyqezUQUs@;06N+D;{OwN{qViKo53nxIsCUmVgQCqk6b;R663e}p-Gief&n`2U8` z5+L|nH@_96`Y6kG(NY;CCNPgmCGS&=-Nc(cOR@dm3p$TDvHkW}y8*z!R-o8xSazOS z;?L_w-JalR;rhlnc_-fF83`8S21hDA^(->65x|FYS+U4 z!2Q7DkC2Z@?lmQt`WDn7*ZT}Q#9Ii%^4}M)=2NIY>++ZG$R|wCE;Z9{%5HyCICR+{ zVDYiuZb4c-%LAGhWLXMr3C=x%#6ZWMYyLPBX>!w`EoJc1Yjso8``_=3rV{(od(k0| z*gTLts&9BBmji+iM+2P1-*cNiz9R~Vh{>z?QnKP!gC6r4Z#UZR^kCwt^OZDA&#ES}$B|g|9pr zTh$CrMQLtU^gZ5GhXGH68C2%yOC#Rw_M9G^Cy;e<6qDwC4St7wF|JfFfOYO#_OC0O z&vTyl7595@inaJd+^gq)sG*~to=Lc<~f&LCJF_RwC(X)(IUFW)|Fwwyh9qt z6W}d)#irtml3RS2d}s#TReW+HKv`x}7FEuIP?2;86OV|xaGFhh1YY0MhB}B6b16K& zr(<75bO+tEi9Yy#pu8K^=L28MqY9a%<)FlCcQdlDNfLFs4B7TcRXIe}5lt+vC1F81 z%WInP>e!OmDJVNH6(RUc2FgD}o z_Ba3rv2Tvyd%h9Ak-wKB3VpK(vQ}u%qdtSVRGhKH=w#RX4DpjXtR{^m=EM`nb&hgV z6n8>pXNJ=5T1OxoKY7@sZ4GgM`{v@gyZVVF{IPXW@zGNc6 zO@+Oz!_9&X)xvj>k!_uByIV;tR%RI2OW=y8z?>6rhG%?^U_=yDUf*N=ZK;G7>s=vp zIc=KqMAyfT?ETj4Q&c8@iRPV#-;eJHGB}p4P)sx5;q~&4Fxw=iXTLLH3c8!SXYeO~%wOcw(02c%OVfoI2U z*z3FfNgXLa9Z3Gv`{*Yfy$Ju#rQ$29^s3pcvcWXVC`xJtb-&AAzofsy$6A*EMQt!$ z>F4k3QVmi31eN{W;f3=xdNMO;$Fv|+HENxd0admwxMu58t7u2_XIM&iSW4lK`$>_< zGSY}&O@E7*1)@l^SA0%$d+T<>rzJ5#on8#caMH_ohX4x9G6T|{;)z?v(+DOGBzb_W zEw@B_C-EtNca9ZC*7pSNwuy|?ruBx^8rgYI@+CIz6-_mZEXcFFFieF>2M)O|)S9P} z704gYxcEGy!|XywXV;ydlV`OD(&jZNAF^c|lDH7Xt&L8-5hg_%Gl4YeCmkFSNma9F zbdYv*n}uDoIlB2gvXa>0v{bAmdkQX_tA5JaV`-F89p6?%N0ddSeO1vApKKK<)Wy7i zA`tz#Ln}5*&t3v8)A%cn2d&b@xc~UN9W(i@S(S#`?hbEo4-$<*K^W&wnauAiOe~^V zAUCgSSD?2W$!(n5Wh0>r3$ZQ*TrSq0Kv^7N92?gJ3f08Zc?HdYTlYKj+KORVF#&GF z6qy}Bd2Av(hApjxe^dMzZuRVS6FBj;-U&7yDFMFIuuiwUu^`z9Cb>g~+HP(tc!AOM z-EyWSb$T7ZA5dl1nGm+CT$LjdvmD1)ad;|X=s&Pu8QZyX4W%Hw$}MrYIXT^k?uymx zEU>+-$>Khjx~!1GV%~qvP{9PFD|E}kl`Suk^t-)&mR8eBkUQi;LBf=T0k!{Nv)=%Rz4ep(00nC0_Q%Nd$q8KKXdmX>e%*rS>0#g)eo-8f^^T~KP%ZM0BDYGZWx@f6=9(zd3s;*u0?!&NZ)`#KYJ%i%=z z1H}=U+rsyw$j^Slp)RcmspZ(pn7y)g*b}829C2|+@<*RTv_OWjrQeY_puZxA!guy8 zanG~tLywCykZ>whZK{{Eey0rRnW01|RCZ~Qrr3$$3|fvxFb3$U0nNh46CSY6n`k>= zJ*qd59}29(yL(o$h$};Z<-9U`>2ra;1$XKDN4K8P&SjAOXZT;QG+6w7DWM%O8sA6) zpVhKT-^M6lTgAQkk9Mp27Bu?6?Jy~i))0v6i>JCpk{`v4Al4^XH@zR(6g%Ow;yGg~ zt>Q>m!LB#Bf|QgX`)mA4y$`>Vjut3>TN7$!^tvt<7=L>gF%qm1Q2kxuDDVD<&By6Q zVSB;ashP$;Mr9BBRFe4l+ff7N5>Z?u5i%k*U#VPE$(H;6-t$Xp!Kq1^?16`t-n6+5 zA`IB64b&hCA$+z%36zK7YN`CIM=@(XyLH+x(z=q6CqDqhg5)}td#=UyuSxb@A=`Ac zltv!tPg|9j=6)y4u$Ql|N5viV4Tp8j3;55YZEh%EdX2^yU%@JgnATH}t}joqQ7%fT zhSTbP6VM(zr=PHW-Se0N`>CH^Z6~L%UV#LH@sFmAkYlzZ?2qln|Ljb=JZHd=;SzO4 z*bd$!k@ah7W9{8w?MmJrm*ILWr{57Q{u-Rx<6SJ0Hh%RjrM$!z?P3$WKkf9iU8&06 z)li$z3BAUsJmjO>w$4F&?2%hVT|cU(T=4~_S$gyavG2wgB(4Df6shP%W_>b+**JC% zHk;^HUEsImvgdWz*Iv13vKFWt?i;_PcBPj}tx}gyn{s z8Tx{$0LfqJqj$AtZjE|Mvw`y^mjV{KgqOfbjg*;5t($f$%N8@=Ivl&cjsxjJ2BRG^ z%vN(;ADpx$1OittV?Hw$T7%|=gBc>VANsg*3+|&?MJ&2^{+>Q*LMozB)i*j zKw_NP#(SCp)$s3S#Q9>oya`5`$mE*wlg-w7w^E)z4e|-RaQ&*?=XT_fx@WIG$Fj$% z9W7S!UsWY^EYVY}L3ZrVzJwP(1@_8>4YIj($axeR+so8OT`67fsZsSWXEC9^a6}2w zYN(tDM!a(dXBoHU=BEOd)&s=Y_TmOxOrE;UpHjFvcx3hBT~qta6M_27bmirnQbBes zP;$>)o_SGjxG#cV$OoaniGD`Y@Ne#*p38KhQ;%rSO}F0sEG$`k1cw5)7n_$t+ z%t)MU*8i@}$7nWYH&w$`n7)kyZi+W@?41oK!KdD^aY&U$k8-fo+z2M(SI!q7K-3BG zjCnT(*&o^$HI{oo_zi39BETxCQFsu)azRkc$3jDCJ5fLZ4Vk#ySK7bJQ}Jo{#t!NB zt(|cp`(gHlt);#dq04OlrzAQtkl3;R42m(hX_%G4WJUe-qQ3QyN1LCxwcyM>a!%X_YR99eLDFX9L_o`0x3hZ$Hn57U3_LTXbpP7#C@!#F#N~zjLa(jz+NF9Y`UdGg8a*E{dzI zA?qTG*iHiuoZV3p`7q$BCx*7LfA-az53$n)F7p7*{F-z07!23q{?RQ10G{^lWzSC^ zZ$^>0qsMTxnsXbzObVGh=l>KlRXD1a;xH@5ry{X9Mh$D;O@U3q>ekqF>1(DBKlLs{ zO{LXY$t^ge2^IaJcdjBn6Erv%rzU!i1!LjVgU=ZT@lzO~oAYx3erDQjxcZgBL_g@F(NzZxtRUKQN$_BaQE$-1}Oh z^OT;jW$+SPbB{&<;H{Y$yu2v3Rvc65JqxAlVf&ud+udwK8aD;}Jf6Ci-!98yj&CdpB)?JGy2k@&zW!te;XB4b%I>x{)mFPkCsn`Z4UJ`l0K4AGbG z=d~8UuO#fDpI2kqiMd|<(Ezp0`YqWFtD5JJaudffELNc53OAX`IovfsuM*#;o(|PlNhQ@3;kF3KRxprBLZo8Q{vgUdhNl4hnluz?2>rwX z9>Yg(5~~K#DHY!O13s`w$Y5&8YrsV+#kX|jGgAl!w#udHIHeG905n^&561f zpS|h%(5d<^5G1PQt}$pk2bMo&%Vvvf`NKOERQjtk{M_|*>lA8r!%I1vnVY&UC#zT2WsS^fSTu<(vb^2e}C zmgcQ$pF|cn+}1mYvVix3uFwEnBH$B4G~6$E^A4?ShQ@0w$)cIJ0vI5pek|s2xni)O zE3HK*MgLR~H6fq#!7;IiDxTDOZ}sjAU&+?^fea;6EMsXfL(hx{+7No=0k+EIK!gw- zZn@IhS{CdgIrQE6}1^j;BF#!g1fp2=%M&wD@e(icha!#*e6_%}kEM*&Ok$huM zBUtwDkqn3=Pp462lyE=)JM6t~RUac8{^2 zS9GbAKtN{ylD0{U!GVJpLq=Q)yn{Twx=WhuQ_boA?a#aIb{Oc|!kUwQk;Vuz=c4#o zVSFMu48msHN|j`i0OUPSYux%T&he^wR+Q3I|6fiB*Y$5vRg>evo#)#^XsE=T8@_+X zM;bD+t^Hc&sc%UDwdf!n`J#1|Sr}fz!PeCMT%`U) z%rUwNageIBc_nC-)Cu#iA~Ykz$W?!-hyIm(*#Y};isv5|n8z$M zCC|EX=qKCo)77&iyDF7TC_kJV)o!iskHuaPW>m}8UdtcmUkPl$Bod$U(eK0Z`PX{C zTruoY=fpLyaMXLvg)#=?Ye+td5(8GG8b4`VeVE|#i2dd*^54T#rOawa+p9$$)r}%zcL9ZAcMrK#WjN10%b#j#g)PR2eEQuZ z2^x{4d5|`jb(IPg6GZ#I95LZY{(d7Cbb<5A=a=>>%?`?{52jntc%>d~w1W-2Cv9b^ zVGT-GImgbmo*#j)I+!c$esaJ%MVOfx)*!0E@XU|L;Lg^&uiQY+4oS$y6IG|PM*=+& zs`?@qEnc2?+aU6*^>&W+weVj?ii7o?73Pg_6${@^DS6`$2tLn5`tW*1zswqH zZQ*R2Y*$!hVl_f%WXD0A{^m!4w6G;Sw~l00@aBupbv%dWi_Xi%IU>KG64R(J{b~6~ zDy#Ut;!5Vv9geaWoV2ZANK!#JXrL8}3KpYRXNhJhV54#0=Fhu(Rq|;G+_m#_7@b$~ zlloy)QwRwbZi!R|3?K0;CApqDXC%3Vt?SB(&>!DUw#g+& zWTepSWijSzuRlGB8n4l*CEE63Y%uP|s1ULe;;8~44dZC5w&B#mUNf*&EMd+ze(z$) zwBA2fY2+nom)P0*Gd|BI>Eq77mb}wkE8@E)Knr(XJ0*iNMn!=Kf^B`MdIh_2iT}HBaRrZOJXH? zHw8Q7CtG<$-T59&YaMmVy=RtlCGT%<9d=cJe_+445$eh5*pn~RbyuSR;nGdI-j3sS z9Vo2A5VecSnE)s^rl>eOPL(V-5lDK)$*l&}?QUCMr7sn(&1_|lepCj|`pbGX+|JYn zJ{jV1jl_VJXDu@P1Wfrl#n8C?8u@|{W=8lW-DeMiYi}{`KVmVGIC4s)3tT)- zenoV|-ru$uqf0}mbPD;})jG?M*1DvJ<72{4dtU$assEXN8u&Gtu;I)O_lK2;zTzd8 zQ3^jTl4g)uo=P(xg6CF{7h!Nsslo)jg@}poWA5`$|F${&-nQ&ErCD1`VO}~*@S89@d#PGV^1L8hS7G2=*lzrD zZ4gvL7?Nh1HG1In2t}mr>!P#|D_=75>oUv`31#`I`3j}azhqZjXoYP;-P{bUCwR6N zOnrHXVzJ1h+Jwy4;FfpCKm6>LapF-g6epk(^vgAh7L^i-6~kw7cJl(#F}J=M^K%v@;|0 z@EZ9m`VW00Tdpmto*A|E8!6+Ld~{jgwPCWK=LV3pXUS2iS6Z@{bOy}>qXqx=`5+u_3q(VWxeI!#Y&WmN~`gwG+ONd2=z_+Q| zV{O9?FzDr>YeyHnnqQV<5Cd_%vmM^XCzwCNA`yR02ecI+N7Py2N{SSRyKKOqEaS(= zIl`RjZuf-`$c9^%Q*;t5T{kE8dGzG=&@BhkN83GDASRLSY(Id(C@R<;+A3TvfjZ5h za9Y~JMwj1YU9_oX5p)M4g;n4{yDoqAde#KryL9Fp7_UtTcXH}omO#M{lg zjC-3?m>?kHr$I#>&)4Wcg0H^&HsDp#{)tl3J}J z{_iA`Ob-btZ%}@^5L-dxwXe!VTc@6j&jxW)KojG0Y9CO9KVKJ94WFSFZw`XYpHZD& zm>HhBCn(_)G~HOj#U<36nHf((JYu|nY=?X0#ohsNg79$}55&5$t9LVA!0fAk?V_YY zUwDz}{5eKBtuz?_sR0k)qBCm1%WfoBS3wCeO%8nS534By z&Xpe3pgsNJy|Dwh>j7d6#G&0gmfSW6rN*IQFp*nhh6 z@QGtM8=E?}^SP)Wai?Cl%Y*~`Y~@utOvp5dyyP}DdJC)~I#%Oe?X0ZG(4Pem4^qxW z$3B}s1Uf+aWxgOYgw43P=Ss35lDzN4${jIQ$J_)bTVXf)b*IqA%k7QomHvq-rOP9X z6vfxF`B6cSGRu=To6@h{B+2ALa697OF)_r+(cul5$|ig&BdxJ}q-ArX<*nE~rio0W zA!tm^lnKIZNCg2i=?@dRzJgbwC0xBrA~9l`-T^-v9RNoRrGeQJWCDBgE?JXE1H zBq-%BD#chzwHlP*zkhe6mO2EoP>@&g(vl@WhkqUXK4n=##Njf-69wgHG2?85mLcH2 zn9E|2Z+khwwPsmUF6&|gI0hh*yT(mxqd#F zpKRn4yG^?~S|+N5;A!CFL%^OCt!j8xz~X@qhg{8XG&yu15;fZrV9JW!e;4o%kx#lI z8ye$uU>*q8V$31_dB+1;`2hIe_JDDPp{H6;Um1IRk??6w3VZnbqg0etL4+x>YuqP=GW+I0elpC30re%U;}EH4E!Lr*5cV1Mf@(Q!3g)O0ICVdDpPONSH^en~p`IV?V-Vy*@R}ffDPZ6H|AV;! zYhJrz(W&WWgZ-Q)oJRi>1Ja#4^0w1F_FWn8GU;kiA01<7+J4lH*1n8UI z?SGi=qsDE-rHrJ71@@tQhS%oh7EtUXVODmwAtb*q1_rk}JyB})*iU9e=EW@STWwG( zXbn`lg7WKn>tF>oB`55jis=1`@+@O~@5aSNBsz4czpYDF4}KQVBrzYio0gw8HOj61kURH!pZeE?N%dWj1)JEQ_m`;V+8AE5ZF}njeyYMW zMZj&_i7<0Da1+9rat!pM4_RP7!>+IJgjn1Fy4c|-xN3_~lAG&IP@Cb6bhc*=O&NFt zcm+VZ@29{%;36B}c<8`b6Q7jMg?y*OmF5k`wX?lZy6{zL2vR*bMb(|t*;+|@M#ceP zKgoYy=Zt3gM@x4>0RTR(?kWI~3w!%AKbAi>YEmH;BrU0-ap~i`n0aK8GWlSn--|uj_Gik)@ob613{wn5PrkX%?+`)bXhW?Z@jKWWVeMUwmK3SKYRWGogpBx2^;4yjCqx>%GR)no@?V9m@ghs>D}{2=P}~Fi8u`KcKeF+6f*FA#y} zpr3CH%unmCrCXH8WJ^k5{_0rbCh1;=r6x3g&grpa{#FEIq26X8%?m=tTs(+Zir?b? z@*IozbKQvf`HpyYt`ymf!J3<%BBd3N6nbj7eBjVSnxfTDPgnO?$G>zncje{d;Zz(MS9%x=hc!&;e#k*2OnX$^U-ddKo6fS^ z$$8YrP^wx8Bsk;zMo;-RQj)P3nSca1*|0At}(ZS-IRV@S1~e_X;*E7wo@9}da;+!Xq0ZLAuPJ+O%XgOeR3^ieWBuEhSf|3le3Hdh)oY@4y2bZmBP+jfT?+eydXv29x&v%`*U+qR9p zr|)Ops=KCYo|>8;uM9o(zJR^Aq%z zbbL4cqIs6T=_pNR{s13E3JdKn%1mA7_(5QYuN+zm_x6yO9dr)JkPO8GH7p-=}@YRerTxl zb~L%ipX;?B+Csu#Pu=Wh2{tSj3@>5=%i!vxf;FPC6CG!2tB-o45#N5w(-}0@L7dVS zrjzoIgW7sQPP|ymHp6pH$x=$I1A{*c?!v=RWlHX(ot8qU#~~#w$HcXjr~HKPpW5SlT-oHlY{(LKe_q_supT1=^pY^gmV=1KKl zktB!Xi2D}T;siA1D|NS^V0T&0%)9f_ znJyz)>kYzAO$-s+y`7;E!tlWSB{nHnwT8v}99AN-+hkZN-K{W&p9MBbQU|67@$0QS z_QddI8>mcxYswtHU5SZ3x8E0stC*Pfo^6swS%>i{75cSn!zVss2>K2rRAPNcm=qo% zczU!-uT*W>UhrfucikD8q!&Yxmg2TnjT5gDB6%v%fCzd2A11P$%IxAq@BH-8%@dk)HGEjXPbAx(?51xvHiDCh$;Kma zoo7n`SOo~U3w1aAAa>swD5^LmtbhPf%z~D2UmLqn`WANq`2b=qT5>`6%6k=yKYTyY z!MekmGZIU6$l$vO!a5af4hV`4Jf;{-+5s#yhcT~_(DM7SAM~+-w6!2!ABfC_b>@`} z=0%PmGLTMA=!M*ueNVB3P+@H-HU+0#A|@B!%_mew9O64Csl!2ddHQhAF6$_XTpkmb zZ(MW#sIk&BS#aYk`y&Kx{A7?Uo}H@dp|0(R{({K#dWXV`0|nnisC`ewdFAv?M-uux zPNK+T6Z+(Q`CFJKO=o1Vk;LL!4VS}&+eNY!QN^K>2mVFQyW6*B=q&`lxPUsA%t7u- zxOHdR{93*mt-TBaE%%@cK&z`V=)4&*3S4QPC<9s|<4a_pM^ROc)1CG34)sH-J)Q91 z|BT@3v4j2FuZNtdV8AD_@mmXEm*V~|D;tqntX?<)0Z*KPRqonrD@J^{cFbZPC+z~ON;Vr3|r04HX;_KE>XF?e_#qu zQ4r4_Haok|;JM?Q+VE{{niNdSsv6{loc1^AJUVU8=p9)I6G=4<%2q}oV$-&1YL9>}h9GUR1Jj`trSjj}+!qV=7 zgz4wX?!O%k$kh#4mNX0x7o?B`f9pV-YS(fRhm@)FY0URhW!tBjEj&`!JjAYmhpmEo zoZ8|4mdz%dN6@hm+W|YybR4$EGpRg?)RZviX&hU4Jn?6jw65$GWfi6quXM zw7B;hiHoUnVYPxv5D9ntwyTw$QX0+DYhOs`q0TFDkI5ohC7nm)h46I2^d_;8yF^Uo z3o|ZB1o|SshPv|v7wo|x_EeY%xOOK2b(e90Bl7R0T~%W&W6L1`DZMTej7>%^|7QBW^EAv*W%7x#i)icnxm2b(2y zNN~%iO1ErJ9MOVZMQR2}l$(lkOPY*%08fVc)?Rn18qi7^+ZO^>TO~i#w4}C(Vb)q~7RHBvDIiPY8Gc zzmb3B9T~1jp}f68dmb3N>b03OlyqB@X)O}#Q^%b9e(3|fMqWohz2<;Dr`izpClmqB zGs;45hf<%W+_m>M>TTCh^NdpW%&=h+y0`{aeOZ&~Fhediu}SL%Dzci2%gY-8_k zk8_Yli$~STNzxOANkOQkqm$YJU>;;rI%F}uMR9wp!L)E=RcLBde_821u*~P@Uz*3< z+1I${<`a4Ut`+V>i!WQmCGJj5-i$AMT*1}ljgQ=l?X%5KG~eaPCCuCE@UA5^sG*ay{;*|x2N9v1S{L#q z?%^eIHe@cYW%Iw{#>_Z}^eX6_rJbz+fv z2e<=QNy8}(O61lmL%{mCovVsBPXLbts7$~y^mFM>OfOc2TsOWZ4R*v$DqXJ4(|4eN0qCYFeiWc)@?O4*+wS{C)1#rY@^ z<)T}=<>`vfZW#7QQUWl<*yQQ=FO!sWNB}U+B07}0Z?Cgyr4RFQIo!#hpLqs33*xRR z^WTc#l(4=IQ2HJ8@u8Y{`NF*GUOjU+YjUqL5xb=rZFXs$Lyo%^PdGUoM|&>aD|&o= zO6ip9sW$Jlv2y=>{Sb$t=2&qS0o{4qg>N}%GR^+3*)a*F-mnm5bVEc*ZTE>Z{kd!E zbI&!4ejbC(dW(!MzH=@!YPc$B0C9X#;lP>mIzlW4hY9-DD|)om(nEpZN-PgUR~TM8 zo%d|C#}l?q5h+573>2MZy_In9%k(spV=~~uG%9IS4nyg(FfLZ2Hi`K8(90s-y*$Ty zHL|5XRtM_WJ9t;j!u%3AUN)3%oXK(#0=fMe0DYmR-ijh>G9W!C_JSTW@PlgFE zgGoah?{N#!-%{qMj*dr$t1LRE3b)d|ng9EXv~I8y7Xu7j%cgg8EVF*Rj}U>p>_JCK z*WxT$>%?c4kJGYnk|**|>fL}=%AoDzXsRwVy6o`yf-Q-wlv#yO)Fj2dT}Wu*w1BnF z^%AUzK(313`| z$|SC)3)TS7&Citixvy-Ql8R9`nReoyNgur>;^3<8u+YFr_J-z>LT<+zatU-R$yZ}R2J zx;fB|0KL?i@4YF61F8kc0yccQ8&SAkId@KyLAD6f3$@pWxTIM&C|W)TGYfOVO$WRu zTfwa_XOywbsn|6u`JMVO`2Fi0>}Gs;J&%617tT)g(i9EI;62U1d9h38V}E5p`Zhdt zPD^05$x|PFvQ3V)>_>hNzu39P%1rs>Rq)Edv=Sn8HYotRv|BQ0hsQ5vs4sP7gxan8 z{h3rGdlZ#bfYb1guK$zzwfSG@+w}jNzBeo`w*hw9tkGjYpIKtlP-E@T&@GdQk!$SE z?tk!I9A7$XIx@AzmKmXgsdGaF89m#RenlLqhscp9x_5`p57z3ICem&L!CuZYEh3f$m zFJM5?FRjn~;}>?oR?iNo{=?z};vcNj1C?J;$CP7~uY0Be{-8n-{RZ>Nzp0KRQ1UAh zQ2opBtM0||p5$G49t3)Ce1`t;x%B%$2W@_B`T$O!(~)N0-qgIyx*n_omZ0(QLhLZ) za)!-mg;Hf(3GuF+fB)RcWvNd%1zD(c!rRjz^{tkg* z@S7RIyG7Q-=t*X*DK?75yHaQoX#i=@bF`myMW!_%K3>j>fhsH9M^l?}5xZLWm_XOi zKiNl`_A+KEnZl6nYgyOQ^l~0oGbr!p`=VCdUkf-!ZuGAl8rg8zGHymCs9P3B8Eh-j zCrsBpaFq-~H?&05%`c;Ok-F*!HA*qF)c7e|)ji89{-2nfi+VBObfQQ@E0+Cv?Q+)0 z>qM+jRX_bBtlt7=gjZ!PA)EZ*&*d>U!%kS#gUQUMlmafE$cc8v;SP6s_&)YT$X`NAT7@!~`>R7^ z2vRUGVEN$uX*iNrn1Tp|UHT44LJNF_)5OM9}Ym# zg+P+HAB`X^m*pwMxSBQ~sYc=iHtG_(Xs|&;(luoqE}lNs-02JBJ}Cfz{4)++}&<1fkY_Q?9wQ@68Y) zTX&m$X_dO!y=^?KxdM=Z%{p&FUkuMUMK!V z^+32CO_7&m>^o40VKaZEnexC9yVn-V#(EP(t&O%0SSzD)OylFn(urZtV{)5s)QZ#F zCdpA<+p!*nf4bAP^bhog^BCDoz=^%gC!tSPsd81wd6zH}Aj)#cjX^lg$Yp7&a=*QQ zhX%_`=s<3yQ7>2_7#hZqw}hqv(Flk@a;bL;!V0J(f`Gl&cm~Kq84D(BS?2I?P;hxK zz!R}7eI?rl{F0BE0nH!1_Y!i{n6yV^gGhTnr_yE~9LnI|L^gS!WVFecvBGTwmZrC2 z6&CvI^Vyj!D_!YXPtXuqt1@{*j;CMAL>r0&r{%qt3b9wxuooI&k%h%&3%cF;-LzX% zq;xlnDmpIDnFW_1FaFS_nxJ=Tyf>k9Le_ddwN1P1kfn3=Nk(mFF`1X&iNrrZ)3NI> zvW
bRP7A2N!ozY?+t;Bx`fkpd>{lvA`nvGs)^t{^FXgs}XWP9k-o7bPsnNgV27~ z$YVO5cQQTO}^K0ZxY!LmX0!o-DDxS9&iSaa909=+1Ex=CTLLBG?L#;|yer z^1Et%zi%E+(?5jA5Tjr@#BRqdG^-rqYyi9G{Yp&{;VKzM@+qBRi~~cP5vuSXHq=8L zl0as%X6EVkzD%vm)rndl5GCF$dfqX>z?wKJoe1Ko7{nlg6hp%3B}H@krg>;EEw`13 z;GvD`po(%9Xs=TNCblx?R_Sp**R3kHI(+ua30g7r7elg8NcE6017<#((W(<=rl9?IO} zevOrwb@1^CGdsgkP08VyL8u$O#6kLOr>h)@dutaWf%TcvW07YmQS0&GMI^59@VO9h z9=_K|V+ovNXE0v7wTk7yQpE zk0uRMUkC)j)Vnv+FZBvMP{|{v<<>Bia;Vg&K`A6Zw&9kj=Ve!(Ly%ocC0T-6FCB`B zKqyTzerxMN>*Vg`1^RdnE_$!8@I^Zi7Rc%*pHqOq??WBFMC+H$p);ET>Ww2=WLw5M zGODUQ6jB6(H_^ZPx`N__?U+Dtlj1h;S{Ek>J>$DL4TyO#hpF0GTxV$u^y+9Mg;cRR zSJUB5z8XbE`Y@R=L>MJmRxQb@-l&F=OSgmX%4|n8vp08{Dw@Ey0z1zsN?om*kzyg{ zvs9a8LJ4sGbv(ao2REUbxR26B$5hnrTe&9(GQB4SU5-!U?kr$-r^^<*iIug46j_|g z&h^^IO5#8o)dKkV|5*~2i(YU>1Gnb7Mkb(p;ULzeEZGL;0 zP7>~PLW3t|U#3?i9BvL;5YTXiDc-dqPcLVGKFl@p84hq)htm4N8JCTd&MB$WO&-wo zNkP&fm6d-Z=JAv3!H3~fV=2o6U#nOpX3|NRItzDwOQ&ELm4B78HIxBntjE>*4Q1{t zjn<>Ab09DAepdV_ZtZv3;O9S)?sfNl@19kht9_01Zc%uT`PX7DXejV3P{6yWi~I2F zuVV%Z&hXHZOt{aTk({3Z+1Q}NoZ9fVeHqitTJ6v0p=2KdUo#D-x|0?XmuJ6j>B;0ywA7_XOkS~P()upy4XS_2! z*4Xm8VtuHO)^efm@K$#~MB^WnxG$*~^6hh%Whd)5G;(a{N~brN`__l$eck=QZ#5Tn zrFWH_5IhGZ`@dCDK;aX<6Zu9%@azrh7yR{)gVMZj8JZLz6s9 z5V=WY!y-fFz3uy5YRpt$uwQ{jTu~D9+vDsV)4vlFrk48+HcqrLBX36-oMO)LEB7i$OJdVVMWkL(7 zrJ~DA)oFY238<|0UR-q|MyvPas!MHJTqaVns7@6Qjnv%K7`@}bSSrE~@N85H|37!w z@$zrgZv#QO0}6H_LjW=Ss(WJt@?Pr866>q(wc@*ooVTVDgT2OhbsanIQ#S3954*&)Q|I{ zmjpfH3oIE|hU{;boqaxMxuK&XE6m5F?P;mKc8BL%G#KD~vI8am{fKuXx)}Rqv}$LJ zzFU!4K%6p@-JwVc1G4y5?3+z|f{fU~lseU?e3sy(Ve%reo6SV|G<&YFI~ z`$GXz0gh-gQOPR%!bCoTD0yLXr;~aa52jSj6e3iF3tV>JH%~3gc1?TS_8tnE6;%;+ z1Uxbn$+gSG^foh`-IvHQf2b|c;lsn6XVntbG)~g6A1KO-%vyg{DGK+aG{}JiIRFwU z)6elo72oiyB3`n%A7wM9T=C*pL)=Io+msu)cup%d7{hugBy%FZ-sC)}C|eq4!o}iW zJz<7bM07Qi5o)5$GH_zbU-AafNh~9b6gaU#xBZQFMxpSX3YZ{C7LcusTS$7n07=i` z9xm0m5!r9{PH|1Cib2v3yLjvP>qfHWhzec9$fQ^Z_Gr8`oLSFMOZ!=pL=ix)W#T~l zH&tl}BEvu2W-lBIqwhv2H-e8 zpay?_pu#!$r^orsHs}v<9{AHY6G(7JFx?Gi7zN-2PQ3}f`3&EJ3G@8xsB(Ou_*f}T zD-s&~0st-BVDDzm07pGsLNqr?AL;L)64ZL;qn_oSeSr68`RgF?6$2aWHKqfavZb=lRlC z5DY@s;9ajvxWUgJ*8ZFF3e$P*G{K>Dk|4tH#m8Q`O^=AwSs++$W{C-%b z?7Nfgs1yrm5oqhyi}9vLJExIZ$G$LY@Prw{wiIUn_Qmb7si!Ht1E^yBNu>*ReEThF6oBvU2hwpQdKWj!e z*LKohVR02Vxn_>yuQi^Ef|%2*+UbMs`9Nffk|M!*B+#)o;X3S@_J!xH183E8f6;#* z**;+Yo$*%~>kI(A(ZdEO6IK3tGxAnD(M2)iJn00(4^x_3!qm{PY(3I-arSk!0Ly$u z?E~s>mRDa+yWBm(fK2(_?S^`&)e7BI;kiEj9QYlY&mh=a+RpzJT#tW3D6%{@-8J29}|cIZmA;MiR7052*iigOVX|PWciw%b>vu zl2<-9=OXZIe%SJpSX9296zhb-f%r7**Em8ueQ^sb*0M;2YS|t(zMDki-RVmH-AY|X zI(?$1cCty{-?H7S^CCaVRt%9cP$8Gy!ug% zYtk6#9X>z4+YA|7b)K$e}8pdJ- zOdbPy)zF`+L$bexmu8O-RJfnGzmV+~!?17(@u}un7W@jOunZb#0z3F+h+O3JTnEOP z^%hx&HJi3@b07#`D4&c&gFh<~%Zr%)maEyU>ieFojD%y!hubuI1$_yW9JvEcfBfPX zeKaUIJ6>F~+d$L9$1|aSAZgyF2NG9IfK#x-+yNm1sp&nH@YOcw#!!JeY`JTRBU_0| zOy_PD4PU&@l@mi^P2nT4nFBwPO;K@%@qC1K@r*)5Y2P7mR@$0L0)qZ9E=JWN=n6)Y zMH+8S2n}rZ`HUGI(2v3C#8Z&a5jbHFeVY+Gq{U%EF^B&lTD|qfnjd6u#z7VSQBqS4 zTPykM%9X90F84r59YLt(Rk?1KnLr!F^-Kk>e|t7u=;jbPH>_);Ip7d0d*-ONGyhMF zABfRSD+|D86h5L6%2>n96;CvaQT%;>t5X6Rx)IzeG7zkrdREDBv30|^Kj1#Y5vnuB z(<71=_;v>re2dpBne=0@pP2pXS%hM`Fi~}8z2AFEwEN&V?HSic()>`>#z5i% zMwPbfJ|6o(FF#Yzu6SIct=aO?RW$&J{vEJYcj(3j1hNggQYc95qK>#XLTEVDv+l_k4EDSR9Cf;+NnUs@Pd%@~q3S@E6d(wS>d4!ebF zzK0-gCuxV{?cSG2>b;_}++ZhCW1}v*B^J1LV^%JgPC0Q4PsJt|K>+{pH7z^tnO+^< zWOHB(BkX5YVB%H1!QRL7Gk!;h2DZSFDkkdmHc(oH9m)Vh|Kr4O431CDM#Y5W22}@V z9G>fl+{F836&tW(`yqmmy7QPh5vHq`6yq}!PGBDeU0hl8Mge9c_d7Rb+oB^Q}|)B;GN7s zenl&<+__wygkp1`x#=bfFc3*)b$7QHio{}>mnI}4RGuDe7P}pyZBg<}nB-N;7B1ZD z!m&6wpyFSe04Eb|)&wn>nBGn&MDkSKdZpdJ_Ku`(|^$X)~K+tYa4+z+)qyx2ji4%QU_Tj zx1)_F4)xMbCBfcq!oW=-k?d>dtQtB60q#W=rq48~)t6N4oA1V|rDHbf0whuA)`H=| z2x#544hU2RB9?Y1a#gA;9HBnz8xmZJ7JqGSO-H!h3x9P}U%aM(N{^DG5?gK?;Y23x z^QsBW<`{V90N3ga18Iuztq}F-g(oV!b@NliIGGDX*~4QbccZFDJ{Yq(kP@WT2MgH* zz}+(@+f7!ZnS4{@0deK;_L&RYHjg)ty<>&zHJ2~wX7Rt-dIm<4!AzoFU4uKOD)T65 zcAoiy1&qp(sHu^Cur#OEwibM$k6P3$0d^O#A-7jE<$HDUcKK=T5t|#H-_{CZ?dal_ z6bZN?q2G37Qb)Ltm)n+Vy9_F}B59bfd9$l(yK?Tj`SF|Y53_N;x4yQvH8}3pl{`Zd z*)E>{WURo}r3=TQL`~=nhrUoqYjm91&$SuD%NR14HQDXvICa|!?To_{Z~4_EI#%VA zm%_5YN#<)AqBedRBDoHsO~ppVW6#KgcwcT&4Iz=O<*KOo$T3s-B-Q_<;z^0&f>TBFowTcO7MOl#|bK3kd+dX<0swJS;S zMfNFK5^`NkNx_FMb?vqf=6CR&G_|bGdlp&S9D8RKN;eRQYPO$todk-<$Kg4{{g!TcviL6cfyHa( zo_;<78}}0y443a0KGZV67L?*LWC=44ExbUGIh`vM__xh?$Ftk4;E{gPwM;!HG~aJD zT<>Wdy!T+rrp0_S)IN|*GuE=>v9v>Ryb*QObo{rvPEw%Wg@95_z*8PO^~bk|;H;rd z_o z2^=4c*58KOpt`L#)v@d}#_{HckhwxM zn4#fI#w#Ot{cvT$c-cOAL|20OOiNCZl!nN6JbIZrG-EBUYJa6=@j3II5@kgse$C&$ z)2-IHd$9Jxz&w~6mQ6pU>&}S}*G`gl%)~E&`1eANA%KZYRg@|@hx`>+&sDt!V;ty6 zMMd{mXrM>h5J6nS1Wr?1aRI@zxcyfQeB&8xKnW(D-*Z9x;zR@yKDlHUo;knp4@1Lr zN)oCP%V*;ERU-8V4Y3KF@Q^EXDXt)o2fT=3fp1)seRS~9F}+=jC=E}5tRP8^Dl6DTk(20xs$G-U4z6YL@|uM~^Usb=zaA3tt}AyJcN?gfpkaPLtR%k7 z+?C>$&yTpFPL$B9vihKyK~)6Nr9%WYVn~Ir$c2?%J(fl|%5`zJqZf<7d}4J3xNvwf zrbIb?O08HRbrNFb$rst?mK{kMNkvQJj|Z|bZ7(#gQXSI65`Q^>NRQZ%WE)4JY}8TD zg_eO15rI4&eK!K`@;ED>9{zZKf@8;T9Yx%n1Ly(*dl9OIZ9k9+fU=D)xf*9J;6cdo z^^W_P6#?83&$jIN-kyRV$Jo}X1vq#ANAH&UU-a((zw{lA7p9@T${6N(e%)|E18P_Z zYv8Z$XR)wjLnR5@qp`rvW9#~7F@FZp)kfKCmS0vu{fE9s|Kl;2`hU{52jXSGKl)C% z04o3!0uv7K=e1KI8@az3u7ee>1M>K9yH|MvRt?AEWBD#P`(Ht;!fhbSuh!4e*Mm>y zJ?SHoMxhEpksfTI&R6Sw_>cP#_^^k&oApcN zuI1j*$nbDyNq86J^;!Qq4t)76f6Mld@a2}U)|60 zU%sGgBHQBpA%2#&#Ev7244Mo~H9KFdaKnKGmUxC?zTk-xu6`_5!)wwd5o6Mx{BUM7 zC{u8qm(=Oz)DevL@``J_c`_eG8tXkHE@J==PMMR3rIT#&dh`#9%<3^4h!qb8OSOO@ z?UCjUF4RMVn9#5iItgMMb1yhvOm>5>;J9PN28dzqy(b$OoU%XB&)3CpEyx#VEdojd zG|C4B-&f8=`}PEmRNUIPEh#40reT5%=Z$Tw_`80(C8_lbUN2V}lmu;%d?=l?Ox^3S zKmGJdKy{eUYdeQckz1RMf)0rKx@E7lQM!o*<0(UVQn$j^iHfHr>$gOrPLIo`=VCth zlkPXc-Y+F9syn1eI~pfJJ8JuzQ(^IMZ_ZFP@RQlD@llDQ;fkT?YkeQADtTYo{;EM1 zN3Y(l6Lt}-!0Pr9{acX}rS~yhkD4lL9tApUP5YIw^h&DAqde_Uf*TuR=8YaX{7sv< z%vFr$FTQzr!5iKS#=*)nCC*alXqpPMVBzQ<3#xw@9@WNt06cX*D zI7FBsRC%rTJF1o}83iDWz5DJi5HefQUe7t|h4XJSW&?RN_Rw3NxFoAaHWa^!z)RN4 z$knJKAw9&_v9*vMB$&P4I9pe&vgesvU$62F4H+0XsEvAK5?~c4GBt^I0_iEpkKx^} z9KFA&?JB1XvDBBYuO}sicyjYp8YDCahRE}#wRi&OyJ)C~$wIvMr>^drYBO~Y zVsoU02|7=rJNbOWY;j`9!=X+A$Eq?xpx zeBCwMsvo>fDo3}v!m33&a#Fo#%Ia2X3-|1z{7daXknA^75YR8-#+P4siFs8tZ%UQv zFTC~bBG-`t)bM(%DxTsy{VT)o^VU)SBfk0f9|69QS4%RYC_PG7@ypDzF_pyGPK1

Ks0(l=-1`Uc@7E*TnWqGjf;Rm9#X7oBnbkw*eUJx8ztTeaEPgMR0t|igilWdT%KWkG2eU#1iT%c7~uYEdpS{D zNBeT6mFC8)frumiX!U_bSE&hd=KExV;l;EH?8?>6i@UYRoh&NYi@|Gy)p%tDZ+v>XG1lTn%^F3K^oX8bLVbAovHo1Bfm zN;_H-rLDY7zJA*sOR>Y;zG*nGle26sb_9f4a)n1ASq5OP9H$yd7vB0S!K{ROB)`dG zEY(lPsH-qF9-vUTCN-Hx01DzZNN9eEPAfXAydIa+MJw1r?nw)kJl6MGACWmlqk5SC z#GEvbDnC*(W~xY53MH8$?cYUnSRizxq#A67NQRB+PmVfVz%l_9QWi10!7a zbpJH}ItdjU2wI0{(|bcOl38cp*I}KdJ{yunIpn4Ff=X=6^7L|30s|7|>l)OD>YBN8 zPZ609A0fTdX_XI}p06bp2Rft3@f(s$HLZ@rKC^aGUBsWzjy@~ENi_X1bRx)qU)=NU z9s3^Aaoh3zarbs`O{nHQo;o2h6^(2`|KP7F?+=_tM+r_o09}@GB>!wTzl5>HE~~Q; ze)gz0+zTGqTvnjo947)Xi z#<(uMT#ICRhxwn41xV!e?w@qjf+?N^*%fw+!Lvw$P?y2IV)`a|Oc<#O*W7jq7mb$F zr*oc~AJk1DF)j$9xV`IDtyy&VS5CN*oxnXu?v5)KnTa+07^yZ2suaH{XusYfDiU|A zI{!0y`t|S{3b}f;jc$cgAoATiy&sV{UJ3axd(b9x6)d^-yX@^o@ZHlg(eNp@K+`s} zBaS$)jibOJeG2}(LepLptNOq+bVvv*wNm^h>gy)TFVCP7>1Q-A<=dk~acPxevHaIJ zROZdprdBW@{bjoW@LcMR{nb!K3Llt+Wm>EoQm>S_r$#4u$)IMYpZ-iTT4K;ATbQc& zcZ?T1xqaK&U>t4s{kmcZ$@W-s$Y^-iCbC}Eb?FBb(nk&O$_(oi2!WJkK={7O-3n7 zFib@TJW3Ju_)cN411jo#-BYiDneiHfG~l`GEq(B7WT71MsM}7LQ3Fmtd8^72V@ofK z9qsGBaREEHs`NQLYL{6pQfa%F$Z0t-rx0 zY-R~>FmP{EpPh!bC({8$w@uOh8k|W3Yk}2bp!^6iA@6j?KesB>O=9(}8;E)ZyhE1#!cBJkq=!5}#I=O3pg1D|vM>IZSOx+scX8!k?SM6Q+|??NG$!kmp#h$vPt5k4K_y zp|KN8mWp~0=`xbShBbBGS=N}10ytN`y^k6KL~WU?9|bt%2Q4-xm4h0lKTzDa*wd-1 zdt@FiV#7M}n*`bAXeTVEf5a<}7FM5ehx$fyS06+WM!Zl#hBB(Ul@VkS2=uWyXq z7y+dbW2wVV=!~oc8&wVD@bHYo>$!(>L9bH)m-P0cL2dflhjH0ZI*=qwRx9|pb`r#P zwHhQ=yx#^t|M@gJLB@XX>jA}IBheQF?L8;Jn8=^`dtPvz%oQ@44PKZ(>y8dHO0jpL zN1`mG7u}YG*uLUs6?Kg(=)fF8%N!ot$+Ea#;�IIwh4CH_vU=orKOyo}rDaBOn`r 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


L*jgOTXhK|F`5OnP9ZP~IGBDf! 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
-Preview: -
-with:
-
-```c
-static const unsigned int borderpx         = 10;  /* border pixel of windows */
-```
-
-Before applying the patch
-
-
-After applying the patch
-
-
-
- -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/minimalborders) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/minimalborders/minimalborders.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/7a5c3420822074c544fa102e030b7c30aa6b6be8/minimalborders/minimalborders.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/be3735bc6a5c64ff76c200a8679453bd179be456/minimalborders/minimalborders.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/minimalborders/minimalborders.patch b/dwl-bak/dwl-patches/patches/minimalborders/minimalborders.patch deleted file mode 100644 index cb19900..0000000 --- a/dwl-bak/dwl-patches/patches/minimalborders/minimalborders.patch +++ /dev/null @@ -1,161 +0,0 @@ -From ce0eb92fb100801f343fbe9b76639847a9e39160 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 11:22:57 -0500 -Subject: [PATCH] implement minimalborders - ---- - config.def.h | 1 + - dwl.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 72 insertions(+), 6 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..0322dbf 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,7 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const int draw_minimal_borders = 1; /* merge adjacent borders */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -diff --git a/dwl.c b/dwl.c -index dc0437e..198061b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -106,6 +106,7 @@ typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ - unsigned int type; /* XDGShell or X11* */ -+ int interact; - struct wlr_box geom; /* layout-relative, includes border */ - Monitor *mon; - struct wlr_scene_tree *scene; -@@ -316,7 +317,8 @@ static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); --static void resize(Client *c, struct wlr_box geo, int interact); -+static void resizeapply(Client *c, struct wlr_box geo, int interact); -+static void resizenoapply(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); -@@ -408,6 +410,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static void (*resize)(Client *c, struct wlr_box geo, int interact) = resizeapply; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -476,6 +480,35 @@ applyrules(Client *c) - setmon(c, mon, newtags); - } - -+void -+applyminimalborders(Client *c, Monitor *m) -+{ -+ struct wlr_box geom = c->geom; -+ -+ geom.x -= borderpx; -+ geom.width += borderpx; -+ geom.y -= borderpx; -+ geom.height += borderpx; -+ -+ if (geom.x < m->w.x) { -+ geom.x += borderpx; -+ geom.width -= borderpx; -+ } -+ if (geom.x + geom.width > m->w.width - (int)borderpx) { -+ geom.width -= borderpx; -+ } -+ -+ if (geom.y < m->w.y) { -+ geom.y += borderpx; -+ geom.height -= borderpx; -+ } -+ if (geom.y + geom.height > m->w.height - (int)borderpx) { -+ geom.height -= borderpx; -+ } -+ -+ resize(c, geom, 0); -+} -+ - void - arrange(Monitor *m) - { -@@ -510,8 +543,28 @@ arrange(Monitor *m) - : c->scene->node.parent); - } - -- if (m->lt[m->sellt]->arrange) -- m->lt[m->sellt]->arrange(m); -+ if (m->lt[m->sellt]->arrange) { -+ if (draw_minimal_borders) { -+ int save_width = m->w.width; -+ int save_height = m->w.height; -+ m->w.width += borderpx; -+ m->w.height += borderpx; -+ resize = resizenoapply; -+ m->lt[m->sellt]->arrange(m); -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (draw_minimal_borders) -+ applyminimalborders(c, m); -+ resizeapply(c, c->geom, c->interact); -+ } -+ m->w.width = save_width; -+ m->w.height = save_height; -+ resize = resizeapply; -+ } else { -+ m->lt[m->sellt]->arrange(m); -+ } -+ } - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } -@@ -1962,8 +2015,13 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - struct timespec now; - - if (surface != seat->pointer_state.focused_surface && -- sloppyfocus && time && c && !client_is_unmanaged(c)) -- focusclient(c, 0); -+ sloppyfocus && time && c && !client_is_unmanaged(c)) { -+ if (c->isfloating || c->isfullscreen) { -+ focusclient(c, 0); -+ } else { -+ focusclient(c, 1); -+ } -+ } - - /* If surface is NULL, clear pointer focus */ - if (!surface) { -@@ -2128,7 +2186,7 @@ requestmonstate(struct wl_listener *listener, void *data) - } - - void --resize(Client *c, struct wlr_box geo, int interact) -+resizeapply(Client *c, struct wlr_box geo, int interact) - { - struct wlr_box *bbox; - struct wlr_box clip; -@@ -2160,6 +2218,13 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); - } - -+void -+resizenoapply(Client *c, struct wlr_box geo, int interact) -+{ -+ c->geom = geo; -+ c->interact = interact; -+} -+ - void - run(char *startup_cmd) - { --- -2.45.1 diff --git a/dwl-bak/dwl-patches/patches/modes/README.md b/dwl-bak/dwl-patches/patches/modes/README.md deleted file mode 100644 index c855af9..0000000 --- a/dwl-bak/dwl-patches/patches/modes/README.md +++ /dev/null @@ -1,35 +0,0 @@ -### Description -Implement modes, that way each mapping is associated with a mode and is only active while in that mode, default mode is `NORMAL` - -### Example - -In the example below, you declare a mode: `BROWSER`, which is activated when you press modkey + b. Then, you can press f to launch `Firefox` and return to the default `NORMAL` mode. - -```c -enum { - BROWSER, -}; -const char *modes_labels[] = { - "browser", -}; - -static const Key keys[] = { - // ... - { MODKEY, XKB_KEY_b, entermode, {.i = BROWSER} }, - // ... -}; - -static const Modekey modekeys[] = { - /* mode modifier key function argument */ - { BROWSER, { 0, XKB_KEY_f, spawn, SHCMD("firefox") } }, - { BROWSER, { 0, XKB_KEY_f, entermode, {.i = NORMAL} } }, - { BROWSER, { 0, XKB_KEY_Escape, entermode, {.i = NORMAL} } }, -}; -``` - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/modes) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/modes/modes.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/modes/modes.patch b/dwl-bak/dwl-patches/patches/modes/modes.patch deleted file mode 100644 index 5ecf846..0000000 --- a/dwl-bak/dwl-patches/patches/modes/modes.patch +++ /dev/null @@ -1,165 +0,0 @@ -From a32b85018ff2cea0fc9f9137789860a4aadc3b3a Mon Sep 17 00:00:00 2001 -From: wochap -Date: Wed, 6 Mar 2024 07:31:17 -0500 -Subject: [PATCH] implement modes - -like sway/river modes ---- - config.def.h | 20 ++++++++++++++++++++ - dwl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 66 insertions(+) - -diff --git a/config.def.h b/config.def.h -index db0babc..1616136 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,13 @@ static const float urgentcolor[] = COLOR(0xff0000ff); - /* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0}; /* You can also use glsl colors */ - -+enum { -+ BROWSER, -+}; -+const char *modes_labels[] = { -+ "browser", -+}; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -152,6 +159,8 @@ static const Key keys[] = { - TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, - -+ { MODKEY, XKB_KEY_b, entermode, {.i = BROWSER} }, -+ - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ - { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is -@@ -162,6 +171,17 @@ static const Key keys[] = { - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), - }; - -+static const Modekey modekeys[] = { -+ /* mode modifier key function argument */ -+ { BROWSER, { 0, XKB_KEY_f, spawn, SHCMD("firefox") } }, -+ { BROWSER, { 0, XKB_KEY_f, entermode, {.i = NORMAL} } }, -+ { BROWSER, { 0, XKB_KEY_b, spawn, SHCMD("brave") } }, -+ { BROWSER, { 0, XKB_KEY_b, entermode, {.i = NORMAL} } }, -+ { BROWSER, { 0, XKB_KEY_g, spawn, SHCMD("google-chrome-stable") } }, -+ { BROWSER, { 0, XKB_KEY_g, entermode, {.i = NORMAL} } }, -+ { BROWSER, { 0, XKB_KEY_Escape, entermode, {.i = NORMAL} } }, -+}; -+ - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -diff --git a/dwl.c b/dwl.c -index ef27a1d..1ada006 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -139,6 +139,11 @@ typedef struct { - const Arg arg; - } Key; - -+typedef struct { -+ int mode_index; -+ Key key; -+} Modekey; -+ - typedef struct { - struct wl_list link; - struct wlr_keyboard *wlr_keyboard; -@@ -270,6 +275,7 @@ static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); -+static int modekeybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); - static void keypressmod(struct wl_listener *listener, void *data); - static int keyrepeat(void *data); -@@ -327,6 +333,7 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void entermode(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -@@ -377,6 +384,9 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static const int NORMAL = -1; -+static int active_mode_index = NORMAL; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -1372,6 +1382,11 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - */ - int handled = 0; - const Key *k; -+ -+ if (active_mode_index >= 0) { -+ return modekeybinding(mods, sym); -+ } -+ - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) && - sym == k->keysym && k->func) { -@@ -1382,6 +1397,29 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - return handled; - } - -+int -+modekeybinding(uint32_t mods, xkb_keysym_t sym) -+{ -+ int handled = 0; -+ const Modekey *mk; -+ const Key *k; -+ -+ for (mk = modekeys; mk < END(modekeys); mk++) { -+ if (active_mode_index != mk->mode_index) { -+ continue; -+ } -+ -+ k = &mk->key; -+ if (CLEANMASK(mods) == CLEANMASK(k->mod) && -+ sym == k->keysym && k->func) { -+ k->func(&k->arg); -+ handled = 1; -+ } -+ } -+ -+ return handled; -+} -+ - void - keypress(struct wl_listener *listener, void *data) - { -@@ -1851,6 +1889,7 @@ printstatus(void) - printf("%s tags %u %u %u %u\n", m->wlr_output->name, occ, m->tagset[m->seltags], - sel, urg); - printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol); -+ printf("%s mode %s\n", m->wlr_output->name, modes_labels[active_mode_index] ? modes_labels[active_mode_index] : ""); - } - fflush(stdout); - } -@@ -2746,6 +2785,13 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+void -+entermode(const Arg *arg) -+{ -+ active_mode_index = arg->i; -+ printstatus(); -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.42.0 - diff --git a/dwl-bak/dwl-patches/patches/monitorconfig/README.md b/dwl-bak/dwl-patches/patches/monitorconfig/README.md deleted file mode 100644 index 313e5a0..0000000 --- a/dwl-bak/dwl-patches/patches/monitorconfig/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Allows more monitor configuration in config.h - -### Download -- [git branch](https://codeberg.org/Palanix/dwl/src/branch/monitorconfig) -- [2024-02-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/monitorconfig/monitorconfig.patch) - -### Authors -- [Palanix](https://codeberg.org/Palanix) diff --git a/dwl-bak/dwl-patches/patches/monitorconfig/monitorconfig.patch b/dwl-bak/dwl-patches/patches/monitorconfig/monitorconfig.patch deleted file mode 100644 index 4922f8d..0000000 --- a/dwl-bak/dwl-patches/patches/monitorconfig/monitorconfig.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 73f70cd9d817a307030f360f6c8a2500046b8b76 Mon Sep 17 00:00:00 2001 -From: Palanix -Date: Mon, 4 Apr 2022 16:08:29 +0200 -Subject: [PATCH] Updated patch now allowing setting x and y -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Co-authored-by: Leonardo Hernández Hernández ---- - config.def.h | 11 +++++++---- - dwl.c | 25 +++++++++++++++++++------ - 2 files changed, 26 insertions(+), 10 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 8f498d2..4ccacd2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -38,12 +38,15 @@ static const Layout layouts[] = { - /* monitors */ - /* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ - static const MonitorRule monrules[] = { -- /* name mfact nmaster scale layout rotate/reflect x y */ -- /* example of a HiDPI laptop monitor: -- { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ /* name mfact nmaster scale layout rotate/reflect x y resx resy rate mode adaptive*/ -+ /* example of a HiDPI laptop monitor at 120Hz: -+ { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, 0, 0, 120.000f, 1, 1}, -+ * mode let's the user decide on how dwl should implement the modes: -+ * -1 Sets a custom mode following the users choice -+ * All other number's set the mode at the index n, 0 is the standard mode; see wlr-randr - */ - /* defaults */ -- { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1, 0, 0, 0.0f, 0 ,1}, - }; - - /* keyboard */ -diff --git a/dwl.c b/dwl.c -index 52bfbc8..9609b6d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -215,6 +215,11 @@ typedef struct { - const Layout *lt; - enum wl_output_transform rr; - int x, y; -+ int resx; -+ int resy; -+ float rate; -+ int mode; -+ int adaptive; - } MonitorRule; - - typedef struct { -@@ -865,6 +870,7 @@ createmon(struct wl_listener *listener, void *data) - /* This event is raised by the backend when a new output (aka a display or - * monitor) becomes available. */ - struct wlr_output *wlr_output = data; -+ struct wlr_output_mode *mode = wl_container_of(wlr_output->modes.next, mode, link); - const MonitorRule *r; - size_t i; - struct wlr_output_state state; -@@ -893,16 +899,23 @@ createmon(struct wl_listener *listener, void *data) - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - wlr_output_state_set_scale(&state, r->scale); - wlr_output_state_set_transform(&state, r->rr); -+ -+ wlr_output_state_set_adaptive_sync_enabled(&state, r->adaptive); -+ -+ if(r->mode == -1) -+ wlr_output_state_set_custom_mode(&state, r->resx, r->resy, -+ (int) (r->rate > 0 ? r->rate * 1000 : 0)); -+ else if (!wl_list_empty(&wlr_output->modes)) { -+ for (int j = 0; j < r->mode; j++) { -+ mode = wl_container_of(mode->link.next, mode, link); -+ } -+ wlr_output_state_set_mode(&state, mode); -+ } -+ - break; - } - } - -- /* The mode is a tuple of (width, height, refresh rate), and each -- * monitor supports only a specific set of modes. We just pick the -- * monitor's preferred mode; a more sophisticated compositor would let -- * the user configure it. */ -- wlr_output_state_set_mode(&state, wlr_output_preferred_mode(wlr_output)); -- - /* Set up event listeners */ - LISTEN(&wlr_output->events.frame, &m->frame, rendermon); - LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon); --- -2.45.1 - diff --git a/dwl-bak/dwl-patches/patches/mouse-trackpad-split/README.md b/dwl-bak/dwl-patches/patches/mouse-trackpad-split/README.md deleted file mode 100644 index a3e6e44..0000000 --- a/dwl-bak/dwl-patches/patches/mouse-trackpad-split/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Separates natural scrolling and acceleration settings for trackpad and mouse. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/mouse-trackpad-split/mouse-trackpad-split-0.7.patch) - -### Authors -- [mmistika](https://codeberg.org/mmistika) diff --git a/dwl-bak/dwl-patches/patches/mouse-trackpad-split/mouse-trackpad-split-0.7.patch b/dwl-bak/dwl-patches/patches/mouse-trackpad-split/mouse-trackpad-split-0.7.patch deleted file mode 100644 index 89e33ac..0000000 --- a/dwl-bak/dwl-patches/patches/mouse-trackpad-split/mouse-trackpad-split-0.7.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 211b52988756e9fecccf071fdea82832e1e17a0c Mon Sep 17 00:00:00 2001 -From: mmistika -Date: Tue, 24 Jun 2025 22:25:00 +0200 -Subject: [PATCH] Separate trackpad/mouse natural scroll and accel - -Signed-off-by: mmistika ---- - config.def.h | 12 +++++++++--- - dwl.c | 26 ++++++++++++++++++-------- - 2 files changed, 27 insertions(+), 11 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..9d05a89 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -67,10 +67,14 @@ static const int repeat_delay = 600; - static const int tap_to_click = 1; - static const int tap_and_drag = 1; - static const int drag_lock = 1; --static const int natural_scrolling = 0; - static const int disable_while_typing = 1; - static const int left_handed = 0; - static const int middle_button_emulation = 0; -+ -+/* Natural scrolling */ -+static const int trackpad_natural_scrolling = 0; -+static const int mouse_natural_scrolling = 0; -+ - /* You can choose between: - LIBINPUT_CONFIG_SCROLL_NO_SCROLL - LIBINPUT_CONFIG_SCROLL_2FG -@@ -97,8 +101,10 @@ static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; - LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT - LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE - */ --static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; --static const double accel_speed = 0.0; -+static const enum libinput_config_accel_profile trackpad_accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; -+static const double trackpad_accel_speed = 0.0; -+static const enum libinput_config_accel_profile mouse_accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT; -+static const double mouse_accel_speed = 0.0; - - /* You can choose between: - LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle -diff --git a/dwl.c b/dwl.c -index c717c1d..f05d6c5 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1083,14 +1083,29 @@ createpointer(struct wlr_pointer *pointer) - && (device = wlr_libinput_get_device_handle(&pointer->base))) { - - if (libinput_device_config_tap_get_finger_count(device)) { -+ /* Trackpad */ - libinput_device_config_tap_set_enabled(device, tap_to_click); - libinput_device_config_tap_set_drag_enabled(device, tap_and_drag); - libinput_device_config_tap_set_drag_lock_enabled(device, drag_lock); - libinput_device_config_tap_set_button_map(device, button_map); -- } - -- if (libinput_device_config_scroll_has_natural_scroll(device)) -- libinput_device_config_scroll_set_natural_scroll_enabled(device, natural_scrolling); -+ if (libinput_device_config_scroll_has_natural_scroll(device)) -+ libinput_device_config_scroll_set_natural_scroll_enabled(device, trackpad_natural_scrolling); -+ -+ if (libinput_device_config_accel_is_available(device)) { -+ libinput_device_config_accel_set_profile(device, trackpad_accel_profile); -+ libinput_device_config_accel_set_speed(device, trackpad_accel_speed); -+ } -+ } else { -+ /* Mouse */ -+ if (libinput_device_config_scroll_has_natural_scroll(device)) -+ libinput_device_config_scroll_set_natural_scroll_enabled(device, mouse_natural_scrolling); -+ -+ if (libinput_device_config_accel_is_available(device)) { -+ libinput_device_config_accel_set_profile(device, mouse_accel_profile); -+ libinput_device_config_accel_set_speed(device, mouse_accel_speed); -+ } -+ } - - if (libinput_device_config_dwt_is_available(device)) - libinput_device_config_dwt_set_enabled(device, disable_while_typing); -@@ -1109,11 +1124,6 @@ createpointer(struct wlr_pointer *pointer) - - if (libinput_device_config_send_events_get_modes(device)) - libinput_device_config_send_events_set_mode(device, send_events_mode); -- -- if (libinput_device_config_accel_is_available(device)) { -- libinput_device_config_accel_set_profile(device, accel_profile); -- libinput_device_config_accel_set_speed(device, accel_speed); -- } - } - - wlr_cursor_attach_input_device(cursor, &pointer->base); --- -2.50.0 - diff --git a/dwl-bak/dwl-patches/patches/movecenter/README.md b/dwl-bak/dwl-patches/patches/movecenter/README.md deleted file mode 100644 index aff8f7d..0000000 --- a/dwl-bak/dwl-patches/patches/movecenter/README.md +++ /dev/null @@ -1,28 +0,0 @@ -### Description - -> This patch is no longer being maintained by me [wochap](https://codeberg.org/wochap), since I'm now using a different patch specific to my use case: https://codeberg.org/wochap/dwl/src/branch/v0.6-c/betterfloat/betterfloat-diff.patch. - -This patch provides a keybinding to center the focused floating window. - -Press MODKEY + x to center the focused floating window. - -It does NOT center windows that are not floating. - -The variable `respect_monitor_reserved_area` allows the user to choose whether to center relative to the monitor or relative to the window area. - -
-Explanation of respect_monitor_reserved_area: -
-The "Monitor area" refers to the space enclosed by the green rectangle, while the "Window area" refers to the space enclosed by the red rectangle.
-
-
-
- -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.6/movecenter) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/commit/b1ca929ee645cd3e175f198e250448b54624acd6/patches/movecenter/movecenter.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/187d7f511572457750fcf6e42c99cdc7befe05e7/patches/movecenter/movecenter.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) - diff --git a/dwl-bak/dwl-patches/patches/movecenter/movecenter.patch b/dwl-bak/dwl-patches/patches/movecenter/movecenter.patch deleted file mode 100644 index f96bd36..0000000 --- a/dwl-bak/dwl-patches/patches/movecenter/movecenter.patch +++ /dev/null @@ -1,82 +0,0 @@ -From bc5206882c71b32198dae5f1c85601a863a7c0a9 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Wed, 31 Jul 2024 07:43:10 -0500 -Subject: [PATCH] implement movecenter fn - ---- - config.def.h | 2 ++ - dwl.c | 31 +++++++++++++++++++++++++++++++ - 2 files changed, 33 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..f5225d9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,7 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const int respect_monitor_reserved_area = 0; /* 1 to monitor center while respecting the monitor's reserved area, 0 to monitor center */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -@@ -142,6 +143,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_x, movecenter, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index 145fd01..791e598 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -336,6 +336,8 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void _movecenter(Client *c, int interact); -+static void movecenter(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -2683,6 +2685,35 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+_movecenter(Client *c, int interact) -+{ -+ struct wlr_box b; -+ -+ if (!c || !c->mon) { -+ return; -+ } -+ -+ if (!c->isfloating) { -+ return; -+ } -+ -+ b = respect_monitor_reserved_area ? c->mon->w : c->mon->m; -+ resize(c, (struct wlr_box){ -+ .x = (b.width - c->geom.width) / 2 + b.x, -+ .y = (b.height - c->geom.height) / 2 + b.y, -+ .width = c->geom.width, -+ .height = c->geom.height, -+ }, interact); -+} -+ -+void -+movecenter(const Arg *arg) -+{ -+ Client *c = focustop(selmon); -+ _movecenter(c, 1); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/moveresizekb/README.md b/dwl-bak/dwl-patches/patches/moveresizekb/README.md deleted file mode 100644 index 0c53caf..0000000 --- a/dwl-bak/dwl-patches/patches/moveresizekb/README.md +++ /dev/null @@ -1,20 +0,0 @@ -### Description -This allows the user to change size and placement of floating windows using only the keyboard, default keybindings: - -| Keybinding | Action | -| :--- | :--- | -| MODKEY + Up | move 40px up | -| MODKEY + Down | move 40px down | -| MODKEY + Left | move 40px left | -| MODKEY + Right | move 40px right | -| MODKEY + Shift + Up | shrink height 40px | -| MODKEY + Shift + Down | grow height 40px | -| MODKEY + Shift + Left | shrink width 40px | -| MODKEY + Shift + Right | grow width 40px | - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/moveresizekb) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/moveresizekb/moveresizekb.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/moveresizekb/moveresizekb.patch b/dwl-bak/dwl-patches/patches/moveresizekb/moveresizekb.patch deleted file mode 100644 index aeb1e5e..0000000 --- a/dwl-bak/dwl-patches/patches/moveresizekb/moveresizekb.patch +++ /dev/null @@ -1,70 +0,0 @@ -From c8af428f964679089599e4ffbe7d28d08a4e875f Mon Sep 17 00:00:00 2001 -From: wochap -Date: Tue, 5 Mar 2024 23:42:55 -0500 -Subject: [PATCH] implement keybindings to move and resize focused floating - window - ---- - config.def.h | 8 ++++++++ - dwl.c | 19 +++++++++++++++++++ - 2 files changed, 27 insertions(+) - -diff --git a/config.def.h b/config.def.h -index db0babc..d0570b8 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -135,6 +135,14 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 40, 0, 0 }}}, -+ { MODKEY, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, -40, 0, 0 }}}, -+ { MODKEY, XKB_KEY_Right, moveresizekb, {.v = (int []){ 40, 0, 0, 0 }}}, -+ { MODKEY, XKB_KEY_Left, moveresizekb, {.v = (int []){ -40, 0, 0, 0 }}}, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, moveresizekb, {.v = (int []){ 0, 0, 0, 40 }}}, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, moveresizekb, {.v = (int []){ 0, 0, 0, -40 }}}, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, moveresizekb, {.v = (int []){ 0, 0, 40, 0 }}}, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, moveresizekb, {.v = (int []){ 0, 0, -40, 0 }}}, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index ef27a1d..251472b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -313,6 +313,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void moveresizekb(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -2454,6 +2455,24 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+moveresizekb(const Arg *arg) -+{ -+ Client *c = focustop(selmon); -+ Monitor *m = selmon; -+ -+ if(!(m && arg && arg->v && c && c->isfloating)) { -+ return; -+ } -+ -+ resize(c, (struct wlr_box){ -+ .x = c->geom.x + ((int *)arg->v)[0], -+ .y = c->geom.y + ((int *)arg->v)[1], -+ .width = c->geom.width + ((int *)arg->v)[2], -+ .height = c->geom.height + ((int *)arg->v)[3], -+ }, 1); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.42.0 - diff --git a/dwl-bak/dwl-patches/patches/movestack/README.md b/dwl-bak/dwl-patches/patches/movestack/README.md deleted file mode 100644 index f50bf68..0000000 --- a/dwl-bak/dwl-patches/patches/movestack/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -Allows you to move a window up and down the stack. - -### Download -- [git branch](https://codeberg.org/nikitaivanov/dwl/src/branch/movestack) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/movestack/movestack.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [sam-barr](https://github.com/ss7m) -- [Dmitry Zakharchenko](https://github.com/dm1tz) -- [Abanoub8](https://github.com/Abanoub8) -- [Nikita Ivanov](https://github.com/NikitaIvanovV) diff --git a/dwl-bak/dwl-patches/patches/movestack/movestack.patch b/dwl-bak/dwl-patches/patches/movestack/movestack.patch deleted file mode 100644 index 2543c66..0000000 --- a/dwl-bak/dwl-patches/patches/movestack/movestack.patch +++ /dev/null @@ -1,87 +0,0 @@ -From 08230817bd3926e29d9897657eb1852cb27d461f Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Tue, 4 Feb 2025 23:21:19 +0100 -Subject: [PATCH] Allows you to move a window up and down the stack - ---- - config.def.h | 2 ++ - dwl.c | 43 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 45 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..2c129f2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -129,6 +129,8 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_J, movestack, {.i = +1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, movestack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -diff --git a/dwl.c b/dwl.c -index def2562..045d6fa 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -303,6 +303,7 @@ static void locksession(struct wl_listener *listener, void *data); - static void mapnotify(struct wl_listener *listener, void *data); - static void maximizenotify(struct wl_listener *listener, void *data); - static void monocle(Monitor *m); -+static void movestack(const Arg *arg); - static void motionabsolute(struct wl_listener *listener, void *data); - static void motionnotify(uint32_t time, struct wlr_input_device *device, double sx, - double sy, double sx_unaccel, double sy_unaccel); -@@ -1786,6 +1787,48 @@ monocle(Monitor *m) - wlr_scene_node_raise_to_top(&c->scene->node); - } - -+void -+movestack(const Arg *arg) -+{ -+ Client *c, *sel = focustop(selmon); -+ -+ if (!sel) { -+ return; -+ } -+ -+ if (wl_list_length(&clients) <= 1) { -+ return; -+ } -+ -+ if (arg->i > 0) { -+ wl_list_for_each(c, &sel->link, link) { -+ if (&c->link == &clients) { -+ c = wl_container_of(&clients, c, link); -+ break; /* wrap past the sentinel node */ -+ } -+ if (VISIBLEON(c, selmon) || &c->link == &clients) { -+ break; /* found it */ -+ } -+ } -+ } else { -+ wl_list_for_each_reverse(c, &sel->link, link) { -+ if (&c->link == &clients) { -+ c = wl_container_of(&clients, c, link); -+ break; /* wrap past the sentinel node */ -+ } -+ if (VISIBLEON(c, selmon) || &c->link == &clients) { -+ break; /* found it */ -+ } -+ } -+ /* backup one client */ -+ c = wl_container_of(c->link.prev, c, link); -+ } -+ -+ wl_list_remove(&sel->link); -+ wl_list_insert(&c->link, &sel->link); -+ arrange(selmon); -+} -+ - void - motionabsolute(struct wl_listener *listener, void *data) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/namedscratchpads/README.md b/dwl-bak/dwl-patches/patches/namedscratchpads/README.md deleted file mode 100644 index e436583..0000000 --- a/dwl-bak/dwl-patches/patches/namedscratchpads/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Allows for the creation of multiple scratchpad windows, each assigned to a different keybinding. In simple terms, it enables 'run or raise' functionality - -This patch adds the following functions: - -* `togglescratch`: simply toggles the scratchpad window -* `focusortogglescratch`: change the focus to the scratchpad window if it is visible and toggles it if it is already in focus -* `focusortogglematchingscratch`: similar to `focusortogglescratch` but also closes all other scratchpad windows - -If you don't assign keybindings to any of the above functions and so get a compiler warning about them not being used, just remove them from your dwl branch to stop the warning. - -### Download -- [git branch (v0.6)](https://codeberg.org/bencc/dwl/src/branch/namedscratchpads) -- [2024-07-13 (v0.6)](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/namedscratchpads/namedscratchpads.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) -- [wochap](https://codeberg.org/wochap) -- [Louis-Michel Raynauld](https://github.com/loumray) diff --git a/dwl-bak/dwl-patches/patches/namedscratchpads/namedscratchpads.patch b/dwl-bak/dwl-patches/patches/namedscratchpads/namedscratchpads.patch deleted file mode 100644 index 7a0a257..0000000 --- a/dwl-bak/dwl-patches/patches/namedscratchpads/namedscratchpads.patch +++ /dev/null @@ -1,278 +0,0 @@ -From bd83d56b3a268112b029961ad6ff4232b2d6f00d Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Thu, 4 Jan 2024 16:35:05 +1000 -Subject: [PATCH 1/2] namedscratchpads - ---- - config.def.h | 11 ++++++++--- - dwl.c | 39 +++++++++++++++++++++++++++++++++++++++ - 2 files changed, 47 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..36a691a9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -22,10 +22,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating monitor scratchkey */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, -1, 0 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1, 0 }, /* Start on ONLY tag "9" */ -+ { NULL, "scratchpad", 0, 1, -1, 's' }, - }; - - /* layout(s) */ -@@ -122,11 +123,15 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "wmenu-run", NULL }; - -+/* named scratchpads - First arg only serves to match against key in rules*/ -+static const char *scratchpadcmd[] = { "s", "alacritty", "-t", "scratchpad", NULL }; -+ - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_grave, togglescratch, {.v = scratchpadcmd } }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index dc0437e0..eb0eb775 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -139,6 +139,7 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ char scratchkey; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -230,6 +231,7 @@ typedef struct { - uint32_t tags; - int isfloating; - int monitor; -+ const char scratchkey; - } Rule; - - typedef struct { -@@ -330,12 +332,14 @@ static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); -+static void spawnscratch(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglescratch(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -456,6 +460,7 @@ applyrules(Client *c) - Monitor *mon = selmon, *m; - - c->isfloating = client_is_float_type(c); -+ c->scratchkey = 0; - if (!(appid = client_get_appid(c))) - appid = broken; - if (!(title = client_get_title(c))) -@@ -465,6 +470,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->scratchkey = r->scratchkey; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -2603,6 +2609,16 @@ spawn(const Arg *arg) - } - } - -+void spawnscratch(const Arg *arg) -+{ -+ if (fork() == 0) { -+ dup2(STDERR_FILENO, STDOUT_FILENO); -+ setsid(); -+ execvp(((char **)arg->v)[1], ((char **)arg->v)+1); -+ die("dwl: execvp %s failed:", ((char **)arg->v)[1]); -+ } -+} -+ - void - startdrag(struct wl_listener *listener, void *data) - { -@@ -2686,6 +2702,29 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglescratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ -+ /* search for first window that matches the scratchkey */ -+ wl_list_for_each(c, &clients, link) -+ if (c->scratchkey == ((char**)arg->v)[0][0]) { -+ found = 1; -+ break; -+ } -+ -+ if (found) { -+ c->tags = VISIBLEON(c, selmon) ? 0 : selmon->tagset[selmon->seltags]; -+ -+ focusclient(c->tags == 0 ? focustop(selmon) : c, 1); -+ arrange(selmon); -+ } else{ -+ spawnscratch(arg); -+ } -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - - -From 4963c34b4958fba9d53a23a1c9929d554a4e8b3d Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Sat, 13 Jul 2024 14:50:45 +1000 -Subject: [PATCH 2/2] namedscratchpads: focusortoggle functions - ---- - config.def.h | 2 ++ - dwl.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 89 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 36a691a9..21bb66bb 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -132,6 +132,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_grave, togglescratch, {.v = scratchpadcmd } }, -+ // { MODKEY, XKB_KEY_grave, focusortogglescratch, {.v = scratchpadcmd } }, -+ // { MODKEY, XKB_KEY_grave, focusortogglematchingscratch, {.v = scratchpadcmd } }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index eb0eb775..d7c5552f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -286,6 +286,8 @@ static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); -+static void focusortogglematchingscratch(const Arg *arg); -+static void focusortogglescratch(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); -@@ -1405,6 +1407,91 @@ focusmon(const Arg *arg) - focusclient(focustop(selmon), 1); - } - -+void -+focusortogglematchingscratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ unsigned int hide = 0; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->scratchkey == 0) { -+ continue; -+ } -+ if (c->scratchkey == ((char**)arg->v)[0][0]) { -+ if (VISIBLEON(c, selmon)) { -+ if (found == 1) { -+ if (hide == 1) { -+ c->tags = 0; -+ focusclient(focustop(selmon), 1); -+ } -+ continue; -+ } -+ if (focustop(selmon) == c) { -+ // hide -+ c->tags = 0; -+ focusclient(focustop(selmon), 1); -+ hide = 1; -+ } else { -+ // focus -+ focusclient(c, 1); -+ } -+ } else { -+ // show -+ c->tags = selmon->tagset[selmon->seltags]; -+ // focus -+ focusclient(c, 1); -+ } -+ found = 1; -+ continue; -+ } -+ if (VISIBLEON(c, selmon)) { -+ // hide -+ c->tags = 0; -+ } -+ } -+ -+ if (found) { -+ arrange(selmon); -+ } else { -+ spawnscratch(arg); -+ } -+} -+ -+void -+focusortogglescratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ -+ /* search for first window that matches the scratchkey */ -+ wl_list_for_each(c, &clients, link) -+ if (c->scratchkey == ((char**)arg->v)[0][0]) { -+ found = 1; -+ break; -+ } -+ -+ if (found) { -+ if (VISIBLEON(c, selmon)) { -+ if (focustop(selmon) == c) { -+ // hide -+ c->tags = 0; -+ focusclient(focustop(selmon), 1); -+ } else { -+ // focus -+ focusclient(c, 1); -+ } -+ } else { -+ // show -+ c->tags = selmon->tagset[selmon->seltags]; -+ focusclient(c, 1); -+ } -+ arrange(selmon); -+ } else{ -+ spawnscratch(arg); -+ } -+} -+ - void - focusstack(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/nextlayout/README.md b/dwl-bak/dwl-patches/patches/nextlayout/README.md deleted file mode 100644 index ea1d4a6..0000000 --- a/dwl-bak/dwl-patches/patches/nextlayout/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Change the current layout to the next available one. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/nextlayout/nextlayout.patch) - -### Authors -- [sewn](/sewn) - diff --git a/dwl-bak/dwl-patches/patches/nextlayout/nextlayout.patch b/dwl-bak/dwl-patches/patches/nextlayout/nextlayout.patch deleted file mode 100644 index 11f4dc7..0000000 --- a/dwl-bak/dwl-patches/patches/nextlayout/nextlayout.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 7d8cfa63681830a3af4512799b8260f8249bc514 Mon Sep 17 00:00:00 2001 -From: sewn -Date: Sun, 8 Sep 2024 22:49:33 +0300 -Subject: [PATCH] add feature to switch to next available layout - -ported from suckless cyclelayouts to be slightly more useful -https://dwm.suckless.org/patches/cyclelayouts/ ---- - config.def.h | 2 ++ - dwl.c | 12 ++++++++++++ - 2 files changed, 14 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..f88a615 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { NULL, NULL }, /* terminate */ - }; - - /* monitors */ -@@ -140,6 +141,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_n, nextlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, -diff --git a/dwl.c b/dwl.c -index a2711f6..a66d9d9 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -308,6 +308,7 @@ static void motionnotify(uint32_t time, struct wlr_input_device *device, double - double sy, double sx_unaccel, double sy_unaccel); - static void motionrelative(struct wl_listener *listener, void *data); - static void moveresize(const Arg *arg); -+static void nextlayout(const Arg *arg); - static void outputmgrapply(struct wl_listener *listener, void *data); - static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test); - static void outputmgrtest(struct wl_listener *listener, void *data); -@@ -1927,6 +1928,17 @@ moveresize(const Arg *arg) - } - } - -+void -+nextlayout(const Arg *arg) -+{ -+ Layout *l; -+ for(l = (Layout *)layouts; l != selmon->lt[selmon->sellt]; l++); -+ if(l->symbol && (l + 1)->symbol) -+ setlayout(&((Arg) { .v = (l + 1) })); -+ else -+ setlayout(&((Arg) { .v = layouts })); -+} -+ - void - outputmgrapply(struct wl_listener *listener, void *data) - { --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/numlock-capslock/README.md b/dwl-bak/dwl-patches/patches/numlock-capslock/README.md deleted file mode 100644 index 54a4f34..0000000 --- a/dwl-bak/dwl-patches/patches/numlock-capslock/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Allows activating numlock or capslock at startup. - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/numlock-capslock) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/numlock-capslock/numlock-capslock.patch) -- [numlock-capslock.patch](/dwl/dwl-patches/raw/branch/main/patches/numlock-capslock/numlock-capslock-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock-0.7.patch b/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock-0.7.patch deleted file mode 100644 index 7b30be3..0000000 --- a/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock-0.7.patch +++ /dev/null @@ -1,84 +0,0 @@ -From cbacfb5031b91bc6677b0fb7c07dbe79cc2e0177 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 4 Apr 2021 19:56:09 -0500 -Subject: [PATCH] add option to enable numlock/capslock -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 4 ++++ - dwl.c | 19 +++++++++++++++++++ - 2 files changed, 23 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..21dc6201 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -60,6 +60,10 @@ static const struct xkb_rule_names xkb_rules = { - .options = NULL, - }; - -+/* numlock and capslock */ -+static const int numlock = 1; -+static const int capslock = 0; -+ - static const int repeat_rate = 25; - static const int repeat_delay = 600; - -diff --git a/dwl.c b/dwl.c -index a2711f67..a11f0bcf 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -360,6 +361,7 @@ static void zoom(const Arg *arg); - static const char broken[] = "broken"; - static pid_t child_pid = -1; - static int locked; -+static uint32_t locked_mods = 0; - static void *exclusive_focus; - static struct wl_display *dpy; - static struct wl_event_loop *event_loop; -@@ -877,6 +879,8 @@ createkeyboard(struct wlr_keyboard *keyboard) - /* Set the keymap to match the group keymap */ - wlr_keyboard_set_keymap(keyboard, kb_group->wlr_group->keyboard.keymap); - -+ wlr_keyboard_notify_modifiers(keyboard, 0, 0, locked_mods, 0); -+ - /* Add the new keyboard to the group */ - wlr_keyboard_group_add_keyboard(kb_group->wlr_group, keyboard); - } -@@ -898,6 +902,21 @@ createkeyboardgroup(void) - die("failed to compile keymap"); - - wlr_keyboard_set_keymap(&group->wlr_group->keyboard, keymap); -+ if (numlock) { -+ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM); -+ if (mod_index != XKB_MOD_INVALID) -+ locked_mods |= (uint32_t)1 << mod_index; -+ } -+ -+ if (capslock) { -+ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS); -+ if (mod_index != XKB_MOD_INVALID) -+ locked_mods |= (uint32_t)1 << mod_index; -+ } -+ -+ if (locked_mods) -+ wlr_keyboard_notify_modifiers(&group->wlr_group->keyboard, 0, 0, locked_mods, 0); -+ - xkb_keymap_unref(keymap); - xkb_context_unref(context); - --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock.patch b/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock.patch deleted file mode 100644 index adf9f38..0000000 --- a/dwl-bak/dwl-patches/patches/numlock-capslock/numlock-capslock.patch +++ /dev/null @@ -1,84 +0,0 @@ -From ec5dbcd9f4629549d3d14b1791305a42479a935f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 4 Apr 2021 19:56:09 -0500 -Subject: [PATCH] add option to enable numlock/capslock -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 4 ++++ - dwl.c | 19 +++++++++++++++++++ - 2 files changed, 23 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..21dc6201 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -60,6 +60,10 @@ static const struct xkb_rule_names xkb_rules = { - .options = NULL, - }; - -+/* numlock and capslock */ -+static const int numlock = 1; -+static const int capslock = 0; -+ - static const int repeat_rate = 25; - static const int repeat_delay = 600; - -diff --git a/dwl.c b/dwl.c -index ad21e1ba..d0059ec8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -355,6 +356,7 @@ static void zoom(const Arg *arg); - /* variables */ - static pid_t child_pid = -1; - static int locked; -+static uint32_t locked_mods = 0; - static void *exclusive_focus; - static struct wl_display *dpy; - static struct wl_event_loop *event_loop; -@@ -936,6 +938,8 @@ createkeyboard(struct wlr_keyboard *keyboard) - /* Set the keymap to match the group keymap */ - wlr_keyboard_set_keymap(keyboard, kb_group->wlr_group->keyboard.keymap); - -+ wlr_keyboard_notify_modifiers(keyboard, 0, 0, locked_mods, 0); -+ - /* Add the new keyboard to the group */ - wlr_keyboard_group_add_keyboard(kb_group->wlr_group, keyboard); - } -@@ -957,6 +961,21 @@ createkeyboardgroup(void) - die("failed to compile keymap"); - - wlr_keyboard_set_keymap(&group->wlr_group->keyboard, keymap); -+ if (numlock) { -+ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM); -+ if (mod_index != XKB_MOD_INVALID) -+ locked_mods |= (uint32_t)1 << mod_index; -+ } -+ -+ if (capslock) { -+ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS); -+ if (mod_index != XKB_MOD_INVALID) -+ locked_mods |= (uint32_t)1 << mod_index; -+ } -+ -+ if (locked_mods) -+ wlr_keyboard_notify_modifiers(&group->wlr_group->keyboard, 0, 0, locked_mods, 0); -+ - xkb_keymap_unref(keymap); - xkb_context_unref(context); - --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/passthrough/README.md b/dwl-bak/dwl-patches/patches/passthrough/README.md deleted file mode 100644 index 0380951..0000000 --- a/dwl-bak/dwl-patches/patches/passthrough/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -allows pausing keybind handling - -also allows for bitcarrying-esque control of nested instances - -default keybind is Ctrl+Logo+Alt+Shift+Esc, can be customized in config.h - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/passthrough) -- [2024-06-26](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/passthrough/passthrough.patch) -- [2024-06-22](https://codeberg.org/dwl/dwl-patches/raw/commit/3f44fb23d8cb6c7d700f41525dc00493e392083c/patches/passthrough/passthrough.patch) -### Authors -- [notchoc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/passthrough/passthrough.patch b/dwl-bak/dwl-patches/patches/passthrough/passthrough.patch deleted file mode 100644 index d87f00e..0000000 --- a/dwl-bak/dwl-patches/patches/passthrough/passthrough.patch +++ /dev/null @@ -1,82 +0,0 @@ -From cd67c8386b0188daa15348c1d0d99187a556e461 Mon Sep 17 00:00:00 2001 -From: choc -Date: Mon, 2 Jan 2023 13:00:29 +0800 -Subject: [PATCH] passthrough: allow pausing keybind handling - -also allows for bitcarrying-esque control of nested instances ---- - config.def.h | 4 ++++ - dwl.c | 14 ++++++++++++++ - 2 files changed, 18 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 646a3d6..2d14e2a 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,9 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+/* passthrough */ -+static int passthrough = 0; -+ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - /* examples: */ -@@ -156,6 +159,7 @@ static const Key keys[] = { - TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), - TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), - TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), -+ { WLR_MODIFIER_ALT|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, XKB_KEY_Escape, togglepassthrough, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ -diff --git a/dwl.c b/dwl.c -index 9fb50a7..a1c65b4 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -339,6 +339,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglepassthrough(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -620,6 +621,11 @@ buttonpress(struct wl_listener *listener, void *data) - for (b = buttons; b < END(buttons); b++) { - if (CLEANMASK(mods) == CLEANMASK(b->mod) && - event->button == b->button && b->func) { -+ if (passthrough) { -+ if (b->func != togglepassthrough) continue; -+ b->func(&b->arg); -+ break; -+ } - b->func(&b->arg); - return; - } -@@ -1509,6 +1515,8 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) - && sym == k->keysym && k->func) { -+ if (passthrough && k->func != togglepassthrough) -+ continue; - k->func(&k->arg); - return 1; - } -@@ -2677,6 +2685,12 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglepassthrough(const Arg *arg) -+{ -+ passthrough = !passthrough; -+} -+ - void - toggletag(const Arg *arg) - { --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/perinputconfig/README.md b/dwl-bak/dwl-patches/patches/perinputconfig/README.md deleted file mode 100644 index ab1602c..0000000 --- a/dwl-bak/dwl-patches/patches/perinputconfig/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### Description -Replace the singular keyboard and pointer input configuration with an array allowing to set different variables matching by name. - -Tip to find the names: Grep for `device_name` and add a line after it to print to stdout. Then run EX: `dwl > /tmp/print_device_names.log`, exit dwl, and should see the names. - -### Download -- [git branch](https://codeberg.org/nullsystem/dwl/src/branch/main_perinputconfig) -- [2024-06-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/perinputconfig/perinputconfig.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/perinputconfig/perinputconfig-v0.5.patch) - -### Authors -- [nullsystem](https://codeberg.org/nullsystem) diff --git a/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch b/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch deleted file mode 100644 index 25a2a92..0000000 --- a/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch +++ /dev/null @@ -1,173 +0,0 @@ -From 9388faea3c4648aa99c01b9e4ce9287237b28b38 Mon Sep 17 00:00:00 2001 -From: nullsystem -Date: Mon, 1 Apr 2024 21:23:39 +0100 -Subject: [PATCH] Backport perinputconfig to v0.5 - -- Array replaced singular variables for configuration -- Only applies to enable-state, acceleration profile, and speed -- Like EX: Rules, requires NULL/default set at the end -- Keyboards can now also set by name ---- - config.def.h | 37 +++++++++++++++++++++++-------------- - dwl.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- - 2 files changed, 69 insertions(+), 17 deletions(-) - -diff --git a/config.def.h b/config.def.h -index db0babc..861a937 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -46,12 +46,13 @@ static const MonitorRule monrules[] = { - }; - - /* keyboard */ --static const struct xkb_rule_names xkb_rules = { -- /* can specify fields: rules, model, layout, variant, options */ -+/* NOTE: Always include a fallback rule at the end (name as NULL) */ -+static const KeyboardRule kbrules[] = { -+ /* name rules model layout variant options */ - /* example: -- .options = "ctrl:nocaps", -+ { "keyboard", NULL, NULL, "us,de", NULL, "ctrl:nocaps" }, - */ -- .options = NULL, -+ { NULL, NULL, NULL, NULL, NULL, NULL }, - }; - - static const int repeat_rate = 25; -@@ -81,23 +82,31 @@ LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER - static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; - - /* You can choose between: -+LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle -+LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right -+*/ -+static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; -+ -+/* -+send_events_mode: You can choose between: - LIBINPUT_CONFIG_SEND_EVENTS_ENABLED - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE --*/ --static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; - --/* You can choose between: -+accel_profile: You can choose between: - LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT - LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE -+ -+NOTE: Always include a fallback rule at the end (name as NULL) - */ --static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; --static const double accel_speed = 0.0; --/* You can choose between: --LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle --LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right --*/ --static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; -+static const InputRule inputrules[] = { -+ /* name send_events_mode accel_profile accel_speed*/ -+ /* examples: -+ { "SynPS/2 Synaptics TouchPad", LIBINPUT_CONFIG_SEND_EVENTS_DISABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 }, -+ { "TPPS/2 IBM TrackPoint", LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE, 0.0 }, -+ */ -+ { NULL, LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 }, -+}; - - /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ - #define MODKEY WLR_MODIFIER_ALT -diff --git a/dwl.c b/dwl.c -index ef27a1d..a35f480 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -226,6 +226,22 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+typedef struct { -+ const char *name; -+ uint32_t send_events_mode; -+ enum libinput_config_accel_profile accel_profile; -+ double accel_speed; -+} InputRule; -+ -+typedef struct { -+ const char *name; -+ const char *rules; -+ const char *model; -+ const char *layout; -+ const char *variant; -+ const char *options; -+} KeyboardRule; -+ - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -766,11 +782,31 @@ createidleinhibitor(struct wl_listener *listener, void *data) - void - createkeyboard(struct wlr_keyboard *keyboard) - { -+ struct xkb_rule_names xkb_rules; -+ struct libinput_device *libinput_device = NULL; - struct xkb_context *context; - struct xkb_keymap *keymap; -+ const KeyboardRule *krule = NULL; -+ const char *device_name = ""; - Keyboard *kb = keyboard->data = ecalloc(1, sizeof(*kb)); - kb->wlr_keyboard = keyboard; - -+ if (wlr_input_device_is_libinput(&keyboard->base) -+ && (libinput_device = wlr_libinput_get_device_handle(&keyboard->base))) { -+ device_name = libinput_device_get_name(libinput_device); -+ } -+ for (krule = kbrules; krule < END(kbrules); krule++) { -+ if (!krule->name || strstr(device_name, krule->name)) -+ break; -+ } -+ if (krule) { -+ xkb_rules.rules = krule->rules; -+ xkb_rules.model = krule->model; -+ xkb_rules.layout = krule->layout; -+ xkb_rules.variant = krule->variant; -+ xkb_rules.options = krule->options; -+ } -+ - /* Prepare an XKB keymap and assign it to the keyboard. */ - context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - keymap = xkb_keymap_new_from_names(context, &xkb_rules, -@@ -989,10 +1025,17 @@ createnotify(struct wl_listener *listener, void *data) - void - createpointer(struct wlr_pointer *pointer) - { -+ const InputRule *irule; - if (wlr_input_device_is_libinput(&pointer->base)) { - struct libinput_device *libinput_device = (struct libinput_device*) - wlr_libinput_get_device_handle(&pointer->base); - -+ const char *device_name = libinput_device_get_name(libinput_device); -+ for (irule = inputrules; irule < END(inputrules); irule++) { -+ if (!irule->name || strstr(device_name, irule->name)) -+ break; -+ } -+ - if (libinput_device_config_tap_get_finger_count(libinput_device)) { - libinput_device_config_tap_set_enabled(libinput_device, tap_to_click); - libinput_device_config_tap_set_drag_enabled(libinput_device, tap_and_drag); -@@ -1019,11 +1062,11 @@ createpointer(struct wlr_pointer *pointer) - libinput_device_config_click_set_method (libinput_device, click_method); - - if (libinput_device_config_send_events_get_modes(libinput_device)) -- libinput_device_config_send_events_set_mode(libinput_device, send_events_mode); -+ libinput_device_config_send_events_set_mode(libinput_device, irule->send_events_mode); - - if (libinput_device_config_accel_is_available(libinput_device)) { -- libinput_device_config_accel_set_profile(libinput_device, accel_profile); -- libinput_device_config_accel_set_speed(libinput_device, accel_speed); -+ libinput_device_config_accel_set_profile(libinput_device, irule->accel_profile); -+ libinput_device_config_accel_set_speed(libinput_device, irule->accel_speed); - } - } - --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig.patch b/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig.patch deleted file mode 100644 index dae4bc8..0000000 --- a/dwl-bak/dwl-patches/patches/perinputconfig/perinputconfig.patch +++ /dev/null @@ -1,295 +0,0 @@ -From c268707811fb5d8244115f23a0430f024e4e11a9 Mon Sep 17 00:00:00 2001 -From: nullsystem -Date: Sat, 8 Jun 2024 11:30:34 +0100 -Subject: [PATCH] perinputconfig - 2024-06-08 Update - -* Array replaced singular variables for configuration -* Only applies to enable-state, acceleration profile, and speed -* Like EX: Rules, requires NULL/default set at the end -* Keyboards can now also set by name ---- - config.def.h | 36 +++++++++++++--------- - dwl.c | 87 +++++++++++++++++++++++++++++++++++++++++++--------- - 2 files changed, 95 insertions(+), 28 deletions(-) - -diff --git a/config.def.h b/config.def.h -index a784eb4..c733137 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -49,12 +49,13 @@ static const MonitorRule monrules[] = { - }; - - /* keyboard */ --static const struct xkb_rule_names xkb_rules = { -- /* can specify fields: rules, model, layout, variant, options */ -+/* NOTE: Always include a fallback rule at the end (name as NULL) */ -+static const KeyboardRule kbrules[] = { -+ /* name rules model layout variant options */ - /* example: -- .options = "ctrl:nocaps", -+ { "keyboard", NULL, NULL, "us,de", NULL, "ctrl:nocaps" }, - */ -- .options = NULL, -+ { NULL, NULL, NULL, NULL, NULL, NULL }, - }; - - static const int repeat_rate = 25; -@@ -84,24 +85,31 @@ LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER - static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; - - /* You can choose between: -+LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle -+LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right -+*/ -+static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; -+ -+/* -+send_events_mode: You can choose between: - LIBINPUT_CONFIG_SEND_EVENTS_ENABLED - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE --*/ --static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; - --/* You can choose between: -+accel_profile: You can choose between: - LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT - LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE --*/ --static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; --static const double accel_speed = 0.0; - --/* You can choose between: --LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle --LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right -+NOTE: Always include a fallback rule at the end (name as NULL) - */ --static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; -+static const InputRule inputrules[] = { -+ /* name send_events_mode accel_profile accel_speed*/ -+ /* examples: -+ { "SynPS/2 Synaptics TouchPad", LIBINPUT_CONFIG_SEND_EVENTS_DISABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 }, -+ { "TPPS/2 IBM TrackPoint", LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE, 0.0 }, -+ */ -+ { NULL, LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 }, -+}; - - /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ - #define MODKEY WLR_MODIFIER_ALT -diff --git a/dwl.c b/dwl.c -index 6f041a0..0673a05 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -240,6 +240,22 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+typedef struct { -+ const char *name; -+ uint32_t send_events_mode; -+ enum libinput_config_accel_profile accel_profile; -+ double accel_speed; -+} InputRule; -+ -+typedef struct { -+ const char *name; -+ const char *rules; -+ const char *model; -+ const char *layout; -+ const char *variant; -+ const char *options; -+} KeyboardRule; -+ - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -259,7 +275,7 @@ static void commitnotify(struct wl_listener *listener, void *data); - static void createdecoration(struct wl_listener *listener, void *data); - static void createidleinhibitor(struct wl_listener *listener, void *data); - static void createkeyboard(struct wlr_keyboard *keyboard); --static KeyboardGroup *createkeyboardgroup(void); -+static KeyboardGroup *createkeyboardgroup(struct xkb_rule_names *new_xkb_rules); - static void createlayersurface(struct wl_listener *listener, void *data); - static void createlocksurface(struct wl_listener *listener, void *data); - static void createmon(struct wl_listener *listener, void *data); -@@ -396,7 +412,7 @@ static struct wlr_session_lock_v1 *cur_lock; - static struct wl_listener lock_listener = {.notify = locksession}; - - static struct wlr_seat *seat; --static KeyboardGroup *kb_group; -+static struct wl_list kb_groups; - static struct wlr_surface *held_grab; - static unsigned int cursor_mode; - static Client *grabc; -@@ -671,6 +687,8 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ KeyboardGroup *kb_group; -+ - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; -@@ -683,7 +701,8 @@ cleanup(void) - wlr_xcursor_manager_destroy(cursor_mgr); - wlr_output_layout_destroy(output_layout); - -- destroykeyboardgroup(&kb_group->destroy, NULL); -+ wl_list_for_each(kb_group, &kb_groups, link) -+ destroykeyboardgroup(&kb_group->destroy, NULL); - - wl_display_destroy(dpy); - /* Destroy after the wayland display (when the monitors are already destroyed) -@@ -803,6 +822,30 @@ createidleinhibitor(struct wl_listener *listener, void *data) - void - createkeyboard(struct wlr_keyboard *keyboard) - { -+ KeyboardGroup *kb_group; -+ const char *device_name = ""; -+ const KeyboardRule *krule = NULL; -+ struct libinput_device *device = NULL; -+ -+ if (wlr_input_device_is_libinput(&keyboard->base) -+ && (device = wlr_libinput_get_device_handle(&keyboard->base))) { -+ device_name = libinput_device_get_name(device); -+ } -+ for (krule = kbrules; krule < END(kbrules); krule++) { -+ if (!krule->name || strstr(device_name, krule->name)) -+ break; -+ } -+ if (krule) { -+ struct xkb_rule_names xkb_rules; -+ xkb_rules.rules = krule->rules; -+ xkb_rules.model = krule->model; -+ xkb_rules.layout = krule->layout; -+ xkb_rules.variant = krule->variant; -+ xkb_rules.options = krule->options; -+ kb_group = createkeyboardgroup(&xkb_rules); -+ } else -+ wl_list_for_each(kb_group, &kb_groups, link); -+ - /* Set the keymap to match the group keymap */ - wlr_keyboard_set_keymap(keyboard, kb_group->wlr_group->keyboard.keymap); - -@@ -811,11 +854,16 @@ createkeyboard(struct wlr_keyboard *keyboard) - } - - KeyboardGroup * --createkeyboardgroup(void) -+createkeyboardgroup(struct xkb_rule_names *new_xkb_rules) - { - KeyboardGroup *group = ecalloc(1, sizeof(*group)); - struct xkb_context *context; - struct xkb_keymap *keymap; -+ struct xkb_rule_names xkb_rules; -+ -+ memset(&xkb_rules, 0, sizeof(struct xkb_rule_names)); -+ if (new_xkb_rules) -+ xkb_rules = *new_xkb_rules; - - group->wlr_group = wlr_keyboard_group_create(); - group->wlr_group->data = group; -@@ -845,6 +893,9 @@ createkeyboardgroup(void) - * all of them. Set this combined wlr_keyboard as the seat keyboard. - */ - wlr_seat_set_keyboard(seat, &group->wlr_group->keyboard); -+ -+ wl_list_init(&group->destroy.link); -+ wl_list_insert(&kb_groups, &group->link); - return group; - } - -@@ -1042,9 +1093,15 @@ createnotify(struct wl_listener *listener, void *data) - void - createpointer(struct wlr_pointer *pointer) - { -+ const InputRule *irule; - struct libinput_device *device; - if (wlr_input_device_is_libinput(&pointer->base) - && (device = wlr_libinput_get_device_handle(&pointer->base))) { -+ const char *device_name = libinput_device_get_name(device); -+ for (irule = inputrules; irule < END(inputrules); irule++) { -+ if (!irule->name || strstr(device_name, irule->name)) -+ break; -+ } - - if (libinput_device_config_tap_get_finger_count(device)) { - libinput_device_config_tap_set_enabled(device, tap_to_click); -@@ -1072,11 +1129,11 @@ createpointer(struct wlr_pointer *pointer) - libinput_device_config_click_set_method (device, click_method); - - if (libinput_device_config_send_events_get_modes(device)) -- libinput_device_config_send_events_set_mode(device, send_events_mode); -+ libinput_device_config_send_events_set_mode(device, irule->send_events_mode); - - if (libinput_device_config_accel_is_available(device)) { -- libinput_device_config_accel_set_profile(device, accel_profile); -- libinput_device_config_accel_set_speed(device, accel_speed); -+ libinput_device_config_accel_set_profile(device, irule->accel_profile); -+ libinput_device_config_accel_set_speed(device, irule->accel_speed); - } - } - -@@ -1277,7 +1334,6 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - wl_list_remove(&group->key.link); - wl_list_remove(&group->modifiers.link); - wl_list_remove(&group->destroy.link); -- free(group); - } - - Monitor * -@@ -1467,6 +1523,7 @@ inputdevice(struct wl_listener *listener, void *data) - * available. */ - struct wlr_input_device *device = data; - uint32_t caps; -+ KeyboardGroup *group; - - switch (device->type) { - case WLR_INPUT_DEVICE_KEYBOARD: -@@ -1485,8 +1542,11 @@ inputdevice(struct wl_listener *listener, void *data) - * there are no pointer devices, so we always include that capability. */ - /* TODO do we actually require a cursor? */ - caps = WL_SEAT_CAPABILITY_POINTER; -- if (!wl_list_empty(&kb_group->wlr_group->devices)) -- caps |= WL_SEAT_CAPABILITY_KEYBOARD; -+ wl_list_for_each(group, &kb_groups, link) -+ if (!wl_list_empty(&group->wlr_group->devices)) { -+ caps |= WL_SEAT_CAPABILITY_KEYBOARD; -+ break; -+ } - wlr_seat_set_capabilities(seat, caps); - } - -@@ -2431,6 +2491,7 @@ setup(void) - */ - wl_list_init(&clients); - wl_list_init(&fstack); -+ wl_list_init(&kb_groups); - - xdg_shell = wlr_xdg_shell_create(dpy, 6); - LISTEN_STATIC(&xdg_shell->events.new_surface, createnotify); -@@ -2514,8 +2575,7 @@ setup(void) - LISTEN_STATIC(&seat->events.request_start_drag, requeststartdrag); - LISTEN_STATIC(&seat->events.start_drag, startdrag); - -- kb_group = createkeyboardgroup(); -- wl_list_init(&kb_group->destroy.link); -+ createkeyboardgroup(NULL); - - output_mgr = wlr_output_manager_v1_create(dpy); - LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply); -@@ -2857,10 +2917,9 @@ virtualkeyboard(struct wl_listener *listener, void *data) - { - struct wlr_virtual_keyboard_v1 *kb = data; - /* virtual keyboards shouldn't share keyboard group */ -- KeyboardGroup *group = createkeyboardgroup(); -+ KeyboardGroup *group = createkeyboardgroup(NULL); - /* Set the keymap to match the group keymap */ - wlr_keyboard_set_keymap(&kb->keyboard, group->wlr_group->keyboard.keymap); -- LISTEN(&kb->keyboard.base.events.destroy, &group->destroy, destroykeyboardgroup); - - /* Add the new keyboard to the group */ - wlr_keyboard_group_add_keyboard(group->wlr_group, &kb->keyboard); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/pertag/README.md b/dwl-bak/dwl-patches/patches/pertag/README.md deleted file mode 100644 index 7473da0..0000000 --- a/dwl-bak/dwl-patches/patches/pertag/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### Description -Makes layout, mwfact and nmaster individual for every tag. - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.6/pertag) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/commit/65ea99519bbf7a52f48932aea7385f81f8b30867/patches/pertag/pertag.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/bf098459219e7a473d8edb4c0435aeb6a4b82e38/pertag/pertag.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/3f9a58cde9e3aa02991b3e5a22d371b153cb1459/pertag/pertag.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [Guido Cella](https://github.com/guidocella) diff --git a/dwl-bak/dwl-patches/patches/pertag/pertag.patch b/dwl-bak/dwl-patches/patches/pertag/pertag.patch deleted file mode 100644 index 971732a..0000000 --- a/dwl-bak/dwl-patches/patches/pertag/pertag.patch +++ /dev/null @@ -1,170 +0,0 @@ -From d3b551ffe3ec85e16341962e322150b81af6722f Mon Sep 17 00:00:00 2001 -From: wochap -Date: Wed, 31 Jul 2024 08:27:26 -0500 -Subject: [PATCH] makes layout, mwfact and nmaster individual for every tag - -inspiration: https://github.com/djpohly/dwl/wiki/pertag ---- - dwl.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 70 insertions(+), 5 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 145fd01..2f364bc 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -102,6 +102,7 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct Pertag Pertag; - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -199,6 +200,7 @@ struct Monitor { - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -+ Pertag *pertag; - unsigned int seltags; - unsigned int sellt; - uint32_t tagset[2]; -@@ -427,6 +429,14 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[TAGCOUNT + 1]; /* number of windows in master area */ -+ float mfacts[TAGCOUNT + 1]; /* mfacts per tag */ -+ unsigned int sellts[TAGCOUNT + 1]; /* selected layouts */ -+ const Layout *ltidxs[TAGCOUNT + 1][2]; /* matrix of tags and layouts indexes */ -+}; -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -712,6 +722,7 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); - -+ free(m->pertag); - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); - free(m); -@@ -983,6 +994,18 @@ createmon(struct wl_listener *listener, void *data) - wl_list_insert(&mons, &m->link); - printstatus(); - -+ m->pertag = calloc(1, sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ -+ for (i = 0; i <= TAGCOUNT; i++) { -+ m->pertag->nmasters[i] = m->nmaster; -+ m->pertag->mfacts[i] = m->mfact; -+ -+ m->pertag->ltidxs[i][0] = m->lt[0]; -+ m->pertag->ltidxs[i][1] = m->lt[1]; -+ m->pertag->sellts[i] = m->sellt; -+ } -+ - /* The xdg-protocol specifies: - * - * If the fullscreened surface is not opaque, the compositor must make -@@ -1472,7 +1495,7 @@ incnmaster(const Arg *arg) - { - if (!arg || !selmon) - return; -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -2305,9 +2328,9 @@ setlayout(const Arg *arg) - if (!selmon) - return; - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); - printstatus(); -@@ -2324,7 +2347,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0f ? arg->f + selmon->mfact : arg->f - 1.0f; - if (f < 0.1 || f > 0.9) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -2701,9 +2724,29 @@ void - toggleview(const Arg *arg) - { - uint32_t newtagset; -+ size_t i; - if (!(newtagset = selmon ? selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK) : 0)) - return; - -+ if (newtagset == (uint32_t)~0) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = 0; -+ } -+ -+ /* test if the user did not select the same tag */ -+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ for (i = 0; !(newtagset & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ -+ /* apply settings for this view */ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ - selmon->tagset[selmon->seltags] = newtagset; - focusclient(focustop(selmon), 1); - arrange(selmon); -@@ -2892,11 +2935,33 @@ urgent(struct wl_listener *listener, void *data) - void - view(const Arg *arg) - { -+ size_t i, tmptag; -+ - if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & ~0) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ -+ if (arg->ui == TAGMASK) -+ selmon->pertag->curtag = 0; -+ else { -+ for (i = 0; !(arg->ui & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ } else { -+ tmptag = selmon->pertag->prevtag; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = tmptag; -+ } -+ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/README.md b/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/README.md deleted file mode 100644 index 3ca5432..0000000 --- a/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/README.md +++ /dev/null @@ -1,16 +0,0 @@ -### Description -Forward the following events to client: -swipe_begin, swipe_update, swipe_end, pinch_begin, pinch_update and pinch_end - -This patch allows you to pinch zoom in Chrome, for example. In combination with the following patches [gestures](https://codeberg.org/dwl/dwl-patches/wiki/gestures) and [shiftview](https://codeberg.org/dwl/dwl-patches/wiki/shiftview), it would allow you to switch workspaces by performing a 3-finger swipe on your touchpad. - - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/pointer-gestures-unstable-v1) -- [2024-07-12](https://codeberg.org/dwl/dwl-patches/raw/commit/05dbce217b676e989b0fc9e0eecf83b386ac9e07/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/2322f3efeae8da44227e0acc760ffd3dea153716/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/c676de59d51e613bd52ac46c77a24b1cac9a61a1/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/fc4146f3068dcd46035a2a11fe9d6109a97ae6d6/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch b/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch deleted file mode 100644 index f76648a..0000000 --- a/dwl-bak/dwl-patches/patches/pointer-gestures-unstable-v1/pointer-gestures-unstable-v1.patch +++ /dev/null @@ -1,186 +0,0 @@ -From be7e98d28fc59aab67026e7d5efdcaeb26029713 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 12 Jul 2024 11:30:17 -0500 -Subject: [PATCH] implement pointer-gestures-unstable-v1 - ---- - dwl.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 136 insertions(+) - -diff --git a/dwl.c b/dwl.c -index dc0437e..e5805b1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -250,6 +251,14 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); -+static void swipe_begin(struct wl_listener *listener, void *data); -+static void swipe_update(struct wl_listener *listener, void *data); -+static void swipe_end(struct wl_listener *listener, void *data); -+static void pinch_begin(struct wl_listener *listener, void *data); -+static void pinch_update(struct wl_listener *listener, void *data); -+static void pinch_end(struct wl_listener *listener, void *data); -+static void hold_begin(struct wl_listener *listener, void *data); -+static void hold_end(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); - static void cleanup(void); -@@ -383,6 +392,7 @@ static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr; - static struct wlr_virtual_pointer_manager_v1 *virtual_pointer_mgr; - static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr; - static struct wlr_output_power_manager_v1 *power_mgr; -+static struct wlr_pointer_gestures_v1 *pointer_gestures; - - static struct wlr_pointer_constraints_v1 *pointer_constraints; - static struct wlr_relative_pointer_manager_v1 *relative_pointer_mgr; -@@ -644,6 +654,122 @@ buttonpress(struct wl_listener *listener, void *data) - event->time_msec, event->button, event->state); - } - -+void -+swipe_begin(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_swipe_begin_event *event = data; -+ -+ // Forward swipe begin event to client -+ wlr_pointer_gestures_v1_send_swipe_begin( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->fingers -+ ); -+} -+ -+void -+swipe_update(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_swipe_update_event *event = data; -+ -+ // Forward swipe update event to client -+ wlr_pointer_gestures_v1_send_swipe_update( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->dx, -+ event->dy -+ ); -+} -+ -+void -+swipe_end(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_swipe_end_event *event = data; -+ -+ // Forward swipe end event to client -+ wlr_pointer_gestures_v1_send_swipe_end( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->cancelled -+ ); -+} -+ -+void -+pinch_begin(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_pinch_begin_event *event = data; -+ -+ // Forward pinch begin event to client -+ wlr_pointer_gestures_v1_send_pinch_begin( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->fingers -+ ); -+} -+ -+void -+pinch_update(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_pinch_update_event *event = data; -+ -+ // Forward pinch update event to client -+ wlr_pointer_gestures_v1_send_pinch_update( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->dx, -+ event->dy, -+ event->scale, -+ event->rotation -+ ); -+} -+ -+void -+pinch_end(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_pinch_end_event *event = data; -+ -+ // Forward pinch end event to client -+ wlr_pointer_gestures_v1_send_pinch_end( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->cancelled -+ ); -+} -+ -+void -+hold_begin(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_hold_begin_event *event = data; -+ -+ // Forward hold begin event to client -+ wlr_pointer_gestures_v1_send_hold_begin( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->fingers -+ ); -+} -+ -+void -+hold_end(struct wl_listener *listener, void *data) -+{ -+ struct wlr_pointer_hold_end_event *event = data; -+ -+ // Forward hold end event to client -+ wlr_pointer_gestures_v1_send_hold_end( -+ pointer_gestures, -+ seat, -+ event->time_msec, -+ event->cancelled -+ ); -+} -+ - void - chvt(const Arg *arg) - { -@@ -2556,6 +2682,16 @@ setup(void) - virtual_pointer_mgr = wlr_virtual_pointer_manager_v1_create(dpy); - LISTEN_STATIC(&virtual_pointer_mgr->events.new_virtual_pointer, virtualpointer); - -+ pointer_gestures = wlr_pointer_gestures_v1_create(dpy); -+ LISTEN_STATIC(&cursor->events.swipe_begin, swipe_begin); -+ LISTEN_STATIC(&cursor->events.swipe_update, swipe_update); -+ LISTEN_STATIC(&cursor->events.swipe_end, swipe_end); -+ LISTEN_STATIC(&cursor->events.pinch_begin, pinch_begin); -+ LISTEN_STATIC(&cursor->events.pinch_update, pinch_update); -+ LISTEN_STATIC(&cursor->events.pinch_end, pinch_end); -+ LISTEN_STATIC(&cursor->events.hold_begin, hold_begin); -+ LISTEN_STATIC(&cursor->events.hold_end, hold_end); -+ - seat = wlr_seat_create(dpy, "seat0"); - LISTEN_STATIC(&seat->events.request_set_cursor, setcursor); - LISTEN_STATIC(&seat->events.request_set_selection, setsel); --- -2.45.1 diff --git a/dwl-bak/dwl-patches/patches/primaryselection/README.md b/dwl-bak/dwl-patches/patches/primaryselection/README.md deleted file mode 100644 index 1154452..0000000 --- a/dwl-bak/dwl-patches/patches/primaryselection/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Adds a config option to disable/enable primary selection (middle-click paste). - -### Download -- [git branch](https://codeberg.org/nullsystem/dwl/src/branch/main_primaryselection) -- [2024-04-06](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/primaryselection/primaryselection.patch) - -### Authors -- [nullsystem](https://codeberg.org/nullsystem) -- [Palanix](https://github.com/PalanixYT) - Previous Primary-Selection patch diff --git a/dwl-bak/dwl-patches/patches/primaryselection/primaryselection.patch b/dwl-bak/dwl-patches/patches/primaryselection/primaryselection.patch deleted file mode 100644 index ab6bb64..0000000 --- a/dwl-bak/dwl-patches/patches/primaryselection/primaryselection.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 4fc77fde2f6015564544e029f9905fc1678fcb59 Mon Sep 17 00:00:00 2001 -From: nullsystem -Date: Sat, 6 Apr 2024 14:19:44 +0100 -Subject: [PATCH] primaryselection - disable/enable primary selection - -* Just simply adds a config to disable/enable primary selection ---- - config.def.h | 1 + - dwl.c | 6 ++++-- - 2 files changed, 5 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 8847e58..057e1c3 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -66,6 +66,7 @@ static const int natural_scrolling = 0; - static const int disable_while_typing = 1; - static const int left_handed = 0; - static const int middle_button_emulation = 0; -+static const int enable_primary_selection = 0; - /* You can choose between: - LIBINPUT_CONFIG_SCROLL_NO_SCROLL - LIBINPUT_CONFIG_SCROLL_2FG -diff --git a/dwl.c b/dwl.c -index bf763df..7e8d8f2 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2339,7 +2339,8 @@ setup(void) - wlr_export_dmabuf_manager_v1_create(dpy); - wlr_screencopy_manager_v1_create(dpy); - wlr_data_control_manager_v1_create(dpy); -- wlr_primary_selection_v1_device_manager_create(dpy); -+ if (enable_primary_selection) -+ wlr_primary_selection_v1_device_manager_create(dpy); - wlr_viewporter_create(dpy); - wlr_single_pixel_buffer_manager_v1_create(dpy); - wlr_fractional_scale_manager_v1_create(dpy, 1); -@@ -2449,7 +2450,8 @@ setup(void) - seat = wlr_seat_create(dpy, "seat0"); - LISTEN_STATIC(&seat->events.request_set_cursor, setcursor); - LISTEN_STATIC(&seat->events.request_set_selection, setsel); -- LISTEN_STATIC(&seat->events.request_set_primary_selection, setpsel); -+ if (enable_primary_selection) -+ LISTEN_STATIC(&seat->events.request_set_primary_selection, setpsel); - LISTEN_STATIC(&seat->events.request_start_drag, requeststartdrag); - LISTEN_STATIC(&seat->events.start_drag, startdrag); - --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/push/README.md b/dwl-bak/dwl-patches/patches/push/README.md deleted file mode 100644 index 5582bfd..0000000 --- a/dwl-bak/dwl-patches/patches/push/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Adds functions `pushup` and `pushdown` to move windows within the tiling order. - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/push) -- [2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/push/push.patch) -- [push-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/push/push-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) -- [Devin J. Pohly](https://github.com/djpohly) diff --git a/dwl-bak/dwl-patches/patches/push/push-0.7.patch b/dwl-bak/dwl-patches/patches/push/push-0.7.patch deleted file mode 100644 index 4afad97..0000000 --- a/dwl-bak/dwl-patches/patches/push/push-0.7.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 01290daca2b01131c5c022389afd0b593b4707eb Mon Sep 17 00:00:00 2001 -From: "Devin J. Pohly" -Date: Thu, 4 Mar 2021 00:45:50 -0600 -Subject: [PATCH] port dwm "push" patch to dwl -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - Makefile | 2 +- - dwl.c | 2 ++ - push.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - push.h | 4 ++++ - 4 files changed, 70 insertions(+), 1 deletion(-) - create mode 100644 push.c - create mode 100644 push.h - -diff --git a/Makefile b/Makefile -index 3358bae9..87bf3160 100644 ---- a/Makefile -+++ b/Makefile -@@ -19,7 +19,7 @@ LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - all: dwl - dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ --dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ -+dwl.o: dwl.c client.h config.h config.mk push.h cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h - util.o: util.c util.h -diff --git a/dwl.c b/dwl.c -index a2711f67..c3d78aa3 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -427,7 +427,9 @@ static xcb_atom_t netatom[NetLast]; - #endif - - /* configuration, allows nested code to access above variables */ -+#include "push.h" - #include "config.h" -+#include "push.c" - - /* attempt to encapsulate suck into one file */ - #include "client.h" -diff --git a/push.c b/push.c -new file mode 100644 -index 00000000..323c317e ---- /dev/null -+++ b/push.c -@@ -0,0 +1,63 @@ -+static Client * -+nexttiled(Client *sel) { -+ Client *c; -+ wl_list_for_each(c, &sel->link, link) { -+ if (&c->link == &clients) -+ break; /* don't wrap */ -+ if (!c->isfloating && VISIBLEON(c, selmon)) -+ return c; -+ } -+ return NULL; -+} -+ -+static Client * -+prevtiled(Client *sel) { -+ Client *c; -+ wl_list_for_each_reverse(c, &sel->link, link) { -+ if (&c->link == &clients) -+ break; /* don't wrap */ -+ if (!c->isfloating && VISIBLEON(c, selmon)) -+ return c; -+ } -+ return NULL; -+} -+ -+static void -+pushup(const Arg *arg) { -+ Client *sel = focustop(selmon); -+ Client *c; -+ -+ if(!sel || sel->isfloating) -+ return; -+ if((c = prevtiled(sel))) { -+ /* attach before c */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(c->link.prev, &sel->link); -+ } else { -+ /* move to the end */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(clients.prev, &sel->link); -+ } -+ focusclient(sel, 1); -+ arrange(selmon); -+} -+ -+static void -+pushdown(const Arg *arg) { -+ Client *sel = focustop(selmon); -+ Client *c; -+ -+ if(!sel || sel->isfloating) -+ return; -+ if((c = nexttiled(sel))) { -+ /* attach after c */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(&c->link, &sel->link); -+ } else { -+ /* move to the front */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(&clients, &sel->link); -+ } -+ focusclient(sel, 1); -+ arrange(selmon); -+} -diff --git a/push.h b/push.h -new file mode 100644 -index 00000000..59c0f80e ---- /dev/null -+++ b/push.h -@@ -0,0 +1,4 @@ -+static Client *nexttiled(Client *sel); -+static Client *prevtiled(Client *sel); -+static void pushdown(const Arg *arg); -+static void pushup(const Arg *arg); --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/push/push.patch b/dwl-bak/dwl-patches/patches/push/push.patch deleted file mode 100644 index 5f6cba9..0000000 --- a/dwl-bak/dwl-patches/patches/push/push.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 06d86c26da60e4196ec3c5228b04c66ac042a1f8 Mon Sep 17 00:00:00 2001 -From: "Devin J. Pohly" -Date: Thu, 4 Mar 2021 00:45:50 -0600 -Subject: [PATCH] port dwm "push" patch to dwl -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - Makefile | 2 +- - dwl.c | 2 ++ - push.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - push.h | 4 ++++ - 4 files changed, 70 insertions(+), 1 deletion(-) - create mode 100644 push.c - create mode 100644 push.h - -diff --git a/Makefile b/Makefile -index 578194f2..f919a61e 100644 ---- a/Makefile -+++ b/Makefile -@@ -19,7 +19,7 @@ LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS) - all: dwl - dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ --dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ -+dwl.o: dwl.c client.h config.h config.mk push.h cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h - util.o: util.c util.h -diff --git a/dwl.c b/dwl.c -index ad21e1ba..69753921 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -450,7 +450,9 @@ static struct wlr_xwayland *xwayland; - #endif - - /* configuration, allows nested code to access above variables */ -+#include "push.h" - #include "config.h" -+#include "push.c" - - /* attempt to encapsulate suck into one file */ - #include "client.h" -diff --git a/push.c b/push.c -new file mode 100644 -index 00000000..323c317e ---- /dev/null -+++ b/push.c -@@ -0,0 +1,63 @@ -+static Client * -+nexttiled(Client *sel) { -+ Client *c; -+ wl_list_for_each(c, &sel->link, link) { -+ if (&c->link == &clients) -+ break; /* don't wrap */ -+ if (!c->isfloating && VISIBLEON(c, selmon)) -+ return c; -+ } -+ return NULL; -+} -+ -+static Client * -+prevtiled(Client *sel) { -+ Client *c; -+ wl_list_for_each_reverse(c, &sel->link, link) { -+ if (&c->link == &clients) -+ break; /* don't wrap */ -+ if (!c->isfloating && VISIBLEON(c, selmon)) -+ return c; -+ } -+ return NULL; -+} -+ -+static void -+pushup(const Arg *arg) { -+ Client *sel = focustop(selmon); -+ Client *c; -+ -+ if(!sel || sel->isfloating) -+ return; -+ if((c = prevtiled(sel))) { -+ /* attach before c */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(c->link.prev, &sel->link); -+ } else { -+ /* move to the end */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(clients.prev, &sel->link); -+ } -+ focusclient(sel, 1); -+ arrange(selmon); -+} -+ -+static void -+pushdown(const Arg *arg) { -+ Client *sel = focustop(selmon); -+ Client *c; -+ -+ if(!sel || sel->isfloating) -+ return; -+ if((c = nexttiled(sel))) { -+ /* attach after c */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(&c->link, &sel->link); -+ } else { -+ /* move to the front */ -+ wl_list_remove(&sel->link); -+ wl_list_insert(&clients, &sel->link); -+ } -+ focusclient(sel, 1); -+ arrange(selmon); -+} -diff --git a/push.h b/push.h -new file mode 100644 -index 00000000..59c0f80e ---- /dev/null -+++ b/push.h -@@ -0,0 +1,4 @@ -+static Client *nexttiled(Client *sel); -+static Client *prevtiled(Client *sel); -+static void pushdown(const Arg *arg); -+static void pushup(const Arg *arg); --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/regexrules/README.md b/dwl-bak/dwl-patches/patches/regexrules/README.md deleted file mode 100644 index 8c014b2..0000000 --- a/dwl-bak/dwl-patches/patches/regexrules/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Allows the use of regular expressions for window rules "app_id" and "title" - -```c -static const Rule rules[] = { - // ... - { "kitty-htop", NULL, 1 << 8, 0, -1 }, - { "^kitty$", NULL, 0, 0, -1 }, - // ... -}; -``` - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/regexrules) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/2a6560c167e5c9afc5598ac5431d23d90de8846c/regexrules/regexrules.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/98cba933c9f4099202e54f39acbf17e05bde828a/regexrules/regexrules.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/regexrules/regexrules.patch b/dwl-bak/dwl-patches/patches/regexrules/regexrules.patch deleted file mode 100644 index f7207d3..0000000 --- a/dwl-bak/dwl-patches/patches/regexrules/regexrules.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 7fed9449575b1e4f58d519d2f87b7e66e2056125 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Thu, 11 Apr 2024 12:45:47 -0500 -Subject: [PATCH] implement regex support in rules for app_id and title Enables - the use of regular expressions for window rules "app_id" and "title" - ---- - config.def.h | 1 + - dwl.c | 19 +++++++++++++++++-- - 2 files changed, 18 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 8847e58..89f5b60 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -25,6 +25,7 @@ static const Rule rules[] = { - /* examples: */ - { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "^kitty_EXAMPLE$", NULL, 0, 0, -1 }, - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index bf763df..fc185af 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -347,6 +348,7 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static int regex_match(const char *pattern, const char *str); - - /* variables */ - static const char broken[] = "broken"; -@@ -459,8 +461,8 @@ applyrules(Client *c) - title = broken; - - for (r = rules; r < END(rules); r++) { -- if ((!r->title || strstr(title, r->title)) -- && (!r->id || strstr(appid, r->id))) { -+ if ((!r->title || regex_match(r->title, title)) -+ && (!r->id || regex_match(r->id, appid))) { - c->isfloating = r->isfloating; - newtags |= r->tags; - i = 0; -@@ -2929,6 +2931,19 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+int -+regex_match(const char *pattern, const char *str) { -+ regex_t regex; -+ int reti; -+ if (regcomp(®ex, pattern, REG_EXTENDED) != 0) -+ return 0; -+ reti = regexec(®ex, str, (size_t)0, NULL, 0); -+ regfree(®ex); -+ if (reti == 0) -+ return 1; -+ return 0; -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.43.2 diff --git a/dwl-bak/dwl-patches/patches/regions/README.md b/dwl-bak/dwl-patches/patches/regions/README.md deleted file mode 100644 index 8b5679a..0000000 --- a/dwl-bak/dwl-patches/patches/regions/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -This patch will allow for a program to be used and have the current window regions on all monitors to be passed to the program as standard input. - -example is `grim -g "$(slurp)"` - -### Download -- [git branch](https://codeberg.org/sewn/dwl/src/branch/regions) -- [2024-02-14](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/regions/regions.patch) - -### Authors -- [sewn](https://github.com/apprehensions) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/regions/regions.patch b/dwl-bak/dwl-patches/patches/regions/regions.patch deleted file mode 100644 index 207c0bd..0000000 --- a/dwl-bak/dwl-patches/patches/regions/regions.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 9991f8bbf2e379dfca8eb356c03d3d20085255a8 Mon Sep 17 00:00:00 2001 -From: sewn -Date: Sun, 23 Jul 2023 08:13:52 +0300 -Subject: [PATCH] pass window regions to given program as stdin - ---- - config.def.h | 1 + - dwl.c | 28 ++++++++++++++++++++++++++++ - 2 files changed, 29 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9009517..79d0236 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -122,6 +122,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_r, regions, SHCMD("grim -g \"$(slurp)\"") }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index fa76db2..9588e36 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -334,6 +334,7 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void regions(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -@@ -2823,6 +2824,33 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+void -+regions(const Arg *arg) -+{ -+ int pipefd[2]; -+ Client *c; -+ Monitor *m; -+ -+ if (pipe(pipefd) == -1) -+ return; -+ if (fork() == 0) { -+ close(pipefd[1]); -+ dup2(pipefd[0], STDIN_FILENO); -+ close(pipefd[0]); -+ setsid(); -+ execvp(((char **)arg->v)[0], (char **)arg->v); -+ die("dwl: execvp %s failed:", ((char **)arg->v)[0]); -+ } -+ -+ close(pipefd[0]); -+ wl_list_for_each(m, &mons, link) -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m)) -+ dprintf(pipefd[1], "%d,%d %dx%d\n", -+ c->geom.x, c->geom.y, c->geom.width, c->geom.height); -+ close(pipefd[1]); -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.43.1 - diff --git a/dwl-bak/dwl-patches/patches/relative-mouse-resize/README.md b/dwl-bak/dwl-patches/patches/relative-mouse-resize/README.md deleted file mode 100644 index ee462ce..0000000 --- a/dwl-bak/dwl-patches/patches/relative-mouse-resize/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -When resizing windows, the mouse will jump and resize the window in the quadrant that the resize starts at. - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/relative-mouse-resize) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/0bd725d0786248e1dfedbe6aa7453edfe736de43/patches/relative-mouse-resize/relative-mouse-resize.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/655fd2916c1bcaa022ce6dcdfb370051cf64df66/relative-mouse-resize/relative-mouse-resize.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/b828e21717fa584affeb3245359c3ab615759fa4/relative-mouse-resize/relative-mouse-resize.patch) -- [v0.4](https://codeberg.org/schance995/dwl/commit/c9a0c55daeb5c75cc0defa9b82f82eccd13f06c7.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) -- [schance995](https://codeberg.org/schance995) diff --git a/dwl-bak/dwl-patches/patches/relative-mouse-resize/relative-mouse-resize.patch b/dwl-bak/dwl-patches/patches/relative-mouse-resize/relative-mouse-resize.patch deleted file mode 100644 index e1dfc57..0000000 --- a/dwl-bak/dwl-patches/patches/relative-mouse-resize/relative-mouse-resize.patch +++ /dev/null @@ -1,102 +0,0 @@ -From 5c75c67fe49e5ab89e4a61dfb2fe74c768477b90 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 11:13:53 -0500 -Subject: [PATCH] implement relative-muse-resize - ---- - dwl.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- - 1 file changed, 59 insertions(+), 7 deletions(-) - -diff --git a/dwl.c b/dwl.c -index dc0437e..ebf9ef1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -401,7 +401,8 @@ static struct wlr_seat *seat; - static KeyboardGroup *kb_group; - static unsigned int cursor_mode; - static Client *grabc; --static int grabcx, grabcy; /* client-relative */ -+static Client initial_grabc; -+static int grabcx, grabcy, grabx, graby, grabcenterx, grabcentery; /* client-relative */ - - static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; -@@ -1821,8 +1822,27 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - .width = grabc->geom.width, .height = grabc->geom.height}, 1); - return; - } else if (cursor_mode == CurResize) { -- resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -+ if (grabcenterx < grabx) { -+ if (grabcentery < graby) { -+ /* bottom-right */ -+ resize(grabc, (struct wlr_box){.x = initial_grabc.geom.x, .y = initial_grabc.geom.y, -+ .width = (int)round(cursor->x) - initial_grabc.geom.x, .height = (int)round(cursor->y) - initial_grabc.geom.y}, 1); -+ } else { -+ /* top-right */ -+ resize(grabc, (struct wlr_box){.x = initial_grabc.geom.x, .y = (int)round(cursor->y), -+ .width = (int)round(cursor->x) - initial_grabc.geom.x, .height = initial_grabc.geom.y + initial_grabc.geom.height - (int)round(cursor->y)}, 1); -+ } -+ } else { -+ if (grabcentery < graby) { -+ /* bottom-left */ -+ resize(grabc, (struct wlr_box){.x = (int)round(cursor->x), .y = initial_grabc.geom.y, -+ .width = initial_grabc.geom.x + initial_grabc.geom.width - (int)round(cursor->x), .height = (int)round(cursor->y) - initial_grabc.geom.y}, 1); -+ } else { -+ /* top-left */ -+ resize(grabc, (struct wlr_box){.x = (int)round(cursor->x), .y = (int)round(cursor->y), -+ .width = initial_grabc.geom.x + initial_grabc.geom.width - (int)round(cursor->x), .height = initial_grabc.geom.y + initial_grabc.geom.height - (int)round(cursor->y)}, 1); -+ } -+ } - return; - } - -@@ -1870,10 +1890,42 @@ moveresize(const Arg *arg) - case CurResize: - /* Doesn't work for X11 output - the next absolute motion event - * returns the cursor to where it started */ -- wlr_cursor_warp_closest(cursor, NULL, -- grabc->geom.x + grabc->geom.width, -- grabc->geom.y + grabc->geom.height); -- wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ initial_grabc = *grabc; -+ grabx = (int)round(cursor->x); -+ graby = (int)round(cursor->y); -+ grabcx = (int)round(cursor->x) - grabc->geom.x; -+ grabcy = (int)round(cursor->y) - grabc->geom.y; -+ grabcenterx = grabc->geom.width / 2 + grabc->geom.x; -+ grabcentery = grabc->geom.height / 2 + grabc->geom.y; -+ if (grabcenterx < grabx) { -+ if (grabcentery < graby) { -+ /* bottom-right */ -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x + grabc->geom.width, -+ grabc->geom.y + grabc->geom.height); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "se-resize"); -+ } else { -+ /* top-right */ -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x + grabc->geom.width, -+ grabc->geom.y); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "ne-resize"); -+ } -+ } else { -+ if (grabcentery < graby) { -+ /* bottom-left */ -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x, -+ grabc->geom.y + grabc->geom.height); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "sw-resize"); -+ } else { -+ /* top-left */ -+ wlr_cursor_warp_closest(cursor, NULL, -+ grabc->geom.x, -+ grabc->geom.y); -+ wlr_cursor_set_xcursor(cursor, cursor_mgr, "nw-resize"); -+ } -+ } - break; - } - } --- -2.45.1 \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/restore-monitor/README.md b/dwl-bak/dwl-patches/patches/restore-monitor/README.md deleted file mode 100644 index 8380967..0000000 --- a/dwl-bak/dwl-patches/patches/restore-monitor/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Moves clients to their old output when it is reattached. - -### Download -- [git branch](https://codeberg.org/eyusupov/dwl/src/branch/restore-monitor) -- [2024-04-07](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/restore-monitor/restore-monitor.patch) -### Authors -- [eyusupov](https://codeberg.org/eyusupov) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/restore-monitor/restore-monitor.patch b/dwl-bak/dwl-patches/patches/restore-monitor/restore-monitor.patch deleted file mode 100644 index 0d6da98..0000000 --- a/dwl-bak/dwl-patches/patches/restore-monitor/restore-monitor.patch +++ /dev/null @@ -1,82 +0,0 @@ -From e42ca1c539437d3098d80983cfe2ad6f938d7a08 Mon Sep 17 00:00:00 2001 -From: Eldar Yusupov -Date: Sun, 17 Mar 2024 19:12:29 +0300 -Subject: [PATCH] Restore correct montior for client when it is reattached - ---- - dwl.c | 24 ++++++++++++++++++++++-- - 1 file changed, 22 insertions(+), 2 deletions(-) - -diff --git a/dwl.c b/dwl.c -index bf763df..d8d8139 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -107,6 +107,7 @@ typedef struct { - unsigned int type; /* XDGShell or X11* */ - struct wlr_box geom; /* layout-relative, includes border */ - Monitor *mon; -+ char *output; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ - struct wlr_scene_tree *scene_surface; -@@ -869,6 +870,7 @@ createmon(struct wl_listener *listener, void *data) - size_t i; - struct wlr_output_state state; - Monitor *m; -+ Client *c; - - if (!wlr_output_init_render(wlr_output, alloc, drw)) - return; -@@ -938,6 +940,13 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_layout_add_auto(output_layout, wlr_output); - else - wlr_output_layout_add(output_layout, wlr_output, m->m.x, m->m.y); -+ -+ wl_list_for_each(c, &clients, link) { -+ if (strcmp(wlr_output->name, c->output) == 0) { -+ c->mon = m; -+ } -+ } -+ updatemons(NULL, NULL); - } - - void -@@ -1186,6 +1195,7 @@ destroynotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->map.link); - wl_list_remove(&c->unmap.link); - } -+ free(c->output); - free(c); - } - -@@ -1618,6 +1628,10 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -+ c->output = strdup(c->mon->wlr_output->name); -+ if (c->output == NULL) { -+ die("oom"); -+ } - printstatus(); - - unset_fullscreen: -@@ -2565,8 +2579,14 @@ void - tagmon(const Arg *arg) - { - Client *sel = focustop(selmon); -- if (sel) -- setmon(sel, dirtomon(arg->i), 0); -+ if (!sel) -+ return; -+ setmon(sel, dirtomon(arg->i), 0); -+ free(sel->output); -+ sel->output = strdup(sel->mon->wlr_output->name); -+ if (sel->output == NULL) { -+ die("oom"); -+ } - } - - void --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/right/README.md b/dwl-bak/dwl-patches/patches/right/README.md deleted file mode 100644 index 7708ded..0000000 --- a/dwl-bak/dwl-patches/patches/right/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Put newly connected monitors on the right, like X does. - -### Download -- [2024-02-11](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/right/right.patch) - -### Authors -- [Dima Krasner](https://codeberg.org/dimkr) () diff --git a/dwl-bak/dwl-patches/patches/right/right.patch b/dwl-bak/dwl-patches/patches/right/right.patch deleted file mode 100644 index baf8eeb..0000000 --- a/dwl-bak/dwl-patches/patches/right/right.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 9d4b0ebb95381525351b05aad6a98f1747ae96e2 Mon Sep 17 00:00:00 2001 -From: Dima Krasner -Date: Thu, 21 Jul 2022 21:14:14 +0300 -Subject: [PATCH] extend the display to the right - ---- - dwl.c | 13 +++++++++++-- - 1 file changed, 11 insertions(+), 2 deletions(-) - -diff --git a/dwl.c b/dwl.c -index d48bf40..fb795e1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -923,7 +923,8 @@ createmon(struct wl_listener *listener, void *data) - const MonitorRule *r; - size_t i; - struct wlr_output_state state; -- Monitor *m; -+ Monitor *om, *m; -+ int max_x = 0, max_x_y = 0, width, height; - - if (!wlr_output_init_render(wlr_output, alloc, drw)) - return; -@@ -967,6 +968,14 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_commit_state(wlr_output, &state); - wlr_output_state_finish(&state); - -+ wl_list_for_each(om, &mons, link) { -+ wlr_output_effective_resolution(om->wlr_output, &width, &height); -+ if (om->m.x + width > max_x) { -+ max_x = om->m.x + width; -+ max_x_y = om->m.y; -+ } -+ } -+ - wl_list_insert(&mons, &m->link); - printstatus(); - -@@ -990,7 +999,7 @@ createmon(struct wl_listener *listener, void *data) - */ - m->scene_output = wlr_scene_output_create(scene, wlr_output); - if (m->m.x == -1 && m->m.y == -1) -- wlr_output_layout_add_auto(output_layout, wlr_output); -+ wlr_output_layout_add(output_layout, wlr_output, max_x, max_x_y); - else - wlr_output_layout_add(output_layout, wlr_output, m->m.x, m->m.y); - } --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/rlimit_max/README.md b/dwl-bak/dwl-patches/patches/rlimit_max/README.md deleted file mode 100644 index 2bf7355..0000000 --- a/dwl-bak/dwl-patches/patches/rlimit_max/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Sets the current maximum open file descriptors to the maximum available limit. - -This patch is useful - and solves issue [#628](https://codeberg.org/dwl/dwl/issues/628) for running heavy Xwayland applications on systems that do not provide limits out of the box. - -### Download -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/rlimit_max/rlimit_max.patch) - -### Authors -- [sewn](https://codeberg.org/sewn) - diff --git a/dwl-bak/dwl-patches/patches/rlimit_max/rlimit_max.patch b/dwl-bak/dwl-patches/patches/rlimit_max/rlimit_max.patch deleted file mode 100644 index 81111b3..0000000 --- a/dwl-bak/dwl-patches/patches/rlimit_max/rlimit_max.patch +++ /dev/null @@ -1,91 +0,0 @@ -From d25a8222651671613322677d17b2f987135e02cd Mon Sep 17 00:00:00 2001 -From: sewn -Date: Sat, 24 Aug 2024 19:26:26 +0300 -Subject: [PATCH] set max open file descriptors to available max - ---- - dwl.c | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/dwl.c b/dwl.c -index a2711f6..163ebdd 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -316,6 +317,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface, - static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); -+static void restorerlimit(void); - static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); -@@ -358,6 +360,7 @@ static void zoom(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -+static struct rlimit og_rlimit; - static pid_t child_pid = -1; - static int locked; - static void *exclusive_focus; -@@ -2096,6 +2099,15 @@ quit(const Arg *arg) - wl_display_terminate(dpy); - } - -+void -+restorerlimit(void) -+{ -+ if (og_rlimit.rlim_cur == 0) -+ return; -+ if (setrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) -+ die("setrlimit:"); -+} -+ - void - rendermon(struct wl_listener *listener, void *data) - { -@@ -2232,6 +2244,7 @@ run(char *startup_cmd) - if ((child_pid = fork()) < 0) - die("startup: fork:"); - if (child_pid == 0) { -+ restorerlimit(); - setsid(); - dup2(piperw[0], STDIN_FILENO); - close(piperw[0]); -@@ -2429,10 +2442,18 @@ setsel(struct wl_listener *listener, void *data) - void - setup(void) - { -+ struct rlimit new_rlimit; - int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; - struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; - sigemptyset(&sa.sa_mask); - -+ if (getrlimit(RLIMIT_NOFILE, &og_rlimit) < 0) -+ die("getrlimit:"); -+ new_rlimit = og_rlimit; -+ new_rlimit.rlim_cur = new_rlimit.rlim_max; -+ if (setrlimit(RLIMIT_NOFILE, &new_rlimit) < 0) -+ die("setrlimit:"); -+ - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -@@ -2649,6 +2670,7 @@ void - spawn(const Arg *arg) - { - if (fork() == 0) { -+ restorerlimit(); - dup2(STDERR_FILENO, STDOUT_FILENO); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/rotate-clients/README.md b/dwl-bak/dwl-patches/patches/rotate-clients/README.md deleted file mode 100644 index aaf8f67..0000000 --- a/dwl-bak/dwl-patches/patches/rotate-clients/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Description -Rotate clients on current monitor. - -Example Configuration: -```c - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_J, rotate_clients, {.i = +1} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, rotate_clients, {.i = -1} }, -``` - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/rotate-clients/rotate-clients.patch) - -### Authors -- [folk](https://codeberg.org/folk) diff --git a/dwl-bak/dwl-patches/patches/rotate-clients/rotate-clients.patch b/dwl-bak/dwl-patches/patches/rotate-clients/rotate-clients.patch deleted file mode 100644 index 8f5f557..0000000 --- a/dwl-bak/dwl-patches/patches/rotate-clients/rotate-clients.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 22d2171..6029666 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -129,6 +129,8 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_J, rotate_clients, {.i = +1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, rotate_clients, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -diff --git a/dwl.c b/dwl.c -index a2711f6..6dfd87d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -355,6 +355,7 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void rotate_clients(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -@@ -3054,6 +3055,30 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+static void rotate_clients(const Arg *arg) { -+ Monitor* m = selmon; -+ Client *c; -+ Client *first = NULL; -+ Client *last = NULL; -+ -+ if (arg->i == 0) -+ return; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) { -+ if (first == NULL) first = c; -+ last = c; -+ } -+ } -+ if (first != last) { -+ struct wl_list *append_to = (arg->i > 0) ? &last->link : first->link.prev; -+ struct wl_list *elem = (arg->i > 0) ? &first->link : &last->link; -+ wl_list_remove(elem); -+ wl_list_insert(append_to, elem); -+ arrange(selmon); -+ } -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) diff --git a/dwl-bak/dwl-patches/patches/rotatetags/README.md b/dwl-bak/dwl-patches/patches/rotatetags/README.md deleted file mode 100644 index f981847..0000000 --- a/dwl-bak/dwl-patches/patches/rotatetags/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -This patch provides the ability to rotate the tagset left / right. It implements a new function rotatetags which modifies the current tagset. Same as original dwm patch. Also adds ability to move focused client to left / right adjacent tag by specifying appropriate enum value as argument. - -### Download -- [git branch](https://codeberg.org/korei999/dwl/src/branch/rotatetags) -- [2024-01-23](https://codeberg.org/korei999/dwl-patches/raw/branch/main/rotatetags/rotatetags.patch) - -### Authors -- [korei999](https://codeberg.org/korei999) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/rotatetags/rotatetags.patch b/dwl-bak/dwl-patches/patches/rotatetags/rotatetags.patch deleted file mode 100644 index 94e776f..0000000 --- a/dwl-bak/dwl-patches/patches/rotatetags/rotatetags.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 308c668010bb7526ea40ad12dbaa1af62f9d7421 Mon Sep 17 00:00:00 2001 -From: korei999 -Date: Tue, 23 Jan 2024 12:01:48 +0200 -Subject: [PATCH] add rotatetags patch - ---- - config.def.h | 13 ++++++++++++- - dwl.c | 29 +++++++++++++++++++++++++++++ - 2 files changed, 41 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..a80207a 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -14,6 +14,13 @@ static const float urgentcolor[] = COLOR(0xff0000ff); - /* To conform the xdg-protocol, set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ - -+enum { -+ VIEW_L = -1, -+ VIEW_R = 1, -+ SHIFT_L = -2, -+ SHIFT_R = 2, -+} RotateTags; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -125,7 +132,11 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -- { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_i, incnmaster, {.i = -1} }, -+ { MODKEY, XKB_KEY_a, rotatetags, {.i = VIEW_L} }, -+ { MODKEY, XKB_KEY_d, rotatetags, {.i = VIEW_R} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_a, rotatetags, {.i = SHIFT_L} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_d, rotatetags, {.i = SHIFT_R} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, -diff --git a/dwl.c b/dwl.c -index bf02a6d..e737e34 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -332,6 +332,7 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void rotatetags(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -@@ -2798,6 +2799,34 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+static void -+rotatetags(const Arg *arg) -+{ -+ Arg newarg; -+ int i = arg->i; -+ int nextseltags = 0, curseltags = selmon->tagset[selmon->seltags]; -+ bool shift = false; -+ -+ switch(abs(i)) { -+ default: break; -+ case SHIFT_R: -+ shift = true; -+ break; -+ }; -+ -+ if (i > 0) -+ nextseltags = (curseltags << 1) | (curseltags >> (TAGCOUNT - 1)); -+ else -+ nextseltags = (curseltags >> 1) | (curseltags << (TAGCOUNT - 1)); -+ -+ newarg.i = nextseltags; -+ -+ if (shift) -+ tag(&newarg); -+ else -+ view(&newarg); -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/scenefx/README.md b/dwl-bak/dwl-patches/patches/scenefx/README.md deleted file mode 100644 index e1054b3..0000000 --- a/dwl-bak/dwl-patches/patches/scenefx/README.md +++ /dev/null @@ -1,113 +0,0 @@ -### Description - -Implement https://github.com/wlrfx/scenefx - -```c -/* available options */ - -static const int opacity = 0; /* flag to enable opacity */ -static const float opacity_inactive = 0.5; -static const float opacity_active = 1.0; - -static const int shadow = 1; /* flag to enable shadow */ -static const int shadow_only_floating = 0; /* only apply shadow to floating windows */ -static const float shadow_color[4] = COLOR(0x0000FFff); -static const float shadow_color_focus[4] = COLOR(0xFF0000ff); -static const int shadow_blur_sigma = 20; -static const int shadow_blur_sigma_focus = 40; -static const char *const shadow_ignore_list[] = { NULL }; /* list of app-id to ignore */ - -static const int corner_radius = 8; /* 0 disables corner_radius */ -static const int corner_radius_inner = 8; /* 0 disables corner_radius */ -static const int corner_radius_only_floating = 0; /* only apply corner_radius and corner_radius_inner to floating windows */ - -static const int blur = 1; /* flag to enable blur */ -static const int blur_xray = 0; /* flag to make transparent fs and floating windows display your background */ -static const int blur_ignore_transparent = 1; -static const struct blur_data blur_data = { - .radius = 5, - .num_passes = 3, - .noise = (float)0.02, - .brightness = (float)0.9, - .contrast = (float)0.9, - .saturation = (float)1.1, -}; -``` - -> **NOTE:** If you are using nix with flakes, scenefx has a flake for scenefx https://github.com/wlrfx/scenefx/blob/main/flake.nix - -> **NOTE:** Blur doesn't work on windows with opacity set (opacity_active, opacity_inactive) - -> **NOTE:** In DWL's Makefile `scenefx-0.2` must be placed before `wlroots-0.18`, e.g. `PKGS = scenefx-0.2 wlroots-0.18 wayland-server ...` - -
-Preview -
-
-
-
- -### Download - -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.8-a/scenefx-b) - -- [0.8-dev](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/scenefx/scenefx.patch) - - **NOTE:** This patch was tested with the `87c0e8b6d5c86557a800445e8e4c322f387fe19c` commit on the `main` branch of `SceneFX`. It supports rounded borders, blur, and shadows. However, it does not add rounded borders or shadows to Xwayland apps. That said, Xwayland apps can have shadows, and they might also support rounded borders, but I was never able to make it work. PRs are welcome! - - **IMPORTANT:** This patch requires you to build DWL with the following dependencies - - - **scenefx** - - libGL - -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/scenefx/scenefx.patch) - - **IMPORTANT:** This patch only works with the `2ec3505248e819191c37cb831197629f373326fb` commit on the `main` branch of `scenefx`, therefore, it does not support **blur**. - - **IMPORTANT:** This patch requires you to build DWL with the following dependencies - - - **scenefx** - - libGL - -
- Preview -
-  
-  
-  
-
- -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/6e3a57ffd16dafa31900b7e89e51672bd7bcc1e8/scenefx/scenefx.patch) - - **IMPORTANT:** This patch only works with the `de4ec10e1ff9347b5833f00f8615d760d9378c99` commit on the `wlr_scene_blur` branch of `scenefx`, as it adds support for **blur**. - - **IMPORTANT:** This patch requires you to build DWL with the dependencies of WLROOTS: - - - **scenefx** - - libGL - - libcap - - libinput - - libpng - - libxkbcommon - - mesa - - pixman - - seatd - - vulkan-loader - - wayland - - wayland-protocols - - xorg.libX11 - - xorg.xcbutilerrors - - xorg.xcbutilimage - - xorg.xcbutilrenderutil - - xorg.xcbutilwm - - xwayland (optional) - - ffmpeg - - hwdata - - libliftoff - - libdisplay-info - -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/7a5c3420822074c544fa102e030b7c30aa6b6be8/scenefx/scenefx.patch) - -### Authors - -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/scenefx/scenefx.patch b/dwl-bak/dwl-patches/patches/scenefx/scenefx.patch deleted file mode 100644 index c556cb4..0000000 --- a/dwl-bak/dwl-patches/patches/scenefx/scenefx.patch +++ /dev/null @@ -1,700 +0,0 @@ -From d209aeaee541a045de9dba2154bbbd5475bba2ec Mon Sep 17 00:00:00 2001 -From: wochap -Date: Sun, 9 Mar 2025 17:26:07 -0500 -Subject: [PATCH] implement scenefx - ---- - Makefile | 2 +- - client.h | 18 +++ - config.def.h | 30 +++- - dwl.c | 414 ++++++++++++++++++++++++++++++++++++++++++++++++++- - 4 files changed, 457 insertions(+), 7 deletions(-) - -diff --git a/Makefile b/Makefile -index 3358bae..8dc79bd 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wlroots-0.18 wayland-server xkbcommon libinput $(XLIBS) -+PKGS = scenefx-0.2 wlroots-0.18 wayland-server xkbcommon libinput $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -diff --git a/client.h b/client.h -index 42f225f..4e8f016 100644 ---- a/client.h -+++ b/client.h -@@ -147,6 +147,13 @@ client_get_clip(Client *c, struct wlr_box *clip) - return; - #endif - -+ *clip = (struct wlr_box){ -+ .x = c->bw, -+ .y = c->bw, -+ .width = c->geom.width - c->bw * 2, -+ .height = c->geom.height - c->bw * 2, -+ }; -+ - wlr_xdg_surface_get_geometry(c->surface.xdg, &xdg_geom); - clip->x = xdg_geom.x; - clip->y = xdg_geom.y; -@@ -328,6 +335,17 @@ static inline void - client_set_border_color(Client *c, const float color[static 4]) - { - int i; -+ -+#ifdef XWAYLAND -+ if (!client_is_x11(c)) { -+#endif -+ if (corner_radius > 0) { -+ return; -+ } -+#ifdef XWAYLAND -+ } -+#endif -+ - for (i = 0; i < 4; i++) - wlr_scene_rect_set_color(c->border[i], color); - } -diff --git a/config.def.h b/config.def.h -index 22d2171..8c50932 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -12,7 +12,35 @@ static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ --static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 0.0f}; /* You can also use glsl colors */ -+ -+static const int opacity = 0; /* flag to enable opacity */ -+static const float opacity_inactive = 0.5; -+static const float opacity_active = 1.0; -+ -+static const int shadow = 1; /* flag to enable shadow */ -+static const int shadow_only_floating = 0; /* only apply shadow to floating windows */ -+static const float shadow_color[4] = COLOR(0x0000FFff); -+static const float shadow_color_focus[4] = COLOR(0xFF0000ff); -+static const int shadow_blur_sigma = 20; -+static const int shadow_blur_sigma_focus = 40; -+static const char *const shadow_ignore_list[] = { NULL }; /* list of app-id to ignore */ -+ -+static const int corner_radius = 8; /* 0 disables corner_radius */ -+static const int corner_radius_inner = 9; /* 0 disables corner_radius */ -+static const int corner_radius_only_floating = 0; /* only apply corner_radius and corner_radius_inner to floating windows */ -+ -+static const int blur = 1; /* flag to enable blur */ -+static const int blur_xray = 0; /* flag to make transparent fs and floating windows display your background */ -+static const int blur_ignore_transparent = 1; -+static const struct blur_data blur_data = { -+ .radius = 5, -+ .num_passes = 3, -+ .noise = (float)0.02, -+ .brightness = (float)0.9, -+ .contrast = (float)0.9, -+ .saturation = (float)1.1, -+}; - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -diff --git a/dwl.c b/dwl.c -index 5bf995e..655e175 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -10,8 +10,14 @@ - #include - #include - #include -+#include -+#include -+#include -+#include -+#include - #include - #include -+#include - #include - #include - #include -@@ -43,7 +49,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -83,7 +88,7 @@ - /* enums */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ --enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { LyrBg, LyrBlur, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -141,6 +146,12 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ -+ float opacity; -+ int corner_radius; -+ struct wlr_scene_shadow *shadow; -+ int has_shadow_enabled; -+ struct wlr_scene_rect *round_border; - } Client; - - typedef struct { -@@ -208,6 +219,7 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ struct wlr_scene_optimized_blur *blur_layer; - }; - - typedef struct { -@@ -355,6 +367,18 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void iter_xdg_scene_buffers(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data); -+static void iter_xdg_scene_buffers_blur(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data); -+static void iter_xdg_scene_buffers_opacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data); -+static void iter_xdg_scene_buffers_corner_radius(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data); -+static void output_configure_scene(struct wlr_scene_node *node, Client *c); -+static int in_shadow_ignore_list(const char *str); -+static void client_set_shadow_blur_sigma(Client *c, int blur_sigma); -+static void update_client_corner_radius(Client *c); -+static void update_client_shadow_color(Client *c); -+static void update_client_focus_decorations(Client *c, int focused, int urgent); -+static void update_client_blur(Client *c); -+static void update_buffer_corner_radius(Client *c, struct wlr_scene_buffer *buffer); - - /* variables */ - static const char broken[] = "broken"; -@@ -413,6 +437,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static float transparent[4] = {0.1f, 0.1f, 0.1f, 0.0f}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -499,6 +525,10 @@ arrange(Monitor *m) - wlr_scene_node_set_enabled(&m->fullscreen_bg->node, - (c = focustop(m)) && c->isfullscreen); - -+ if (blur) { -+ wlr_scene_node_set_enabled(&m->blur_layer->node, 1); -+ } -+ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - - /* We move all clients (except fullscreen and unmanaged) to LyrTile while -@@ -722,6 +752,11 @@ cleanupmon(struct wl_listener *listener, void *data) - - closemon(m); - wlr_scene_node_destroy(&m->fullscreen_bg->node); -+ -+ if (blur) { -+ wlr_scene_node_destroy(&m->blur_layer->node); -+ } -+ - free(m); - } - -@@ -785,6 +820,18 @@ commitlayersurfacenotify(struct wl_listener *listener, void *data) - } - - arrangelayers(l->mon); -+ -+ if (blur) { -+ // Rerender the optimized blur on change -+ struct wlr_layer_surface_v1 *wlr_layer_surface = l->layer_surface; -+ if (wlr_layer_surface->current.layer == -+ ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND || -+ wlr_layer_surface->current.layer == ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM) { -+ if (l->mon) { -+ wlr_scene_optimized_blur_mark_dirty(l->mon->blur_layer); -+ } -+ } -+ } - } - - void -@@ -1036,6 +1083,12 @@ createmon(struct wl_listener *listener, void *data) - m->fullscreen_bg = wlr_scene_rect_create(layers[LyrFS], 0, 0, fullscreen_bg); - wlr_scene_node_set_enabled(&m->fullscreen_bg->node, 0); - -+ if (blur) { -+ m->blur_layer = wlr_scene_optimized_blur_create(&scene->tree, 0, 0); -+ wlr_scene_node_reparent(&m->blur_layer->node, layers[LyrBlur]); -+ wlr_scene_node_set_enabled(&m->blur_layer->node, 0); -+ } -+ - /* Adds this to the output layout in the order it was configured. - * - * The output layout utility automatically adds a wl_output global to the -@@ -1061,6 +1114,9 @@ createnotify(struct wl_listener *listener, void *data) - c->surface.xdg = toplevel->base; - c->bw = borderpx; - -+ c->opacity = opacity; -+ c->corner_radius = corner_radius; -+ - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); - LISTEN(&toplevel->base->surface->events.unmap, &c->unmap, unmapnotify); -@@ -1369,8 +1425,11 @@ focusclient(Client *c, int lift) - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -- if (!exclusive_focus && !seat->drag) -+ if (!exclusive_focus && !seat->drag) { - client_set_border_color(c, focuscolor); -+ -+ update_client_focus_decorations(c, 1, 0); -+ } - } - - /* Deactivate old client if focus is changing */ -@@ -1389,6 +1448,8 @@ focusclient(Client *c, int lift) - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { - client_set_border_color(old_c, bordercolor); - -+ update_client_focus_decorations(old_c, 0, 0); -+ - client_activate_surface(old, 0); - } - } -@@ -1718,6 +1779,38 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, iter_xdg_scene_buffers, c); -+ -+#ifdef XWAYLAND -+ if (!client_is_x11(c)) { -+#endif -+ if (corner_radius > 0) { -+ c->round_border = wlr_scene_rect_create(c->scene, 0, 0, c->isurgent ? urgentcolor : bordercolor); -+ c->round_border->node.data = c; -+ /* Lower the border below the XDG scene tree */ -+ wlr_scene_node_lower_to_bottom(&c->round_border->node); -+ -+ /* hide original border */ -+ for (i = 0; i < 4; i++) { -+ wlr_scene_rect_set_color(c->border[i], transparent); -+ } -+ } -+#ifdef XWAYLAND -+ } -+#endif -+ -+#ifdef XWAYLAND -+ if (!client_is_x11(c)) { -+#endif -+ if (shadow) { -+ c->shadow = wlr_scene_shadow_create(c->scene, 0, 0, c->corner_radius, shadow_blur_sigma, shadow_color); -+ /* Lower the shadow below the border */ -+ wlr_scene_node_lower_to_bottom(&c->shadow->node); -+ } -+#ifdef XWAYLAND -+ } -+#endif -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -1739,6 +1832,13 @@ mapnotify(struct wl_listener *listener, void *data) - } - printstatus(); - -+ /* TODO: shouldn't we call iter_xdg_scene_buffers_corner_radius? */ -+ update_client_corner_radius(c); -+ -+ update_client_shadow_color(c); -+ -+ update_client_blur(c); -+ - unset_fullscreen: - m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); - wl_list_for_each(w, &clients, link) { -@@ -2113,6 +2213,8 @@ rendermon(struct wl_listener *listener, void *data) - goto skip; - } - -+ output_configure_scene(&m->scene_output->scene->tree.node, NULL); -+ - /* - * HACK: The "correct" way to set the gamma is to commit it together with - * the rest of the state in one go, but to do that we would need to rewrite -@@ -2207,6 +2309,21 @@ resize(Client *c, struct wlr_box geo, int interact) - c->geom.height - 2 * c->bw); - client_get_clip(c, &clip); - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); -+ -+ if (corner_radius > 0 && c->round_border) { -+ wlr_scene_node_set_position(&c->round_border->node, 0, 0); -+ wlr_scene_rect_set_size(c->round_border, c->geom.width, c->geom.height); -+ wlr_scene_rect_set_clipped_region(c->round_border, (struct clipped_region) { -+ .corner_radius = c->corner_radius, -+ .corners = CORNER_LOCATION_ALL, -+ .area = { c->bw, c->bw, c->geom.width - c->bw * 2, c->geom.height - c->bw * 2 } -+ }); -+ } -+ -+ if (shadow && c->shadow) { -+ /* TODO: shouldn't we call wlr_scene_shadow_set_blur_sigma? */ -+ client_set_shadow_blur_sigma(c, (int)round(c->shadow->blur_sigma)); -+ } - } - - void -@@ -2307,6 +2424,13 @@ setfloating(Client *c, int floating) - { - Client *p = client_get_parent(c); - c->isfloating = floating; -+ -+ update_client_corner_radius(c); -+ -+ update_client_shadow_color(c); -+ -+ update_client_blur(c); -+ - /* If in floating layout do not change the client's layer */ - if (!c->mon || !client_surface(c)->mapped || !c->mon->lt[c->mon->sellt]->arrange) - return; -@@ -2336,6 +2460,13 @@ setfullscreen(Client *c, int fullscreen) - * client positions are set by the user and cannot be recalculated */ - resize(c, c->prev, 0); - } -+ -+ update_client_corner_radius(c); -+ -+ update_client_shadow_color(c); -+ -+ update_client_blur(c); -+ - arrange(c->mon); - printstatus(); - } -@@ -2457,11 +2588,15 @@ setup(void) - drag_icon = wlr_scene_tree_create(&scene->tree); - wlr_scene_node_place_below(&drag_icon->node, &layers[LyrBlock]->node); - -+ if (blur) { -+ wlr_scene_set_blur_data(scene, blur_data); -+ } -+ - /* Autocreates a renderer, either Pixman, GLES2 or Vulkan for us. The user - * can also specify a renderer using the WLR_RENDERER env var. - * The renderer is responsible for defining the various pixel formats it - * supports for shared memory, this configures that for clients. */ -- if (!(drw = wlr_renderer_autocreate(backend))) -+ if (!(drw = fx_renderer_create(backend))) - die("couldn't create renderer"); - LISTEN_STATIC(&drw->events.lost, gpureset); - -@@ -2870,6 +3005,10 @@ updatemons(struct wl_listener *listener, void *data) - - wlr_scene_node_set_position(&m->fullscreen_bg->node, m->m.x, m->m.y); - wlr_scene_rect_set_size(m->fullscreen_bg, m->m.width, m->m.height); -+ -+ if (blur) { -+ wlr_scene_optimized_blur_set_size(m->blur_layer, m->m.width, m->m.height); -+ } - - if (m->lock_surface) { - struct wlr_scene_tree *scene_tree = m->lock_surface->surface->data; -@@ -2940,8 +3079,11 @@ urgent(struct wl_listener *listener, void *data) - c->isurgent = 1; - printstatus(); - -- if (client_surface(c)->mapped) -+ if (client_surface(c)->mapped) { - client_set_border_color(c, urgentcolor); -+ -+ update_client_focus_decorations(c, 1, 1); -+ } - } - - void -@@ -3053,6 +3195,268 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+void -+iter_xdg_scene_buffers(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data) -+{ -+ Client *c = user_data; -+ struct wlr_scene_surface * scene_surface = wlr_scene_surface_try_from_buffer(buffer); -+ struct wlr_xdg_surface *xdg_surface; -+ -+ if (!scene_surface) { -+ return; -+ } -+ -+ xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface); -+ -+ if (c && xdg_surface && xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { -+ /* TODO: Be able to set whole decoration_data instead of calling */ -+ /* each individually? */ -+ if (opacity) { -+ wlr_scene_buffer_set_opacity(buffer, c->opacity); -+ } -+ -+ if (!wlr_subsurface_try_from_wlr_surface(xdg_surface->surface)) { -+ update_buffer_corner_radius(c, buffer); -+ -+ if (blur) { -+ int blur_optimized = !c->isfloating || blur_xray; -+ wlr_scene_buffer_set_backdrop_blur(buffer, 1); -+ wlr_scene_buffer_set_backdrop_blur_optimized(buffer, blur_optimized); -+ wlr_scene_buffer_set_backdrop_blur_ignore_transparent(buffer, blur_ignore_transparent); -+ } -+ } -+ } -+} -+ -+void -+iter_xdg_scene_buffers_blur(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data) -+{ -+ Client *c = user_data; -+ struct wlr_scene_surface * scene_surface = wlr_scene_surface_try_from_buffer(buffer); -+ struct wlr_xdg_surface *xdg_surface; -+ -+ if (!scene_surface) { -+ return; -+ } -+ -+ xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface); -+ -+ if (c && xdg_surface && xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { -+ if (!wlr_subsurface_try_from_wlr_surface(xdg_surface->surface)) { -+ if (blur) { -+ int blur_optimized = !c->isfloating || blur_xray; -+ wlr_scene_buffer_set_backdrop_blur_optimized(buffer, blur_optimized); -+ } -+ } -+ } -+} -+ -+void -+iter_xdg_scene_buffers_opacity(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data) -+{ -+ Client *c = user_data; -+ struct wlr_scene_surface * scene_surface = wlr_scene_surface_try_from_buffer(buffer); -+ struct wlr_xdg_surface *xdg_surface; -+ -+ if (!scene_surface) { -+ return; -+ } -+ -+ xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface); -+ -+ if (c && xdg_surface && xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { -+ /* TODO: Be able to set whole decoration_data instead of calling */ -+ /* each individually? */ -+ if (opacity) { -+ wlr_scene_buffer_set_opacity(buffer, c->opacity); -+ } -+ } -+} -+ -+void -+iter_xdg_scene_buffers_corner_radius(struct wlr_scene_buffer *buffer, int sx, int sy, void *user_data) -+{ -+ Client *c = user_data; -+ struct wlr_scene_surface * scene_surface = wlr_scene_surface_try_from_buffer(buffer); -+ struct wlr_xdg_surface *xdg_surface; -+ -+ if (!scene_surface) { -+ return; -+ } -+ -+ xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface); -+ -+ if (c && xdg_surface && xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { -+ /* TODO: Be able to set whole decoration_data instead of calling */ -+ /* each individually? */ -+ update_buffer_corner_radius(c, buffer); -+ } -+} -+ -+void -+output_configure_scene(struct wlr_scene_node *node, Client *c) -+{ -+ Client *_c; -+ struct wlr_xdg_surface *xdg_surface; -+ struct wlr_scene_node *_node; -+ -+ if (!node->enabled) { -+ return; -+ } -+ -+ _c = node->data; -+ if (_c) { -+ c = _c; -+ } -+ -+ if (node->type == WLR_SCENE_NODE_BUFFER) { -+ struct wlr_scene_buffer *buffer = wlr_scene_buffer_from_node(node); -+ -+ struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(buffer); -+ if (!scene_surface) { -+ return; -+ } -+ -+ xdg_surface = wlr_xdg_surface_try_from_wlr_surface(scene_surface->surface); -+ -+ if (c && xdg_surface && xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { -+ if (opacity) { -+ wlr_scene_buffer_set_opacity(buffer, c->opacity); -+ } -+ -+ if (!wlr_subsurface_try_from_wlr_surface(xdg_surface->surface)) { -+ update_buffer_corner_radius(c, buffer); -+ } -+ } -+ } else if (node->type == WLR_SCENE_NODE_TREE) { -+ struct wlr_scene_tree *tree = wl_container_of(node, tree, node); -+ wl_list_for_each(_node, &tree->children, link) { -+ output_configure_scene(_node, c); -+ } -+ } -+} -+ -+int -+in_shadow_ignore_list(const char *str) -+{ -+ for (int i = 0; shadow_ignore_list[i] != NULL; i++) { -+ if (strcmp(shadow_ignore_list[i], str) == 0) { -+ return 1; -+ } -+ } -+ return 0; -+} -+ -+void -+client_set_shadow_blur_sigma(Client *c, int blur_sigma) -+{ -+ wlr_scene_shadow_set_blur_sigma(c->shadow, blur_sigma); -+ wlr_scene_node_set_position(&c->shadow->node, -blur_sigma, -blur_sigma); -+ wlr_scene_shadow_set_size(c->shadow, c->geom.width + blur_sigma * 2, c->geom.height + blur_sigma * 2); -+ wlr_scene_shadow_set_clipped_region(c->shadow, (struct clipped_region) { -+ .corner_radius = c->corner_radius + c->bw, -+ .corners = CORNER_LOCATION_ALL, -+ .area = { blur_sigma, blur_sigma, c->geom.width, c->geom.height } -+ }); -+} -+ -+void -+update_client_corner_radius(Client *c) -+{ -+ if (corner_radius && c->round_border) { -+ int radius = c->corner_radius + c->bw; -+ if ((corner_radius_only_floating && !c->isfloating) || c->isfullscreen) { -+ radius = 0; -+ } -+ wlr_scene_rect_set_corner_radius(c->round_border, radius, CORNER_LOCATION_ALL); -+ } -+ -+#ifdef XWAYLAND -+ if (!client_is_x11(c)) { -+#endif -+ if (corner_radius_inner > 0 && c->scene) { -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, iter_xdg_scene_buffers_corner_radius, c); -+ } -+#ifdef XWAYLAND -+ } -+#endif -+} -+ -+void -+update_client_blur(Client *c) -+{ -+ if (!blur) { -+ return; -+ } -+ -+ if (c->scene) { -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, iter_xdg_scene_buffers_blur, c); -+ } -+} -+ -+void -+update_buffer_corner_radius(Client *c, struct wlr_scene_buffer *buffer) -+{ -+ int radius; -+ -+#ifdef XWAYLAND -+ if (client_is_x11(c)) { -+ return; -+ } -+#endif -+ -+ if (!corner_radius_inner) { -+ return; -+ } -+ -+ radius = corner_radius_inner; -+ if ((corner_radius_only_floating && !c->isfloating) || c->isfullscreen) { -+ radius = 0; -+ } -+ wlr_scene_buffer_set_corner_radius(buffer, radius, CORNER_LOCATION_ALL); -+} -+ -+void -+update_client_shadow_color(Client *c) -+{ -+ int has_shadow_enabled = 1; -+ const float *color; -+ -+ if (!shadow || !c->shadow) { -+ return; -+ } -+ -+ color = focustop(c->mon) == c ? shadow_color_focus : shadow_color; -+ -+ if ((shadow_only_floating && !c->isfloating) || -+ in_shadow_ignore_list(client_get_appid(c)) || -+ c->isfullscreen) { -+ color = transparent; -+ has_shadow_enabled = 0; -+ } -+ -+ wlr_scene_shadow_set_color(c->shadow, color); -+ c->has_shadow_enabled = has_shadow_enabled; -+} -+ -+void -+update_client_focus_decorations(Client *c, int focused, int urgent) -+{ -+ if (corner_radius > 0 && c->round_border) { -+ wlr_scene_rect_set_color(c->round_border, urgent ? urgentcolor : (focused ? focuscolor : bordercolor)); -+ } -+ if (shadow && c->shadow) { -+ client_set_shadow_blur_sigma(c, (int)round(focused ? shadow_blur_sigma_focus : shadow_blur_sigma)); -+ if (c->has_shadow_enabled) { -+ wlr_scene_shadow_set_color(c->shadow, focused ? shadow_color_focus : shadow_color); -+ } -+ } -+ if (opacity) { -+ c->opacity = focused ? opacity_active : opacity_inactive; -+ wlr_scene_node_for_each_buffer(&c->scene_surface->node, iter_xdg_scene_buffers_opacity, c); -+ } -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.47.2 - - diff --git a/dwl-bak/dwl-patches/patches/setrule/README.md b/dwl-bak/dwl-patches/patches/setrule/README.md deleted file mode 100644 index bdb7408..0000000 --- a/dwl-bak/dwl-patches/patches/setrule/README.md +++ /dev/null @@ -1,46 +0,0 @@ -### Description - -This patch adds an ability to add or change client rules at runtime. - -Sometimes it happens that some client rule I've set is not relevant in the -current circumstance and adds major disturbance and annoyance to my work -(e.g., `isfloating` is set or unset and I want the opposite). Changing the rule -is not an option because it will require recompilation and restarting dwl, which -is even worse. Having an option of always being able to change a rule solves -this issue. - -The patch only adds one keybinding (`Alt+Shift+R`) to toggle `isfloating` -option. Upon pressing it, dwl will try to find a matching rule for the focused -client and change its `isfloating` setting. If there's no such a rule, a new -rule will be added. The new rule will inherit an appid of the focused client. - -It's very easy to add support for more rule options from other patches as well. -You just need to define a new function similar to `setruleisfloating` and add a -new keybinding to `config.h`. For example, this is a function I created for my -build to toggle `noswallow` option from the [swallow][swallow] patch: - -```c -void -setrulenoswallow(const Arg *arg) -{ - Rule *r = getrule(focustop(selmon)); - if (!r) - return; - r->noswallow = !r->noswallow; -} -``` - -You can also try [menurule][menurule] patch if you want to be able to edit rules -with dmenu. - -[swallow]: /dwl/dwl-patches/src/branch/main/patches/swallow -[menurule]: /dwl/dwl-patches/src/branch/main/patches/menurule - -### Download - -- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/setrule/setrule.patch) -- [2025-02-14 v0.7](https://codeberg.org/dwl/dwl-patches/raw/commit/268bee3cee239e5bd52cceed88a52bfc21143cc3/patches/setrule/setrule.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/setrule/setrule.patch b/dwl-bak/dwl-patches/patches/setrule/setrule.patch deleted file mode 100644 index 6f9a1a3..0000000 --- a/dwl-bak/dwl-patches/patches/setrule/setrule.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 3c78308f0d74ac6ef112804333f82c098e33bb40 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Fri, 21 Mar 2025 22:20:54 +0100 -Subject: [PATCH] setrule: add/change rules at runtime - ---- - config.def.h | 4 ++++ - dwl.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 70 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..5b05e52 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,9 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+/* Max amount of dynamically added rules */ -+#define RULES_MAX 100 -+ - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ -@@ -142,6 +145,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_R, setruleisfloating,{0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index def2562..8beac1f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -290,6 +290,7 @@ static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); -+static Rule *getrule(Client *c); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); -@@ -331,6 +332,7 @@ static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); -+static void setruleisfloating(const Arg *arg); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); -@@ -413,6 +415,9 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static Rule *drules; -+static size_t druleslen; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -466,7 +471,7 @@ applyrules(Client *c) - if (!(title = client_get_title(c))) - title = broken; - -- for (r = rules; r < END(rules); r++) { -+ for (r = drules; r < drules + druleslen; r++) { - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -@@ -1472,6 +1477,53 @@ fullscreennotify(struct wl_listener *listener, void *data) - setfullscreen(c, client_wants_fullscreen(c)); - } - -+Rule * -+getrule(Client *c) -+{ -+ Rule *r; -+ const Rule *e; -+ const char *appid, *title; -+ -+ if (!c) -+ return NULL; -+ -+ if (!(appid = client_get_appid(c))) -+ appid = broken; -+ if (!(title = client_get_title(c))) -+ title = broken; -+ -+ for (r = drules + druleslen - 1; r >= drules; r--) -+ if ((!r->title || strstr(title, r->title)) -+ && (!r->id || strstr(appid, r->id))) -+ goto found; -+ -+ if (druleslen >= LENGTH(rules) + RULES_MAX) -+ return NULL; /* No free slots left */ -+ -+ r = drules + druleslen++; -+ -+ /* Use [NULL,NULL] as the default rule if exists */ -+ for (e = rules; e < END(rules); e++) -+ if (!e->title && !e->id) { -+ *r = *e; -+ break; -+ } -+ -+ /* No default rule found, set reasoble defaults */ -+ if (e >= END(rules)) { -+ r->monitor = -1; -+ } -+ -+ /* Only set title if appid is unset */ -+ if (appid == broken) -+ r->title = strdup(title); -+ else -+ r->id = strdup(appid); -+ -+found: -+ return r; -+} -+ - void - gpureset(struct wl_listener *listener, void *data) - { -@@ -2417,6 +2469,15 @@ setpsel(struct wl_listener *listener, void *data) - wlr_seat_set_primary_selection(seat, event->source, event->serial); - } - -+void -+setruleisfloating(const Arg *arg) -+{ -+ Rule *r = getrule(focustop(selmon)); -+ if (!r) -+ return; -+ r->isfloating = !r->isfloating; -+} -+ - void - setsel(struct wl_listener *listener, void *data) - { -@@ -2645,6 +2706,10 @@ setup(void) - fprintf(stderr, "failed to setup XWayland X server, continuing without it\n"); - } - #endif -+ -+ drules = ecalloc(LENGTH(rules) + RULES_MAX, sizeof(Rule)); -+ memcpy(drules, rules, sizeof(rules)); -+ druleslen = LENGTH(rules); - } - - void --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/setupenv/README.md b/dwl-bak/dwl-patches/patches/setupenv/README.md deleted file mode 100644 index 776c328..0000000 --- a/dwl-bak/dwl-patches/patches/setupenv/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Allow configuring environment variables in config.h - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/setupenv) -- [2024-03-26](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/setupenv/setupenv.patch) -### Authors -- [notchoc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/setupenv/setupenv.patch b/dwl-bak/dwl-patches/patches/setupenv/setupenv.patch deleted file mode 100644 index 17d2ad4..0000000 --- a/dwl-bak/dwl-patches/patches/setupenv/setupenv.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 11ee2fc23ef5728d1e132f338c08a7805c6109b2 Mon Sep 17 00:00:00 2001 -From: choc -Date: Tue, 26 Mar 2024 21:02:16 +0800 -Subject: [PATCH] implement setupenv - ---- - config.def.h | 5 +++++ - dwl.c | 7 +++++++ - 2 files changed, 12 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9009517..b16189a 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,11 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+static const Env envs[] = { -+ /* variable value */ -+ { "XDG_CURRENT_DESKTOP", "wlroots" }, -+}; -+ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - /* examples: -diff --git a/dwl.c b/dwl.c -index 5867b0c..b7d522b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -230,6 +230,11 @@ typedef struct { - int monitor; - } Rule; - -+typedef struct { -+ const char *variable; -+ const char *value; -+} Env; -+ - typedef struct { - struct wlr_scene_tree *scene; - -@@ -2066,6 +2071,8 @@ run(char *startup_cmd) - if (!socket) - die("startup: display_add_socket_auto"); - setenv("WAYLAND_DISPLAY", socket, 1); -+ for (size_t i = 0; i < LENGTH(envs); i++) -+ setenv(envs[i].variable, envs[i].value, 1); - - /* Start the backend. This will enumerate outputs and inputs, become the DRM - * master, etc */ --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/shiftview/README.md b/dwl-bak/dwl-patches/patches/shiftview/README.md deleted file mode 100644 index 2d25820..0000000 --- a/dwl-bak/dwl-patches/patches/shiftview/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Add keybindings to cycle through tags with visible clients. - -### Download -- [git branch](https://codeberg.org/guidocella/dwl/src/branch/shiftview) -- [2024-01-27](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/shiftview/shiftview.patch) - -### Authors -- [Guido Cella](https://codeberg.org/guidocella) diff --git a/dwl-bak/dwl-patches/patches/shiftview/shiftview.patch b/dwl-bak/dwl-patches/patches/shiftview/shiftview.patch deleted file mode 100644 index f556916..0000000 --- a/dwl-bak/dwl-patches/patches/shiftview/shiftview.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 40f9140742277d0298988990264f4b6a738f8122 Mon Sep 17 00:00:00 2001 -From: Guido Cella -Date: Sat, 27 Jan 2024 22:43:29 +0100 -Subject: [PATCH] cycle through tags - ---- - config.def.h | 4 ++++ - shiftview.c | 34 ++++++++++++++++++++++++++++++++++ - 2 files changed, 38 insertions(+) - create mode 100644 shiftview.c - -diff --git a/config.def.h b/config.def.h -index 9009517..8d77ec0 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -117,6 +117,8 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "bemenu-run", NULL }; - -+#include "shiftview.c" -+ - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ -@@ -130,6 +132,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, -+ { MODKEY, XKB_KEY_a, shiftview, { .i = -1 } }, -+ { MODKEY, XKB_KEY_semicolon, shiftview, { .i = 1 } }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -diff --git a/shiftview.c b/shiftview.c -new file mode 100644 -index 0000000..fa53db0 ---- /dev/null -+++ b/shiftview.c -@@ -0,0 +1,34 @@ -+// "arg->i" stores the number of tags to shift right (positive value) -+// or left (negative value) -+void -+shiftview(const Arg *arg) -+{ -+ Arg a; -+ Client *c; -+ bool visible = false; -+ int i = arg->i; -+ int count = 0; -+ int nextseltags, curseltags = selmon->tagset[selmon->seltags]; -+ -+ do { -+ if (i > 0) // left circular shift -+ nextseltags = (curseltags << i) | (curseltags >> (TAGCOUNT - i)); -+ else // right circular shift -+ nextseltags = curseltags >> (-i) | (curseltags << (TAGCOUNT + i)); -+ -+ // Check if the tag is visible -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon == selmon && nextseltags & c->tags) { -+ visible = true; -+ break; -+ } -+ } -+ -+ i += arg->i; -+ } while (!visible && ++count <= TAGCOUNT); -+ -+ if (count <= TAGCOUNT) { -+ a.i = nextseltags; -+ view(&a); -+ } -+} --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/simple_scratchpad/README.md b/dwl-bak/dwl-patches/patches/simple_scratchpad/README.md deleted file mode 100644 index 8076d96..0000000 --- a/dwl-bak/dwl-patches/patches/simple_scratchpad/README.md +++ /dev/null @@ -1,25 +0,0 @@ -### Description - -# simple_scratchpad — A very simple scratchpad utility. - -Adds functions to add, toggle and remove clients to/from scratchpad client list. -![scratchpad in action](https://github.com/julmajustus/dwl-patches/blob/main/demos/simple_scratchpad_demo.gif?raw=true) - ---- - -1. **addscratchpad** - - Floats client and adds it to scratchpad clients list. - -2. **togglescratchpad** - - Shows or hides the clients in scratchpad client list. - -3. **removescratchpad** - - Removes client from scratchpad client list. - - -### Download -- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/simple_scratchpad) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/simple_scratchpad/simple_scratchpad-v0.7.patch) - -### Authors -- [julmajustus](https://codeberg.org/julmajustus) diff --git a/dwl-bak/dwl-patches/patches/simple_scratchpad/simple_scratchpad-v0.7.patch b/dwl-bak/dwl-patches/patches/simple_scratchpad/simple_scratchpad-v0.7.patch deleted file mode 100644 index a273559..0000000 --- a/dwl-bak/dwl-patches/patches/simple_scratchpad/simple_scratchpad-v0.7.patch +++ /dev/null @@ -1,211 +0,0 @@ -From a8d29e03f565b54a68c6c2cb2da103366c627825 Mon Sep 17 00:00:00 2001 -From: julmajustus -Date: Sat, 4 Jan 2025 13:22:12 +0200 -Subject: [PATCH] add simple_scratchpad - ---- - config.def.h | 3 ++ - dwl.c | 34 +++++++++++++++++++++-- - simple_scratchpad.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 102 insertions(+), 2 deletions(-) - create mode 100644 simple_scratchpad.c - -diff --git a/config.def.h b/config.def.h -index 22d2171..83f19b3 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -136,6 +136,9 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Z, addscratchpad, {0} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_z, togglescratchpad, {0} }, -+ { MODKEY, XKB_KEY_z, removescratchpad, {0} }, - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -diff --git a/dwl.c b/dwl.c -index a2711f6..85f4a51 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -141,6 +141,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ struct wl_list link_temp; - } Client; - - typedef struct { -@@ -243,6 +244,7 @@ typedef struct { - } SessionLock; - - /* function declarations */ -+static void addscratchpad(const Arg *arg); - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); - static void arrange(Monitor *m); -@@ -317,6 +319,7 @@ static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); - static void rendermon(struct wl_listener *listener, void *data); -+static void removescratchpad(const Arg *arg); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); -@@ -340,6 +343,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglescratchpad(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -413,6 +417,9 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static struct wl_list scratchpad_clients; -+static int scratchpad_visible = 1; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -432,6 +439,8 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+#include "simple_scratchpad.c" -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -1259,10 +1268,20 @@ void - destroynotify(struct wl_listener *listener, void *data) - { - /* Called when the xdg_toplevel is destroyed. */ -- Client *c = wl_container_of(listener, c, destroy); -+ Client *sc, *c = wl_container_of(listener, c, destroy); - wl_list_remove(&c->destroy.link); - wl_list_remove(&c->set_title.link); - wl_list_remove(&c->fullscreen.link); -+ /* Check if destroyed client was part of scratchpad_clients -+ * and clean it from the list if so. */ -+ if (c && wl_list_length(&scratchpad_clients) > 0) { -+ wl_list_for_each(sc, &scratchpad_clients, link_temp) { -+ if (sc == c) { -+ wl_list_remove(&c->link_temp); -+ break; -+ } -+ } -+ } - #ifdef XWAYLAND - if (c->type != XDGShell) { - wl_list_remove(&c->activate.link); -@@ -2306,11 +2325,21 @@ setcursorshape(struct wl_listener *listener, void *data) - void - setfloating(Client *c, int floating) - { -- Client *p = client_get_parent(c); -+ Client *sc, *p = client_get_parent(c); - c->isfloating = floating; - /* If in floating layout do not change the client's layer */ - if (!c->mon || !client_surface(c)->mapped || !c->mon->lt[c->mon->sellt]->arrange) - return; -+ /* Check if unfloated client was part of scratchpad_clients -+ * and remove it from scratchpad_clients list if so */ -+ if (!floating && wl_list_length(&scratchpad_clients) > 0) { -+ wl_list_for_each(sc, &scratchpad_clients, link_temp) { -+ if (sc == c) { -+ wl_list_remove(&c->link_temp); -+ break; -+ } -+ } -+ } - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen || - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); -@@ -2534,6 +2563,7 @@ setup(void) - */ - wl_list_init(&clients); - wl_list_init(&fstack); -+ wl_list_init(&scratchpad_clients); - - xdg_shell = wlr_xdg_shell_create(dpy, 6); - LISTEN_STATIC(&xdg_shell->events.new_toplevel, createnotify); -diff --git a/simple_scratchpad.c b/simple_scratchpad.c -new file mode 100644 -index 0000000..381f4b5 ---- /dev/null -+++ b/simple_scratchpad.c -@@ -0,0 +1,68 @@ -+/* ************************************************************************** */ -+/* */ -+/* ::: :::::::: */ -+/* simple_scratchpad.c :+: :+: :+: */ -+/* +:+ +:+ +:+ */ -+/* By: jmakkone +#+ +:+ +#+ */ -+/* +#+#+#+#+#+ +#+ */ -+/* Created: 2024/12/19 19:35:02 by jmakkone #+# #+# */ -+/* Updated: 2025/01/04 13:35:50 by jmakkone ### ########.fr */ -+/* */ -+/* ************************************************************************** */ -+ -+void -+addscratchpad(const Arg *arg) -+{ -+ Client *cc, *c = focustop(selmon); -+ -+ if (!c) -+ return; -+ /* Check if the added client is already a scratchpad client */ -+ wl_list_for_each(cc, &scratchpad_clients, link_temp) { -+ if (cc == c) -+ return; -+ } -+ if (!c->isfloating) { -+ setfloating(c, 1); -+ } -+ wl_list_insert(&scratchpad_clients, &c->link_temp); -+} -+ -+void -+togglescratchpad(const Arg *arg) -+{ -+ Client *c; -+ Monitor *m = selmon; -+ -+ scratchpad_visible = !scratchpad_visible; -+ if (scratchpad_visible) { -+ wl_list_for_each(c, &scratchpad_clients, link_temp) { -+ c->mon = m; -+ c->tags = m->tagset[m->seltags]; -+ arrange(m); -+ focusclient(c, 1); -+ } -+ } else { -+ wl_list_for_each(c, &scratchpad_clients, link_temp) { -+ c->tags = 0; -+ focusclient(focustop(m), 1); -+ arrange(m); -+ } -+ } -+} -+ -+void -+removescratchpad(const Arg *arg) -+{ -+ Client *sc, *c = focustop(selmon); -+ -+ if (c && wl_list_length(&scratchpad_clients) > 0) { -+ /* Check if c is in scratchpad_clients */ -+ wl_list_for_each(sc, &scratchpad_clients, link_temp) { -+ if (sc == c) { -+ wl_list_remove(&c->link_temp); -+ break; -+ } -+ } -+ } -+} --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/simpleborders/README.md b/dwl-bak/dwl-patches/patches/simpleborders/README.md deleted file mode 100644 index 29dcf5e..0000000 --- a/dwl-bak/dwl-patches/patches/simpleborders/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description - -Like smartborders. Don't put borders when there is only one window on the screen. - -The patch for tag v0.7 below appears to apply cleanly to the current HEAD of -upstream/main as at 2024-10-11. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/simpleborders) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/simpleborders/simpleborders-v0.7.patch) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/simpleborders/simpleborders-v0.6.patch) -### Authors -- [Ben Collerson](https://codeberg.org/bencc) diff --git a/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.6.patch b/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.6.patch deleted file mode 100644 index a4797bb..0000000 --- a/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.6.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 681e520deaeee460647de36f5312af3cb0c31f4a Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Sat, 30 Dec 2023 13:39:31 +1000 -Subject: [PATCH] simpleborders - ---- - dwl.c | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/dwl.c b/dwl.c -index 4d19357..900e651 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -245,6 +245,7 @@ static void cleanupmon(struct wl_listener *listener, void *data); - static void closemon(Monitor *m); - static void commitlayersurfacenotify(struct wl_listener *listener, void *data); - static void commitnotify(struct wl_listener *listener, void *data); -+static int countclients(Monitor *m); - static void createdecoration(struct wl_listener *listener, void *data); - static void createidleinhibitor(struct wl_listener *listener, void *data); - static void createkeyboard(struct wlr_keyboard *keyboard); -@@ -286,6 +287,7 @@ static void motionabsolute(struct wl_listener *listener, void *data); - static void motionnotify(uint32_t time); - static void motionrelative(struct wl_listener *listener, void *data); - static void moveresize(const Arg *arg); -+static int needsborder(Client *c); - static void outputmgrapply(struct wl_listener *listener, void *data); - static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test); - static void outputmgrtest(struct wl_listener *listener, void *data); -@@ -739,6 +741,17 @@ commitnotify(struct wl_listener *listener, void *data) - c->resize = 0; - } - -+int -+countclients(Monitor *m) -+{ -+ unsigned int n = 0; -+ Client *c; -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ return n; -+} -+ - void - createdecoration(struct wl_listener *listener, void *data) - { -@@ -1697,6 +1710,14 @@ moveresize(const Arg *arg) - } - } - -+int -+needsborder(Client *c) { -+ return ((countclients(c->mon) > 1 -+ && c->mon->lt[c->mon->sellt]->arrange != monocle) -+ || c->isfloating) -+ && !c->isfullscreen; -+} -+ - void - outputmgrapply(struct wl_listener *listener, void *data) - { -@@ -1930,6 +1951,7 @@ resize(Client *c, struct wlr_box geo, int interact) - struct wlr_box clip; - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; -+ c->bw = needsborder(c) ? borderpx : 0; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.7.patch b/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.7.patch deleted file mode 100644 index e782d84..0000000 --- a/dwl-bak/dwl-patches/patches/simpleborders/simpleborders-v0.7.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 09759c3ef75158c366e9fc63814485fbb31a3ccf Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Sat, 30 Dec 2023 13:39:31 +1000 -Subject: [PATCH] simpleborders - ---- - dwl.c | 22 ++++++++++++++++++++++ - 1 file changed, 22 insertions(+) - -diff --git a/dwl.c b/dwl.c -index a2711f67..415fe1a0 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -259,6 +259,7 @@ static void closemon(Monitor *m); - static void commitlayersurfacenotify(struct wl_listener *listener, void *data); - static void commitnotify(struct wl_listener *listener, void *data); - static void commitpopup(struct wl_listener *listener, void *data); -+static int countclients(Monitor *m); - static void createdecoration(struct wl_listener *listener, void *data); - static void createidleinhibitor(struct wl_listener *listener, void *data); - static void createkeyboard(struct wlr_keyboard *keyboard); -@@ -308,6 +309,7 @@ static void motionnotify(uint32_t time, struct wlr_input_device *device, double - double sy, double sx_unaccel, double sy_unaccel); - static void motionrelative(struct wl_listener *listener, void *data); - static void moveresize(const Arg *arg); -+static int needsborder(Client *c); - static void outputmgrapply(struct wl_listener *listener, void *data); - static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test); - static void outputmgrtest(struct wl_listener *listener, void *data); -@@ -849,6 +851,17 @@ commitpopup(struct wl_listener *listener, void *data) - wl_list_remove(&listener->link); - } - -+int -+countclients(Monitor *m) -+{ -+ unsigned int n = 0; -+ Client *c; -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ return n; -+} -+ - void - createdecoration(struct wl_listener *listener, void *data) - { -@@ -1927,6 +1940,14 @@ moveresize(const Arg *arg) - } - } - -+int -+needsborder(Client *c) { -+ return ((countclients(c->mon) > 1 -+ && c->mon->lt[c->mon->sellt]->arrange != monocle) -+ || c->isfloating) -+ && !c->isfullscreen; -+} -+ - void - outputmgrapply(struct wl_listener *listener, void *data) - { -@@ -2190,6 +2211,7 @@ resize(Client *c, struct wlr_box geo, int interact) - - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; -+ c->bw = needsborder(c) ? borderpx : 0; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/singlemaster/README.md b/dwl-bak/dwl-patches/patches/singlemaster/README.md deleted file mode 100644 index 99cb1e6..0000000 --- a/dwl-bak/dwl-patches/patches/singlemaster/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Restricts layout to only having one client in the master area. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/singlemaster) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/singlemaster/singlemaster.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) diff --git a/dwl-bak/dwl-patches/patches/singlemaster/singlemaster.patch b/dwl-bak/dwl-patches/patches/singlemaster/singlemaster.patch deleted file mode 100644 index ffa6045..0000000 --- a/dwl-bak/dwl-patches/patches/singlemaster/singlemaster.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 610362d2f38260ad2a06ffbd91d089ba738429e9 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Thu, 18 Jul 2024 11:03:46 +1000 -Subject: [PATCH] singlemaster - ---- - config.def.h | 8 +++----- - dwl.c | 49 ++++++++++++++++++++++--------------------------- - 2 files changed, 25 insertions(+), 32 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..0ba9ddb8 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -43,12 +43,12 @@ static const Layout layouts[] = { - */ - /* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ - static const MonitorRule monrules[] = { -- /* name mfact nmaster scale layout rotate/reflect x y */ -+ /* name mfact scale layout rotate/reflect x y */ - /* example of a HiDPI laptop monitor: -- { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { "eDP-1", 0.5f, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - */ - /* defaults */ -- { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { NULL, 0.55f, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - }; - - /* keyboard */ -@@ -129,8 +129,6 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -- { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -- { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, -diff --git a/dwl.c b/dwl.c -index 145fd018..6a3c84a7 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -70,7 +70,6 @@ - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) --#define MIN(A, B) ((A) < (B) ? (A) : (B)) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) -@@ -204,7 +203,6 @@ struct Monitor { - uint32_t tagset[2]; - float mfact; - int gamma_lut_changed; -- int nmaster; - char ltsymbol[16]; - int asleep; - }; -@@ -212,7 +210,6 @@ struct Monitor { - typedef struct { - const char *name; - float mfact; -- int nmaster; - float scale; - const Layout *lt; - enum wl_output_transform rr; -@@ -288,7 +285,6 @@ static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void handlesig(int signo); --static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); -@@ -955,7 +951,6 @@ createmon(struct wl_listener *listener, void *data) - m->m.x = r->x; - m->m.y = r->y; - m->mfact = r->mfact; -- m->nmaster = r->nmaster; - m->lt[0] = r->lt; - m->lt[1] = &layouts[LENGTH(layouts) > 1 && r->lt != &layouts[1]]; - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); -@@ -1467,15 +1462,6 @@ handlesig(int signo) - } - } - --void --incnmaster(const Arg *arg) --{ -- if (!arg || !selmon) -- return; -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -- arrange(selmon); --} -- - void - inputdevice(struct wl_listener *listener, void *data) - { -@@ -2635,8 +2621,7 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int mw, my, ty; -- int i, n = 0; -+ unsigned int i, n = 0, mw, ty; - Client *c; - - wl_list_for_each(c, &clients, link) -@@ -2645,21 +2630,31 @@ tile(Monitor *m) - if (n == 0) - return; - -- if (n > m->nmaster) -- mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; -- else -- mw = m->w.width; -- i = my = ty = 0; -+ mw = (n == 1) ? m->w.width : (int)roundf(m->w.width * m->mfact); -+ i = ty = 0; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- if (i < m->nmaster) { -- resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -- my += c->geom.height; -+ if (i == 0) { -+ resize( -+ c, -+ (struct wlr_box){ -+ .x = m->w.x, -+ .y = m->w.y, -+ .width = mw, -+ .height = (m->w.height) -+ }, -+ 0); - } else { -- resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ resize( -+ c, -+ (struct wlr_box){ -+ .x = m->w.x + mw, -+ .y = m->w.y + ty, -+ .width = m->w.width - mw, -+ .height = (m->w.height - ty) / (n - i) -+ }, -+ 0); - ty += c->geom.height; - } - i++; --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/singletagset-pertag/README.md b/dwl-bak/dwl-patches/patches/singletagset-pertag/README.md deleted file mode 100644 index 13ab951..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset-pertag/README.md +++ /dev/null @@ -1,22 +0,0 @@ -### Description -Pertag keeps layouts, mfact and nmaster per tag -instead of per output. - -This adapted version of pertag contains one version of -the rules per all outputs, instead of one per output. -This makes switching to tags from other monitors keep -the window layout. - -This patch expects [singletagset](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/singletagset) -patch to be already in your tree committed. It applies onto it. - -This patch is incompatible with [pertag](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/pertag). - -### Download -- [2024-07-26](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/singletagset-pertag/singletagset-pertag.patch) -- [git branch](https://codeberg.org/Rutherther/dwl/src/branch/v0.7/singletagset-pertag) - -### Authors -- [Rutherther](https://codeberg.org/Rutherther) -- [wochap (maintainer of pertag patch)](https://codeberg.org/wochap) -- [Guido Cella (creator of pertag patch)](https://codeberg.org/guidocella) diff --git a/dwl-bak/dwl-patches/patches/singletagset-pertag/singletagset-pertag.patch b/dwl-bak/dwl-patches/patches/singletagset-pertag/singletagset-pertag.patch deleted file mode 100644 index 5fe4f47..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset-pertag/singletagset-pertag.patch +++ /dev/null @@ -1,261 +0,0 @@ -From 4f6bdd3ea1fcc83abd962e9a2dc7737519164a6b Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Fri, 19 Jul 2024 16:25:46 +0200 -Subject: [PATCH] singletagset-pertag - ---- - config.def.h | 12 +++++-- - dwl.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++------ - 2 files changed, 90 insertions(+), 12 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..7feb04d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -43,12 +43,18 @@ static const Layout layouts[] = { - */ - /* NOTE: ALWAYS add a fallback rule, even if you are completely sure it won't be used */ - static const MonitorRule monrules[] = { -- /* name mfact nmaster scale layout rotate/reflect x y */ -+ /* name scale rotate/reflect x y */ - /* example of a HiDPI laptop monitor: -- { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { "eDP-1", 2, WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - */ - /* defaults */ -- { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { NULL, 1, WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+}; -+ -+static const TagRule tagrules[] = { -+ /* tag mfact nmaster layout */ -+ /* defaults */ -+ { 0, 0.55, 1, &layouts[0] } - }; - - /* keyboard */ -diff --git a/dwl.c b/dwl.c -index 40a6e48..465d9dd 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -104,6 +104,7 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct Pertag Pertag; - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -209,6 +210,7 @@ struct Monitor { - int nmaster; - char ltsymbol[16]; - int asleep; -+ unsigned int pertag[2]; /* the tag used for layout via pertag */ - }; - - typedef struct { -@@ -226,6 +228,13 @@ typedef struct { - struct wl_listener destroy; - } PointerConstraint; - -+typedef struct { -+ unsigned int tag; -+ float mfact; -+ int nmaster; -+ const Layout *lt; -+} TagRule; -+ - typedef struct { - const char *id; - const char *title; -@@ -245,6 +254,7 @@ typedef struct { - - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); -+static void applypertag(Monitor *m); - static void applyrules(Client *c); - static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, -@@ -293,6 +303,7 @@ static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); -+static unsigned int getpertagtag(unsigned int curtagset); - static size_t getunusedtag(void); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); -@@ -415,6 +426,7 @@ static struct wlr_output_layout *output_layout; - static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; -+static Pertag pertag; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -435,6 +447,13 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+struct Pertag { -+ int nmasters[TAGCOUNT + 1]; /* number of windows in master area */ -+ float mfacts[TAGCOUNT + 1]; /* mfacts per tag */ -+ unsigned int sellts[TAGCOUNT + 1]; /* selected layouts */ -+ const Layout *ltidxs[TAGCOUNT + 1][2]; /* matrix of tags and layouts indexes */ -+}; -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -1023,6 +1042,33 @@ createlocksurface(struct wl_listener *listener, void *data) - client_notify_enter(lock_surface->surface, wlr_seat_get_keyboard(seat)); - } - -+unsigned int -+getpertagtag(unsigned int curtagset) -+{ -+ size_t i; -+ -+ if (curtagset == TAGMASK) { -+ return 0; -+ } -+ -+ if ((curtagset & TAGMASK) == 0) { -+ return 0; // What to do in this case? -+ } -+ -+ for (i = 0; !(curtagset & 1 << i); i++) ; -+ return i + 1; -+} -+ -+void -+applypertag(Monitor *m) -+{ -+ m->nmaster = pertag.nmasters[m->pertag[m->seltags]]; -+ m->mfact = pertag.mfacts[m->pertag[m->seltags]]; -+ m->sellt = pertag.sellts[m->pertag[m->seltags]]; -+ m->lt[m->sellt] = pertag.ltidxs[m->pertag[m->seltags]][m->sellt]; -+ m->lt[m->sellt^1] = pertag.ltidxs[m->pertag[m->seltags]][m->sellt^1]; -+} -+ - void - createmon(struct wl_listener *listener, void *data) - { -@@ -1046,14 +1092,12 @@ createmon(struct wl_listener *listener, void *data) - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ - m->tagset[0] = m->tagset[1] = (1<pertag[0] = m->pertag[1] = getpertagtag(m->tagset[0]); -+ applypertag(m); - for (r = monrules; r < END(monrules); r++) { - if (!r->name || strstr(wlr_output->name, r->name)) { - m->m.x = r->x; - m->m.y = r->y; -- m->mfact = r->mfact; -- m->nmaster = r->nmaster; -- m->lt[0] = r->lt; -- m->lt[1] = &layouts[LENGTH(layouts) > 1 && r->lt != &layouts[1]]; - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - wlr_output_state_set_scale(&state, r->scale); - wlr_output_state_set_transform(&state, r->rr); -@@ -1597,7 +1641,7 @@ incnmaster(const Arg *arg) - { - if (!arg || !selmon) - return; -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = pertag.nmasters[selmon->pertag[selmon->seltags]] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -2433,9 +2477,9 @@ setlayout(const Arg *arg) - if (!selmon) - return; - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -+ selmon->sellt = pertag.sellts[selmon->pertag[selmon->seltags]] ^= 1; - if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = pertag.ltidxs[selmon->pertag[selmon->seltags]][selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); - printstatus(); -@@ -2452,7 +2496,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0f ? arg->f + selmon->mfact : arg->f - 1.0f; - if (f < 0.1 || f > 0.9) - return; -- selmon->mfact = f; -+ selmon->mfact = pertag.mfacts[selmon->pertag[selmon->seltags]] = f; - arrange(selmon); - } - -@@ -2504,6 +2548,10 @@ setsel(struct wl_listener *listener, void *data) - void - setup(void) - { -+ const TagRule *r; -+ struct xkb_context *context; -+ struct xkb_keymap *keymap; -+ - int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; - struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; - sigemptyset(&sa.sa_mask); -@@ -2596,6 +2644,19 @@ setup(void) - LISTEN_STATIC(&output_layout->events.change, updatemons); - wlr_xdg_output_manager_v1_create(dpy, output_layout); - -+ for (i = 0; i <= TAGCOUNT; i++) { -+ for (r = tagrules; r < END(tagrules); r++) { -+ if (!r->tag || r->tag == i) { -+ pertag.mfacts[i] = r->mfact; -+ pertag.nmasters[i] = r->nmaster; -+ pertag.sellts[i] = 0; -+ pertag.ltidxs[i][0] = r->lt; -+ pertag.ltidxs[i][1] = r->lt; -+ break; -+ } -+ } -+ } -+ - /* Configure a listener to be notified when new outputs are available on the - * backend. */ - wl_list_init(&mons); -@@ -2857,6 +2918,12 @@ toggleview(const Arg *arg) - if (m !=selmon && newtagset & m->tagset[m->seltags]) - return; - -+ // set new pertag tag only if the tag we were at was removed, or if all tags are shown. -+ if (!(newtagset & 1 << (selmon->pertag[selmon->seltags] - 1)) || newtagset == TAGMASK) { -+ selmon->pertag[selmon->seltags] = getpertagtag(newtagset); -+ } -+ -+ applypertag(selmon); - selmon->tagset[selmon->seltags] = newtagset; - attachclients(selmon); - focusclient(focustop(selmon), 1); -@@ -3072,6 +3139,8 @@ view(const Arg *arg) - } - m->seltags ^= 1; - m->tagset[m->seltags] = origm->tagset[origm->seltags]; -+ m->pertag[m->seltags] = origm->pertag[origm->seltags]; -+ applypertag(m); - attachclients(m); - /* Beware: this changes selmon */ - focusclient(focustop(m), 1); -@@ -3081,11 +3150,14 @@ view(const Arg *arg) - } - - origm->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & TAGMASK) { - origm->tagset[origm->seltags] = arg->ui & TAGMASK; -+ origm->pertag[origm->seltags] = getpertagtag(arg->ui & TAGMASK); -+ } - - /* Change selmon back to orig mon */ - selmon = origm; -+ applypertag(origm); - attachclients(origm); - focusclient(focustop(origm), 1); - arrange(origm); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/singletagset-sticky/README.md b/dwl-bak/dwl-patches/patches/singletagset-sticky/README.md deleted file mode 100644 index f1f9fd3..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset-sticky/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -Makes sticky work as expected with singletagset. The sticky window will -stay on original output until you explicitely put it to a different monitor. - -This patch expects both [singletagset](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/singletagset) and [sticky](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/sticky) patches to be already in -your tree committed. It applies onto them. - -### Download -- [2024-07-26](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/singletagset-sticky/singletagset-sticky.patch) -- [git branch](https://codeberg.org/Rutherther/dwl/src/branch/v0.7/singletagset-sticky) - -### Authors -- [Rutherther](https://codeberg.org/Rutherther) diff --git a/dwl-bak/dwl-patches/patches/singletagset-sticky/singletagset-sticky.patch b/dwl-bak/dwl-patches/patches/singletagset-sticky/singletagset-sticky.patch deleted file mode 100644 index ce6a40c..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset-sticky/singletagset-sticky.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a37d65c8601a7c5b03c53bb99956da8a24952628 Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Fri, 19 Jul 2024 16:51:26 +0200 -Subject: [PATCH] singletagset-sticky - ---- - dwl.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 59e56bd..fbbdff9 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -73,8 +73,8 @@ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) - #define MIN(A, B) ((A) < (B) ? (A) : (B)) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) --#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && (((C)->tags & (M)->tagset[(M)->seltags])) || (C)->issticky) --#define SVISIBLEON(C, M) ((M) && (C)->mon && ((C)->tags & (M)->tagset[(M)->seltags])) -+#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((((C)->tags & (M)->tagset[(M)->seltags])) || (C)->issticky)) -+#define SVISIBLEON(C, M) ((M) && (C)->mon && (((C)->tags & (M)->tagset[(M)->seltags]) && !(C)->issticky) || ((C)->issticky && (C)->mon == (M))) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/singletagset/README.md b/dwl-bak/dwl-patches/patches/singletagset/README.md deleted file mode 100644 index 920d8a4..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Single set of tags shared between multiple monitors. - -This patch allows all the tags to be shared between both (or more) monitors. -So a single set of tags from 1 to 9 can be viewed on any monitor, as opposed to -having separate tag sets 1 to 9 on each monitor. - -Originally based on the dwm single_tagset patch: -https://dwm.suckless.org/patches/single_tagset/ - -### Download -- [git branch (v0.7)](https://codeberg.org/Rutherther/dwl/src/branch/v0.7/singletagset) -- [git branch (v0.6)](https://codeberg.org/bencc/dwl/src/branch/singletagset) -- [2024-07-26 (v0.7)](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/singletagset/singletagset-v0.7.patch) -- [2024-05-16 (v0.6)](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/singletagset/singletagset-v0.6.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) -- [Rutherther](https://codeberg.org/Rutherther) diff --git a/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.6.patch b/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.6.patch deleted file mode 100644 index 708774b..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.6.patch +++ /dev/null @@ -1,293 +0,0 @@ -From 140fe587bf34cf43e44acaf365b16ec3e385f742 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Thu, 16 May 2024 09:56:58 +1000 -Subject: [PATCH] singletagset - ---- - dwl.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 140 insertions(+), 10 deletions(-) - -diff --git a/dwl.c b/dwl.c -index bf763dfc..5b1d594f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -72,6 +72,7 @@ - #define ROUND(X) ((int)((X < 0) ? (X - 0.5) : (X + 0.5))) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) -+#define SVISIBLEON(C, M) ((M) && (C)->mon && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) -@@ -246,6 +247,7 @@ static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -+static void attachclients(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); -@@ -283,6 +285,7 @@ static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); -+static size_t getunusedtag(void); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); -@@ -470,7 +473,18 @@ applyrules(Client *c) - } - } - } -+ wlr_scene_node_reparent(&c->scene->node, layers[c->isfloating ? LyrFloat : LyrTile]); -+ -+ wl_list_for_each(m, &mons, link) { -+ // tag with different monitor selected by rules -+ if (m->tagset[m->seltags] & newtags) { -+ mon = m; -+ break; -+ } -+ } -+ - setmon(c, mon, newtags); -+ attachclients(mon); - } - - void -@@ -558,6 +572,45 @@ arrangelayers(Monitor *m) - } - } - -+void -+attachclients(Monitor *m) -+{ -+ Monitor *tm; -+ unsigned int utags = 0; -+ Client *c; -+ int rmons = 0; -+ -+ if (m == NULL) { -+ return; -+ } -+ -+ wl_list_for_each(tm, &mons, link) { -+ if (tm != m) { -+ utags |= tm->tagset[tm->seltags]; -+ } -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (SVISIBLEON(c, m)) { -+ /* if client is also visible on other tags that are displayed on -+ * other monitors, remove these tags */ -+ if (c->tags & utags) { -+ c->tags = c->tags & m->tagset[m->seltags]; -+ rmons = 1; -+ } -+ setmon(c, m, c->tags); -+ } -+ } -+ -+ if (rmons) { -+ wl_list_for_each(tm, &mons, link) { -+ if (tm != m) { -+ arrange(tm); -+ } -+ } -+ } -+} -+ - void - axisnotify(struct wl_listener *listener, void *data) - { -@@ -881,7 +934,7 @@ createmon(struct wl_listener *listener, void *data) - - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ -- m->tagset[0] = m->tagset[1] = 1; -+ m->tagset[0] = m->tagset[1] = (1<name || strstr(wlr_output->name, r->name)) { - m->m.x = r->x; -@@ -1354,7 +1407,7 @@ focustop(Monitor *m) - { - Client *c; - wl_list_for_each(c, &fstack, flink) { -- if (VISIBLEON(c, m)) -+ if (SVISIBLEON(c, m)) - return c; - } - return NULL; -@@ -1367,6 +1420,29 @@ fullscreennotify(struct wl_listener *listener, void *data) - setfullscreen(c, client_wants_fullscreen(c)); - } - -+size_t -+getunusedtag(void) -+{ -+ size_t i = 0; -+ Monitor *m; -+ if (wl_list_empty(&mons)) { -+ return i; -+ } -+ for (i=0; i < TAGCOUNT; i++) { -+ int is_used = 0; -+ wl_list_for_each(m, &mons, link) { -+ if ((m->tagset[m->seltags] & (1<mon != m) -- continue; - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; -@@ -2551,6 +2625,7 @@ startdrag(struct wl_listener *listener, void *data) - void - tag(const Arg *arg) - { -+ Monitor *m; - Client *sel = focustop(selmon); - if (!sel || (arg->ui & TAGMASK) == 0) - return; -@@ -2558,15 +2633,25 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -+ wl_list_for_each(m, &mons, link) { -+ attachclients(m); -+ arrange(m); -+ } - printstatus(); - } - - void - tagmon(const Arg *arg) - { -+ Monitor *m; - Client *sel = focustop(selmon); -- if (sel) -+ if (sel) { - setmon(sel, dirtomon(arg->i), 0); -+ wl_list_for_each(m, &mons, link) { -+ arrange(m); -+ } -+ focusclient(focustop(sel->mon), 1); -+ } - } - - void -@@ -2623,12 +2708,18 @@ togglefullscreen(const Arg *arg) - void - toggletag(const Arg *arg) - { -+ Monitor *m; - uint32_t newtags; - Client *sel = focustop(selmon); - if (!sel || !(newtags = sel->tags ^ (arg->ui & TAGMASK))) - return; - -+ wl_list_for_each(m, &mons, link) -+ if (m != selmon && newtags & m->tagset[m->seltags]) -+ return; -+ - sel->tags = newtags; -+ attachclients(selmon); - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -@@ -2637,11 +2728,17 @@ toggletag(const Arg *arg) - void - toggleview(const Arg *arg) - { -+ Monitor *m; - uint32_t newtagset; - if (!(newtagset = selmon ? selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK) : 0)) - return; - -+ wl_list_for_each(m, &mons, link) -+ if (m !=selmon && newtagset & m->tagset[m->seltags]) -+ return; -+ - selmon->tagset[selmon->seltags] = newtagset; -+ attachclients(selmon); - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -@@ -2759,6 +2856,7 @@ updatemons(struct wl_listener *listener, void *data) - wlr_session_lock_surface_v1_configure(m->lock_surface, m->m.width, m->m.height); - } - -+ attachclients(m); - /* Calculate the effective monitor geometry to use for clients */ - arrangelayers(m); - /* Don't move clients to the left output when plugging monitors */ -@@ -2825,13 +2923,45 @@ urgent(struct wl_listener *listener, void *data) - void - view(const Arg *arg) - { -- if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) -+ Monitor *m, *origm = selmon; -+ unsigned int newtags; -+ -+ if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) { - return; -- selmon->seltags ^= 1; /* toggle sel tagset */ -+ } -+ -+ newtags = origm->tagset[origm->seltags ^ 1]; -+ -+ /* swap tags when trying to display a tag from another monitor */ -+ if (arg->ui & TAGMASK) { -+ newtags = arg->ui & TAGMASK; -+ } -+ wl_list_for_each(m, &mons, link) { -+ if (m != origm && newtags & m->tagset[m->seltags]) { -+ /* prevent displaying all tags (MODKEY-0) when multiple monitors -+ * are connected */ -+ if (newtags & origm->tagset[origm->seltags]) { -+ return; -+ } -+ m->seltags ^= 1; -+ m->tagset[m->seltags] = origm->tagset[origm->seltags]; -+ attachclients(m); -+ /* Beware: this changes selmon */ -+ focusclient(focustop(m), 1); -+ arrange(m); -+ break; -+ } -+ } -+ -+ origm->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) -- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -- arrange(selmon); -+ origm->tagset[origm->seltags] = arg->ui & TAGMASK; -+ -+ /* Change selmon back to orig mon */ -+ selmon = origm; -+ attachclients(origm); -+ focusclient(focustop(origm), 1); -+ arrange(origm); - printstatus(); - } - --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.7.patch b/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.7.patch deleted file mode 100644 index 9c2f98b..0000000 --- a/dwl-bak/dwl-patches/patches/singletagset/singletagset-v0.7.patch +++ /dev/null @@ -1,312 +0,0 @@ -From bd90ec504369a69dbefc34cb72265d15c7795944 Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Fri, 26 Jul 2024 12:36:41 +0200 -Subject: [PATCH] singletagset - ---- - dwl.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 145 insertions(+), 10 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 5bf995e..40a6e48 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -74,6 +74,7 @@ - #define MIN(A, B) ((A) < (B) ? (A) : (B)) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) - #define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) -+#define SVISIBLEON(C, M) ((M) && (C)->mon && ((C)->tags & (M)->tagset[(M)->seltags])) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) -@@ -249,6 +250,7 @@ static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -+static void attachclients(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); -@@ -291,6 +293,7 @@ static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); -+static size_t getunusedtag(void); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); -@@ -478,7 +481,17 @@ applyrules(Client *c) - } - } - } -+ -+ wl_list_for_each(m, &mons, link) { -+ // tag with different monitor selected by rules -+ if (m->tagset[m->seltags] & newtags) { -+ mon = m; -+ break; -+ } -+ } -+ - setmon(c, mon, newtags); -+ attachclients(mon); - } - - void -@@ -580,6 +593,45 @@ arrangelayers(Monitor *m) - } - } - -+void -+attachclients(Monitor *m) -+{ -+ Monitor *tm; -+ unsigned int utags = 0; -+ Client *c; -+ int rmons = 0; -+ -+ if (m == NULL) { -+ return; -+ } -+ -+ wl_list_for_each(tm, &mons, link) { -+ if (tm != m) { -+ utags |= tm->tagset[tm->seltags]; -+ } -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (SVISIBLEON(c, m)) { -+ /* if client is also visible on other tags that are displayed on -+ * other monitors, remove these tags */ -+ if (c->tags & utags) { -+ c->tags = c->tags & m->tagset[m->seltags]; -+ rmons = 1; -+ } -+ setmon(c, m, c->tags); -+ } -+ } -+ -+ if (rmons) { -+ wl_list_for_each(tm, &mons, link) { -+ if (tm != m) { -+ arrange(tm); -+ } -+ } -+ } -+} -+ - void - axisnotify(struct wl_listener *listener, void *data) - { -@@ -750,6 +802,9 @@ closemon(Monitor *m) - if (c->mon == m) - setmon(c, selmon, c->tags); - } -+ -+ m->tagset[0] = m->tagset[1] = 0; -+ - focusclient(focustop(selmon), 1); - printstatus(); - } -@@ -990,7 +1045,7 @@ createmon(struct wl_listener *listener, void *data) - - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ -- m->tagset[0] = m->tagset[1] = 1; -+ m->tagset[0] = m->tagset[1] = (1<name || strstr(wlr_output->name, r->name)) { - m->m.x = r->x; -@@ -1456,7 +1511,7 @@ focustop(Monitor *m) - { - Client *c; - wl_list_for_each(c, &fstack, flink) { -- if (VISIBLEON(c, m)) -+ if (SVISIBLEON(c, m)) - return c; - } - return NULL; -@@ -1469,6 +1524,29 @@ fullscreennotify(struct wl_listener *listener, void *data) - setfullscreen(c, client_wants_fullscreen(c)); - } - -+size_t -+getunusedtag(void) -+{ -+ size_t i = 0; -+ Monitor *m; -+ if (wl_list_empty(&mons)) { -+ return i; -+ } -+ for (i=0; i < TAGCOUNT; i++) { -+ int is_used = 0; -+ wl_list_for_each(m, &mons, link) { -+ if ((m->tagset[m->seltags] & (1<mon != m) -- continue; - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; -@@ -2669,6 +2745,7 @@ startdrag(struct wl_listener *listener, void *data) - void - tag(const Arg *arg) - { -+ Monitor *m; - Client *sel = focustop(selmon); - if (!sel || (arg->ui & TAGMASK) == 0) - return; -@@ -2676,15 +2753,25 @@ tag(const Arg *arg) - sel->tags = arg->ui & TAGMASK; - focusclient(focustop(selmon), 1); - arrange(selmon); -+ wl_list_for_each(m, &mons, link) { -+ attachclients(m); -+ arrange(m); -+ } - printstatus(); - } - - void - tagmon(const Arg *arg) - { -+ Monitor *m; - Client *sel = focustop(selmon); -- if (sel) -+ if (sel) { - setmon(sel, dirtomon(arg->i), 0); -+ wl_list_for_each(m, &mons, link) { -+ arrange(m); -+ } -+ focusclient(focustop(sel->mon), 1); -+ } - } - - void -@@ -2741,12 +2828,18 @@ togglefullscreen(const Arg *arg) - void - toggletag(const Arg *arg) - { -+ Monitor *m; - uint32_t newtags; - Client *sel = focustop(selmon); - if (!sel || !(newtags = sel->tags ^ (arg->ui & TAGMASK))) - return; - -+ wl_list_for_each(m, &mons, link) -+ if (m != selmon && newtags & m->tagset[m->seltags]) -+ return; -+ - sel->tags = newtags; -+ attachclients(selmon); - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -@@ -2755,11 +2848,17 @@ toggletag(const Arg *arg) - void - toggleview(const Arg *arg) - { -+ Monitor *m; - uint32_t newtagset; - if (!(newtagset = selmon ? selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK) : 0)) - return; - -+ wl_list_for_each(m, &mons, link) -+ if (m !=selmon && newtagset & m->tagset[m->seltags]) -+ return; -+ - selmon->tagset[selmon->seltags] = newtagset; -+ attachclients(selmon); - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -@@ -2863,6 +2962,9 @@ updatemons(struct wl_listener *listener, void *data) - continue; - config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); - -+ if ((m->tagset[0] & TAGMASK) == 0 && (m->tagset[1] & TAGMASK) == 0) -+ m->tagset[0] = m->tagset[1] = (1 << getunusedtag()) & TAGMASK; -+ - /* Get the effective monitor geometry to use for surfaces */ - wlr_output_layout_get_box(output_layout, m->wlr_output, &m->m); - m->w = m->m; -@@ -2877,6 +2979,7 @@ updatemons(struct wl_listener *listener, void *data) - wlr_session_lock_surface_v1_configure(m->lock_surface, m->m.width, m->m.height); - } - -+ attachclients(m); - /* Calculate the effective monitor geometry to use for clients */ - arrangelayers(m); - /* Don't move clients to the left output when plugging monitors */ -@@ -2947,13 +3050,45 @@ urgent(struct wl_listener *listener, void *data) - void - view(const Arg *arg) - { -- if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) -+ Monitor *m, *origm = selmon; -+ unsigned int newtags; -+ -+ if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) { - return; -- selmon->seltags ^= 1; /* toggle sel tagset */ -+ } -+ -+ newtags = origm->tagset[origm->seltags ^ 1]; -+ -+ /* swap tags when trying to display a tag from another monitor */ -+ if (arg->ui & TAGMASK) { -+ newtags = arg->ui & TAGMASK; -+ } -+ wl_list_for_each(m, &mons, link) { -+ if (m != origm && newtags & m->tagset[m->seltags]) { -+ /* prevent displaying all tags (MODKEY-0) when multiple monitors -+ * are connected */ -+ if (newtags & origm->tagset[origm->seltags]) { -+ return; -+ } -+ m->seltags ^= 1; -+ m->tagset[m->seltags] = origm->tagset[origm->seltags]; -+ attachclients(m); -+ /* Beware: this changes selmon */ -+ focusclient(focustop(m), 1); -+ arrange(m); -+ break; -+ } -+ } -+ -+ origm->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) -- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -- arrange(selmon); -+ origm->tagset[origm->seltags] = arg->ui & TAGMASK; -+ -+ /* Change selmon back to orig mon */ -+ selmon = origm; -+ attachclients(origm); -+ focusclient(focustop(origm), 1); -+ arrange(origm); - printstatus(); - } - --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/skipfocus/README.md b/dwl-bak/dwl-patches/patches/skipfocus/README.md deleted file mode 100644 index 4fb6e8a..0000000 --- a/dwl-bak/dwl-patches/patches/skipfocus/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Description -Adds a rule-based ability to skip automatically focusing a window on creation. Expected use-case is for transient windows like notifications etc. The window can still be focused by mouse or keyboard movement. - -| `skipfocus` value | effect | -| ----------------- | ------------------ | -| 0 | usual | -| 1 | skipautofocus | -| 2 | skipfocus entirely | - -### Download -- [2024-09-18](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/skipfocus/skipfocus.patch) -- [2024-07-14](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/skipfocus/skipfocus-20240714.patch) -- [2024-01-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/skipfocus/skipfocus-20240108.patch) -- [git branch](https://codeberg.org/dhruva_sambrani/dwl/src/branch/skipfocus) - -### Authors -- [Dhruva Sambrani](https://codeberg.org/dhruva_sambrani) - diff --git a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus-20240714.patch b/dwl-bak/dwl-patches/patches/skipfocus/skipfocus-20240714.patch deleted file mode 100644 index 2715fb9..0000000 --- a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus-20240714.patch +++ /dev/null @@ -1,81 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 22d2171..9f6599c 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -22,10 +22,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating skipfocus monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, 0, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "mako_EXAMPLE", NULL, 0, 1, 1, -1 }, /* Start floating and skip focus - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index 145fd01..ec9d1af 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -138,7 +138,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, skipfocus; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -229,6 +229,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int skipfocus; - int monitor; - } Rule; - -@@ -465,6 +466,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->skipfocus = r->skipfocus; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1323,6 +1325,13 @@ focusclient(Client *c, int lift) - if (locked) - return; - -+ if (c && c->skipfocus != 0){ -+ if (c -> skipfocus == 1) { -+ c->skipfocus = 0; -+ } -+ return; -+ } -+ - /* Raise client in stacking order if requested */ - if (c && lift) - wlr_scene_node_raise_to_top(&c->scene->node); -@@ -1692,11 +1701,13 @@ mapnotify(struct wl_listener *listener, void *data) - printstatus(); - - unset_fullscreen: -- m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -- wl_list_for_each(w, &clients, link) { -- if (w != c && w->isfullscreen && m == w->mon && (w->tags & c->tags)) -- setfullscreen(w, 0); -- } -+ if (!c->skipfocus) { -+ m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -+ wl_list_for_each(w, &clients, link) { -+ if (w != c && w->isfullscreen && m == w->mon && (w->tags & c->tags)) -+ setfullscreen(w, 0); -+ } -+ } - } - - void diff --git a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus.patch b/dwl-bak/dwl-patches/patches/skipfocus/skipfocus.patch deleted file mode 100644 index ed445ec..0000000 --- a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus.patch +++ /dev/null @@ -1,81 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 22d2171..9f6599c 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -22,10 +22,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating skipfocus monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, 0, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "mako_EXAMPLE", NULL, 0, 1, 1, -1 }, /* Start floating and skip focus - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index dc0c861..b6a4cbb 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -141,7 +141,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, skipfocus; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -231,6 +231,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int skipfocus; - int monitor; - } Rule; - -@@ -466,6 +467,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->skipfocus = r->skipfocus; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1343,6 +1345,13 @@ focusclient(Client *c, int lift) - if (locked) - return; - -+ if (c && c->skipfocus != 0){ -+ if (c -> skipfocus == 1) { -+ c->skipfocus = 0; -+ } -+ return; -+ } -+ - /* Raise client in stacking order if requested */ - if (c && lift) - wlr_scene_node_raise_to_top(&c->scene->node); -@@ -1738,11 +1747,13 @@ mapnotify(struct wl_listener *listener, void *data) - printstatus(); - - unset_fullscreen: -- m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -- wl_list_for_each(w, &clients, link) { -- if (w != c && w != p && w->isfullscreen && m == w->mon && (w->tags & c->tags)) -- setfullscreen(w, 0); -- } -+ if (!c->skipfocus) { -+ m = c->mon ? c->mon : xytomon(c->geom.x, c->geom.y); -+ wl_list_for_each(w, &clients, link) { -+ if (w != c && w != p && w->isfullscreen && m == w->mon && (w->tags & c->tags)) -+ setfullscreen(w, 0); -+ } -+ } - } - - void diff --git a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus20240108.patch b/dwl-bak/dwl-patches/patches/skipfocus/skipfocus20240108.patch deleted file mode 100644 index 10d5f4f..0000000 --- a/dwl-bak/dwl-patches/patches/skipfocus/skipfocus20240108.patch +++ /dev/null @@ -1,62 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index a784eb4..5d3a4f9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -21,10 +21,11 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - static int log_level = WLR_ERROR; - - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating skipfocus monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, 0, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "mako_EXAMPLE", NULL, 0, 1, 1, -1 }, /* Start floating and skip focus - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index 6f041a0..90ac57b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -137,7 +137,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, skipfocus; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -228,6 +228,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int skipfocus; - int monitor; - } Rule; - -@@ -464,6 +465,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->skipfocus = r->skipfocus; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -1307,6 +1309,13 @@ focusclient(Client *c, int lift) - if (locked) - return; - -+ if (c && c->skipfocus != 0){ -+ if (c -> skipfocus == 1) { -+ c->skipfocus = 0; -+ } -+ return; -+ } -+ - /* Raise client in stacking order if requested */ - if (c && lift) - wlr_scene_node_raise_to_top(&c->scene->node); diff --git a/dwl-bak/dwl-patches/patches/smartborders/README.md b/dwl-bak/dwl-patches/patches/smartborders/README.md deleted file mode 100644 index 6fe0e59..0000000 --- a/dwl-bak/dwl-patches/patches/smartborders/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Description -The borders of a window aren't drawn when the window is the only tiling window -in its tag OR if the window is in a monocle layout. - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/smartborders) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/smartborders/smartborders.patch) -- [smartborders-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/smartborders/smartborders-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) -- [fauxmight](https://codeberg.org/fauxmight) -- [Piotr Marendowski](https://github.com/piotr-marendowski) -- Andrey Proskurin diff --git a/dwl-bak/dwl-patches/patches/smartborders/smartborders-0.7.patch b/dwl-bak/dwl-patches/patches/smartborders/smartborders-0.7.patch deleted file mode 100644 index 732f06f..0000000 --- a/dwl-bak/dwl-patches/patches/smartborders/smartborders-0.7.patch +++ /dev/null @@ -1,204 +0,0 @@ -From b10e044d95072994d9b00b31ea70051ab02a026b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Tue, 16 Aug 2022 15:28:00 -0500 -Subject: [PATCH] don't draw borders if there is only one window -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Co-authored-by: A Frederick Christensen -Co-authored-by: Andrey Proskurin -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 1 + - dwl.c | 47 +++++++++++++++++++++++++++++++---------------- - 2 files changed, 32 insertions(+), 16 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..632f151f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,6 +6,7 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -+static const int smartborders = 1; - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); -diff --git a/dwl.c b/dwl.c -index a2711f67..647ce38c 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -320,7 +320,7 @@ static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); --static void resize(Client *c, struct wlr_box geo, int interact); -+static void resize(Client *c, struct wlr_box geo, int interact, int draw_borders); - static void run(char *startup_cmd); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); -@@ -746,7 +746,7 @@ closemon(Monitor *m) - wl_list_for_each(c, &clients, link) { - if (c->isfloating && c->geom.x > m->m.width) - resize(c, (struct wlr_box){.x = c->geom.x - m->w.width, .y = c->geom.y, -- .width = c->geom.width, .height = c->geom.height}, 0); -+ .width = c->geom.width, .height = c->geom.height}, 0, 1); - if (c->mon == m) - setmon(c, selmon, c->tags); - } -@@ -814,8 +814,11 @@ commitnotify(struct wl_listener *listener, void *data) - return; - } - -- if (client_surface(c)->mapped && c->mon) -- resize(c, c->geom, (c->isfloating && !c->isfullscreen)); -+ if (client_surface(c)->mapped && c->mon && c->mon->lt[c->mon->sellt]->arrange -+ && !c->isfullscreen && !c->isfloating) -+ c->mon->lt[c->mon->sellt]->arrange(c->mon); -+ else -+ resize(c, c->geom, (c->isfloating && !c->isfullscreen), (c->isfloating && !c->isfullscreen)); - - /* mark a pending resize as completed */ - if (c->resize && c->resize <= c->surface.xdg->current.configure_serial) -@@ -1775,7 +1778,7 @@ monocle(Monitor *m) - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- resize(c, m->w, 0); -+ resize(c, m->w, 0, !smartborders); - n++; - } - if (n) -@@ -1867,11 +1870,11 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - if (cursor_mode == CurMove) { - /* Move the grabbed client to the new position. */ - resize(grabc, (struct wlr_box){.x = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, -- .width = grabc->geom.width, .height = grabc->geom.height}, 1); -+ .width = grabc->geom.width, .height = grabc->geom.height}, 1, 1); - return; - } else if (cursor_mode == CurResize) { - resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -+ .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1, 1); - return; - } - -@@ -2178,7 +2181,7 @@ requestmonstate(struct wl_listener *listener, void *data) - } - - void --resize(Client *c, struct wlr_box geo, int interact) -+resize(Client *c, struct wlr_box geo, int interact, int draw_borders) - { - struct wlr_box *bbox; - struct wlr_box clip; -@@ -2190,6 +2193,7 @@ resize(Client *c, struct wlr_box geo, int interact) - - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; -+ c->bw = draw_borders ? borderpx : 0; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ -@@ -2314,6 +2318,8 @@ setfloating(Client *c, int floating) - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen || - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); -+ if (c->isfloating && !c->bw) -+ resize(c, c->mon->m, 0, 1); - arrange(c->mon); - printstatus(); - } -@@ -2331,11 +2337,11 @@ setfullscreen(Client *c, int fullscreen) - - if (fullscreen) { - c->prev = c->geom; -- resize(c, c->mon->m, 0); -+ resize(c, c->mon->m, 0, 0); - } else { - /* restore previous size instead of arrange for floating windows since - * client positions are set by the user and cannot be recalculated */ -- resize(c, c->prev, 0); -+ resize(c, c->prev, 0, 1); - } - arrange(c->mon); - printstatus(); -@@ -2362,6 +2368,12 @@ setlayout(const Arg *arg) - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); -+ if (!selmon->lt[selmon->sellt]->arrange) { -+ /* floating layout, draw borders around all clients */ -+ Client *c; -+ wl_list_for_each(c, &clients, link) -+ resize(c, c->mon->m, 0, 1); -+ } - arrange(selmon); - printstatus(); - } -@@ -2396,7 +2408,7 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - arrange(oldmon); - if (m) { - /* Make sure window actually overlaps with the monitor */ -- resize(c, c->geom, 0); -+ resize(c, c->geom, 0, 1); - c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */ - setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ - setfloating(c, c->isfloating); -@@ -2691,7 +2703,7 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int mw, my, ty; -+ unsigned int mw, my, ty, draw_borders = 1; - int i, n = 0; - Client *c; - -@@ -2701,6 +2713,9 @@ tile(Monitor *m) - if (n == 0) - return; - -+ if (n == smartborders) -+ draw_borders = 0; -+ - if (n > m->nmaster) - mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; - else -@@ -2711,11 +2726,11 @@ tile(Monitor *m) - continue; - if (i < m->nmaster) { - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -+ .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0, draw_borders); - my += c->geom.height; - } else { - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0, draw_borders); - ty += c->geom.height; - } - i++; -@@ -2884,7 +2899,7 @@ updatemons(struct wl_listener *listener, void *data) - arrange(m); - /* make sure fullscreen clients have the right size */ - if ((c = focustop(m)) && c->isfullscreen) -- resize(c, m->m, 0); -+ resize(c, m->m, 0, 0); - - /* Try to re-set the gamma LUT when updating monitors, - * it's only really needed when enabling a disabled output, but meh. */ -@@ -3087,7 +3102,7 @@ configurex11(struct wl_listener *listener, void *data) - } - if (c->isfloating || client_is_unmanaged(c)) - resize(c, (struct wlr_box){.x = event->x, .y = event->y, -- .width = event->width + c->bw * 2, .height = event->height + c->bw * 2}, 0); -+ .width = event->width + c->bw * 2, .height = event->height + c->bw * 2}, 0, 1); - else - arrange(c->mon); - } --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/smartborders/smartborders.patch b/dwl-bak/dwl-patches/patches/smartborders/smartborders.patch deleted file mode 100644 index 5eac3ee..0000000 --- a/dwl-bak/dwl-patches/patches/smartborders/smartborders.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 38010bdecf63bdb8acfc584825b398838310eed1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Tue, 16 Aug 2022 15:28:00 -0500 -Subject: [PATCH] don't draw borders if there is only one window -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Co-authored-by: A Frederick Christensen -Co-authored-by: Andrey Proskurin -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 1 + - dwl.c | 46 +++++++++++++++++++++++++++++++--------------- - 2 files changed, 32 insertions(+), 15 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..632f151f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,6 +6,7 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -+static const int smartborders = 1; - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); -diff --git a/dwl.c b/dwl.c -index ad21e1ba..0c56431a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -317,7 +317,7 @@ static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); --static void resize(Client *c, struct wlr_box geo, int interact); -+static void resize(Client *c, struct wlr_box geo, int interact, int draw_borders); - static void run(char *startup_cmd); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); -@@ -803,7 +803,7 @@ closemon(Monitor *m) - wl_list_for_each(c, &clients, link) { - if (c->isfloating && c->geom.x > m->m.width) - resize(c, (struct wlr_box){.x = c->geom.x - m->w.width, .y = c->geom.y, -- .width = c->geom.width, .height = c->geom.height}, 0); -+ .width = c->geom.width, .height = c->geom.height}, 0, 1); - if (c->mon == m) - setmon(c, selmon, c->tags); - } -@@ -872,7 +872,11 @@ commitnotify(struct wl_listener *listener, void *data) - return; - } - -- resize(c, c->geom, (c->isfloating && !c->isfullscreen)); -+ if (client_surface(c)->mapped && c->mon && c->mon->lt[c->mon->sellt]->arrange -+ && !c->isfullscreen && !c->isfloating) -+ c->mon->lt[c->mon->sellt]->arrange(c->mon); -+ else -+ resize(c, c->geom, (c->isfloating && !c->isfullscreen), (c->isfloating && !c->isfullscreen)); - - /* mark a pending resize as completed */ - if (c->resize && c->resize <= c->surface.xdg->current.configure_serial) -@@ -1819,7 +1823,7 @@ monocle(Monitor *m) - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- resize(c, m->w, 0); -+ resize(c, m->w, 0, !smartborders); - n++; - } - if (n) -@@ -1911,11 +1915,11 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d - if (cursor_mode == CurMove) { - /* Move the grabbed client to the new position. */ - resize(grabc, (struct wlr_box){.x = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, -- .width = grabc->geom.width, .height = grabc->geom.height}, 1); -+ .width = grabc->geom.width, .height = grabc->geom.height}, 1, 1); - return; - } else if (cursor_mode == CurResize) { - resize(grabc, (struct wlr_box){.x = grabc->geom.x, .y = grabc->geom.y, -- .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1); -+ .width = (int)round(cursor->x) - grabc->geom.x, .height = (int)round(cursor->y) - grabc->geom.y}, 1, 1); - return; - } - -@@ -2194,7 +2198,7 @@ requestmonstate(struct wl_listener *listener, void *data) - } - - void --resize(Client *c, struct wlr_box geo, int interact) -+resize(Client *c, struct wlr_box geo, int interact, int draw_borders) - { - struct wlr_box *bbox; - struct wlr_box clip; -@@ -2206,6 +2210,7 @@ resize(Client *c, struct wlr_box geo, int interact) - - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; -+ c->bw = draw_borders ? borderpx : 0; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ -@@ -2330,6 +2335,8 @@ setfloating(Client *c, int floating) - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen || - (p && p->isfullscreen) ? LyrFS - : c->isfloating ? LyrFloat : LyrTile]); -+ if (c->isfloating && !c->bw) -+ resize(c, c->mon->m, 0, 1); - arrange(c->mon); - printstatus(); - } -@@ -2347,11 +2354,11 @@ setfullscreen(Client *c, int fullscreen) - - if (fullscreen) { - c->prev = c->geom; -- resize(c, c->mon->m, 0); -+ resize(c, c->mon->m, 0, 0); - } else { - /* restore previous size instead of arrange for floating windows since - * client positions are set by the user and cannot be recalculated */ -- resize(c, c->prev, 0); -+ resize(c, c->prev, 0, 1); - } - arrange(c->mon); - printstatus(); -@@ -2367,6 +2374,12 @@ setlayout(const Arg *arg) - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); -+ if (!selmon->lt[selmon->sellt]->arrange) { -+ /* floating layout, draw borders around all clients */ -+ Client *c; -+ wl_list_for_each(c, &clients, link) -+ resize(c, c->mon->m, 0, 1); -+ } - arrange(selmon); - printstatus(); - } -@@ -2401,7 +2414,7 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - arrange(oldmon); - if (m) { - /* Make sure window actually overlaps with the monitor */ -- resize(c, c->geom, 0); -+ resize(c, c->geom, 0, 1); - c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */ - setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ - setfloating(c, c->isfloating); -@@ -2701,7 +2714,7 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int mw, my, ty; -+ unsigned int mw, my, ty, draw_borders = 1; - int i, n = 0; - Client *c; - -@@ -2711,6 +2724,9 @@ tile(Monitor *m) - if (n == 0) - return; - -+ if (n == smartborders) -+ draw_borders = 0; -+ - if (n > m->nmaster) - mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; - else -@@ -2721,11 +2737,11 @@ tile(Monitor *m) - continue; - if (i < m->nmaster) { - resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -+ .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0, draw_borders); - my += c->geom.height; - } else { - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0, draw_borders); - ty += c->geom.height; - } - i++; -@@ -2894,7 +2910,7 @@ updatemons(struct wl_listener *listener, void *data) - arrange(m); - /* make sure fullscreen clients have the right size */ - if ((c = focustop(m)) && c->isfullscreen) -- resize(c, m->m, 0); -+ resize(c, m->m, 0, 0); - - /* Try to re-set the gamma LUT when updating monitors, - * it's only really needed when enabling a disabled output, but meh. */ -@@ -3103,7 +3119,7 @@ configurex11(struct wl_listener *listener, void *data) - if ((c->isfloating && c != grabc) || !c->mon->lt[c->mon->sellt]->arrange) { - resize(c, (struct wlr_box){.x = event->x - c->bw, - .y = event->y - c->bw, .width = event->width + c->bw * 2, -- .height = event->height + c->bw * 2}, 0); -+ .height = event->height + c->bw * 2}, 0, 1); - } else { - arrange(c->mon); - } --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/snail-gaps/README.md b/dwl-bak/dwl-patches/patches/snail-gaps/README.md deleted file mode 100644 index ba26f13..0000000 --- a/dwl-bak/dwl-patches/patches/snail-gaps/README.md +++ /dev/null @@ -1,15 +0,0 @@ -### Description - -Adds support for the [gaps patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/gaps) -to the [snail layout patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/snail). - -Install the [gaps patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/gaps) -and the [snail patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/snail) first. - -### Download - -- [main 2024-08-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/snail-gaps/snail-gaps.patch) - -### Authors - -- [JoaoCostaIFG](https://codeberg.org/JoaoCostaIFG) ([joaocosta@posteo.net](mailto:joaocosta@posteo.net)) diff --git a/dwl-bak/dwl-patches/patches/snail-gaps/snail-gaps.patch b/dwl-bak/dwl-patches/patches/snail-gaps/snail-gaps.patch deleted file mode 100644 index 51d2812..0000000 --- a/dwl-bak/dwl-patches/patches/snail-gaps/snail-gaps.patch +++ /dev/null @@ -1,160 +0,0 @@ -From 804e69ca4bf586bcec46e018630f94c1c4e0b7e7 Mon Sep 17 00:00:00 2001 -From: JoaoCostaIFG -Date: Thu, 8 Aug 2024 00:05:27 +0100 -Subject: [PATCH 2/2] Add gaps support to snail layout - ---- - dwl.c | 105 +++++++++++++++++++++++++++++++++------------------------- - 1 file changed, 59 insertions(+), 46 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 46bdca1..a158dd6 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2659,8 +2659,8 @@ void - snail(Monitor *m) - { - int i = 0, n = 0; -- unsigned int mw = m->w.width; -- Client *c, *prev; -+ unsigned int mw = m->w.width, e = m->gaps, w = 0, h = 0, egappx = 0; -+ Client *c, *prev = NULL; - enum wlr_direction dir = WLR_DIRECTION_RIGHT; - - wl_list_for_each(c, &clients, link) -@@ -2668,9 +2668,12 @@ snail(Monitor *m) - n++; - if (n == 0) - return; -+ if (smartgaps == n) -+ e = 0; -+ egappx = e * gappx; - - if (n > m->nmaster) -- mw = m->nmaster ? ROUND(m->w.width * m->mfact) : 0; -+ mw = m->nmaster ? (unsigned int)round((m->w.width + egappx) * m->mfact) : 0; - - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -@@ -2681,8 +2684,8 @@ snail(Monitor *m) - * master area with this window - */ - if (mw > 0 && i == 0) { -- c->geom = (struct wlr_box){.x = m->w.x, .y = m->w.y, -- .width = mw, .height = m->w.height}; -+ c->geom = (struct wlr_box){.x = m->w.x + egappx, .y = m->w.y + egappx, -+ .width = mw - 2*egappx, .height = m->w.height - 2*egappx}; - /* - * If the first window in the master area is wide, split it - * horizontally and put next one on its right; otherwise, split it -@@ -2694,55 +2697,65 @@ snail(Monitor *m) - * m->nmaster-th window - */ - } else if (i == m->nmaster) { -- c->geom = (struct wlr_box){.x = m->w.x + mw, .y = m->w.y, -- .width = m->w.width - mw, .height = m->w.height}; -+ c->geom = (struct wlr_box){.x = m->w.x + mw + egappx, .y = m->w.y + egappx, -+ .width = m->w.width - mw - 2*egappx, .height = m->w.height - 2*egappx}; - /* - * If the first window in the stack is wide, split it horizontally - * and put next one on its right; otherwise, split it vertically and - * put the next one below it - */ - dir = c->geom.width > m->w.height ? WLR_DIRECTION_RIGHT : WLR_DIRECTION_DOWN; -- /* -- * Split the previous horizontally and put the current window on the right -- */ -- } else if (dir == WLR_DIRECTION_RIGHT) { -- c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -+ } else if (prev) { - /* -- * If it's a stack window or the first narrow window in the master -- * area, put the next one below it -+ * Split the previous horizontally and put the current window on the right - */ -- if (i >= m->nmaster || c->geom.width < m->w.height) -- dir = WLR_DIRECTION_DOWN; -- /* -- * Split the previous vertically and put the current window below it -- */ -- } else if (dir == WLR_DIRECTION_DOWN) { -- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -- dir = WLR_DIRECTION_LEFT; -- /* -- * Split the previous horizontally and put the current window on the left -- */ -- } else if (dir == WLR_DIRECTION_LEFT) { -- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -- prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -- .width = prev->geom.width / 2, .height = prev->geom.height}; -- dir = WLR_DIRECTION_UP; -- /* -- * Split the previous vertically and put the current window above it -- */ -- } else { -- c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -- prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -- .width = prev->geom.width, .height = prev->geom.height / 2}; -- dir = WLR_DIRECTION_RIGHT; -+ if (dir == WLR_DIRECTION_RIGHT) { -+ w = prev->geom.width / 2 - egappx; -+ h = prev->geom.height; -+ c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2 + egappx, .y = prev->geom.y, -+ .width = w, .height = h}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = w, .height = h}; -+ /* -+ * If it's a stack window or the first narrow window in the master -+ * area, put the next one below it -+ */ -+ if (i >= m->nmaster || c->geom.width < m->w.height) -+ dir = WLR_DIRECTION_DOWN; -+ /* -+ * Split the previous vertically and put the current window below it -+ */ -+ } else if (dir == WLR_DIRECTION_DOWN) { -+ w = prev->geom.width; -+ h = prev->geom.height / 2 - egappx; -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2 + egappx, -+ .width = w, .height = h}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = w, .height = h}; -+ dir = WLR_DIRECTION_LEFT; -+ /* -+ * Split the previous horizontally and put the current window on the left -+ */ -+ } else if (dir == WLR_DIRECTION_LEFT) { -+ w = prev->geom.width / 2 - egappx; -+ h = prev->geom.height; -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = w, .height = h}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2 + egappx, .y = prev->geom.y, -+ .width = w, .height = h}; -+ dir = WLR_DIRECTION_UP; -+ /* -+ * Split the previous vertically and put the current window above it -+ */ -+ } else { -+ w = prev->geom.width; -+ h = prev->geom.height / 2 - egappx; -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = w, .height = h}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2 + egappx, -+ .width = w, .height = h}; -+ dir = WLR_DIRECTION_RIGHT; -+ } - } - i++; - prev = c; --- -2.46.0 - - diff --git a/dwl-bak/dwl-patches/patches/snail/README.md b/dwl-bak/dwl-patches/patches/snail/README.md deleted file mode 100644 index 0c94b79..0000000 --- a/dwl-bak/dwl-patches/patches/snail/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Adds a spiral-inspired layout for wide screens. - -### Download -- [2024-02-11](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/snail/snail.patch) - -### Authors -- [Dima Krasner](https://codeberg.org/dimkr) () -- [Nikita Ivanov](https://github.com/NikitaIvanovV) (fix for flickering) diff --git a/dwl-bak/dwl-patches/patches/snail/snail.patch b/dwl-bak/dwl-patches/patches/snail/snail.patch deleted file mode 100644 index 061030a..0000000 --- a/dwl-bak/dwl-patches/patches/snail/snail.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 39b6da6082db641191699be906e485f8c8fbc4e6 Mon Sep 17 00:00:00 2001 -From: Dima Krasner -Date: Sun, 11 Feb 2024 09:09:16 +0200 -Subject: [PATCH] add the snail layout -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This layout is a scalable alternative to the "tile" and "spiral" layouts, optimized for wide monitors. Both the master area and the stack are "spirals", but windows in the master area are split horizontally as long as the master area has enough horizontal space, and the first window in the stack is split vertically unless the stack is wide. - -With one window in the master area and mfact = 0.5, it behaves like the spiral layout: - -┌───────────────┬────────────────┐ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -│ ├───┬───┬────────┤ -│ │ │ │ │ -│ ├───┴───┤ │ -│ │ │ │ -│ │ │ │ -└───────────────┴───────┴────────┘ - -With 2 windows in the master area and 2 in the stack: - -┌───────────────┬────────────────┐ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -├───────────────┼────────────────┤ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -└───────────────┴────────────────┘ - -With 3 windows in the master area and 2 in the stack: - -┌───────────────┬────────────────┐ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -├───────┬───────┼────────────────┤ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -└───────┴───────┴────────────────┘ - -With many windows in both areas: - -┌───────────────┬────────────────┐ -│ │ │ -│ │ │ -│ │ │ -│ │ │ -├───┬───┬───────┼───┬───┬────────┤ -│ │ │ │ │ │ │ -├───┴───┤ ├───┴───┤ │ -│ │ │ │ │ -│ │ │ │ │ -└───────┴───────┴───────┴────────┘ - -With 2 windows in the master area, many windows in the stack and high mfact: - -┌──────────┬──────────┬──────────┐ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ master ├──┬stack──┤ -│ │ │ │ │ │ -│ │ ├──┴──┤ │ -│ │ │ │ │ -│ │ │ │ │ -└──────────┴──────────┴─────┴────┘ - -With 2 windows in the master area, many windows in the stack and low mfact: - -┌──────────┬──────────┬──────────┐ -│ │ │ │ -│ │ │ │ -│ │ │ │ -│ │ │ │ -├──master──┤ stack┬──┬────┤ -│ │ │ │ │ │ -│ │ ├──┴──┤ │ -│ │ │ │ │ -│ │ │ │ │ -└──────────┴──────────┴─────┴────┘ ---- - config.def.h | 4 +- - dwl.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 105 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..abf9644 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "@|@", snail }, - }; - - /* monitors */ -@@ -48,7 +49,7 @@ static const MonitorRule monrules[] = { - { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - */ - /* defaults */ -- { NULL, 0.55f, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, -+ { NULL, 0.64f, 1, 1, &layouts[3], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, - }; - - /* keyboard */ -@@ -139,6 +140,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_s, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index 5bf995e..45ac5ad 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -333,6 +333,7 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); -+static void snail(Monitor *m); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -2644,6 +2645,107 @@ setup(void) - #endif - } - -+void -+snail(Monitor *m) -+{ -+ int i = 0, n = 0; -+ unsigned int mw = m->w.width; -+ Client *c, *prev; -+ enum wlr_direction dir = WLR_DIRECTION_RIGHT; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ if (n == 0) -+ return; -+ -+ if (n > m->nmaster) -+ mw = m->nmaster ? (int)round(m->w.width * m->mfact) : 0; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ -+ /* -+ * If the master area exists and this is the first window, fill the -+ * master area with this window -+ */ -+ if (mw > 0 && i == 0) { -+ c->geom = (struct wlr_box){.x = m->w.x, .y = m->w.y, -+ .width = mw, .height = m->w.height}; -+ /* -+ * If the first window in the master area is wide, split it -+ * horizontally and put next one on its right; otherwise, split it -+ * vertically and put the next one below it -+ */ -+ dir = c->geom.width > m->w.height ? WLR_DIRECTION_RIGHT : WLR_DIRECTION_DOWN; -+ /* -+ * If the master area is full or doesn't exist, fill the stack with the -+ * m->nmaster-th window -+ */ -+ } else if (i == m->nmaster) { -+ c->geom = (struct wlr_box){.x = m->w.x + mw, .y = m->w.y, -+ .width = m->w.width - mw, .height = m->w.height}; -+ /* -+ * If the first window in the stack is wide, split it horizontally -+ * and put next one on its right; otherwise, split it vertically and -+ * put the next one below it -+ */ -+ dir = c->geom.width > m->w.height ? WLR_DIRECTION_RIGHT : WLR_DIRECTION_DOWN; -+ /* -+ * Split the previous horizontally and put the current window on the right -+ */ -+ } else if (dir == WLR_DIRECTION_RIGHT) { -+ c->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -+ .width = prev->geom.width / 2, .height = prev->geom.height}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = prev->geom.width / 2, .height = prev->geom.height}; -+ /* -+ * If it's a stack window or the first narrow window in the master -+ * area, put the next one below it -+ */ -+ if (i >= m->nmaster || c->geom.width < m->w.height) -+ dir = WLR_DIRECTION_DOWN; -+ /* -+ * Split the previous vertically and put the current window below it -+ */ -+ } else if (dir == WLR_DIRECTION_DOWN) { -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -+ .width = prev->geom.width, .height = prev->geom.height / 2}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = prev->geom.width, .height = prev->geom.height / 2}; -+ dir = WLR_DIRECTION_LEFT; -+ /* -+ * Split the previous horizontally and put the current window on the left -+ */ -+ } else if (dir == WLR_DIRECTION_LEFT) { -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = prev->geom.width / 2, .height = prev->geom.height}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x + prev->geom.width / 2, .y = prev->geom.y, -+ .width = prev->geom.width / 2, .height = prev->geom.height}; -+ dir = WLR_DIRECTION_UP; -+ /* -+ * Split the previous vertically and put the current window above it -+ */ -+ } else { -+ c->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y, -+ .width = prev->geom.width, .height = prev->geom.height / 2}; -+ prev->geom = (struct wlr_box){.x = prev->geom.x, .y = prev->geom.y + prev->geom.height / 2, -+ .width = prev->geom.width, .height = prev->geom.height / 2}; -+ dir = WLR_DIRECTION_RIGHT; -+ } -+ i++; -+ prev = c; -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ -+ resize(c, c->geom, 0); -+ } -+} -+ - void - spawn(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/spawninfo/README.md b/dwl-bak/dwl-patches/patches/spawninfo/README.md deleted file mode 100644 index 5ee345d..0000000 --- a/dwl-bak/dwl-patches/patches/spawninfo/README.md +++ /dev/null @@ -1,41 +0,0 @@ -### Description - -This patch adds `spawninfo` function that is very similar to `spawn`, except it -also passes some information about the focused client via stdin. - -The info is passed in this format: - - PID - TITLE - APPID - TAGS - X,Y WIDTHxHEIGHT - -I use it for 2 things: grabbing a screenshot of a focused window and adjusting -volume of audio produced by a focused window (so much simpler than having to -open pulsemixer every time). If you want to have the same functionality, you -need to put these scripts into your PATH and make them executable: - -[screenshotwin](/dwl/dwl-patches/raw/branch/main/patches/spawninfo/screenshotwin) -for taking a screenshot (`grim` is required): - -```c - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_S, spawninfo, SHCMD("screenshotwin") }, -``` - -[pamixerc](/dwl/dwl-patches/raw/branch/main/patches/spawninfo/pamixerc) -for adjusting volume (`pactl` is required): - -```c - { MODKEY, XKB_KEY_XF86AudioRaiseVolume,spawninfo,SHCMD("pamixerc -- -i 5") }, - { MODKEY, XKB_KEY_XF86AudioLowerVolume,spawninfo,SHCMD("pamixerc -- -d 5") }, - { MODKEY, XKB_KEY_XF86AudioMute, spawninfo, SHCMD("pamixerc -- -t") }, -``` - -### Download - -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/spawninfo/spawninfo.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/spawninfo/pamixerc b/dwl-bak/dwl-patches/patches/spawninfo/pamixerc deleted file mode 100755 index 91a41c4..0000000 --- a/dwl-bak/dwl-patches/patches/spawninfo/pamixerc +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/awk -f - -function get_parent(pid, cmd, ppid, arr) { - cmd = sprintf("/proc/%d/stat", pid) - ppid = "" - if ((getline line < cmd) > 0) { - split(line, arr) - ppid = arr[4] - } - close(cmd) - return ppid -} - -function proc_clients(line, arr) { - if (match(line, /^Client #(.*)/, arr)) { - store_client() - client_index = arr[1] - return - } - else if (match(line, /^\s*application\.process\.id = "(.*)"/, arr)) { - process_id = arr[1] - return - } - else if (match(line, /^\s*application\.name = "(.*)"/, arr)) { - application_name = arr[1] - return - } -} - -function store_client() { - if (client_index == "") - return - - clients[client_index] = 1 - clients[client_index, "pid"] = process_id - clients[client_index, "parent_pid"] = get_parent(process_id) - clients[client_index, "name"] = application_name - client_index = "" - process_id = "" -} - -function proc_sink_inputs(line, arr) { - if (match(line, /^Sink Input #(.*)/, arr)) { - apply_sink_input() - sink_index = arr[1] - return - } - else if (match(line, /^\s*application\.process\.id = "(.*)"/, arr)) { - process_id = arr[1] - return - } - else if (match(line, /^\s*Client: (.*)/, arr)) { - client_index = arr[1] - return - } - else if (match(line, /^\s*Mute: (.*)/, arr)) { - muted = (arr[1] == "yes") - return - } - else if (match(line, /^\s*Volume:.* ([0-9]+)%/, arr)) { - volume = strtonum(arr[1]) - return - } -} - -function apply_sink_input( cmd, header, msg, inc) { - if (sink_index == "") - return - - # Do stuff if PID matches - if (PID == clients[client_index, "pid"] || PID == clients[client_index, "parent_pid"]) { - switch (ACTION) { - case "-i": - case "-d": - inc = strtonum(ARG) - if (ACTION == "-i") - volume += inc - else - volume -= inc - volume = volume > 100 ? 100 : volume - volume = volume < 0 ? 0 : volume - cmd = sprintf("pactl set-sink-input-volume '%d' '%d'%", sink_index, volume) - system(cmd) - print cmd - break - case "-t": - muted = !muted - cmd = sprintf("pactl set-sink-input-mute '%d' '%s'", sink_index, muted ? "true" : "false") - system(cmd) - print cmd - break - } - # Display a "popup" with new volume - header = sprintf("Client Volume: %d%%%s", volume, muted ? " MUTED" : "") - msg = clients[client_index, "name"] - system(sprintf("notify-send -r 101 -u low -h 'int:value:%d' '%s' '%s'", volume, header, msg)) - } - - sink_index = "" -} - -BEGIN { - # Get arguments - # ACTION: -d, -i or -t (like pamixer) - # ARG: num arg for -d or -i - ACTION = ARGV[1] - ARG = ARGV[2] - for (i = 1; i < ARGC; i++) - delete ARGV[i] - - # Get client info - getline PID - getline TITLE # Not used - getline APPID # Not used - getline TAGS # Not used - getline GEOMETRY # Not used - - if (PID == "") - exit 1 - - # Process PulseAudio clients list and store PIDs for each - cmd = "pactl list clients" - while ((cmd | getline line) > 0) - proc_clients(line) - close(cmd) - store_client() - - # Process PulseAudio sink inputs list and run apply_sink_input() for each - cmd = "pactl list sink-inputs" - while ((cmd | getline line) > 0) - proc_sink_inputs(line) - close(cmd) - apply_sink_input() -} diff --git a/dwl-bak/dwl-patches/patches/spawninfo/screenshotwin b/dwl-bak/dwl-patches/patches/spawninfo/screenshotwin deleted file mode 100755 index c8a3ebf..0000000 --- a/dwl-bak/dwl-patches/patches/spawninfo/screenshotwin +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -# Get client info -read -r PID -read -r TITLE -read -r APPID -read -r TAGS -read -r GEOMETRY - -[ -n "$GEOMETRY" ] || exit 1 - -tempdir="/tmp/screenshots" -mkdir -p "$tempdir" -file="$(mktemp -p "$tempdir" "XXXXXX.png")" - -# Grab the screenshot! Very conviniently, GEOMETRY format matches the one -# expected by grim -grim -g "$GEOMETRY" "$file" || exit - -wl-copy -t image/png < "$file" -notify-send -i "$file" "Screenshot taken!" "Image copied to clipboard and saved to $file" diff --git a/dwl-bak/dwl-patches/patches/spawninfo/spawninfo.patch b/dwl-bak/dwl-patches/patches/spawninfo/spawninfo.patch deleted file mode 100644 index e452a4e..0000000 --- a/dwl-bak/dwl-patches/patches/spawninfo/spawninfo.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 83b8dc03f5ea40f472e90d452671f8e55faf2c4c Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Sun, 9 Feb 2025 23:27:48 +0100 -Subject: [PATCH] spawninfo: spawn but pass client info via stdin - ---- - client.h | 12 ++++++++++++ - dwl.c | 42 ++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 54 insertions(+) - -diff --git a/client.h b/client.h -index 42f225f..bc9cad2 100644 ---- a/client.h -+++ b/client.h -@@ -131,6 +131,18 @@ client_get_appid(Client *c) - return c->surface.xdg->toplevel->app_id; - } - -+static inline int -+client_get_pid(Client *c) -+{ -+ pid_t pid; -+#ifdef XWAYLAND -+ if (client_is_x11(c)) -+ return c->surface.xwayland->pid; -+#endif -+ wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL); -+ return pid; -+} -+ - static inline void - client_get_clip(Client *c, struct wlr_box *clip) - { -diff --git a/dwl.c b/dwl.c -index def2562..859514c 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -141,6 +141,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ pid_t pid; - } Client; - - typedef struct { -@@ -334,6 +335,7 @@ static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); -+static void spawninfo(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -@@ -466,6 +468,8 @@ applyrules(Client *c) - if (!(title = client_get_title(c))) - title = broken; - -+ c->pid = client_get_pid(c); -+ - for (r = rules; r < END(rules); r++) { - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { -@@ -2658,6 +2662,44 @@ spawn(const Arg *arg) - } - } - -+void -+spawninfo(const Arg *arg) -+{ -+ int fd[2]; -+ pid_t pid; -+ const char *title, *appid; -+ Client *c = focustop(selmon); -+ -+ if (pipe(fd) == -1) -+ return; -+ if ((pid = fork()) == -1) -+ return; -+ if (pid == 0) { -+ dup2(fd[0], STDIN_FILENO); -+ close(fd[0]); -+ close(fd[1]); -+ dup2(STDERR_FILENO, STDOUT_FILENO); -+ setsid(); -+ execvp(((char **)arg->v)[0], (char **)arg->v); -+ die("dwl: execvp %s failed:", ((char **)arg->v)[0]); -+ } -+ -+ close(fd[0]); -+ -+ if (c) { -+ if (!(title = client_get_title(c))) -+ title = ""; -+ if (!(appid = client_get_appid(c))) -+ appid = ""; -+ dprintf(fd[1], "%d\n%s\n%s\n%"PRIu32"\n%d,%d %dx%d\n", c->pid, -+ title, appid, c->tags, -+ c->geom.x + c->bw, c->geom.y + c->bw, -+ c->geom.width - 2 * c->bw, c->geom.height - 2 * c->bw); -+ } -+ -+ close(fd[1]); -+} -+ - void - startdrag(struct wl_listener *listener, void *data) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/stacker/README.md b/dwl-bak/dwl-patches/patches/stacker/README.md deleted file mode 100644 index c7778a0..0000000 --- a/dwl-bak/dwl-patches/patches/stacker/README.md +++ /dev/null @@ -1,28 +0,0 @@ -### Description -Stacker is a patch that allows moving around the stack more freely. With only -one keybinding, quickly move, swap and jump around the window stack. - -1. Focus any window of the stack with a single key binding. -2. Swap the currently focused windows with any other window in the stack. -3. Move the selected window in the stack with `relativeswap`. - -This patch is heavily inspired by the original [stacker](https://dwm.suckless.org/patches/stacker/) dwm patch. - -### Keybinding - -- `MODKEY` + {`q`, `w`, `e`, `r`}: jump to the first, second, third and last - window of the stack -- `MODKEY` + `SHIFT` + {`Q`, `W`, `E`, `R`}: swap the selected with the first, second, third and last - window of the stack -- `MODKEY` + `SHIFT` + {`J`, `K`}: move the selected window up & down the stack - -### Missing feature - -Jumping to the last selected window is not yet implemented. - -### Download -- [git branch](https://codeberg.org/jeromecst/dwl/src/branch/stacker) -- [2024-05-17](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/stacker/stacker.patch) - -### Authors -- [jeromecst](https://codeberg.org/jeromecst) diff --git a/dwl-bak/dwl-patches/patches/stacker/stacker.patch b/dwl-bak/dwl-patches/patches/stacker/stacker.patch deleted file mode 100644 index dba1cb0..0000000 --- a/dwl-bak/dwl-patches/patches/stacker/stacker.patch +++ /dev/null @@ -1,212 +0,0 @@ -From b8f39c0710eb3cfdf4c619f532222d356ec58140 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?J=C3=A9r=C3=B4me?= -Date: Fri, 17 May 2024 23:06:19 +0200 -Subject: [PATCH] stacker - ---- - config.def.h | 10 +++++ - dwl.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 114 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 8f498d2..44cbcd8 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -120,10 +120,20 @@ static const char *menucmd[] = { "wmenu-run", NULL }; - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ -+ { MODKEY, XKB_KEY_q, focusto, {.i = 0} }, -+ { MODKEY, XKB_KEY_w, focusto, {.i = 1} }, -+ { MODKEY, XKB_KEY_e, focusto, {.i = 2} }, -+ { MODKEY, XKB_KEY_r, focusto, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, swapstack, {.i = 0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_W, swapstack, {.i = 1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_E, swapstack, {.i = 2} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_R, swapstack, {.i = -1} }, - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_J, relativeswap, {.i = +1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_K, relativeswap, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -diff --git a/dwl.c b/dwl.c -index bf763df..be88c6d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -279,6 +279,7 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); -+static void focusto(const Arg *arg); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); -@@ -308,6 +309,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); - static void printstatus(void); - static void quit(const Arg *arg); -+static void relativeswap(const Arg *arg); - static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); -@@ -327,6 +329,8 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static void swapstack(const Arg *arg); -+static void relativeswap(const Arg *arg); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -@@ -343,9 +347,11 @@ static void urgent(struct wl_listener *listener, void *data); - static void view(const Arg *arg); - static void virtualkeyboard(struct wl_listener *listener, void *data); - static void virtualpointer(struct wl_listener *listener, void *data); -+static Client *nextvisible(int i, struct wl_list *from, Monitor *m); - static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); -+static void wl_list_swap(struct wl_list *a, struct wl_list *b); - static void zoom(const Arg *arg); - - /* variables */ -@@ -1308,6 +1314,21 @@ focusclient(Client *c, int lift) - client_activate_surface(client_surface(c), 1); - } - -+void -+focusto(const Arg *arg) -+{ -+ Client *c, *sel = focustop(selmon); -+ int i; -+ if (!sel || (sel->isfullscreen && !client_has_children(sel))) -+ return; -+ -+ i = arg->i > -1 ? arg->i + 1 : arg->i; -+ -+ c = nextvisible(i, &clients, selmon); -+ if (c) -+ focusclient(c , 1); -+} -+ - void - focusmon(const Arg *arg) - { -@@ -1951,6 +1972,24 @@ quit(const Arg *arg) - wl_display_terminate(dpy); - } - -+void -+relativeswap(const Arg *arg) -+{ -+ Client *trgt, *sel = focustop(selmon); -+ -+ if (!sel || !selmon) -+ return; -+ -+ trgt = nextvisible(arg->i, &sel->link, selmon); -+ if (!trgt || trgt == sel) -+ return; -+ -+ wl_list_swap(&sel->link, &trgt->link); -+ -+ focusclient(sel, 1); -+ arrange(selmon); -+} -+ - void - rendermon(struct wl_listener *listener, void *data) - { -@@ -2548,6 +2587,26 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+void -+swapstack(const Arg *arg) -+{ -+ Client *trgt, *sel = focustop(selmon); -+ int i; -+ -+ if (!sel || !selmon) -+ return; -+ -+ i = arg->i > -1 ? arg->i + 1 : arg->i; -+ trgt = nextvisible(i, &clients, selmon); -+ if (!trgt || trgt == sel) -+ return; -+ -+ wl_list_swap(&sel->link, &trgt->link); -+ -+ focusclient(sel, 1); -+ arrange(selmon); -+} -+ - void - tag(const Arg *arg) - { -@@ -2858,6 +2917,28 @@ virtualpointer(struct wl_listener *listener, void *data) - wlr_cursor_map_input_to_output(cursor, &pointer.base, event->suggested_output); - } - -+Client * -+nextvisible(int i, struct wl_list *from, Monitor *m) -+{ -+ Client *c; -+ if (i >= 0){ -+ wl_list_for_each(c, from, link) { -+ // if (VISIBLEON(c , m) && &c->link != from && i--) -+ if (VISIBLEON(c , m)) { -+ if (--i == 0) -+ return c; -+ } -+ } -+ } else if (i < 0) { -+ wl_list_for_each_reverse(c, from, link) { -+ if (VISIBLEON(c , m)) -+ if (++i == 0) -+ return c; -+ } -+ } -+ return NULL; -+} -+ - Monitor * - xytomon(double x, double y) - { -@@ -2865,6 +2946,29 @@ xytomon(double x, double y) - return o ? o->data : NULL; - } - -+void -+wl_list_swap(struct wl_list *a, struct wl_list *b) -+{ -+ struct wl_list *prev_a = a->prev; -+ struct wl_list *prev_b = b->prev; -+ -+ if (prev_b == a) { -+ wl_list_remove(a); -+ wl_list_insert(b, a); -+ return; -+ } -+ if (prev_a == b) { -+ wl_list_remove(b); -+ wl_list_insert(a, b); -+ return; -+ } -+ wl_list_remove(a); -+ wl_list_insert(prev_b, a); -+ -+ wl_list_remove(b); -+ wl_list_insert(prev_a, b); -+} -+ - void - xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny) --- -2.45.1 - diff --git a/dwl-bak/dwl-patches/patches/stairs/README.md b/dwl-bak/dwl-patches/patches/stairs/README.md deleted file mode 100644 index 403a276..0000000 --- a/dwl-bak/dwl-patches/patches/stairs/README.md +++ /dev/null @@ -1,42 +0,0 @@ -### Description -Port of the [stairs](https://dwm.suckless.org/patches/stairs/) patch from dwm. - -The remaining text is from the description on the dwm site: - -This layout can be modified using the 3 variables provided in config.h: stairpx, stairdirection and stairsamesize. - -``` -+-------------+--------+----------------+ -| | | | -| | +--| S1 | -| | |S2| | -| | +--| | | -| | |S3| | | -| M |--| | +----------------+ -| |S4| | | | -| | | +-----------------+ | -| | | | | -| | +------------------+ | -| | | | -+-------------+-------------------+-----+ - stairsamesize = 1 - -+-------------+--------+----------------+ -| | | | -| | +--| S1 | -| | |S2| | -| | +--| | | -| | |S3| | | -| M |--| | | | -| |S4| | | | -| | | | | | -| | | | | | -| | | | | | -| | | | | | -+-------------+--+--+--+----------------+ - stairsamesize = 0 -``` -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/stairs/stairs.patch) -### Authors -- [MayOrMayNotBeACat](https://codeberg.org/MayOrMayNotBeACat) diff --git a/dwl-bak/dwl-patches/patches/stairs/stairs.patch b/dwl-bak/dwl-patches/patches/stairs/stairs.patch deleted file mode 100644 index d39932e..0000000 --- a/dwl-bak/dwl-patches/patches/stairs/stairs.patch +++ /dev/null @@ -1,136 +0,0 @@ -From d5bbe6d54d044fa11c76e2e20b96a44897319424 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Tue, 4 Feb 2025 20:51:06 +0100 -Subject: [PATCH 1/2] Fix crash disabling monitor with locked surface - -(cherry picked from commit d1880b44223701c91b51b319fc69a0f63044f861) ---- - dwl.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/dwl.c b/dwl.c -index cf3ef70..c717c1d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -716,6 +716,8 @@ cleanupmon(struct wl_listener *listener, void *data) - wl_list_remove(&m->frame.link); - wl_list_remove(&m->link); - wl_list_remove(&m->request_state.link); -+ if (m->lock_surface) -+ destroylocksurface(&m->destroy_lock_surface, NULL); - m->wlr_output->data = NULL; - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); --- -2.50.1 - - -From b6e96ab6281eddacdda26c39e6446b72ce05de39 Mon Sep 17 00:00:00 2001 -From: JustinWayland -Date: Fri, 6 Jun 2025 22:14:31 -0400 -Subject: [PATCH 2/2] Add stairs layout. - ---- - config.def.h | 5 +++++ - dwl.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 53 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..e81568c 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,9 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int stairpx = 20; /* depth of the stairs layout */ -+static const int stairdirection = 1; /* 0: left-aligned, 1: right-aligned */ -+static const int stairsamesize = 1; /* 1 means shrink all the staired windows to the same size */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -@@ -34,6 +37,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "[S]", stairs }, - }; - - /* monitors */ -@@ -139,6 +143,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_s, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index cf3ef70..4debf15 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -334,6 +334,7 @@ static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); -+static void stairs(Monitor* m); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -@@ -2657,6 +2658,53 @@ spawn(const Arg *arg) - } - } - -+void -+stairs(Monitor *m) -+{ -+ int i, n, h, mw, my; -+ int ox, oy, ow, oh; -+ Client *c; -+ -+ n = 0; -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ if (n == 0) -+ return; -+ -+ if (n > m->nmaster) -+ mw = m->nmaster ? ROUND(m->w.width * m->mfact) : 0; -+ else -+ mw = m->w.width; -+ -+ i = my = 0; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c,m) || c->isfloating || c->fullscreen) -+ continue; -+ if (i < m->nmaster) { -+ h = (m->w.height - my) / (MIN(n, m->nmaster) - i); -+ resize(c, (struct wlr_box){ -+ .x=m->w.x,.y=m->w.y + my,.width=mw,.height=h -+ }, 0); -+ my += c->geom.height; -+ } else { -+ oy = i - m->nmaster; -+ ox = stairdirection ? n - i - 1 : (stairsamesize ? i - m->nmaster: 0); -+ ow = stairsamesize ? n - m->nmaster - 1 : n - i - 1; -+ oh = stairsamesize ? ow : i - m->nmaster; -+ resize(c, (struct wlr_box){ -+ .x=m->w.x + mw + (ox * stairpx), -+ .y=m->w.y + (oy * stairpx), -+ .width=m->w.width - mw - (ow * stairpx), -+ .height=m->w.height - (oh * stairpx) -+ }, 0); -+ if (c == focustop(selmon)) -+ wlr_scene_node_raise_to_top(&c->scene->node); -+ } -+ i++; -+ } -+} -+ - void - startdrag(struct wl_listener *listener, void *data) - { --- -2.50.1 - diff --git a/dwl-bak/dwl-patches/patches/startargv/README.md b/dwl-bak/dwl-patches/patches/startargv/README.md deleted file mode 100644 index bc15225..0000000 --- a/dwl-bak/dwl-patches/patches/startargv/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -allow passing startup command on argv - -e.g. `dwl -s foot -s` launches `foot -s` - -put `sh -c` right after `dwl -s` to emulate normal behaviour - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/startargv) -- [2024-07-03](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/startargv/startargv.patch) - -### Authors -- [notchoc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/startargv/startargv.patch b/dwl-bak/dwl-patches/patches/startargv/startargv.patch deleted file mode 100644 index 5697b9c..0000000 --- a/dwl-bak/dwl-patches/patches/startargv/startargv.patch +++ /dev/null @@ -1,58 +0,0 @@ -From a823f7923f8d2006eedc013ca1c1ba7a496543d5 Mon Sep 17 00:00:00 2001 -From: choc -Date: Wed, 3 Jul 2024 11:21:33 +0800 -Subject: [PATCH] startargv: allow passing startup command on argv - ---- - dwl.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 9fb50a7..43b1ac1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -320,7 +320,7 @@ static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); --static void run(char *startup_cmd); -+static void run(char **startup_cmd); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -2158,7 +2158,7 @@ resize(Client *c, struct wlr_box geo, int interact) - } - - void --run(char *startup_cmd) -+run(char **startup_cmd) - { - /* Add a Unix socket to the Wayland display. */ - const char *socket = wl_display_add_socket_auto(dpy); -@@ -2183,7 +2183,7 @@ run(char *startup_cmd) - dup2(piperw[0], STDIN_FILENO); - close(piperw[0]); - close(piperw[1]); -- execl("/bin/sh", "/bin/sh", "-c", startup_cmd, NULL); -+ execvp(startup_cmd[0], startup_cmd); - die("startup: execl:"); - } - dup2(piperw[1], STDOUT_FILENO); -@@ -3124,12 +3124,12 @@ xwaylandready(struct wl_listener *listener, void *data) - int - main(int argc, char *argv[]) - { -- char *startup_cmd = NULL; -+ char **startup_cmd = NULL; - int c; - - while ((c = getopt(argc, argv, "s:hdv")) != -1) { - if (c == 's') -- startup_cmd = optarg; -+ *(startup_cmd = &argv[optind-1]) = optarg, argc = 0; - else if (c == 'd') - log_level = WLR_DEBUG; - else if (c == 'v') --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/sticky/README.md b/dwl-bak/dwl-patches/patches/sticky/README.md deleted file mode 100644 index af0e81f..0000000 --- a/dwl-bak/dwl-patches/patches/sticky/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### Description -Adds a toggleable function that makes a sticky client that is visible on all tags. - -Originally based on [dwm sticky patch](https://dwm.suckless.org/patches/sticky). - -### Download -- [2024-07-26](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/sticky/sticky.patch) -- [v0.4](https://github.com/djpohly/dwl/compare/main...dm1tz:04-sticky.patch) -- [git branch](https://codeberg.org/Rutherther/dwl/src/branch/v0.7/sticky) - -### Authors -- [Rutherther](https://codeberg.org/Rutherther) -- [Dmitry Zakharchenko](https://github.com/dm1tz) diff --git a/dwl-bak/dwl-patches/patches/sticky/sticky.patch b/dwl-bak/dwl-patches/patches/sticky/sticky.patch deleted file mode 100644 index ece8308..0000000 --- a/dwl-bak/dwl-patches/patches/sticky/sticky.patch +++ /dev/null @@ -1,85 +0,0 @@ -From f113cdc0b4cecceaaf28679489852ae61a1aa3f5 Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Fri, 19 Jul 2024 16:29:43 +0200 -Subject: [PATCH] sticky - ---- - dwl.c | 27 +++++++++++++++++++++++++-- - 1 file changed, 25 insertions(+), 2 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 5bf995e..820f4af 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -73,7 +73,7 @@ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) - #define MIN(A, B) ((A) < (B) ? (A) : (B)) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) --#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) -+#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && (((C)->tags & (M)->tagset[(M)->seltags]) || C->issticky)) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) -@@ -139,7 +139,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, issticky; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -326,6 +326,7 @@ static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); - static void setfullscreen(Client *c, int fullscreen); -+static void setsticky(Client *c, int sticky); - static void setgamma(struct wl_listener *listener, void *data); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); -@@ -339,6 +340,7 @@ static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); -+static void togglesticky(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); -@@ -2351,6 +2353,17 @@ setgamma(struct wl_listener *listener, void *data) - wlr_output_schedule_frame(m->wlr_output); - } - -+void -+setsticky(Client *c, int sticky) -+{ -+ if(sticky && !c->issticky) { -+ c->issticky = 1; -+ } else if(!sticky && c->issticky) { -+ c->issticky = 0; -+ arrange(c->mon); -+ } -+} -+ - void - setlayout(const Arg *arg) - { -@@ -2738,6 +2751,16 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglesticky(const Arg *arg) -+{ -+ Client *c = focustop(selmon); -+ if(!c) -+ return; -+ -+ setsticky(c, !c->issticky); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/swallow/README.md b/dwl-bak/dwl-patches/patches/swallow/README.md deleted file mode 100644 index 6c16162..0000000 --- a/dwl-bak/dwl-patches/patches/swallow/README.md +++ /dev/null @@ -1,53 +0,0 @@ -### Description - -This patch adds "window swallowing" to dwl. - -If a user runs a graphical program from the terminal (e.g., `mpv`), the terminal -will be hidden and only a window of the newly spawned graphical program will -be visible. The terminal stays hidden until the graphical program is closed. -This patch helps users spawning a lot of graphical programs from their command -line by avoiding cluttering the screen with many unusable terminals. - -`foot` is the terminal by default, you can change it in client rules in config.h. - -In `2025-03-03 v0.7` version and above, the patch had been rewritten from -scratch to make it more robust and add a few more features: - -- "dynamically swallow" windows by pressing `Alt+a` (a focused window will - swallow/unswallow the previously focused one) -- toggle automatic swallowing by `Alt+Shift+a` -- if a window has swallowed another, it get thicker borders - -### Download - -#### swallow.patch - -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/swallow/swallow.patch) -- [2025-03-03 v0.7](https://codeberg.org/dwl/dwl-patches/raw/commit/2e5748edfe1129f95c7bb1bf9dd590a897f55f57/patches/swallow/swallow.patch) (added "dynamic swallowing" support) -- [2024-07-13](https://codeberg.org/dwl/dwl-patches/raw/commit/f1ed83eaeba46108f4ee8164094cb431d64a3e68/patches/swallow/swallow.patch) -- [2024-07-13](https://codeberg.org/dwl/dwl-patches/raw/commit/f64d701bab2f9f52d3637edd091684f920407d87/patches/swallow/swallow.patch) -- [2024-05-02](https://codeberg.org/dwl/dwl-patches/raw/commit/9c5d5d85f3ac780e7a14d5d0535e3349ce8b8f53/patches/swallow/swallow.patch) -- [2024-04-03](https://codeberg.org/dwl/dwl-patches/raw/commit/3c9a8e3232a8531871924484cef1ef0938730e15/swallow/swallow.patch) -- [2024-01-01](https://codeberg.org/dwl/dwl-patches/raw/commit/8a352a1b27a64821ba9fbfda52fe82463ac84c66/swallow/swallow.patch) -- [2023-10-26](https://github.com/djpohly/dwl/compare/main...youbitchoc:swallow.patch) -- [2023-08-16](https://github.com/djpohly/dwl/compare/main...mewkl:swallowx.patch) (added XWayland support) -- [2023-07-15](https://github.com/djpohly/dwl/compare/main...NikitaIvanovV:swallow.patch) -- [v0.4](https://github.com/djpohly/dwl/compare/main...dm1tz:04-swallow.patch) -- [2021-12-03](https://github.com/djpohly/dwl/compare/main...dm1tz:swallow.patch) - -#### swallow-freebsd.patch - -Apply this patch on top of the swallow.patch if you use FreeBSD. - -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/swallow/swallow-freebsd.patch) -- [2025-03-03 v0.7](https://codeberg.org/dwl/dwl-patches/raw/commit/2e5748edfe1129f95c7bb1bf9dd590a897f55f57/patches/swallow/swallow-freebsd.patch) (added "dynamic swallowing" support) -- [2024-07-13](https://codeberg.org/dwl/dwl-patches/raw/commit/f1ed83eaeba46108f4ee8164094cb431d64a3e68/patches/swallow/swallow-freebsd.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) -- [Dmitry Zakharchenko](https://github.com/dm1tz) -- [Palanix](https://codeberg.org/Palanix) -- [Connor Worrell](https://github.com/ConnorWorrell) -- [Mewkl](https://github.com/mewkl) -- [Choc](https://codeberg.org/notchoc) diff --git a/dwl-bak/dwl-patches/patches/swallow/swallow-freebsd.patch b/dwl-bak/dwl-patches/patches/swallow/swallow-freebsd.patch deleted file mode 100644 index 795a5e1..0000000 --- a/dwl-bak/dwl-patches/patches/swallow/swallow-freebsd.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 301e1b368d92a32a7bdcd4bd1f0ede0295977e3e Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Mon, 3 Mar 2025 19:49:07 +0100 -Subject: [PATCH] swallow: add FreeBSD support - ---- - dwl.c | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/dwl.c b/dwl.c -index 71d500a..52fdd9c 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -67,6 +67,14 @@ - #include - #endif - -+#ifdef __FreeBSD__ -+#define __BSD_VISIBLE -+#include -+#include -+#include -+#include -+#endif -+ - #include "util.h" - - /* macros */ -@@ -2032,6 +2040,7 @@ outputmgrtest(struct wl_listener *listener, void *data) - pid_t - parentpid(pid_t pid) - { -+#ifdef __linux__ - unsigned int v = 0; - FILE *f; - char buf[256]; -@@ -2041,6 +2050,14 @@ parentpid(pid_t pid) - fscanf(f, "%*u %*s %*c %u", &v); - fclose(f); - return (pid_t)v; -+#elif defined(__FreeBSD__) -+ struct kinfo_proc kip; -+ size_t len = sizeof(struct kinfo_proc); -+ int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, p }; -+ if (sysctl(mib, 4, &kip, &len, NULL, 0) < 0 || len == 0) -+ return 0; -+ return kip.ki_ppid; -+#endif - } - - void --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/swallow/swallow.patch b/dwl-bak/dwl-patches/patches/swallow/swallow.patch deleted file mode 100644 index ee1a1c1..0000000 --- a/dwl-bak/dwl-patches/patches/swallow/swallow.patch +++ /dev/null @@ -1,351 +0,0 @@ -From a220e1ed4b04a66c837dfc8e3363d3e696cbf541 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Wed, 5 Feb 2025 02:34:39 +0100 -Subject: [PATCH] Swallow: hide the terminal when it spawns a client - ---- - client.h | 12 ++++ - config.def.h | 11 +++- - dwl.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++-- - 3 files changed, 168 insertions(+), 7 deletions(-) - -diff --git a/client.h b/client.h -index 42f225f..bc9cad2 100644 ---- a/client.h -+++ b/client.h -@@ -131,6 +131,18 @@ client_get_appid(Client *c) - return c->surface.xdg->toplevel->app_id; - } - -+static inline int -+client_get_pid(Client *c) -+{ -+ pid_t pid; -+#ifdef XWAYLAND -+ if (client_is_x11(c)) -+ return c->surface.xwayland->pid; -+#endif -+ wl_client_get_credentials(c->surface.xdg->client->client, &pid, NULL, NULL); -+ return pid; -+} -+ - static inline void - client_get_clip(Client *c, struct wlr_box *clip) - { -diff --git a/config.def.h b/config.def.h -index 22d2171..42342f1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,8 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static int enableautoswallow = 1; /* enables autoswallowing newly spawned clients */ -+static float swallowborder = 1.0f; /* add this multiplied by borderpx to border when a client is swallowed */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -@@ -22,10 +24,11 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating isterm noswallow monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "foot", NULL, 0, 0, 1, 1, -1 }, -+ { "Gimp_EXAMPLE", NULL, 0, 1, 0, 0, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 0, 0, -1 }, /* Start on ONLY tag "9" */ - }; - - /* layout(s) */ -@@ -142,6 +145,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_a, toggleswallow, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A, toggleautoswallow,{0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index def2562..71d500a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -73,12 +73,13 @@ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) - #define MIN(A, B) ((A) < (B) ? (A) : (B)) - #define CLEANMASK(mask) (mask & ~WLR_MODIFIER_CAPS) --#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags])) -+#define VISIBLEON(C, M) ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags]) && !(C)->swallowedby) - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) - #define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) -+#define BORDERPX(C) (borderpx + ((C)->swallowing ? (int)ceilf(swallowborder * (C)->swallowing->bw) : 0)) - - /* enums */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -@@ -104,7 +105,8 @@ typedef struct { - } Button; - - typedef struct Monitor Monitor; --typedef struct { -+typedef struct Client Client; -+struct Client { - /* Must keep these three elements in this order */ - unsigned int type; /* XDGShell or X11* */ - struct wlr_box geom; /* layout-relative, includes border */ -@@ -140,8 +142,12 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ int isterm, noswallow; - uint32_t resize; /* configure serial of a pending resize */ --} Client; -+ pid_t pid; -+ Client *swallowing; /* client being hidden */ -+ Client *swallowedby; -+}; - - typedef struct { - uint32_t mod; -@@ -230,6 +236,8 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int isterm; -+ int noswallow; - int monitor; - } Rule; - -@@ -311,6 +319,7 @@ static void moveresize(const Arg *arg); - static void outputmgrapply(struct wl_listener *listener, void *data); - static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test); - static void outputmgrtest(struct wl_listener *listener, void *data); -+static pid_t parentpid(pid_t pid); - static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); - static void printstatus(void); -@@ -335,11 +344,15 @@ static void setsel(struct wl_listener *listener, void *data); - static void setup(void); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); -+static void swallow(Client *c, Client *toswallow); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -+static Client *termforwin(Client *c); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void toggleswallow(const Arg *arg); -+static void toggleautoswallow(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -466,11 +479,15 @@ applyrules(Client *c) - if (!(title = client_get_title(c))) - title = broken; - -+ c->pid = client_get_pid(c); -+ - for (r = rules; r < END(rules); r++) { - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; - newtags |= r->tags; -+ c->isterm = r->isterm; -+ c->noswallow = r->noswallow; - i = 0; - wl_list_for_each(m, &mons, link) { - if (r->monitor == i++) -@@ -478,6 +495,12 @@ applyrules(Client *c) - } - } - } -+ if (enableautoswallow && !c->noswallow && !c->isfloating && -+ !c->surface.xdg->initial_commit) { -+ Client *p = termforwin(c); -+ if (p) -+ swallow(c, p); -+ } - setmon(c, mon, newtags); - } - -@@ -2006,6 +2029,20 @@ outputmgrtest(struct wl_listener *listener, void *data) - outputmgrapplyortest(config, 1); - } - -+pid_t -+parentpid(pid_t pid) -+{ -+ unsigned int v = 0; -+ FILE *f; -+ char buf[256]; -+ snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)pid); -+ if (!(f = fopen(buf, "r"))) -+ return 0; -+ fscanf(f, "%*u %*s %*c %u", &v); -+ fclose(f); -+ return (pid_t)v; -+} -+ - void - pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - uint32_t time) -@@ -2326,7 +2363,7 @@ setfullscreen(Client *c, int fullscreen) - c->isfullscreen = fullscreen; - if (!c->mon || !client_surface(c)->mapped) - return; -- c->bw = fullscreen ? 0 : borderpx; -+ c->bw = fullscreen ? 0 : BORDERPX(c); - client_set_fullscreen(c, fullscreen); - wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen - ? LyrFS : c->isfloating ? LyrFloat : LyrTile]); -@@ -2404,6 +2441,9 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - setfloating(c, c->isfloating); - } - focusclient(focustop(selmon), 1); -+ -+ if (c->swallowing) -+ setmon(c->swallowing, m, newtags); - } - - void -@@ -2669,6 +2709,44 @@ startdrag(struct wl_listener *listener, void *data) - LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon); - } - -+void -+swallow(Client *c, Client *toswallow) -+{ -+ /* Do not allow a client to swallow itself */ -+ if (c == toswallow) -+ return; -+ -+ /* Swallow */ -+ if (toswallow && !c->swallowing) { -+ c->swallowing = toswallow; -+ toswallow->swallowedby = c; -+ toswallow->mon = c->mon; -+ toswallow->mon = c->mon; -+ wl_list_remove(&c->link); -+ wl_list_insert(&c->swallowing->link, &c->link); -+ wl_list_remove(&c->flink); -+ wl_list_insert(&c->swallowing->flink, &c->flink); -+ c->bw = BORDERPX(c); -+ c->tags = toswallow->tags; -+ c->isfloating = toswallow->isfloating; -+ c->geom = toswallow->geom; -+ setfullscreen(toswallow, 0); -+ } -+ -+ /* Unswallow */ -+ else if (c->swallowing) { -+ wl_list_remove(&c->swallowing->link); -+ wl_list_insert(&c->link, &c->swallowing->link); -+ wl_list_remove(&c->swallowing->flink); -+ wl_list_insert(&c->flink, &c->swallowing->flink); -+ c->swallowing->tags = c->tags; -+ c->swallowing->swallowedby = NULL; -+ c->swallowing = NULL; -+ c->bw = BORDERPX(c); -+ setfullscreen(c, 0); -+ } -+} -+ - void - tag(const Arg *arg) - { -@@ -2690,6 +2768,40 @@ tagmon(const Arg *arg) - setmon(sel, dirtomon(arg->i), 0); - } - -+Client * -+termforwin(Client *c) -+{ -+ Client *p; -+ pid_t pid; -+ pid_t pids[32]; -+ size_t i, pids_len; -+ -+ if (!c->pid || c->isterm) -+ return NULL; -+ -+ /* Get all parent pids */ -+ pids_len = 0; -+ pid = c->pid; -+ while (pids_len < LENGTH(pids)) { -+ pid = parentpid(pid); -+ if (!pid) -+ break; -+ pids[pids_len++] = pid; -+ } -+ -+ /* Find closest parent */ -+ for (i = 0; i < pids_len; i++) { -+ wl_list_for_each(p, &clients, link) { -+ if (!p->pid || !p->isterm || p->swallowedby) -+ continue; -+ if (pids[i] == p->pid) -+ return p; -+ } -+ } -+ -+ return NULL; -+} -+ - void - tile(Monitor *m) - { -@@ -2741,6 +2853,32 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+toggleswallow(const Arg *arg) -+{ -+ Client *c, *sel = focustop(selmon); -+ if (!sel) -+ return; -+ -+ if (sel->swallowing) { -+ swallow(sel, NULL); -+ } else { -+ wl_list_for_each(c, &sel->flink, flink) { -+ if (&c->flink == &fstack) -+ continue; /* wrap past the sentinel node */ -+ if (VISIBLEON(c, selmon)) -+ break; /* found it */ -+ } -+ swallow(sel, c); -+ } -+} -+ -+void -+toggleautoswallow(const Arg *arg) -+{ -+ enableautoswallow = !enableautoswallow; -+} -+ - void - toggletag(const Arg *arg) - { -@@ -2801,6 +2939,12 @@ unmapnotify(struct wl_listener *listener, void *data) - grabc = NULL; - } - -+ if (c->swallowing) { -+ swallow(c, NULL); -+ } else if (c->swallowedby) { -+ swallow(c->swallowedby, NULL); -+ } -+ - if (client_is_unmanaged(c)) { - if (c == exclusive_focus) { - exclusive_focus = NULL; --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/swapandfocusdir/README.md b/dwl-bak/dwl-patches/patches/swapandfocusdir/README.md deleted file mode 100644 index 2861a07..0000000 --- a/dwl-bak/dwl-patches/patches/swapandfocusdir/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Description -Focus the window (floating or no) to the left, right, above, or below the current focused window. - -Swap the focused window with the window (no floating) to the left, right, above, or below. - -**NOTE:** this patch uses the same algorithm that River uses to select the window in the given direction. - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/swapandfocusdir) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/swapandfocusdir/swapandfocusdir.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/swapandfocusdir/swapandfocusdir.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/swapandfocusdir/swapandfocusdir.patch b/dwl-bak/dwl-patches/patches/swapandfocusdir/swapandfocusdir.patch deleted file mode 100644 index 3636387..0000000 --- a/dwl-bak/dwl-patches/patches/swapandfocusdir/swapandfocusdir.patch +++ /dev/null @@ -1,221 +0,0 @@ -From 285470897406b653e77d732a77356aaf9a70b799 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 12:37:39 -0500 -Subject: [PATCH] implement swapandfocusdir - ---- - config.def.h | 8 +++ - dwl.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 172 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..724e15e 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -129,6 +129,14 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Left, focusdir, {.ui = 0} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Right, focusdir, {.ui = 1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Up, focusdir, {.ui = 2} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_Down, focusdir, {.ui = 3} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, swapdir, {.ui = 0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, swapdir, {.ui = 1} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Up, swapdir, {.ui = 2} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Down, swapdir, {.ui = 3} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -diff --git a/dwl.c b/dwl.c -index dc0437e..844c1f5 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -241,6 +241,11 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+typedef struct { -+ int x; -+ int y; -+} Vector; -+ - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -285,6 +290,8 @@ static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -+static void focusdir(const Arg *arg); -+static void swapdir(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -1425,6 +1432,163 @@ focusstack(const Arg *arg) - focusclient(c, 1); - } - -+Vector -+position_of_box(const struct wlr_box *box) -+{ -+ return (Vector){ -+ .x = box->x + box->width / 2, -+ .y = box->y + box->height / 2, -+ }; -+} -+ -+Vector -+diff_of_vectors(Vector *a, Vector *b) -+{ -+ return (Vector){ -+ .x = b->x - a->x, -+ .y = b->y - a->y, -+ }; -+} -+ -+const char * -+direction_of_vector(Vector *vector) -+{ -+ // A zero length vector has no direction -+ if (vector->x == 0 && vector->y == 0) return ""; -+ -+ if (abs(vector->y) > abs(vector->x)) { -+ // Careful: We are operating in a Y-inverted coordinate system. -+ return (vector->y > 0) ? "bottom" : "top"; -+ } else { -+ return (vector->x > 0) ? "right" : "left"; -+ } -+} -+ -+uint32_t -+vector_length(Vector *vector) -+{ -+ // Euclidean distance formula -+ return (uint32_t)sqrt(vector->x * vector->x + vector->y * vector->y); -+} -+ -+// Spatial direction, based on focused client position. -+Client * -+client_in_direction(const char *direction, const int *skipfloat) -+{ -+ Client *cfocused = focustop(selmon); -+ Vector cfocusedposition; -+ Client *ctarget = NULL; -+ double targetdistance = INFINITY; -+ Client *c; -+ -+ if (!cfocused || cfocused->isfullscreen || (skipfloat && cfocused->isfloating)) -+ return NULL; -+ -+ cfocusedposition = position_of_box(&cfocused->geom); -+ -+ wl_list_for_each(c, &clients, link) { -+ Vector cposition; -+ Vector positiondiff; -+ uint32_t distance; -+ -+ if (c == cfocused) -+ continue; -+ -+ if (skipfloat && c->isfloating) -+ continue; -+ -+ if (!VISIBLEON(c, selmon)) -+ continue; -+ -+ cposition = position_of_box(&c->geom); -+ positiondiff = diff_of_vectors(&cfocusedposition, &cposition); -+ -+ if (strcmp(direction, direction_of_vector(&positiondiff)) != 0) -+ continue; -+ -+ distance = vector_length(&positiondiff); -+ -+ if (distance < targetdistance) { -+ ctarget = c; -+ targetdistance = distance; -+ } -+ } -+ -+ return ctarget; -+} -+ -+void -+focusdir(const Arg *arg) -+{ -+ Client *c = NULL; -+ -+ if (arg->ui == 0) -+ c = client_in_direction("left", (int *)0); -+ if (arg->ui == 1) -+ c = client_in_direction("right", (int *)0); -+ if (arg->ui == 2) -+ c = client_in_direction("top", (int *)0); -+ if (arg->ui == 3) -+ c = client_in_direction("bottom", (int *)0); -+ -+ if (c != NULL) -+ focusclient(c, 1); -+} -+ -+void -+wl_list_swap(struct wl_list *list1, struct wl_list *list2) -+{ -+ struct wl_list *prev1, *next1, *prev2, *next2; -+ struct wl_list temp; -+ -+ if (list1 == list2) { -+ // No need to swap the same list -+ return; -+ } -+ -+ // Get the lists before and after list1 -+ prev1 = list1->prev; -+ next1 = list1->next; -+ -+ // Get the lists before and after list2 -+ prev2 = list2->prev; -+ next2 = list2->next; -+ -+ // Update the next and previous pointers of adjacent lists -+ prev1->next = list2; -+ next1->prev = list2; -+ prev2->next = list1; -+ next2->prev = list1; -+ -+ // Swap the next and previous pointers of the lists to actually swap them -+ temp = *list1; -+ *list1 = *list2; -+ *list2 = temp; -+} -+ -+void -+swapdir(const Arg *arg) -+{ -+ Client *c = NULL; -+ Client *cfocused; -+ -+ if (arg->ui == 0) -+ c = client_in_direction("left", (int *)1); -+ if (arg->ui == 1) -+ c = client_in_direction("right", (int *)1); -+ if (arg->ui == 2) -+ c = client_in_direction("top", (int *)1); -+ if (arg->ui == 3) -+ c = client_in_direction("bottom", (int *)1); -+ -+ if (c == NULL) -+ return; -+ -+ cfocused = focustop(selmon); -+ wl_list_swap(&cfocused->link, &c->link); -+ arrange(selmon); -+} -+ - /* We probably should change the name of this, it sounds like - * will focus the topmost client of this mon, when actually will - * only return that client */ --- -2.45.1 - diff --git a/dwl-bak/dwl-patches/patches/switchtotag/README.md b/dwl-bak/dwl-patches/patches/switchtotag/README.md deleted file mode 100644 index 55175d1..0000000 --- a/dwl-bak/dwl-patches/patches/switchtotag/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Add a rule option to switch to the configured tag when a window opens, then switch back when it closes. - -### Download -- [git branch](https://codeberg.org/guidocella/dwl/src/branch/switchtotag) -- [2024-09-30](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/switchtotag/switchtotag.patch) - -### Authors -- [Guido Cella](https://codeberg.org/guidocella) diff --git a/dwl-bak/dwl-patches/patches/switchtotag/switchtotag.patch b/dwl-bak/dwl-patches/patches/switchtotag/switchtotag.patch deleted file mode 100644 index bbe1638..0000000 --- a/dwl-bak/dwl-patches/patches/switchtotag/switchtotag.patch +++ /dev/null @@ -1,116 +0,0 @@ -From 08cfc2eceb34316cfd7eaf591a8a631e3d58ff3a Mon Sep 17 00:00:00 2001 -From: Guido Cella -Date: Mon, 30 Sep 2024 08:40:25 +0200 -Subject: [PATCH] allow switching to the configured tag when a window opens - -Add a rule option to switch to the configured tag when a window opens, -then switch back when it closes. ---- - config.def.h | 6 +++--- - dwl.c | 23 +++++++++++++++++++---- - 2 files changed, 22 insertions(+), 7 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..52ea128 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -22,10 +22,10 @@ static int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask switchtotag isfloating monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 1, 0, -1 }, /* Start on ONLY tag "9" */ - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index dc0c861..621b614 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -142,6 +142,7 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ int switchtotag; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -230,6 +231,7 @@ typedef struct { - const char *id; - const char *title; - uint32_t tags; -+ bool switchtotag; - int isfloating; - int monitor; - } Rule; -@@ -245,7 +247,7 @@ typedef struct { - - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); --static void applyrules(Client *c); -+static void applyrules(Client *c, bool map); - static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); -@@ -449,7 +451,7 @@ applybounds(Client *c, struct wlr_box *bbox) - } - - void --applyrules(Client *c) -+applyrules(Client *c, bool map) - { - /* rule matching */ - const char *appid, *title; -@@ -472,6 +474,11 @@ applyrules(Client *c) - if (r->monitor == i++) - mon = m; - } -+ if (r->switchtotag && map) { -+ c->switchtotag = selmon->tagset[selmon->seltags]; -+ mon->seltags ^= 1; -+ mon->tagset[selmon->seltags] = r->tags & TAGMASK; -+ } - } - } - setmon(c, mon, newtags); -@@ -795,7 +802,7 @@ commitnotify(struct wl_listener *listener, void *data) - * a different monitor based on its title this will likely select - * a wrong monitor. - */ -- applyrules(c); -+ applyrules(c, false); - if (c->mon) { - client_set_scale(client_surface(c), c->mon->wlr_output->scale); - } -@@ -1733,7 +1740,7 @@ mapnotify(struct wl_listener *listener, void *data) - c->isfloating = 1; - setmon(c, p->mon, p->tags); - } else { -- applyrules(c); -+ applyrules(c, true); - } - printstatus(); - -@@ -2769,6 +2776,14 @@ unmapnotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->flink); - } - -+ if (c->switchtotag) { -+ Arg a = { .ui = c->switchtotag }; -+ // Call view() -> arrange() -> checkidleinhibitor() before -+ // wlr_scene_node_destroy() to prevent a rare use after free of -+ // tree->node. -+ view(&a); -+ } -+ - wlr_scene_node_destroy(&c->scene->node); - printstatus(); - motionnotify(0, NULL, 0, 0, 0, 0); --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/systemd/README.md b/dwl-bak/dwl-patches/patches/systemd/README.md deleted file mode 100644 index a861b5e..0000000 --- a/dwl-bak/dwl-patches/patches/systemd/README.md +++ /dev/null @@ -1,33 +0,0 @@ -### Description -This is a simple patch that runs `systemctl --user import-environment WAYLAND_DISPLAY DISPLAY`, and `systemctl --user start dwl-session.target` after Dwl initializes, and then `systemctl --user stop dwl-session.target` when Dwl quits. This allows you to handle graceful startup and shutdown of your graphical systemd services, with the proper environment variables set. This is similar to [uwsm](https://github.com/Vladimir-csp/uwsm?tab=readme-ov-file), but it integrates natively with your existing systemd user services, and doesn't have uwsm's runtime overhead. - -You must have a `dwl-session.target` created that binds to `graphical-session.target`. You can then set the WantedBy of your systemd services to either `graphical-session.target`, or `dwl-session.target`, depending on whether you want them to start for just Dwl, or for every graphical session. - -Below is the Nix home-manager configuration I use to generate `dwl-session.target`, and its resulting output. -``` -systemd.user.targets.dwl-session.Unit = { - Description = "dwl compositor session"; - Documentation = [ "man:systemd.special(7)" ]; - BindsTo = [ "graphical-session.target" ]; - Wants = [ "graphical-session-pre.target" ]; - After = [ "graphical-session-pre.target" ]; -}; -``` - -``` -[Unit] -After=graphical-session-pre.target -BindsTo=graphical-session.target -Description=dwl compositor session -Documentation=man:systemd.special(7) -Wants=graphical-session-pre.target -``` - -### Download -- [git branch](https://github.com/Shringe/dwl/tree/systemd) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/systemd/systemd-0.7.patch) - -### Authors -- [Shringe](https://codeberg.org/Shringe) -- shringe_ at [dwl Discord](https://discord.gg/jJxZnrGPWN) - diff --git a/dwl-bak/dwl-patches/patches/systemd/systemd-0.7.patch b/dwl-bak/dwl-patches/patches/systemd/systemd-0.7.patch deleted file mode 100644 index f911997..0000000 --- a/dwl-bak/dwl-patches/patches/systemd/systemd-0.7.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 43b3026b0744d54287eada71c84ea8be174950c3 Mon Sep 17 00:00:00 2001 -From: Shringe -Date: Sat, 12 Jul 2025 01:00:46 -0500 -Subject: [PATCH] basic implementation - ---- - dwl.c | 34 ++++++++++++++++++++++++++++++++++ - 1 file changed, 34 insertions(+) - -diff --git a/dwl.c b/dwl.c -index c717c1d..4ba134d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -680,6 +680,15 @@ cleanup(void) - wlr_xwayland_destroy(xwayland); - xwayland = NULL; - #endif -+ /* Stop systemd target */ -+ if (fork() == 0) { -+ setsid(); -+ execvp("systemctl", (char *const[]) { -+ "systemctl", "--user", "stop", "dwl-session.target", NULL -+ }); -+ exit(1); -+ } -+ - wl_display_destroy_clients(dpy); - if (child_pid > 0) { - kill(-child_pid, SIGTERM); -@@ -2222,6 +2231,31 @@ run(char *startup_cmd) - die("startup: display_add_socket_auto"); - setenv("WAYLAND_DISPLAY", socket, 1); - -+ /* Import environment variables then start systemd target */ -+ if (fork() == 0) { -+ setsid(); -+ -+ /* First: import environment variables */ -+ pid_t import_pid = fork(); -+ if (import_pid == 0) { -+ execvp("systemctl", (char *const[]) { -+ "systemctl", "--user", "import-environment", -+ "DISPLAY", "WAYLAND_DISPLAY", NULL -+ }); -+ exit(1); -+ } -+ -+ /* Wait for import to complete */ -+ waitpid(import_pid, NULL, 0); -+ -+ /* Second: start target */ -+ execvp("systemctl", (char *const[]) { -+ "systemctl", "--user", "start", "dwl-session.target", NULL -+ }); -+ -+ exit(1); -+ } -+ - /* Start the backend. This will enumerate outputs and inputs, become the DRM - * master, etc */ - if (!wlr_backend_start(backend)) --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/tab/README.md b/dwl-bak/dwl-patches/patches/tab/README.md deleted file mode 100644 index 9f08765..0000000 --- a/dwl-bak/dwl-patches/patches/tab/README.md +++ /dev/null @@ -1,24 +0,0 @@ -### Description -Add tabs or a title bar to the top or bottom of windows. - -Much of the code was taken from the [bar patch](/dwl/dwl-patches/src/branch/main/patches/bar). - -**This is the new version using `drwl`. The [old version](/dwl/dwl-patches/src/branch/main/_STALE_PATCHES/tab-pango) is deprecated.** - -### Dependencies -- tllist (build dependency, required & pulled automatically by fcft) -- fcft -- pixman - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/tab/tab-0.7.patch) -- [0.7 + bar](/dwl/dwl-patches/raw/branch/main/patches/tab/tab-0.7-bar.patch) -- [main 2024-11-15](/dwl/dwl-patches/raw/branch/main/patches/tab/tab.patch) - -### Authors -- [dev-gm](https://codeberg.org/dev-gm) - -### Credits -- [sewn](https://codeberg.org/sewn) -- [MadcowOG](https://codeberg.org/MadcowOG) -- [kolumni](https://codeberg.org/kolumni) diff --git a/dwl-bak/dwl-patches/patches/tab/tab-0.7-bar.patch b/dwl-bak/dwl-patches/patches/tab/tab-0.7-bar.patch deleted file mode 100644 index 4a79bbc..0000000 --- a/dwl-bak/dwl-patches/patches/tab/tab-0.7-bar.patch +++ /dev/null @@ -1,767 +0,0 @@ -From 3944cc81d0683700405cd106edf965293abbb87c Mon Sep 17 00:00:00 2001 -From: dev-gm -Date: Sat, 16 Nov 2024 23:27:19 -0500 -Subject: [PATCH] Add tab support - ---- - config.def.h | 25 +++- - dwl.c | 392 +++++++++++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 386 insertions(+), 31 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 5d1dc2b..52fcfee 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,6 +10,13 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ - static const char *fonts[] = {"monospace:size=10"}; -+static const char *tbar_fonts[] = {"monospace:size=10"}; -+static const int tbar_top = 0; -+static const int tbar_height = -1; -+static const int tbar_borderpx = 1; -+static const int tbar_padding = 10; -+static const float tbar_scale = -1; /* -1 means use monitor scale */ -+static const int tbar_float_sel_sep = 0; /* should tbar be highlighted only on the currently selected window or on both the last selected floating window and the laste selected tiling window */ - static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -@@ -20,6 +27,13 @@ static uint32_t colors[][3] = { - [SchemeUrg] = { 0, 0, 0x770000ff }, - }; - -+static uint32_t tbar_colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x555555ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x555555ff }, -+ [SchemeUrg] = { 0xc7c7c7ff, 0x222222ff, 0x770000ff }, -+}; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - static char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -@@ -34,12 +48,15 @@ static const Rule rules[] = { - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ - }; - -+static const unsigned int floating_tbar_type = TBarLabel; -+static const int floating_tbar_only_top = 0; -+ - /* layout(s) */ - static const Layout layouts[] = { -- /* symbol arrange function */ -- { "[]=", tile }, -- { "><>", NULL }, /* no layout function means floating behavior */ -- { "[M]", monocle }, -+ /* symbol tbar type tbar only on top arrange function */ -+ { "[]=", TBarLabel, 0, tile }, -+ { "><>", TBarLabel, 0, NULL }, /* no layout function means floating behavior */ -+ { "[M]", TBarMultiple, 1, monocle }, - }; - - /* monitors */ -diff --git a/dwl.c b/dwl.c -index 1e199f3..e7754d3 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -90,6 +91,7 @@ enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* clicks */ -+enum { TBarNone, TBarLabel, TBarMultiple, TBarAlways }; /* tbar types */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -110,6 +112,14 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -119,6 +129,11 @@ typedef struct { - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ - struct wlr_scene_tree *scene_surface; -+ struct wlr_scene_buffer *tbar_buffer; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int tbar_height, tbar_real_height; -+ float tbar_scale; - struct wl_list link; - struct wl_list flink; - union { -@@ -146,7 +161,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, tbar_enabled, resize_tbar_enabled; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -190,17 +205,11 @@ typedef struct { - - typedef struct { - const char *symbol; -+ unsigned int tbar_type; /* type of tbar */ -+ int tbar_only_top; - void (*arrange)(Monitor *); - } Layout; - --typedef struct { -- struct wlr_buffer base; -- struct wl_listener release; -- bool busy; -- Img *image; -- uint32_t data[]; --} Buffer; -- - struct Monitor { - struct wl_list link; - struct wlr_output *wlr_output; -@@ -275,10 +284,11 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static bool baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy); --static void bufdestroy(struct wlr_buffer *buffer); --static bool bufdatabegin(struct wlr_buffer *buffer, uint32_t flags, -+static Buffer *bufclient(Client *c); -+static void bufdestroy(struct wlr_buffer *wlr_buffer); -+static bool bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, - void **data, uint32_t *format, size_t *stride); --static void bufdataend(struct wlr_buffer *buffer); -+static void bufdataend(struct wlr_buffer *wlr_buffer); - static Buffer *bufmon(Monitor *m); - static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); -@@ -316,12 +326,15 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawtbars(Monitor *m, int floating, int clients_changed); -+static void drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout); - static void drawbar(Monitor *m); - static void drawbars(void); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); -+static Client *focustop_onlytiled(Monitor *m, int onlytiled); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -529,14 +542,16 @@ void - arrange(Monitor *m) - { - Client *c; -+ int enabled; - - if (!m->wlr_output->enabled) - return; - - wl_list_for_each(c, &clients, link) { - if (c->mon == m) { -- wlr_scene_node_set_enabled(&c->scene->node, VISIBLEON(c, m)); -- client_set_suspended(c, !VISIBLEON(c, m)); -+ enabled = VISIBLEON(c, m); -+ wlr_scene_node_set_enabled(&c->scene->node, enabled); -+ client_set_suspended(c, !enabled); - } - } - -@@ -561,6 +576,7 @@ arrange(Monitor *m) - - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -+ - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } -@@ -650,6 +666,36 @@ baracceptsinput(struct wlr_scene_buffer *buffer, double *sx, double *sy) - return true; - } - -+Buffer * -+bufclient(Client *c) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ if (c->pool[i]->busy) -+ continue; -+ buf = c->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (int)(c->geom.width * c->tbar_scale * 4 * (c->tbar_height + 2*tbar_borderpx))); -+ buf->image = drwl_image_create(NULL, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx); -+ c->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(c->drw, buf->image); -+ return buf; -+} -+ - void - bufdestroy(struct wlr_buffer *wlr_buffer) - { -@@ -827,6 +873,21 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ Client *c; -+ unsigned int i; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!c->tbar_enabled) -+ continue; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; -@@ -1230,6 +1291,10 @@ createnotify(struct wl_listener *listener, void *data) - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -1579,6 +1644,166 @@ drawbars(void) - drawbar(m); - } - -+void -+drawtbars(Monitor *m, int floating, int clients_changed) -+{ -+ unsigned int tbar_type, tbar_only_top, len = 0; -+ int nodraw = 0, ismonocle; -+ Client *c, *sel = NULL, *sel_in_layout = NULL; -+ -+ if (!m) -+ return; -+ -+ tbar_type = floating ? floating_tbar_type : m->lt[m->sellt]->tbar_type; -+ tbar_only_top = floating ? floating_tbar_only_top : m->lt[m->sellt]->tbar_only_top; -+ ismonocle = m->lt[m->sellt]->arrange == monocle; -+ -+ if (!clients_changed && !floating && ismonocle && (sel = focustop_onlytiled(m, 1))) { -+ wlr_scene_node_raise_to_top(&sel->scene->node); -+ if (sel->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel->tbar_buffer->node); -+ return; -+ } -+ -+ if (tbar_type == TBarNone) -+ nodraw = 2; -+ -+ if (!nodraw) { -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m)) -+ continue; -+ if (!sel && (!tbar_float_sel_sep || c->isfloating == floating)) -+ sel = c; -+ if (!sel_in_layout && c->isfloating == floating) -+ sel_in_layout = c; -+ if (c->isfloating == floating && !c->isfullscreen) -+ len++; -+ } -+ -+ if (len == 0) -+ return; -+ } -+ -+ if (tbar_type == TBarMultiple && len <= 1) -+ nodraw = 2; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating != floating) -+ continue; -+ if (c->tbar_buffer && c->tbar_enabled && (nodraw == 2 || c->isfullscreen)) { -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 0); -+ c->tbar_enabled = 0; -+ if (m->lt[m->sellt]->arrange != tile) -+ resize(c, c->geom, 0); -+ } -+ if (!nodraw && !c->isfullscreen) { -+ drawtbar(c, tbar_type, len, ismonocle ? c : sel_in_layout, sel_in_layout); -+ if (!ismonocle && tbar_only_top) -+ nodraw = 1; -+ } -+ if (c == sel_in_layout) { -+ wlr_scene_node_raise_to_top(&sel_in_layout->scene->node); -+ if (sel_in_layout->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel_in_layout->tbar_buffer->node); -+ } -+ } -+ -+ if (m->lt[m->sellt]->arrange == tile) -+ m->lt[m->sellt]->arrange(m); -+} -+ -+void -+drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout) -+{ -+ Buffer *buf; -+ float width = c->geom.width * c->tbar_scale; -+ unsigned int i, scheme; -+ Client *l; -+ uint32_t tbar_border_colors[][3] = { -+ [SchemeNorm] = { [ColBg] = tbar_colors[SchemeNorm][2] }, -+ [SchemeSel] = { [ColBg] = tbar_colors[SchemeSel][2] }, -+ [SchemeUrg] = { [ColBg] = tbar_colors[SchemeUrg][2] } -+ }; -+ -+ if (!c->tbar_buffer) -+ c->tbar_buffer = wlr_scene_buffer_create(c->scene, NULL); -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ wlr_buffer_drop(&c->pool[i]->base); -+ c->pool[i] = NULL; -+ } -+ } -+ drwl_setimage(c->drw, NULL); -+ -+ if (!(buf = bufclient(c))) -+ return; -+ -+ switch (tbar_type) { -+ case TBarLabel: -+ scheme = c->isurgent ? SchemeUrg : (c == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, 0, 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, c->tbar_height + tbar_borderpx, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ drwl_rect(c->drw, (unsigned int)width - tbar_borderpx, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - 2*tbar_borderpx, c->tbar_height, -+ tbar_padding, client_get_title(c), 0); -+ -+ break; -+ -+ case TBarMultiple: -+ case TBarAlways: -+ width /= len; -+ i = 0; -+ -+ wl_list_for_each(l, &clients, link) { -+ if (!VISIBLEON(l, c->mon) || l->isfullscreen || l->isfloating != c->isfloating) -+ continue; -+ -+ scheme = l->isurgent ? SchemeUrg : (l == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, (unsigned int)(width*i), 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), c->tbar_height + tbar_borderpx, -+ (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ if (i == len-1) -+ drwl_rect(c->drw, (unsigned int)(width*(i+1)) - tbar_borderpx, tbar_borderpx, -+ tbar_borderpx, c->tbar_height + 2*tbar_borderpx, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, (unsigned int)(width*i) + tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - (i == len-1 ? 2*tbar_borderpx : tbar_borderpx), -+ c->tbar_height, tbar_padding, client_get_title(l), 0); -+ -+ i += 1; -+ } -+ -+ break; -+ } -+ -+ c->tbar_enabled = 1; -+ if (!c->resize_tbar_enabled) -+ resize(c, c->geom, 0); -+ -+ wlr_scene_buffer_set_dest_size(c->tbar_buffer, c->geom.width, -+ c->tbar_real_height + 2*tbar_borderpx); -+ wlr_scene_node_set_position(&c->tbar_buffer->node, 0, tbar_top ? 0 -+ : (c->geom.height - c->tbar_real_height - 2*tbar_borderpx)); -+ wlr_scene_buffer_set_buffer(c->tbar_buffer, &buf->base); -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 1); -+ wlr_buffer_unlock(&buf->base); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1635,6 +1860,12 @@ focusclient(Client *c, int lift) - client_activate_surface(old, 0); - } - } -+ -+ if (c && c->mon) -+ drawtbars(c->mon, c->isfloating, 0); -+ if (c && old_c && old_c->mon && (old_c->mon != c->mon || old_c->isfloating != c->isfloating)) -+ drawtbars(old_c->mon, old_c->isfloating, 0); -+ - drawbars(); - - if (!c) { -@@ -1705,6 +1936,20 @@ focustop(Monitor *m) - return NULL; - } - -+Client * -+focustop_onlytiled(Monitor *m, int onlytiled) -+{ -+ Client *c; -+ wl_list_for_each(c, &fstack, flink) { -+ if (VISIBLEON(c, m)) { -+ if ((onlytiled == 1 && c->isfloating) || (onlytiled == 2 && !c->isfloating && m->lt[m->sellt]->arrange)) -+ continue; -+ return c; -+ } -+ } -+ return NULL; -+} -+ - void - fullscreennotify(struct wl_listener *listener, void *data) - { -@@ -1764,6 +2009,7 @@ incnmaster(const Arg *arg) - return; - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -1932,6 +2178,7 @@ mapnotify(struct wl_listener *listener, void *data) - Client *w, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; -+ char fontattrs[12]; - - /* Create scene tree for this client and its border */ - c->scene = client_surface(c)->data = wlr_scene_tree_create(layers[LyrTile]); -@@ -1988,6 +2235,20 @@ unset_fullscreen: - if (w != c && w != p && w->isfullscreen && m == w->mon && (w->tags & c->tags)) - setfullscreen(w, 0); - } -+ -+ if (!(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ c->tbar_scale = tbar_scale > 0 ? tbar_scale : m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ c->tbar_real_height = (int)((float)c->tbar_height / c->tbar_scale); -+ } -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2012,18 +2273,28 @@ void - monocle(Monitor *m) - { - Client *c; -- int n = 0; -+ int n = 0, old_tbar_enabled; - - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- resize(c, m->w, 0); -+ if (!n) -+ wlr_scene_node_raise_to_top(&c->scene->node); - n++; -+ if (n > 1) -+ break; -+ } -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ old_tbar_enabled = c->tbar_enabled; -+ c->tbar_enabled = m->lt[m->sellt]->tbar_type != TBarNone -+ && m->lt[m->sellt]->tbar_type == TBarMultiple ? n > 1 : 1; -+ resize(c, m->w, 0); -+ c->tbar_enabled = old_tbar_enabled; - } - if (n) - snprintf(m->ltsymbol, LENGTH(m->ltsymbol), "[%d]", n); -- if ((c = focustop(m))) -- wlr_scene_node_raise_to_top(&c->scene->node); - } - - void -@@ -2384,32 +2655,37 @@ resize(Client *c, struct wlr_box geo, int interact) - { - struct wlr_box *bbox; - struct wlr_box clip; -+ unsigned int th; - - if (!c->mon || !client_surface(c)->mapped) - return; - - bbox = interact ? &sgeom : &c->mon->w; - -+ th = c->tbar_enabled ? (unsigned int)(c->tbar_real_height + 2*tbar_borderpx) : c->bw; -+ - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); -- wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); -- wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[1], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - 2 * c->bw); -- wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - 2 * c->bw); -+ wlr_scene_node_set_position(&c->scene_surface->node, c->bw, tbar_top ? th : c->bw); -+ wlr_scene_rect_set_size(c->border[0], c->geom.width, (c->tbar_enabled && tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[1], c->geom.width, (c->tbar_enabled && !tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - th - c->bw); -+ wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - th - c->bw); - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); -- wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); -- wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_node_set_position(&c->border[2]->node, 0, tbar_top ? th : c->bw); -+ wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, tbar_top ? th : c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -- c->geom.height - 2 * c->bw); -+ c->geom.height - th - c->bw); - client_get_clip(c, &clip); - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); -+ -+ c->resize_tbar_enabled = c->tbar_enabled; - } - - void -@@ -2505,6 +2781,8 @@ setfloating(Client *c, int floating) - : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); - drawbars(); -+ drawtbars(c->mon, 0, 1); -+ drawtbars(c->mon, 1, 1); - } - - void -@@ -2528,6 +2806,7 @@ setfullscreen(Client *c, int fullscreen) - } - arrange(c->mon); - drawbars(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2553,6 +2832,7 @@ setlayout(const Arg *arg) - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); - drawbar(selmon); -+ drawtbars(selmon, 0, 1); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2568,6 +2848,7 @@ setmfact(const Arg *arg) - return; - selmon->mfact = f; - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -2898,14 +3179,22 @@ tag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - drawbars(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void - tagmon(const Arg *arg) - { - Client *sel = focustop(selmon); -- if (sel) -+ Monitor *old_mon = selmon; -+ if (sel) { - setmon(sel, dirtomon(arg->i), 0); -+ if (selmon) -+ drawtbars(selmon, sel->isfloating, 1); -+ if (old_mon && selmon != old_mon) -+ drawtbars(old_mon, sel->isfloating, 1); -+ } - } - - void -@@ -2979,6 +3268,8 @@ toggletag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - drawbars(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -2992,6 +3283,8 @@ toggleview(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - drawbars(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -3022,6 +3315,9 @@ unmapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is unmapped, and should no longer be shown. */ - Client *c = wl_container_of(listener, c, unmap); -+ Monitor *m = c->mon; -+ unsigned int i; -+ - if (c == grabc) { - cursor_mode = CurNormal; - grabc = NULL; -@@ -3038,6 +3334,20 @@ unmapnotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->flink); - } - -+ if (m && !c->isfloating && m->lt[m->sellt]->arrange == monocle) -+ drawtbars(m, c->isfloating, 1); -+ -+ if (c->tbar_enabled) { -+ for (i = 0; i < LENGTH(c->pool); i++) -+ if (c->pool[i]) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } -+ - wlr_scene_node_destroy(&c->scene->node); - drawbars(); - motionnotify(0, NULL, 0, 0, 0, 0); -@@ -3058,9 +3368,12 @@ updatemons(struct wl_listener *listener, void *data) - Client *c; - struct wlr_output_configuration_head_v1 *config_head; - Monitor *m; -+ char fontattrs[12]; - - /* First remove from the layout the disabled monitors */ - wl_list_for_each(m, &mons, link) { -+ if (m->asleep) -+ continue; - if (m->wlr_output->enabled || m->asleep) - continue; - config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); -@@ -3124,6 +3437,23 @@ updatemons(struct wl_listener *listener, void *data) - if (!selmon) { - selmon = m; - } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || (c->drw && (tbar_scale > 0 || c->tbar_scale == m->wlr_output->scale))) -+ continue; -+ if (!c->drw && !(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ drwl_font_destroy(c->drw->font); -+ c->tbar_scale = m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ } -+ } - } - - if (selmon && selmon->wlr_output->enabled) { -@@ -3195,6 +3525,7 @@ updatetitle(struct wl_listener *listener, void *data) - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) - drawbars(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -3208,6 +3539,7 @@ urgent(struct wl_listener *listener, void *data) - - c->isurgent = 1; - drawbars(); -+ drawtbars(c->mon, 1, 1); - - if (client_surface(c)->mapped) - client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); -@@ -3322,8 +3654,10 @@ zoom(const Arg *arg) - wl_list_remove(&sel->link); - wl_list_insert(&clients, &sel->link); - -+ drawtbars(selmon, 0, 1); - focusclient(sel, 1); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - #ifdef XWAYLAND -@@ -3375,6 +3709,10 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); --- -2.47.0 - diff --git a/dwl-bak/dwl-patches/patches/tab/tab-0.7.patch b/dwl-bak/dwl-patches/patches/tab/tab-0.7.patch deleted file mode 100644 index b7edd4f..0000000 --- a/dwl-bak/dwl-patches/patches/tab/tab-0.7.patch +++ /dev/null @@ -1,1252 +0,0 @@ -From 419fa4d6212806d9e4a3439568f8a103a57de912 Mon Sep 17 00:00:00 2001 -From: dev-gm -Date: Sat, 16 Nov 2024 23:19:42 -0500 -Subject: [PATCH] Add tab support - ---- - Makefile | 2 +- - config.def.h | 37 ++++- - drwl.h | 320 ++++++++++++++++++++++++++++++++++++ - dwl.c | 449 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 4 files changed, 777 insertions(+), 31 deletions(-) - create mode 100644 drwl.h - -diff --git a/Makefile b/Makefile -index 3358bae..9bc67db 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wlroots-0.18 wayland-server xkbcommon libinput $(XLIBS) -+PKGS = wlroots-0.18 wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - -diff --git a/config.def.h b/config.def.h -index 22d2171..9d33d89 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,13 +7,31 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static const char *tbar_fonts[] = {"monospace:size=10"}; -+static const int tbar_top = 0; -+static const int tbar_height = -1; -+static const int tbar_borderpx = 1; -+static const int tbar_padding = 10; -+static const float tbar_scale = -1; /* -1 means use monitor scale */ -+static const int tbar_float_sel_sep = 0; /* should tbar be highlighted only on the currently selected window or on both the last selected floating window and the laste selected tiling window */ -+static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ - -+static uint32_t colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, -+ [SchemeUrg] = { 0, 0, 0x770000ff }, -+}; -+ -+static uint32_t tbar_colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x555555ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x555555ff }, -+ [SchemeUrg] = { 0xc7c7c7ff, 0x222222ff, 0x770000ff }, -+}; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -28,12 +46,15 @@ static const Rule rules[] = { - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ - }; - -+static const unsigned int floating_tbar_type = TBarLabel; -+static const int floating_tbar_only_top = 0; -+ - /* layout(s) */ - static const Layout layouts[] = { -- /* symbol arrange function */ -- { "[]=", tile }, -- { "><>", NULL }, /* no layout function means floating behavior */ -- { "[M]", monocle }, -+ /* symbol tbar type tbar only on top arrange function */ -+ { "[]=", TBarLabel, 0, tile }, -+ { "><>", TBarLabel, 0, NULL }, /* no layout function means floating behavior */ -+ { "[M]", TBarMultiple, 1, monocle }, - }; - - /* monitors */ -diff --git a/drwl.h b/drwl.h -new file mode 100644 -index 0000000..02eb8e9 ---- /dev/null -+++ b/drwl.h -@@ -0,0 +1,320 @@ -+/* -+ * drwl - https://codeberg.org/sewn/drwl -+ * -+ * Copyright (c) 2023-2024 sewn -+ * Copyright (c) 2024 notchoc -+ * -+ * 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. -+ * -+ * The UTF-8 Decoder included is from Bjoern Hoehrmann: -+ * Copyright (c) 2008-2010 Bjoern Hoehrmann -+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. -+ */ -+#pragma once -+ -+#include -+#include -+#include -+ -+enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ -+ -+typedef struct fcft_font Fnt; -+typedef pixman_image_t Img; -+ -+typedef struct { -+ Img *image; -+ Fnt *font; -+ uint32_t *scheme; -+} Drwl; -+ -+#define UTF8_ACCEPT 0 -+#define UTF8_REJECT 12 -+#define UTF8_INVALID 0xFFFD -+ -+static const uint8_t utf8d[] = { -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, -+ -+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, -+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, -+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, -+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, -+ 12,36,12,12,12,12,12,12,12,12,12,12, -+}; -+ -+static inline uint32_t -+utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -+{ -+ uint32_t type = utf8d[byte]; -+ -+ *codep = (*state != UTF8_ACCEPT) ? -+ (byte & 0x3fu) | (*codep << 6) : -+ (0xff >> type) & (byte); -+ -+ *state = utf8d[256 + *state + type]; -+ return *state; -+} -+ -+static int -+drwl_init(void) -+{ -+ fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); -+ return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -+} -+ -+static Drwl * -+drwl_create(void) -+{ -+ Drwl *drwl; -+ -+ if (!(drwl = calloc(1, sizeof(Drwl)))) -+ return NULL; -+ -+ return drwl; -+} -+ -+static void -+drwl_setfont(Drwl *drwl, Fnt *font) -+{ -+ if (drwl) -+ drwl->font = font; -+} -+ -+static void -+drwl_setimage(Drwl *drwl, Img *image) -+{ -+ if (drwl) -+ drwl->image = image; -+} -+ -+static Fnt * -+drwl_font_create(Drwl *drwl, size_t count, -+ const char *names[static count], const char *attributes) -+{ -+ Fnt *font = fcft_from_name(count, names, attributes); -+ if (drwl) -+ drwl_setfont(drwl, font); -+ return font; -+} -+ -+static void -+drwl_font_destroy(Fnt *font) -+{ -+ fcft_destroy(font); -+} -+ -+static inline pixman_color_t -+convert_color(uint32_t clr) -+{ -+ return (pixman_color_t){ -+ ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ (clr & 0xFF) * 0x101 -+ }; -+} -+ -+static void -+drwl_setscheme(Drwl *drwl, uint32_t *scm) -+{ -+ if (drwl) -+ drwl->scheme = scm; -+} -+ -+static Img * -+drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -+{ -+ Img *image; -+ pixman_region32_t clip; -+ -+ image = pixman_image_create_bits_no_clear( -+ PIXMAN_a8r8g8b8, w, h, bits, w * 4); -+ if (!image) -+ return NULL; -+ pixman_region32_init_rect(&clip, 0, 0, w, h); -+ pixman_image_set_clip_region32(image, &clip); -+ pixman_region32_fini(&clip); -+ -+ if (drwl) -+ drwl_setimage(drwl, image); -+ return image; -+} -+ -+static void -+drwl_rect(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ int filled, int invert) -+{ -+ pixman_color_t clr; -+ if (!drwl || !drwl->scheme || !drwl->image) -+ return; -+ -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ if (filled) -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, -+ &(pixman_rectangle16_t){x, y, w, h}); -+ else -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, -+ (pixman_rectangle16_t[4]){ -+ { x, y, w, 1 }, -+ { x, y + h - 1, w, 1 }, -+ { x, y, 1, h }, -+ { x + w - 1, y, 1, h }}); -+} -+ -+static int -+drwl_text(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ unsigned int lpad, const char *text, int invert) -+{ -+ int ty; -+ int render = x || y || w || h; -+ long x_kern; -+ uint32_t cp = 0, last_cp = 0, state; -+ pixman_color_t clr; -+ pixman_image_t *fg_pix = NULL; -+ int noellipsis = 0; -+ const struct fcft_glyph *glyph, *eg = NULL; -+ int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; -+ -+ if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) -+ return 0; -+ -+ if (!render) { -+ w = invert ? invert : ~invert; -+ } else { -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ fg_pix = pixman_image_create_solid_fill(&clr); -+ -+ drwl_rect(drwl, x, y, w, h, 1, !invert); -+ -+ x += lpad; -+ w -= lpad; -+ } -+ -+ if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) -+ fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; -+ -+ if (render) -+ eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); -+ -+ for (const char *p = text, *pp; pp = p, *p; p++) { -+ for (state = UTF8_ACCEPT; *p && -+ utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) -+ ; -+ if (!*p || state == UTF8_REJECT) { -+ cp = UTF8_INVALID; -+ if (p > pp) -+ p--; -+ } -+ -+ glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); -+ if (!glyph) -+ continue; -+ -+ x_kern = 0; -+ if (last_cp) -+ fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); -+ last_cp = cp; -+ -+ ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; -+ -+ if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && -+ *(p + 1) != '\0') { -+ /* cannot fit ellipsis after current codepoint */ -+ if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { -+ noellipsis = 1; -+ } else { -+ w -= eg->advance.x; -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, -+ x + eg->x, ty - eg->y, eg->width, eg->height); -+ } -+ } -+ -+ if ((x_kern + glyph->advance.x) > w) -+ break; -+ -+ x += x_kern; -+ -+ if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) -+ /* pre-rendered glyphs (eg. emoji) */ -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ else if (render) -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ -+ x += glyph->advance.x; -+ w -= glyph->advance.x; -+ } -+ -+ if (render) -+ pixman_image_unref(fg_pix); -+ -+ return x + (render ? w : 0); -+} -+ -+static unsigned int -+drwl_font_getwidth(Drwl *drwl, const char *text) -+{ -+ if (!drwl || !drwl->font || !text) -+ return 0; -+ return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -+} -+ -+static unsigned int -+drwl_font_getwidth_clamp(Drwl *drwl, const char *text, unsigned int n) -+{ -+ unsigned int tmp = 0; -+ if (drwl && drwl->font && text && n) -+ tmp = drwl_text(drwl, 0, 0, 0, 0, 0, text, n); -+ return tmp < n ? tmp : n; -+} -+ -+static void -+drwl_image_destroy(Img *image) -+{ -+ pixman_image_unref(image); -+} -+ -+static void -+drwl_destroy(Drwl *drwl) -+{ -+ if (drwl->font) -+ drwl_font_destroy(drwl->font); -+ if (drwl->image) -+ drwl_image_destroy(drwl->image); -+ free(drwl); -+} -+ -+static void -+drwl_fini(void) -+{ -+ fcft_fini(); -+} -diff --git a/dwl.c b/dwl.c -index def2562..893b1f1 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -12,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -58,6 +60,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -68,6 +71,7 @@ - #endif - - #include "util.h" -+#include "drwl.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -81,9 +85,11 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ -+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { TBarNone, TBarLabel, TBarMultiple, TBarAlways }; /* tbar types */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -103,6 +109,14 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -112,6 +126,11 @@ typedef struct { - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ - struct wlr_scene_tree *scene_surface; -+ struct wlr_scene_buffer *tbar_buffer; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int tbar_height, tbar_real_height; -+ float tbar_scale; - struct wl_list link; - struct wl_list flink; - union { -@@ -139,7 +158,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, tbar_enabled, resize_tbar_enabled; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -183,6 +202,8 @@ typedef struct { - - typedef struct { - const char *symbol; -+ unsigned int tbar_type; /* type of tbar */ -+ int tbar_only_top; - void (*arrange)(Monitor *); - } Layout; - -@@ -250,6 +271,12 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static Buffer *bufclient(Client *c); -+static void bufdestroy(struct wlr_buffer *wlr_buffer); -+static bool bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride); -+static void bufdataend(struct wlr_buffer *wlr_buffer); -+static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -285,10 +312,13 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawtbars(Monitor *m, int floating, int clients_changed); -+static void drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); -+static Client *focustop_onlytiled(Monitor *m, int onlytiled); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -413,6 +443,12 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static const struct wlr_buffer_impl buffer_impl = { -+ .destroy = bufdestroy, -+ .begin_data_ptr_access = bufdatabegin, -+ .end_data_ptr_access = bufdataend, -+}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -485,14 +521,16 @@ void - arrange(Monitor *m) - { - Client *c; -+ int enabled; - - if (!m->wlr_output->enabled) - return; - - wl_list_for_each(c, &clients, link) { - if (c->mon == m) { -- wlr_scene_node_set_enabled(&c->scene->node, VISIBLEON(c, m)); -- client_set_suspended(c, !VISIBLEON(c, m)); -+ enabled = VISIBLEON(c, m); -+ wlr_scene_node_set_enabled(&c->scene->node, enabled); -+ client_set_suspended(c, !enabled); - } - } - -@@ -517,6 +555,7 @@ arrange(Monitor *m) - - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -+ - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } -@@ -595,6 +634,74 @@ axisnotify(struct wl_listener *listener, void *data) - event->delta_discrete, event->source, event->relative_direction); - } - -+Buffer * -+bufclient(Client *c) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ if (c->pool[i]->busy) -+ continue; -+ buf = c->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (int)(c->geom.width * c->tbar_scale * 4 * (c->tbar_height + 2*tbar_borderpx))); -+ buf->image = drwl_image_create(NULL, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx); -+ c->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(c->drw, buf->image); -+ return buf; -+} -+ -+void -+bufdestroy(struct wlr_buffer *wlr_buffer) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ if (buf->busy) -+ wl_list_remove(&buf->release.link); -+ drwl_image_destroy(buf->image); -+ free(buf); -+} -+ -+bool -+bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ -+ if (flags & WLR_BUFFER_DATA_PTR_ACCESS_WRITE) return false; -+ -+ *data = buf->data; -+ *stride = wlr_buffer->width * 4; -+ *format = DRM_FORMAT_ARGB8888; -+ -+ return true; -+} -+ -+void -+bufdataend(struct wlr_buffer *wlr_buffer) -+{ -+} -+ -+void -+bufrelease(struct wl_listener *listener, void *data) -+{ -+ Buffer *buf = wl_container_of(listener, buf, release); -+ buf->busy = false; -+ wl_list_remove(&buf->release.link); -+} -+ - void - buttonpress(struct wl_listener *listener, void *data) - { -@@ -676,6 +783,21 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ Client *c; -+ unsigned int i; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!c->tbar_enabled) -+ continue; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; -@@ -697,6 +819,8 @@ cleanup(void) - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -+ -+ drwl_fini(); - } - - void -@@ -1063,6 +1187,10 @@ createnotify(struct wl_listener *listener, void *data) - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -1338,6 +1466,166 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+drawtbars(Monitor *m, int floating, int clients_changed) -+{ -+ unsigned int tbar_type, tbar_only_top, len = 0; -+ int nodraw = 0, ismonocle; -+ Client *c, *sel = NULL, *sel_in_layout = NULL; -+ -+ if (!m) -+ return; -+ -+ tbar_type = floating ? floating_tbar_type : m->lt[m->sellt]->tbar_type; -+ tbar_only_top = floating ? floating_tbar_only_top : m->lt[m->sellt]->tbar_only_top; -+ ismonocle = m->lt[m->sellt]->arrange == monocle; -+ -+ if (!clients_changed && !floating && ismonocle && (sel = focustop_onlytiled(m, 1))) { -+ wlr_scene_node_raise_to_top(&sel->scene->node); -+ if (sel->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel->tbar_buffer->node); -+ return; -+ } -+ -+ if (tbar_type == TBarNone) -+ nodraw = 2; -+ -+ if (!nodraw) { -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m)) -+ continue; -+ if (!sel && (!tbar_float_sel_sep || c->isfloating == floating)) -+ sel = c; -+ if (!sel_in_layout && c->isfloating == floating) -+ sel_in_layout = c; -+ if (c->isfloating == floating && !c->isfullscreen) -+ len++; -+ } -+ -+ if (len == 0) -+ return; -+ } -+ -+ if (tbar_type == TBarMultiple && len <= 1) -+ nodraw = 2; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating != floating) -+ continue; -+ if (c->tbar_buffer && c->tbar_enabled && (nodraw == 2 || c->isfullscreen)) { -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 0); -+ c->tbar_enabled = 0; -+ if (m->lt[m->sellt]->arrange != tile) -+ resize(c, c->geom, 0); -+ } -+ if (!nodraw && !c->isfullscreen) { -+ drawtbar(c, tbar_type, len, ismonocle ? c : sel_in_layout, sel_in_layout); -+ if (!ismonocle && tbar_only_top) -+ nodraw = 1; -+ } -+ if (c == sel_in_layout) { -+ wlr_scene_node_raise_to_top(&sel_in_layout->scene->node); -+ if (sel_in_layout->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel_in_layout->tbar_buffer->node); -+ } -+ } -+ -+ if (m->lt[m->sellt]->arrange == tile) -+ m->lt[m->sellt]->arrange(m); -+} -+ -+void -+drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout) -+{ -+ Buffer *buf; -+ float width = c->geom.width * c->tbar_scale; -+ unsigned int i, scheme; -+ Client *l; -+ uint32_t tbar_border_colors[][3] = { -+ [SchemeNorm] = { [ColBg] = tbar_colors[SchemeNorm][2] }, -+ [SchemeSel] = { [ColBg] = tbar_colors[SchemeSel][2] }, -+ [SchemeUrg] = { [ColBg] = tbar_colors[SchemeUrg][2] } -+ }; -+ -+ if (!c->tbar_buffer) -+ c->tbar_buffer = wlr_scene_buffer_create(c->scene, NULL); -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ wlr_buffer_drop(&c->pool[i]->base); -+ c->pool[i] = NULL; -+ } -+ } -+ drwl_setimage(c->drw, NULL); -+ -+ if (!(buf = bufclient(c))) -+ return; -+ -+ switch (tbar_type) { -+ case TBarLabel: -+ scheme = c->isurgent ? SchemeUrg : (c == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, 0, 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, c->tbar_height + tbar_borderpx, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ drwl_rect(c->drw, (unsigned int)width - tbar_borderpx, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - 2*tbar_borderpx, c->tbar_height, -+ tbar_padding, client_get_title(c), 0); -+ -+ break; -+ -+ case TBarMultiple: -+ case TBarAlways: -+ width /= len; -+ i = 0; -+ -+ wl_list_for_each(l, &clients, link) { -+ if (!VISIBLEON(l, c->mon) || l->isfullscreen || l->isfloating != c->isfloating) -+ continue; -+ -+ scheme = l->isurgent ? SchemeUrg : (l == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, (unsigned int)(width*i), 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), c->tbar_height + tbar_borderpx, -+ (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ if (i == len-1) -+ drwl_rect(c->drw, (unsigned int)(width*(i+1)) - tbar_borderpx, tbar_borderpx, -+ tbar_borderpx, c->tbar_height + 2*tbar_borderpx, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, (unsigned int)(width*i) + tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - (i == len-1 ? 2*tbar_borderpx : tbar_borderpx), -+ c->tbar_height, tbar_padding, client_get_title(l), 0); -+ -+ i += 1; -+ } -+ -+ break; -+ } -+ -+ c->tbar_enabled = 1; -+ if (!c->resize_tbar_enabled) -+ resize(c, c->geom, 0); -+ -+ wlr_scene_buffer_set_dest_size(c->tbar_buffer, c->geom.width, -+ c->tbar_real_height + 2*tbar_borderpx); -+ wlr_scene_node_set_position(&c->tbar_buffer->node, 0, tbar_top ? 0 -+ : (c->geom.height - c->tbar_real_height - 2*tbar_borderpx)); -+ wlr_scene_buffer_set_buffer(c->tbar_buffer, &buf->base); -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 1); -+ wlr_buffer_unlock(&buf->base); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1373,13 +1661,13 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeSel][ColBorder])); - } - - /* Deactivate old client if focus is changing */ - if (old && (!c || client_surface(c) != old)) { - /* If an overlay is focused, don't focus or activate the client, -- * but only update its position in fstack to render its border with focuscolor -+ * but only update its position in fstack to render its border with its color - * and focus it after the overlay is closed. */ - if (old_client_type == LayerShell && wlr_scene_node_coords( - &old_l->scene->node, &unused_lx, &unused_ly) -@@ -1390,11 +1678,18 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -+ client_set_border_color(old_c, (float[])COLOR(colors[SchemeNorm][ColBorder])); - - client_activate_surface(old, 0); - } - } -+ -+ if (c && c->mon) -+ drawtbars(c->mon, c->isfloating, 0); -+ if (c && old_c && old_c->mon && (old_c->mon != c->mon || old_c->isfloating != c->isfloating)) -+ drawtbars(old_c->mon, old_c->isfloating, 0); -+ -+ - printstatus(); - - if (!c) { -@@ -1465,6 +1760,20 @@ focustop(Monitor *m) - return NULL; - } - -+Client * -+focustop_onlytiled(Monitor *m, int onlytiled) -+{ -+ Client *c; -+ wl_list_for_each(c, &fstack, flink) { -+ if (VISIBLEON(c, m)) { -+ if ((onlytiled == 1 && c->isfloating) || (onlytiled == 2 && !c->isfloating && m->lt[m->sellt]->arrange)) -+ continue; -+ return c; -+ } -+ } -+ return NULL; -+} -+ - void - fullscreennotify(struct wl_listener *listener, void *data) - { -@@ -1524,6 +1833,7 @@ incnmaster(const Arg *arg) - return; - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -1692,6 +2002,7 @@ mapnotify(struct wl_listener *listener, void *data) - Client *w, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; -+ char fontattrs[12]; - - /* Create scene tree for this client and its border */ - c->scene = client_surface(c)->data = wlr_scene_tree_create(layers[LyrTile]); -@@ -1717,7 +2028,7 @@ mapnotify(struct wl_listener *listener, void *data) - - for (i = 0; i < 4; i++) { - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, -- c->isurgent ? urgentcolor : bordercolor); -+ (float[])COLOR(colors[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder])); - c->border[i]->node.data = c; - } - -@@ -1740,6 +2051,7 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -+ - printstatus(); - - unset_fullscreen: -@@ -1748,6 +2060,20 @@ unset_fullscreen: - if (w != c && w != p && w->isfullscreen && m == w->mon && (w->tags & c->tags)) - setfullscreen(w, 0); - } -+ -+ if (!(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ c->tbar_scale = tbar_scale > 0 ? tbar_scale : m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ c->tbar_real_height = (int)((float)c->tbar_height / c->tbar_scale); -+ } -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -1772,18 +2098,28 @@ void - monocle(Monitor *m) - { - Client *c; -- int n = 0; -+ int n = 0, old_tbar_enabled; - - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- resize(c, m->w, 0); -+ if (!n) -+ wlr_scene_node_raise_to_top(&c->scene->node); - n++; -+ if (n > 1) -+ break; -+ } -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ old_tbar_enabled = c->tbar_enabled; -+ c->tbar_enabled = m->lt[m->sellt]->tbar_type != TBarNone -+ && m->lt[m->sellt]->tbar_type == TBarMultiple ? n > 1 : 1; -+ resize(c, m->w, 0); -+ c->tbar_enabled = old_tbar_enabled; - } - if (n) - snprintf(m->ltsymbol, LENGTH(m->ltsymbol), "[%d]", n); -- if ((c = focustop(m))) -- wlr_scene_node_raise_to_top(&c->scene->node); - } - - void -@@ -2184,32 +2520,37 @@ resize(Client *c, struct wlr_box geo, int interact) - { - struct wlr_box *bbox; - struct wlr_box clip; -+ unsigned int th; - - if (!c->mon || !client_surface(c)->mapped) - return; - - bbox = interact ? &sgeom : &c->mon->w; - -+ th = c->tbar_enabled ? (unsigned int)(c->tbar_real_height + 2*tbar_borderpx) : c->bw; -+ - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); -- wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); -- wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[1], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - 2 * c->bw); -- wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - 2 * c->bw); -+ wlr_scene_node_set_position(&c->scene_surface->node, c->bw, tbar_top ? th : c->bw); -+ wlr_scene_rect_set_size(c->border[0], c->geom.width, (c->tbar_enabled && tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[1], c->geom.width, (c->tbar_enabled && !tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - th - c->bw); -+ wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - th - c->bw); - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); -- wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); -- wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_node_set_position(&c->border[2]->node, 0, tbar_top ? th : c->bw); -+ wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, tbar_top ? th : c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -- c->geom.height - 2 * c->bw); -+ c->geom.height - th - c->bw); - client_get_clip(c, &clip); - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); -+ -+ c->resize_tbar_enabled = c->tbar_enabled; - } - - void -@@ -2318,6 +2659,8 @@ setfloating(Client *c, int floating) - : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); - printstatus(); -+ drawtbars(c->mon, 0, 1); -+ drawtbars(c->mon, 1, 1); - } - - void -@@ -2341,6 +2684,7 @@ setfullscreen(Client *c, int fullscreen) - } - arrange(c->mon); - printstatus(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2366,6 +2710,7 @@ setlayout(const Arg *arg) - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2381,6 +2726,7 @@ setmfact(const Arg *arg) - return; - selmon->mfact = f; - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -2627,6 +2973,8 @@ setup(void) - LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply); - LISTEN_STATIC(&output_mgr->events.test, outputmgrtest); - -+ drwl_init(); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2680,14 +3028,22 @@ tag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void - tagmon(const Arg *arg) - { - Client *sel = focustop(selmon); -- if (sel) -+ Monitor *old_mon = selmon; -+ if (sel) { - setmon(sel, dirtomon(arg->i), 0); -+ if (selmon) -+ drawtbars(selmon, sel->isfloating, 1); -+ if (old_mon && selmon != old_mon) -+ drawtbars(old_mon, sel->isfloating, 1); -+ } - } - - void -@@ -2753,6 +3109,8 @@ toggletag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -2766,6 +3124,8 @@ toggleview(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -2796,6 +3156,9 @@ unmapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is unmapped, and should no longer be shown. */ - Client *c = wl_container_of(listener, c, unmap); -+ Monitor *m = c->mon; -+ unsigned int i; -+ - if (c == grabc) { - cursor_mode = CurNormal; - grabc = NULL; -@@ -2812,6 +3175,20 @@ unmapnotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->flink); - } - -+ if (m && !c->isfloating && m->lt[m->sellt]->arrange == monocle) -+ drawtbars(m, c->isfloating, 1); -+ -+ if (c->tbar_enabled) { -+ for (i = 0; i < LENGTH(c->pool); i++) -+ if (c->pool[i]) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } -+ - wlr_scene_node_destroy(&c->scene->node); - printstatus(); - motionnotify(0, NULL, 0, 0, 0, 0); -@@ -2832,9 +3209,12 @@ updatemons(struct wl_listener *listener, void *data) - Client *c; - struct wlr_output_configuration_head_v1 *config_head; - Monitor *m; -+ char fontattrs[12]; - - /* First remove from the layout the disabled monitors */ - wl_list_for_each(m, &mons, link) { -+ if (m->asleep) -+ continue; - if (m->wlr_output->enabled || m->asleep) - continue; - config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); -@@ -2898,6 +3278,23 @@ updatemons(struct wl_listener *listener, void *data) - if (!selmon) { - selmon = m; - } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || (c->drw && (tbar_scale > 0 || c->tbar_scale == m->wlr_output->scale))) -+ continue; -+ if (!c->drw && !(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ drwl_font_destroy(c->drw->font); -+ c->tbar_scale = m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ } -+ } - } - - if (selmon && selmon->wlr_output->enabled) { -@@ -2929,6 +3326,7 @@ updatetitle(struct wl_listener *listener, void *data) - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) - printstatus(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2942,9 +3340,10 @@ urgent(struct wl_listener *listener, void *data) - - c->isurgent = 1; - printstatus(); -+ drawtbars(c->mon, 1, 1); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void -@@ -3052,8 +3451,10 @@ zoom(const Arg *arg) - wl_list_remove(&sel->link); - wl_list_insert(&clients, &sel->link); - -+ drawtbars(selmon, 0, 1); - focusclient(sel, 1); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - #ifdef XWAYLAND -@@ -3105,6 +3506,10 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); -@@ -3150,7 +3555,7 @@ sethints(struct wl_listener *listener, void *data) - printstatus(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void --- -2.47.0 - diff --git a/dwl-bak/dwl-patches/patches/tab/tab.patch b/dwl-bak/dwl-patches/patches/tab/tab.patch deleted file mode 100644 index 49276ad..0000000 --- a/dwl-bak/dwl-patches/patches/tab/tab.patch +++ /dev/null @@ -1,1252 +0,0 @@ -From d722eef53d488c9e9ed04991112376035e8c9b25 Mon Sep 17 00:00:00 2001 -From: dev-gm -Date: Sat, 16 Nov 2024 23:22:14 -0500 -Subject: [PATCH] Add tab support - ---- - Makefile | 2 +- - config.def.h | 37 ++++- - drwl.h | 320 ++++++++++++++++++++++++++++++++++++ - dwl.c | 449 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 4 files changed, 777 insertions(+), 31 deletions(-) - create mode 100644 drwl.h - -diff --git a/Makefile b/Makefile -index 578194f..279b1c0 100644 ---- a/Makefile -+++ b/Makefile -@@ -12,7 +12,7 @@ DWLDEVCFLAGS = -g -Wpedantic -Wall -Wextra -Wdeclaration-after-statement \ - -Wfloat-conversion - - # CFLAGS / LDFLAGS --PKGS = wayland-server xkbcommon libinput $(XLIBS) -+PKGS = wayland-server xkbcommon libinput pixman-1 fcft $(XLIBS) - DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS) - -diff --git a/config.def.h b/config.def.h -index 22d2171..9d33d89 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,13 +7,31 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); --static const float bordercolor[] = COLOR(0x444444ff); --static const float focuscolor[] = COLOR(0x005577ff); --static const float urgentcolor[] = COLOR(0xff0000ff); -+static const char *tbar_fonts[] = {"monospace:size=10"}; -+static const int tbar_top = 0; -+static const int tbar_height = -1; -+static const int tbar_borderpx = 1; -+static const int tbar_padding = 10; -+static const float tbar_scale = -1; /* -1 means use monitor scale */ -+static const int tbar_float_sel_sep = 0; /* should tbar be highlighted only on the currently selected window or on both the last selected floating window and the laste selected tiling window */ -+static const float rootcolor[] = COLOR(0x000000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ - -+static uint32_t colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x444444ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x005577ff }, -+ [SchemeUrg] = { 0, 0, 0x770000ff }, -+}; -+ -+static uint32_t tbar_colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { 0xbbbbbbff, 0x222222ff, 0x555555ff }, -+ [SchemeSel] = { 0xeeeeeeff, 0x005577ff, 0x555555ff }, -+ [SchemeUrg] = { 0xc7c7c7ff, 0x222222ff, 0x770000ff }, -+}; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -28,12 +46,15 @@ static const Rule rules[] = { - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ - }; - -+static const unsigned int floating_tbar_type = TBarLabel; -+static const int floating_tbar_only_top = 0; -+ - /* layout(s) */ - static const Layout layouts[] = { -- /* symbol arrange function */ -- { "[]=", tile }, -- { "><>", NULL }, /* no layout function means floating behavior */ -- { "[M]", monocle }, -+ /* symbol tbar type tbar only on top arrange function */ -+ { "[]=", TBarLabel, 0, tile }, -+ { "><>", TBarLabel, 0, NULL }, /* no layout function means floating behavior */ -+ { "[M]", TBarMultiple, 1, monocle }, - }; - - /* monitors */ -diff --git a/drwl.h b/drwl.h -new file mode 100644 -index 0000000..02eb8e9 ---- /dev/null -+++ b/drwl.h -@@ -0,0 +1,320 @@ -+/* -+ * drwl - https://codeberg.org/sewn/drwl -+ * -+ * Copyright (c) 2023-2024 sewn -+ * Copyright (c) 2024 notchoc -+ * -+ * 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. -+ * -+ * The UTF-8 Decoder included is from Bjoern Hoehrmann: -+ * Copyright (c) 2008-2010 Bjoern Hoehrmann -+ * See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. -+ */ -+#pragma once -+ -+#include -+#include -+#include -+ -+enum { ColFg, ColBg, ColBorder }; /* colorscheme index */ -+ -+typedef struct fcft_font Fnt; -+typedef pixman_image_t Img; -+ -+typedef struct { -+ Img *image; -+ Fnt *font; -+ uint32_t *scheme; -+} Drwl; -+ -+#define UTF8_ACCEPT 0 -+#define UTF8_REJECT 12 -+#define UTF8_INVALID 0xFFFD -+ -+static const uint8_t utf8d[] = { -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, -+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, -+ 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -+ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, -+ -+ 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, -+ 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, -+ 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, -+ 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, -+ 12,36,12,12,12,12,12,12,12,12,12,12, -+}; -+ -+static inline uint32_t -+utf8decode(uint32_t *state, uint32_t *codep, uint8_t byte) -+{ -+ uint32_t type = utf8d[byte]; -+ -+ *codep = (*state != UTF8_ACCEPT) ? -+ (byte & 0x3fu) | (*codep << 6) : -+ (0xff >> type) & (byte); -+ -+ *state = utf8d[256 + *state + type]; -+ return *state; -+} -+ -+static int -+drwl_init(void) -+{ -+ fcft_set_scaling_filter(FCFT_SCALING_FILTER_LANCZOS3); -+ return fcft_init(FCFT_LOG_COLORIZE_AUTO, 0, FCFT_LOG_CLASS_ERROR); -+} -+ -+static Drwl * -+drwl_create(void) -+{ -+ Drwl *drwl; -+ -+ if (!(drwl = calloc(1, sizeof(Drwl)))) -+ return NULL; -+ -+ return drwl; -+} -+ -+static void -+drwl_setfont(Drwl *drwl, Fnt *font) -+{ -+ if (drwl) -+ drwl->font = font; -+} -+ -+static void -+drwl_setimage(Drwl *drwl, Img *image) -+{ -+ if (drwl) -+ drwl->image = image; -+} -+ -+static Fnt * -+drwl_font_create(Drwl *drwl, size_t count, -+ const char *names[static count], const char *attributes) -+{ -+ Fnt *font = fcft_from_name(count, names, attributes); -+ if (drwl) -+ drwl_setfont(drwl, font); -+ return font; -+} -+ -+static void -+drwl_font_destroy(Fnt *font) -+{ -+ fcft_destroy(font); -+} -+ -+static inline pixman_color_t -+convert_color(uint32_t clr) -+{ -+ return (pixman_color_t){ -+ ((clr >> 24) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 16) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ ((clr >> 8) & 0xFF) * 0x101 * (clr & 0xFF) / 0xFF, -+ (clr & 0xFF) * 0x101 -+ }; -+} -+ -+static void -+drwl_setscheme(Drwl *drwl, uint32_t *scm) -+{ -+ if (drwl) -+ drwl->scheme = scm; -+} -+ -+static Img * -+drwl_image_create(Drwl *drwl, unsigned int w, unsigned int h, uint32_t *bits) -+{ -+ Img *image; -+ pixman_region32_t clip; -+ -+ image = pixman_image_create_bits_no_clear( -+ PIXMAN_a8r8g8b8, w, h, bits, w * 4); -+ if (!image) -+ return NULL; -+ pixman_region32_init_rect(&clip, 0, 0, w, h); -+ pixman_image_set_clip_region32(image, &clip); -+ pixman_region32_fini(&clip); -+ -+ if (drwl) -+ drwl_setimage(drwl, image); -+ return image; -+} -+ -+static void -+drwl_rect(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ int filled, int invert) -+{ -+ pixman_color_t clr; -+ if (!drwl || !drwl->scheme || !drwl->image) -+ return; -+ -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ if (filled) -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 1, -+ &(pixman_rectangle16_t){x, y, w, h}); -+ else -+ pixman_image_fill_rectangles(PIXMAN_OP_SRC, drwl->image, &clr, 4, -+ (pixman_rectangle16_t[4]){ -+ { x, y, w, 1 }, -+ { x, y + h - 1, w, 1 }, -+ { x, y, 1, h }, -+ { x + w - 1, y, 1, h }}); -+} -+ -+static int -+drwl_text(Drwl *drwl, -+ int x, int y, unsigned int w, unsigned int h, -+ unsigned int lpad, const char *text, int invert) -+{ -+ int ty; -+ int render = x || y || w || h; -+ long x_kern; -+ uint32_t cp = 0, last_cp = 0, state; -+ pixman_color_t clr; -+ pixman_image_t *fg_pix = NULL; -+ int noellipsis = 0; -+ const struct fcft_glyph *glyph, *eg = NULL; -+ int fcft_subpixel_mode = FCFT_SUBPIXEL_DEFAULT; -+ -+ if (!drwl || (render && (!drwl->scheme || !w || !drwl->image)) || !text || !drwl->font) -+ return 0; -+ -+ if (!render) { -+ w = invert ? invert : ~invert; -+ } else { -+ clr = convert_color(drwl->scheme[invert ? ColBg : ColFg]); -+ fg_pix = pixman_image_create_solid_fill(&clr); -+ -+ drwl_rect(drwl, x, y, w, h, 1, !invert); -+ -+ x += lpad; -+ w -= lpad; -+ } -+ -+ if (render && (drwl->scheme[ColBg] & 0xFF) != 0xFF) -+ fcft_subpixel_mode = FCFT_SUBPIXEL_NONE; -+ -+ if (render) -+ eg = fcft_rasterize_char_utf32(drwl->font, 0x2026 /* … */, fcft_subpixel_mode); -+ -+ for (const char *p = text, *pp; pp = p, *p; p++) { -+ for (state = UTF8_ACCEPT; *p && -+ utf8decode(&state, &cp, *p) > UTF8_REJECT; p++) -+ ; -+ if (!*p || state == UTF8_REJECT) { -+ cp = UTF8_INVALID; -+ if (p > pp) -+ p--; -+ } -+ -+ glyph = fcft_rasterize_char_utf32(drwl->font, cp, fcft_subpixel_mode); -+ if (!glyph) -+ continue; -+ -+ x_kern = 0; -+ if (last_cp) -+ fcft_kerning(drwl->font, last_cp, cp, &x_kern, NULL); -+ last_cp = cp; -+ -+ ty = y + (h - drwl->font->height) / 2 + drwl->font->ascent; -+ -+ if (render && !noellipsis && x_kern + glyph->advance.x + eg->advance.x > w && -+ *(p + 1) != '\0') { -+ /* cannot fit ellipsis after current codepoint */ -+ if (drwl_text(drwl, 0, 0, 0, 0, 0, pp, 0) + x_kern <= w) { -+ noellipsis = 1; -+ } else { -+ w -= eg->advance.x; -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, eg->pix, drwl->image, 0, 0, 0, 0, -+ x + eg->x, ty - eg->y, eg->width, eg->height); -+ } -+ } -+ -+ if ((x_kern + glyph->advance.x) > w) -+ break; -+ -+ x += x_kern; -+ -+ if (render && pixman_image_get_format(glyph->pix) == PIXMAN_a8r8g8b8) -+ /* pre-rendered glyphs (eg. emoji) */ -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, glyph->pix, NULL, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ else if (render) -+ pixman_image_composite32( -+ PIXMAN_OP_OVER, fg_pix, glyph->pix, drwl->image, 0, 0, 0, 0, -+ x + glyph->x, ty - glyph->y, glyph->width, glyph->height); -+ -+ x += glyph->advance.x; -+ w -= glyph->advance.x; -+ } -+ -+ if (render) -+ pixman_image_unref(fg_pix); -+ -+ return x + (render ? w : 0); -+} -+ -+static unsigned int -+drwl_font_getwidth(Drwl *drwl, const char *text) -+{ -+ if (!drwl || !drwl->font || !text) -+ return 0; -+ return drwl_text(drwl, 0, 0, 0, 0, 0, text, 0); -+} -+ -+static unsigned int -+drwl_font_getwidth_clamp(Drwl *drwl, const char *text, unsigned int n) -+{ -+ unsigned int tmp = 0; -+ if (drwl && drwl->font && text && n) -+ tmp = drwl_text(drwl, 0, 0, 0, 0, 0, text, n); -+ return tmp < n ? tmp : n; -+} -+ -+static void -+drwl_image_destroy(Img *image) -+{ -+ pixman_image_unref(image); -+} -+ -+static void -+drwl_destroy(Drwl *drwl) -+{ -+ if (drwl->font) -+ drwl_font_destroy(drwl->font); -+ if (drwl->image) -+ drwl_image_destroy(drwl->image); -+ free(drwl); -+} -+ -+static void -+drwl_fini(void) -+{ -+ fcft_fini(); -+} -diff --git a/dwl.c b/dwl.c -index 9acb898..bde4009 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -12,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -59,6 +61,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -69,6 +72,7 @@ - #endif - - #include "util.h" -+#include "drwl.h" - - /* macros */ - #define MAX(A, B) ((A) > (B) ? (A) : (B)) -@@ -82,9 +86,11 @@ - #define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) - - /* enums */ -+enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ -+enum { TBarNone, TBarLabel, TBarMultiple, TBarAlways }; /* tbar types */ - #ifdef XWAYLAND - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ -@@ -104,6 +110,14 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct { -+ struct wlr_buffer base; -+ struct wl_listener release; -+ bool busy; -+ Img *image; -+ uint32_t data[]; -+} Buffer; -+ - typedef struct Monitor Monitor; - typedef struct { - /* Must keep this field first */ -@@ -113,6 +127,11 @@ typedef struct { - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ - struct wlr_scene_tree *scene_surface; -+ struct wlr_scene_buffer *tbar_buffer; -+ Drwl *drw; -+ Buffer *pool[2]; -+ int tbar_height, tbar_real_height; -+ float tbar_scale; - struct wl_list link; - struct wl_list flink; - struct wlr_box geom; /* layout-relative, includes border */ -@@ -141,7 +160,7 @@ typedef struct { - #endif - unsigned int bw; - uint32_t tags; -- int isfloating, isurgent, isfullscreen; -+ int isfloating, isurgent, isfullscreen, tbar_enabled, resize_tbar_enabled; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -184,6 +203,8 @@ typedef struct { - - typedef struct { - const char *symbol; -+ unsigned int tbar_type; /* type of tbar */ -+ int tbar_only_top; - void (*arrange)(Monitor *); - } Layout; - -@@ -251,6 +272,12 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); -+static Buffer *bufclient(Client *c); -+static void bufdestroy(struct wlr_buffer *wlr_buffer); -+static bool bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride); -+static void bufdataend(struct wlr_buffer *wlr_buffer); -+static void bufrelease(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -@@ -286,10 +313,13 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void drawtbars(Monitor *m, int floating, int clients_changed); -+static void drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); -+static Client *focustop_onlytiled(Monitor *m, int onlytiled); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -411,6 +441,12 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static const struct wlr_buffer_impl buffer_impl = { -+ .destroy = bufdestroy, -+ .begin_data_ptr_access = bufdatabegin, -+ .end_data_ptr_access = bufdataend, -+}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -481,14 +517,16 @@ void - arrange(Monitor *m) - { - Client *c; -+ int enabled; - - if (!m->wlr_output->enabled) - return; - - wl_list_for_each(c, &clients, link) { - if (c->mon == m) { -- wlr_scene_node_set_enabled(&c->scene->node, VISIBLEON(c, m)); -- client_set_suspended(c, !VISIBLEON(c, m)); -+ enabled = VISIBLEON(c, m); -+ wlr_scene_node_set_enabled(&c->scene->node, enabled); -+ client_set_suspended(c, !enabled); - } - } - -@@ -513,6 +551,7 @@ arrange(Monitor *m) - - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -+ - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } -@@ -589,6 +628,74 @@ axisnotify(struct wl_listener *listener, void *data) - event->delta_discrete, event->source, event->relative_direction); - } - -+Buffer * -+bufclient(Client *c) -+{ -+ size_t i; -+ Buffer *buf = NULL; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ if (c->pool[i]->busy) -+ continue; -+ buf = c->pool[i]; -+ break; -+ } -+ -+ buf = ecalloc(1, sizeof(Buffer) + (int)(c->geom.width * c->tbar_scale * 4 * (c->tbar_height + 2*tbar_borderpx))); -+ buf->image = drwl_image_create(NULL, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx, buf->data); -+ wlr_buffer_init(&buf->base, &buffer_impl, (int)(c->geom.width * c->tbar_scale), c->tbar_height + 2*tbar_borderpx); -+ c->pool[i] = buf; -+ break; -+ } -+ if (!buf) -+ return NULL; -+ -+ buf->busy = true; -+ LISTEN(&buf->base.events.release, &buf->release, bufrelease); -+ wlr_buffer_lock(&buf->base); -+ drwl_setimage(c->drw, buf->image); -+ return buf; -+} -+ -+void -+bufdestroy(struct wlr_buffer *wlr_buffer) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ if (buf->busy) -+ wl_list_remove(&buf->release.link); -+ drwl_image_destroy(buf->image); -+ free(buf); -+} -+ -+bool -+bufdatabegin(struct wlr_buffer *wlr_buffer, uint32_t flags, -+ void **data, uint32_t *format, size_t *stride) -+{ -+ Buffer *buf = wl_container_of(wlr_buffer, buf, base); -+ -+ if (flags & WLR_BUFFER_DATA_PTR_ACCESS_WRITE) return false; -+ -+ *data = buf->data; -+ *stride = wlr_buffer->width * 4; -+ *format = DRM_FORMAT_ARGB8888; -+ -+ return true; -+} -+ -+void -+bufdataend(struct wlr_buffer *wlr_buffer) -+{ -+} -+ -+void -+bufrelease(struct wl_listener *listener, void *data) -+{ -+ Buffer *buf = wl_container_of(listener, buf, release); -+ buf->busy = false; -+ wl_list_remove(&buf->release.link); -+} -+ - void - buttonpress(struct wl_listener *listener, void *data) - { -@@ -670,6 +777,21 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ Client *c; -+ unsigned int i; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!c->tbar_enabled) -+ continue; -+ -+ for (i = 0; i < LENGTH(c->pool); i++) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; -@@ -691,6 +813,8 @@ cleanup(void) - /* Destroy after the wayland display (when the monitors are already destroyed) - to avoid destroying them with an invalid scene output. */ - wlr_scene_node_destroy(&scene->tree.node); -+ -+ drwl_fini(); - } - - void -@@ -1057,6 +1181,10 @@ createnotify(struct wl_listener *listener, void *data) - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -1332,6 +1460,166 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+drawtbars(Monitor *m, int floating, int clients_changed) -+{ -+ unsigned int tbar_type, tbar_only_top, len = 0; -+ int nodraw = 0, ismonocle; -+ Client *c, *sel = NULL, *sel_in_layout = NULL; -+ -+ if (!m) -+ return; -+ -+ tbar_type = floating ? floating_tbar_type : m->lt[m->sellt]->tbar_type; -+ tbar_only_top = floating ? floating_tbar_only_top : m->lt[m->sellt]->tbar_only_top; -+ ismonocle = m->lt[m->sellt]->arrange == monocle; -+ -+ if (!clients_changed && !floating && ismonocle && (sel = focustop_onlytiled(m, 1))) { -+ wlr_scene_node_raise_to_top(&sel->scene->node); -+ if (sel->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel->tbar_buffer->node); -+ return; -+ } -+ -+ if (tbar_type == TBarNone) -+ nodraw = 2; -+ -+ if (!nodraw) { -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m)) -+ continue; -+ if (!sel && (!tbar_float_sel_sep || c->isfloating == floating)) -+ sel = c; -+ if (!sel_in_layout && c->isfloating == floating) -+ sel_in_layout = c; -+ if (c->isfloating == floating && !c->isfullscreen) -+ len++; -+ } -+ -+ if (len == 0) -+ return; -+ } -+ -+ if (tbar_type == TBarMultiple && len <= 1) -+ nodraw = 2; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating != floating) -+ continue; -+ if (c->tbar_buffer && c->tbar_enabled && (nodraw == 2 || c->isfullscreen)) { -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 0); -+ c->tbar_enabled = 0; -+ if (m->lt[m->sellt]->arrange != tile) -+ resize(c, c->geom, 0); -+ } -+ if (!nodraw && !c->isfullscreen) { -+ drawtbar(c, tbar_type, len, ismonocle ? c : sel_in_layout, sel_in_layout); -+ if (!ismonocle && tbar_only_top) -+ nodraw = 1; -+ } -+ if (c == sel_in_layout) { -+ wlr_scene_node_raise_to_top(&sel_in_layout->scene->node); -+ if (sel_in_layout->tbar_buffer) -+ wlr_scene_node_raise_to_top(&sel_in_layout->tbar_buffer->node); -+ } -+ } -+ -+ if (m->lt[m->sellt]->arrange == tile) -+ m->lt[m->sellt]->arrange(m); -+} -+ -+void -+drawtbar(Client *c, unsigned int tbar_type, unsigned int len, Client *sel, Client *sel_in_layout) -+{ -+ Buffer *buf; -+ float width = c->geom.width * c->tbar_scale; -+ unsigned int i, scheme; -+ Client *l; -+ uint32_t tbar_border_colors[][3] = { -+ [SchemeNorm] = { [ColBg] = tbar_colors[SchemeNorm][2] }, -+ [SchemeSel] = { [ColBg] = tbar_colors[SchemeSel][2] }, -+ [SchemeUrg] = { [ColBg] = tbar_colors[SchemeUrg][2] } -+ }; -+ -+ if (!c->tbar_buffer) -+ c->tbar_buffer = wlr_scene_buffer_create(c->scene, NULL); -+ -+ for (i = 0; i < LENGTH(c->pool); i++) { -+ if (c->pool[i]) { -+ wlr_buffer_drop(&c->pool[i]->base); -+ c->pool[i] = NULL; -+ } -+ } -+ drwl_setimage(c->drw, NULL); -+ -+ if (!(buf = bufclient(c))) -+ return; -+ -+ switch (tbar_type) { -+ case TBarLabel: -+ scheme = c->isurgent ? SchemeUrg : (c == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, 0, 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, c->tbar_height + tbar_borderpx, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, 0, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ drwl_rect(c->drw, (unsigned int)width - tbar_borderpx, tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - 2*tbar_borderpx, c->tbar_height, -+ tbar_padding, client_get_title(c), 0); -+ -+ break; -+ -+ case TBarMultiple: -+ case TBarAlways: -+ width /= len; -+ i = 0; -+ -+ wl_list_for_each(l, &clients, link) { -+ if (!VISIBLEON(l, c->mon) || l->isfullscreen || l->isfloating != c->isfloating) -+ continue; -+ -+ scheme = l->isurgent ? SchemeUrg : (l == sel ? SchemeSel : SchemeNorm); -+ -+ if (tbar_borderpx) { -+ drwl_setscheme(c->drw, tbar_border_colors[scheme]); -+ drwl_rect(c->drw, (unsigned int)(width*i), 0, (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), c->tbar_height + tbar_borderpx, -+ (unsigned int)width, tbar_borderpx, 1, 1); -+ drwl_rect(c->drw, (unsigned int)(width*i), tbar_borderpx, tbar_borderpx, c->tbar_height, 1, 1); -+ if (i == len-1) -+ drwl_rect(c->drw, (unsigned int)(width*(i+1)) - tbar_borderpx, tbar_borderpx, -+ tbar_borderpx, c->tbar_height + 2*tbar_borderpx, 1, 1); -+ } -+ -+ drwl_setscheme(c->drw, tbar_colors[scheme]); -+ drwl_text(c->drw, (unsigned int)(width*i) + tbar_borderpx, tbar_borderpx, -+ (unsigned int)width - (i == len-1 ? 2*tbar_borderpx : tbar_borderpx), -+ c->tbar_height, tbar_padding, client_get_title(l), 0); -+ -+ i += 1; -+ } -+ -+ break; -+ } -+ -+ c->tbar_enabled = 1; -+ if (!c->resize_tbar_enabled) -+ resize(c, c->geom, 0); -+ -+ wlr_scene_buffer_set_dest_size(c->tbar_buffer, c->geom.width, -+ c->tbar_real_height + 2*tbar_borderpx); -+ wlr_scene_node_set_position(&c->tbar_buffer->node, 0, tbar_top ? 0 -+ : (c->geom.height - c->tbar_real_height - 2*tbar_borderpx)); -+ wlr_scene_buffer_set_buffer(c->tbar_buffer, &buf->base); -+ wlr_scene_node_set_enabled(&c->tbar_buffer->node, 1); -+ wlr_buffer_unlock(&buf->base); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -1366,13 +1654,13 @@ focusclient(Client *c, int lift) - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ - if (!exclusive_focus && !seat->drag) -- client_set_border_color(c, focuscolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeSel][ColBorder])); - } - - /* Deactivate old client if focus is changing */ - if (old && (!c || client_surface(c) != old)) { - /* If an overlay is focused, don't focus or activate the client, -- * but only update its position in fstack to render its border with focuscolor -+ * but only update its position in fstack to render its border with its color - * and focus it after the overlay is closed. */ - if (old_client_type == LayerShell && wlr_scene_node_coords( - &old_l->scene->node, &unused_lx, &unused_ly) -@@ -1383,11 +1671,18 @@ focusclient(Client *c, int lift) - /* Don't deactivate old client if the new one wants focus, as this causes issues with winecfg - * and probably other clients */ - } else if (old_c && !client_is_unmanaged(old_c) && (!c || !client_wants_focus(c))) { -- client_set_border_color(old_c, bordercolor); -+ client_set_border_color(old_c, (float[])COLOR(colors[SchemeNorm][ColBorder])); - - client_activate_surface(old, 0); - } - } -+ -+ if (c && c->mon) -+ drawtbars(c->mon, c->isfloating, 0); -+ if (c && old_c && old_c->mon && (old_c->mon != c->mon || old_c->isfloating != c->isfloating)) -+ drawtbars(old_c->mon, old_c->isfloating, 0); -+ -+ - printstatus(); - - if (!c) { -@@ -1458,6 +1753,20 @@ focustop(Monitor *m) - return NULL; - } - -+Client * -+focustop_onlytiled(Monitor *m, int onlytiled) -+{ -+ Client *c; -+ wl_list_for_each(c, &fstack, flink) { -+ if (VISIBLEON(c, m)) { -+ if ((onlytiled == 1 && c->isfloating) || (onlytiled == 2 && !c->isfloating && m->lt[m->sellt]->arrange)) -+ continue; -+ return c; -+ } -+ } -+ return NULL; -+} -+ - void - fullscreennotify(struct wl_listener *listener, void *data) - { -@@ -1517,6 +1826,7 @@ incnmaster(const Arg *arg) - return; - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -1685,6 +1995,7 @@ mapnotify(struct wl_listener *listener, void *data) - Client *w, *c = wl_container_of(listener, c, map); - Monitor *m; - int i; -+ char fontattrs[12]; - - /* Create scene tree for this client and its border */ - c->scene = client_surface(c)->data = wlr_scene_tree_create(layers[LyrTile]); -@@ -1712,7 +2023,7 @@ mapnotify(struct wl_listener *listener, void *data) - - for (i = 0; i < 4; i++) { - c->border[i] = wlr_scene_rect_create(c->scene, 0, 0, -- c->isurgent ? urgentcolor : bordercolor); -+ (float[])COLOR(colors[c->isurgent ? SchemeUrg : SchemeNorm][ColBorder])); - c->border[i]->node.data = c; - } - -@@ -1735,6 +2046,7 @@ mapnotify(struct wl_listener *listener, void *data) - } else { - applyrules(c); - } -+ - printstatus(); - - unset_fullscreen: -@@ -1743,6 +2055,20 @@ unset_fullscreen: - if (w != c && w != p && w->isfullscreen && m == w->mon && (w->tags & c->tags)) - setfullscreen(w, 0); - } -+ -+ if (!(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ c->tbar_scale = tbar_scale > 0 ? tbar_scale : m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ c->tbar_real_height = (int)((float)c->tbar_height / c->tbar_scale); -+ } -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -1767,18 +2093,28 @@ void - monocle(Monitor *m) - { - Client *c; -- int n = 0; -+ int n = 0, old_tbar_enabled; - - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; -- resize(c, m->w, 0); -+ if (!n) -+ wlr_scene_node_raise_to_top(&c->scene->node); - n++; -+ if (n > 1) -+ break; -+ } -+ wl_list_for_each(c, &fstack, flink) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ old_tbar_enabled = c->tbar_enabled; -+ c->tbar_enabled = m->lt[m->sellt]->tbar_type != TBarNone -+ && m->lt[m->sellt]->tbar_type == TBarMultiple ? n > 1 : 1; -+ resize(c, m->w, 0); -+ c->tbar_enabled = old_tbar_enabled; - } - if (n) - snprintf(m->ltsymbol, LENGTH(m->ltsymbol), "[%d]", n); -- if ((c = focustop(m))) -- wlr_scene_node_raise_to_top(&c->scene->node); - } - - void -@@ -2150,32 +2486,37 @@ resize(Client *c, struct wlr_box geo, int interact) - { - struct wlr_box *bbox; - struct wlr_box clip; -+ unsigned int th; - - if (!c->mon || !client_surface(c)->mapped) - return; - - bbox = interact ? &sgeom : &c->mon->w; - -+ th = c->tbar_enabled ? (unsigned int)(c->tbar_real_height + 2*tbar_borderpx) : c->bw; -+ - client_set_bounds(c, geo.width, geo.height); - c->geom = geo; - applybounds(c, bbox); - - /* Update scene-graph, including borders */ - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); -- wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw); -- wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[1], c->geom.width, c->bw); -- wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - 2 * c->bw); -- wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - 2 * c->bw); -+ wlr_scene_node_set_position(&c->scene_surface->node, c->bw, tbar_top ? th : c->bw); -+ wlr_scene_rect_set_size(c->border[0], c->geom.width, (c->tbar_enabled && tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[1], c->geom.width, (c->tbar_enabled && !tbar_top) ? 0 : c->bw); -+ wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - th - c->bw); -+ wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - th - c->bw); - wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw); -- wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw); -- wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw); -+ wlr_scene_node_set_position(&c->border[2]->node, 0, tbar_top ? th : c->bw); -+ wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, tbar_top ? th : c->bw); - - /* this is a no-op if size hasn't changed */ - c->resize = client_set_size(c, c->geom.width - 2 * c->bw, -- c->geom.height - 2 * c->bw); -+ c->geom.height - th - c->bw); - client_get_clip(c, &clip); - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); -+ -+ c->resize_tbar_enabled = c->tbar_enabled; - } - - void -@@ -2284,6 +2625,8 @@ setfloating(Client *c, int floating) - : c->isfloating ? LyrFloat : LyrTile]); - arrange(c->mon); - printstatus(); -+ drawtbars(c->mon, 0, 1); -+ drawtbars(c->mon, 1, 1); - } - - void -@@ -2307,6 +2650,7 @@ setfullscreen(Client *c, int fullscreen) - } - arrange(c->mon); - printstatus(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2321,6 +2665,7 @@ setlayout(const Arg *arg) - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, LENGTH(selmon->ltsymbol)); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); - } - - /* arg > 1.0 will set mfact absolutely */ -@@ -2336,6 +2681,7 @@ setmfact(const Arg *arg) - return; - selmon->mfact = f; - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - void -@@ -2585,6 +2931,8 @@ setup(void) - LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply); - LISTEN_STATIC(&output_mgr->events.test, outputmgrtest); - -+ drwl_init(); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2638,14 +2986,22 @@ tag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void - tagmon(const Arg *arg) - { - Client *sel = focustop(selmon); -- if (sel) -+ Monitor *old_mon = selmon; -+ if (sel) { - setmon(sel, dirtomon(arg->i), 0); -+ if (selmon) -+ drawtbars(selmon, sel->isfloating, 1); -+ if (old_mon && selmon != old_mon) -+ drawtbars(old_mon, sel->isfloating, 1); -+ } - } - - void -@@ -2711,6 +3067,8 @@ toggletag(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -2724,6 +3082,8 @@ toggleview(const Arg *arg) - focusclient(focustop(selmon), 1); - arrange(selmon); - printstatus(); -+ drawtbars(selmon, 0, 1); -+ drawtbars(selmon, 1, 1); - } - - void -@@ -2754,6 +3114,9 @@ unmapnotify(struct wl_listener *listener, void *data) - { - /* Called when the surface is unmapped, and should no longer be shown. */ - Client *c = wl_container_of(listener, c, unmap); -+ Monitor *m = c->mon; -+ unsigned int i; -+ - if (c == grabc) { - cursor_mode = CurNormal; - grabc = NULL; -@@ -2770,6 +3133,20 @@ unmapnotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->flink); - } - -+ if (m && !c->isfloating && m->lt[m->sellt]->arrange == monocle) -+ drawtbars(m, c->isfloating, 1); -+ -+ if (c->tbar_enabled) { -+ for (i = 0; i < LENGTH(c->pool); i++) -+ if (c->pool[i]) -+ wlr_buffer_drop(&c->pool[i]->base); -+ -+ drwl_setimage(c->drw, NULL); -+ drwl_destroy(c->drw); -+ -+ wlr_scene_node_destroy(&c->tbar_buffer->node); -+ } -+ - wlr_scene_node_destroy(&c->scene->node); - printstatus(); - motionnotify(0, NULL, 0, 0, 0, 0); -@@ -2790,9 +3167,12 @@ updatemons(struct wl_listener *listener, void *data) - Client *c; - struct wlr_output_configuration_head_v1 *config_head; - Monitor *m; -+ char fontattrs[12]; - - /* First remove from the layout the disabled monitors */ - wl_list_for_each(m, &mons, link) { -+ if (m->asleep) -+ continue; - if (m->wlr_output->enabled || m->asleep) - continue; - config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); -@@ -2856,6 +3236,23 @@ updatemons(struct wl_listener *listener, void *data) - if (!selmon) { - selmon = m; - } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || (c->drw && (tbar_scale > 0 || c->tbar_scale == m->wlr_output->scale))) -+ continue; -+ if (!c->drw && !(c->drw = drwl_create())) -+ die("failed to create drwl context"); -+ drwl_font_destroy(c->drw->font); -+ c->tbar_scale = m->wlr_output->scale; -+ snprintf(fontattrs, sizeof(fontattrs), "dpi=%.2f", 96. * c->tbar_scale); -+ if (!(drwl_font_create(c->drw, LENGTH(tbar_fonts), tbar_fonts, fontattrs))) -+ die("Could not load font"); -+ if (!c->tbar_height) { -+ c->tbar_height = c->drw->font->height; -+ if (tbar_height > c->tbar_height) -+ c->tbar_height = tbar_height; -+ } -+ } - } - - if (selmon && selmon->wlr_output->enabled) { -@@ -2887,6 +3284,7 @@ updatetitle(struct wl_listener *listener, void *data) - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) - printstatus(); -+ drawtbars(c->mon, c->isfloating, 1); - } - - void -@@ -2900,9 +3298,10 @@ urgent(struct wl_listener *listener, void *data) - - c->isurgent = 1; - printstatus(); -+ drawtbars(c->mon, 1, 1); - - if (client_surface(c)->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void -@@ -3010,8 +3409,10 @@ zoom(const Arg *arg) - wl_list_remove(&sel->link); - wl_list_insert(&clients, &sel->link); - -+ drawtbars(selmon, 0, 1); - focusclient(sel, 1); - arrange(selmon); -+ drawtbars(selmon, 0, 0); - } - - #ifdef XWAYLAND -@@ -3070,6 +3471,10 @@ createnotifyx11(struct wl_listener *listener, void *data) - c->surface.xwayland = xsurface; - c->type = X11; - c->bw = client_is_unmanaged(c) ? 0 : borderpx; -+ c->tbar_enabled = 0; -+ c->resize_tbar_enabled = 0; -+ c->tbar_height = 0; -+ c->tbar_buffer = NULL; - - /* Listen to the various events it can emit */ - LISTEN(&xsurface->events.associate, &c->associate, associatex11); -@@ -3115,7 +3520,7 @@ sethints(struct wl_listener *listener, void *data) - printstatus(); - - if (c->isurgent && surface && surface->mapped) -- client_set_border_color(c, urgentcolor); -+ client_set_border_color(c, (float[])COLOR(colors[SchemeUrg][ColBorder])); - } - - void --- -2.47.0 - diff --git a/dwl-bak/dwl-patches/patches/tablet-input/README.md b/dwl-bak/dwl-patches/patches/tablet-input/README.md deleted file mode 100644 index 3b3be09..0000000 --- a/dwl-bak/dwl-patches/patches/tablet-input/README.md +++ /dev/null @@ -1,25 +0,0 @@ -### Description -implements wlr-tablet-v2 for drawing tablets and supports cursor emulation - -inspired by @guyuming76's [branch](https://codeberg.org/guyuming76/dwl/commits/branch/graphic_tablet), with coding help from @Palanix and testing by @Thanatos - -**Please note:** wlroots modified the order of arguments to the function `wlr_surface_accepts_tablet_v2` -In versions less than or equal to 0.18.1 (against which, dwl 0.7 is typically built), the order is `tablet, surface`. -In the master branch and (anticipated) in versions later than 0.18.1, the order is `surface, tablet`. -The git branch for this patch uses the `surface, tablet` order. - -If you are attempting to use this codebase to make your own modifications to the patch, there is only one call to the `wlr_surface_accepts_tablet_v2` function, but you will need to make the argument order change if you expect to build against wlroots 0.18.1 or earlier. - -The `0.7` patch linked here accounts for the change and uses the `tablet, surface` order, but the patch is orphaned from a codebase. - -There was discussion of this matter in [Issue #141](https://codeberg.org/dwl/dwl-patches/issues/141). - -### Download -- [git branch](https://codeberg.org/fauxmight/dwl/src/branch/tablet-input) -- [main 2025-05-18](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/tablet-input/tablet-input.patch) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/tablet-input/tablet-input-0.7.patch) - -### Authors -- [fauxmight](https://codeberg.org/fauxmight) -- [notchoc](https://codeberg.org/notchoc) -- [Palanix](https://codeberg.org/Palanix) diff --git a/dwl-bak/dwl-patches/patches/tablet-input/tablet-input-0.7.patch b/dwl-bak/dwl-patches/patches/tablet-input/tablet-input-0.7.patch deleted file mode 100644 index 37fdf8a..0000000 --- a/dwl-bak/dwl-patches/patches/tablet-input/tablet-input-0.7.patch +++ /dev/null @@ -1,355 +0,0 @@ -From e504dc0fccfc3994962f03dc824d8907c6afc64f Mon Sep 17 00:00:00 2001 -From: choc -Date: Sat, 4 May 2024 01:16:12 +0800 -Subject: [PATCH] implement wlr-tablet-v2 - ---- - Makefile | 6 +- - config.def.h | 1 + - dwl.c | 224 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 230 insertions(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index f955e7b..ce1b556 100644 ---- a/Makefile -+++ b/Makefile -@@ -21,7 +21,8 @@ dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ - dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h \ -+ tablet-v2-protocol.h - util.o: util.c util.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland -@@ -45,6 +46,9 @@ wlr-output-power-management-unstable-v1-protocol.h: - xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ -+tablet-v2-protocol.h: -+ $(WAYLAND_SCANNER) server-header \ -+ $(WAYLAND_PROTOCOLS)/unstable/tablet/tablet-unstable-v2.xml $@ - - config.h: - cp config.def.h $@ -diff --git a/config.def.h b/config.def.h -index 22d2171..3ad98ef 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -4,6 +4,7 @@ - ((hex >> 8) & 0xFF) / 255.0f, \ - (hex & 0xFF) / 255.0f } - /* appearance */ -+static const int tabletmaptosurface = 0; /* map tablet input to surface(1) or monitor(0) */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -diff --git a/dwl.c b/dwl.c -index ac9c36b..b8d129f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -50,6 +50,9 @@ - #include - #include - #include -+#include -+#include -+#include - #include - #include - #include -@@ -270,6 +273,7 @@ static void createnotify(struct wl_listener *listener, void *data); - static void createpointer(struct wlr_pointer *pointer); - static void createpointerconstraint(struct wl_listener *listener, void *data); - static void createpopup(struct wl_listener *listener, void *data); -+static void createtablet(struct wlr_input_device *device); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -@@ -284,6 +288,9 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); -+static void destroytablet(struct wl_listener *listener, void *data); -+static void destroytabletsurfacenotify(struct wl_listener *listener, void *data); -+static void destroytablettool(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); -@@ -337,6 +344,11 @@ static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -+static void tablettoolmotion(struct wlr_tablet_v2_tablet_tool *tool, bool change_x, bool change_y, double x, double y, double dx, double dy); -+static void tablettoolproximity(struct wl_listener *listener, void *data); -+static void tablettoolaxis(struct wl_listener *listener, void *data); -+static void tablettoolbutton(struct wl_listener *listener, void *data); -+static void tablettooltip(struct wl_listener *listener, void *data); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -@@ -396,6 +408,13 @@ static struct wlr_pointer_constraint_v1 *active_constraint; - static struct wlr_cursor *cursor; - static struct wlr_xcursor_manager *cursor_mgr; - -+static struct wlr_tablet_manager_v2 *tablet_mgr; -+static struct wlr_tablet_v2_tablet *tablet = NULL; -+static struct wlr_tablet_v2_tablet_tool *tablet_tool = NULL; -+static struct wlr_tablet_v2_tablet_pad *tablet_pad = NULL; -+static struct wlr_surface *tablet_curr_surface = NULL; -+static struct wl_listener destroy_tablet_surface_listener = {.notify = destroytabletsurfacenotify}; -+ - static struct wlr_scene_rect *root_bg; - static struct wlr_session_lock_manager_v1 *session_lock_mgr; - static struct wlr_scene_rect *locked_bg; -@@ -1133,6 +1152,28 @@ createpopup(struct wl_listener *listener, void *data) - LISTEN_STATIC(&popup->base->surface->events.commit, commitpopup); - } - -+void -+createtablet(struct wlr_input_device *device) -+{ -+ if (!tablet) { -+ struct libinput_device *device_handle = NULL; -+ if (!wlr_input_device_is_libinput(device) || -+ !(device_handle = wlr_libinput_get_device_handle(device))) -+ return; -+ -+ tablet = wlr_tablet_create(tablet_mgr, seat, device); -+ LISTEN_STATIC(&tablet->wlr_device->events.destroy, destroytablet); -+ if (libinput_device_config_send_events_get_modes(device_handle)) { -+ libinput_device_config_send_events_set_mode(device_handle, send_events_mode); -+ wlr_cursor_attach_input_device(cursor, device); -+ } -+ } else if (device == tablet->wlr_device) { -+ wlr_log(WLR_ERROR, "createtablet: duplicate device"); -+ } else { -+ wlr_log(WLR_ERROR, "createtablet: already have one tablet"); -+ } -+} -+ - void - cursorconstrain(struct wlr_pointer_constraint_v1 *constraint) - { -@@ -1321,6 +1362,27 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - free(group); - } - -+void -+destroytablet(struct wl_listener *listener, void *data) -+{ -+ tablet = NULL; -+} -+ -+void -+destroytabletsurfacenotify(struct wl_listener *listener, void *data) -+{ -+ if (tablet_curr_surface) -+ wl_list_remove(&destroy_tablet_surface_listener.link); -+ tablet_curr_surface = NULL; -+} -+ -+void -+destroytablettool(struct wl_listener *listener, void *data) -+{ -+ destroytabletsurfacenotify(NULL, NULL); -+ tablet_tool = NULL; -+} -+ - Monitor * - dirtomon(enum wlr_direction dir) - { -@@ -1540,6 +1602,12 @@ inputdevice(struct wl_listener *listener, void *data) - case WLR_INPUT_DEVICE_POINTER: - createpointer(wlr_pointer_from_input_device(device)); - break; -+ case WLR_INPUT_DEVICE_TABLET: -+ createtablet(device); -+ break; -+ case WLR_INPUT_DEVICE_TABLET_PAD: -+ tablet_pad = wlr_tablet_pad_create(tablet_mgr, seat, device); -+ break; - default: - /* TODO handle other input device types */ - break; -@@ -2567,6 +2635,8 @@ setup(void) - - relative_pointer_mgr = wlr_relative_pointer_manager_v1_create(dpy); - -+ tablet_mgr = wlr_tablet_v2_create(dpy); -+ - /* - * Creates a cursor, which is a wlroots utility for tracking the cursor - * image shown on screen. -@@ -2596,6 +2666,10 @@ setup(void) - LISTEN_STATIC(&cursor->events.button, buttonpress); - LISTEN_STATIC(&cursor->events.axis, axisnotify); - LISTEN_STATIC(&cursor->events.frame, cursorframe); -+ LISTEN_STATIC(&cursor->events.tablet_tool_proximity, tablettoolproximity); -+ LISTEN_STATIC(&cursor->events.tablet_tool_axis, tablettoolaxis); -+ LISTEN_STATIC(&cursor->events.tablet_tool_button, tablettoolbutton); -+ LISTEN_STATIC(&cursor->events.tablet_tool_tip, tablettooltip); - - cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1); - LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape); -@@ -2689,6 +2763,156 @@ tagmon(const Arg *arg) - setmon(sel, dirtomon(arg->i), 0); - } - -+void -+tabletapplymap(double x, double y, struct wlr_input_device *dev) -+{ -+ Client *p; -+ struct wlr_box geom = {0}; -+ if (tabletmaptosurface && tablet_curr_surface) { -+ toplevel_from_wlr_surface(tablet_curr_surface, &p, NULL); -+ if (p) { -+ for (; client_get_parent(p); p = client_get_parent(p)); -+ geom.x = p->geom.x + p->bw; -+ geom.y = p->geom.y + p->bw; -+ geom.width = p->geom.width - 2 * p->bw; -+ geom.height = p->geom.height - 2 * p->bw; -+ } -+ } -+ wlr_cursor_map_input_to_region(cursor, dev, &geom); -+ wlr_cursor_map_input_to_output(cursor, dev, selmon->wlr_output); -+} -+ -+void -+tablettoolmotion(struct wlr_tablet_v2_tablet_tool *tool, bool change_x, bool change_y, -+ double x, double y, double dx, double dy) -+{ -+ struct wlr_surface *surface = NULL; -+ double sx, sy; -+ -+ if (!change_x && !change_y) -+ return; -+ -+ tabletapplymap(x, y, tablet->wlr_device); -+ -+ // TODO: apply constraints -+ switch (tablet_tool->wlr_tool->type) { -+ case WLR_TABLET_TOOL_TYPE_LENS: -+ case WLR_TABLET_TOOL_TYPE_MOUSE: -+ wlr_cursor_move(cursor, tablet->wlr_device, dx, dy); -+ break; -+ default: -+ wlr_cursor_warp_absolute(cursor, tablet->wlr_device, change_x ? x : NAN, change_y ? y : NAN); -+ break; -+ } -+ -+ motionnotify(0, NULL, 0, 0, 0, 0); -+ -+ xytonode(cursor->x, cursor->y, &surface, NULL, NULL, &sx, &sy); -+ if (surface && !wlr_surface_accepts_tablet_v2(tablet, surface)) -+ surface = NULL; -+ -+ if (surface != tablet_curr_surface) { -+ if (tablet_curr_surface) { -+ // TODO: wait until all buttons released before leaving -+ if (tablet_tool) -+ wlr_tablet_v2_tablet_tool_notify_proximity_out(tablet_tool); -+ if (tablet_pad) -+ wlr_tablet_v2_tablet_pad_notify_leave(tablet_pad, tablet_curr_surface); -+ wl_list_remove(&destroy_tablet_surface_listener.link); -+ } -+ if (surface) { -+ if (tablet_pad) -+ wlr_tablet_v2_tablet_pad_notify_enter(tablet_pad, tablet, surface); -+ if (tablet_tool) -+ wlr_tablet_v2_tablet_tool_notify_proximity_in(tablet_tool, tablet, surface); -+ wl_signal_add(&surface->events.destroy, &destroy_tablet_surface_listener); -+ } -+ tablet_curr_surface = surface; -+ } -+ -+ if (surface) -+ wlr_tablet_v2_tablet_tool_notify_motion(tablet_tool, sx, sy); -+} -+ -+void -+tablettoolproximity(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_proximity_event *event = data; -+ struct wlr_tablet_tool *tool = event->tool; -+ -+ if (!tablet_tool) { -+ tablet_tool = wlr_tablet_tool_create(tablet_mgr, seat, tool); -+ LISTEN_STATIC(&tablet_tool->wlr_tool->events.destroy, destroytablettool); -+ LISTEN_STATIC(&tablet_tool->events.set_cursor, setcursor); -+ } -+ -+ switch (event->state) { -+ case WLR_TABLET_TOOL_PROXIMITY_OUT: -+ wlr_tablet_v2_tablet_tool_notify_proximity_out(tablet_tool); -+ destroytabletsurfacenotify(NULL, NULL); -+ break; -+ case WLR_TABLET_TOOL_PROXIMITY_IN: -+ tablettoolmotion(tablet_tool, true, true, event->x, event->y, 0, 0); -+ break; -+ } -+} -+ -+void -+tablettoolaxis(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_axis_event *event = data; -+ -+ tablettoolmotion(tablet_tool, -+ event->updated_axes & WLR_TABLET_TOOL_AXIS_X, -+ event->updated_axes & WLR_TABLET_TOOL_AXIS_Y, -+ event->x, event->y, event->dx, event->dy); -+ -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_PRESSURE) -+ wlr_tablet_v2_tablet_tool_notify_pressure(tablet_tool, event->pressure); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_DISTANCE) -+ wlr_tablet_v2_tablet_tool_notify_distance(tablet_tool, event->distance); -+ if (event->updated_axes & (WLR_TABLET_TOOL_AXIS_TILT_X | WLR_TABLET_TOOL_AXIS_TILT_Y)) -+ wlr_tablet_v2_tablet_tool_notify_tilt(tablet_tool, event->tilt_x, event->tilt_y); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_ROTATION) -+ wlr_tablet_v2_tablet_tool_notify_rotation(tablet_tool, event->rotation); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_SLIDER) -+ wlr_tablet_v2_tablet_tool_notify_slider(tablet_tool, event->slider); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_WHEEL) -+ wlr_tablet_v2_tablet_tool_notify_wheel(tablet_tool, event->wheel_delta, 0); -+} -+ -+void -+tablettoolbutton(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_button_event *event = data; -+ wlr_tablet_v2_tablet_tool_notify_button(tablet_tool, event->button, -+ (enum zwp_tablet_pad_v2_button_state)event->state); -+} -+ -+void -+tablettooltip(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_tip_event *event = data; -+ -+ if (!tablet_curr_surface) { -+ struct wlr_pointer_button_event fakeptrbtnevent = { -+ .button = BTN_LEFT, -+ .state = event->state == WLR_TABLET_TOOL_TIP_UP ? -+ WL_POINTER_BUTTON_STATE_RELEASED : WL_POINTER_BUTTON_STATE_PRESSED, -+ .time_msec = event->time_msec, -+ }; -+ buttonpress(NULL, (void *)&fakeptrbtnevent); -+ } -+ -+ if (event->state == WLR_TABLET_TOOL_TIP_UP) { -+ wlr_tablet_v2_tablet_tool_notify_up(tablet_tool); -+ return; -+ } -+ -+ wlr_tablet_v2_tablet_tool_notify_down(tablet_tool); -+ wlr_tablet_tool_v2_start_implicit_grab(tablet_tool); -+} -+ - void - tile(Monitor *m) - { --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/tablet-input/tablet-input.patch b/dwl-bak/dwl-patches/patches/tablet-input/tablet-input.patch deleted file mode 100644 index e7d1211..0000000 --- a/dwl-bak/dwl-patches/patches/tablet-input/tablet-input.patch +++ /dev/null @@ -1,372 +0,0 @@ -From 0659663b7eb9cafbd4f86779084765aa838e29cd Mon Sep 17 00:00:00 2001 -From: A Frederick Christensen -Date: Sat, 17 May 2025 23:26:15 -0500 -Subject: [PATCH] Add tablet input - ---- - Makefile | 6 +- - config.def.h | 1 + - dwl.c | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 237 insertions(+), 1 deletion(-) - -diff --git a/Makefile b/Makefile -index 578194f..e0d1835 100644 ---- a/Makefile -+++ b/Makefile -@@ -21,7 +21,8 @@ dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ - dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h \ -+ tablet-v2-protocol.h - util.o: util.c util.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland -@@ -45,6 +46,9 @@ wlr-output-power-management-unstable-v1-protocol.h: - xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ -+tablet-v2-protocol.h: -+ $(WAYLAND_SCANNER) server-header \ -+ $(WAYLAND_PROTOCOLS)/unstable/tablet/tablet-unstable-v2.xml $@ - - config.h: - cp config.def.h $@ -diff --git a/config.def.h b/config.def.h -index 22d2171..3ad98ef 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -4,6 +4,7 @@ - ((hex >> 8) & 0xFF) / 255.0f, \ - (hex & 0xFF) / 255.0f } - /* appearance */ -+static const int tabletmaptosurface = 0; /* map tablet input to surface(1) or monitor(0) */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -diff --git a/dwl.c b/dwl.c -index 4816159..e8d36ac 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -51,6 +51,9 @@ - #include - #include - #include -+#include -+#include -+#include - #include - #include - #include -@@ -268,6 +271,7 @@ static void createnotify(struct wl_listener *listener, void *data); - static void createpointer(struct wlr_pointer *pointer); - static void createpointerconstraint(struct wl_listener *listener, void *data); - static void createpopup(struct wl_listener *listener, void *data); -+static void createtablet(struct wlr_input_device *device); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -@@ -281,6 +285,9 @@ static void destroynotify(struct wl_listener *listener, void *data); - static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); -+static void destroytablet(struct wl_listener *listener, void *data); -+static void destroytabletsurfacenotify(struct wl_listener *listener, void *data); -+static void destroytablettool(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); -@@ -333,6 +340,11 @@ static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -+static void tablettoolmotion(struct wlr_tablet_v2_tablet_tool *tool, bool change_x, bool change_y, double x, double y, double dx, double dy); -+static void tablettoolproximity(struct wl_listener *listener, void *data); -+static void tablettoolaxis(struct wl_listener *listener, void *data); -+static void tablettoolbutton(struct wl_listener *listener, void *data); -+static void tablettooltip(struct wl_listener *listener, void *data); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -@@ -390,6 +402,13 @@ static struct wlr_pointer_constraint_v1 *active_constraint; - static struct wlr_cursor *cursor; - static struct wlr_xcursor_manager *cursor_mgr; - -+static struct wlr_tablet_manager_v2 *tablet_mgr; -+static struct wlr_tablet_v2_tablet *tablet = NULL; -+static struct wlr_tablet_v2_tablet_tool *tablet_tool = NULL; -+static struct wlr_tablet_v2_tablet_pad *tablet_pad = NULL; -+static struct wlr_surface *tablet_curr_surface = NULL; -+static struct wl_listener destroy_tablet_surface_listener = {.notify = destroytabletsurfacenotify}; -+ - static struct wlr_scene_rect *root_bg; - static struct wlr_session_lock_manager_v1 *session_lock_mgr; - static struct wlr_scene_rect *locked_bg; -@@ -412,6 +431,12 @@ static struct wl_listener cursor_button = {.notify = buttonpress}; - static struct wl_listener cursor_frame = {.notify = cursorframe}; - static struct wl_listener cursor_motion = {.notify = motionrelative}; - static struct wl_listener cursor_motion_absolute = {.notify = motionabsolute}; -+static struct wl_listener tablet_device_destroy = {.notify = destroytablet}; -+static struct wl_listener tablet_tool_axis = {.notify = tablettoolaxis}; -+static struct wl_listener tablet_tool_button = {.notify = tablettoolbutton}; -+static struct wl_listener tablet_tool_destroy = {.notify = destroytablettool}; -+static struct wl_listener tablet_tool_proximity = {.notify = tablettoolproximity}; -+static struct wl_listener tablet_tool_tip = {.notify = tablettooltip}; - static struct wl_listener gpu_reset = {.notify = gpureset}; - static struct wl_listener layout_change = {.notify = updatemons}; - static struct wl_listener new_idle_inhibitor = {.notify = createidleinhibitor}; -@@ -1196,6 +1221,28 @@ createpopup(struct wl_listener *listener, void *data) - LISTEN_STATIC(&popup->base->surface->events.commit, commitpopup); - } - -+void -+createtablet(struct wlr_input_device *device) -+{ -+ if (!tablet) { -+ struct libinput_device *device_handle = NULL; -+ if (!wlr_input_device_is_libinput(device) || -+ !(device_handle = wlr_libinput_get_device_handle(device))) -+ return; -+ -+ tablet = wlr_tablet_create(tablet_mgr, seat, device); -+ wl_signal_add(&tablet->wlr_device->events.destroy, &tablet_device_destroy); -+ if (libinput_device_config_send_events_get_modes(device_handle)) { -+ libinput_device_config_send_events_set_mode(device_handle, send_events_mode); -+ wlr_cursor_attach_input_device(cursor, device); -+ } -+ } else if (device == tablet->wlr_device) { -+ wlr_log(WLR_ERROR, "createtablet: duplicate device"); -+ } else { -+ wlr_log(WLR_ERROR, "createtablet: already have one tablet"); -+ } -+} -+ - void - cursorconstrain(struct wlr_pointer_constraint_v1 *constraint) - { -@@ -1380,6 +1427,27 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - free(group); - } - -+void -+destroytablet(struct wl_listener *listener, void *data) -+{ -+ tablet = NULL; -+} -+ -+void -+destroytabletsurfacenotify(struct wl_listener *listener, void *data) -+{ -+ if (tablet_curr_surface) -+ wl_list_remove(&destroy_tablet_surface_listener.link); -+ tablet_curr_surface = NULL; -+} -+ -+void -+destroytablettool(struct wl_listener *listener, void *data) -+{ -+ destroytabletsurfacenotify(NULL, NULL); -+ tablet_tool = NULL; -+} -+ - Monitor * - dirtomon(enum wlr_direction dir) - { -@@ -1587,6 +1655,12 @@ inputdevice(struct wl_listener *listener, void *data) - case WLR_INPUT_DEVICE_POINTER: - createpointer(wlr_pointer_from_input_device(device)); - break; -+ case WLR_INPUT_DEVICE_TABLET: -+ createtablet(device); -+ break; -+ case WLR_INPUT_DEVICE_TABLET_PAD: -+ tablet_pad = wlr_tablet_pad_create(tablet_mgr, seat, device); -+ break; - default: - /* TODO handle other input device types */ - break; -@@ -2580,6 +2654,8 @@ setup(void) - - relative_pointer_mgr = wlr_relative_pointer_manager_v1_create(dpy); - -+ tablet_mgr = wlr_tablet_v2_create(dpy); -+ - /* - * Creates a cursor, which is a wlroots utility for tracking the cursor - * image shown on screen. -@@ -2609,6 +2685,11 @@ setup(void) - wl_signal_add(&cursor->events.button, &cursor_button); - wl_signal_add(&cursor->events.axis, &cursor_axis); - wl_signal_add(&cursor->events.frame, &cursor_frame); -+ wl_signal_add(&cursor->events.tablet_tool_proximity, &tablet_tool_proximity); -+ wl_signal_add(&cursor->events.tablet_tool_axis, &tablet_tool_axis); -+ wl_signal_add(&cursor->events.tablet_tool_button, &tablet_tool_button); -+ wl_signal_add(&cursor->events.tablet_tool_tip, &tablet_tool_tip); -+ - - cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1); - wl_signal_add(&cursor_shape_mgr->events.request_set_shape, &request_set_cursor_shape); -@@ -2704,6 +2785,159 @@ tagmon(const Arg *arg) - setmon(sel, dirtomon(arg->i), 0); - } - -+void -+tabletapplymap(double x, double y, struct wlr_input_device *dev) -+{ -+ Client *p; -+ struct wlr_box geom = {0}; -+ if (tabletmaptosurface && tablet_curr_surface) { -+ toplevel_from_wlr_surface(tablet_curr_surface, &p, NULL); -+ if (p) { -+ for (; client_get_parent(p); p = client_get_parent(p)); -+ geom.x = p->geom.x + p->bw; -+ geom.y = p->geom.y + p->bw; -+ geom.width = p->geom.width - 2 * p->bw; -+ geom.height = p->geom.height - 2 * p->bw; -+ } -+ } -+ wlr_cursor_map_input_to_region(cursor, dev, &geom); -+ wlr_cursor_map_input_to_output(cursor, dev, selmon->wlr_output); -+} -+ -+void -+tablettoolmotion(struct wlr_tablet_v2_tablet_tool *tool, bool change_x, bool change_y, -+ double x, double y, double dx, double dy) -+{ -+ struct wlr_surface *surface = NULL; -+ double sx, sy; -+ -+ if (!change_x && !change_y) -+ return; -+ -+ tabletapplymap(x, y, tablet->wlr_device); -+ -+ // TODO: apply constraints -+ switch (tablet_tool->wlr_tool->type) { -+ case WLR_TABLET_TOOL_TYPE_LENS: -+ case WLR_TABLET_TOOL_TYPE_MOUSE: -+ wlr_cursor_move(cursor, tablet->wlr_device, dx, dy); -+ break; -+ default: -+ wlr_cursor_warp_absolute(cursor, tablet->wlr_device, change_x ? x : NAN, change_y ? y : NAN); -+ break; -+ } -+ -+ motionnotify(0, NULL, 0, 0, 0, 0); -+ -+ xytonode(cursor->x, cursor->y, &surface, NULL, NULL, &sx, &sy); -+ if (surface && !wlr_surface_accepts_tablet_v2(surface, tablet)) -+ surface = NULL; -+ -+ if (surface != tablet_curr_surface) { -+ if (tablet_curr_surface) { -+ // TODO: wait until all buttons released before leaving -+ if (tablet_tool) -+ wlr_tablet_v2_tablet_tool_notify_proximity_out(tablet_tool); -+ if (tablet_pad) -+ wlr_tablet_v2_tablet_pad_notify_leave(tablet_pad, tablet_curr_surface); -+ wl_list_remove(&destroy_tablet_surface_listener.link); -+ } -+ if (surface) { -+ if (tablet_pad) -+ wlr_tablet_v2_tablet_pad_notify_enter(tablet_pad, tablet, surface); -+ if (tablet_tool) -+ wlr_tablet_v2_tablet_tool_notify_proximity_in(tablet_tool, tablet, surface); -+ wl_signal_add(&surface->events.destroy, &destroy_tablet_surface_listener); -+ } -+ tablet_curr_surface = surface; -+ } -+ -+ if (surface) -+ wlr_tablet_v2_tablet_tool_notify_motion(tablet_tool, sx, sy); -+} -+ -+void -+tablettoolproximity(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_proximity_event *event = data; -+ struct wlr_tablet_tool *tool = event->tool; -+ -+ if (!tablet_tool) { -+ tablet_tool = wlr_tablet_tool_create(tablet_mgr, seat, tool); -+ wl_signal_add(&tablet_tool->wlr_tool->events.destroy, &tablet_tool_destroy); -+ wl_signal_add(&tablet_tool->events.set_cursor, &request_cursor); -+ } -+ -+ switch (event->state) { -+ case WLR_TABLET_TOOL_PROXIMITY_OUT: -+ wlr_tablet_v2_tablet_tool_notify_proximity_out(tablet_tool); -+ destroytabletsurfacenotify(NULL, NULL); -+ break; -+ case WLR_TABLET_TOOL_PROXIMITY_IN: -+ tablettoolmotion(tablet_tool, true, true, event->x, event->y, 0, 0); -+ break; -+ } -+} -+ -+void -+tablettoolaxis(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_axis_event *event = data; -+ -+ tablettoolmotion(tablet_tool, -+ event->updated_axes & WLR_TABLET_TOOL_AXIS_X, -+ event->updated_axes & WLR_TABLET_TOOL_AXIS_Y, -+ event->x, event->y, event->dx, event->dy); -+ -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_PRESSURE) -+ wlr_tablet_v2_tablet_tool_notify_pressure(tablet_tool, event->pressure); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_DISTANCE) -+ wlr_tablet_v2_tablet_tool_notify_distance(tablet_tool, event->distance); -+ if (event->updated_axes & (WLR_TABLET_TOOL_AXIS_TILT_X | WLR_TABLET_TOOL_AXIS_TILT_Y)) -+ { -+ printf("DEBUGGING: In axis event handling\n"); -+ wlr_tablet_v2_tablet_tool_notify_tilt(tablet_tool, event->tilt_x, event->tilt_y); -+ } -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_ROTATION) -+ wlr_tablet_v2_tablet_tool_notify_rotation(tablet_tool, event->rotation); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_SLIDER) -+ wlr_tablet_v2_tablet_tool_notify_slider(tablet_tool, event->slider); -+ if (event->updated_axes & WLR_TABLET_TOOL_AXIS_WHEEL) -+ wlr_tablet_v2_tablet_tool_notify_wheel(tablet_tool, event->wheel_delta, 0); -+} -+ -+void -+tablettoolbutton(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_button_event *event = data; -+ wlr_tablet_v2_tablet_tool_notify_button(tablet_tool, event->button, -+ (enum zwp_tablet_pad_v2_button_state)event->state); -+} -+ -+void -+tablettooltip(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tablet_tool_tip_event *event = data; -+ -+ if (!tablet_curr_surface) { -+ struct wlr_pointer_button_event fakeptrbtnevent = { -+ .button = BTN_LEFT, -+ .state = event->state == WLR_TABLET_TOOL_TIP_UP ? -+ WL_POINTER_BUTTON_STATE_RELEASED : WL_POINTER_BUTTON_STATE_PRESSED, -+ .time_msec = event->time_msec, -+ }; -+ buttonpress(NULL, (void *)&fakeptrbtnevent); -+ } -+ -+ if (event->state == WLR_TABLET_TOOL_TIP_UP) { -+ wlr_tablet_v2_tablet_tool_notify_up(tablet_tool); -+ return; -+ } -+ -+ wlr_tablet_v2_tablet_tool_notify_down(tablet_tool); -+ wlr_tablet_tool_v2_start_implicit_grab(tablet_tool); -+} -+ - void - tile(Monitor *m) - { --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/tagshift/README.md b/dwl-bak/dwl-patches/patches/tagshift/README.md deleted file mode 100644 index e3d7a03..0000000 --- a/dwl-bak/dwl-patches/patches/tagshift/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Port of the [tagshift](https://dwm.suckless.org/patches/tagshift/) patch into dwl. - -Allows a user to change his view and/or focused client into the next or previous tag. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/tagshift/tagshift.patch) -### Authors -- [h3nc4](https://codeberg.org/h3nc4) - me@h3nc4.com diff --git a/dwl-bak/dwl-patches/patches/tagshift/tagshift.patch b/dwl-bak/dwl-patches/patches/tagshift/tagshift.patch deleted file mode 100644 index fac6033..0000000 --- a/dwl-bak/dwl-patches/patches/tagshift/tagshift.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 938c63ad0a8a706fba0b4db1c66397e9defdcb92 Mon Sep 17 00:00:00 2001 -From: h3nc4 -Date: Mon, 17 Mar 2025 17:38:22 -0300 -Subject: [PATCH] port the tagshift patch from dwm - ---- - config.def.h | 4 ++++ - dwl.c | 37 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 41 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..72dbaa1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -131,6 +131,10 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, -+ { MODKEY, XKB_KEY_Left, shiftview, {.i = -1 } }, -+ { MODKEY, XKB_KEY_Right, shiftview, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Left, shifttag, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Right, shifttag, {.i = +1 } }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, -diff --git a/dwl.c b/dwl.c -index cf3ef70..be1e89e 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -333,6 +333,8 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); - static void setup(void); -+static void shiftview(const Arg *arg); -+static void shifttag(const Arg *arg); - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -2646,6 +2648,41 @@ setup(void) - #endif - } - -+void -+shiftview(const Arg *arg) -+{ -+ Arg a; -+ int nextseltags, curseltags = selmon->tagset[selmon->seltags]; -+ if (arg->i > 0) // left circular shift -+ nextseltags = (curseltags << arg->i) | (curseltags >> (TAGCOUNT - arg->i)); -+ else // right circular shift -+ nextseltags = curseltags >> (-arg->i) | (curseltags << (TAGCOUNT + arg->i)); -+ -+ a.i = nextseltags; // Change view to the new tag -+ view(&a); -+} -+ -+void -+shifttag(const Arg *arg) -+{ -+ Arg a; -+ int nextseltags, curseltags = selmon->tagset[selmon->seltags]; -+ Client *sel = focustop(selmon); -+ if (!sel) -+ return; -+ if (arg->i > 0) // left circular shift -+ nextseltags = (curseltags << arg->i) | (curseltags >> (TAGCOUNT - arg->i)); -+ else // right circular shift -+ nextseltags = curseltags >> (-arg->i) | (curseltags << (TAGCOUNT + arg->i)); -+ -+ sel->tags = nextseltags & TAGMASK;// Apply new tag to the client -+ a.i = nextseltags; // Change view to the new tag -+ view(&a); -+ -+ arrange(selmon); -+ printstatus(); // change to 'drawbars();' if using "bars" patch -+} -+ - void - spawn(const Arg *arg) - { --- -2.47.2 - diff --git a/dwl-bak/dwl-patches/patches/tearing/README.md b/dwl-bak/dwl-patches/patches/tearing/README.md deleted file mode 100644 index 45efbf9..0000000 --- a/dwl-bak/dwl-patches/patches/tearing/README.md +++ /dev/null @@ -1,17 +0,0 @@ -### Description -This patch adds support for tearing protocol. To get it working `export WLR_DRM_NO_ATOMIC=1` is probably required. -Some apps would send ASYNC hint and tearing will "just work", otherwise it's possible to force specified clients to tear with a rule. - -Set rules in the config.h (exact string match): -``` -static const ForceTearingRule force_tearing[] = { - {.title = "", .appid = "hl_linux"}, - {.title = "Warcraft III", .appid = ""}, - {.title = "", .appid = "gamescope"}, -}; -``` -### Download -- [git branch](https://codeberg.org/korei999/dwl/src/branch/tearing) -- [2025-04-22](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/tearing/tearing.patch) -### Authors -- [korei999](https://codeberg.org/korei999) diff --git a/dwl-bak/dwl-patches/patches/tearing/tearing.patch b/dwl-bak/dwl-patches/patches/tearing/tearing.patch deleted file mode 100644 index feea1fd..0000000 --- a/dwl-bak/dwl-patches/patches/tearing/tearing.patch +++ /dev/null @@ -1,362 +0,0 @@ -From c5216442cfb22eed7c2d4196f46c9ad8db3a5425 Mon Sep 17 00:00:00 2001 -From: korei999 -Date: Sun, 2 Feb 2025 13:44:41 +0200 -Subject: [PATCH] implement tearing protocol - ---- - Makefile | 5 +- - config.def.h | 8 +++ - dwl.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++---- - 3 files changed, 174 insertions(+), 15 deletions(-) - -diff --git a/Makefile b/Makefile -index 578194f..7d24970 100644 ---- a/Makefile -+++ b/Makefile -@@ -21,7 +21,7 @@ dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ - dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h tearing-control-v1-protocol.h - util.o: util.c util.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland -@@ -45,6 +45,9 @@ wlr-output-power-management-unstable-v1-protocol.h: - xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ -+tearing-control-v1-protocol.h: -+ $(WAYLAND_SCANNER) server-header \ -+ $(WAYLAND_PROTOCOLS)/staging/tearing-control/tearing-control-v1.xml $@ - - config.h: - cp config.def.h $@ -diff --git a/config.def.h b/config.def.h -index 22d2171..52d38d3 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -28,6 +28,14 @@ static const Rule rules[] = { - { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ - }; - -+/* tearing */ -+static int tearing_allowed = 1; -+static const ForceTearingRule force_tearing[] = { -+ {.title = "", .appid = "hl_linux"}, -+ {.title = "Warcraft III", .appid = ""}, -+ {.title = "", .appid = "gamescope"}, -+}; -+ - /* layout(s) */ - static const Layout layouts[] = { - /* symbol arrange function */ -diff --git a/dwl.c b/dwl.c -index 4816159..747e16f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -51,6 +51,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -86,6 +87,11 @@ enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ - enum { XDGShell, LayerShell, X11 }; /* client types */ - enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, NUM_LAYERS }; /* scene layers */ - -+typedef struct ForceTearingRule { -+ const char* title; -+ const char* appid; -+} ForceTearingRule; -+ - typedef union { - int i; - uint32_t ui; -@@ -139,6 +145,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ enum wp_tearing_control_v1_presentation_hint tearing_hint; - } Client; - - typedef struct { -@@ -239,6 +246,17 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+typedef struct TearingController { -+ struct wlr_tearing_control_v1 *tearing_control; -+ struct wl_listener set_hint; -+ struct wl_listener destroy; -+} TearingController; -+ -+typedef struct SendFrameDoneData { -+ struct timespec when; -+ struct Monitor *mon; -+} SendFrameDoneData; -+ - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -305,6 +323,7 @@ static void motionnotify(uint32_t time, struct wlr_input_device *device, double - double sy, double sx_unaccel, double sy_unaccel); - static void motionrelative(struct wl_listener *listener, void *data); - static void moveresize(const Arg *arg); -+static int moncantear(Monitor* m); - static void outputmgrapply(struct wl_listener *listener, void *data); - static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test); - static void outputmgrtest(struct wl_listener *listener, void *data); -@@ -319,6 +338,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void sendframedoneiterator(struct wlr_scene_buffer *buffer, int x, int y, void *user_data); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -333,6 +353,9 @@ static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -+static void tearingcontrollersethint(struct wl_listener *listener, void *data); -+static void tearingcontrollerdestroy(struct wl_listener *listener, void *data); -+static void tearingnewhint(struct wl_listener *listener, void *data); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -@@ -395,6 +418,8 @@ static struct wlr_session_lock_manager_v1 *session_lock_mgr; - static struct wlr_scene_rect *locked_bg; - static struct wlr_session_lock_v1 *cur_lock; - -+static struct wlr_tearing_control_manager_v1 *tearing_control_v1; -+ - static struct wlr_seat *seat; - static KeyboardGroup *kb_group; - static unsigned int cursor_mode; -@@ -435,6 +460,7 @@ static struct wl_listener request_set_cursor_shape = {.notify = setcursorshape}; - static struct wl_listener request_start_drag = {.notify = requeststartdrag}; - static struct wl_listener start_drag = {.notify = startdrag}; - static struct wl_listener new_session_lock = {.notify = locksession}; -+static struct wl_listener tearing_control_new_object = {.notify = tearingnewhint}; - - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); -@@ -779,6 +805,7 @@ cleanuplisteners(void) - wl_list_remove(&request_start_drag.link); - wl_list_remove(&start_drag.link); - wl_list_remove(&new_session_lock.link); -+ wl_list_remove(&tearing_control_new_object.link); - #ifdef XWAYLAND - wl_list_remove(&new_xwayland_surface.link); - wl_list_remove(&xwayland_ready.link); -@@ -1563,6 +1590,63 @@ handlesig(int signo) - quit(NULL); - } - -+void -+tearingcontrollersethint(struct wl_listener *listener, void *data) -+{ -+ Client *c = NULL, *i = NULL; -+ TearingController *controller = wl_container_of(listener, controller, set_hint); -+ -+ struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(controller->tearing_control->surface); -+#ifdef XWAYLAND -+ struct wlr_xwayland_surface *xsurface = wlr_xwayland_surface_try_from_wlr_surface(controller->tearing_control->surface); -+#endif -+ -+ wl_list_for_each(i, &fstack, flink) { -+ if (i->surface.xdg == surface -+#ifdef XWAYLAND -+ || i->surface.xwayland == xsurface -+#endif -+ ) { -+ c = i; -+ break; -+ } -+ } -+ -+ if (c) { -+ enum wp_tearing_control_v1_presentation_hint hint = controller->tearing_control->current; -+ fprintf( -+ stderr, "TEARING: found surface: %p(appid: '%s', title: '%s'), hint: %d(%s)\n", -+ (void*)c, client_get_appid(c), client_get_title(c), hint, hint ? "ASYNC" : "VSYNC" -+ ); -+ c->tearing_hint = controller->tearing_control->current; -+ } -+} -+ -+void -+tearingcontrollerdestroy(struct wl_listener *listener, void *data) -+{ -+ TearingController *controller = wl_container_of(listener, controller, destroy); -+ -+ wl_list_remove(&controller->set_hint.link); -+ wl_list_remove(&controller->destroy.link); -+ free(controller); -+} -+ -+void -+tearingnewhint(struct wl_listener *listener, void *data) -+{ -+ struct wlr_tearing_control_v1 *tearing_control = data; -+ TearingController *controller = ecalloc(1, sizeof(*controller)); -+ -+ controller->tearing_control = tearing_control; -+ -+ controller->set_hint.notify = tearingcontrollersethint; -+ wl_signal_add(&tearing_control->events.set_hint, &controller->set_hint); -+ -+ controller->destroy.notify = tearingcontrollerdestroy; -+ wl_signal_add(&tearing_control->events.destroy, &controller->destroy); -+} -+ - void - incnmaster(const Arg *arg) - { -@@ -1730,6 +1814,35 @@ locksession(struct wl_listener *listener, void *data) - wlr_session_lock_v1_send_locked(session_lock); - } - -+static inline void -+forcetearingrule(Client *c) -+{ -+ int success = 0; -+ const char* appid = client_get_appid(c); -+ const char* title = client_get_title(c); -+ -+ for (unsigned i = 0; i < LENGTH(force_tearing); ++i) { -+ if (appid) { -+ if (strcmp(force_tearing[i].appid, appid) == 0) { -+ success = 1; -+ break; -+ } -+ } -+ -+ if (title) { -+ if (strcmp(force_tearing[i].title, title) == 0) { -+ success = 1; -+ break; -+ } -+ } -+ } -+ -+ if (success) { -+ c->tearing_hint = WP_TEARING_CONTROL_V1_PRESENTATION_HINT_ASYNC; -+ fprintf(stderr, "Forcing tearing for appid: '%s', title: '%s'\n", appid, title); -+ } -+} -+ - void - mapnotify(struct wl_listener *listener, void *data) - { -@@ -1739,6 +1852,8 @@ mapnotify(struct wl_listener *listener, void *data) - Monitor *m; - int i; - -+ forcetearingrule(c); -+ - /* Create scene tree for this client and its border */ - c->scene = client_surface(c)->data = wlr_scene_tree_create(layers[LyrTile]); - /* Enabled later by a call to arrange() */ -@@ -1977,6 +2092,13 @@ moveresize(const Arg *arg) - } - } - -+int -+moncantear(Monitor* m) -+{ -+ Client *c = focustop(m); -+ return (c && c->isfullscreen && c->tearing_hint); /* 1 == ASYNC */ -+} -+ - void - outputmgrapply(struct wl_listener *listener, void *data) - { -@@ -2147,27 +2269,40 @@ quit(const Arg *arg) - void - rendermon(struct wl_listener *listener, void *data) - { -- /* This function is called every time an output is ready to display a frame, -- * generally at the output's refresh rate (e.g. 60Hz). */ - Monitor *m = wl_container_of(listener, m, frame); -- Client *c; -+ struct wlr_scene_output *scene_output = m->scene_output; - struct wlr_output_state pending = {0}; -- struct timespec now; -+ SendFrameDoneData frame_done_data = {0}; - -- /* Render if no XDG clients have an outstanding resize and are visible on -- * this monitor. */ -- wl_list_for_each(c, &clients, link) { -- if (c->resize && !c->isfloating && client_is_rendered_on_mon(c, m) && !client_is_stopped(c)) -- goto skip; -+ m->wlr_output->frame_pending = false; -+ -+ if (!wlr_scene_output_needs_frame(scene_output)) { -+ goto skip; - } - -- wlr_scene_output_commit(m->scene_output, NULL); -+ wlr_output_state_init(&pending); -+ if (!wlr_scene_output_build_state(m->scene_output, &pending, NULL)) { -+ goto skip; -+ } -+ -+ if (tearing_allowed && moncantear(m)) { -+ pending.tearing_page_flip = true; -+ -+ if (!wlr_output_test_state(m->wlr_output, &pending)) { -+ fprintf(stderr, "Output test failed on '%s', retrying without tearing page-flip\n", m->wlr_output->name); -+ pending.tearing_page_flip = false; -+ } -+ } -+ -+ if (!wlr_output_commit_state(m->wlr_output, &pending)) -+ fprintf(stderr, "Page-flip failed on output %s", m->wlr_output->name); - --skip: -- /* Let clients know a frame has been rendered */ -- clock_gettime(CLOCK_MONOTONIC, &now); -- wlr_scene_output_send_frame_done(m->scene_output, &now); - wlr_output_state_finish(&pending); -+ -+skip: -+ clock_gettime(CLOCK_MONOTONIC, &frame_done_data.when); -+ frame_done_data.mon = m; -+ wlr_scene_output_for_each_buffer(m->scene_output, sendframedoneiterator, &frame_done_data); - } - - void -@@ -2291,6 +2426,16 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+sendframedoneiterator(struct wlr_scene_buffer *buffer, int x, int y, void *user_data) -+{ -+ SendFrameDoneData *data = user_data; -+ if (buffer->primary_output != data->mon->scene_output) -+ return; -+ -+ wlr_scene_buffer_send_frame_done(buffer, &data->when); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2641,6 +2786,9 @@ setup(void) - wl_signal_add(&output_mgr->events.apply, &output_mgr_apply); - wl_signal_add(&output_mgr->events.test, &output_mgr_test); - -+ tearing_control_v1 = wlr_tearing_control_manager_v1_create(dpy, 1); -+ wl_signal_add(&tearing_control_v1->events.new_object, &tearing_control_new_object); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/titleurgent/README.md b/dwl-bak/dwl-patches/patches/titleurgent/README.md deleted file mode 100644 index aa4c99d..0000000 --- a/dwl-bak/dwl-patches/patches/titleurgent/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Whenever a client title changes set the client's urgent flag. - -Hacky solution I use to deal with qutebrowser not setting urgent flag when a new tab is opened. - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/titleurgent) -- [2024-01-02](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/titleurgent/titleurgent.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/titleurgent/titleurgent.patch b/dwl-bak/dwl-patches/patches/titleurgent/titleurgent.patch deleted file mode 100644 index 9a73f66..0000000 --- a/dwl-bak/dwl-patches/patches/titleurgent/titleurgent.patch +++ /dev/null @@ -1,80 +0,0 @@ -From ab002204c8bb7c8c36828aeb89ef3cf9b0447ea6 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Fri, 29 Dec 2023 19:02:11 +1000 -Subject: [PATCH] titleurgent - ---- - config.def.h | 8 +++++--- - dwl.c | 8 ++++++++ - 2 files changed, 13 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index a784eb4f..a5000901 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -21,10 +21,12 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - static int log_level = WLR_ERROR; - - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating titleurgent monitor */ - /* examples: */ -- { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ -- { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "Gimp_EXAMPLE", NULL, 0, 1, 0, -1 }, /* Start on currently visible tags floating, not tiled */ -+ { "firefox_EXAMPLE", NULL, 1 << 8, 0, 0, -1 }, /* Start on ONLY tag "9" */ -+ { "org.qutebrowser.qutebrowser_EXAMPLE", -+ NULL, 0, 0, 1, -1 }, - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index 6f041a0d..9486c435 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -138,6 +138,7 @@ typedef struct { - unsigned int bw; - uint32_t tags; - int isfloating, isurgent, isfullscreen; -+ int titleurgent; - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -@@ -228,6 +229,7 @@ typedef struct { - const char *title; - uint32_t tags; - int isfloating; -+ int titleurgent; - int monitor; - } Rule; - -@@ -455,6 +457,7 @@ applyrules(Client *c) - Monitor *mon = selmon, *m; - - c->isfloating = client_is_float_type(c); -+ c->titleurgent = 0; - if (!(appid = client_get_appid(c))) - appid = broken; - if (!(title = client_get_title(c))) -@@ -464,6 +467,7 @@ applyrules(Client *c) - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { - c->isfloating = r->isfloating; -+ c->titleurgent = r->titleurgent; - newtags |= r->tags; - i = 0; - wl_list_for_each(m, &mons, link) { -@@ -2821,6 +2825,10 @@ updatetitle(struct wl_listener *listener, void *data) - Client *c = wl_container_of(listener, c, set_title); - if (c == focustop(c->mon)) - printstatus(); -+ else if (c->titleurgent) { -+ c->isurgent = 1; -+ printstatus(); -+ } - } - - void --- -2.45.1 - diff --git a/dwl-bak/dwl-patches/patches/tmux-borders/README.md b/dwl-bak/dwl-patches/patches/tmux-borders/README.md deleted file mode 100644 index e203e76..0000000 --- a/dwl-bak/dwl-patches/patches/tmux-borders/README.md +++ /dev/null @@ -1,15 +0,0 @@ -### Description -This patch replaces the window borders of tiled windows with borders that are similar to those found in tmux. The result is that there are no more unnecessary borders along the monitor edges in tiled mode. Borders of floating windows are not affected. - -### Preview -![two clients](screenshot1.png) - -![three clients](screenshot2.png) - -### Download -- [git branch](/kerberoge/dwl/src/branch/tmux-borders) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/tmux-borders/tmux-borders-0.7.patch) - -### Authors -- [kerberoge](https://codeberg.org/kerberoge)\ - kerberoge at [dwl Discord](https://discord.gg/jJxZnrGPWN) diff --git a/dwl-bak/dwl-patches/patches/tmux-borders/screenshot1.png b/dwl-bak/dwl-patches/patches/tmux-borders/screenshot1.png deleted file mode 100644 index ed12cc5a7b5273d619bf937f5b0fa835e3fba72f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483118 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 z 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
n6uJtQyd(@mEba69 z42I*sy3#&AvI@J37l{JjcrP^aB<+~vhGFxDPg!sny2ZefnB%d7gZlf$D)LHsj*Qg? z#y^5R!P0ODK$UMx#07u(i{mcf;5MpvI;ICOH`U6&-sZxE4Ld#0=W&gwO6}8r8vP%T zq3KBh3)`M%|0`l-{DnZ5Gy0$}w41)qpN&Vx4Vv6_0t`Qr`a-4Ry+3>n|1$S{@Hzb= zaBnsr`qED*HICoo)6nk1B4e;LwXTSW!U z+>pdLC`ZO8YfpI)4n*%sV&4+uT4irlMQp$frVGbo{~(%xa|r;c5?`f|nR_%IlS}mu z$U;IcL7Z;*8?||WqevtqCC@k79nRX8Q*@kiqr9~X?k9Pz^nEZi=j1j1jR&{E{+TDqx7lo750%4y%}mkwDtW61Qt`_m?I0>SUhm%p#> zc*jdkkAJoHWmp=7JuoRtp;&&|rA`{~z+v^BavIstd=u~$hF4i;4CXrJjS%`_mKsv; zpbQN{%a0uqov5@+$Qgd7!(DuY1qUlm$)mQAo=!B*+O$?b> zYvHl`!y~%6ewu|#Mg$7>Als#CpTO9jOBn^myXOd`fP=ZA*ov_=e_FTXknnC`w`<5q~?I^yN4{r=;I$09+9G91XOdhG1vpU(BP0CzK_{YFHimb{h^VlsKlIn z|AvvZprw`PW%28>g@S3y7$gNeaa@<_2&x^l9X4^-#4Qi|f03Qyx2yB8(&D~mI6$F` z{(ec70#@cFjWm0!vWpbA^!KxG%B8GN=@=?xyRKL3y16ZfiAZ7?v1KhPQuOV)Xq}Up z&{lOh26d=Ih#@R=%_49KsuzlrZ#ZZoQr z%_Fui0q2QHu^^d3ky-=`nNk0JQ=^HA(8WTj8<5AIn`)2 z=C+$NKQ0<)ioQw;;xfics>pzJQO#Ga-~m<>bXoaWD3Pe4)6_g2G z=2^$Cu81*UkXral+t+QJA8Fgek8Wi&VW4mG&PsD5tHOcsCwL}`bsTx3A8p&w5Z+nB zK-9$s_M>(>J=auaa|=RPo}5qD_jds)MkQ5xh^N0$zGn#(O#r5QUE-E{ZEo(5DTA_G|tyD^fOo;)N4P_%O4X~v(8w;*uFD7FwF&XLMopAH1G zmOHvlhw55(f?4FKNhS(?)B1?W4RRY4smfqiXqvQSHI&E?f`#Hg<6NW56A$5j-SVdS z?53zA(hDhYAPWr*86L|&&cLFj{F}4iQ{UlLPNs)}wzF;2n|RUlo#b9)KVB#Gq!!`$U3jblDg% zP_%4X{q+e-!}{RwUuF!mJp7*w4hoj0NccV4+7o@mC_c<~^7u;D@6YoE{ zehy*_t@ii~DdHgFnA?Hs2Vn->9}14FtbW#}N|e7EwDK=Amy65lJbjTh%h?h>R8Vi%RP z5!}L$L$wll!Yr*LJ(yKL?u}*tB)$c6 zlxMTW^9B}s10pi^S0)l;_>dr`eP_FOgli5fIfqtD6IjykJP_91m@iPtghtc#g6?6I zGimUwK3D_VpP?Wt{WvU?>RQieeZqca)5tTRod-1@iBu8WB(eU+)9dxtfn|eyx&C7{ zTtjgfr&9i}QR63LYv1@KGI1v4>D>;dBc0rBO%av71p1A_CDqf!`e`tfbsg^lP zhw=+S30D{}l^)fJR5Sk!wQ-F=H+fsp=9rFK;Tg{N00$td@qD8_*b7#cB4Uu6S5{7F`%eigTc|^wi}h7Y8X7GmnFl z-bUB?Bp0m6+;!JFEf;&!SS7C--3QuWBvV66h0lbE>iZlBO~oFcW-LZUGCNa){`mJm%@gDYA8&W`>Bz z>(x@9H-{tH<|aK5Fs9T_w1QQ;Wg;Bi?a@H4eknSfV3vndmob?_uVb#Ee0oxdq!V-yzpB)w{93)GGw+) zM#s+!&xE61;LuFRSymIm;{ACWT1sRXxma$1Lz(4s0sB59$<`F=%G`J~U!UG+Q@41K zs$z0v=|yRKAB-5(@bR?bNZwXK9@Gf~0-Om@6bI_Hc*Yk2!8;Uyvlutnkb3+xWJViK z2ww7bmnVZfUpIdt+Y;TB%)qn_t1^Ho=jWQon}!m~Ads;% z@2P1M__(3`qs`}0MDu-7weUl!24_2hJm;ry9_HgZ1V}UC1!=oh*uIM0EiBD7QCS4` zzncze`juLZ3(YD7)5FkN5pS)PE@AE`_pA7OxrGYpyKi*RB6WLQSbb!YDO^||SL-4k z< zDoC-vm`$6CIu3EKgzcsmu%WZcpApCyHWz-;ty&??!goR`U;p-3eGsl=2kJza-bG6) zCZ%u&jwGCz8yPcn5PP)CaYzE4Hc#zv7CbZ3c-F+_Xt47^RSQ9@4OgoYLJ1Z-3orgOT zF_E1DU~1Y-+>@aTgPyQKnJWST#K`RItZh@nTIranAWBsLh8ouz9@SKIvDdk}a zchJWWDeDcluV$WyQx{YAJ>1+TJ^6lHf4dv4rY5JRa&Pk*t#ktN`L^II*5!&)n%oqS z*(h$2t3?#GrL)UBl|%!@E2mF>sdD@c>gXtjg?NsyqMyg)M581c2uFn7k`fsaW}+Vu z^6fmx_OK;%*Cp;+u5|iBtHh4st@xKGRVM1z5-&A#bR;r1_-CmCjafV%Z}Onigv7p2u9gUxo?gDA+v))oM>mLSl*e zS(h13j0Q8t^SpuNXkwQQsPEM0!j8}8?lKe!Zl-J0@~JvW;-T+<4dXvHvwjQ<_Qq$G z($)(Rn34g6P4XTl9%;S|5RjEDwoGROOdKjDx2?s=Vx250{YjEUrI`@_nuQw8#8>Y>0?uC|y{%&r zb7+2G&q5WB>?T`^y~cyZ?Jx#;tb_O1Ja-E?L1W*U?sZ4&zz<=9JZf$nAq5a1qC{9R zoKSb->rk8~_H?X&`>reMQJw?4Kg<|$MyFPdEiG*MAy&C+2*>bxhF77aTcGNj$cjsc zbTvQG#fm<|dO)~l;#yY=6g2dWaY*|at_(_RCGP!YolX;NAWlA^o)12Y^8dM{S;d#s zP7qF)(GJPP#NUQCi+p%zTMy#ji!r_pt%$dBv z;HY1W!8sR-mC7F$?+3Nm7yF6|^hfgtG?#DMt3Z_?GP%Y^LSOB^$RTEM-#*mtNCvws z<7*LqvCe^(s9F5X`nDuPCzUH%(#s#TtDRII3(z4|oTx~>SZXsIrlss*huV*y2=*Ep zTV?H0Zd(k!dpVM%m6vdmt}f6aeQo=kpD|no)}v!!P~hRHfqEYZ{FzF3JvfOjF456> zyC|gB@~R<##NHjm_{@$6!$GFKpdeLQ8WI||AO2bcF6$&!wM~td6T*ek93O$GfhH93V#(KqBf-J ztsx8eV^tz1!7ZOfAHaw~8EpTGbvOcsCdFf&xvPTPcyh|;KRf%X(_wU@}jDN6oo#8M$jmt}`7N`#T4>DtM0nS))6@`fSGvCB3vMVR!>@iHe z34dP?7AIt~;-iGLntj&#(&3Eb2;CI>6lRLDD3@#xClPhcxtN?5`nkK3^v{e`DF?H7 z*KCa!n^#skWNC6=wBeKxeJR9Gg3;&d4eikvF^mgKk;|Scrs#B@LE573SY!?2ps{On zt1DW2JLEM~>vR|BF73~Dt_=AXA@Hr#1~}0EP%+!nG8BS^;wB!ME6|{@fo+*j(QJ6d zQso*(r6=(hex(N&e!z@S298d6eH zUt3_cDhihIxG>)-k_T%+O_#AvwMhDFRWi=~x%-~18+R%`lApO~MEEKd?foVR?iV)R1W36M>8HlTZ33S|`DyNQ_N2R&A8zgQ{d)jV{KKmWehxq1wjP-`k&z zu2^;8j#8aJ0f82QJC@gzBaEM=dXgN)t1XjmsPH=zL8zQaCk?hU%?!fW2Rkh6Hv`?J zU?IVqGjyFHl`!S>V5b%dqB>LFMCIm|9VG#uxNscV@N;$yiL%cRypT6nngj)1)jwOj z0>&FWv6=LFpiVfw01=9norwAola7EXpV6(imBf-}%uJ1sf5zNx__Lez3!O$!<-Wf| z{&&>E!^z<4-4%B7BGXZEdMpP~aQ`+-0DfU(jIjz>ticKdZb%WG2uH-uz-WRZk0V)a zMEZv5p2V=nz@oZgA09UhPhNms45g#hi_=-7(;D$3n!B>uOoqlPePcH21$z{sN=|Ag zLOajlNNf&MplD$y&&JRC>In$%^%xILU>Zl%hg==nhq}d}R^Zb!$zOau)ueV(!JvVk z{hMbwH?vw*=BtHED~Gn3VkbE6AsEcz#_aI<>g;iH#ei7Top2$BbZ&}}pm zVgI4l>$df_Z&XdgnfP6_`=1Ja(1H4muX(fn*6$aR$FYDw{mwjb-#Gcd(}$XG!-b30 zcgZu2gD-UT6ADavW=VU;L7IYVi>`O|7tj)N#qUVp>&H2A7zqmP7LX+@{~4dBD|?my zq+>YXLgzrrq8wEk%-^5*5xD4uju}AK!=cKZsERZ;l6n?v2c(9OfMg{^)hE|rRR6h( zC3>t=;A|I@3*j^8>Xg;fnKORbtKzC9RH8xU>!4wFhPTGHfKjt&fKI}Nc8COaeLcK_ z8+h==mQKIu(@hjjN;=CL)FD&s9W1~W2Q*07647kk?M~?OOKWZKhq;G)y_R*D70%BL zr)9dfE0u}pI|{_uIF_}sUkM#ZKLKMc%4LCFxqh0g6G4!uc7)tz`lOKr+ORf*uL=_$ zIL!n0WVfR8wa2lzs0v4x1kj9dkToTZ1xAuM@q*C^(Km9tw)1WYO;Oa5_|IUA!8Ko# zI^vzpN)8X~!9R*zXmO@$j1})_=(u%!l2th+R!SUsya&7D5a&fmCVn^jrCZ7boa|_>hEq@(kcCxw3yZ9F4jYfZ^U><(6hsC>KGSa!}d_gK^ zN#b5hnl0-LoKBu>+~7>eX|(x05XGU!SsAB{&4k0kFR;FC4iT0QP`gd@z3Ub{1nIo{ zvyuN<7y}%0q)`(NZ^A#72*0ska`kgWB&kJ-&uNtVb$TdncK*JM9q;gd^JyKohZE%>%_+t>>1HXZ+tU|WfMu*h!V)OL2e z56ca?8csWSOJHKey~|%D1wMb5A955-Vx~?azO9s$WZye=q+-{V)gyJy8L$!he62f> zQC0)VPNuI30us^z9^ZE+wdMEjCo=j&Ui z$9BVuzdn)|xPR?3terj_Xr3ov4eg+mCX--xX&mB2?P&sw9o;^689LEmqC=CS8y@n6 z*G6D!Ko5~vGY2*3TPmIx`H~=EAPo9r6viGE_oK3gTKY~F)WA0 zIa~6uftG^E5`Kz#Kmr=`?>cH&4b$Ba377QKEe&*R1rM~=|6V06XbwfqI|GWSm4s%< zCd#eQP|1tg(iHfA5-k0=t)xV{+G`z>aMh%tR?pZA?BSEUSaxmoW+u8@^|eDMHaeZb z$#3{z--5vczHyG2mHY~kjq;n!7;kei4028H2F>1vo7Sj|L=1J3Xvl}x_Ye~3P|`5) zvDlz_Dh!i$T=cFyl&ZhS7!sm0 z|L^c!5s-HY^oZ-~!i6(=EpePefO!du-@_~UZB2!Pq*?fo7M`yFJp6|-4Mo^My{`*# zs#rJL6f|Lchx2^DNngCbXJKqx6jQeVnDSPZFrY{!*5y<$qo}!V?`p?4D?d$o@-FWu z;*SrF30SeY%MQURyI*#>Q|r(LlA@BRs%f%_v6x_FoI6%EalXmOGmBWGrj7oi+aus~ zq$Fvj^GkjA4oS4ilDtYgS(X0aXMIRMA(xfSnf0){h_AzdCe0yqkgb~5xKV8IsXFZ9 z=J*ayef9GJtx4l7TGF$DQcNB=!4>9pjbXq2o=IOn0i3_ag1pjAgb)r2B0>##CV*B{ zE(eQ+B{3+~i<)Y^CEBKbr#o@B%q{F+#V9URmSIHxCnrKTM7aO>EDj2@AZV&?=VF(b z;1jt)W$me5TEYcte`!(b;{PUbqp|9RQXG(#I9B8_W0d0kzKt!YO+OFJk=?KlM4(TlSYoC zCWGQ!0^gi9rRp0h3Hba|mV8=l6_xiffk|>A-SceF95|%NAf!1Y4qZjH&zQcM8)0EM z?|KH-YRyJqvj1jDI*Xs0$sMh&y3NYxysU{41N^hA`m@V6$osTf?X*^hci&AFn{`H-xV-MwpKPvMh? zgqI6ePf;?WrurL|z*3??{+g8ST@e`UbFUkyrI_?Qj?khQ6EZ;LG-z--0nd=}83+XfFAs7yxh9iArzu@4* zj`aRn?4@HrXNw>CQaO|p!BpKx+t^qAc9Y<(U0Xa7#2##qlZ#M=ULWVsoM+GTA#==p z{RWvw6k3UzPCERq{3}goUYIPB7GewmRFYbJ1-&@f741(Qt|hZfUyFi!$y0Kza9Kjb ziX`9jMTt}ghz7LgwFm>=8qV-X2tnR|Zs@R;tBd4$=DrD#DxPJ~H%2LI8A*4oYw5s+HswsU6KqwdU?9rJrR zx?jK;%%8rz_a%!F!+`^i5DG#z2ZenEhyeK+=`nCpsw;tIfU8vnc>2XA3ae4NY&DX= zZ9C&gi|i7R2aEJxJ_1|uIjsEYL@+wE#Qv{{Xn1%al_`B-96TsbMM+7iz8360TijuI z%_rwW@F>qifD$>tae3xC!$gN3cS)*KS3PM9S)?!7)why=ZCLD?>mFt@H-OE!WR0}`dcp)_g~kM7 z00E9KG>Y&_<)d1nRY01k&k7m9Dln`n94G4~KK{csbWx=X`C&9G|CdWRrn)&y`d}5w zwGj$3C<`V#TT1ml>91{up^^!){R1xDhZV*J7LT>nz~UZ@7~J*4ijH4TLsyIWccG5o z7O)(td5D;czQyMvx+1uq&9UB}%8Zifz`BCGwxHTiJfRY@vhZbz1KTV@rpO^A5;QVP zbU}N;)8PKWL5cinSkl2RD$vf?2Vl#YG@oq<@6Kd7hh><P?-&x_kOZiJP!cd3Y<_(Wh)<;3={Z^nUZ1hvv4&+c4EN| z`9lIv@9`Bz6z)@Kp>mYIS4ODkHp93x%g`E6LW_`PD3W_I@zK@iiF@?5YQI}?BZqwm5KUe(l z4mAY=R?pxQ%pIDCIF~UO3(6G}WlBcPLF!sas^}zf%B>d7n5)+#yGiaGaX8jBeaETO zLiAS7{3|dRzyw+n{dsoqK+?o@{`7ta3EdssM2n{~*+U8!#;M6yR^59DwC-fdHzU%p zK4YL;2?WS4YI zzM3+e%AEV-=FmzN4APo(@Se1sTvI zT%lT8GAKb1Jz4VI3`(A!nvxR09aHKl2vDFZJVHp|lH&-3CbS}W-{z2!%hr37Hd< zOvmvpcGDX&Ll^Om-N=&|m%mq$&;`#9pg_ixmE*dp@&L53yZv zTocuxF(xTcj08IZB%%M}bkZ+n(yaroEv?8k9q9`0$Wx=Hw2)SOP*`FxJls-G4Nb0K z{Qg7OV1q*d6K=cHDRF#KW@38myYY(nm$qB)P`B~py+dZoUFA5@2R@D~> zoHd;<<|cO#>G>s*J^TTsOn(XngYensKHZ&Gsdch$&2w9p+-E?uP2g11e~B38FaG;< zbE^aak~^68ulolzTQP_=X)D85iQk^#)PDYsDx6T3z{Dh-^i>n72RWRO!}9F|+C^6~ z%DE!*krU5a;;XVM-6s+&3Ji2~It}#DsL~KHNL^P~S5=j)%u&SDuSt8d#OzaiU#fgZ zJRr2ae2g_0M28j)0)@HU*hR;bZYo)8`sA*MT1Pd?>CLChMA_yWZ#f|Gsjhiw&~w$5 znw;w!GB~UkjrjX#&r`W`6n-U6$HZo4ak@sIQS;rU-aKKW&-t)p^`uh~=Vxi(ZEC8z zn85>eVZ>L{y4TSw&wayEuyBmMqo@o>Z3fNmYrB#WArMN$fkZ?OK-nyK$qR|fZ)yt) zUc}D~C$}Z`$-Wohw!VCD}BF#-eUDH`)LDJ7!t(SWcN61S1WMaKLHaCXcYh!5uR>NVQ*dT zVJc5p*!He7A&L!^rbbUDK;jK)(IURL0(u4o6}z|ArHrqMw<5YPCWD z{)V|U`*QJTk`=lPv4dCKIgGaIj=oCr{_KQZX@ke`q?+_6xuL9ralBQt^=rB-gLd*j ztJG5tWM9*Gm+piGoX}J40C1LXXfTPQya_QJY5w%-tq<#cbZ9|*V|ivLCiF_UDy-1A z$D7$RHy#42<4`n6B2;-9bu4x`nrwcsLM z=4{~#r=2E9w7O=dFCW)R8li%Nl2h807#73^E+4;bAWl>iY`k`xitoPAF>XwtckKS_ zD*n(tt_XQcG^8>Tr_9Jrss6OqvBXgAKbSx@{6l>y$4H~&Dh)#r(}xD_gQ~+7p*VR> zA%*C~Z~V@5WU9qp+dxW(f^~To6b2$0y=g97P5$vS2g8I4^% z3C#iCI&Q}<_}_ay1MS$) z*T#S`cGKdh`*xZu)a{FI6VMZQw^q#Mq@B~uwA=neI%ya1q#RxAs2DNu0+e|{pu*11 z&9qhzHNfZ_=^@Uy<-c5+Xt36gE$_EkQF<)q$+Zp}|Ch?Z06NEM%_`l`8MP|KFKu4Z zyVEgkTecciOI2Fjw5%#hF#+-^hNhv0>u43!2unl<`c zB#E$ic5GjlvBjS5z75Q&WqhP}+l;-n3tqP89IOVc0Y{E0f6`P^ahn&S>Xb~ z7b=)+7Ek#A#TIwXmZx>BFi<~LeC_n~*l>~VIz`}W?C~!$7wm4O>95$ov(h?w**&)Z z%ZK*4vb#7I0YH5mh@hb9OXAz5oSfy_G2NVx^{5}^`CxGp4-7$}qvQoi#G4k&8YLsz zhc0!w^SwRPk)Bo|2aTz+>gPtw4?s*irh|G92o}j}+#(-tt$vTLrKBZyH0d;!fr6+M zevaf71oWPNL#2|>VLL8<9Qnbh*WkH`kTO`d`dP!p$B*{fEbaaE{&RDX^I%<}%|ymq zi^qJ5kK5P38=>hHn#DeiWo>3e1LvzL%|Z^8?P?soYN1TGz-QzttNojq{IGL7oe~;o zxAyW%`;Dulc4{M~+4|z_ui)j-NR^?=XT(|XD6|sEaOgYnpUmW?3h`H;M$0|Nu`e0E zM4*|@!*0aG$?=ukcE9a6>OHL$JcfnR!miE#yE&F>$MkbP7;uX~3*|cGUUHg`{Qnda z?%GbL)){p;k*14m%GGW|g z4P(JU!U8-JQ&XWKgN<2m5MabHLomO{$;HOT%6_+Kyz&;v#Eh7$!iEv;t(Ct6wp@wJ zct%J;Y_P5GS5}e(KE2pvI7q9wicbhT@z5%Pa<1#Ig5On|>6YiVYHI$7KktRYZ^}`v zWNXkzjNT$Vl*LI&Pr`#lnkzLt3vUwN1oo*l_B$IK3aoO$l2y=X5oFDJ~n!>)5<{3p-(4g`hnZWMP3HbWcyhF)5FM zUWzzMH9_4kv-EZy>e>x^9Ns(p@>5@tiyS6$+`3AqQR?qfHPPNj$kxS$*MY&9Lf~3x>yAnohHhLdZv!ay^x7c zYDIn5JFPFO*BP@aVh>P#$pDEHH*u{Zp} z<}#RloJ9h|+a9HQ1ouy)R~Msyev+yZqbvI7=$d4}{b_f`s7i7Ti5}aCdii4Fm}8?(XjH5Zv9}i$1yU-Tu|h zFKVP1IkoGYEo;qh&bu?OjpN%$W|K(1@cayh`_rYB(|tB-YHA#sL~8Hj)#~0MH68b> z`9%kNhxmAlHSd%1$H%9f9AoxI2#|4w#LM<*SglWbVTI{smRJS><7@JPuB2|Osv5P7 zACQ03;B><4@$l=UeqiWsyOO%i83F{mx{*XJKZ9miA#uQ}u7VB?THPp|4BhG-Xk+K& zrfghX@okfV#L12HTmPS1(Co9xfIuJu3OSVjEF6++0?(gsd0*8Uer&Lq_RX4`fBtU!5O$*yM#>Nbv=TR6hOqSs3sGT0J%G*bNtk{ zyPM)TsU|7;d{K7+AUKcLLyIv4^rp@Rv+ioTGHL|Po%d%p?mNhj;N@Bu-C9*ErQ@p9 zRbV-r1}^96{&0Uh1$+^5@o>Q(+hM)-geWquSq}rU925V~fE z-7`f*a{0dAYv>XW?~RT(c1hli&P>My2YWnr%h1Z}N#>>A;DM#u10XyHGV8K0EF$T5 zHJkAX=?Io~ldT0-@^x=9$uk%0_sI;-RxYw!AWe=&wR}MA`M!gm)?i%S>~lXZWOOjX zCLcbp^Xg&sP6qz9>$~@x`|4r{-Bb*J4ok{u4-Ap~^0$EQpHmcq62x(Z>*8oEpJE3C z3^MCJQ}pzf9B___Q-u3Xf`*|oq5MDvzDIeJQ=aE$->QJa_e~)zwX*b`M)XrZLC{`c z{-p^hTh2W_7e)Zy?vd?-4@GlxxkRrO%LFxCfM6%`n_WJzJwo%ZaM4guQ0}W|akZei zk`I+wkY*ZYS}2EN8~b3z^E}l17rDD0?J|;P)ckTeKMLh+g;uBKv{#PrMKg7Q-TGP>D&3+%~Ny23A^R> zsfQ4;Ef4EVNJd|t1sqSk%Sh99?+Xok8;O?ZRS%foy#9REa`&J+r#9#a5pfm^Mh@%v zc%P%`st7(TEXOvMPDmrj@0*UsR`w=?k!QykL|&9A7|H@TPiZD(OjpWXC?A70(yIY5 z-of|8a-Sw28#Xn!s{#VjSIQm0IL=bxAMH+SS#>a7B7Le4ndv|{WB#;iEq%E6U; zV@nREg0z}-;@ZuMwRFfW>Qe1gS#1te(^DH!2=qQh@E@moLr{t}AIw1lC#vk46W@%{ z4kpuIwlmQm&iF59>6xR6=$o32qjKK2%RKD@;ljRL6Xf{8Ksq3{Ux_AHn7d5l)` zzgmEBVrs^#+)2Lovj_fgDanR|T|ypLam~$|xw%a5ZbPd4ptq;;q-YFRj0NP!*IHK)3naTa|#NWx{+3uLZAJ=G6IY$Q#s$m8d{m~OI zm==TOYjRzxfr&^W1%XEh)}SuEd~ABZ?OoL66BPfvxrKEtDdLT_J-XA7Ormbmv` zh(h~3+;59?JJ)Y2+Zw)jyZ{pnFhRdR9Oxdl^uL_M5cGffvf^-qLdaF-#Rvk4MH8ko z`#=B^UGRj;(Ge;yhrk1dXZvS5b@$!FY3f<;M_@1syLUX;yC+;xN0MEosWjGdN6Wxvw+8i@za) zest*f1MdO;!J{qfXE1r}0uKAr1HUsy((m2feF82=Z1KkRnZ4p57#O^on#c`mUAYXV z^EXrykZ>@6yJ@lgN|&YfkEb<{dqVz-Q)Hg+izdc|k2hKRpVN5{7Av&57AutSK(>1c z!`iKm8O-c8`GKs^AS4{{t$sqVv7qSObgo!u`h72uIl_3j<<}xpfo)4&Wa?Xh4kK8F zQ(xjs3Xcl{MTrTH`aLOq%~2;GhY0lhS(TR;2u-|Vl4&wdDaL-+@Tp~{YQoidv@ve zqtT3sO3advTUJ2sv`BNn{qn!TZoa_+fv#^{Dhi~TM)w0*)A(J^5fki;#E^Ab>+Bw< zwt$KRNnnGa4Y%VVgMz{EjM3Uf8~VjJ;3#tOuF>$LPFa?{mdNz`37hrUY8?)!%6RR$ ztb7Rw_$k(D=aMc-vp;xye*njn^S$Z{jW4%$;IupSt-*m`CT*`^JoRT(?vC)Mkcr$f zhQ3jAc#;}?6gcz*H*EX&s-%YEem%E!w{Lguy6o-r_OTZ>-*oI=YAZ94Dkxl?hLi7$ zqa?ZN^5N^OvJs<_xA%6@vFqN7>&f+?h+2Ey)ebS1E^*!&KkLw$dL0iNCO8KXR`!S~ zzM2X1?%{Dpd=V$SMI!N)mqH0tq&6@wM!fXxN^9noz1wNuev>A zOfTi7B?+RUDt~kzAxt=-_BeD}3ZKg~9$T&Vn7rBvVm6jqsIQBIN@iDX;bp(r>=yow zo~|J;-^4fDC*ueVq8s98(m=LR8@LR$4y%{@L|P3HsG_rC`hdvi2lc;NrX)LySz0@9 z2n)mqNVNC>Gsnig6FYU%mXp>|z9fF-K={MBxKG#3f1dG?@i|;W|Ly_VQosP?f{2?{ z%Ynk^qK@}feUdKumk2=lLB))XG-GGg0%@UK$!9sVL$K0V>19+icv7y=&XvJls#2~| zYCN9a>b#>52((QmGsp@}td~7s|5kTA+@)}xZL|Y{Oy8)0ke~Rg;M5e(nHlC_UhvyekUMx$aHTNHG%NB8UBm6URNrNlG#xad*Wlv0ZkG?|NZQc%9bjG}*TVHb67 zPF`VlLxBHkZE6=b+CTPH7}NJt?syq~c!y@JpM%16Q&2v*ekE+qL7a>~wy1GKcLYnqrh2NFd65J_Ok^||sltF$= zM%Pb=CtjAaRJzhSU4>$A%7X=gZdMIz2B16homsUK98Vc7NEGMLYu#{854cCS#AKn`KULiX5FKMumK9(s3K!lYx=(<4vLC zzlK!4p8y92Y4!*_C}uGJ&mYrdFO(o5KLKA;aiw1QeN7-UEla1GiX!!&gHNtP;bu_h zJ-zp!TJdwj__-PQksi%`f@s;ERP6Ilk;PKJ!<(1v-}JLW!a#3^0DOAq&a2v+2_bKM zbLrmR7J-ctVh4*E#WVmYDUz7$7FCzYxm_>iFEV)jtR|(PHl&~KQ>iyfVwedKxK)vB zwOcqeY|}hDY_CYGuM#V@?k0-Zxm-@GoZo_9&YNE@x5(T&-zsQmv5^q`0b$&vGyb< zNKFzn8@SUkQhRPw*WXJkjh%1%Cn}Xq+ZEjBO>Yg>fZ;*A>rosreCHcsvpOA6)(2sT z5gID9E3x;&mW1jxvuW&3MGR^wV=F^Ly3fpA;OY8!)fTWDmua)xboUf3U?PMVZuApK z!Gm1S_tex1^EG4LuC~88RfPq2$?=1;MC*?;J;9RzY>BuvwOdKC?b!QwBeZP@#y9Iw zL;wURjTWB}U+&I%ot8Ua))!9}VGuDA%zNj??0^+M7?$6${ zDB!G4B|hKGCRLvp&AD#YOPPQ!iKcSEMn?ixnZhw}puVpn)sug|MSoW~QM`wT40Sy= zt0@0PQ5a8Qk?D*13sr#%Sz!nRzE8$DP&R{W{ss&_TdDhX_j)wD-JGJL+vX|(kJy4R zbE$+{=+VxX8_lR9*`|ZQs_e2lJX@%8<__;L!z##KH1Z zN}oNLSWkma6-Xhcj4=0S379QTmCF}aEVVPe$*FyIL(!tCCNo7Kz?hRc8*i7nLF#iX zKX)hCIC8X_ra*7cdgSmxBTV7l2~kwAQ;ZG+;R`uALxf%;&TK)pJiG)>p6#ZCkdS{Q zdI$(I)B&01&=OuiUq8nPl7QrUry;6|iE(0|OSW$xT%KJG{PoFEI?cyVHoXon3m)hd zAhckqh{zHM-@%=$rOgNkQ1{Q+bNtK=nD zr9fi;H>V!HWeDUCwceCs3HM;jsjc^j@bHE54ciOAk4d|8D}!)t9yJ^X4tjI00Lf-= zQqlTi_I^}X&Pq$Y$ys8$LQ6dw{PU1B<{&|nBD4{idLHH@G-%i7`M8)C$Cnu~FoK>W zu^XzrBc+^cv7_FkyrB`}?8)juEtj5=Q9F}V^F$jL`U zD1$WctCe}UQp=oi|EI9uCgEc9_%Nfa@K7U8xoL-y;+*31!d_|uXwbmCjCkYqp zwGTc05$uhYKuBBRh0o&yt#%7OzxOM!{rQ~;+jmUNZ3q$}Np zLUPxsy#s;rT=h2mz^%=0v!?OmhwJ_7le^Q2etS3|fA-p!4zQ@~{sJsPDQQ}WCs8qD z+Etq=7L_=!L%oaIi>BwE=+bZb+fot|`>S(58Jb9FEVkL>39%n-fjEKXI%|=4TzF{L z4^+sVf%34(e&(C!XBbC1=<(FG+F$+bi3@_wp@RARfqmv`o7rx;zKl)N7T~$RO4)5# z%tnf+Z822o`;~Fa{(@u%4zOHkgXT?YXW2 zSRb17W(&gNDQHCJqF>V&wUj!~=hc#dEX%0MPMsX=sVH`~>|AA#NmX&>Vm6sr{WtZ?= z=W%K+U*AjHb%`xG%ELf18?D8OlKH?2dG!5CyfHWGv=^WER` zsIQyNZ&>mgS0HWkkA&nlaKuHkITN6AZw?C!laP>L$wngi4*3-*gV557gclhGe){z3 zG>>z@&L?oVr-F4?SO9W;n3Dd}Z9|92zi$M2TYGNqFo9KZ>sOTwGx8coPF90s{ zUb#YF>>G#}A4%W|1fRi=$>EhFDkYp0_sA?!U)f=Oh<8?4(F7h=_yQBs(9X5_@Q}e( zZB30J5)T(jnA7$`!3cs9ffY!xVU-@gIhfQ{Xhu*S-?`FCh$B7535!;o_zRfqG{FW@ zPGrz*H^J5{WbowgfNHW=S%^2X2X=|!g=DRD3S|l6;w|28Zz7|CRpPZXamC&~FIdob zY9hUr%kk_p{O^?65K{x@<;6a6d1dH5eh~v+r|$)=v!^)#|9RzW)A44#$q$P}#J1Za zik!;YZg)wB+IidK;0%Lu`2Jfmix@rxh3I^)8fe;IJ$aJpx-|p&HM?cH#uJ2(F%VAX zx<_}e8D7uSm7cBFePNvoz>;&Fki=$ajEQmBDdta1fAOHnn)cl$6e@9`^TnDJ7O?G^)U-KE(JEEd*Y_71?hYVSuXnU7L?MVQ9Yh~W zrXT@rrrLCRh%dB56`%B{?;hHA>`U^2}Vv`bKThtf$R9*`57OA zBI+y3G);W_)Xge0*!ArTM|yo{9V({g<@-k`=#H@yi2$cK3b>mz~F@Fv*NE{7? zfN!-KJ(*o6=K%SqB5^DQDe0w?1o7O7rDsA2s#lIeFRYAB+tzdl+>A{;rRM$e3o~qY zsnpcJGoXco@pPx`YrXTDJ5R*tlw^@{$e1F&hr1S4Tm^nSYy~~5$!hPHT1>=9zN8h#w>E>c0<&`r?1Li z#IkOUMLbtgbjx5f{7->ac_rUhoJRG{Do48mP?ostC#u|iJ3Z-*QXDrdx;j5vV|*Gwd21k*(|5Bd^$TCozH}%nXDXom|*#@FH7RYcZZW_9cK4@z@|NdulpQG9N7bQ@yql^RO`_PN*|ZvJRPPBC zoP?oME|zK2GlGJ4Er*vPIq3W5#(==?)D(6L&o?I^Aumh}P6a)_9W5tOf!au0ICJvl zxwNmv7-l{c4)~Vsb26JM6atK8Y_MP9uc+K~VD^fHh_Rx53)DKiJSO-FU5OoL3vNV2 z3MbNzmWvJU8}M7=*vd6!z{jIpPR9%$?8lpQ1uZllT2V5{f9GbSA@=PzuKdGe{mBR! zEGAatw&MojP~Go~x01pmTrQTF-;$D};XOsaT+Xv^;4+&l4~)#s%)|llSz$L6KpW7e zGgFnOd7(%5061*(In9@li6xv|t-9S@G?lOLFmFu)aY?T%?GigD-p^YvBMCH}>{|gi zwFe+jfh_nraU$K$Z;AgM8uYi>!ll!P2O88Q@2K~0p1E9Q2Aqw$z)FlnLznIJ`dcNSFX_g~M|@3{>E^ZshpN6q`rDP;eZaeMVE( z*U!j!rOL%jF8h-}YvFZKZ6mK-T`H4Cd*sV@ei}Owh`|I5IdC@~|1#i#bYm6O6wAZF~vC#OOiy@O1?)ZbJ&!$?SGOndke##Qu1WgLk@%N2BKWM2<0| z8f%U>Geb^V&_r&G9X&rR!*dcpq&*cQGUMyQL2u<<@2}<`OnUjkTech+ zJ&qK78L_dxW)|w3%tC;?s+$<)m+Czo-)M9R`7NFT#E|s*XQDiVe5-p*6nqK-eM)5Z z^IfzLKCmFJkKk|n;t;X2;pG)cp8W)-KCgW~LL|!I^V_1X{kACDD3wv{L|7Xu?M}TN z%-<4;bjgMatdx<$YEkdf?@z%Li|FX?`)SRO9F^KFo5=k$GhHR~W`L;{;G9T*xU*67 zZT*D^e+aGH4~>eq+WIKW=~p8z1%>YX@vQF9V%HJ6rs%4{_c_1!x6-T2#uXWjZ3*$e z+(w>y%bp;CtrFd!nYfk*OIx$6`~Z(=dJ`>4_tUMpNm27}F6vN@=}aHtiG6+D z6N5`oftZB-iBw=heguc#4yL(j9T?3Y-vU)3nfI#@DJ=Sl^v<6L6WWgRk&+)lAjt~B zucNF#ku~8#{+4iP>M4#S&?(1DSu;)frRj%hfdokD@{Vxy_{0+&|7(Bzux!dDPTpf+{ox5Bs)EArv5Ceb^8j3-~H zC=!v*nR>w|?*a{ov#;uSok(WNzkP+!srxB}3orr)G`5e#IWhd_`v6BZ( zE;4?griRAID6;=Qi7T)nbH)HXzbLM+5K-L}dgVt{$}3v*BxylinL&|@4p$%&BxuOn zR8$(362lPRg8ZdZoV)to=DcKLy+yPhKs_ZU)FUM&CGn#rfN_7BDnzQ~hM~3NyUk8) zbAzaKO?c3wCD!D6EqxTMRZvN}QSK_krpGxh`Ef7%$5j>eHlxbJ~DYfFz9gNvLNsS+RVmy+VD( z=L3_P?Y=_=!df2R3Z9|)Gzl3%7PtW5#G^=z#@@hFtXOHiMy>1BZ1{9N`OeCisNx_W zT$^n?FM20bg4(9I{5f3^a>~CM<}LyajD?4wr5$^n+pvH@m|ToYO5^2r1^(^HGN}_f zvk>mZ{g+k1GRHpQ>s>|1^Dv3rSTZ|(;%O}+)`Wjx**38$KHQlyS{<;0mQj81A5htZ zMgiOnV);o({4gK!|4D?2XAA=wjVzJnGoDf&;&_FQAio+f8PES9c9Y8;zcl$qf`RZ$ zWw^tg{1pdc_vZNz7Kr(pe714p!iD@DRsz>rDH;(mG(?s@zJ5Lkc3V%m@6#A@S`qGz z07ivlJ1J6Cb~%acho>zdul(PJ{sgS}U2z!oYfkyCAdhZ8wbpuqaj99)?|wd-{^HVw zg~$!0KILj20fP_DwFb?hQccjed;W6kL_R09+G-U*4m$Z8G|cpOb^iBF&$k)-eCE*; z*ckJSioaRLAnJ15eCSVb<$q^Geu*Se1R61MTp`3kfA1qL@y+R%w?m^IEn3k-kX;$w zZ8lcItV(zGZmUv9Ss!{dLSgOSWKhW+uq(Vr!-(=v(RJFI`ypR2o5F{M@wqDu7ij#(;h6o?Z>hSQ%a{O}vLu0F}v0C?_ODy5DMc&xwx$2MIAIWZ$T1 z#hejdw@9c`aT|Y4>~9grpJSv)<-28xtuYH6Wj20zJ6JO7|Or`trGxS2wmXin$`&n{z1443}tCj^TB$RV~KrGEbmg=vZB7Jf* zI96(M5)eF8Y{PTuuo7uEi#UQ0MbJ@*df4ay{vZ;nf*o{mcyUg2UcaiW$Ls+WX*;|e zGN%sYJCo3=4oU)@;yNQd(Wl-@Wh4B`#P0vR;QGSGFBlEf1mzNU#Yxh_M}F);pY%)PD&rI=dQ@o8p47LilVh zI6|?EpOyGQOQ&60SRuEHY-%CXZi#cx%!QOqxQlpO5(kSe4Kf@W2O>~jQ8A88a0*nU zC=7yz_znUEzIyurblC;VVq3manxnc`9r++OmLZR@vDX(@lLuNU0>PfgM`D&!sL zI(PfvIUjQ@)!yG&2Ekc142vqt^GGD&Q-i+S-Cu?!*VC0tK2txa;Gh)mzKiN8iyOHs zJ4+!oX;6&%eatT@#%2BFNChzGA87!K1iBoA{k8#~oF96QCc+km)m}x5NHw7|`Mb02 zmQHz#($K$6O3a0K%r3pi!2C8yocK!cyn5gs^I31TugWoSQ+D=^WNq&3v?zY4ZHX6jzBaAbU% z*i)FN%PgbnNu9p|HYCgau0K#B!T-k_V;K5>DqlVOP0{&l&sOcinC?r!vL9~9Q~wkp#l}gM6twkI=jS@ zgq){Ft+9Y?BH7&nP#I2A^O0?X1}@CLzHKvTr3SiLh*+4P5@mKxef0yWJ z@fD2>?QR)!$5DU-LIS_UlbtbCbtt-mcSwU9Miq63hF}kcv+*v^Nd+z6*w%U6o=9!WY`N!B% z@y-bel`pjzm?f8JWGh3*Ru*L2v|>UA|ecn zPk?q{cRbKO-xZfhku4R{ZI}>RK3(5ml~1Sv(ia4%tJrShsqE!ekbF?2q`4AL?V=}w z<(HUQ4yDJvpSa1({XT+ECwAzxY_l>_kY7Gc^!iJaAyw|MBrNCbUkwf5=&h?vO>Yd5 zi@hYtBka^O@CqIC>jY#U7dcZQuX)3|jBMo@;SIC+mD_ibLhcP?yH(aF@tZ_qfB6&r zyUalyCQm=_-AzO~AR0o<2nYSNBY8?hy*J9YgGWKn(sKuS%W^oS1W{-h)Ii7r39q6@S;cL9Pl4T!~9Mkmw4;3=55INl(t zf=_=e`%Uy~=I!S>7E;?7fRM4jdl5z?yjnAjC~U?g82@6|APYkvV^fzdFNm0SDN z%rm_4@3P5V)NeZoSDpc;T?N$G22wM)k*I8asI5_t=D&Q#S+u#0hY!bp-W4$7NE!+t zqTGFphg65F%eAOGNlf!nZy$L1uF0YA9m(IM*+Z9um;?;P$HmzU98;FS^>{YsfbIUw ztM3fON_q<^%YAuuLM1ZdM)`FKq#Nwfp+cbQd$0Kf(*BQ$5jI~_l^_4B1wfhdwab$4 zQ3wGId%!5dMOndNEB5`sn$GoW<`!&BZK=pP4nHY*wA>Y{wo>;-tTPhr-L<_Rp~*5e zYqnLJ3uRBI8ROdWhm#%*&m=*D6%M4V|8Pym&2@=G{J;8YVq@A^>4>_#p~-twRY5dg zjOnt+WK~VUhGit50hM_6(=F@j-n?0oUVX=gMO8;O6eKuz3?C|dQm4O$yNrh}JaGnW zMxvN@=0njY=v1#qinW6 zwqUk=lBUXD^A+#M2#|7NR7^BbE1y-LLsdLRDyAUj>W@TM_|BIrDXKp5LHTi_F1Lt! zkP9Pj{2Em?!H%Oe7@Kjk1%fUIIth4WJF?h&6@g_NH!q8Fz^)>O@+=8gRrW1PyI8?C zAd~E*CC8lVy@X!326X8`IFw?oB{C?p{D<>%LCS}3w=%0FxD+7)bb`(2npkw(2uvYF zAG&{rYR-|9`b~a9)dXg);vcWZLTNq$-ZEad@VT}e-xhKJw^JBtE_B(?pxD^hpCOha z@Y8}FXeNUV2-3@H?aA!j3EC2n!-Y3O8~ zXfgx{MG8!#;zlPb$ZtDN3SCou3CDKEl~h4{XCL^?s1n`_Uz=J&UP3aCeY2-9_))XP zHByBpX|C|d;nSRvNmQ*Ps@e0f{ENcAso}gWvr|(j?kfINBG78SQMJU@)5wKuFTv>) z)6^8HD|i23WG+Xc7-P`PDE2i#(*Lwd18!lRNB?XpoVEa&rmsrDwfwtr zqM4B%G@7zxbo16&+iuIaVyf#s=0Ox}26B1D^y&aKQ9(rsVx;RyU6bN~2nIccxElN0!eyv8R*a8QD9(?Tj&BREdR(SmeJVHo6=ga0s_qVW%b-WUsqM z5LQ)6Xw}0X<8b0eqZ@j$_P|@buniP4QSwUc6cD~SMi2Y^LA89VASIH}*6wzftj{je*}q6M$`8 z*4^XPiGi63co~rjFvt_Pu*Uy59BXIbB@Vi29%c3yks=@rMR0eT64*o#MdNWlo%q-p zQ8^di)hGTnDa886o?Jx!FMGn^9GRENS5d4>Z(-%0P7{wjujo8Y)M5wt4Un17701_* zQN9%Hx2<$TD`L_9{T1I1yiQlJ`J1G=1tdV-+!saRm~q?J3`V$wBVuU{C4PB2xjvN) zX23`Jk9ZeCfHC!t*Fg4^F^tBPU!T4d<03o>d6BP!QDCnge%9HQD^TViQx#i`FmuVN zCEJ<|toyRWV>z?LLQr|03@CqxAN}Nk_SxI`hgIe+`9B>gS4PsUp{RXfB6(3)27{j5 zM>KFS>vk_zz(vrgRNx1+l;Nl)&db9|VApw!_KPzho7ak0AJEgJ4vzG<=-rM}yKN+F?K&e^u$= zzUoA&vLMm=93jW2Tom%2K?o)XwUCe-S#PB(c1``BYgfAfbe&6Wtf^mcAwiPi5eM{I zj{B$TO2y6Boa@X2LT-dw`yBaDR&p?64Z;Z?z90X4@zzSF1|^lRJo8d~OM zH4&sYQ~YCUBAJfcouT{c2yZKDOTrr0>_^|c+)+KAlTox=Wga)l6cgyyUGEZ_Z}u}e z+(yL7>U@ku$QaIW8>pU}>{2uzN^Y{U1Dwz9O%UJ(B_I71GyVjD|Val z2Kuik)r@52K&`f``9lj{vy%0HARK4$l8A7m6msMsA#&5jf-V67_E8j)>ZMK)xyKO- zRW}8JHhI-VWm?$&s9xjLj`75P!$%Y1Hl#tJLxF}=J~{1ZoxHjcRad!53hu_IGHhq|$3~5)LEsC8B@J#fX4KvpnY)`2{lAzEr*p|K zbP^CjVSfH%qG=ah!KqfOFhEdpYGhXo8*fQW_CCDWbVSLgE%q%n!4b33{MrtP9U4?ST3V&mN= zpk3xtnW0jun$BnN8T<^?Ybx6wU;ouUfxcVj`h(ZiuvkC_b_*{h7HIR-@_MP0!uz2& z2IPx!w%mTTOf%VbX)mY;0ottWl*KI?t)Y+&s@1^MXFT`-2}2_K31F)QgE!grkRyw`b+5DjZ?w9xaWY$@@g*2R31$EaV0?_htHa zPmshWv1!cj*ltMiU|oD3DJpIJ$1*C3#j!PX7?9Y$`?!UOqV&`U0ax=KeZm+@M#gC- z^~j|I;4~=WbpNEEf^z@lNqBH*8Rc%*2{hD!pC+JyvSV9WiU=bqhq>!>%k+f%wHYHo zuqW~=j4)@2tOi+f+N^u>(H3(iIA7vXOJTZb`r;Utj_eam5OAxlK9LTy3h1}D83k3X zi$6mi5&gLniGF$Q2!TcV!*j=-EMNpv=A68V{8!Qx{$P;^?|6xt57;$p0wtmZpn3cq zAaTT^37|lyYn}W)2Nksk6VxNFycvbTC{G)=ne;ksp)pAAuAA4GG(N8zaz3X+@0+=D zU>?`Q=@6puVE4gjg2|0$8sIN`#bO{q_XK}qIx~2j5X2pB9OPmEAS1Dv;w>L5BX{y_ zw)7yUxz?f45Woi+cB{pZJDT>hA>No5^PJBA>VZ#_-89*a%6=?px!VR)R;_I;OTRc@ z4@9!yqplaK$&rp>dxlDmY26!jHxZF+3^%HlSt5gn64o?7O%v{ksyNl?71C*vt zqCy)|p6WI_qX`IOZ4IW6=8Fw?bpUcwP&u&@SMPd$%Ex=5!j@Y5$Ok?oqxnn=U@!o% zlCO*f2``P!ZT$7FZ#7NV+x_avgj{gy;Kqx=+R}O9`Ob_claMd6^wlJDYRlBieZAFm zqHJ|Mxfl@(3FozFa0dcSxzt?*Sl9r*=Wht-(i7*>h`gz4DG9V3Kj$~Er__mCzeId<&USbCg6@MYJ>fvRXd*EHFm9r zpLYYUk^z{*>%TCE!QrNuh{SK)h=cKVwTl08Hevaq7a0$9Y0NYx4*SRwZG)a z;J1K`z1c+iVI|~LU|BtlJ;(SqCDXmtLxmwYrML}qqYtdb-{|NHl-OgtOcX`QKGsU( z-X*t*PkpmxLWU=aYqyh!&G{iDB$O|i@U3Q2akbIkOBCMiG>9JxWa!BV4RkJ;qWqO| zH^IC2p?M|$DMr@}^X;rtQB&J39gL!@Je{Q9b5&Ti{He!5D$!^>pO**=3*V`)lm^Ed zUH<$JkaJWDprP%LueGqOZHh|7qHoW4s`Q%IfB@`}yI)*e7#0UZ>#(t)Mo5|QJX`$|8O@Q$I%_+ zGn{*g9xI-Fr8l=@oib^m7&W4WVNlHvcyPDs6?EJ$E>W-rRI4`2P8rh%SMzR7z zwtfJWvDR+&=FnT+$`xz0nuGxHuv#9rySVr`?WT&w5aB%?kKP^6_p79FI#{c?y948- zq*l@M57V%5avw-$P80iyB%SSXe`@9IkP4_(BQZxY`2WqtyEOFekH;sR&CSEZ_12wt zs-CZ&3JO582Lu8Lcb}`hzNOBI*|dsZxAb-LNd?k6MEjy_-XH6szELkV8+b4~N%&?t zgrLltjGc0CcC(dh$Y68tPx7PEX*LUKx~+r$Aw^{>njisV(Pb=M*)(1ozQ*ipr!6p_ zmnb08*l)jD;%sg|KfgK(xgg?kJbd84h5%he5CJa2yvm0=5Zwp!VJ zyHDNTd~5e$K3@KXnwQVRwEyrQzQ%QorUic}1lC4u{o;XMJEg_ppyF3$8xH{djwTjH zd!LN^yt8PdK^Ncxs~Y72)BNE^W#!yWa}*wHAMg9knEKfMESudyG=XRg!NdMaZYrzA zb0<;9M(4Z0K#S9H%l+AkPi{*^+Ufvue@nq+8VsoD_wU;cvkmPg*Q>o>l|Oz3 zK(holV!72t7uZ*x%t;LYs8-IFD@2(=8y}UbP>Cm07;AAo>*4U&KRu3&^!9SE{85if zbhPr)Q5VT-QtZ}ScK7k0XVl?BK4QmR-k^FDFt4G0n5nShY+h74;{t}V4H(KU0Gs`X z{Dim^7H!|ZT!oAS+|9oW-;Eu7c{o|z>ENSC)tQ#3*gDw53a_WbMoK|u2Rv=g-AW_GSZQ={+yn(#1S6l;%Qz2Mv2NVFa0Mv;Qu3x5oL zYk)tWFj@b~Dsutuq>e6XN2) zqgbKSMS1}~a&OMlGx?eC7CGrHR3Y0!jTOOVxKSth<-vco7qxum3A~P1XOz%-C>QBz zcro4Luvl7X0*Sg)SIU&7Dg{0+`YVwCKjA4Hu1ct(!uv+ z@V=z1t+IUyvReSMvp&=5_}_IF4r-$hbhH|+uz9NggWk3*C(?$`ERG&q?(qHz*xPyC zziHJ3zW(^}qv?x>=A_5@dK)X=XlJ3=!(K7Xm2+7zpjdiIqSdUnShRL)^(Hkd(}#oK zo1l#2r;tU35+UmM^@>K1#w+G)3Z-v?t}}Dx$@thC3}!JHc*-I5%rhQO0fD$Qr;;5G zEWRw-=dd}rFhOpGSdiG_x7iS)l2pWWF3s{NX(ydLwGex4@DXK>fc=&PNb~^DEp@@kej- ziB&hitwX6$_6*p^mv|Z3FVdxp@!YiKdr#48b$Y)6otP+f^&~oNE;k^9a?NAcf=%Ch zSGW|dlulb^t7Z;!CdPE&wAqn}NfqO0tvjtn*>2V_JI6*x52uR z=l18j5sm85Z+bdDw_}zygkSzckye}Kl7GJx2&7aX(+a4V z0|*Hp_qj_RWj^g#j>)#&r#vU8vQeXiJJG5mfc`L@!L`tp<#O!5|AhekjV?Ez4-yh^ z!~XS7tOCk*!ejpoc7ps5s}UI3_f@52u1NK4Y^he7Ra8M{!2DIV7$QGIw}l7OPkizw zjm|xgfYaUa{1pb?m*9yT0DJgvH$kVmB&ym?E)v=x-yTSHZI_2bolfueR`+}AZ{Gw! z_}tD~Crsj9WM2VkjZ_j{I)FAkWVG*60{bflkBQ2E1KTQl2I!}p^6l5F{P$>7V<(vp zLK`yx|BZF(R5nbdGsOozzb$8K0aRxmO8^Z*06jV{qc(0VoGI+5+b`t;vD9{uJ+Yq# zW?d(A@!1LBp${8(-N<8^02kCi0klXS$Vi6(@)Aa+&V0w z{K9KB{Lu`kAjCz-Qy+JiePf7nqIlA*KlS&x8duZpJuU!|6i2($ zc!iB<=IFQ(hH#Rj%3DP(=~F=r-Q(5d(ROY!Ab&(;{tN+{*t4Ob%0PMyvBt*%y$6334QM z6u@uw<0192iWfHMV9V3Ud5OT6uL)>nIOU8gwJ)2ceNCbKlx@p_L~J_Kbmd{Nj`PqR z!tK0k&>UAACUYnRbqhnv3j|a?sw)O-(8J*MMXs&kEecsmihJjTZ?UX*4R%5aWSJ~ zgfayH{2+;OvE1mmPZ%bwY!tma{=-=gm@Jg1u)3TtM@9S#G3Aw-NzEFQNsS@mUU=xx zQ7Qz2(kpd>V1n>e+OlD@9%HfzrKBdY?;j0llIWKIBquzqT#PEJrSUj@m5gUnSuAMV z@Qy#8f!)3%adG-*V_}vwkU~GQ(&)qQ*5dYX-j0gw>Rb701`@C@PthP7QN&_vx=+zP zpeNP^uE9w-9`7+~k3}pfu&-}s#&@a3zk8GD7^CI5Lv2OxD*+&TKmkL7&}8Die#x%Y zVnuVRAdR;vPbs)C%Gvx!%K$j?KU#)Td(2XMJe7^tb5~rCgiM5Q6V(sc0`wC4SoX&S z;nlM3?Y%Wv_KyHF9|Xu;Jw3PP|4qV_c_hM?s8#Zvh7JB`%=m2Es!FH+C%K+_G0fSl ztM6Y80~s61e?XcFSTM*h)%A-YKwUdmfxR=Omw#x|FxCP%t%1OrsImIw&Oc$eQCu+e zuk}7x+(T;3&Nm(_k$>R+$NgH<aX>AOf*{Bm`JEPN`@FRs0j4Qo zJoz%4*r`z-xcfUeKnKYGo7tWEvIG*y-VB0@Owt3u7W9*(%paX?_G_^0ZMS-}YW(9k zoR>Y_YtyOdFmFK@mx>Ts|a;kMF12E?Ss__nFNP`hLX3U+=>aD4s<2il=`l&O>{I=|?CS#8mfv zk2hs$_#WT(-5_dzZ?FG{U>CyIpD>893?Ew|KNI`Ie2n$Dcm@BVt!=IKaIwj5-asW< zYvp#BNUmW%NaN(**|g}OAqDJFhu;y*rPg`Sye=b}GdpIk_Q(dKAG}*lLMx2uQ{{1#8jHw%QA3Nom0jtqG%_ajDU zu8$6XIOnhOk_UcPK9UGidNMR@WRX1B+aI|R;O!Z@?olCrQwrJUW&iGWv9}BRKs3i! zR1Rn#tn`D?uKj+7<_^sSb1?p<{6ljN0)Wc!+LTQa(wO*7blY_V<9K@3JX7|ivgYQ8 z_V)JBVM2sYWFS!7b&nTexM6%;QaH&6cDOqI%La~JrI9cafcg5vWuPi;nfAM>Ms~}X z$u2BPG@c6g*Dj2a>xWTL)91XK{I&7n;Um_c@~sVqF}Nx5slv2LxR_yh?B3u#wc#c` zR8`ORK(9M%_456C8lS%2BqpjoTpkw65Jfs}0f*s_Nh3DlCVEs39+WnBxV>FyT)Sjmzut;% zQF0mvs>0a&^&%?-Pr&0{)ztI{l}L1G_Ye2Ve3!jOx$3EVgWJ77Iv+1m&Pu{iLFTu!o-=53`J6(ipYHKiDAvD{dHKO|4oD;s5 zi{cnZs9yqE*C5|CB|Fgvn>U>kygH_D2fN*6xgIxkUzpJmWVI~4)0}Y>F?mW8Zih)s zdrQMD=$-n@(wOb+g)|T{h{J?JLB68#HYc*IEwC@JPQ$JC;Oi2%r$!qNc4!GnWQc6k zMZuXz#WJu0H?@f|gWQuA8fgDbpFBPVHt^OF=g&qs=HM)bp&`u&Az!q>%TyyNdwYi@ z&-OI0aCie|*~bs`^Uf4deh{FntSVcRzZD9-Ax58UrgGcbatEV3*J=lU84PZmPkTLd zyw!cOcf=s*a+bB4u+NwYEmA}pDZ0*r!OVi6WVscFuivUyYh|@wJ>-9XBXVQr=YM~W zN~M3>h*(We0$;o>a@4a2-Bt^Kg+w)Q&MtszwDu$rT2^aWp)1qAe*;f znRiaFdrMW-g@BNl<9Q=C_X&?zjtB6YC^Ft=<~$FtR}fx8py+oN)4xCGF7;$m**+L8 z@T+V|bjN>HDRQDgmNPoXz{1KD7yr@hKHe3p$G5(2wNghBQd=mOdHp%}=kHpR8a=o2 zFRs5x!$^vIc`8tnzxhvE0b)?i%e(|c5Qvc1{Wh%?4(NCr`c^e$5=|2L8Ox+%M~Q++ ze5;y$Zt%>^Ah+bwKYj3_X9upo)ga_P?_K!^Ro@&5pT0kr6oOAdzDXSd{H8Z-o#`*< zlh3@VBW`ezpf25Ftdy6Rhzy4RL)TkH#T9Mqx`n&DyF0-lxVyUt2oAv=f&_O6?(QxX z+}(n^yCx7^&RlDsecOGwx8AB%wHkBI8ru8!|Gg8Pl_OTutx%gxp)1)!%9bFfteYpd#t`cFwvQ4(?4v%BcZ&X+2Q4|qoBYS-wu{LCW* z?A>;ZyFNumuCD5#MeZs{fPbJo{JD2r&opLbfG&zfl-Y@fAt%@&kY6V0vIssBMi5%m%&fpV>lCm|vk~jVa&bj) zRU>7b9;y3;_a38S;%3nU48zH~Z1EGX$0nxUMP%aydf>&%3X6@EBUkp~nkPp7^u)@X zls-ZQeaoli4lXlyY(WG5_VXp2b-S2;4V{qwBIW|6;1@Jf!xk$CAD`hi1w0~$OOoPz zn~0W78SENqWiTY+KP*?VtxbP}BrCMH^C~&`0&Uj-WPO}f>rrY6Ei^Uxu;skxQT11B z#38R|`ePf%)`#dd0nt=K_srP0=7Aq4R%DYb`>(<2-&> zqf#I+&fx~vjNf9rh=^>h*W(DBL;~kazeBKeb#=CvB@5%XImlQm*Yf@HzWrJAxufUb zR>ba18{#VfEh!Q5u61hFqpX%=44_@E&o@YfW70$7R4soHb9&8&e*2QiV?&HT>jI3S z`7$MU7_q9w%-qDeiZ5`lsV5hDpDML(4~ExR);&Ty1>3c!2&F^J#t$MXOBe-T@~C9u zr*iqjRn(i}C5i(ePPU&?xWgEF}*ky@mmA#LK@wupt@WN(k&fhx$PoX+IpCw~{K zEDDKic!5f|7Y1EEhvTXCwgDjeA$rWt*YeI{^u=Aerc#}%BL<2%5H#hd+7SaMWU^=0 z7DI;P51($W{GLFKkiMJuQH;gT%0zJ=U*DNGFKwXqH?Tkg+E)O~?Z&brLKge5g50G5 zfvSx^ZfE;KXk$p`o8|U{ezHiTAY}+UFjg^&fp%h>vy3`CFcv5%-$6TFM<57LtNl9Z ztH(@0moK;NiYZVX9k5J$B{OJ6oX1jakA&7&HQZ?6sWEYJb)}k^xH+4zG8=%!;x|5< zEz@x}yn8oxdVm&}X>zNP&>Ir1#`pKVHMh4KO7Nf`6)>?lGsm+`rH1p_zdw0oCMFNnNfB`1S487L9;C$nPKa8T!8T+LYtwFHN1# zYxHhJBm&u>e*A%N)d{fCL+ZM^k9VgUqI?8Ot7rQH}ODR+SkOT!R#B8+31MC4ng- z=3MW{7)Ct90GIwt(BE4l4<3$qqQ%3)sbkD_aY}-s|46fW|`rG;G@^GLnjc;62 z9dJN-|F>W#!uI)7x9@OkOYV1v%7yBI(3)QvxpoWvA#YXsb&;xOX`#qX7D(3{)uanU zHTv!nCGrWEJg0(zwe$X}A@A26%MN#jMY!(U2sXsxr=VgVLzbPA@kKl1cboUsu|69E zZ9J<@+{MaZ)~V0IQGt}Z4aquv?h3o`5J5Y@qpjWi1=OZZa6%kXUHhe!kZ0vP>*8>D z!42FkIFG$ljQ2N}D2O}}UphBTU6HE>vB80UKlOU)DHUxv=KUi2DgHLEy#sjZ9RB=_ z|HXCVMJbC5(SFtZe}*oGrH-hT)zNNyJMb4K@$Scwwoo>E^}Y7IcRTM}Wp>&bfMsSU z_Uu(dGP7|cY9wS%MYn?`V!mDX@Ve;2cN;&<%Y%Bq-r`+EML>hx&VPfYTt67*zskD4 zH8{Mu&UnX=^1tpAkd>5toqWD)8gvc(S-is2;Q!UyOlr= zGtr1)0tZ8)@Ep0;!~Al)sl&{cWCFxQq+s9Mx*nmi88npmcKQvSD+_V)L&j8zws$pE z)q0=H=W>bgKmGz@p&;mW35PrSZzS@lbGQq1kb<6J%hh^co)^ZtySoY69Q~hHJ5z20 zKdHc|dH(TSeDXRXs`C&8j2b+Bzj}qHFPj8Hx!>H~K_^jJOP=M)huUI8 zX>5@aT5Wguy$;Hup~cTS1Rfk8f7IK$UnCX%p$Y1nmu}Gr85YauNuan{BVUJhJXQLDTx1+1E`}JbM0PQFRu6RUFWa0kH z%@y&%6(YKL(Hy*`;mm>{F*0n((9$%2;de4|Q=TjqTqMuwf^);HM+@<)McWqrk}~Wl z!x>Rb8ixj5bX8R1WEf)*ItxMqgn0?PA(}Rm2Cv~%MAS@?`AaSY$VV{~k$%$C<@WIp z7F}L)IjiW<#+f8Ny%1u(N(f~lFdP0^p1@;E&vQPz%aDA36t+>(*s;{8O4O(Y)s0mx zs>tf*;aZZdr@6<7ICM8UT`n=TI*a5TS>@$Ewi2rIzCVO~JkG4wtlE`po}T@Z%HY@q zT)iaBmJ0iSb;)qyb8V?>-cVnTZ$j}1^ooq2y}G^zZD^!*_NdCHFM=I>&?|US7QEDo z-WjrlMpUxzoR7Eb@bBOHDdi`3ok6`nTCi!z);kds#&94(C$rsMV-{=e0VrvY=Q!JM z4-ZqI-b=v>lB{we!2KMh<^A$u%E|Lud5eM3$LGXZ@uSS7aKFA5!;_f{b#TuiO_pP%@6?H_=y?;xh^ISdiIQ?n0 z^pzHwmt*t`ezY_jsJfz%2wAVCjMaHuGm!8u)fxZG4j;Lh`_g{#n^na@hD0D&Z)b|? zF>i8dG9r2ardooahYhx9&NS$?^rjgh*ayqk2}ArKOF>0WmbOszud0^NVi4vtafr6k z85Bs}Y3m1i)W&wZ7(Dfn#!6SD0~G>pYCoQfy_e>jT)&wwy090=W>ytEDavsT8&@ z6>1dRa2ciMR*8oSxZdp@Dj6KnKA@0<*bS6mu9QJO4HlHp&>8y{9*d?3|0zsgf^!Dj zHz?%?jFmaD=HG$Z8)5>CJa_QcEjRan1u)2ZK66!brB8TMFMcO0n&1)=5;|L~dFe}k z076?OC;qU6XJR}BE|#`6wiT|(5Id$VNU^qwGx2#r3dXydKm5OsrK(w*U3J>q zbXxSeZ7sGtj>*lE$FLV#r;01)%T)-rBhCtCu^8yjMvHq`Z6)K!)^5#<@u#OT z3ucgxNZM_dXP&i|6*nACvJ||W*%?0wr%8-L!?Z(Rk&^y98=c z!AhsRMHrY`VF8;AJ~Sw@LcD)X?aLPi&#zgBo;MCVuNQ{{4Mh^+#K4AEU&!lGb?QO8 zHni)D5;z%LAN8>!R(BJ)`yfJY1FFh$=kCUYy!HoV{NXR!ESg=wn6uh5z4 zlLTpKjE|%%7-}_03+RLl*~3M6nr%oKweml!7=OjAxgQG_%{S{$b;{@yt(y4DzkJ1T zot$@U5ofiMEU2iE3}P2!=)Sj&+GnoT{Z+1Ttb;l<_}c8zl>)>Z-tp#))mMu%oe0|g z7=Hg+KPr$S=H+`h?_AJR>FK8p@(|s(1MiAY!x?dsw=L)6>S-GL*%RuNBO)6*Gl^qg z8xU-H6j75@A7aqxu`vC-xovMc_|`I_ecl)wy}}>evia^G*Fw0Rr7aucDW|SH=Poq} z!=;tZ>2@XQK$-cv2iISa{901!mVKg1FF>tMK3ay+VZC@$kJBQhGWmC?2P4ITJh;?5 zuf6kAZYP7?-==?X8LHF>7!WwSEmOao>pLjiucMSWS(gIkH)9sm<_etp3W{Du>-Xpg zNm>N*jSw%X+Iszwtt~Ma+09W8oWj5;>PgX~Q2ax12pTTGa0I8I`aPK!r|kt2PZ2YJ zbuMtJXQF1oAYPtDh!>2_DZ;eW(d!gbX%*I!7ba|p8846`+HY#klvu<#C_gawu*SQv zbfW&-Sr!2^h2A($1l|+w}--paw^jXlw zt^Ck)@#V%n?M(x^@weO-sKC!=$pJqXgCNNj4Tf6&rM zRr5RU7c4{?CSg`8<-;4*<|@7e1>|bq?In-N!f}PAHFoGd#nJK&h*b|zoG7XODUcC8 zr`OqWprbatTy*P?uL|c$9i$L3ing~AL*}$Z!Gnw#)aY7Rm)E;5L7?whQ2cj_v?7ln zuZaStvE~Ffw|g*;Vj*o|XVyaKyqskb*Xx14DQRt4G;6G@?vr~Al2p5YAL=_xvns=M z3ss2BsQCSEe5G0&wp>7ZVTX!f!X~M{+$8P!DGb8_54Gfyp8ttBYZy?dLRz#?f{>+) z#xHp>E&C8HM55Cy@epYUwR0XeXL#p=P$m5m* z%o}`oJ}&|=h;gckjOD}om7FCJVb#7GNtmNTS`%_4dN{YC0&xel_=A}wkc4!6t49=H zNJr(u^Q`k!c`x! zJxfbhjDp9^f~G`<1&-8` zhaRj9>qO6v@2`mC7VMnaAkkSPR=(gZ{NWk4qmN)4)s|3{KMXlHDBeclenKy0`t_4I zJmi+C_6jiazc$ZVH|y72u&ovZ=M~8sN4S)Lw%S8yZCfZqW2C9}^ICHBzEG?(tk_E7 zMrTAmS`DdEF}WYAGZn9E2_ng^FgbUeNVK7n9Ky3|<&hY(GOLZsRXLNDvytn~aYfyE zk;-7Z(cj@=P2^RVrE%}stDuX|H0TBl2?UASTr+c3ZqWQlE- z$A%=*>@TJMwJshW$B7h*z7+xGtCk~$o7_(%Z&0JHWi~|FNB#|l!6xBAWGm?hIw%M# zxgiaAta@!t$3hV}YMDL=Xx_}oD@bMi)H^*4+okG7ho0PGVErrXO6sSR2U{UA(geF~ zBdK1a5|`+cR;-bwIgn&1}mRLXDW=vf}+W6(HB;$rfMY>50?=9Qru|GsrU z8#xHtHBet%wbVKzrcsZ_Q46@8?DVOWsuEu@%36L9#e7b;KyRkaqs2BJW6kAIIsL?Z zk3keG?H7$^Apt5FI5YhAm;waZNjywkX4*&O;_a7-CsE6d(Hpcc{l->^< zU&1S$iJN{4L?zur!Beze6?CTQ!Ql9y&KYg?R2TV){`a<58nA81@-Rswq{JFH6DJBQ zbc6^bco0}RVyDOsY2B$i#h5K_j|mZ$22WF9{0c$~#9u?*ayB^V>AedrBni(p98B=U zl8};+a`+BD(y*XJk~CWX--;ZWb0~jc8ejsk{6s4)y1)uq)E^G_i=(d;)}cOGoqyjQKvc zKkjV70KYSNX^65C_P`moS+PwJbqQCU4~{W`zQQiHXI(k@!Eah8HHHI>uO7n*43PxE zUKP6SESLeJ4KO&>yhNgVCh{I(N*$@q5^_}$7ho;|@|4XDiJukO+*Ejg7gjPdRCQ@`>s6Z%|KRVifXCuD(HW23BtW36_aC>jF)IJrv zQvQ&V-5#f%DpNfSwA1>zD*yf)42$-YsLc>PII}LZB`Qf$FB+z)DB$ALy8;P1=$%X4 z91r!VBH7#+On$Ow{z(Fp0#p#amXiVbolhK593CBbHjjpq(!MXx2z5n(9~_zJ1#b@az++|jDxhPGAT(pb^EJ9 zS3yfZ5O@7s*AdPI_&6sq2psZIui^2y|KwLvSVKdD8t~v!s#nG5ESQNbtJGkveZ}-C ztni~M^-mrSMf%MZj*%nMu1bQMp{vUZpiSr5o#pYU!K2)1ODCA%yK%@gjqprYweQg; zrBT|Yp%5N0iK#7=)*wL?vt!1%a`$Hsq?Hy2cF`)FZ@1uc##p1dV!x6J2V~&nmk({o zN&Fg34MG8G;RO=(l6!u!AQntKq_ZMxRJ+|L2|wl zT%?7m6xBS=t5!l$iJn-Mozr$%UfBtW26L{#p6WcDmMqFp`P0&~BDMhC&@wBbd}&nS zHMM3OHpPGs{i#Q4!SI;B;D`7`>X0$V#h*s!R8twNP4AikSi?uPtxxdqyRS3H!(@?4 zO2Tc{yJ;mXam4c8s@5NMfkRT)o^|@E?O%Ijqwxa3W|u0=1kec*NWY26Lrnty5IBwx zDQcLHkIvL-+q&!_&A=rA7X6Z?w0R0j!o1f_{2m-B%H_e~bH0=#-MsR?gHW2|!DTqF z4(vr;qCxZ>jzHW_UI`OdPfKf^UUTeDvPZxACMtE89G5M<$83tREcsv6VOnO&qj*&> zXS*%5{R6v0#2U#r3Wh)8>U(&uA|fYAHs3Zd87#Bor7o_lp4(R1~%!2T?pcsizQ173~ zv)`1vPEYn0?h<2E6gEBj*;95pD2Y6!qM%ko*{#CR6s7`4@~EZY!39K;PihGVWm9_+ z8F`E}qMXZ!>J>jEat!SHNDj;P^?S38eP7*^f}KR6A219zt%UfsG{XdTF&KDZatP5jL}x_^c#2 zm@f`q>oMs@?wFPe#1g?jCO5HcUpp`IP0fx*)W}mzU~^vNHIpuy6D3a3bSaG~q)PpT z5q?sk1Y2nH8)xSng#sQ$x~R&05dt;PgLM-z6!ErO5KlQHaRTX835lnC za@|ZLX8U|ED(TFgy16?>_6W`Tv`d*70$m9O_Ag-tA^mc?f4#|ojt;VM^07TV1P++8 zVY>iuM`gHvrM9Q1P@-=fAIqfm!D{tbjSq(ADN4t)V`*%{aT-BX)cpxBQh~9+XTq~Y zPOn50Ylk}~ny{!Ht6nCY;+(>{u*RX_GOjhI;K(fzj;eQJ;LL}mM8rEjJ^lV7Zfk?2 zzSKa)buqyvZ18bg+FwWs0@-kYe^4yQ>lHAN9evIeoLSwy#D>6lh&K{d&PE^=9{&e}aErr1>P!I_L2>|pJ%a!ew4*XDsz$p7HWQ9)PZyalu|k^V6xc%JzFeMLY150> zErl2K*ztyc&MHD&XsRF04uRAn1jx;L`D#A?t8y+6)h8w_(9KL&HfG{9!mO?9nHOze zd<3x2;~cMj6GX~Vq-7n)C&zRA%AlX+PHBAvG(^7qyjL+?0gGcidmb+!krRK|0^P z4P?KtP-*=f8|V~@+++Dyw4N)J=tUYH1HF-1J%~l#(Tk#I(&Y8REZL=rE>GDxm{vK3 zO3kEc)Qb5$TxCJL{Or?=+A>R(&wwxBrTUta7F-~DorxJB}d z>Pb<2;VOdTI`#m$UJ9v4QAzmW&*Uknz zc|?<@AJ>giNbw`2@&Y;N-Cx#;>Uv70W9F!2B(EbC`F+p4E(!wc9*3=Pv~KSPhwkq0 zpU)<|A2SW$!_bwVO%3fAx^E-P9)5(w^lWORe7+w|JQfl%zFgAs$`W>Axb06Du-O}H z$G35)mx@cn)q@XEH)OVv_dr6O?F0wf{sk`-yH<=H8+&!9y5RgFgOIb^qQ?l)@X>7t zgQq_Hu1>LJu;PZ4a<~#@VIiRXL$+5*ei`Yq{@6T8q$+%nEYAMyE_AfhqXTc=#^4`v z$nQ4W`$*N0W9&%Q{l#v46}pwIAK*nxXzBJu`f!QSnN3=~=AXGu*o?4UO}FO;=Dx_p z_b*g>3y04)U8bgIW{<)gh{Myx5)t{DUOzRJ-CrT1T&;$v0YC&gGKpfuH(Cl-Ta&6@ zP-pNPkbeWFe~oEc;%NR+ceSNy+RDUP)65rM1tob!CHa)A^?D#QuXMiT_kMaoH3zpB zKdAiST-pCDBHeN<#KB!^C>L2F7a8*MK(#zlrkw4}dGG9JIC+OwmH>eW+-c+n`17fo zpQgoQx*8QWF)uMg;D?nV`6W{5O#-?w>vQi|dwRTZb}*T@@Nwk)7lc3D1hxx60%%jP zjV>=PJ_Z`W9J-~aG|vtYIViyQcmE>CWS zx^l>LTEuM!twf%^c5#q9-`JU6nx@$p^(RCJ(mia`lcCa*lt70Otjbsw{<;721H^3d z%L{0Kn^_OLDeyW`V(!ZpkyKKP6J!g6?dC6cz$!^`D->NhOW;ZJVt0NdK0s){h^6OE z!1oB*#@O2B*8eG1+f@h5do$vx+Q2Vz$@!p@;*PZakjM4$#J0rcA9&xhL~>HkP^t!B zgpXh4v!`p5T$c7R2n-G6u-e7L9G-25>vn!&YfG=LEh=)ggEc3Vi+YCP^P&419sA2W z8S##m7okk(M~{oGy@4TPwq`0B=PZs+9yr6|VEBy8+c6uG@v(Y5TTsJBJ7eUK76;`1 zjRE{6h9*V$&jJ&BJNgyX-GWYkl#E#t{yUnx4~}aNr>HUOwZGdYI?M*a^P07W41Oa^ zmeII7dD$qbjO-HRUk(wdg?PP!5HB;gp|ZNr`J@wzf6BHA%uz$?w9HmqrUaRfdJs#F zS0`nXRI$|N3AxYI$8o}bhRlpBU2rb_UlxE-t4cA0&upu|uGY8<7k!pfLr+%zDlB)36N<52R!5K^XAAs0 zKEK?vy;w9Z8L4W{I;>lrtc;xBnlU1P0v7?pgM39gB*$Q^i`~->B zO!oU+wMtS_vcG>-&yv;wUg?gSvGI*5%|l4=Ouw7ET4!?mm0n z^LjFu`#;jEpM{S%QqTb^AaUVCa z>9-)hZnF{9ne<@z-mMgMj(lf>fdB#1hTq5jIEmS=A2$?xz6zQCw(KF{cShJ2!;~k@ z_F><{@s{4S;MZ4MwXhMkx!;G|t#<3MJ(6-`423JUNkc^=-rs9NK%hV0IJQ69T}Eo1 zF~n>{6y=o@9qJs`Q}K#{#Pd?6yK0So08r_D^e+Q^-UDBq);T%oKNHM#pdr{*hmU-r zO{^1t>|Ke_)!cayoCz4q`%L@h6tqr25e)lE~#^tfow+6~1U z9>kuZs9j~`2paL02*S79a=cP~RFMO!%%TIl34o97?~Uh7^i%Q$s6L3Cs|NSS_?cK0 zdiN@G#Z*2$b@ujxs%?i!1YwD@L~+<{AL|*gMpWLN1&)F_>P@zRrO;0}uy05qZ8)Cf zwjXIGPeGp6Rm)+v`u^PC&K;pupXDL$nr(cnd2IAN%;ST2JMeAUsS2jq`&-|SjlnP8 zX&THh-gH|iK&6`%Y**LY@oN0ZT3KDfm>kJCcS}RPoRHqtGg%$11^{wOV zuzSWX8b9g&N@9ue3o0`Xunh}*yYxK%cqRhf&{bIgb3?%94AH}t2naMfIr$1?!GNY) zPUV_26qwkcMWua)Ya?Vqy{Ao)r>6vfVv2J5(PM@b*r@n2wX0ZJ(SmmFF9mG}fdU)> zW@fu%p`mmtxf>H>V7I5JkQQDci_xpM7pnUU7*O?k`zZjT#ljN^97jJ{WL95P1K!Nz z=(9g$(8vHyw0zZ&%jI({uqE2Fm2mfEh?%zis=3;UzPjjOI-1az)n+f~@s}E8+E+-^ zpw@|(M1v0lT=BR$f+O5s>7->ACZyQ*C?sg3+dqvB5<2KQ91kQKNJ|qf5?QzlcmN6x z0NVmQ)?(7ANCE*1=Zm>7cg58|*ntbo{m%tnK>-(dH(^)jL4<+H30z<{ZePTo2N=L5 zPmX~P&!jdu*cS{=t2LylXykC=guvt+m7Q6^0RvHRfj`8zm^5YdsY|%&0oErvI}IEI5~cdIKpyjUW4vgQ0?pNZwXwB&QtqglyQX9E!U#hAaW*+ zglL--jWWbsp|PJT?F0tM8!93vB`&~{6aa5m`_H*L@bBCSEQaY1AThM*3N@P-w8t6^`vc2yjyURr8iwBN_# z8d`OCxY``IQBmSSpyE#6KP38i zyZX}tAcb*jhulcWL}`oGANo_ZeJF5oz6mY@Ogyh!8C0{jbD9W+VzY6&8uXp2a`MV5 z+S*hlhFsA86JB|XqG9K12RtPg0`zcEDBR4F7A6XP=O41x;o@G$%0~dUQLWoLI5N@! z)Q!4ECDT*YE!Sk{ufOH`knoWKU9cUgk9*}obo?uP6ebU_``b`iVLd4Qb$zHX=FyMD zNQ{lBWL8ZK2tA(yQzGu=$GJh*ue`kNkx#|W5 zeZ92?mcK(l0IY-Ab(2ppN5i*$=^jt#?W^QJ2mq_KMuy|hHd0WdK*Vj2j!WA2*6DSs z9(}|jX%iI{Ri$<75{d*1y(6vvYtekjt_=Key}wpp*L5N)>%shE15flWacx;f8M&md zEA!YDaOGt+{uL8wWoh}@>n4FhcXOn>)PCp=WwkeaZ*Q-M&Co)DhLM_tcYYpxes>qM z)b~M`mK0*YZJNPu?!1PN{gY`|Q-1vEO%3k)@F>DgHCY%51O#(;6`Rm{oHPzgFC*0T93zqLjuUf7#>2mBk zu_}^A8K9*6TFT0P9`fPUTXh%Ww$)mJpZWw(?1 zeUb3mJTXpOLS72Wt;lq?p&m21FJOq$5=y@ zfILPWwf>t6KOXfBGbVG1C4C~w0^+(meQJNkXG+HG8yHJw&Ds2V&<;nX0l<8Lzqfh1 zkvR6C^qRZU>2!BKTJ6sy+~DTF!RS%Hv0BN3n+xpfLVNA>hkn)GtzsV@0&gIPMeMTlXlwg5%UxAJRlJir1%S<#@~PXVV!4P zeFXf5+;}vE9%DW$zNQd)kf9qk1w!&zXcPvRz^#Js^P%om2fC${_UqkyYEkKUE=b&U zmrBNq|2;s=j1I`P6{8W>hs1wwY(SwP_G9!=S>AO~r6atm$ck*!BGAHOpQqQZmCyeW zGgt5t?G)oL+mE^0e(qZ0JsGLbPKIlWyPE1q0j7H|G;0C1UF5ifZTTZ85oicd1(Vfb zZY0*I^s60%SFm-a5Laep+m&XKUA>cPS|`&nTU};apg~iWn*SX~hV)e#)yCmLB4WO9 zTehnD%9(OQWFI zNcm5rWy&>%P1*}7c@fT(_=5)=NB*UpNI!#Akael9pt-3;k#l@nl0EEc+;KwuCm6)9aB(4&97kGj%*`0!K7D z){3|oV+FU+qG@{0^b5jQaU@-ke>Z3l-+^j~njMW3T`ZkmvhV`Z8C z9)k-X8K~y8U4JU_6%(tev5{2BZ}2kc?(xqTm*zhQGDNUuiHRtLJox;~#WwS_1sEMU zG&ON9hx0@*Z6bM87b|#>B8Ny0|G>b&+vYCSw%4VW5}mu9>R*Rty1ixI z0&1ww9rZa2nE{!ZxD}j86{V3;e)@y-5*BVJ&crjBP-_KgPXC_sB(_L|%r??Xl?dTr zn~AyoR_<&x#-JC}9RBkeESmZ#&4hw)?HgPnC#Pf0^VK@gKY?TA`*~fLfcc7Q7PN2Y zzoVN1iA-K6Z2;1yfP$k8Wi`?2$T|NXUi!Yq7&zz3OY>mbPPASEIPt}DnJ2Jd(E77q z4dLZ}NVFe*o2QMnTdWq#y*A@z3(K$o8Vv)1J>+{IYNmnY>=P^=xwL9Vl`7yq@Uy<(4E(9?5@O? z!_{^*Ajz0Zfd@5zh;ps-t}WJ?T>o4C6^qXkst#`{Dmpnb`oDxVFR4(zNgL~b2& zWBz>EcKY3}21qxk!o&Qiu|wpOC&I!;z|NUhPTd^#qaE+>Q^4t5gXr-8qSp@?o%KA4 zK#3~X5oHJn7Q1@3M3)sL+#-J5FF~F7i!d$UIb0s=C0_13H?~f3nXzB#&{AUyNnN08 zwC#MPrOV<-03>tFBJ;DWPm67?A#0!YC!65%pN&l){5}_t7a8*^gLD>_R+S9PpHR>E zR4MxGp^-u2)5t2pfN3lTx_JA1lGv=JMYI$iP^dxXAVfOiR*cFQs;Pc{)x1IThG%w{ zbB92$cnk{kPC-jJCmp=CwdHCxV+;6f*&lyraAv;_OyS zAk^xx6GI^1703AH5=0Kq)S@Iat((}P@;9k8aXdaWK1Ja;hQWALm6FoQPWIBS5{0Hv zK8ROBwh03QB>KQ>OeR$SQLS=p{L9b1Z;vK#=B?QhDbUi^9HHuV3BAiWpFZ7i`UFC8 zl)bQpm^upvB4WiODM}VkT$g%jMT4=RdBQsQo&j_Gy?#EBMwj@q%=%S+WgzK6q@_ys)nb^`?zrcBzc zWmZ^0z0*d!KuPv=VfV(mI;Y_pgS-G9w!>GG*Ig;l-TD0S-D(q{DrnL}R>&JahP%jYBcg716lo zTXLP#ztQ@fcv9ggfExhLy|&{evnlr5kFsmL*wLNx1*88VWp8faH}7Qv0^ZT8v`2{f z<&SXMmTLiIcKQbX+xFwRQk%~TW^uaN$rM2Ja2pF2A?V2!rhwtRtQ?pTO5r%!(;>~ zv*Hk;r3r%2_ln>fROY3WJp(>jM~B7!T5S71hfKePwl>X(9VT+lQ-iA1`{^&mS`0Jq z9I?o^zx?8hF_v2YSvC+?NC~y;j5nW5Cb-SGFxcUcw*7zdOo!>N- z&-N7q*;KELsg@%8mPeKxgqwvc)2SP!%y@02jKH>-6|P~oTSK_-BA_HdSQ(Ej`p%E( zN-d>Ux{p1j`RgG~fW8VgL0Y$%CUH+8TK)THR-ATg94HAmv`ik$zg3&Q!v4?A&6aa& zw4%dQKq4-A?BF#S9>JIo`&WBAfM|stH*tl>E(hd*KoKM?!qwG^-#?2HV0b3TsJATv0=~X@*w;)ccqU$o3v5;D}|XS`Gr4 z>S6YyMvxd-eoC1I3AXVHdU=-^IDwJWLbIUrasM;7Ju6Yi2oIVfLFW#rf((Nm!s_m) zWYoe`r)g^Wg{CJkS=mCLq1uNv31vPc54 zCbPg*PXR2;FTNzAAbjX3E@#d_!o57MPnlHwjo1yZJUV|RfyXe&xMs@^cT0hc^_RGO$QglE7&l*B>^=FSH=r&k4qdYJwvg?TTW0B zl?I*uQa#0F%sqt#$djLV!R}t*2nkh1(uq`lRi7(h&i%2d_+`V5_8(hQ^CMWV11eJ; z`Y%P+4{B8Fwcwy1vK0A^L3`Id#GsPdX>vuQowmN5u6;K+u8iJO=?K}y-;yRJysM~i z&9dq0ZlVflI*dHn$k~W`P&h4ysE`of$8;*xX>?v_8qVjVs)vTGLaR4YG#KA!T^eBE z;HJ%Hw#9l)gI3@i1O;oot6Bh^bbF0pp?iu5pPdk!#%-|wb9^af`GT6%U+eJ_Qd{C# z7u9Bmaj5po#7IF9JXKn;3PhH4Lb^7@B$b?M;z|ToXF7!Xph=)suX&OB!Cx?T|zUVzUU(1T|XY{?b#MxmfEqJp2z_{eRfgr?3K`5yk8{|O; z!V9%~x@x`PvnN4x({Rq(&)n`219@_Y0&evA_T4|H{|cvJps#gWS&tWvX|XJhEGWoU zR*#=m`I8D}aV?ft_m=4Av7r5WH% zE-D5giHA*In8InrM+sw&<1su}VV$(@6%0Q>#>s_4zH%0-e~I{ah4KoT&tJAl!PF?t z*9w54C-CGSrkdkBy0*I2S*r=t8U!HMf9E#f`SFdr9Z0#+&m1R|i4QcK>}Vz6;#|9X)FJJI)_qk1 zRV0|`u1reS{BrsP@)&Bl$U9l*EYonWv6ksD5AWJTmr>?+J929c6tz6eG3urwtckjQ zrq8LR&1j6^6bzQ~n1})inK22j*7PZ>R0DyP2~;*Es?db*g2@TDK2)J@BjrMm-?VH* ztRtZy*omACm~lTJ>4p2G%y$@F4W6BC7grSegvG?DF$+tu zu^RjhsL(;S!Q(a!+G~P&i zvQmqblT8ah%T3<+K}}uN9bj+S+)n5jBA&BW?T2g4b~sJgLlcVP{by;DcfNFEItQki zsE)u9?<-yn^*JENZq8dZ>3IsAd*Q0?`g%uJXwm2;CzMiX%$J8|cd2n+`9`Isvyr|8 zv8Rx$Iv*uveG`?3czjMu5cM;jKAwCEf`O1rD59a5mKT#`Q;SudHpfZL)83x+AP$Y4 z{F>-fi<7@tpS&Hdry={32`U~y+VN&dW(CTff6I1iH|ufSan7Laj# zh*t_oqC~Z130Co~V8I3rZe*;`(>Ng0#JS!GaSAG?OCMKwwG`j))o1oWoiDSq;J2k|~pri4-TRBo^}~ zh)?;vv**mhQX=lsAfb<-c8f^U3a%9WUl!m?jr>@~&Fj@~*=!KPI}|kmJ?DCPI6lJy z@v%Q{1m)=H1e?rYq7*?!Cu;^xMHS&cif)gk_`nGD<^qfX|s-lkC;>Z-NN>7}Z}h3qLaeYcQ+Je*IF(17We zZ1QGZ7T9R9=1)IvpBkw6@5KQ6JEV_%1vAsV;HOM@Mf+K{KCCg@ZhVnxI-o(ByoQ^~ z{%lP%O}e0@O@f0Hq54}M|M0CO=^5#}#yZOnH%#a+L^O420nsEi@A0rfzp)+zc6Y z4jsv2H$t)A$OEQ_vq()ZD^c`z2LxWg@HYPsk)WDh>+D%QFEOD!g1L zEy(`%IGwxP(T3|-7XdwxW~_DVc!^o|-kM!*aThkJ4U{G6K{sa7^tr0v|6%JbqvD9R zhRw#^-7UC<;O_1cToNF-yF0-x5D4z>?(XjH8r)r{a__wFd^2nMS1(p|Q+>MX^f`M! z``M!YOu^vL;Tz>DZg;11z z`)VkX9R|5?DTo|oR=rw53w|=SMSvpmt^V56UW#LLYJHL^2&f4c?#XATfNMfEnhtn6 zskh7~pYKPG8$png{{`!y9FVfXRG1}_R9wj?9A-B`@@Can*uyNC>G_3;ik;T}N+b*$ zUi?GWr^rDfupi;Ct!Ar?(ek(3jL^BgzB%LUEAoRP55C<*5phW*d-73ibP(u>jw=YH zSdidmksa%W&#V21)r3fkvU)r(Ef+{+h0FqJwf@76Qbm9aQOuOj<5ocfWmRR7@;N-b z!Jx3kMG2zwx(WG~_n7VN%glBa*9GtYnq^Y+w`4ZAypk_Q`ZXNG<8X~ps&?^lSFmKD*sNMICNOI1*0A4xt#xw@S~OC7N{W6We~Z|m+S zOWkk5w&C$Rs7>jj=1wx*Wj{eq7wb5UH3hmkg0y)l2}L`jL>{;2tKmg7=EaHtwtBod z8AjOZeDo#DHq$rSO*=z0U@BFvnvjN-@t{B+!?M-2`jWi1wuXob9|Oh&vnoO{ zFgX@Mi`p#aJ*7@4%e3N^OIY?b5r$@rV&9N|NtnyK#)U9V{p@xGr*r?>Y^LSS|H z@mT#Um}eyx@c0Lo{`i$dPc2zEqpn<`!ijaYD8z&TagD*9&K?)*Ank9VJdg5XVTh|n zg-wGOS(5#nO33kB=6ixh&2Q|Pbh!Ea_~3$L<`+A0dtD8||5C9Xu^w@)xoar|zHinV zV#YxGT7e91@0~gG<&RfKPFC5JGS^F9AYqu=c-AEtf{4#`lZ&F^_0gN$*9RC*eLG)I z&@N)+Wfbg9q=6Af1Ddb5g5hkm06Srh9hzeK&p_~$3=lD|tQ^bb2$;xvho^rTk?b?yjoq@C%J5|dMRZEljB9! zrp$vL>U^3=@H%|dEJ%W${76E$V9Faq##`I6U<-1|a{1yL^$KjOy0lxoRR0J^e|R!= zbe=ZGvI(mIzjY=RJwu^Y9JQYn;l^sDj9L zF}VB=V!+ImP+J&1Nc{W&Pi0tO>qgrZp*(m14(W zbDS5p=1oF!0ldhg?T*T|(Db2EWg_GH>Ixdfp#9l*_PIWD{Aq8fy9mHR0qM#9ulg5_ zRr!;}jK~OSZchuvrHPLAfUCC!=Jr1h_j8=GIQ=A1>0j($TQb!%czl9Z&jZz&eA3Fb zdR>=uf(MOIDAN@H>h>&Z(LnX!2MK1x*n~yhvg^}Kf9gWzo5yg@9|+GF;%H*tl+|8H zVOVPK&rBQ^n@@eSp1r*Ro9Dw*!p0Te0F^?>`^;~`6J&SQ!^~Os7M9!TIC=m;oIOxq z5DHlY{OZ>`SEMW;z(M=G1huy-jf=dkqW?F|Ny2Io)ZNwg4j2$_1T!6<`{II(s#U4w zNx4M)NQJzlz(fL!DCMYjXDU17Uy#p#B0!l+pm zN9I@wr9{ z3*}F*v&)h>D0b)$Sk&ZZY`A_oKEhF6+n1GD90ZHy+-RP-A>;ROJ|SK_9(|XG>u9v5 z=+XUzm`KPD%4C4At=4=!1vnkmiBG3+>(fb;W~vbQ{|mETtaPvg%rgKW1N_!&5x|$m z0px3Xv>+3epTc_=nxdRf=Rn;sf1>o^bMycl;w-{#P$3SWUcu$%e-NzmUu4kM z@!bjV+~@H!n)aV;>wJSDyq)Ht|>(J{@mmf4p}*i5&OmZd#7UY z!)n9jzW~V1(UBDwv8|303r1d6ZDI4GhRMJ^(9tucu<+FQY(TnEw}m4N8RxXG2oanT4{_TG!GgeyZ+5SxF0in3IH36@XE|Kl@wlB_X&ND&r_GRw< z{cyqyZrm6o^}JqVo@MTol;BU`|AuF_1t7uo$5z^MLy!FyAWl9f&{O~*2jdr6MKF(hx-QCxDT=g3sOCwhsC*P7GL3WOgtDS<+ zGx?*nrW1d7FGhjf;DI;CU%`);b&Gnsgi?#&be+~Kk6ePj1E-4TYvYJkcuJKDM6Xi* zI52kmlk7*$STrM8Xy=_ni<4<1trRx44FF$tgPB;x?h#^3ThpVnTkM=h> zOfqsZ=kv9L;Xh<&W@bO0Ujn=;ayb%>p(aeFHsXq-jHOKxs84=e`uSvzr8IxL`qd{G z|C-9CRb%#Dd3ttS2hh7xMH0NY#GLPR2y1<#I`D)938nKmEwwr8baspW^TGqG(^Ssc zdr6YEkFD+OrKWf97cn9phGKm@q07UoT>yy%m{&=|j(;q$-geF>Ve1v$W)JJVKh;FM zPLEy_)PVN&g_Ro$^tnk;qr&)uD(cBWng`Musl|L(;$ykW=b^)U^S$a()46PZUaq{y=jS3qLbrez5?9Y)GB+k#EqVP4jtafjjbG(R!Q`%WvLf7j{1cY* zJg^|UFH8q7BpT;ySQTHQ3w$#LW^nE=5Q;&5?g$+zja#LFEQoln(>G?rn+Q!YD1*P{ z<@x#jBBuPYFeF5>wm`n&0&yQbFHLZhiDoE_5ZFzcqx#puf@+r|73=7=(Clc~0#H-r zr~PN?r+Nl|Y`m4_T2U}7@@YB7 zoNxXwkQ+3Ei{ZN0?QQZRtPqThh}cEvv{r58H^=rLCOBn)1phZZtpqX&$B&)IVG@Nw zT`sA5rRwNHWyEHO?`r>FezqmaJU(j?;q0Bec`p4F%aESut~eWP-?C|Sc-|N79d#M5r3L$6)Fuxoh}>o5OMc+^<(?%(SsH0R#xt-15rdd>sm6!g2 z$_~xT`A3#qn7fNjy`o^`tfLBFJ*j>4AuSpa4sgL@_?vJWBskEMHo4UXXhsFQ5T=0+ zxu(Lg?@b+S8q=iJI`q;SMo>Th79%xo3t7mfV<9_tOf<$XF$CMY)#vRwI5?OZ1O0q| zPq)SE$NGSLMf|9MKA9-A?MBVn(s2Bu?V4_t8LheeDdPJ4({Ba92nPuQGU=Oe_<3@8usK*D;$_xvSp!1jR#Z;6ePNHPgm#d^?CnHHsr)^H9EezA?V{Or}}^p`5IhOpU(e5a$$o=u6C~^Z0Q; zI&hYqo%Wz5_4$NLGFAxqE$n>1Z@uv~pkZJD_;_jA(XI#98CDnZa|zgV1wP3R+CN(z z|9K;|0F~H?m)J)f1H#bgckh!1S&a%46BC>DVJA>p1`(mc`sjGG*Z%Rdd?yWS4;Ly? zyZcGQC~(ZiK3oYRZdd));wBCtc#8j}Iy1{UL~e=}1s;rkFeD`vC8tcHoTFm(+9Pqk z?)q|nc9-hI{cm_fnmKNlzI~P>1(2QQ{tsY_S^A>xT8zu%)P$L{ zMOpfL8L?$AFq)gBqWc?gBLfdse9GymG~@dblak~4wuc^<*_;3>Nsd#F=3g2_0EqjX zKA=`UEtY~y@|kAkFc|~xLZ9(+QFQ1jtKWW#sYsUQIn(W*uBZu<*X3uJ({*~bSK9<| zX^8$qpo@!ffS)G^I<`u4WAx+9(aXc_-V0w%_qT!ZaW=*|WR{}+fUj$B8-$m>vOd=B zr@p_vEcCVcFHZY1IDK9k^S4+gzUI4lJD?m6^a}35Vw;#451v88^2_jR#3pYqzlzhU zD#Q$mO7(W{vi5Ln@S@$ZQQrv5^rW|^zUkw@+7_uj4fu9?dYuK_nQ!Ng(n2NU1#2}j zS8CZE2R6<$RunH>=er1s*QM0XH1?i!eZ#b$#&jL=XM;_Mg1CdU-lzsc^PEPlkWwhW zJf5i@IOx!6w5?pdjp$ku1EFHe2!G$s9Huot!fSgCy{m?obiz8o`i`VLZ|`FR4)Ozz zy+9mHyzUoeSwlc*_Qi!z-Kq!%2^sPtXW$P@q_dEQ2~%k)`N48l6FUDMr{TYu`fZ2L zoa2PtVa4NA6i5tqM%dRk5Jm8|(e2%;I6$43_F?I(b_;N2HNB-Ng{ICVnGs1$yO~;A zS}4Sq+eKG}6Km~`g$5V;K!Uqau~J_vS&LdRy(fk==pVOB`#;?7hQ9vpK%~$A!J}%B z6a0$Ibq3g65J+5H@oF3>XN|8JV&12O_gx4F=8I+W4?4OU)IDt) zaM*P@MbnGG|3bGR7;F|xqzrrkqb^r7`Pkz+c7nDAg^sL@sj}`YdOXFK)behgUuU%m zfHIKR*H?jzt7!l+-my90_dy)$@CTvZB2}E$H4}n^y6aCC0h?Hd=hOA?>_C{ElgC-B znCIZ~joCt?v>BVce85-XmG1c=a30bjFuy+n1sf%ce4}-h^a#hn$D_X`D;z{be*i_C z?2ko+wsaOy*SF8#NSLC34%EU?lBSFnM0Y68Du~C_F#U(k{rb|sA&lWFY}VvUv8}Mf z0k1_?<%lQA4@4O!jF3sM=9#twvHOHq5r=CLPLcIqbTuSc_Ms_MXk-tWH@F9>8HF5in*rr+pu*K#-WqQZ*$U< zas^w`KY&*(rN`41jF(Ll{(3#5w1B~{So=<c{QT|Cc2#oCPv*#^E0HFOTwm(waqQGFJ)eRCW({EA z2Eq57QGp2eMECzfx%EgEyyV7*K_~GaCJ4WaYAX*C#!#GB(`57#Ee=%#? zTkvsvvQE!H9*`Q23R+`_SYXn*8dtfn&>!u5an+XiId7=nYLVZaWn8$#ahO$>Pq7b$ z#6j(m&jL=?hyA3X9QS*;DOqlfF?aeC4W_&K=c-}U)QDy(hp^l~pH>I#F`m&uFe7$gcLav@Ni}l}2lVJ``k8X%yxhGI#}!X%gR^5 z{583Nt%i;b6a-&hX5Iw;&yB64k7#lF6SGN|i-idXob<0#+Vq=F=i)PTIpQd{`{$Fx zjW*fg0PCHIaTP)48{EoLd(Qnqn4ts^I7mffY=j?!T0YQR8{Ulw<<|$kyg)hc{2~4+ z!5rnq$kS-)0e`c1;8OurDu2DD|*VEo=d#i_ddUDUqbnZ1ds_5V)73@APiXARt^Dzwe6ixE5rf05{ zu0(pFcvfY38Ft1a50rvatxz7q5dBhxzz!%FB1QNNwPF!&KM^osMxjPWS1ho>k^S1*+Pq z%;5cS3M{PSRh+N%J#E~zDdQAEJA9SJ6`+KyLP38n@cgZ5bXJG7|Kfwfe;ez<22*tb z=jcr|1h$_zuI}e8g}T2vS>TcRyO$G_BOov^A}DC76dAt85$be$$|JLeXYrS*y_qrp zoxDg<=OrAtH?fe3<$fUCf?>PO?f_kkhP$3JKBraB{!jW1G-pgKd=1MZJMH)UB@!~W zo}x=!OXFfDcFQ@~8ASMcJ*W?3gN>Hg!@iC|LA)^365glHsLplG`pKcJ5Lr#z@aW8d zHr=8muZ{AuHG)Nv6P;PNh(zDhFftOhH+#>h#=^DEU-rf#7e=fh2CKDL`+w2cpWz>A`I>2VJ!yO}JeYQ*l`Ky76b9&`;b?63S~ z{c`&ChAv;?7o3oum-9X%J}kkM-FG-Qaq^p}za+@U9*Ci9I*FJ3c|dhxUEQv=c3os- zWRa49oEXB<ft5m2#h|HTR?|zwzf5Vis}0VY%?{!b0+^>grYYjb zIfhRo^MH!~O)B`hTUgjgB8t?l$>ppvXx)=4nxv7LMcNk@+B>6W*$OW?nNgb!0UjP6 z4lbE%yL~2Kwt0pIBy`*GXKXBD)93ETO@TbUM#bx^<0SIwrbbl-a9-tM?<#){WPVA< zyTc+OrGGhkJDxAO^Qo6?8jAAotf6{!~s;PECymvuz zKMAw=N^vp=L>V@@-WG?=>$!m56QAvmL!2onBw}zYjH`u|5WNCW{p#k7%5{M6r%07- z47lS^{9?m)2WcUM(7Zx$3~;CZ0%l7~KKysH%#6x#Ib?icTue+t^e@tsG&aq6j&$FmqYQ<9(GOoY3;dpOR#hJaaCOEy?gc$A4NOlgMMenha0!uaGVVdb&?4)?+^fX16ErIHT~fBY+Wc<2QImI99IQ*`L2?Q zFkc~SmYZdAGc5Pzat%RhrBm^<+wVBhkcG;Jy-JDvIQ@Kl+)<0FY?Y8JmG+VeE48>p zmon#w#JD(Tx&-DzWGl#1j*B4R^5C)3|B*a1J?ObaPI`B>03AV!dhh#-n_ldZLJi{k zc=*-P>vK2lku9$nlW0W^7_2)a4AF;POPTsOb>e#)&{lAV)pSy;+5-u+H5j~EZ@#QD zT=l$|5Axeo%s9T%HUM>{pYjGm-;(f}sKt?sPo(p6y7ctj{AJ#P?0kGq#Ut@^GfgHNYKjz!c8rgC}?+~z^Rpiois3Qvh6f3)5% zYS&wQ6Ln(D%=!Y_X|QEQ2JPRLj@x_*>D8;Yj~wid{$P5k z=b$S3{U__Rm&zmJi`7C=?@#u?@~9OdzN*3Kj{#eD646bhD zXsW@vbfw-R+Q+u7dhYsbsca&{)xinGhVR8X0$wtPz@HI8Z(gDLGSCm59xS2#dEB?x zjHIMOFXKsSQ~N`|&V2Z@X!HJ;NVBOCvQxpVX5YIge^h8FVQ^%4eD+fCZ|N{mgq2>> zQjgpT{T_witD!+3Ni8h=ddR_RZRdx2oe($fQ>%C2$i?Fr+xMbHIb_od5EyzIkF9 z;A!SBRt3Cpf9P^~yQhXBeyp^fRkp8+SvcX7o8mpf$;GIBEBwMqJpAPkR>MG6YXRJG z#epoO`RQ~N4g>O0r)<)ENinBBDx`~SGo(2!M${LqwD>8$Q`DEv!jNCE-jIF{@6tk% zCw>75W+3o|qQ$92KB-42pfb<%^icUs|2Q@^^@Nv+ubx~vo1@vt=G+^CVya1MES0rY z>}n@>P?=Dga4hwvSR3A8T}!sQK@;5-1cK#V3CouueRC)cRwVNyZMZkD7uDO3e!lyv znkX0g1DZ#DUgXW=p(cVeh9$@Dmxn+VkeJ^hEBEU1LkOZJsS6dbQZB<{G-j zJBZ}^^~Beg`^xkAv^n!7#{mv5)BkcF=nMufEIei4HRUmd5~zN$`=P}; zsEzh&rj1Q>HAyf7Oqu*8=P0EeXr(01L(vY@AQC`-hsFbA1d~ai zQ7$&@Z-nWrHvz`LJ(Hiawu)916sy#JATJSm9M~{M2YF1uqy8`y#q>>TGW2UcPZF8^ zr~<0+uB=jmg*=3=bcJ*PWjM}aSd!+UI~``lgB=!C4^|9_A94)GM>2+~Bn^7__u8f( z2$oUR#K3Teu2w_;(p&m_0uFsSDt&5H`8kV|>ma%Yubow~Fg zt<|g(QsXK#?B+()RM#>}ORSx;vS3}f9fN%=lc$wY9Y>}Og~6Wz)8pEj3F5k#)dE`d zY*bq=HX>j*$59uOPQl05OG_a?QxRxj!h(FlJ8NI|6XwSgU^@y7J2dlto3P|^C6O&I z%da=jLluE#m5tz@l$;0|uzIQz`@3gO*sK=JN9$E@GCc|>1uu0iwB{ipI|Xk1aQd!; z)Myt0Z>r=Oxq|B3r@2f|eN(ILhobJ|6ZDqJjN(IV@OaPYcSxCe2?y5Xe6sKm;q!Tt zj!gN`kMUcyIh=?YJT~Iy!Mzo1$sG z`MQOv)u}52gio{6KG+`D{936!x8z{6idq!rv1$}rx%#}+GJF~IX= z_3q0anM9}zj??6#7WX*`i{J_dC8;mc{Y(d&*E0=Ih9o-3i-z8C0K)M(m>FQ4Afjjo z(`?83+EZ!|X-|%j!8I(UD89zoK2=?m^7vRgh&?ny^o&3q3SqKpv1Wfjwq`Kpo z+`ULzSOQX>>o(pMZ;Qq&qVWtnp_^iJ?qWQ%^iS}W&E-%qp+P}Gh1pDnOX}1j!rk5C zA|kJ|FpL4}f*nwxCC*d9vRYm~q&}_)(dR76PvDsPjzST=&R@gx2?#2|c9A2Zr5GhH zRpq~7Ckbo9h~;axdl*3{he6<;W9V|zO%2|`_L!B640vPfFl0E--BOWs_50yrM~`W% z%jr7BubGDgRxkGq)R!WgdAI83kdmQ&i$$9PKK@Cn8!l91a|U}2moUG*p*U(ezGDQB z+uw__8XS}ncg@hd2x0X~PM&bCd^wSN0bU|7a%~J)sKlxFIW;{Rya+zFQ6V+cGL81R zQ54nsqBRxwZ}c^36BOa0N~nwC;w|b^wkYEcDLj=|d=*Qdhr%Jnetr7%sSWOh0p_Zf zE33RKG350iHHfJzB(1hX8n5$4rIX@d3rs+_)K`pVQT+6w*Hf_`kr7-Cm z6|#U48@<9sdwtPDsb#4h7&2Lj7C4e?9X%|VP~>)h=uLNXueI@uXXDVhH`SRzk4Pbp zwfL!JN&Al~sARn&Z&%o9`Z`48CcBh?ATd9(p+!U~Ok}s7rK_nvIuUHJZ+rowX&ox+ z7c_y1hoLmzyol%a3BmkASqo9`O^XsW0`=blhhj4sbxLfy=w*#2e;l@5=gBe5(Jy-a z-AZeq=Bj8QavGNJ028G8>L{3W$Jw5hZ*;bDjQ zPCL(VmUlob1y3R69vvNBL4+rZM9PhWYhZa@LxbMgC>PeE-~b2Fr3Vu^tuw!1h>foTieK%Z%Ov;=>WgbyaGMTe7gmZU^K`5k@%-fKpq|PX? z**k&iIj(OrmdBk_0G6{rIVLa3E9t0QWlDp8$ zZL@Nc1uO4`Cf^a>UMcX&%G7d3n!qhf$Ew7lGM>vXcfyxd)Bebk%L%sRNG4c80mq3k(A@SOfE zo8O*A)C)Uimty|Zv+9mQGA<|%^~=|Wt0JW#Z48{mA8eL0Mi4t2I-_bY4u2*Ul@aO@ zB-;s0j8-k3n)s~jJ!KJ)8TLhqu+@i>EewXx|9UP|GA0zm$y0#@lo};YZkBF^fSJ+2 zU?q7N7+-X>wrPbNd!AI$R16ArV^(dIS%>#`8^STX6iV2aoR(@LxZbORfxAXLgaO@~ zt9$u7;OiF!s3v)qx-eNK)OXviRqf9-Dsg}E5ng`>aMgfkOHrcOrf=M#^9_fJM5>*P zV8f9)UG?y375Z*oDIU>?u86^L4O`~(Zgy`J4LEY_JQGZU&S_vV4z@*$Vf-Z3NZ?7N zcQ~kzBCt;Hlw3+)Q%#m?aJ%E9qX=+taLC9KLd1qvVBuMIBy9G?b!^9FA|tZoLS%>S zyS}T;Q3>LzQ=FFLQ^6%jG+jAaOU~-Vd)K1n%1RxNJ>MtC!Ygxl zEaJAKa|Ob?i&#P;^Rp?iXh_KR92IX+ir6FeO@+@DN-l#s2RmKHDEScZz}~jH_F-1N ztZ##S!!V8xHBhf;;6+wzoe_eLNZET<-c5hk%;O|w-3!j@ig1^!A!6;r?>z7!+N`k~ zBa$}SmNfATX-W{vN=a!#&3C3HC1qx2qNur+EGEOdDNXLg{z{0AMTNAix$Gz?>~Bgj z>2<$xjY?P{jwtDz_+`hWK7x>Hg}U-_*kx3TWZl(J2$usAaw%bdpYtVKy*L_Cy3RZ_ zpPZ9TidtNuX$*rPws932Wl?q`W5a57JqlTXPI#gAigWei!a|dYFtV&_DgfVmctV9^cu2#;|?T95R59nbvYrN9jQg<+J?;ifjZv4iS0eXOx^m zdkgaRAKI-f^GBuu+Hp<6TQc*&4IYdHJ&P$43w*4klShVZr;Kn25kPJLD@9Tl)E5X+ zge=*5E}Tw8^;a&e?}I+M6HstI2iLFHNv|_Wm~)c65kL9qx838M=O`~x!3{m6^of}L zCkCE*znS-_5mDvWart7RnRl)Oj=uL`&>x9)9@7ShNf^v9h$QH3#jN!P&`+%sB&pw2 zTiY%$b%YpBK_MZ9g~Y`V#(K;N*QR4BPggMrofs3*PR#gl#?+4XgA_q_&yuPb7&|kn zF=H7|EE#z+0_XP)!nipXvE`go{Ptx);P z(8f3Pn(tLZhY}Sg#oJh9qV#YG@n+fE_$98WKHCWz=@~fOnm>9Du^+J3^y}5wfx+_$ znv!jDez{LDC-E#y5bW)(#iSNXs#)PzEo{9+OtH`P%~>KqMr~C`iXIdF&73;+4h-6u9uikqY|8X@x1iD z1;Kx!^XsFIC%ccDB&|?rS_moV>FEjR#00E6XlP(TPd`M^NPncZWMv6CZqmaMJ1h*n z+fn54VPV>EZ_VnG*%So9fQ6C3ZZRpHHq;Q~s%x}mnU_VVpwH&oTdYXhFlwR2UQ$J1 zHT+4}rcA0UWF$+BSbGsNOw4T3gl|Nn-9{UNHA9!rFt6JS34Yl%nnfmAYO|4VWJRh7Ya_gue=RL=2;q{W;NyE0 zlW~|e#kX|b@bcc;XiD$y?oLxlYZ*yIlIQix0-|sh$-E7|v}c$8H9th35gE}5b+BPZ;&B`LdNByc_WmSK zJ4@v(AQGtJwE5fF@kpq6ypVrWP+zKwLfLN>j{iC!)UU}d#3?wD@nr9D9QQC7Q>xos z)06E22_t)5(6zMm`7vtoD~H=lns_*7^85B);0yY%`@SeVZjnq_JV>pXDh;)4ucbAu z%+sjVIET;51Uc}}_vgR=pf1+9*8)QU3{&VPv0kIiCs37oc?vKMj2N_2Q`l1-c=LD; zqaX;R^3%JlCa$--Ai5jH*39d+0G{wUj4^<%|qOg+4MCdrR`SRg2LIKBvDwb@2?W;e63L?p({+x(pY zcapRQ=X?&H9+#dBJrWT&@A7p{2nL(YLQF0oRNaua)3s~6Z`LHEa!hKnA50pP>Twm8 zM8B_9peoX zfyD!p&+*a>Zh8!IH}LibnzHJhEI69_{&GK>iOZ!0`GrJay=?yKcRktyH6uSVrL5VGwyG z4mq8tE+%?eUrDKpw!iq~V7$|Hp#Sc0f!$hLzX z_Lr(ktJCQvQ2N4bY)trZ1_=UzO_iC)kL%?A^?DZvdPDkXy&CnL^Gm9#aL+x?2*I-3 zEM49v3j$V(Jn>o+5`~OBw7sfn;2Hwr=XzE|6wq z^f*NZe5TCL_SgBNz6xoV`uQ?gM3A0Nrf7N6qRR&+$jV6l#7rCji*3#-$bBbg16fw7#$0wQH0yFc-rG-zjn-<0>Q zx75(qD41R1B2X@D=z(6SsH>`~abs=;87m26hA2*Quv{`lMR`ZUWM%dv6{p*F zp&1|rZ&93~zprM&T*;t=$N>XsTDb`e3;PIz)hs*xiZg^q9kTHdQflJG_w5eOfAiRB zXNwW5_Q)?KwTTW*{3gl=+b=bittr}iqV0P9B}-H8Pi?9TPG@1TY-#brGa^`?wb}{M zNSn3!8pJsb>{+1$u93faZz3i**2a}^ZK;r<{rEz|W&43C*5wUYO85d!s>O=8ui0LjC+dunksgC}bACSF9O9C;OKnh~DzmF!e>1E(0oUj- ziM)miE9;j<+a*{Kmm3#11x2m!+p`x;9UN(!_sN3B$8+Pj$;<9(bGI$x46MUak#6&K zyXV6_HRapQq~Kz0jY0-b`7{B);ZjZ}wr$u3G^hhQv_6}s&u=(t! zsYXZSxC2NS01jR>b#%J@Ij#c+iopJOU8_BVzCS69qJbgk1mq4&%YM-=`+IxF>q9)w z&xn1PSVRU4XA$UHgJx;F0(m&bfmm=N8og`qeKtT{=LBx)QNUCQ22QhQ_ZKy>b3WM1 zATo_ZvVJU0Khzb}5nvDSpJbjtDtXppHqk&{r5gg1`t#M_4Mx@SWX2C4_2>J}8IC1~ zkK(DU!Esi&hnfk`I*Wd^O0SY>lUgiHOfv(UxofGvwLxOrAZqC4)UT-=je+NP=**``;k?@y%5??5ecfZQn@peIIu-?3yPC(JFH_NCpy`WF$ zF)`7Xljl8v@9u+uVg7hBeb8umZQ2vmYjtY&*gt-UfRU5^>fJWdQiQZJc^glCGFM{# z;Xjp6pH!d6>w1w$tC}Lw+q3I&F7k8SM76?pt*sdC)6(PH-tYWn=7dtbE^_hEpeh?NNDeWy0=A{Nq@;({uuaCM3skPm zxa_x)p&_r98&$+&uB;Q8q7xZ@0v@w789AQV6c+{_lNUgsBX{z}|2_lzYrSJUHnRpD zu=|5s1OpR7#V?onQNlz+Q?+c>O-2T!fKf%_D#_jOv*&g8ObmEy?Jex8XJYu4o8M!< zqC&5?*j*k^&u5gXIr7slhMy!mNHp9E0K2fN?L;Ii-^&HJD6mHM1sV?nxkVc@WXc^q z5;{@n19ENIsK_k=C2d%AwmSjKI`N$(_G{QFHdI>_M_E3IED67>h{xV|eAHN#YiJ;) z-G`Go3CE~svZ3+O5}RyJKV2!G&uv5$H^iO(a z)%v4q;LKJt+d;Y1wL(u;X3$EO3?g?7B$9-?Gp2?4}sRPJRkCFtpO0964Ug zHJt^pLQWetU|!j_MLF6ioxCe!=wHLX*$4viEXWqov`b;j>c;3Wpu=mWrO$g*m2vAo z)f9AnV4tZ!89?%zQ#3z(%$bii?SlA~%}XJn8(wnh)m1V}PaVRJ z+-YNrDmb!Qhsh3yxskQlv%(YxgD>-%FpY#n1|k(?-o%CkQmKIffeAR~_910S_PY;6 zu**qvI=-h!K1HAWs1X@NRFFvL>3@J=vGbr2H5X2fwLN-T6LsKL^TL63^lij@` zfJOTm;EjLNsn2DUVH{DHsuk;2?--TsG&eVsku7*Vr#47*KCac?o$zaws*jIj6HbMG zU0gvTDB;up0pxcT`INn_=Onzz^Az52zI-{65Hk~`uvqMfO{N`#!*D`gp2f_J`iHPc zOW$-FOw}5E)MRHz;R_&vn*Iya9E_)gPvPk7ju%e*Iyi)5(T8s;FPZt*k|`59XR3c_&p$}xv&8ML zQv1cB3?v8~t=`h0$t~{hp?W;92D~TY`s@of&E)BD^ox@It5=!kbdDTP;yEvZaV+U( zXL-H|i1ZE32_>(yn=WtW6WO+{-%8r>pJ`G^*zC5~wzf6CA21q@LmnR(!6^?~!ouf7 zDDIhOnRr1;Pq;?H!v5Fp5<+)vqOjg>OkqHjd9*9tV!}NW0gSYRya{IkDu@B9uIfm1 zp72tx7m~{k0nHP>&R|uL*i4<4l8EJuuFqbxbU8Aj11b*xcz*p`fA633Q#bq}T4Fvn zO2}(Dir=3$g?X}^fmz|d+{f2w{IvfRH-vNu02RSk#;-dH$_0D2zyw-27>4-{AW$6TtnoNqBt2M{eP|A-bQ17Qrm`6=q{|6u_tT9BDLK4(o@)>|yNvFUD(T1*H- zz?`nNGy}IxNrfm@$$QFXGWZBO2^Uy;?sDuPjhRLyd=7&$`-x(#uX?+hd9$7`6^~My zKq++;rlxfq5Ems8>aQQE5+w8EFdiM9oE#mWpAb+_tJOc4oh8+se1duc01e=gz{+_V zEAcx>>|5`hR%9-(a#+Nnb{Zd$^Sq+E>li@H(W~`iD6tz$bE9F5QjA6d46QoB^<9F* z?h5ka&uKzPi@`%mt&S63?47;+k@;MIwjyZ*rSons(WjN6Q3Q#-5u>1@D!%8PD3fim z<7?&gxLW*Ffc1yvJfgONJAhY0!-gNC;F6O2!{_{*Kzqe&c)r=$XfEq?9f!$C`*)*V zSoCMKuj{GC%|RlK{?2K$<0hkSP!ixOvo-O$-LA0KiNN+YdmhsQwkI&4*QU!>4n`e1 zJoS$jOwi@auqwZPt!Kr>=Hz;{<6`N0tM~it-2ok|9}U>m!?z;Wicg6*{@A3 zxjj8SUzqh@za7`r84W^>I&^JM(Gj@TTp;34`JVn!26ngHuJ>z8a2S)BomrpC|No$X zhO}*doR^+nU@5yV`~IJ-@>AbTCJqj>zSqGiH@$l0_gdj~Ugxclepz60vDR%oxG!I2 z;dRw-bCQ2;sNKa@Y8)%fo9FJm5#W6*lN*y?)Wb944k4cB@F z9oOC_01v97vVd6rJ?P6C&sVO8^JQtde}TAYv)846_XM14x63#bHr5#`ctH94*KFuu zk*iC0Txc*?K6-RyO^#f63Q{G7-~zr%naE0D4I|KvLr6%7iJA9gy!@`^3sXZP8U_Nb zEaTrpa9RP)ey5SwroL^MDNYi+b1+L|BJ(NjF0gs^n7e7M-qOce*oikNBsojps3B@b zvysU|h=ylQ=!p))i4%O#7Lm2=0&T)U+eQhDvO|uFg&^<^Cwo;0c)gnKs2JO=ZWZ49Vz02V<6-3{;zRUsTlV z34;#Cll5}kuBLYf;^)y)FqO+$SxTS1o%8VQ$BQjhiF zdPcCCotj{4StO}0e^N<5#HNdM0$*RnJ$!v3dmZshqLCA-^L4^Q1qVTX?~3Q!4zs!2 z)dBf=_rCAy*GTClvt?jCv;eKbY(stB*7o^GfhsY%z{K2DuEye{AUg)y#jdP%jEC~X zoSu@eRL1byXi=8PW-OEC?NoUSMY`_aoOb<(<%A02a>W%@T@%L#X%}-`VYQ`}P(?na zHKU4GpdV!HpxbFm7{S0~7(WuYcjVTe67lH)=bK=j- zHmCu4d3oF01|1KJ7l%;D%=~xa7;ZHOVa?@&uwXA-%Rc=1j$iLdUPF-J81{ahJ@i^N zVYLq4xmeLc<%f|N4$6oIvjs6St|Pj`&5KVb)rOa4oUeoehY+FU zTy&q%jyVO>IQQ|#%ayI4(O71aXX-0#K>OW%P=K0@R9%T<^ea2q!Wk+OfjdvLqD`VU z=zE7IzTduwm|4HFurTR%0BGscfHNte6%CS7VI4q;P-Edd()cUR;|>|FmYsmqwWS%4 z^MX!m&JL_Ga)T8b%bZ!6G$T6ns;t^log%H@Q_oc8xw_%7)kR#%vbAs}WA#lX_{IFO+a(L*T(`p#r!Wj*BNRk%2G(H0G9U{ z(G;eRIn5iMOu}26k0mbP2_h#SFmOfCH&G&Oq%FKS*-V#JD8Gq6IrUs(ag%LUz8*WN zf}Jf;AWM_&2xP2x!Lb0N`(EW6<&pdKp1W^!7n915h^Blcv3=S`#P)!%s3|pbK}%ly zZnoVW-?P!GhmDlt6=4?aEg)C`ZdPgIV@I)OLapTUlf|Y9bh)r^Sxu_G3D26$ae>|I z$t?^S)J6GpXXJc7c~O_}&|yxDpR*J`hhHXQ%M5$J^5J#0l3W$iSNF^ zMS#Eu;;fCbMgmQnr(~emGu^No`;iDfK~7}#%qNj@AzPDu4H1fR!Mx*v$fJu2-)7yYV%bDF%Si-S_nI^|8EK!6jyX%V2nw^Ci ze5~g1f>9pn9S2%5^X0ox1}&ZyBt+N4C^-}C2;d@mgN!2_Z1mtiIdT>vfRy+KQK47j zBB4=_f(j$HO$pdmWhZE25J96sRvdxpCSP?<)y3d|{}o!Z*|fV9g@{Gp*JbQ`doc*Nm!k@-S0TdUcz!2l!=uDGsS%AXXqy_9U^^?fO(^mW=ESv2m*|ELpK} zG|o&GtMpq0!C~9xG1rh2Pg)cp5fxbSzRTEtl{@cqSdBYFx^xa`_oCeqvM4lHq#~Gh z((oV(?R}x$J#$HWz^O#QJq4Z^pMUIT~+1f0T4IOPRQTl2Lp+%M;@jC=C@jL>ka zoutb>ew;E;e3PVjQlwJ6G^#=HAFN;Ah=8Js{SM}_ryb95X7Bp6hH^;OOncWRcnIs9 z)&v;IHWb_8;i2*8ieFk4H8?#rpO;jr!95Sc+<#pQLP2V<1ot#aPkwBQ=fP%S_SX_&6Z7zfWLi!q2g9#a1!F;g}8cC-Hd^LJ?irTTqH2!txd6!A&MZLJWZ7>Zn4$w ziuz_{3f^$RG`GB)58~cKUz3F!%Lqei$3j!#JJ{W)m`^&%nKR`RHL(!a#i7%iG5L){ zS2`fs-(*&g=t4MSm3lk5LnMPj4F@CK_%j{%0kmbM@)@Z?PEO*(C!JF#wgX0CgV^Y` zEu4N1hl1GtYUg4?t#;yG|NeG{!2J8R(cclv^zj2=N}QGsnJa?jaEo}Ni$T@Y3v-_@#EThRW1_D{-|NWl#R3W5RP+&{mu65r^hHwdmAs4=re0Tl1@2YW$WR5x9{oMbXOes6t*8DT{1AfhT zao#CZrCP>ThRc6vLIRwKUZ8Q#Cl`mEx}nJlIUjpGq9Fy9%8re1B~Ok$KF`1wCkAun zm4OSj6T&PTgveD&=`>eV&5m&`7_UX!>J`t>KMz ze?B6cNCbtweuMWbxYb5l@N^(HB_;U=JuR*3H_t5JrdKr-><2wm^RoS$o ztE{Nyb1eZngs;<8XPB+1mBb_@*C3&6lKi&?qW!6dIT97kzieda=qS8q6F=VjgY2tP zBUc)CM5X>lB>#yk@!5u}9@s&_O;Cj{Yp9*l-ua5E$Tm7Y^}W*(1eWKM3kqCeDfwvK z);{qH97hDp(eR{LNHa|sV%aGcuXstpNczL*+TTwkDKA?MkN~*a%c$)77-*QaKiy+_ zV62N5sxS|?g5Yme1%P&dD~cirt-cortI7J#pBf7T*kd*O6fqc&GNzJiy`jrQ^))|X zk0TgGOZT$Npp1Td5uSzH$FB{Woi|hp2^;<{@l>IUJ{H4*vBuNKZr8OZmkQ26!hL^q zFs-dWx;ZUYqpUUEVYzw$z)kX3BK}u7eB+_nCs(#!-fdKF9aJakBr4Wr zBBHfQad&;^9SRqZV(pDmJR;t#GwW~o_rX!3pXPnMttwT4(&MS>?CV_=b zi)M26SI-%+fLp8|pUG8Haq|mbRfh8O%&d#{4lFf!SHl=#LOq!*zobCxuP2jQsfnYz zU^_}gIkKBINN@kg3QYWC1r)>SJv40_pn@R{Kiu=oA1>B7>}7a-4Bjd}0~I5d!a$JV zXBz(dee>KQn@A~nK4zeF>)|yR8Rz@7lJ!Ft?^beTrs|9K>TL`ZMs-$j8vBxO^|T}; z<3E&fGt_%h;x8nscQ@wz5v+cLo2?duUtsz#)Ft)SZc$r(T+q0AOgIO|V$(rzN!=wP zEdO2KpYMzNksHuO0t%4a@B8lg{;_6AsUfFCd_sM$!BPM`Aso!KjVL5oop^sY*UDop zi9<|tGsUGQELP`)b3Z*|`39l1J$L)FF~YDMAqLAM>=iKM1M8OoP9 z+L=nK7c~sp;vY=@JlPF85lJTLjlJw;LG^#6@ZCv{r}Cjvtw?sl7PGKOm*>wZ(V@wo zHXREqA(XQE*hSDfKn5IIUQ}NjZKyy7n^`MSSagqPbDA9mE#znG{Esn0oGaDY`kSq0 zs-wRKZ1D;=aakFuMvzLZ%M**K)&AQ%94eY23%iV3YZBnU-*ErdF#_GAOFN#y<^7_V-v87Rb23YiayD`WY+*zZ5b1VR|G+e+{yH&VI{14aHUEe6D|=!>tR z?aJMBdc`G9F#G#kT@F$&9sYL(PCW-B$MSxS+Yv2a*fkrgo)VX>-p=r$u^5U)Wx|uG zm7NDz_qku6E;3@TB{I|S{F*8T>j#Ez3aPu8fgS*`1vSsx;+%=Jfzm8+CgB?{?c<2^<`3NAj1wiaA?AQgwpMPj{~ZWv%E z>iujFV+ka<44SqhkAS`=o2^EYbA?&GV8jkrKhL=g)p8gNWA<-Ii*ZQevtO7ag5eGK z|AQ>t#DNP4kOg`k7n;1TbQ}uW{I7GatE5C@H7QN3OIQUg6aM z`AC)bUwm%v0{?rMlN&kgfQ$Qz-#`@DkLd;i0|EVH>Hn}NwshVg2w+exWq2~&2~VP= zI9pErfy!ZbX7LlofiyOEXJ>~}DKV3OZds2E(!QJD!G3)bSZsoNd%@n23He{&3W(&h zBt9&Ley**o48epLpnz_NSDb+q1N*(yst2cwa!EH;LD|(H3LL)4WVOs+DI&b&>D{E9lAX}Qe-}hssh#DS@K>*}|_!N9~#s_OlZs3UMmD-K* z_i*|_l03O%yV~!%@;$`?SwUv9o{XFqsdB2rxjj)kK090Y;dlrX@OE9N|Ka_fai^#? zJCW&s85wsuQ+0Zu-I2@#bpD~^kMESFt?pau^&dD$6H<{7N75Q~} zG4Z&8Kw7NU+`t~SJEe@2q%;DJ`h8ooZNv#-wbI_qVF%xANyCJigRlMV+o`$?7p-#5 zZ+-8=kH`HnW;CSJsmJSYe{;^1ErEv8OYbTsP~J-7^3B+ReoRas6#Bc*!%6T^?$hzy z+Hv_Hjd~@UR|y@*gHyCfn2=Z$-=_Ctx>)WXlN>s|DmS6Y4IXoUnx$IPKLa&?>p!}2 zTdu9vhk))=8PBoqLcH+GI!9QL2Y^$d^@qvja?x;6G)WI5>yN+P3V$2A#yG|gf(=N` zKvbUV>vLf~t8yKkna@}_&#t%Gr}jgKLBXQA@1cmgT9FX+a>qgh4ESNQpvn(GX z@nU5|0x9tS6xQ+S>#XVS&h{()H^AE~mcjOU!(2tH3Zm~aWB$N zxVSu3x6GKGUs@V<%``UK1AbI6nYL!=d>#2HXz4KKF;Jsnb?=B4S+GLlqC>9=+EET0 zOU7)-TBokvu;p5Ff zQL#@Jrvd^cGY~DdtB$c*FIfW-7P?w^O<*Xo`v(j~*|J$wU30 zX2<(29=lkhjsm(8y|dEy<$u^Q0?-zIqt~g!vBMMq^;0|>fXZi9Q#PEGO-fLLwxUQ zGiAK;Iuj(^G8^|t=QpitWp{b^wZ|o}2Ifr`Q9lPCWP{t?_sOv z;?~lMtn+6a}Z-WIbt)S`jF#VC=V+ zQmG!{wo;ss?80|C^jocqN}6ZmJ57xE&v3@0gSMiv-!#4x89?=yCi^hnFsTsb9v8UrcJxAfdEYP6S|NrGI zG)rVGL4sUZ%X!UXpVF#z7OR1QOB;9-Qcy$l3vfHf`2nN-??eiHulFbOwIi?Srvr2dHOgq`TqCjBI`xh6Z)ER zCe`}`=sc`G-%#r`T3FpX_$Kp6YHHNOgC$pI1*s!ed9tUvC}unD_wM)C-P-RXL5IUZU9(6b8MGXypMMt<5SsK7mtO3&wVl{t~g zUZucKOU20vz%OLt%8g1xXiy+3)q2sV+S*$H9VvNt1@5qkOesRS4*c2W_TMBiv~Q1w zUpu%37-rwa52xQ3s1AHOZC_%672$M+*i8uEi{9}(6U&W})v6)kC^UX0+=G;k&YTOnG5TGF$$w-3f!P9of3qcH!B`0I%1Poi3Q! zfV2<@m4guHC~k0?;)vlc$0B@enMzO9S_l$q4`sm+3Cy^dvU?h4+1wK^a&K)TBPn|s ze3)Z0-*B0jjYxRCuwDf{-d5PjOHlv2!=X3P5Gvw8tJ!DP3yUkf-T9n=wX1FH*G-#p z16}67>cV|oIs$0H@f%nUH@6qt1;wBcs0X{3R2sNaMc6M)J+|P&7P|98gt{H?w>JzM z`p5Nl{m>I}&>$-GT}FxEV3A}Anf(vr%}i80tV@C~Hwb@Sd#W0QMsio_mA4bYsA2Hg z<#M0)CO0~eP8O_J3I=y`KjunQE636ph(68--d@^30YC9Hb@k2{iWCch2NdaS$^CIn zr2XL})0K?oRM5xanxQ}UbkXCz{pTA`^~GkQFY{;h%M_M8O_P z@M6A)F~Cg#?JlCmq%siVLmhWiXBiHWz)1iXeyoKasV&$qNK=; z&<(9<;gfl(Wy6Zgh1p9$P=d zlgJ1N+Ra9$>lYiKfLbR*fWE8sf~w+iLw5I@87-tohFc;Dz4ZH6!r+Cx*t2>X@Qvet zMHFB*>FV!8GCUwBd7qgYVy#FFbD@+a8z@_FJ<5FkC!hQsgvKjM}4?0%)YUE|HA^*S>+}Op`Yt}0jM}o5i{OB5t z-eP7rNW0P=B8P|jw`qjsa5$N-EqGOU28wD`zQfUAVQ1EfXx+}gk84Ny`I#AuSU~B= zq8?>=Ir;fYE7v*O+-sXxRli)sD_MkbPeT3=1q9R_A$jB|V)mOQo_&wQ-iQ<;Lmfex ztXF!&v8Xit%70BF|6bt3Z3u^JP1efQ{~K9x(#QZX)Fyy01K8qoX_v4`Rg0QdNf zL8(%y)ubMGVXNJuRcF=Y^zlOEcLMZE12nN}jT&2l-1*YWgZD%BOtmwoh2TfFHV212 z^$9+!DH+?{e*g;U2{5q>^KQ~OcS6Qzk0q4#tTLYh7{vO9h6cM$n}q_;zi1s0?Qc;G zx0g3s6B%rM{Q&23qxzq|#i8DPs^sH(E=#0;)x26qgSy_Z4*s5D<`*dmMaAOcJ7Kj7 z0RvRs2S)4vl2(Kyf5m#87Eu6V&aC~se)`r>^KE*y8ZDr!S_|Ae^;Eo_jbmJ%SPDps zvr=hQ_my9k5aBL7_5HmBW?Q23cC@iuyns6d(6;uCo(%2$O{wH|KUscDp;slUVRkx- zf4<9kb$x=z1?C3-H^uTg!_Viv%dEm}`Z)bdUZoOOv-BPaL>%g3(b}2LVf{l#8lkTX z{HgmNW6T#>YW0fS*Z(lre(K^+jsJ@`(*7UM4C{ZMnU%TL(dU{mbwDfg(B@`asp|b& z_*MDu4Z+R=@u#BHlVh;rw%R*Dg z`m{R^;mG#P4|(*2EcjdWYx!{m=0W)8_6nhajC8}??wvt)s^~f-2Q;#Q9yU6Z6c6hZ z{|bua;JEreZxhjR{Og~)iY;csOQy1#%zTqm8_hPJ4_BLXiJB6q>fN{A6Dg#A>OP%r zbh!6C-M_SkY>d7wSTAjiwLKi<1p;=h7fQ;*`Qy2<)R*l5S7rA1j3F?6 zXg-5|3e;LgaXAm8}i%>sN6b;jR5e^vUk zzT#|5Dbwi?i2mJntjphaY7wZ%Sh+`r@jc&S#ZGMj!<(ChC?y*I)Y}#ZTe$D?pBFkI z6h0TTnV&Ruil6`*o~4zGt;)yIUh1x}&+Ai9hkeImYaY6AV2{?9%{}*a4HZOIT<3cZ znZEeddPGnl4ZNm&;n2T;(Gea2aJP6|2ba&y#(tPd%~AE=V106@)M#>}Yf?r9Rkrqr znQ|VicW_vYtnCfQyjg9oqYp}F@ws0B`;yL|3X6Dt^~bhf`Tkdnq|xPm&-`0`+h)Zmt0AhYj#!&D1M|Ufes}=L{G) zIQQQ9+|zWeYpA${L8zf46*09hetFdT35Cy}EnV{7mBYEa8Ea}UzW5=GfyRB}f2xe< zRwt#J^JZMce6T4M!uNY1VY_oSDd@iK5}Fip#_)Q7`mV+!FiFI$b#D3yfdcg2T?{(+ zAi{tKx+I@s(?dca5qts15|7t>!#U4Eg&&Z&*~!%){fU9!Yu$s0`2g-m^H@yBqaCDl z<)`^YI8vRajrXMD39YK2Vmb`g!38sFmegB+Dc2yWd@{VgOn9W+QAJN9pD*I(MWnF# zBpD;`WaQ+3rr-H4Wq*9?aj%gJH^U|To&%3hBHTGS-Pc1*gDJ%*9J#6pZkms&dd?MI zb5`_{pY~ldX!I| zKwVoxBXq%YnbrRqor0S0et9i;ORK?;@50v&EwEls0j%v=e!K5HI2^)4(M8XVgEY@R z$D<0d5+)>m!6|m>2{?2U7%A*jAf=(g9%g$w0L5!~P2ax5Xj$L%`Y?o}7XS zn|MduGOy)5u5fCHqILI1sBN?WGo_(}|BcVN9{9DR1l*S3ebDf~iFhdDu5y_67p%o< z`qV!%k1Pdx@D_}#MZZ-K8=F#b8)VEv|LDk=4cu1~RJINwGec6+JRn`q#4gUPMxRE9 zsP&>nb+~#abh`*Am3&PEkpy6u%15#E9}ZCGdWg5pe6CC=7!AxQLZp%l=b0cZeUY(L z8hcLRJ7&wg5(@Yf3se#fL)Q*l82GanN?a?m>*}`X{&aC%>Z7d#naKJQ|jJs!XE zgP6==t=^q>kvD8@lxsJjgFCrxEi1F;3HPsvyoBtT_eEX$)gli$w#(Rzg*#MtIL<4y z+s#}HFR}ZT1pcrYiA}r`M_qjKg<8!4!_e1-THgn5-kZl1CN+aUbL*+ z?!`>}p}9CrjmD{?;}K$DeYjtK<#>xEJ-TGogsu<{ayqg1{pyU*muBmbxgjH~$RDkL zkH3gjj`f5Mcnh&)#+KetV*KbuUpV+Qe(bhPhyI6AlvlC*-mF1h=i9721qnP*^uOXR zvkseTnfP&9X~{&~IU;l)TWzoa4dhf$4~!mVh^gu!Zt_NA!ZDGSES#{2;L4WvyH9LS z<`0`D?rnZv*S?ash;a*Yz9zLh_BU7c_-~o;?;p_kJo)z-rMEo2AtB-J#TxD9!3Ri|^YlADswMysYMHm(mw#v8F{W6Bj z-ic~M34W7g)QE1HuI;}YP`Qjnvpp)AdhDmT{fmZf#Sin1lTnC@8!K6k!_E1 zUJ^BJGRTa82{U=(r-im|v~4n1yr3(gG4!|*ghIz`JN~TCv}iPoT*}qrsYqHv zh0qNJ!gY&r6EE}>8&rFK{%inpH$E+iw;0IaPzpGdM~pnFF}!Z|8ZJS{Hn>Hq-6CX{ zPw$w}-2dkBhgXv-BTIsx!poz4u+9B#EsHG4I$Of?jM*rpXC8}ccvyEa)u_l?aN(kH z3kkUqN`9da1>r-b-q@NVmvxzxf%9yvo+$_9zzhpq!i$chqomX81?w{r9rfM9aN5TH z8-#&dkdn8E@aoR@vZgfkgcRI)U~IP}&HGGRw0rhgJKj)wh>-v*g689dyqen|Ehj-X z*d!u*#ZJOWq{+qIfuZ47EGDx=*EYcy-o2dQ+|cKY+$d5KumB(*l-C2*QIH!Zwtoq` zKB^og_RWwiE(CmN+2ISuGF<^J;yhd8DyHaK0`&7Dj-@bjLYWSu)shE>c( z57#bUq37^5j_uAVzk^vQ3%ouA3kFS{(Qp%dTUwMI5720w$t zBbDBMdEcy^5kJ#vI=Cu_t~&PnBq$;W$6n@D?cKGL6MTFy0D)YwLYoTlxFLX=@FrgpLTp|`b&xO79 zyXOBOogoUy9!{~fM6>SQ!c?Qwl6ri7>=tR!Fva|i$|T{%w)*!s;ZXC=H;iL<(;vFi zy%F~!!;yY}l%O$~$;-rC9+u@nknIkZfD{`mXrL7Z?gFVWzz&*Js)JbI%Xfnz|LvPA ze&{T&)N(`y0u1JqcAK82Cl>jCFLans)O8-h_cgnE{r5t@31L!sG%!aJ)k3ij%z5PyDcbhG3fC( zw3$wH;f_M=N~2-z62&Dx{Au#T=omw;grwR#P-{k&Nd(jzqIn&gz~ZD6ap?}J=%G?G zRNIUW3~J7sv3aCy1(%GR_V+K_ih4~*I;B4Uguyrx90(<1x&;e$VO)6`!}3kXLDBup zRD~wSGh~w@d7}WXT8nHMe9qsOPC=}*>(|hu5_iFC{-j+D`uNqYvTaJUs=tChc=H4~ zNV9jwYF0^i&>)*3o=-iUKi3dlb2u%pBJp=u-N z4=PjGwX4*+gwuOf${<={NDa1~0b>j?fA1$fx4Va!gu0fYMq5O@-FI{=3}Fxn2nRPT z&@nuR82uoh;a?m4%fdyh1}MXTbKn!KSlW*|ah2Fx_wTc#Z$P=U%gco$aXN&A9vhi* z;D|}-CSE)fG`l1R%~Y0E`?zy@;s;)3DQB(cpT+ay-$Ng_Qa7iR2n_eIuMV^E9;n1H zdV>9*eIaJw*9Q|ZieTRW8Niv8W{bkQAg1EOEo`y4m^&ret&!Gvn#NPqrxgYc$tyuy~Iw0 z<%DztEFS)PavyId&zF=e47%W;SI3K=e{a0hQd7-uN6-K_1fWO(WDLP+=l_>%VfCL$ zAvkDUjLCZF7I>5|6x(1xliH?4eovnvlSI z_s1JiBfNWsC|JH6L?DGqHCZ~uEY2X~#qqeb*II{@{{#@QmXI(o{+v(2A}{yk7qNI; zXXodc9LRuF0d@|c4h&unVl2Z^087JD4FkWrT`C=3hT9|P;^1icy|}R-1~5;kN+YqR zQtMVE_qqKK;mcK#!v1$HV*uO4e$8f5LhJ&55UE(COfL7+cK3#)_wH~s zem?yC=7}AE?KFO~RG;4#f;dN^6&8yOk@;}=`^y&&_|Q-^cJ(P-*t>eW$?x0bKex#y zF9y<*a`KWF8-*RSU_z*|_}t`nYpKTJC^nis|BeMY2wI7gIwW)=o6Xt&EH)V;La|b< z^J={T7YkTv%S6Z7uKcu|ulQ^kj?WAUayftfJH%G0g#5*B?RyhKfH^LQPN&7M_f}oY z@I>|+-Hoc7vC%i6sW^L@#h;V{2PO2P0`|mUw>d`9z8o?J4T>{^)vncKCg{zvLkWe# zR;#1k`Y^4jjuW^G2cs}$-VBUh?`-IKrs$wXMdyvm$CDsWzv{HC`3ZUf|r1_F> zSF$u;FpR{J{JnQtKIB$0Y6#ZzSv`q{!qgmqdsiBh?(r%(0&cAZpm4fhCN1cWaiX6l zo|OQn3E**Xak#vAgR3LkB$UEO50ZYTllhB(#WfGvq(4OhLqbAw+0Ejmew$hdgU(T- z&0=$v2^jP~{l1Kg<4Z{71$uS?JT8_{LWl7~-*hy2W|htDc4XOB``@WVXjLMF0H&~i zFRD+yZ+bqL4X5^{ns?OcL+TFT=4g9y+mJhpuxT)PD6nqyKl-zC+>Ot;D?j2-o}kQp z0|MSmHE%%FBDZxSqa#9)meCa-LOO_N?MG+_UTDIDLH!d(R;+B~?@;6vzONC5^kgus zFCyfBvCxV&WV9kfcJ47W$*u$?h;}OD^^D;Jgbl<6GYcI1!vKM-=l=&x0VEe-pf3G$ zCd2WHO9huLc^>$JwA;Lpa-Pbc?~L5eK%lJu+v5Qw zFbV=OSnT#OIWJFGz!u)K>2+KNYZ#JW<=EK&hvVS?(q}k!FahYmA1*>9zm}I98t&&< zuc@{9-yCf5?CpBFoK|#QY;>K{bnNchZ@y+KpSZcX0bBf_EG8Vu7CaC?aP6#s_}!^)Bk@l36po_Sh(u_F?5OYJGXprWG9?j%{pxCd(nb|G=|q)ubk zjkdY!lrDNxC(ubJllf+vEG}E)6kfUI_&c)*plB{=8OnNnE4m2OZ67ylP|TF6WdZ_Q zr^;-Kic0Dri<7-xsyKMu>!)lmHhp1oSMYfGgu)L#0+2Q{lItTeWq7T4t)*mgnj1dbE-b&>Ku{3)OtQJyaD1 zhiCB4JtoDK0(GAnodz}0cVGkY-zz7$*g#Dd0rR>p1Kklfa6h|`;;cE(kYlC}vFsHE zp0O9catJm8b9iHC#IL)648e|{=af<`Y`k3`+Ml=n1dv=5y6qx(xG;m=hXCt84sagu z)lV(<8_&;~PyShaKuIogEUkvMOkcn49~BlV@YYD-wFd09-GBM=Zhu^#v(eF}H1iJ` zvE67lyh)A1VxZUR{Ih($1;{p}&FYyw>tG4FGXAP`Jp+k>@+u!EH*NnwDTg|vChG+m zcA(}J!u+3r9S`Tyybh?K z_*!%M+5CPAsbtuuaCl~l&2r;#;HP%6yuXQr#{qJc!^!3454sms$;j9U&32!`-^%9n z`rY+LcNu`V+iI>oB|fZhY`08n>kkWH6rmM_{Wff)|KI0I0X(SQXkzul{IY$olB)Sb z2HgveT<}N?3OzIzT&ei`rRFiXlBkNHpx_CF5R~OE#wP@7vEIK&T^uPPv4X@x#1aUS zf{7Bcu;nIx{%0E-E7|EAE8Y*yCf&I{2A7lLT;`MG7dg%cXFqAfB6kNP-yUul-g%wb zS!hmGWNZMQxS~wAqbYK>>Xd93u@jJHx5s3H1P><%-7XU8D}l&>tKh#jBc>^0)!Lq}Dq-A}Hhw7k4({N4b^kyj1J=J@2~@luO? zosn1yx4s|WWy92A?CX>V2&j?i{~L?bnN6P`&XaO;w=U1YM8bL=eu)!7fHnzuM^rq( zz`)kfR7hLxN-br@FYK6Yq$k|^BcavdsL^z~76Q;e6J9r4fP;f?1{UjRja0{Br)FMP znw7xStE?g7N*U=`^~v1yNX3ta(y|?Wh0)#u8HuXX(Ihu+O>kF4$eohjw^}7+g~TvA zrrfuWJHf`+t+zj!GOD^VS(K%g^&QQQFpVCp&h67CAw4d-pUD!bb?+4I?cyr#M%(K` zf`fCyyFjx-Uc*HInzz}SHTMfhm^1*82@44c4UHjU@p}C+Beik+@}O&|T4@%8l*vvb zus8Xk+M~xulbC__dg}Ameg_7cDV6i(bQA^(e!2b^ZTC~n){D2t(J&~0Ht&Pic_?}8 z?hoGR^;_dhHE$i)0mf-)+N3K@~-+QY+Rw#oYU@82ehZQH;cbJJ?(r{*AhK3HJjeo(M{ zPNd=1FjH`l;-FDlKJ7QnZ0vTnu=RDFjcG5~3cS33`tLW44xN>M2T6XAj}{Gw z+xr9Su3NFWky~#h@_-G?MlCkc2<0Nc>DRB|O?Gq|M1JjiNx@aPQjg!A1LIb0<+XSbo;Mia6%M8 zG#qF1CP&|3Aua}p-gs93#BhW41a}+?m=hK*F^JgnF?4P^%4wv`=|At2TfESCgwf3s zYS6uWn0cOp0u@Q4BL0>TaG4EM~~LIvM`1V8)EwCA^lXGzI&mV*KTZt(zq&>*I* z+TAt{tJmsr?DuUb2??*+YQ^b#mPotB>kHS@PSUh%nH4PT64fa-7ZYI4F zT|v}ZelFg_2F?9Z=&ASJv5=yo*Kp69Lth98#4<}FKUQq2(E#GF-vZQtY#Eq#FjrF} zEI4>2nWWxcV!+NV@h$;AGU5^c!I(Q6%`65eY0iPz3mD|C*V(8SWPGouL9FJBUiJ_Y zTUyHv0uoSfe>h4Ccbli@v!B>EFkj`i6dU)iRkxbpz1z=w$7$X1jiJ#3Mz*YaPCZxm z&ipT;IiRJ#Lz2sN+}b!$O#ioEeuW$1bxsUM8??;M}R642|PX?89)yieJ! z-0<7|1w^>$wTixzJ0#=*g}H)bRrijhu&~kfyb%>SFfb+}iFMuKf^gYZ*k4JgZ^n~sV3`25%mA?L&l zJ6ap)4cokho&0{3EHYu_J$Vvg$#hdj2da^HKFE_a6aw=`CZpi8%7nP$8*0S8&J1C~ zVw&U$dg8>YcbXt}dS~o@%Ww2mIj!qDf`Y-|T~IK4Qf;26YF1WOQD(BXCMoehKB4L9 zKjA3$=m{&K>+J{~1n&+;DXu9+p`#}eqM)e5Emkt1jZaO*MeuFZo8C-M#{*hCV13X*xxz*!&n%Y-s6gvHPe>7bw2?#jwK02DQ?|$j_&h6eGOR-)*`dV!9 zb}+$awRrU5wIxni-rzTf*`Ri!0LaN8p)420imt6zI&n%>c)v&S=ofx-b!s^c2nYa# zjC5Lm_v$bxm6Vh&Hl-`oRC^leoT<<>|4egNjeSFLs=_W;VUqaqHL`n?INSSdMjV15 zK}`i1w#9`T?QAur#W}?KPZy*mq!N4V0-G8FAfa}8t^PGT9;L(%$y|c_urgqt+65u zs4pIyW|M~~dh6}T%E)kHh+#hbjq|gSTduL4VQYnau3osz%e-TMo=&WvhGL&^OVu&} z0gC|w6q!cVZFINVrazVWa@Wbw^W^sNEBG-J=RDUI24t~OVG2YE0V(!YCj#obH3$3q zK-SM*0yltxPc>P?fFxvPRcCXH&j&?>g(E+GE!dO5gmYFB?EOqNV-APXFei4aDcDOu z6#{0rM~_7v%4uG?Y`3$VUVQ;}Bh8kP-~}zPoBRt-k;LUO*u@vk{EiZvu=3j%VOr7m zX*wAN?}DjFCvtR^k1}0VDfHx>+yDoP8#FQGj^KZEqcuem49%-l z>L%*(_FnTqz~>Y~1F2rEH+Q|C*5P)c0yv!9w{Yfbe__xx=Cbkvuz#jn6)9;SjT$VS z-p?Q1WfXcL>znS!PCzfYP^s=; z{nqgId=Cx!b9hMkg`&x7g_oF^n2O4xua(JkEOlnX1&FMhYcIB=A}NGr>ag)JUyMYf ziuhHHy#H3@@kxw-9xVW{4mu@$c?Ci;SNVW#=jsWT%Eg}x3qgWJoF+1g<>=9?{=`K2 z>B^;9T;BBWRzb9szwj$io>D58?g1>UI5IyF42&!c$u*iET%%{xugI|8_E8r#69miHy7a@0zPs^_8K1K?DL=vpXKh zDReU*2D1RR4+w6mdTTg;zB?BC9>54LalRxd-m`hMWU3R*nkWG4N&UX zE>+7~JjDZ3cW5X`3Ef0kWWq2Y+C6(`&7+S+m}!-tzHz9@FWMz*+9F1-=%-?{66_e#^C|*9vBvE>B%+ zZjTDGU76PeAbsG^JUl!O4-dO4GzieqYfkg8Q402Vp)J28GDU6y| zegnJaAabkh6hCCw*Ri8;W3UdQxI3{fFf@ zj*l5lJ;$;8UkseVOTxPaS-6fi9Qr!Msge=uTt!}N$Mg)Gg+>QC;6&egY(^`|1l7pq z9!oJ^^70dBWD4=$gi8$=@sAWQAE2;xDC%jT)b<1?Ot~|D_Y^2{ntwK5Si*_;yra{# z!n@dtwk5i={&7Lup4DtW-Q~ERy?*Uz-EJZFHyS$!%lD2J??PE3z$&QaU#bH@YDg$3 za&4}suV}Q{bGDw(*LAxtWM0OLQ~iK-VCE;Mxw6LN$OvTkEFKrfogW5psHD)K6Jh%r zi-dvV9pnSa>n@w=vLxpY*M4?T_hT2cvsWcItGD^v#kK+ty;`cEm8q`o+E$^k5Gh91 zPot(>IMDs{`Muw-^S>CqK&Zj=qw(Eoxm2&F-H6EpTm=R1t=prPZp@?@aGdshxo-2( z{MH-uHEQ#ei$*ot4XEsU-AznQZpnDePfFtSM&24!29?yew!40IiO>^rUk1`8&`Q3x z@$>Ur0li?x_Sx*Zj>V4F7@`>eH0JE$y>Gg8TzRQB&wu9bb=d2nY!D zMxSl%W`sbT5p72|aoJhGh;7=U15FT31}u<1zuY~q+3N85-93J9!~sQgW`9o00}k`h zxXikQgoJe_y=@I%7VUn|r%SiTi1%E_+%-=o6XA-9q*unvXQ|di+z_BS8_Fk_J;uPI zr=Zc1p(EjopSAgP9N}w-00E}u+C_||KhEq8DKheX3Zct(o7PA&?np5tacCGDDMdP6 z&#K5nSK3fQ3%fUGb}QR=;M^Kx^EQb;!+*~vWdcO@HO-TYqIP?jrO|4d7C2KbH68U4bm_pMj5@VhW5QVirlX_dKvXu5 z@5;fu)k2O#elfF7TZjFi(ln(oOxhMD5U+r>VUTLd^Z-e&jVa^=xfBm$lktfh3{v7Y zn|3t%!iYz~Nc$ybM~rF}g8FmqKoGtSSj8`a4vM*u=JisAHbwpf=IqxZoY{|7 zQRMS(L%fPHLI`dsp{1O-W)t)a3TPM@5@B!skrsq+aHwtWwLt9J|GU|{B=~NK`k6-? z_Hl>J6Za7_v%T5lD*A7Ou<3ZZW|{HeX8s>criOO=j{`xzCK|bs#Fd~$rjdqebc#Z; zbjzipNK*8G7D%&Fhe(1h)uD(6eO`moB!3L~Th0mx(WR`^0Iml3=a{!zR3ThKCo+RS8YFXb z=nvf`NnBSJh5dQGdzMqm1+l8;bk7poSya>sS@wK<`x78^DwDz05G{g|!WQW{-jamD z`)wjf$h&-fGZ7?vps;YnlrH20q*EO$E6wZP*JnTZKgW>EOx0t_%Bqe3PQ&SLjj9C&bF=_-*riA z<#=R+GC#e(V#{!stCr8@9ZrWvzX3*}&j7;ccE0ks{or6Hvj<7O-4ZKaA|@h|1ImdN z_zA-(iT6tQgC}+)sXJrL)-8mq?~Tg@)_+maDnf;06@fcsmFQXk+hz$}0wlskZ2ffw z-Wbmum0xA$Ysn*+V(QZ*KkJYALVq4QeUqIir=db;yFA!JgbXTb5=-R=u?lgKZc^Y5 zfWYV-bNSB&_kZ?xcV9j3PI3&WfMLHn6g0^#)lR$AFRt7&lzCO%`PQBc<%>S%r?;ZFC^kA&qp%pt70=TO-A)B7AM^bUrT_?RMAL!Za;;xSZUT ztUusunpD^vmk*`na;)K33k8fJE3<0upmfe4K{Bvw6%`CArM>~O+wq_E+w=3QWu$wX z-xN2D8&ntE979a3Eu_C3OZi3<{WvubF@RTeP|A$IXcuS9NFaMbWiXR#By8Tw!6Y6a z;Y^yB1kQ8x}6vpXgE*5;y%kTFl5f)e4B%kfA7JVjgKui zmv;)m_0WF+xjMrc_AlMXbB@bXry)pdQma?Oi8S<}Qs|p9Bs7(6BhRGJJJ_hNK+OL{ zKt<$J&f?&S;4a4HH5*C@NoCV;=1l0WU{^(!;CCgIZ#RQko5qEJfojoadaH8vOIcq< zKh}kWK_<-_6ncZF&CXhjpKIOc(Ogfs1Nj}K&1RY)x7%_OQhR6=Mb1Fuqfn3%#GarN zlzfT8kcE?Wnj%&ji#?hejM|l;6uBYz7R`ABIvbBa{HTbEa$HdGt=EGh4MGWi*f+;0 z0lh$Nf>_aC0qY73*Ro@}?o+@@lS5a_4L*KEk5rJ%wuuRexM+KYzi0wMzQOB#!hjIW zvwWO`s1>%I$R2~03UVBY7J{N_82%H3WQ?C+njY`36qsZKB2kN?eL^;=52P>i&e9uw zF-`8z-KMburI0D8ymfAzf_l-LV%AX~zUlKBf`L*LB%}~LQ2ulXM#L6_f7cDLJNk`a zwS;37NN5!zK~ms}krn7soQVey5wv1bNKr;+mi}{#_y@-HL*UF4W3*!s3B~PrPEmCA zTd_`h<4#>&`gX$nANBPYq^5PuzJmq89)f8D+Iw0=N&lFhl2cci%Pi`kc#t;4dPl{e zKBORcfSwXmtLpZ0%dlG3XnKz7jq{VfW^;=dGKAk>(PAhDqLI5v2&bkP*@mPSoj4%Y zlrxJ-e+AuOHug?nBC7#$x=)aVzmBk!;VDvof8(H}c8&ogZd9a$4q8)-KG(MIWXT1y zh<_!8fGFO~NI@G8ab552nW?FbV~N0?ed5|Jmkm(WqNq?&Pmm1Srgu49 z|7FsOO_Qh@GsiI*S`>Fva;K-!$*={kNDXDVPfBZdYd1aN)1X~PQA}u-i>mrfn4I%qXu|?%V0oi#jh#Rv#!Pt^6eqI>o_gj^vXi(%F`Eqrk+C~GsMIew$H2pr z_fgKHv(!%5{0fzI#Xy3f8qt~L&6S6Ai~RdSEQUGy+~NqsK44o0f#>GeM9@hd$?}(c zLjj#&0ulx%Q+73SfrM*({>y@|o>XKu?55F@IG(VSw9ig_6Le2vX+8ee*$U;F2D=o@ zxlkUr^o=KuqfWgAKlB6m65+TfHWRh2s@xN7^3#+&9r@3j$OVL-OPCtj(bJOP4d_CH z5$C5}8BLC3bL8rJV9qVO?~~4-F%jY6;TKRHj*WgV9M#}4W(@h{8(H^%bE-u-;{P2` zVHzth%BxUsF(PN^%3MLiH}Vx*$}aBAPmX61G3SbG>RNSsP|>RKc&lDfuz0v`ikkKq zvX+*F19$!#4#X*W`=|EYo$R_y!?aHS1Q9p8905GZ@2Vo*Oz05i5X8FU18I)Jp^ODI(z-&z?4R#$b!++ATX?p-T>lv;c##MUsT=EKe(u0)=N;N6H&f#RI z%7ci4*Fi67^J;Ndq?>LB(!0mcsb4k86F#hX(j7UX@vswf78>gY zxqkndYk?z$)hEQ9725Te?%&7Jr$StBYXZY&jre>jvU8!xY*0s0QgT@t%)~S*P2`gi zPj39GRp1Uk<3f}XX?ca=Vxr=b$G<|x+rv=o3N=MEy~jg!3UOHdP0m`{_L!o}Hyk`f zxIRe8TgE!bN1yN(bQ17I{-duoRKt0#Skw>fFDu8fVF#bkyj5j8=~K@0!6y(TxVX4@ zUUk2*V!X7`3495B?wB*9h4^0??@#bshfuCwo#lykw78A^tWuMSQT&a#*^Jn@ifiy` zRV@o%2nHr{HH$3@ucE0cydkX3IMX^Y^+FlbiR(aTVH?HKCF-``FdMcJHGV#DowR63 zz-dwBHwaUCto(v&S3BuXj<0{F*4j~AjFsd4+~~ex-gv)+ALpTu-S8I0NG6}jLm=*dMBkgz!9CD;!C}L9ZrT(uH>v(l0A)+&%QF;So``7ZO1ps_G)wp|RWW zM`Oy-Gi%ljQ8FuCiBK4G?n-W(2g73K7~$ESg)sAFN%opQyvt&hg)yx8lLOjhbOvgB zfpXf-tF2ym!Z8epb<6ZMI`X6P?+uT%VndAGzX*+3P-BZjUjtAo32FGJYwU zA`80gseO`!*u%Q8_hUfmFwD1_E2%<+!ojUGhIhiaIm8mNqRbw4p^LqY~a-cL=h?hJc%o65`H zyOIakq>IDHC1xPcCR#8Uj}mSWnP@--)(P37LP*ph9TM00Wb+A_$ONwynU; zPdCb=c@~{E6+^=*G+Dou4x9GC`I(q%^?OZlo07+%;T-N4xOAq5nj7P`6B+xoq+`0z zg>?R3C1T{LDg{(FzB#A`WvW`T*-KBhC|4EGqt0YcmSkt6LKrVt(36nr^5M$FF=1#F z2sRDNnoZWSA(BHP0>UPw>+kuqk~3fYNB)i}mY~;ToqpG|3&gYC*A8o#v)wNfi#qjY zqsS--|4Q({6oJ5S?8isH;pDfM2)g{mdeabAEm8PTWa1007!mrlyz&rVAb(jOS+hRjQ2vDUKCz-J8O^E}Rp`nquxcE}D z4MU@}tU`=?9UExlZ|C1uJwK}cpExS;mG}gWc6WGA(^Jy`9Q1lPa`wrr4xiigXhb1TpGqdbf7)_w{)-zY7vHzLu0J+wO8@5M;hCrI@v{ceur%zLk$k zY~Q8|l!So)jniZ)@*s5~n&lVI{7EL%B8K3c0!(j@GUa4M}u9Q?r zEizyx{%$ge#+R+m=AX`K>3li0%MFWcz1Z;>iuK`S*^iv|juW&oRX7a9<^rX{ni9bZ z^bauNu&C~UmMCW5W_E0nDr1+g3n8l5zjn_11TS`>P`LD8XTxX zS;)MWG$Mgf@1F%`sUs;m=tQ~LQhJq$U+%Pla=*n(A6gYHO*F})?rfQABBf^}CGDIB zawY1Y4L)ONK|?x2ItndlxeAv8&h9tvsCFvQ$90j09o&!6^$5aR%CZ!8e)eka#tlmd zmzNw63>VL!1`Kj(nXgMN9!Q{#g|LIZzJd=#pArLlfLi|e&=8;Z%|Rd>n(bQK?R;>A zz>VwKS|xF{R{L2a>FRQW?*Il^>Z>kG*Nx%r(QMZF1TQZy0mvRewGiWgnF1^i2A6p?4hXojd-5?L>sDv)25F3Ytguw@t>*E(M>sCIdtLwUV-gX8WQzPH8z#6Gl zJDtd(m;LbOLad7q3lF9-;7~4Jz`Y9SVy6?{uGURr#0^bpw&I2+m%O`jhn$$N($nh# zG!$~?vzPO@xL;nkGcY-WC-8l?x1QO$%dTfD9X@a%{muA7K$5zbS{K3+PS3-($;J8d zQMY2jPxxKT^A}GDMtFY$rmp8@@X>6!;CimCj0`*E#?v~tJ@53{YR2;{HxShU0Snc= z{vA-V>&)q)Q6`Gj$AOs(WIT@0AXb;BiodJNE;!hm7$BJibpmXV2r!qU_cj@hhK|hw za5w{jjV3>kbarTh(iHWRf9BmCz@gx?qs=m9zcKcP>G>I zBdNECT}#5{GeG`;20~4$)N0m^{?>QYKXEsl+uQpYB%)kA9=`Gmis}cP;0-hc=%X+h zC^q{%(L>(B0EY|($jw#7_wp{TlU~(ke{tE$s%HAL*Zy9mcG1od3>+Hag<6E^D7_jyP}XGx zeD-~=62Je@=m2(4g*I2YaG`B@6a)k$r04O}ZvYx1!<**&E~LA^{D{=~vkTnb1w-=P zjn|fFtw&Hf49t5w7c&#ID4qMotI1(?@sc~RVyMWZ%p>{ZYk&Se`ZJzB*Dsj*&7z8w z>42d%`)9;n@#Th?Has+>tY;m?XPSR)ryt*?%TF2-uZd`(li;gXYLvHgi71d;u>5YM z8vatF*T7z;)?koE@3Fk@`Yku{Q@Q~W(6>OIqN#%sS<)oNS8X-WhDHQE0m$c=pQ-vA389bvY59K8_5w?+RQz%L}c z*c#Nw!>rx*Rr>L2|Gka8m5r{H4ltXVZlnoDW71o5SJde2n6^ikFollVEANeE1agSr ziHVjjW@)qcR*z@kHDn4Mf19|lA$|@a){d+zl$GU6L{w7ZNqfy=>| zIB%dSR$c3GDHm@(8wI$El>&z@pYv>2@bqY@X?BH2GK9~G z@N?FfH9J7iv99XDzytxQNP^-MI3|6p3O(I{2=^nL;j(Qow zyfpqxxl{;Rb@N|8z@T9$!K!a~J}kf)A^N76?YluDVUzwBtPpzY_WywuSn@YkC%kJu zlO})QqPguL#_jN8k;4?Zyt*^wCs!6tH;@caxfft%g}2m0G`_8pR*W_5In*|A_Xa3pt8|>^>fq{Sg@x05TG`HYEISA}K99CjyjcY_W4+94FK@>E5?f>mNQUv84Ik z{S&)H5E2LILwrGB1MsKLilIPLB<*#vS8=67($%ybc~VRTpBfo3Q2msJvB3zgr46l| zg%gLF9N7U~!z}t_-WJTz?%JT{0Qh19(Senf74gq8W6x*LXFgBKEb3K&PI8eB1b9)= z^aF38-aBkMip%tPxe$g$M+ZE9g{tLRI5F(??tgy1mrF$*JqXER0^3GXdiqkH2S*@k zB9n3vu=fE1B}a*J>c*#pDR&Gs3XZwIr6)$*| zo)|X`T>1QNG$SL}yieaOwtadl@5$OfUQb_+{%M}KyNXYlpPCpR9vNcP&D`1&ygSJE z_xGQ2aDVl57i)mHP`j;FLkRm46B^1e+XDa-Ev`|ji68NJL!BJ<0hUTv^=%F#zBiOv zJ|3yyMR>d>mjfKXcJ(UQ__)4jx*4We@!6UKA8ywfnr_H zbq}Ws6P*fWQaVzSVL{Se*$&rpOeP)lAt8w@>hgSQM%a^+04MG?Jyotcd;S9jH1l9p zfI3{l*B3xKNk>--P;&5D!hX3P$F9J=I2jY!65%J}EE5BFl2SDG2+Gk}e6@(&$({)_ z-4mb?c&b41e%{zh2aAY`{6-ZyJ|`Tqy!d}h|J5#jI26vCQ#2i>-aWHTHrk;fLD&px zoUA~+`!_;4HF2g+vK~mWfLRWgMxRrdw53qKW8Qxaz8}+RPl&G?ecrkTydqVBk!t`3 zcz3+4P5)%OiRR;ZhtF=_P32=N|>W#PBnxfmVRLJ(}9mPKLk5P}Pdu5y%&<_83eXpt?ni9~9PaS{Iz z&tOv=0m1Eur%l^j_X8(d*aO&D$!xyQ?gF^pq?;Yz)iLC!50A0*)UJj`Bl_`#&$kB} z`ER7g1_Mz1&MibyW}co~;IXZ-BOeb}+yDGG&G2W#-)_EChoQsw7x&X0!R?xThnV$A zcBOU`B3iW`1t+$`Ctx_^O5f$S<$T#J;6l+u>dCTHCoPQc{S+(5fWSvm3wpM z{9kVvK0$A}d(`Nod#qV27TgU60|u2cYkWzNsNRae=JyXEFh9+~9}H~eN+tOEok75s z;1&%6-2EmV+U|0=vRQ}+kUl>3dh5kR+(PabH8Ym|L$d&tVY}XBbE?H9{G=bB$q-e5 zFIk>E3Z*Zis6PQsCk63i?ARM&XTqQ`oR7p18VWKX99jvcO4e86 zvofSc!irZ`R=C0MLWb5?xTg=$7bQ8aPX7H-?`2B?vwe5O+rrf)+l_Sb%*2B``rag0 zt~PbKgfk2R0lU@2Y2(^J}Qp?;Hj`Rf2AT5{bCBWcgGGk}ei&wMn% zn#iYpGCB>30)ZW{gj3lqlxC{i0l%Ln+jRmT_7G9sz>$gyz+o|pgzG9|F*})F^GL?K zqptG$e@6ipxF;f5Bfd`#d*sv%+b$>vHyeEgHpPP{S8A)G#+U2O!mR zKh{S8qn3-v6gO2M zD~rv&U6)R~FA3`i(M#lE4!-E8+gvfcso?Vv1Unq3&WEeF*T`C`bpU+$^>)9WJ@)23 z8WN>6i6;E|J=ZW8IBElY6qD}L_V(s&y^|xg!w!Bwa{_*_8b3fOnX zJHjW_aIhW3e*|yzi_iKD4WGQ>=I#J1tX=G~U}Mw*LOCf*IhsoX%TbtkR60m@Mp_h0 z0bQHeys&*u@g_}Mwn41(axStls!J8O45)!GLjpFX`F{*Ix5=vrK7>7dO985650n3w zJ`Dlk5BcwN0S|-Y!$GY;5{|Y>^sSn}U6`u&j|#gD$_uE=#qPEl&G82fdgTN zfrpMh(S6R51G9oeBv$?gvwe_uwoCKK#Ym)LECumA0e!z6RZZBx)7{06ypwe__o}mJ z7ZzQ`9`m!ith=c_?hLLgC^G#nByzPuWOHzM`43bbE*|4QRpQ_32o&4Ry6lDx=DA%f zf7BxbmhZAh4I+;)g_fV3q)Bfng3+@mSU*TIMlNJLU<3{zmE@UEw3AmBlFZ z>Ju6g^B);uqdR9h1QlS2^lANaO2)3IgM_EYup1rbR@6p8i(oKI=M#vs)?GgSDJ_ng z^%dg-LS6>z7GwAN7f3Cp90TZElL4mLJ87Y?U#2p0nEoI!p!Rc?utt^*4C~xqtPc!{ z`a3k}`e5STJQ_+?W{VA7W>)+JtEDByM}wG}git#(j<8i=yg1Se;!KIrUFRWKX+c!b zC$#*4vJY)+j<|myZd*|OmqHOl-n4;UL$ubV?x_dq7BI)}8I!xm#9*wU`Q9gyUR-J! zeef~9+96I~_!b3OyX>(LF>EH$zLEcjJQnEbOU@}*cH@|EGqLRR8&=>>V&am|R30GJ zGF{eTyab*MQ#b;jn#_M8KwKmTz2`IJL{Y82a(gDnIG6(@XCoi7RYAC_Vsrfm@@Hu6 z5Ban(?9!Wc|Im?*LO%Vv<@|3b+SnvW1<#^L%;GlUND$^U&>Z_H3+-c5?OM*r1_7|AZ#a7T0sEX1V)-B0b9+0^#bQ7`dNBq^f>0qzCIElC_S+BF-@9n4zbr4s;Tr2-bpv;K-<)MGw%99auA^v4@@hU zuUOPczeQj_1wA1Xi>XmXOK-cf6-)v5j1Pqldr#?*gy9!f5n?gN1Uef->1w`gID*V6 z%G8^}Q}~i1ml&;sO~G`4zp=Czd3H)jx3L($)~oJ9Vj#Kdfvfl}Ul7%S>%Z(2f-I=z zNC1trekeXJ%zPF@z63U}@ zOyp))yzE8t+pCTpBxEND?R!@f`hCjr>iX^t-XjhV3Du>c!q4_CjW2Yh!LtV(AHJ~% zLLHWyZqvEsGk_?H?i}OuT84Qr_2CR`s+ zQ(v#wZ}hlECVlug2%Uq?^?SIo8)+X;4=e!)+`Q;-NMpHTZSNMU3)v|_6PG-pd>oRG zWD3W#7{A#o4(IZ#>asd8G(_E#({bo3#_ZQyDLaIM5nA$y-1gJyzC%OXFVv+1r*VML zn$MAPh+U4v;uf?5bTEB%=c>w6L{6GuIP2V|?(SB$P^|JTr8zd^h8d4oI#e;H^SbMX!pF1G#*S*lSZ!DMlT!f2)+L0J@8kYXeg9%c1nL-j4Z`QhscxYpC zbhY$xVLwDIq9f7j=S&pbTwY}%4Hpfu!<>)Z6?t9;v2gluB~aCw#bX?O9}8s;G9RUe z^h+s_U<-IY1cP-h3d;Ixo{;*a5!^A)vg{0nyf6h|xh+&g-aVce94)U+=zlz&+qOrSE0AYv_xHye1R5# z#sK5mGdRbfxN%%jdd#&o6?P^h3A!i`jN<1APNaGd#F<2*%i6O8Sl1prBbT1-~-_J)0jrwuv& zr;#B~D%Yr)lK7jRgh!=Xw1U_y8~ess%59H8SWQ2i^*Y*QCp22tt=>^8Be^h7n&XZ8A^HNuJj1MP7{ zwKMPA9b9uTZP=M!jEQU$^BPxOu9IoKlT_#aCK5XkCjTu(QLX?@mlYJR*4VJpiN=X6 z=0_ai!KvIT>`(^(@5Q+TD*p6U*3TSDIdUfKx@3xGsfqTGbWb1X6h}?6$a%RXZte>y-?fJ{?pbsmd~hz?M=mF~79zXRi5fI57= z>cm0DPZT;Z6I?_HR^=L0N4!}rh1bZ3`*b+uyR8+0kH@m%lSs83kvR;qrEPPWMp152 z9A(y$)i*+l?!3GlI++IleM5ksj2mimk)_JGzQPLXzh}V9zg(_cQxBZjCV_^hb*bO< zs)+n}Sg(EC7~o#Q07YMs8+W&%GJCmw1t$AKb~%3!A;6{U8TC!^YV01Hl@qwXtZsm@98g4D(Kz z9i(d*7wSKd4|<^1b&IbuotbNDCuUmc8=D(GL@7mFiJ?a{T@GmQ>B@w#+gPZNlR)_R zyZWbF>Kvi)?S@4+6hbS@#&$vGvGo&wZ4lL4s?~*{whwMK#f%-IA-G;x2hZVz_qQ%q3!Qy%Z z33{-&q%8i+5toz%C}2%M=NqBA5y7^x?O?slQpZxE(>nLMyi8kGMuw40(-}Wmkl;Fr zu*doLo3zqEm#>4^YS1DPG+x!r@3bE0w1F#TM>*y*vfeyW(_e~15^!cXYkXS;)ITPC z*bXZ|jBVrK`1EleKwb~l;HZ6N-jJ1{w9XawekP^0S`4e5MjB=uO>CYCF5{-Ks>>1p zQ~e+*Z0u%PmM_Xz{;~?!u{fU1uUD+r#N|NOvvY8#>C#2>LRnB=^2{&?aD^cQ7{iNv zlQOyFHL{++7zhK*EMPy*)LWGiM`UN771NPXCqCAh(MzB&@$ha*oGkX6(aTfKD3ef*U%s$Nyge@lBdQDj#yRY zrvg!41{B2IzzgKGkDR5qxkoV|=NLDs!C&Cip#2&P@keVu3fx`9O)}22+F*2Ydln|2 zsm}rguM-Er$c{D|#;Fh_vaB#jVZ%KD8Fww;%Y*YtRAQ)OUECiDM<;oYXv8nd> z%4o2k&r)i~q7>HB$LN^EPLgyQpH35$2#rvg80#nzI#ywLJHt65FV~h6vVIDcg-<@L z9~I@)jO<+nk}B48Wh9r0YhvP5$?&f{%N*a^qqyQdsA}k$Fo78F)%GWP7kkbQ0f8vj zwGP;#x8hkcKjLre7JW?OJH0o@IA49qZ)OrAd^PHJ_Vqyje}Do%Cyk$NCm(oB7MKPw8#>krcDdcw!JXfBT0;W&QTOM7I{WRJhJ&aN)Wa7EyJRC zr6zM&Jk;1qBI{$m^eM)l&?=_mibt{oco2Cpwfi8l$dOs&WTk7?^FDuL=r&FQv5LCYV2~{BC|R;YV|Y^_bwZ zrPk@S5+Ap79^Fj4*}TV{(&-PrJiL^YFMhIkdaambE*l_F&gbST03G$|qIcpIkH_Niz+NJ*%(es98~+BR;%oMEGVe-+?xu}c zdfDmrD<_@f8#1rMP=%>2Ls_+I9k+*um&{C}c2yEsYzE!>{a9I~A~RYYI?eXA-jT>> z^|266OB}Yhh?Sdmx;Skm%I2Llc}d!^e6=EINcf4n(QeNw+hu+4B(VWDC^EU9Z;yB1JoxAFvX9SDP!0OB$s+6aTim&7Z*>!3rP;c;L#}=?~e)ky}B3x19AYwr~_y` z8zlSsa_Kh=w45^p0e!Yh+|LoM7KewYTFr0Hdp8Bg^FWXHm;Xi{CaizwK0yN$#lzj} zzG!IB)af~sWJM*U59?%2H+(T_9j@IoGDWdPjRa1*0zjRld)5A4ZjOQ5LAhwat`wcO z%XLuP)*pEnFM|Abl|T|18q_WHj?8mHw=xyj2O%fLHBts&VXSN9N^B^BOJT52r=-Dp z9@{y8wEVR}0PY^bGSQTkLIdGi082Wh(%PQX@SSiRwB1Kprt(8-T|`B8Bkp(7Z{x#o zmk{h;66I2T2^wf`bVJKasv3z4s&`WDD*1?)juXGJGnuf()a+~Wif{MYc$6G=1Ixp* zkr7~)-XyO1#^XF+xIGC1#FUW>(oC+5Z*2>DI~3vYl{onvkrSWsX8&v!xgfBq0k z=I(%PGLo-Ghta$(NJPf*ie)(2?R+UX@@2_ovtYHI`@Y-`xUkiIdL$R7@Bfeh$cYyG z!8-h5^=h__2;^tU;1I&mAkV{oyfXFbJMU2DLApT@xa++W!Z_m6#AXt3e^8{`E^-s8 zjZa$Yz@F=LD%HBR&0e^lcS|_$CzaIDa=RRw&DO-KeCg2Pn>@f9~Im|2VQZJ*^#PY7u3 zY`534^xAwbg@_QYoTw1JaP0ga7Qm;!iNw;C%=!MNHu0|O*XVj=``0vg?!OMKQp{f8t$9g{B z*L(4}BL*F)oLIndNbinbP}JCP#$zUYvR#7&3Ak<<1ArGG-e-k}6+Xz|1Lu}yH=vP< zQ8!QKBbJM_`yL}mB>Xg)WgeZP;eBE=(GRdQ0=mCHYBgw-Dis0(_|e}fhk?=*pe?18=H@?$r5VD64FG%pFv8^#;z#e z*HX2@3h_VF{H-$5Vb-_xUqZ{0Bs!PUIN4>+lYE1(RuF@D7yC<9SvRdTW|xW%*jzaF z%14FT2C;6)zf2NMmj7Z(2ZKLv4*k47sNLp%duzA)gDTAUTIv*vN;gRNIhsUSrW%mG z{{Yi|fATv6(^7yH9QHl~^f);yT)VzCK9};1c;!q|3=RJx^V3C%8~*&ryI2b6R!F*{T4!15 znJ{Poskz^f&zXctuDn+L6K*Va;lHm1_M!h+GEF(f<2Wx$debx)}NX z_0Ha&v2D__?EF~UR0%O|Zb%Mb#gL=GY_?g;QL$9CE`Um&^RK1fL(^g{NhXIpmvto=U5x0H z&EZ_@H9$5VEtPJEjAmR4CPqM)c3SG|$70(efzd&%h9fP%u0H*tKAF{C>lI*fp_5dj z3ZbzII!Tc=LV+l-!H3wT?7l2ZHY{9uqN1Gndj&x0H z_MO}F7Fr>VExZoJGX2q#cY(N2CUj!5@l=zW~YFkujXnxo!$BdMWf+YvRaEHuY>erAXUE;*fu z`p0XK*t|PCFasjxX!tQ8Sl$V!RM5lSQ z=uKt<`~}?e?Xv&*3m9ChbsW@wCPP6+PK@q7o=?CG1&lBL3G;Ox9LqF}%0*uRmMk2P zVLDx#S!0O&ja~S^X{F6UW2J4CaT9F*r2sklVE)l3@LLCi*l^4^oXMuJW~2pS|XGU~sC5S!r2uersV3l zHRvGtp81LTwi`7uWta-K?=7{TFB#S)2kSS))cWsm{J#HqF8GGbm#4%gN(`fKZCinU zkQ{DBdZNiE)KSX9H)6&s*$)x}B21lTJ>V1r1X~FinW0rLi`g=@SykgzB@Jomui@}$ z>V0N1=8$MB89r;g=#yp;W)zSUbDMti8RP3c0&qtOYZgi`)%I-c(Wjxz!zuLCkUvcQ zN{$~DD`{W9QDA^GOM9h9Q58-4n!E;fC;v3Yg&;GtHn5|nn~K!Gat3)iO?QiJ@0g1x zSL?nPS^w0Q-Sn@mwM|#cw~AnVBak+sXX=ve%@lpB)M@{eOF_{ej)Q`%_;X@r#_x`dhsXEiK>Tww?FXw*5g-2-*}2mBtvy)y z=4{dEqPzKcrV2;5YmLa~InvXv1;T2K-|~I_`K`%F8^EVPdKIX6RC&I?-hf~G+VKck z*4Fwp*)Gxxboc^pIKbN~m()JNJe-hq(1P^m&ji1GncwqaEB2T!0v-#ickA}~=NtBq zN*@m(E88BE9ca#`(CVXqU5iZ}J(^Gw;#6z&$8~o^PquzC0m98l^ji5N$LV?1Qdt zj}7~<%=Gn@^rzQ`-BS%DO^(&Cge9Af5l|RZCoLkD2^pKjOuQ7?=1rW|^yRBmw89U3 z(6>9bUK6ksVMD=3Dtt$Xw_W!oN7YB=&{y;-h3~tT4JHK@QTS?3}S)T^IYd~T5F zt-V0-AdvO1Y-#lTZJ`z+jsIy8UvB;NpBC|EhXkbt+unh@(M1B`z8!W zvp&xMS0lX3ap~(4!~HM_sVjTFNR{Ex{WRPJ1itpuIhZR)1Cetul)rbo4MdSX_Ma%o zCNa9u2)zN=T|s)9rsgZ$FAi7i!XH@wwWGQgkS^qY1smojWvACGmBu>p-!4p~pnUw8 zV)pXh>1lltD%Z76s@QN)2*VM7Zwm>ces7`><}bG__T}ppl(j8?FBmT?vW-Ro5vwLO4wp_sUMLY0o!d*ER4yMSyyLeADKfjd7s zW8PTF{8Q?m2(I9GzfgS4tW9~9JpGkEw4$%+*tf@LCnpt^%WhKHk&~*iwsc+ROBAb0 zbG8fcAPvrUZQyD`1py^IiMWZ5gco~HOy1)zB=`rSjeHbB4{ca~NZ1k==7U%1 zOE+krs>)&P%{H|R`@{+2->G)%ecRaKYCaa;V%U$dYA6ra$T*{I1LuKNo}E5P)(!){M+|ioKcp zkJ|l_i~*|#nhot0-qxq;7Kj5o7Y5^<7fSN-(T3%Mn|h7=tkF@+QQ;T3taL6t5bXd zb+r%F?~d&zX>2uClg4Ia+qP}nXpF{cY&5oQqp_Ww_5Q!{opX6|k(-Q+vG!i;!FuLz z&dCmev6j-qeBZ&0Add}QAxe>X0o=unF0{8{!q!i=s7Mn z^@s0Ny=eYT>}Jb>DEc8a6eCFqxV!PLie(dDVamBr(DPP?xoi1$ldfv=!lkK2bTI$Z$hq9#cip1s4Zuc? zX31y231VlNz{O@4#k&;M8=FE9sq6GjNyAOH$y(qh5)4MO2O|~DP<=WxH9Q@cG#aLB zj?&eqaeJur$uZKcq;FeR$QcKaGqK z--%=SpLEWig|NOt>wo$si*>@sW?@d$;Adug0rkFPoha3FkX3-W!qO~mkPDBu$qaA==J}9QH!u7$Z!^PlAIlXWv z=G=R#fHRek>Y^e5nFr;Ks@n-u_R6o09W<6x$GmP`Mq+ipHctn<3|9{^kRzf6h4cI( zDIA%b##N1FjU4BaAx0vAxISjlV)}O1-mt=^;=v*a52`d3ZA}+d(PulcLazF6{Q3KX z!5^`X5mh0pMmER=Bu`@)-jdT~0;R$&^kJ(FwGH_s$#W6OLZ;On%B8nX_MDN3F4c1J zrt^Q5YLM#cp7=72kz|vc=Cm<>b%Tc>1Me=|{M%BJ5A4)avZ1w*4nh7@I~gC7m}0R! zl35OCnb!DAy)vk&hY6Z$c0$Axn!N1B2oYpS5_s2xIFQNE-o<$H8iwn|gy88aqbA?e zlf=gLWHs{!9dVK!Lwlc<)Hrz|bt+d1i+YofI|Cdv+wNo!0!AF~}*7MGg zMM!unmxV_+&=S~>BU?AMiRS>2-D^&ipE-{~m)wS^o-9=-wb=^1Brm+2ig z!2*dN(`WSoXo}JYzll!PSUs_SDy`YOTQI=>+CXI963@+#Mho!ADR6ba4)ukW#Q8KO zUi!+-jYgeoax>0;&X|C-rB{l6h4(+60SrI%Ar8A>O6o0aZj)>)6ukfTCxVP|Y8Zm# zC?~m%#E3-EenCTQ;akn$2i!_z3pV)L&jjnOc=|>&#NT^hj*j0)f<%@B`JjWq97J{7 zs|6|wk9N)1pisv0TE2HpyXpB)2e}1!A4=UJp8c~HRM8ALONP-`vHL&=cWBPylihN? z_U6g5iRhw5bNaZgp8hQu`*{-=d?Qt~QXQm-xulH3>;{=wLcp)gjqc?2Q=OGi1JneC+Ln`kMF7}K5&okN&S|9YEJCErCX`1@H-gpf2z6MUvb;_wqcZR zWn-DHBIN;pdm%8~+i-I^jTx7W7Dp)(1TcZ<_ikn3Xa)Fr5$oTL7Iz5y%Tis%uw@UZ zV|*moC%@iFdrJNDvS5kP9N$Swq_ylLiTw&{Yh|V+1H}Dg@A_Kc*p-6ebGT9kCR(oj zJ%WxP;jBg@yxH>Ez)B33_G_bJYbMNc(FYmzzh+)jTBE`FX|9OQ(cX2=X2AzZ>zeuh znApHF(VU$XIKW799?5;XO;G{cdWT3OZ0?oBQ!x8&$z@IR zCL0+70)YfGQ2YU#dluyH<3)YyJXIP7WWFO@aEpys36Wm${y*4@+$I(@!!*d?IsdJa z)YJBZ<)n6wO*LC{mZWA$jxjhmmB%*{LzcFCLbYHxzv)_UEoKu%sy*>gacz%bP;heaMF5*VrYmkYV=>-Lr_Q|H1h=d ze&MB#u&(QLw7Rwox+SYVaW)g5nUAaGs>tx!J+$ErYOFr}oV*Pgm6lr-CkVk!Jvmd) zqMXI}>4bs!F9~0xsP2yxJSS#HRHM8s@Hrc^PEFZ~etn7a!>z4GRWz6nMwH&YMxp6x zIP@&9jBQUU?A?Ys%Olf=&o_p1HJOC>@x&JT48ic_xVXSd|J0$@gJ8G$<>}Xyac%Z}I3-p{+5U5zfohvc!L6JY5lY!hi#zxS zQUchyuJgq-3B$whyJoXBtjPlKAYArxB3@LLGDE1zmx&x-F3YJ&pcAk~<=a+}VSRcr zIC0;+(J<%t3M)kv%L(jY9Fb*9zD9aCO~E7Nn*ISXX+N(f8`b(Rc}?c0rn0S=!7Aln zurW5auVIyN=s*U3h%z_O`vFVZ)L3i0S{x{6pP_SK;JsPuz=(sD__CZiEiVD>9Y?8T zTQsG&cXB|4KR-LHz1fxz8^Z^1NEb?8;w895{rSJz{bbKPi^5z?HVeFmBX;HN9D?Cr z#pYf(5=Bp{g`Olh6z0!_T%-^dvv5{QpI!XMoQRfd zLZ_fwVxF&H@FJkq&K7*XgR}!$*YoEE#RRz>AWv`4P>zthfe19#obWgltI_SC^pBq- zg%t<_uiHH$`s8f6j0<}8eKQa&EXnCVCE|A2b$nZJgYL2kTDR>>@JRrY-Asvie^gp` zLBY_AtKDV|VhF4}7g8G7+6o--^WaCN2nl4Ry@qE>fxtnGLwe6!ktrEtg4Lwh@01*Z zKOv&Dxy6ZTS)JxmZQL$47Z6Yy>x6gXG>HPqULPL38!JW{1ybURsl-zKtrToDX+>V0 z(ApYd31rqS=jinSZ64?mR7-otGqG*ygJ$b=Ty3DZC zYveasg+EutvHs?S;hRI<-op9PA`Uwv(^^M z7`)EA-rG0PE}%{~L9@}a$**Z+OlM!6J{XjrrtAH2HB)$t{Slv?bo-!XN2kI0xuEL< zKti|73I#@yqs+LMv}Xq~>%8I|gFA5S%_@vxcM{!+#_;2$jWM#>(F7`-V=XgRORA=kD zzxe2Mm~bOz^SQ=&)Y5V?=e2OM&MV3~Vo8a(GlzGhIuV3l&|%-7*x)6g*@FLQx9V$2 zKtVyp5dJW{tR`R{inU#9@deIOf&%dkUdUcaf#1DB86gz zQR|(1cM<%q)|>iPp>$C90Nd-ksWyZ{5YFdlzwqhnd$Hmwl|a64wV|ie?D%|w;fEjj z!b{rG<mDa%kOma^s(ia{ctS~1nz=^*xYxoTb7g7IBYu? z#>4b)QbK951dO_ES?THfPcf(<{i}8|z}$A#v(q;uo0ZOV-3KHLHd-ve+W}y?-icyS zj?Gf49v&uburHU<>fhll;NmwLT<^PctZH~_y&lgTfJlQ1tO<@P9iNweBEUt=$IuPF z1-QzqPL~D=`P;ls55erZ&``Hqurl~I+(&w!!wMgA_^yYVkWSm2&xo@bwTh#E2RI%C zmiX~#a1Fv_$O4Y79>52`R&O)*--nHUJ0JUzd+i)a8G3@tk^$6=QXm}paXP$p>A4ZD zVE^#khi!!g2emtUo1DI|*AB&%qLZSwdWqNM@H&f>$b8uUZQdHbbMdH-?au4To4G{V zYPaG(ms-ICcq6gg%~)EK&9sBjl$1zth#)Z}KMu#GhdHW`BqhSqna<1I$wc-M9@ z+?eBmM*JXl&Zo4cdVWFsTpNZi$C<<9lf_dmx@CvwpSRkHGbiv``AZw?Fc zsVW^FyJ3271<<|>+{vb757CQFG&D4ZM$L}xSCma6qDHf&ozl+2eP2l~kNT}sU|osj z^}Xxa)GJFP{Dt`8oFo>7?d?Z>^SBIr@@l=c);?NeT6ET8*&o0S$*nD{P^)3MmtGBo z0GEHP6))0dZ4NXLC=os&q!0*U`VIxT4pwV=i1~%EaqWgLHR=y8iZho(!po3e(t>K5 zVU#(Q!}E2L@dc}u$d}k~Q*MRRJ@5RcaMsVc#Cw$cZsPOh3AHpSd@z5|JSDNPjtVR) zBrKO>Zc3%`UcQPit(VWSxX_XtE>tN}vTzY}1^<5di79FAyuPCW?FT`xvC)ASYh;#3 zSz4-7?{A|#)VZWZI~(m8GrblQc-WTUz<98CiR@K=?@t}ztW$QNzl+sc1h9M4&YQ|+ z&lV{S(O#=HU#>nI_kH5A-gMrOkmOE03zabe1tLh9O+0JGF0ZcVn?xL{QkHl?x@f@r z>sF`NB_MnOIS(vA_yaIwR4i6IHQKQ$*Xa5H37pbt3@&?OH$}8+gkJjzO*WdBF{@!q zzixnp_L&*0@7C6+XbN@4k{x=0joAI)XHNg?LgmVwN`>+d`>W}RwPvkm>*v*q8dDP! zzn7J)%x2rqIzv(WUv)ZMF5?puI*qOb;M;G{-RhC>aB$C;M@}j2W!s3lxr}_kLASylWql~adoHnUG915pp> z{Py1t+5Gd&nycC1ma?KFeExmnRxeI2gd*XdecY=}xRHl1ECR`}&L{JN{9uRUD&L~N zes|tGqz9k?!2NXo3S4^z52gT<>zx0J~OqqqclF zk^!;=slNfP{yddi)0gYO|NMKOzWqruAdvXOdG_l)hZTo)FFnJH`#?YLt>L&X2xQcu zS~KIOXmzV^xNf)ff+HENWNL^=$hm!ht@o9~clRF8Pwr`I*>a)$hE}7q3&;Sd(VKGc zDeE2LQ!QyC^0R4aLVE+{Ck<0T<$_oo)kse^+d9!HMW3DX$1JN(!^AO-_ z>Uy0pH=0)pV^PXw^LhNcbA#>xylKtY+%A8kfLP17CnXtx)r?xL59+Sx{X#I<&!@VU z--o#msoz8Uto?yp9(94!HCP>&xqq$dr$KF<)b!_mDQgQZw?-qz$j4mt43r8(!wO45nb$VmOCV4C zKAu-&q9m`A*mnXb(Lo{P%(Gnh2J#n^<6QwPb-8Ku zZW+oc-%_~U&f-&ZK2}fdjE#+xzp4C_-@mlGJHK7vxUH*q`u$%ggB>7>1F`Izb+$4? zYPvZrKBfSDvvsz{!O!2lwFbeU7vc9Df_*soeAynu>w=+`{FR+(eJ$JL@R!*r-);8M;fHRk<;N6)bSmA>k=jFlL{j&A$M!v-+H7xj zdTseW_T4sGy86^O0ioRMmxr}T>_AI6RB(Q|8bWw@q@l7gK*Ok2Yj1R#)$IEU843xc zl;c*-HXcUv~xt{o$}|$ zQ5C?xcmR96z0n@h0X)=aa}{P|9J*BLdM~t*Buv1|CNJ;1gz^4diCj`*5|FI>yGYm4 z(tkFJOB&YeHc_mK;kk4h>=I{v`~SpJDnX5^l!0@ z_wm)EpwoP)vG4^bmH9W@O11@-lS-!%cnRv35*sb1@0EBicCRfEhQ2!zAH7Gu?COjA z!VAgP2$j5Ne4UtaEjt!N_7}kSBM#8LKvR&Ud zXYA@8*osD3Z6iR%=Vka-A>8ivyqO6CHD9h{26L{`8gqcwr6uee(!f8d=XG_E98!K1 zH2H090!h=aRHWb_Qy+E?>ql8AE5+@vdS+8#AaOH<(M$LhBoG|jBl#%agLzBcWEL+B zDC;o2W-0Z*t4eRt^;Qz&^?G3YLGip>G^Qy92Zw~2;Ywg9tOBk{z@?^7igyE{$_~|GsHtX27UIQd2fcUE$=NX10X|=Bkh-(A*-9K;J%*XGu_)<;VptYS zvQKq{>jiJ3VJ0UOc^7$qy3@jggJtLBFlh6WRU_pIc6!3*vlK}a@jHfh=yiJDOY?Z3 zc^x8xwA-AYH9S494F|rdR0076-4mwmzVCxTC^tx7&z*Cy1@LnojHb$XT=ii397`=$ z!GM77kp zyVK)VkO*bfrk2s=Nw?+~r=IEpbhcs5=8UX{t_dp7w?m7j-L9$5H{I=H;$S+I zYSGOI-I9!E&>#H}7$`fJ%q=V9pPz5KR?R`$%B52hU&(^^zZ8|LG=@#KfjHz!lcmZs zC7nKJyO4y6ya~{lFHR@Ff=Koe3n-E2^7>QAWH9YZ0$KsPxI9Q=5DX853ZPrWb13!g=@2@d0 z_U_HPJ}N)VQ*pt~Yv|iI7-WM$f7FFVxKMz7hOF1keoC62?M%mW9j0G{_xn9i50e7~ z*$dy1#cNxZRh;xnIDDz$QH0HuCREU4(-e#6jG2>{B|?D6`<#iJA1lx3tkXMi$Co6feUZ`eNN8|OFgvi?( zdix=~Je|{doR&)?JO#S*m@Gh+FO`SYXcba7`F2xCkT`ihxXk>?)8ag>*}z7eob<7b z`75U>2*yaL6H84#p?Z908HK0pjU)MNRT)W0|NubhiRR@pykpWn^xC)Vf9{Ho?hs< zu_x5n-v$`CMsnG<&z=aG6R9aFDe>{?FP!Y$-0eVv)qktj=z^79qeY(uMKHgUSxPFc z+T_p>6)kNPUBa~loC7uk^mof;piwN(X05)i4ppepa_m(ztcPy}!=`tuj(M`tWSXzbI~%RQd5&FNzGZMRBA zV>&o!cX#sfa-#yM;&BV#Lom0Oy#{8ah=_=Z%`;T*>PtMDdR@B6njx5WDN}s@q&U_5z(rr)5}ufofuu8fth4@ z;!N~;>rywL{9v<_sYpy(sZGg48+BMXa}3HGG{}cv!m?tPx)z4L!EhLZ+YFOSm~ODN zGvyvoMf!|l6zp6fciWZ<*72UMX`HHDg)wELKZ4?FZ=;dJUE(u{byqqVocolJ-bj0qGFXh#EHI5ul(TYzd(;8Ba? z@|?G9T&&TWvTSVdE$NIm9qs{>0f#tUsDc1-yF!_nneofYyjv|~0Kr)`Z$<-UtY#T( zzDOV}dL2sRR@e8zz4>`y-Ti!iO>9BHPQ0L^*KN|iPeA|BZ7lano0QQ-KwN1$xLK%} zS}ON=lITx!I>fD50=7o1tgO<>)XaHyxn2DenIEat1umaKj=e= zKz7w9<}`i`BkJhB8X`KRe|lcb=5_&KB*o|d9;7;__on^FU%7JKexDyXKCe+&^sAgq zf3o~qbA6u|Y@4^DWUvEHY$(^w%uqgoCf29rAQ<*F|&u|Q2fyCG+jm=lxRKqiY$$t+wFes zyZb&crY1r3KFP1y6ljY|-fp@U6OGU_eUaV#Wp!-F9*tmI5@_g*-MBdWzO$nmWwN>- zarcl&;_gOW^jNI{BX!<*#bJg?4u<_zf}L)4ew(F6qdDI%ce7o{m8#@-^s9M;3YKSO zvO-I$dUE;O6oMZF-$5hZl2)TFPMh0jQpu#CGq42#mJwhXe70Ju?&dew$N3;fLT@vC z-1N~hAEnA(?JV>;ZZzL?_H%C;F#I*zkl$`tW@se$-w5-4_mq^Bv?#MU!NKWi$j3jM zjGe#Ohg%oj%49MSVjOoc>kVdhpURXjMD|osF$_>Sp`d`#ew7mCh!C&H>=I%o3Adqn zR(go+^U#BRHZcE*q3truMnM8WLd+ip~nKDY6;ZvQJlkQzF;d}^4>tAqieW@ zGb2g$v-t*L|X(^4h}-gL7Z@UEkV-lA$<%KQ3I#4qhvVS{&L zTJmr%l}guY{}&~5scPp#EcUAy2(!ok|9sc&V?ZoIb7cy5OsgL4jsnq ziNz@*gg}GTyB+3^Si7trC%FYrm#Wp{RT=&9M+>0g5H zo|Zgr{l4i<`soco&@g~zlo zjR1v&2Eym}C{Qj-gh6?S00F<03Pd83n3><&At46+Yu^?MR>8s(9Ix7mj+{7-KJUg1 zPb3^Zz)61KL*JbjvMG|sCI4}r=>^U@ucq}u%YQsgw0{C14g0JJx*yui>gk{i3(X7| zsi*UK?}oE;=5+jaRc2%JQvKZ>NgscQ`$1&KWA#>pMw$3bKy*c|@pB}Zg2LK&JJ?O! zrj77p0WrZXwH3tXGC3!m6%_56j(-EYK_ZJ9`!8RS!PEVJn0 z+YnN6SVu!WgY;Yz(XfH^j~`9QOOLWTtSB&q;O%G$KQ1!qM^rNB5aM$Q(D_ySGyO^| z4_ntVeTi!yPXyRP-QJ$hSHZk?AYg#M-2Gc=7k}J@fVTLl*QQ)Ht+O^Ho1XmI{gSdY zeY=3^W*fp1w_8A4^idqg`Dcq+k+XcGb)))s!=YVUEtGk*KNfFFh;Tdp7HK(c5q$c^ z&WsV+J|9jIoqe-iK~a>#95H(gW|fe!c-^a`h4l}qRm-pk-Mj&*R%lJ*C=PmDnRK95 z>Gg;j1ncD&VF0IlqXUUS3ICl3yZ($}#IutU;^3R_wVXy5dAI#bAiDDa->Jr}d@>ql zS!L*6qybH5Y#R?A+0~jqhnQ;2JiaucbgC^DHu*h~ID|No}uRm6P#3|j*!2vljFwf7aW$O9f zyYJ-mClKXOZ2cA% z;&C?B?N~=Sq?~(k2v+%-Q+01A17#yoY5i2*Y+SHOs(}sfj9^g%dn(^R;;IE!MLNC$ zL&z4>mw;M2in(z9@(LP{pxQpu4y^K9=0?)z0!vDGvY+6qcn;)QAFLWc2&hMm*`>DX zAm;MKhl=^dFB47XOa)NNGbejbupKp|t z64S9$!d=eJ!Ee@QS{0+HQBu*bE{FS!J{p`sbHUzH3Qw$$(QamqoE8mcl^Y-e`6~l$ zlypqU`n|N3-o_gDl*BTTYw9%Gk%|pi+bnr)J==Y3wN+sM@*MIx%IKM)FKox{Dcs&J z6nF|Z=G+L|+$Wk{#t=ix(zvez4^<4$jJ3NxUTW>>lZf+Aiaar&%yB7I$3xMpX^h&< z07sL=P^G9M0N5Ocra4svV95m@H*3JhyI?1*X&#$W9N)L&ps|F8h0yMes1LX(+*1B@ zXa5PV36s%mo5>A@M8KEm`Kj?zzpg;Ml#tmFv4)`NL&0QuVNja&01A)535dIE35}qgB=J{h&om%-Y(^L6z87 z5gMCDEA7(hAX)Q|Rt~x#8Fwn}d@5jc1AF_;K;|$!uYDD!;*zjb;Y28buAm{jjdQ5s zqE_nM-t5G!d*ioN60G-e;#~-#{V{QpTw+zlf_hjBIA_j12Z^d=EU%p7*Bc*Hk++JB z8H{hgjB6u$k(2x%#PE52d1_RKO^M7W0$s5In$IGwOjUHX#L#)L?XblZz-M&XY2l!pIS zjE;-8&bgd-41%+{eCTC9FZ{iwL}Lv{L4O%i-RGj9*=z0y^XzP6ff)X@^qQb|H!gk^ ziUus!aB}|4)s2WAm2ZK7of0DI9sk?@B%OyIO($_~LgKt2P0iaXCiO{Qe2vMwaGagK z@}`CvqWTY9v9VqR$!hacs0H>w5iODR0yYTJ+4z%`SRSlg5t2y5RKF=qG~LF^b_HIS z83Ie-xSX;kJ<&NXRzi~ICghLeZ6;eS97ax{q(CP1*Wtp);Nv1&y6)hs6p1k(!)(p0 zbrf`}zPIAG@pk(*QK?I}qu3TrnUox*nEnT|WxTch2qLb(%Uf#H(pfSszfQ9vw=t#h z71dsH+jn8^zSsPpnR-WTf558MzweJ-yqZmZtu{rk8uz*uw+b{*cc9=s*Xej=1MOda z&25WzGW)uz*gekS6oeI|f%|?#8e?Oa>@zdrlx{VNyf1PS;4EBV)C2lB>UUpHIa<35 z(r7^*RY7nVAWASBQvSZHpXCQ;PEJTXE(q{=W2-xdYMJ49hY0$mwDr8=$Hl~RpRdKZ9W5d}F&{)kd% zjMBD6#X2g)4(}wNnyHhxx|;Q!-epQOFZ>CWb;O^;*N!DyB-XKXHlU}`jVBIeBfa{y z+gqoVvU97rCuYpy;)ZKjRJO3QxWIc)Ij0i9Q$lc~4TeF9|7X7uobm<|%4nh3zC0*3 zn(jek($&Nkzy*9{nXI~HFvnPm3CVHt;Pz-9IkS~$r&jjKXT zx?0w|9TiljY<#^oLo*6_@iD-0w*iH??Jd0g|)_ciI>W zL}E3b$3VDq8({FY7oZ{VIQoe>dO2*eQth{&@XEP@?}u3aT06)=dI<<6>;4siU4T zqg4Bf9E6XJuD{|F%BSv4a={X=fPEdPkRhd8-D5?jkuOE8h^qrdBH(xceEWhSIAAsf zdA$%dUe}B7LvgH$Oq9vsXcwFUZHsA1!Q=wO=Ke5uL-!x&6;x4UMV@1Sb0~lAL!_fk zhoG8fA>obg*EubzPCk3a@s_>z3>J|DGo_$meVgDdfDue8v%n=49|pN@Qm*jZ_(sGB zt*48l(_2K;lH*kgh`j}tt7;Y)IAz<(R|OlR{MD!SKXle4jc^uSY{{7|+|#g2PTGVL zxeyOKz`a4>IAY+vmG(hkQZBKtwBHIo($C0%Ebg4!_>eWG-DXe-&95+r;~p3u`%~qb z+rPY~T>$+{XIiQZ>+C+F;7~#smmP^Wc@uLdxvrm~+vz^Ph*qD^@s}o?N0L4%D~>Kn zVvxv+M!6Fm75mT7r*My2ZM5IWvx$FhMbOGIl`|qOSz-v;u!`6wH@{UGty9P;5}cm~ zy-7E@W0n{cAHU+gkE?_ z(cQW`tB3_;hE#6eNSD7TWxlZKN7KVTKRu;GHmH%kuhi48HSxPY$*Wa|Ll|^=IX}ir z*$M)UsGhFpEQaIaGF#@nW*2UR^keBrU_Cuw#v3}k8I|8fcOQy*(7U?b9&K3$hMO~# zX%XW;&Q4O#xqpBE@>D_l@+1|Iy?wF{E)X$h_``}XIV&{>N3jHCD@T#Jk?wc|;PszFu z15_!b0m<0BI}gkhf%Q_)lzez+ZfY-5Lh8wiVfHzi?*_fW=y#LKo2>P%;N-9AWA``s z*L!fpD_S|(>NGWLBpuT$u_d#FU)hV=8;ZCd&s>KZ_!R@&za;50cS4%5sQ-YWT*OYV z4D&t_ai1cd*Jvf!mt%4W5VZVJ?i3+_g+!KmYE5O>8XWRu-uhiAzYh0@GzFU&v90bt zES-?8^A!$!{0OM{WG2&YBX0 zalmrG|4ZTxk{5lo?_3%=G)IcJL7+f?X;MTGdT`mWcG;Q_s{)EizsD4^;R_!hA1hz3 z@7>kkVc{J>I7sC=2SO$uWbh2*0Fb83WqJB9R@9vTB?{q}Hlww&J%!KUa~&qRFAG}v z9iPp5Qy)~;cH=X{^mvP%_oiAq3f-HXq{zXI=8Mi_p)Mt{;vr$s-A{%Ppi-q0SM4*n z3pq#c{zoUEL!s`Nf6Kd*-+1Y-k5_0ne{#ECv9kq3XKwB#z-`zs3BAz?nU9B&^}1ei z5%@SCrA}mXHBgy+EBgygmX?^`mBUNR@X$|{LI z^GYy!yKlX>gi8-xoy1d@(h!-O_2zV=6V*9*#LEwk+0%Is0GoxxZg`#T)+HwZZH6kL zoUITz=zsQK8;zX5Ji?$LZq%O7*OvPAKG3B<5;T+O6f2hjuvIPY3^1(s9NCerTfDFR z;10OaO(wLvp1MCjoc{$(ql#;Ut6@hBExowdHQLbj6F8r*JG>U(*A9`o+HJ8|9}_$F zB&w*cF_d^Je*ymXJbOUPv1bS8cCp@x?Y3jM9ujrkYzNVkVx`uKgEPnce{%uiBxyzh zdmN0!2;kPR(YpM0hm1y8vPbRKSggYXZy5Z3E+wN zjQ{kx37e0H?--D9%Mrz`;xv>gg}EAU`gVGX1z+0DG>oL)TgeebA#Qb^4nW@%r2LzA zcpbd26(AeENq7Zp# z9<&)!#Xv6&(~-3J7Ay+V5A-fSaJ#1A)%%~e*U*EHO?emiPO9WH(fSxO7(VVop!roA&a9YYRdY#+ILpo>osLZQmrem{ zZ@C%{h5kxNJ9)b@4|lv)qM~n-LJq?zZLm@l2JsQQj>=D-fdVe0fFQB)Vbl*4xRVjm z+T%Dq%aOn`sHton0}9M|IwZy8?VLkng#5yDg>-z+e2B*bw2Fy;O8rBIE|rgHLjMgY zfS|lw?%GH$o3q>MWOW(+U9M6A8wXHsd^V%|j7Q!WJ}kwqRhnDgyxe4DP5|Qpnl8|o zD@&r1O=qE}{Jyx=tqn~4!P@@?FnB%JHBiY>%4EA9U35a<|5K~d{zX@-er*Uy#Tm@6 z6=P{N^EG;xBS};sdw^hqu3-b3LKWT3|7ec@XN!|hHx(zJIoG>UNFU9HD+?7%y~u># zSsAO_DPka02V(1wsc!3Kd=b-=na0!O1Txdf4=ygsCZ|`|+phP+!HG<>$sD7Ke0WQS z(0tSJ3|^zfvxGkWg_rFecPZ`$PZ|o^G4B$09$JT7}w#|6Xdpd}^ zQ$?;1rWH>|4hF=?X7g3CvxDb-H#wuBI8Xx=3}3I;rzgnERiB-=5a7o6d^b|HAHKlJ zmHRY0_}0F$StyMy#qaEm0OpS`qE@|FqqfAH+Kyn^zgVp@XVB+z+Ss1~3tpq$swv07 zMA_szks;LCGn3q{lv#%@gT#P+<+HbT>E|AEi3fmAigSv3-t4HL*x<|D&s#>kpeA!0 zY=u{ezp-Bv)|b#3j9;4mJM=Rk)hoOT9`}kBoDsLn*d{*u1~tq9maJ$A32pzz#4Q6h zBD04iId-xi7-ORnk2YFIY+I$NAVWu2Fq|1phdY|DPRtPo<=6;M7_8{r`NIY{_S5fy zB_ZOw!eMgbLjn0q3P{g%+g+wuEfR16^&4Gpp0>*uI=zLph2jh!J}Z;ksGt_0gJFwS z?fz^r#Yh4I9DH_eE>1*@&*z1W=ErmIfV5CG^7$GRq_R(mQkvHzu+W{axsg*~(Q4lD z^S`;jjB9|lpSV@l+k7(jlqR#I*4q92y1P32kO_^=aF)9-AGWuvxLv_}c1_0Cnk;xr z{kl)|I1A&DO7oMW45*=%otW9!^1R7M?<30;4Jpr@e>|{ zgoQ)Emu#2&X)n!Xit4x;_J-7Yd3$=FgtpHV+Q9(039?H(0?wR4LQv7Dkc4QV0!lDNNz(L~t_|v&85dVX7kXhI-;4GP(<6-w*TMZ5641~6;<2OL@ z_HyKZeA?Y0z{|Vl%B+NX|D&Xis`W(`7<7>W{A0Uuh#G9T!8x&f0#EUnJ3gTOe=(!r z67aIbXsvrgTzwx}362Pa(Q??*w3B zDIYV(SI>Q9Ec|_fet|8qM3dA*5-Yhgph~$-F@lhtrf(|YR6m+4?Z}ZRs`$(1*iTuD z@5M1GjsfJZ>RNqHW6Y5>11r=9$ZyM->qff5y?jJqC&xSrK&}<2jOxxr+fhOM6O(7FG(iWViXH+HO7CuW|0P%(P6QbM=s3D zHF{PrOnP4I4z2dk^B-sP`-?T~-A?>2U4kOz{{Wk>qqpZFk`C4G$0R+hWn`A`(iO zfjs!f0f8OQEvKXKcc_>d6Yxc3DHB&Hv=r|zo1q`fR|*o0oA$SBwlxwaLE10(T?6luY zB?((6BB<_WTrYLX8AtK>7-XA%(Nvd-xk9xm)TxB|Lfkz$%o>q?B&ZE~AF?t(h^l6W zruz&n+N?VejhZ;5c*_)qp|F{++~(0-6^@r5pN9;=Cv5UB;VNIT*9Bv^S~0z?)uadc zGXv>RLwrs|GT@q!lhi=9L~l0W3%Ll~yBw0qsI&7+=P^=rbS$~x&4h%8hW?H_-@R3e z66SWgu=H1uOuySHhsWa^lRWN@k<<6AiP1~?(m>+{{2^NIp>iYBp7P;J1!4_f&Bh41jVttcm6-BC6G=Cw@!VB zTPfTR!|0keS3>3*0-radIe%I)wk|mgVq6 zY39`(L&EW9ZQMzB1xg_Wq(&k5`Sos)DbiKxV(g@LXwYehC{;EEmh$mS4zs|r^kYnZ z;c612g@aJ*?7<%~z(;f=s3-EOLz`+VF@J0QBhkz!MzdGmXGv206Jybvnc!^8F&O)N z^tULesh|if|LktaqeA6x=;n2f-eDNeypnDM-j;ux0JPb+(4ullro5)3aPHss=ekhI zjl--7nsX4OpA8>l>b+@j`_Iev)&!O zNpnd}3UO^Bfk{~x5gq+_GD0!?iarhwV0)*=4cQMd%4;kUn-5x>Q*p02qrfGBUsC^KRZ(6zbEXB>*5}UAc1-@`I`6v!Rk1Ltvs9rK zh8X@o^dwWJt#ktwU#3a4S zOD5%zn-7!sw}vCN25+C<8y6S#oNw~eSfF8zb;DXVyIJFt8~#{A{+#&utE-v4a+Pw4 z*;{b9B>3(Vy1IIXOeOTW(4e`ogrz8XKFvxVtlJ31t#d$_8G1suN=VKkJylRlrco)k zOc@=B#KK$(RdrLSg&!2OKU{AGXkW6lLi|L<{l32{>n%8+q%$a|OI2Qbi}aGX6kxp=6| z!~zqIDSL!^)3$U{OuM6fdJ?X|T&&`Iy{)}8=lzUrsUM9dB% z>5OR8KT!CKxYl$d^uxzftx|r|vNoE4b=1-!X`B9EnwcS+C*S)ATf}>67u(Q~>?nZ#&$Y8fXM@78?-aUe#@0=7Q z0hIbgsbs!fquwp zT;x}!%ALHz$ZOHea+m3OT)-RFV%w9b3Sy=*^gvg6Lz za2xA?0`+c*&tZtTEpAJ(hcX#Av#9#N)R^PtQ%VvE zi9Ig}gVXT|27trN*NA*U_X1U84 zfOlfjYxbMg67ME39FGb$%2hwj(?K~RQP*G&yX8F~i9P;zfRvUefIP+H7bNd8U62CS zh}4~t(3=YuKa-<*tP^8GV^Nw+fYB;YuR-3$M7sZV`WJNN6%}o$BCZ}~iUvmkYJ#A} z0eShiM7|>MAZxI|<4AZ)N@4g`1ha3o4)_Q-lDPZRF}-@y)=?l5fyCeHigGjJW$$GH6>%p}NmYQ|(;1K#fs+m<138YxGAzGBaf`~@ZV433f!+(rd zZX6FrZPz-kuM3CTAO9c1-ZCbyXlvJgaHmLdDDLh>in}|-Dee>~?i6=-cXxLy?*8Bu zmr~s2tnQujy~&%Cd_S8IvPjpObIdue`x@t6&d<#k7Oz9{$J29L#B3J8m{Y}^FCA{j zbLE_2`+tnrm z97YXw{o!fcfhG4u|~<~cWcbc>+7!l#?#F;UWr1E!{S#&H00a32_?Jf zU!b*MnTOXH!B_gkcc1gjv$Hc(`Zu>a;jYLDxhP6Ht?mG-adPl_R4F80DnNOp<#=Ov zo4ZO#Jl$pW%~BV_38_LGQSf?-zSuSuy{p&e{YD~yFdX~d>M*Y?CaiBbm8x zY2Hfkv$pUPx{}|M8jNdaHdcRzJ3#@P-UUmw_~n2v!p~v zclq6nk*yKeM44`hH9<)Tp_OOZD{XX4cLb-qC74B?aQvclKBc+I-cGAZ&5APopMQJG}aA(~=vLN;hQGo81t9I56x5z6H7*KY5$f zU_5Fwl&M*}Lh6^B4%w9E?pSCfFdL2*7fPv7*~W%}vv%O9zXttEk(E}1%HSpuXFt~< zi4Q;ih~(oStm7aN!A>qpW5QQo%RSEb#PSI2FHO;+13N~0dQM4(WLqHPNCs?TrVG3X zDvN4G%mkQ&=#b{MKR`(ePg-&HHzSQjS&GCvgACf+7ku z{BGHl_nk=mZOZag#S2pLv_TxTR=Ku{^Q#Chi&!b50h>w_Ysk`X#E42K>5kTAGRZ$w zC|m2hMG%(@?d%NjEGtvOUXV^&rw0zE*0K-wi8lF~*mkhpYcPJla={)X}7HI`emFDXw_tGzyFrEdIhba}h#Rai^^R8fwG}t~U|? zQl|~6ZA4xsHwP9IfLb=K;>wsb6PLn$kc#)~z(Cy@8J((I`!ixBj2+k)={FUUdiRLq zUL_(d;q_7_00np0gpE9-i^9k^N5@f++{qMh@4v!StK28yRPL|#wRK62Z0CgZ_#PH( ze6Ert{&Pq+bQ6Q-Q{Xbw>K8aDS-uo*9NnO7MxvBGPbr0LC6*wx$6r(KMI|lZl3H+I z)HO0(jg>szRruV@bHMe%7j_)m(ta8bOkEpzE5p!r>m~Bhs!t)<-+04+FN0EtgjM$} zs=C+-)6!*4Bn39LtaK+PL@FqTt5tkhV4f z1|rD!;_5J9XG}`G)(QL27@|=@O%QiLtQa+r1-5noTtI&y!H!2I1$m8)tLD~t@BuyP ztVv!j)Y6@g`l^0%SugfbIXb6Haz~RxBdDt+q+;&yE?eJguH3unL7RDg zntkI{-wfBJ?V0pO=$&YjDokVB*Z zV~L@ZDqW~*3H`?ZW+u^Grrt$63S*?e=h3ClN*>NC@&h5UTBwP*4Ko@7@3~Frl2@WB zrhX3X0|zHmLeT+@`QYi{kLS3?Xti|W&l#>cY-xZ^I}G4MeKZ_tA?7^->$TP1QdxjEZl&2!7)Pogx+adgk%eu^?i92 zDBzV`VR7Bt-oLSOGTWq%P{MQ53XVw@FN60WcbLwwErLq!$K~K@q`V@+bYX^YwPJS% z&4(ky(FI$^OU)-X>JC?&&RilE0~oNSr`iAWSMr1FO!_acQIR=uWsEG@s%pMzT2=K~ z%#p|YANs-|I1&X;I)yn!gq2uXm8#`12ULfxa2K9kjQ`{*{KdETxq=MLj$<&}GGGAtnZ+~VHzxwA_l2{V?O`)lALC5>56u6w2ic)iI^Du~%VZ`L%r1%ecm2{2_ zZiAOhYCPp}#6LDxdiw=$UewaJz$|R(x{YGuQ$;96q@yx2?Nv&k_fV6%tZ~Y$x5|_B z522+DxBJa^@l6PEgMnDp#`K7a^75@H>#@zNm0TGpq;Dy?Vv+0z@B6MfEJL_!PG`8a zNqjC)vc85(6uC&SoqmnZP-uVq_c;j#BTv&~bv-JM+0p~$m)cttI?@C?GV{mSdNkgY z>N{tkO$|Q33qj>6jOJH3v3%B*z)}0SZ-?6J$InynXP>2Z>cZz^?Mdo)n8)iVQ?eXV z;z=GD$0<#iByyLOUR}SCF{8<-&3W;K-;jw*wvga7*(%cu`JaT&GjaO5`5tZj8)th> zmOOEDaCcA2d2W{4mk;CKS2z(H*PT2~q9~hrK?s<*EFx3A<{(p}pT=nrEU-4iJUr`l z1YAlh>YNBi0saB3%I>O+GzRiy25M8@pNKFbh4;Smt2DwxdkIO21%c}0en6RNwGCE@q`URh*`;1wOx;veT`laZ*O^BuMFPe5#B@u&jGTLt6XC_FuiU~NBi6md&rd6t z-N}GuI3d6$PeV_;jkVoBi2hC(HyuXEyBiz0-$1hoCW_Oq7GaM%SFrf{$sLpEcNL4Y z$8SFcZR zpYF>H*P{woP8)(SC-ah0U^2(mjnR`r4k;z&fdW06KpN`IoTpvXeqB?9Bu-%D=I)nl z@#;37Pn^#BVAZgB?r#BsU}?EMq`i6lbj8IfCkv$S7bB$UeZ@jlg1;Ej-yc0AT+5wgzq)x8`NHyz7Jyena6Z?4p4!{A(~jnMspNX5P( zVHp}Rx~u~eQVU=Xe}MuSUQQf7Br(?-10m&L@y{+lp{Dtu40mct68yM;K7`O){8B&3 z&#Syq#N$OwSwg0+zaVXoF`wGNGRo$$xK@=t#NIgRHZqy&XtV?2jWle<4i%_c|4Y2yDOx0Jl;$MlWZP8R8cGHqH^KKx!hkD@%qPMt9YM^uEGgssxGQn z%Bl8xCARYQVf3EZcp(Hx>$cQhOa}g*s?pO_1QxJ0pq=xVt-JDEZyi8mk zLx(w#BP-^9GFbFOzrSG6*y*@XDUc5T6&N_8xmSy|HW`%z~ohdRd zX-&m+V5RnIQcJ!jZS}s%o7RP!2(Vrio@0#Ss=gD?e4j@{Z-l=M( z5BQ3wK~QSMa(7^85YDj;?Qfv#c!~W`Gk7gAr!bZVqoaPR2Ndo9^2)}qKc_wqGa~pJ<%+?Kr{5Ddod~$-}oGeM8 zwnbcxcN3Iuod-hui@vYux6}TmzNjyk&%c9fx$fUiHcCr0OA9M; z$4Mxa+fz#=UG{pF(vQ~tftrv&Jj9kuCywkN+=&-u_2R1kkGGr!>6|G5{e)NRmME_jJf0kp`LyUT#aDG6htRJqGGV+m03lG!)g z-%rJjj3^d+-(3#U0`a5q6b9hl5H`&a7;pdjbi<_4SXy#(=R&e*9QtcFJAGy3`Ry^C z69W@-Iy=HMGd(>!E|0qd39ajl_=^I75mm0W{8frSW{b3TOH6+PM`{7dedhu>sP7yy z>yN{hz?=`fq4Lr$Zj#Gi;MQxWp7(Env-v7wjbacdG@JO^1RhLb|aq*fCtXLU-=u*0Uf2Zd^kNty5V$E$^T zoz;y9n5(@+m%4)`p_9Wv>{IeCEM9uWoUa*3`9VQeOu|Ng_P87rCW6GBfVV)j;aUTR zO5cT?h4bLIkz34<>=3WmL?_g@k;B7&I3jL0)&T&b_qY1q>FE?tpxma8e5SFvuT~u{ zaIxJuJKhGjJDG{{@;pqH5BWPbsqLCz;`3p*FyC@0It%N3>( z*uIPg9-qCo(lCcn&)3*J44 z8tsZUl=S#qSGz4m&+0}t)>=>rcmclZdwR{|bB+6!&p;6^a0!=;a(dwNg#ZM!B`4MA zr>E~LwAfp%>p9CHA!ahc4av+}H;*@#aCc|XpV7D+UOtmX#KcTT`ue*350ho_@U|@s zaFbcQpKcXbHes&2p|DvDu~6C^1pf;zk)xjFeD)zcwxyv_qz}zuKbXkI!twl_Fp3HE z>09f8fBq_pBfPJ3m@G#ij-jl&{HsX21oA`N{|}TS_{|dlb?m^kcR-8_gmHp3xl9l2 z9__9%c0eTUq_cM;?B5;(AWwm$fitNeLPCPh_=$*`oW_e4h*lBib3~(#RZXpOhiW*r zfu%I=!W#g;&R06~tPi8}%VmuWA7W5Bjq)iazXRQh@Q!08fnd!~!r=Pul4$W}&u2zb zhiBJK0cVE#${c1-#sD;Yb|bg1BUAIh3jk|-ve2D%VKJ4$zH5|E6or9FgoF9#GfvR) z>55Hr7;(%7aVI+!oe>aDBM<5NYuw;K_x;cf`FxA{$MaHZY3P4mtCUpmP&5J(7|)Xd zh=)ve0e$f%@x&o`Dj7Azfc7S9X6=XhI$u-?VxGpkzk*vf8;Fv0#aher9H_eb5| zZpT)P<3a}RfWB~wHuK@cQs<+=crqdCnkTS^_I2eMOuhiww0PWY17@zzz~g0tjq-t~ z^?h{sq?tTvmT_^p;@!umC?RfxgS2EVz?T+c_RPt2jbDp@@F@iG8cbwrNT_3Hr!1GPp-1%}_BIj5zMz0-m=mOcS+a z{1T9@^8_&-;LOe{56_ziA~icHik ziNs(Eo=A&k94r?f`E}`3T2j4D>Q~Jl*_ZW~hpE|lo=%r&_HO}j+*sPSOJw5V-+Q>> z8~egov3)FOE{TKxZOvzdz}8%;5y@&A4f9C!Mm0nQ!T2ka**qFw;7rToDSBHE#A5j} ztV$J4jR{0aZ@Moo0C_;O?Z(qQZ9-c{0+kp4(*QbP^pD~9s041^4JOlPYh0N>SmL6g z)t*da+3GaO$je6w;Hd&*m^k~+g3c5)dm1cGJ0{p=C zrwv6JpXBVRQjy(WiMkR+c8o*@bwtvei&^q3GYJW^^+zOmeC{QSQlKR8y#(L<8c%NV ztXTsV81^3*+dw-DO320KF7bF?r~A@l+HM16c#=4(5wU-2-wopjjSYs zI?uE9xyQf(NwH7}_dm?4we{L|(^l}?7&Uo_Hwhsro7Lb&^qP|=8VHhr3z*XLu>EboSEtit;o=*L zfp-wWwak*?ZiH3?LFb%BA2ZVKuD!#)534m7h^0(*yV4=rEDDhEy>@wN{lU>s<#5&p zy5&B4jfGbGV}7Q|zMQpv75;#*XlGEb{YP6Ly}#||9};e{w>}gf9kx4 zr+|g=daef_zT;lTD)GJs4clk?XI#N**Ru0|dehd_W4ZExrb+*(BZvi1t^}12?KW~K ze2cph)&Xtz4M=(p40O2uA)`27+V29qBcJ%apyh6k=ESv`v#;KMkJsRL;vZQgYC-`u z)WfgJ8t8F)VFAN^_O&-Cxbw}fwPy7SML~xNn*>vKoh|(@eVo%WqXRYCO(#HJv(XZ) zk_y&t@e+*>&H!`SpvF(zOod6YH4q70EtfCS($WHzTMmmIGNhD@&qdFob@TZO0tjd$ z12xxyZ^d#T(dSZ=QpLewE5end#M$EtOU$bI6#6zqiq5nKpeX^Q+Nygi%-l3XS?NsS z>oY!ycaz^`_6qUDEJ^cqSk8yor0ND%3Ndt;oKmcX^^#N}n{1F{{gOKd=Fl9?hbHE0tj#Nx*hu|;==pZE=-hP=sE`Dy zBuZ_-BsE@F4*>i#-`=KH%uZy`y86D--3JBt(s;2P87ap!8IXfhy;19My#!bzs{gLn z4NTM=d}P+JIqHRQ>F}O`8>rUpTH4ugJ)C}?PK_f6h^Zq4$`Ir;gL1Xe-C643m^T`B z_Iaba1q@YQ)oI(e4p#)o{|DZNUm@XlLyZRO_Hr~EgX9BT z*=tto6L9?q&4nGnXCp~7*~rz}{Rldr>DChxT6E=gZgc(n3G{h-J~t`sa|qnHF@+C3NTfH~9hwB<4;pnMkAu(BSTEyUmmU$b#NKjcvAFpjjMOLMLFwk|k8Lu5D(?sK zN{QmX9^z-4zrgSJ)qb$%8+yZ+hTRefwbeDFYVzq$!i zs)314v%P&W@L|--56sCi_;C}q<)aTUt?VEvsn&m$HPBu!00xc3r~PRI`tmV24>!jN z7)JiO_>0HZ{VTKo(R;b(?D_P+4gv%O3%0;jM(Xsh`Yg7@vG~gHrqhIw3p!J|Jp;p* zJIenbB<-Nv5lA$Db__{WjsKg)&d;OQswavtK<&#+UsfoN_Xlzm8urCU(#2K2GW7Zp z0X|+`53g{^5WX<_L;sXwIfq&5H$)HTI4Pibi?ughAl5g@9vl3omeu9`k zch*TAv>+7&i@39HlPXHf>p;>;{!1ci>bF-1S2s*{Pe+TS+&h!)4i`QsNJK1#Ad@C7 zTP_00FZ5C32$WGEfVCp@1aK%TXTlEB%vA_bJ@*G+OzC1N6O0)$p!xoRRIT_2;NV1! zy9dORfS1tpocC@557heO_zK9T0}HTv`PVuxcVD2N`1%w@uUP}p+kNpp(gD~N$CDT{ zuD1QD6QTY7@VT0rnE|XIr_3DmUsSAWz~QoTYc*R5eyAf>FH_NKWhP|opAlYELjFjr zo!F-uL-gh9_Fxk5$wXF=ghfV9u$h*&OH+UTAJ>$KE*GeG;=oCx>fGpAZrUXNJOGpag|StBV^CWF+jX0h_n-bZFd&tZ_w*<(VK$-b`!mB{d@!ID*dX} zqH#@a4(oDXGh+m3P$ieQH^<2UcI0uz54>hb$M0>C%21nag_;4LX~LLPduUSFuD6Z# z(=8)zncsb`Ie-`ZP~WF!_Wv_f72BPsv&6}=l&I=4q=e+k=z9jF&Q9Hr{I-k&C3IHn zZ1=&6#((&V!zV$RP8(p^OK2a7RXN2By&~2vG&sKNm|4g%?UK+>If~m)t7uAXM;=g) zO2e=Fj@Uju;Pa}x7r7Ft7a|#rK0+}3| z0GrEK2J8s&m5%v^UR(;oMrk2cK+jbWB`mz{W^zKt2K)6|@X@Cb; zMd{U7S2+X%^MHScNU6KyE$|}*3cbjqfVLGAUH-k3WC$W9;wsajTh2J1dMd6VWz21_ z_H`GYo}o%VX9$7uY2Mt+HIaYs1({mWiS4IH^&2m6Oh|vyBnmlCe&pEuYZ%FG4_@k$ zO(~*(JG#?9oYZMqbpU#lWXY2BsZkX;s+j6kV5sCAupd{$WjlU4xUo9OO*qn-+|vv* zHvNerR|ac%qS@G7%p{SeL0OcX0;Ue-S8DfA^rumIgBH7uWct6SItTt-zq1Q7+H|FM z%JgaO=Q~60EsTIPqeBxB@60&jA2Qijp~1J=@fH&so7&g9pCy}5fv31t!-FxLMt@IMO#J4P_V(% zL!4y)RPAQFq$9ifHF>^Q9ONms6{mq0_Uh`O)&Bv?s4hIzi%uD-(9F3wKCvof?EYh< zvxIGA10u>P@1-rMO*LPd3IRT}i@SCL}#BvAEw zG6{azJAiBuq*Uovr*6IMB%BVPw+u-T50L@jMbTfJ+xJfyZMbwaG&Dp+j81kJ0C44G zv7+n3s|r{fyB3R4KonF|h&$7Y+58ZGz?lIE-2upJ93|T)TGI2Epk4_SKIb#EMq5t} z4Q!E8jY)jX8a-}}n&g_6+OG_XIRg9L8(RQaM(NHoG>lhN16D%L?jOi=i`%S8y$0kELTCw}0f3ID!M?s)F)ZGQy%zi8qINr~!*)0$FIIDAeoPPL~= zZ(brfi_#+`sYLq&wd~h)HAiddsF~g27=u#vh>mY{U$ZOJ!qTH-!$AXWt=F#}_vI=@ zR~sGoLKiNvPFwmm?v!89Nrp4scFkTQZcmXk$_-l1)q|$U_nN*kOlEMTaX3HC?#_Z% zhKEb6lIRBW_HaR8yzeT3d0Y%w7O}1bs2R<6M9;HFq)@Q@?_O2%I?X&4xo1I_w~o0! z8||9*wWs1ZLuJgLY7w?^Yil-TrO;HG|5>$e(vle;(ir1X!B&gyj(?tXs&t^Z8!j2j z>(b;$^ADMIe@xh{xqdcl#$T*q)k!E_4)#QN5nDJ~^hCJVZnj`b2ZwI??+H!W2&I9! zC@9tk6#NxLv%>f^OI&Q-cjdD$Sh>A7S{)L~tLARh0fFG0sZ0??Nujxk#i%JpQxIXc zS?Cp#E;!7gPM7+NpE$uZ7_V&MhLFFo98CN<)dkIP)j#kMHa8+ZtB;%sUKwjjNMAnB z&QI4eDyc7j1(irCu_mqSARQX&^g_UhbMGaR@^aSdRUs5HE|KgH=3rtOMx>lxNc)V# zQ9{#QtwoDynUZ@F-U%&(ru^N~sS+*$jImAKR~xPjiVLk|WawS^vj!r-v*!dNtsobg zOe16o1ta_1BOxSU5r>&c2(f=Zz54?sYJm1jt?m3%X@O*whV^UvZKa0nsp~3|WiT?~ z3u;tI7|ZStR9W3PXa$i#soDod7X--cL6Kq?3}4cvh}h(kcwecZNJIs zVGir~PI~M!2P7=YV$QdEdQ8BG&GEi9`Ws!Rp8s30wU^@5&8ks@l)_|gW|mB&Y$UWL zaF2mmB8SU7nh_iOa06}t`WDP@w39th} z_Le#jQ&VjongkO+9FF7V$flM}7kke&=qw)_Owj39e*O7$3nJm!7dA4=kNw9l(reHV z`$+u=20`^OK6)P<&i@4-)qLv>fHApHkr@sR&Pxn@VEkOSd@2;D&tG9bbbY^^1D-Yw zNd6r+n2(aD*8C$47YP6zT+tWl@u@KY2Z2BnC4sVDvOU@=xv!3m-P=oaAdYI*&g^*s z17G*}^D}W&w1T|+>B6~Qjn^qeW0}0(X21s0 zWZm=q_N3_p><7Btienr9?bw+Qf^NP$F@h617uQvMu0UC$S9IkBtU;JEJubT*6&j49 z|D0b}fi*bAA?YAcZ@Tko&%@a~a2Qb>8glWv-}uK?X1;q-v*E@+@d7CoGcT`*1Nr-) zARPva)kJAv=6tf+#X{LU@L^lcWl?!wiu0eLTa7B6;PZ`?yBld2 zGZ)lpd5TR%ULcIMFpBv>QtT>&W3c@vwuoE}4(zd6!FC1D7X@Y0HkuF}*Yh)Y)Z_KM z*JkukUpV_(R7Ui%_3`g(9Og~M z&K|c%#3D)A2T7TlSKu`SMwL4yEJKPm!#c390i~Xn(?LLej_iW9-a?(RMn#hkkz^N> zZaYv|J>4Wv*km>a4n6}%h@EM`Cl?*T*8`kU0CDOWGV1Zdf1W7%6Q5a=_UU3AJ{|uH zn(0$IuXt+r$#Mk}Xq5KD-z~+DC(mA!_Z4;x8gSmx+7aLbN@sACi^Zd?C(y2>=$@q)O>tBUJQBJ zkG?>Wa^_-F=QwPK78q&FuDJ3QlLApOEG?8-Olp6xU+(*V++vLX%Pr>e|8R?W{d0@q z0BJ2P2?>t~Gx@)pU3{k%JbTP&Ky{>$#{2pk(Cgh_$wEEf{#nTDnk$$h;`PJ-y=#y1 ziR<^aV2HQ(IEN1-3n%BF?VW+()1=hY&z7q=+39h6{owq%y^*SAK{2S%Vb+JEo>?KIQ35pDI#t=8jfJcDM>!>rs}YfT2dm!%9_ zAS(v-Z#oxGgE?>jRR!+XK(*|jO*BW&a}K->0GmANKkPM$`LKuCL=$KweA;M-1c5X# zMuy@|$796AZPz+k-PV#LBO`TM?5`D-w5_xODCCc1>*gC{B~+|H##v*Sll&Sd}xcrrPZhSB)CL0fal#CdxNTp;0=`b0{&hl3L-(>8<5Xz}yQe%;=QW?ZA>l!IICjA>xhmjZJ$ zYw%T*#FPi+<}zyo%F$Yh`ZzZQBp~R=TM0D+Omg=n|4ef7*5~9c03I=V4U@b}bcZCKzLlNP!|#t%6aOxYbHmkXB!%PLou4dUxB zr{h~y7dLdA1`hU-5vq^9QIV&iBV5u;b-Czz2-h~~MkVzNy_MrOoszrb2+8CC;nnDT zT|&piQb+{*>e%f13l2~VvJ&2!f&lA|pCwWa>^-^vzY8)3LSKF=GB@cBPxY$e=%qpx~CmhDYsm2TL9d zfMK3(6nOrH_{mYs4CJ_us{a^M%kes}NqlKS*g(r?sy%`w?_&4oCn9zw5ikni66f0?G{koe1Fvkl;b*t6VPqg$b;6`0=t%S)pO3Dft}9>o73H>tfaYzbtzLJ!kKxl|g8C zZy1Y-=iwLZz>OpZE^B_I$-<3HwjY0#ibHuD8Y87BWt7sDRbn84=NR2e6e?W@MB`C{ z&O8%_Z)@9P%p^WwN9a*Eu-F=Gdo&V~tU7D$d0Vj=)yREO!rD!({Yb?*W_uMPAa#rpA~DH3C|35#jRYRki+QL2GL%{S zHS5Ghyys8!ss=M4^7=mBuv|hqThnj#+i_>C^Oi0nJ5OYrXn)mm!)11t?|wl z#7Sw@i4PHFieci{HDW8(!fOfHL9XJzYBkf_c>Uy3zcat(bp1tb%x`@Ybh;N1D?*@? zsQVc(TZ$$e#`&nNjE;r%3wB7Ra@KG_g2QS-3{!{W4-O_)RbLhA|78IZ>EP-3(JUb$ z={~>+3zMUH#NC~L=@E2sb$Oaf_T2K0c@2Cx&&uLCloPy8Yiod)f-f7>gy9yTFJS$% z{v7G&_e&&CNo;r&{eBe%G+9dbw<}zyy1hCceI_Y%ba6Lv2MNc=c?#ysxQ$$x5(Bn@ z&#nE_;qP@NRra1@GXY}iC+OHEL;*3W)MzoT++T^zY-Qh+c<}n2NcyVG7cj&zF!+(B zbOeh}l|1JBWT(y-k@BIN)8CGuydM{c=TKrGW|2GB2BFEy1=y)-2^%rOvwR?-v)z7d zhYi1>O!-cq$ zWbUnos%@x{e=(|iNa=ao$P8!nd%W)X{&}yx?=u@}yFk7$ z*Ks>hoDs=dCOz#OqyA%N(p5$5AV1PLsq(N2!Q3NZs{i7Hn(R;`!Pe};G-IfRS^+wM2BV?>zpK{pI z%X|*q0C3~*a%_%$-^)d#HWkj-O!*B#mU9$*ZE1rs9_5^c*Z^fCx-{xTrg$@Izh?Y_ z6Ye*o6eAh@H_<-x#^Zw=<}At@7%t_y$C9zAPSX*A*eLm|98qSc0JA1ruTU(AD)-ek zRch0R1I7%&S1)}Ee*^@JeR5KzHi&%t6e}!-y@$Ib%V>iwg!LyoUmoSZp*_Kf&-9=1 zDd-xAG>X;nehVMc7jb?V$^dJnGKMXq8Z)yS$wt(v8P2D}TRhWA|3YBVH9x#+qsW6S z5ArvHksORU={FS#`_9TiC(>3o6|Q_F{|o$Z;lA2tNP52)M&S5|1b68O~D%t)GuqhB^EH2FXG_ z-f}?3own-9P@WK{Zk@peBNFvy4Z_H<%z&Q~i zeg9~RudP8B+u6^Qs{>ER1MxR9UqZvBbeIz3!A5~optY!_GXMPNGN^X9M`@ADNB8o} z0yI(abf%?Obx^&os7?i?DC1yBQg9@hY$92){0kc<6B{#{C}cz=3)@e|3yMMsjVZi2 z5!2?PvBoiR@Kf#>`b@lIQ8RTI;{GR=3;)XR1mWY^u}OmCjz65s*UXwp|HPv?-z~J| za?oW+-IB6uu*lOom5`{ju;LnlLw~fmC%j%Cdb(_dfN}7+*@z3HqkV<)q7hWlzdZ#Q-qoFA6bP%L+$kCS1ksYi=T7~1 z53m4rgcSKMmaHWm7k`ArMucH7ni>_JBL0XL(BRsr<(R1MdT9RSE6koL}A#rAEqys(7;#JaF`?N6DIBd9&UJea+fbOt^QjSjBis!+xW- zS*7c2?s0n*=h<1iFZnutD#M|(L?0igM`6wGP)(PC;&esNvZo25U}W)58|QEhPZa)n zNi*K7W%B(S_mfy`!t6|0Znvv{dwtJ>$9%lO)~ROj)N^S`X-V?3YJ(~$uA9xAj9)V1 z2t$mPYt3hTIuQRacL4NHBMr9^6)87M6lM(yCzuOZ8d?J)S3-ZRCaoikoQinG?~(yl zUogLE{;IVslKptMB%IGY5W9+?nN2E+@c@@Y&<2-7D^I4|C+r6rkb$!&6l3^kg-&v) z*RjK`(f`4LDMs$$5|0)v`W|7VO-2+nr66QJ5{rr<&!~K?mxVGiksCazKfqAk(znF_ zrVFa0!G(NV>ii1~Q7~$fM=Tnn;k^UPPIjP$a}0ykpRMT79L~P`!|o&yW%Esbm-ke2l|U zdnp}as7#$txqQl;a3zp{Eczm|i-I_bt^`*3GiNrUMAu4DpWu4+$p3|v>a3X6SVyR~ zb=eLiRQHwPBO-+);c%ayvW8uwUp~?i7>X+Vw<|UtgkDSS*39_K_c$Z^+Q%wYLgzf4 zEq+x=FG&iohV@${)_UVWjy7i#X>QQNYLX=`oS;=6LL}9!6g;dQ(lM7crxn}2Z9Kwdl1w@4Y^W&cp7 zZ0Gj5iE$Oi;D@FIJ;*7~W+r}Bu>{gNb~PV4sG*@xS8S56ifUb={9|wv1||b>F<8gq zV!^4x*fVCF_$$43k~4xXRPNvw-5e@0yv|ibgE5m*5)!h}{qpjw%|7!D1wmK-IQK0Q z!#pJ#vV%-rrj%>r3^<)z5;MD|G0A^_`iMkYqEe0IS!|e~$|eID`Cs?1=#}4$5dLyo z?4EqkLAxUnJNk@mvvVnluluK3sGnNp$%Wx^(&;D@FOa~o2`8zP!L+C1*l;5bxuKC| z=8QeyQCrP@qnwyjJGeH@-gB+QbnQlj!ZE4DrL#k%qY^b6eCngt5Qp@Wr0SDS8CipGh`QiG@2N4_CB^1 zVNQG0?eL<=6;riuTO-0ydW!ALTqn;WGKR{y$>x9TB(1hEL0jy3OMFes%07hg7)fCk zpI64^5)FJODNGWFKc$t=!+#1hv^9)qG-4B;iFlGky!8ql(zVmVztk-0dr~0h$LH2N zv=JF?3|VK5&lBkTvURw3?LM5xjD_suvTe}iPj*abgN#-8mF6R;*MX2^ke`UfU&U9_ zS9d{_mW4c*eSz8HAUK%6)F=^;)kqk6)|oDJn)n3$Z#<&rXF6|;w4pt$k#k)%i*1ne zIQF;EV*C*2b(6rzal6t@rxeardx)c456^HKvY?`5F7Kn4kNDKVb5ihnttUDr!B62I zwY^{w_V;?&;78JLqQh)t9F@a|auDINcnb$`%1G0VE2Mj$I;i};W=E*G_dZKBg{KZ# z9IWL~-sT%+5PZCqrMO%YV~WGU{oPs-@2Sh<@r-J8ZQ6q=Awq}RTHDtb+O&WM4yUl) zT9-P_j8q^(VV2}0LyJX=pVs7w-qkPK(La~V`^11Y)AJK5;wud{{OEorA*8o7Ngn#^ zd4v(kH#kDO-4M5F4$GgZ`m4bDt<-~Ne^hzKs=1yV=}q|~-sVIX8p(hCja{BOq!tR> zcR{o$m8fLF1Hrc{gCNJrr!;WJiKSaTFedUQ<`n*kIM4|>fQ7Y9NvyXEE%}_8LMwNM z_;Az_gWGFOT`ZL=NH0v&c`S{EaRhQen<7QY<>C}=%%#q_Ud{0j1rC|u2J3jT5!`fl zq$Asv){Z9Xi3#>7- z7G1U5r{75(+K1yP;%6Q`g6Gs%TCMJA5!;{BDN4iy?r@)k`UIRbq%Y$hKLrk-lJ)EK ztBbHKWGEFIJy_rK)$4Mx?Ek7#5$n_SB2w~-QBZQC5rdA!>6AHjHZ(0h)uJEo)Ak7u ziNFkJqnM5sT=sQ?%OQFnG8fx!GtUPr6mSbb2?1X)_N;>=MT+RX3o7K95=w70{gY5l z0j95T4EmfIbuRlEZt2-KO~ahU?xZ9V>!hm*`2Yw?HWTGa#Iah$=)@>0Z$cLa(ao?( z)^UvA4sZSRe+NCURdquj_sKo8#av$cy_B|0#HWl?CqBFRZ`pZ4Ny?pF$VvA@hRUO< z-T8ezM$@3P{QF=+!x)>E>GFV1Bl;?V5#72#uHMgtJkmJHGI`WBD}r6{r8|GDiH#LqG?7sP@!LGxGc<)8{?8vD z+<)8Sq49WBCKXNfm-;xn8#YUB{r>r0Z~d{YbfO47eC9XXi16ZaEKHV!LQv%$4EE3j z3sp;+6uz?}`;n67i#h&kXA#~V7uv4obK_W`aujz38p(7< zZVtyjEoVIMv(}=%PpMo#JjX=am?N4|afFi5vuNuIr#dU*bg9Z=G8#yvCR#}- z)c}j5B9mlYfw>Hx75=`nBD%3lAcXVg3xPN(5#zU0bpO&2zspgFYBrDpfV zyB;A5l#w*j4q#g_XobtUexw^7^;e{sZ}_&U>1wzGHow>0IJZzQWh60T$|0wq=A5S> zkBQY_T{yvakPuonFo8;l2-ZXmeym@&;Uo2vN|XA=zI1Q+87CZO*F#%dzL(FN&_Y@A zcMqaf!e^&yr?S0VEiBk;k;({@&;Yp>hS879-_Ntl4RvIsXlM`gMYWVh)gm61Vx#tx z68Mt6gb%jWq!~GoYBKw!ar*lKoJrNeZ5%ej$&NLlB($Azv{c8ylC}!x&#-vp4$YiK zJ|RzI3V1=g6h{?tieU$yyae%2iP#gGbVQVdX9{CEWf_T){naG$9Ik2vOklo%9?aJ? z@t6%f)wE?2^mR#JtU{L&B4ju9HJ|jnpLMUAEd=9Q=@7sW81H-vrV*n zj6tPTcyk&DPb3%^$%?^Gh$)fZuM{>%6Ecqp*-{W^JM^JI5F7U>kbViSerT5PcW7ul z%^raZorFjx&_9BaxoXc;%j7=5lFG=i!4{rb_z;NucI2@Jzj3Y_+uM}VWPPqs2{Q>f zJG`{}fsCL`>anMcYPs?{q@Ypyy-K$26B~h6{%f+M{qB)+Pio>EDI*g({lpc?j(ZsI zvG+0Eq_*}?;jT}Cr#1WgfoVPqv!`*#eW9gj)M8=nctuG*ev08z96e;QX#F)`Lq!bP z63DI=hlCVcdmgSdSciVeSv8UMSV_SxTCvvS9l(mS6C1nh@SJ-cqh(!AE4`DhKgjvE zkaU{G&Je3Z59fH_;Q&-@U*_7r9OigI0_}cJ&{8;^OyCwMuS|wuEH`cV> z#Idk=B`mYYdYtMH&E+o4s$=BHun?=-hX{th&BA&pP(i?m;gpN?ptTipn*Dry9h$>B zCo;cUB(xz?N-u43%D^k|n50boO0iQ$iwzmq$^}eu*D~$g*I5Q>VoFokc;-g-1;N%3 zh^)?p=|kW+AIIhI8Zcv?jSfN#g2ZM$+>>Go0STeabSSJQ9I=kSSi^1z@y24fM2iSe zUcWIiw-HAnB9GYa!L|IWLh?#eXP4G=WsXdeac&m9u$5mwuv%=*xTmn_!_f72^-%mD zn!YhSlCJAIwryu(TOC^+O>A>Av2EM7jfp++#7-ud*fzetpZEIuXLVO!r>ah!z4zK{ ztrK;Jj;P11(id3I1IDm}v)^C2WDQ&r2j|UaOimJE~QZjO$ zGm2$=aE8T0At+7)+aH2e&Av&PC9Bz`7Ba|X^NOv(Luc@tu-%f6c^nbrMr2GL+`e>! zfFCh|B-Km&pzRt;5cUJ=nLd?<_96}DBppIwLS41v`H`te-q8}i#*i5wqjM9el$%3x zK=6x07YQ1q5zF!ZkQD6?*6m+D#8AxS_WBq?q`=LIl6_wTe?7IP7u*a?#NUiKZ$781 zL=lhpQ|J&&8@C~qZ{W#G#{EWn4jdb0mjgfLv>~N;!WpO1pQe&Py3M*Cv0ETAYdk!} z!9Fmo&?Mk8iuAH^+bR+iU}l#qaXIK_i;#S}%Yw$t&CP-!4`n)&FIJ50q@NE9eARWK z-oj#poH#k&uoTYIkaJKtnh2d>3z;Md($>jo=6GD;$S`A-nk`V*F&3F-I}(fV=N+n{ zXhNP?HKxFV6`@jI*ZnLw#Lbl3)_-&xVnkP_3~jv(sHRqpAmc`$R?c8oSr~xv&)2}x z@r+W8oR4RxUVj{GFbx!Vp5k_u2-!JAmS|(?uxsu^3<}sW?AqOT>L9um{^j^$n(GI3 zVA{AHDU@GPT-h%<26v2v9Rb7nTy|iRo(YTUVSFa!#aAvG(Y+n_Df_nqrLrNp%vo_W zaMASQLq%g8yn2`c+XTt>0gf71aeS|&#+~+yHo*aTg~_Ci1s=Inkll_Y-sCnj}MDLXo|x% z%U1VLXQo067BWiCbu(nalM5b|Z(^?yl9`2Hb7#cEt3mFws<7zB1Vxu)Rzty)gylJ@ zz=_)vK)@94DmOcaBYP1cO)QdP19c%AZ>CXUf4_WZqgahLiyG7(UcXk+IHi|L#!J z$pbo`D6}ZF%rT^SM@5o~Sk(7th#5kI8`s}w5Gbc#kf>NWJC3ruFnYvkRDHffke)`8 zMLpl6t1vl=A*bTV_P$BtiOHz_x!-43Nu%6`+^3f~OiVY=9OANsS8Uv?S3E!$Gtg}; z)h9ik!)W?d`Yqy2{D#|QHh4zkh5mm{%YIk*j>5dJ}$EYx9C{1hv;pBMHT>$M-CD zpw@n^HiUzWQ4e-l!j8CEn?ZUME}=$=j=Gn5#^%FO9V}fmH1)Y;>ar-uI*mCQ8F_~f z;OZ9-fFn3__`dTfCm5Og%QqP8emz!?`Di~Oj#b7J>`RS|wByetECsT}rz$01Ep5WK z>}@ISg9Ru%SRD%^$E}PR0~qEg71}7MB5113pD#^OS6jKeAU+x0$5-SJ%n#q2aEW!B zqBntY?V=!rGa5WhOp)Hg;v(Iw&3x<25;_~OGx~)AMY8f+IQ<`7ORZ6=cGE|c2)5d~ zFY?}Ro462J4LZ9pr+C`JpJlBICMn^6m|N3;<56lrqPhh!7>e{(g$>v zHA|UFJBISjsoYYh^O&fK!si8c$}pm0!&HJPW{t%VIT~8-`GaD6rx2ACospDmcA;e3 zt2b*Co60#j=+Pz`sn~TurL)M1c-Sa>c-Xpo{1{nj{9u^#nof%8sh!DiRpshVsd-iT zjghvqopYN(sg&6K8$E}`P(Y2NYA^_u{s}_03R4h`DX)q1(9G7keYeTLK+vhgl;?_r z5!nQ>TQ`Fj8XSk0GjYO2cM4D{=kJ%E?-=_n8F7XQ5OEZjL;HYaz8LYig{ zhe)dyNm|9>-livF60GjclpBoTwD}7Zsq`n60<^9KHz^jCcJUp+UfZD=y^4p=I(D+-ACd51fzd(a}*MHeOVv)f1*t# zRU|u$art$!)-cqmxZY8et{2Snxy~OpYhXfmyM34;NHqv9mUg)rxQXk(Ip|P1x~xs4 zFUgwxyU+&S$i5clNM;hJAr1irxe1YPWIRfzsBF=**_fFmQq!0p5*#`%GREW>^;2vK z9i&Ao-5>1C(mIt~Zzq*u$`};$bO-QEe#9fE+9;X3sZXOLMV)&}1iwo#Bmfcb(SL2L zu2XjJvab+9f<3h{eG3#3+7OTm@eFWb6MLuho40j}s0Xl;w=71apr+lC=McFC;v6I2 z*?0yQiC^1@Z;5z*P#3${8vD{zKR>vK5yLWb?d*ecC>p*Ecm#AhQshepghZ?;Xs-(x z7Q?U&A(ayH{TmRq?Vm{EG8G+Ys;I-A!mAL1gMc4yATt6~A8VAM3A6B)T3jl(xCeH0 zU_Vq|ZhI1O>8DUQcIM3P+&{Jyx_qKb0jn(x9@(XtakjZjg+4IL-P~Y_+%K|95qhGQ^ecqXPBXM0p(V1cQZO;k&f%r08PR_>AqpzQ#`4qB$HKSU@lW`|6J9*BrssbU=xUDJ z?XJBMRC-X$QfcK-R@Kj@+7mlnx;E#h8jp%cF)^w7TjSa5b|fPh2bPLg2$cp5#_kz& zluj^fs6&d)M9|NeI~vBEPX7&!B~7v_H9iz{4P1;>oF!1Oz&zpWG9XhRTIOjdb-{9# zYTmDdi+EntXGbI7s1d#*^^nTEg#SSJ?2Po#7TLL@F|wtH0jF_h*aReG5x2mKmMmF5w>+O5ID zk$5UIA26Ai+4+FtYr=Sxl%!C%ohc_I?}h;pF~K0mI3gO8Q?9GtVnjdMsK6F{xJ03@ zTKA8fGx!1G(M~c93E!n6vPDDW~Ws#CK;bKC<%ZM8A->=TrmmhpdEg*(>y2nATGWSr7{*v zU<&k@)szrST)R0!0${=BU&KMo@gUECVIzV}7iIoK(Zyd4L?x&`&9H%3@4kc~rwgz} zY*~&WaX_a`DQD#Cq8ror5(u{c*4v0E_8Erp#mK&EF@Id4Ocii5?aoNOsLJfZ9#h15 zxQe(s)%3U-@n7hIt6Gap+$ygTF=tY~Hjgea3^>D(D0XfxRY5wEbgA_C?p_p!6ySV4 zQUcfwu~eF5zE{krgqbMje?w#;%-tabf|I2qu$bsqr7X9>4l>3gNzA2TT1yEP-@wah=@^(vUao{bt#@xhGM(8)&w z2VPZ83~H~ag{!kLiu03GCsWp&pM;Mk**Aj>mt-$}z4#Sn8b`m`)k9IJR~9h9*Xtl` zce8u8OtjDk$6#>DfA`BR2&@fOc}*yq;twxGFOtk**TPVC?V;V36Ng^6c3XHC^3}jf zQ=_h$ae_FU*xHXPUoW|hd7f)2xGhF)qhjPRqUD1a2DX&a5_isn$8$F;l^<4`;sIf7 zcun&;N|2$bpa?WTpBHy?*7)IHgYN0cZeNHIBPRCtOlXd`o5M;QGSV(KAzApyq()Q_1PQaGFlG-#^h1-EE10&UVy zexd&u24kJpYh>`@_bX6B&?>30!oRH&R%lQa0rfjG#GoGST77TEXrviul4uLYe5e=# zw1I1FBp>T?*0D~~l5|paX)SJIE>14otLYZET;#eghvo@|>gMt;^KvbWGL5}R5!)*4 zA>OZKWE*yQg?9bl)fUm&Q*)K*Cm2O} zq-in}T_0_g$?y(n73EM$SAp2%=q}QfQ_h0d+O8naEdWv`L@^hE#n=-PW{#+A$os5? zT-=nT>YN4cZ}&dzy*bmgHNzL{7sT*zqq&AEuajf|`k zB4V;lMr0%El_VBQ9?|EyOLC(6Ql5n0w^$`;mMpeVqBX|8rZ}X6u18;R%_D9Dw}l3Y z{YF|(F}o^hw)BwVRgJca>l%iH43l=YPGyRi_%P+J#Pq_gdH&1LPAT4ybZtJiJvpSvwm07@H(a|Kk%B9i5dM@Mkta zrJd0BfX_4?XP%Z}P6aJ4Q%*UFK2;u%+HlI_d7!_P{3}LCK%w41j2|rcjbMEzBY@5_ zv1vGF24IGVNqjHj%3FP?Y~vrs*i>Je?h82m$XX9 zCR*B9O+@D2>Ij;r^Tb3<$%G>f%^w96*&cg0+s^LHK^)RLN@rtZs$$ct;ado+$gVXF0DbEr0~Bd?vbuJ3e$FVPx9u_Ii>*EgNa{^&o2&f ztafarcg7#=D#_jF0!S(d>LV=VNcb%)wqtf5(y!7Z91_7BU%B1>*K4RLVW^6D&*>ny zBeDPb$%tSH&O~UJ$C^_%RevueO_xp};pxM)B{|vpd~}L5$jt>oQ)oc^Y`NCO*{AU3h;E$G|+x~SHU$f2OROeUTXXPpmg4h`3(-sG4FJ91L7{EQ)n@nc?ycS-{ z(rV(+n}KKO+#Xd_1x-mEv9CZ2`L85$b*k5JtOUY{6WVipf30vcH>-6fuP+z?@6G{k zUNjjacD@8<$m${#`iw%$U+0;uHIA*IDkz+BpqQyN(wXzf0e{?yLU7dO4E~u0IZJnu!24RYBk$IUh~_(_c0j zzRexY#do=pmHkjh$TF-5KQeafwbFRBSo8c;uMR5-1;m|ZFixFE3^923?FZZRt>P~) z7vUB5ixl{O-g(=_C5NehVwkddP>BI1)9bCJtaR9Tx2Z)p<+%$zLy5%YGZ~p4jO`Br zN`RZ;yRLliX=ENZzR!}t_|G`slBpGI%lz!5PzW(0fjGz3Frw@=+T?hpHw zLF592**l0&k;obmZT5fRPO$t|Dzi^@XmcJ#U**B&+!36mUV1YmN6;{6y+lySC$P)N zX~N;6H(J8H&bUR(uszx6KzXW%<%J(pSGhh&>Oa_4l-mHzn z6{hbtHpy{dGuc4YxJhI5MR8|n>Jlm?4>{=W!@1S#648EbR;^%Z+*AB>?NEIUvED1v zYlVa!nY&c8NNicL7Q&3ZQt)s@3geckR%KA|5HT-vKilbXObqG@_=nMWa2mpVw^2Ue z+H1`%v@)d%SjHWe<;*bolMj8(q+^(x3C<+77%w>@)!w1(lG?wfT>&hhp&P*zn?*)X z1kHb`0JaIGA!jCF?53BlQ>c0=N9g`mtgpx@U|9kX@@$Tkm7x1VCEoqBbcz5Op24Q& z50K7L8;s_Pv&v?l7e$K`tG$n+wDe<=2Ms;?vz0I|+1cqF4JRk??l(1mfEcTl<3Co8 zBoE5ul<)Y+>huvMVt6${Rt4-c@mJE5bvtM`r`unAF3%Bl`kn8ukGl0&?srjNA6IWz z=}WCD2mPH7XIH&nft_s>-xy<1bFF-hW+~M|mji-PR{cR5*!-F5MAFQ=)V9#hTUpn6 z>O~FJXyodNSuSEGOHc43<>QWWJF)$c4$_`{-j}4{F5X!ooF0ddu&yhAV4)!SCj3N~ zg4_{aYA)s8Aqz%I7=|4V*s?vGjkbj*!|-JD&9t~EL)f%au;|)`UMBFLe zgFMiMJt05d*+U){vk%;l__tsB?-eSdO4Q2-8|I6;%AR#M44HrkPEwJR4`?0v9hy+4 zzi+!`07OE9vz{yRq%Znjqou;}75(Gu%@9oMmzB!&JIivN?h(Lie*nC`_kK{QufuuJ z+q6sp&wq0IWAoZVF}u^URJXN`!dDjLzg|i=c;5O!ivM(35lPy;@>IoeQf%tCegit5p(o^U8DmYk zO|toM?qDZoZk=&w&PoFIxZ1O18ZXFc{r=Wmu8hxr9BcUgj>Te#Ds+8|=wCDk^L5m! z>*tD@tR!?c%=(wnc}E;|aVqoSY~zRhLRoBfsPsDn@6^j)|C4*=8gE$(7#L7PgKOt+ zSGhmu&(rXw4~Jg{9usgxHVY{FtklA(Or9c(*eT?b3ejGcd$6W&2Ck)D$=_OIGr62C z=G#Q!Hm@gbf5+oLoJ?6?A^CP~WLmNU2s=uSLe;*-oO#(D6$TsRzuhdJvK6BU)CB8h zY3lo}fx^SlpA3HMP4Aia&!0TA`3M=sunx2oU@f-Zj?+2Xb>QJ&zk=PV2EN=it|ouS z;c-9xt4#jg^E8F2C;Icc9V45|elN=8maEz_{%+M72{dL0rw3TjGPE_ptq-v^1F#+5 z;W<*sXSW!h1!z8&J#bwYf*$zud(VFleAT^NJ-+MVFuPj;PMW!-7$aTJV<6@9r+$|U z$!nP*ka)doWVUBRn-Zpv&-*onZ7BS)1j*mphzBq@99`sBAaXS3?DJoC(-I^L|LMDA#MGAE7mW;p_F z*VlG2aL1_)C|j8O?`rmMNT)tLPRH6|T(8`4R_*e1f8Z282)}g4?xMx5g<%yoPsHGb zQO_WDDWt%oo5MF(IF~5|DDrg~>8gB)Z4uZR4$1@f{bE-XM2eKZ(I&Dr0i3XMjg zfjX3r*9m@L?%@~4!EQrIsoo*R@FSUu_(OV30*JR0HhH0A$s>33ipj0fS!T4sEyGra9JjsI)DpuH*;OxXV8oBX| z#J~-FH2D@mJIGmiAA#0Eo)Z8#?uY!meFw$eH|hMTyt_%lH~aOLN|(+~7l6fn#az75 z&6_E|>-!r6i*nBME=}`M&2~c}D2jr7+e2=Yzi!qbq}#?(}c}c{g+0 zfJA-2phUIb>bz)O*)BjQxY~R!JFD;dDh$VEey{R<6W4!3uIwb)IQX;iqvs&5%VH*T zp-N*?O-XPr)s%ZE02&d;jkn1ZluK2Q#-)*9uuR4apICSf4x zT=jf44DrAB_4PJc&F$S_(m?cI);{7H3hhRg=Na@F56O;_ey#S0r~5r^)hJsK$_?eP z1m6hoIK0nj8m|4aUa)un`>=hL?#kQp0T6yoG|vo}IEgUs)*kUi6?EB#MAhGTIz{xp z=e@AIEW zRMZV&T%}QsKsxkcVnZakS?a%riHI0(w8zUk68SDB;y&_Tk$!pAx^$*7YxA3}I)Y^Y zObFfY50JxD z{YaKwDpSm6(rr`7<9`Sz_0#IGS;94Brd2cm2MZV;X9x3n+j0*MM}iLUytDaB%5#|% z?cE7=f6QiTm9qki+P4B=Kmdv9B?3AWY^dGVNA>Z+zbXsX&DurkY1gZmLHNpE_=%DC2qelKGqi?ZHAAb$d7K>v{B<Y3>r9XB)w|;dS2w7u*3Epmu z`u)5e2U}MYx>o}Nvw7=!cC(b+gycK=Wut>g@9u6-cPG z8J_?h4;z+Ej2kEYKk8&m4cd+dGA_`a;6T|i{Jk?0bT1N3YDK0I0IuAn)^iO<^hZDy zRi}!^BYc3RgNycTWULUpr=I-jPORD--+&q$zyo&tKxyitNQ+39I~6f;znWqJk#=xt z9DPdmblfvit~;nW4@*BdY=a@^KRU(92tkO49Xm3cf9OtZ@P94IHn0%h7s1pSD@^yt z)pqb#6<(Az|3A{0(65_3&OczBAk4An0hvS<^OJZ;Q{zf@a8UPYOuENM(^E&PJ6-16 z3p0c~_BPAinS6fLpfB1TKF&5AULNe*XZw)}d76H<{n%#S{IXTza`1WJ($s(XTY;Wj zu8{k7Vp%*Iqu*hpaZVHpHp0k*I@uImpUzmApU$Z5rQV+ZD_@uMho548b=<|KXZ)7# z0a3Z+-64mi@8Gu-c}i~nmLGlh8$a|>IAQjU4U7ec0OD1@M;m6#8po}cK@LV+ZrNWW z>6a@9AZ4n4*B_~ZLSm9K<`<*O7*(JFeV-&cnAYudQgNp%Vs7Nq_K)rMa1>BA>whys zet}|4X}8_`ap!r5FC1)j+q(WoefhNC)(lE1`|YG$L9~O?dzDa0UF&^1$)xev&!ER5 zc7s8jP^7yT$w72!%2HhCqAgoVb3xyIt4E`npilDS$I|JN?eeM>Jc7+>ONX;CvCv^p zYPIIiCntHU)@=UC^K;zsXA8yW%La;Llzu#l_HOslUjOZ_zL&K|{cj4d$2lA`TAlYB z9r=DRPI4rmohU`+*rQ2R?SMy&2DJ3UgHz7+oQs~xGI43J?pvLHFYoPF6IYu) z^^|{3T!zrZoNRHFKdxdDe78NUz^K3btBhCsrxh$nTJ^_{3XUARi3IP-#rrDZ%K3}e zodJV%6%4}^!OYD<3*E$0C8EHwH&jy5oXa<9$$fHG(X!&Dijuq)!;@=iT-AP_b1Y^T z+5Wml1@KJpf#@cI!?*j*`9%Gu`CBs}30Qgr)1?+Xa|;QvgVpmdcGa1!EGwUPJ`ljH1JR1p=BV??ljs! z{D0LQj=48JRX_czjFi*PK$1N__nikh+dfd1ppbJvmuZ>DW;`!#ndi42p;8hPu&JP1dtRy2elfDL%}*ds&(8^;y&- z_ZmlVpXk=+Vgnc>kQzC(*USV!gQ(oXUNUnE6WGAX|G1sbRN)cB#VCTbh8z`G`?q1Q29B7PD8W5(rRqwbBN6!7S-%tbv1qH4C=*v50nXEaZBP zCX!dxZ*KgT&jPR8J-%;`{4Hi1ZT2sMqbK!xtu`PuVbqQ9TM`kAhNXSg#YVe7r|YS+ zzu#w&LHgx#k>qG`JbQK`7~5!N8!YKL@87d46rqw_Zy&DoN#d1`yUF@bdytrHGM&Y+ z%i#my9ll*Jht6fl#dY_z)sF1_#W)i7aF%`ERQ<-6K6$a!*^0IsJ}u1Y(2Yr$H0uEt zAyyJ1-sX5vwZ!nfhPO`MQUE-!yw&*MZ_s*k-nZRb7doBAZNF4i`nF~tp48v()J_bT zY!!zPIi!;(NuKfwu~w1M#cGva-hZmso8}Jqg{+{3VO7OAOMSA|V7)M* zQH^4|{a4@UywQ7dOQ)qly|>5hO?shB=lsYf!+BKlwz*bwG*qRz?hMkOOnr7mE&sl z;R)fGw{_cXfq+D21YI6=_BW&l&jOhqWeqq2voe!@*7kMz2xQegHu@_2I%!!$^V(KL zI-V9HXgSWmi%AV*CONDJi;bBI7E#?RiLd*_0~mZP3QCFWa#YU+x)~^T+;@_U^M&>z#%XoVyph^+@Oo0AyGEbcL*=f;iBL~kF2ljknQZ><%vMnxS(tJ zx3{P|<4p6nx>7OQh?5mSmdw>YZaUAPT%g)FKm7%peJlv(ZxL<*#kMpAT>ra=NE(vu zD)Y%)H=F(EaGS69c|(x0-1CCV7lr>i0CZN*UX%Qfo({tbe1E?amLBF)&s_SYlk(4P z^K`wwBUNo>+^ojLzpPDZPxw$M}#b0c8C}wjD3m@$NO*hyB zWPyUWFrY?!qYd`RsiT_Zipj8)-Tl&%hG?Z#Jp9r7{BPBbk^uB?(j!8DY0iJtRQ5H_ zM}BUCKghw}UrPJ*=I_MJn^o|3;v>I2O@Z~%UY8xCmrBelSHI6Po2cmnc{<`bFVMhe zfw#s$k}Ptt)&C9tL&r+RK#J4;pYV_FwTmf^KLStZA5Ys)VTO-Fd)K620>4mnAFl;- z{7zY1UT)uAAO?i#<#;>#8K0DeA8^z4om9HqV6R#=Z4HcgasGFs^Jc3K90a&fZ13RE zI0LFt`5nJNH@IW3$)Nr7^c$gM5r|ElP=n~J?^_Qz4)_ot@*2ZVhw1$M$mj7g^ctt5 z$@A#{1f}gWTdkMmCStf61yi3VUr*7K%)J%*8^KRD(^y!h{d+%p0XHR>Iv3wi8u&So z9M%4-C?Qc-`-Ji*&QQ80x5%NEK=ptG(eqBg3?RS#Is3=+JVKL#u4v$J+bx`Qn}Vo`znx7zQ; zalEV=c;IAzAwCzMUfLcTFrF`=M@ZUv_jCK-y3PmNE67YI+SokC8iXEKKbHM? z+H96=PTIFW5A)tKZ9QFwdgu&ctYWU9!%!wI^D&S7G4Hs{Xn)jX>`xE;U^r!<-!^K$ zxIfgT*9QZ;PVf6NeG+o>-(!O{Bl-VafVsfd*4Fy>hacgs!Y*fR_H{0lj zuGi8V6kP%sjy?RZ`D%Yq?N$)F!2hG!vy2$*k> zD4{^eGj*It6Q$lpWjp%&1}=Q_!|eOVr>fEdn96JHa|l6`Y;_(aI6V1_59R1M_%#a# zm4WhNuPa*67JGS<$b}?{WNDg)(-AQC3m<0;ftDdlFJxaA>zdxaN{!Ut6(M!`i2HQ@fxPS#H3%+jXyRWVN zP_bUBIS3T9p+Scnz5#50X-IsV%6Hs0P%q4Y7opdQO|PEY*}nZ|p_u<04VOHB#$V8L z&)$7gL+C_&z+*T1By_h?BfnYiCZSM z|5z&)Sp1kWh%T&9YlM|M(b^c?bTOj{W&obn+wiK1L(boj>KWhogn<)nFf8%OSJH;5 z_%xU%t$PRazq6P z#3fH2tgeJv<6E9EP`qmLLQ;T&sY#)X)3DI>Gw2r4j*e>njqILi*(eh;adb^6T~r=trO z>gC98?9@>-{etnZ4^hRcD%_N*QH+Esx+UgX*dyY0)$}307Rj7O{Ppj&x}H*}(xoD~ z_lg)(3djvx-xsws4WoD-+^q6%niO9T9PqwNib#`bobTg!m&8u%Ho<>o7CH@$j+*J} z-1A!uIiR+y8o`zI%j_jyH6;XWA5jO~>JHYS(Rm{2XE6>-g(9V!AK=q3Q#x3QNF-5e zd=6NGk%f>^?6REB^|&T9Es^}^y%8z~9-ZOrM0K?NtniNOHUC}W9ehBeKLQ65{vhsR zzDT&jsidJF3(*=M+rXu}hu9R^=8YV`p?HR0%zMMON%tUoS z&_4^&q-heIoS}w%{N0|*qkLVL3+)#O&AR-Y&IK(a`F@`-Ts)5(P38>6>DiZLCf@NK z*9_W})K&H5@=5B(mqktBMs}2`U=+Rqv{G6BsAen^frv|*a8(v8j85C3KeY+7n^iUUeTAe4HSm%(Dr&YBzOIGRSx@oDt$ zOiLiN$DZI;0l_E6OrU3}BO5UhKUtd!jmw;Jnp6qc*`}M+k-oK0k*khag+z5kw8%vv zn6(TagG(^KY5|pEkTZ(x`?agFelZ6BCqeIyGkolWwceb8lObD;GpYA01L+k%*OB9g zAKG0HqaFpIzTCiIMV9Se18ZtqG_} z36p~S-L0-=s?Tj-g8xr_{gz+6W5?iFFSUN+g$EE_()=w`T7W|+qG<-i(*x2%tvJj= z6~P7UsB_>}#8@M-LFq`z7g30Z!XV1YmDXjP)DleQUE5O}1j-MGasy>-`N7SrJ zeHANlWT|?cDl0;)Ia{7N-TeA(^J98PG#Pl#(Sf$)ym4 z-Y$&s1IRHcqFkm4qGBfqH0n+-8}^IbnML-M5mCdb_%I+r8;HBMr=?RtgyZ5I{)e=+ zF&uftHx|m+giBW`mpgY_XH<&oRdQN#%FgB;KLsEWwwZ;DE$j28XylsOsN!!8!|qzp z3V(7%2T76c>W*cd7|DcK67TckV6m1C>ty}#&uVrj<9k4_b`d!H)>J5_*e}Sx2yec= z%)&|{H-qBna-%>4!h*#F4P3M8gVD1Aiy2M>ac)o-XkG_#Y_{P)q3F*X9{{O~{GNV+ zvGYl@w;1EE`?Wr|;)r8jzNE<;#vo(HjlhIzTS$$=9}gmwbRR~Nj?hJ1tAaj zWZoOag*I)pE{Dz+n#WAujF;)l%$2lilE2)~`deHdm0}kT-$*WAjQyYhCVX z$xJ2`{zn>>B!5F-E+WvjQEpijTC}j`P#0UX;Wn@a@~lq*(oq{nZNa%E^BI2tr0t!} zooRtDD(KO!$k@8a$C3r2-}W}_P^$pdY5M0%aXTB$vGYQkii&D>&TOKeDibXN3Cocy zWVMG{Fy{?_Cs49)BpiSEIQ);5CAV28$`ZuZBY;v!IQ=iLQA<}hIwI~L@R1MZjQp$# zSzW6#%BF)fg|n8Q^?%f}ksuFKkU`84lSpdx;KhcwC2Gyf9)_pjZPsA6*)UpFK8f>= zSSbezx$Z3$FGJyet|VHP*!x^QwM#gwS>3YKH`gsu<}F|vUL%x$7gi7#5&9) zIfHnN7yWLFp9AR8x8L2-4WO}6Rc$%smwj8$B}>a>81vcXrK(#J6MXUq69iL*z_g91 z2&ZmR;U~M@lfCFJ0un3>Dk>+C-nhTB5J<(K(9UL+{wZ_FYR!B(5ZU^rLR0XY7CAz* zL2UfFu8J;h0Oq@loyTQT371VhF1j@q8bWAi{ri0lcUY|T`tKX(F|QH+yOe5j<SX#Z$CCa?0>etz`|kwQGNklp^bE zF2c`SDMp%+&3Xz*zEB?kCO9s~Y3?$bC4>~Q<6+ERz$LiV>s_U1~0b0#wdya>^ehr zb`Vx@KL`9Dm0djOhMyv}#VX~^IS_Vj7B2S7@wNfA9on3B!qnn6I}SclnLcd^WO}bt zdR>YCO9)tZF&ZPgsR!){72=8MVfrX#Dl+uq%?dBdK*CoC zJ*aV7^I=bje6ytj1}3%q=gd=vrl>zG~a16tR(G8V*ANDo9*xY7H5-n+=I z+!PKDQNV35a{qQ(J1Vm=RVa2mr~{r-m+O8E2PCz~F)!z^{yn9iH`!E`v9qqxqF8FG zVfek1E!W(Li{V-k9WGa#SKJl_oV1pg$&k+eN!g;3+MFYf%Wamh2uO#m zG1yXb{v}k&bjEJWQ{A?holvd7x(+-=(|T=SkqQhhhS^ZevI!QGzj~Hlj|CF3I=MVA%J>=)?}>Z$lr#BBz@B%q2^|Uylg6O3=O{gf~FQaI3{pX0qS7LUVy+>b`H1n^Uu`h<>)|~{of^wB2lwkJ(cMgq2<9H&Z!VYy z%C4XVUB5ONtOf4;ea@NTampcjzHgkig$b_j_j#yZ>2V7NaiDlV5AMUDweM5A-QNqF1&8R zFBNP}0)0;g>P7egdo}aN@1^GcDW$Qz!D$d_8m4i@&eKr4hmo9@SxNHMi>Xit+f>no z(GMv5MZoW|e+na15W}brwYBWIsi{?&9vb|p*f0wxiW3^y-n2ODRk2OtX7VCY!hS%3 zIgEtdYeuSLH6G)S{a#SuG8Wke`;OZsB|=W0y&NCNm`o!1BcgK5=h_}KT+B3D`~er> zn$#$4H(g`VK6gERC`usmZw1K}-re=$|D;9~k9P9pa3tHOAFl-91wdM(xh^-#nhDcC zDBqdrdWQ(IOQR}6+F8mYGsuZ^HfnW2jHS!IM#^wq0DU<=jH>@;J)U0lrptw0^(wIzYpdkq3g6e=yO;u?+OE^RCg$iAuvtO$98?|y9eKbUZo3X zub!l)ovaJ=;zkI^WV#zc94<%$zg@mok$oX1F~c)yLDvw#L$XJF0VrC2>`AgHQ}k3f z;;e~-D-b}GwTECn#@92Zh9b4*_%DD(gE&e{Q+XO7%jggHC(Q|~o})ajW=j%3t#CBS ziJ3-GT`1QicznmJt>o%a&=2`QR4E7Obw(RABp=8A$r*<1*mWp*xEoVVkgrQF=x@s2 zew;@b4;Fi7NvGjJEc}_8lY=eONYk4`iS`mrk(OMecae7BOO2mzy_ogF^$E;~lizDW z27|NNrZ1dQg&aY(e(6s%KCq)&BUh1YUPHn)!bdjMCgh#Dw`0MMP#|q?OHD`^>WZ>Q zGljVC@@f#Z{A+2JLy7TC&pu}kPtB-gpW5cg*o48?A+Av^r?5ptLaabVqqwSyK8f<4 zNiqcO@ziolQ$j-G8daRK$onS>#p3cZg$eUjg5DoWM63(71v926{RR7LxjV)On}t&a zsxT{%2Z)YOtH+$M;oDP}>2~xzE&P8_HHg<-=FiC%R=2(Bx1lQ@R`pOOTGmqwTUN?>+v#mMhs}gU=R4|y00HB`*u8h?<33sbUqCdC$zV0r)uO<_> zq)p$YC0<9v5c3ZlD4(DX)Jmu2^gGe0fv-_jGv;8r64W}Jv>U%sxnt>)u>K>4&o(s8_bJYl}%Avs_V;&_#D#B>zQ%@CU-lvDfP9|Y7ck|nitB3 zQ+}EpW&K(4(UO&0%n>jHkVmwXU3s$#!=~pNE(hMPVou^#AIDO_N!VmRN)Fmc>*Unf z8`~Rt4El1lQLZ@EDaaTJzUBjG;|$0UUd&%PZ=)ex;pM{$0r55x#3L%NMo=sLr;b*m zF5cSf5n5HQVNp!|oPl5w$NRZbu>>7ggit?AkkZk7B)$%jLqMfkMJ;v6{;g6&Z&@%C zPu+aqyJ}{G@1|iDEP963sW~@hL{>|GHSquO^_DSl{ZZTQAf>pwQ;NGg6nA$o?(XhZ zthl>7WpH=0XW-2LdEPfUA5P9BBoi{3Ewk5euf5iF-%A3+&fHMVQVJo)t5;n0 zxWuG@Byvp_RyJnlXvtTwt`t1`afbUs?M?E4J;eAE^u%|tpEP|w%^L1Fd{U+W=4`^! zJ{sIMnyc#C-@#ZY_vb$Y!vGLcEc02+a3f~N(GQ6 z2EQUl(?<_kekDs$5pn&quDi+%t2qq^y%{@v48xoV#Wc(L(EdPh+5HJoQNY{@w8rWW zDqW&frl9QQP~?ny>i{b4VbOIKU-)f>BYEtUS=o+$(AbUef_n&>)mk@RQ@+YPA)c|h z7#2BEvy{C<(ZMq|hXDp`Jz$zE$LaKQEdFq5^2+mGxlA^GzWEyfKZ%OOY#hZU&XRDp zP9w+)fb>&j>}OOtxxPL}ymQPbA8le<U@2}N{eevtNv&*%JnexjNe@R)(kkl7JWIMP?yKW^}FDm=E!(*TFP9QXg40i6BMa2T2A?Pp_DIqA%j z;BB_I9)*2y)x`>Wes(c^oM_{h?I5iv))I4pwHvw)my%E$O*XO)I0;upt0qqx@dCHA z#Wz?!-akEc`s z)whGc7gz!Q7tE$l%Pkr}&&}%!d}o}=VX>Qke#-NjcP(dQp8&UW-Jt#tWxX<)tIcMC zy?`nG1nh|Qw3*G0FN?!tsh&wmJ96d$aG#EnA5Nz~J{QHyWpID|538makj-fY=_4(r zh9C}}|5=&A_8$k_+c8aI|9rp!KHOK=!+VeL?k#YGEjSrJAYXfd5gaYv`7~4sOu1Nmdnnf(``(gHp>M$b7`qB8d{a8n9@zEDBf9!TK?{%D2Hv{sten?l2 zaI?H>IN0iVsgQ`QNKTormd1E8hZ#ovli#|f3iVz@aIsE&zV(I0;&4|8yY6pm<&&9- zBytv?$tn2s3*GHwoX)2U0L>pK!3#8kx;$*#Zkpdnyw}k}#=q8%v|TVFVp z(!f_SXi0ugqKD0AJvqSvrMr1Xy>C!ipccHz2_Jn{_rZF_QhBeBHH%Cxhs$v%!lTqI zd)%i>zW;D|>tkI`swT6isGW23rzUwa5rbsbFjRf^{`Undc8iFV0e{Z3hPm=da_d|2 zIwrS+0l`XLbE<7xS_xVg^f&zYN;PWh{+6Ugj`03jTGyL1XioPAGh7bC;M#Gq7&$lw z+QuO5)Lc@@k)(_f_O@_S6gsLRl2BB=gWFLDV}Sw;cI} z#{Ip?FF7)gun<>v0mo?Hq+wpA_={Acaloh-C^lc3^=$E3fP)%uzvxfJ`CSEptelZi zzB$1nWwx!|FfBp;i2IO4F?i^bcWDS~hk{wyn+x2C6F!G^^2C9q0h%B2+S{*NP5gfW z?vmuLJve`G^*V&9OK3aa7EyMgqP%Hmi?K%RUt=8-8sJrR7`0KeS~3v!orOo()paB= zWac+fJsg>^;UkC6p&KKEP>_%Pr`NzUddej2Kr`z$_t55 zg;L%f^zmkffWu(zGb>C*{0Veg!T{4npqZ7Atxj#=lcF9OV7Lje%5>CYWaN0w`JHRFjGMmO7>_5!+J$A{&!>^tsi zKmB{E2MR8pUgqMD7ZfB(KnIXvKcL(lnns>a;S~8F?q87z6nHdy?>nx{{a6VA zwH>8b+7{XVBRQa+w~rn$0t43nJZAIM=rr*k zh|v)nrX4(h#};xokOSm0m_JU01o^-%*YgE%mgKQQ)FQ-v-NGi6vGv#s74SAH3da6? zE*`i5`IVK{_s4$>eQyqOT6Wx@KqxU_i~#g>|GDw`ruj!J#;9N|=Kq&~1}G^;z@Bm0 zf=`1afYq#@TY}V#EdPHoXDqNw#FX}OAfPw+i=i8LgX-C`j|{^vz>l=)kr+ab*SV2^ z0J*ZF&yVqm+S>o!dknxcHnLfgKCZdMUJk*IE6D9h=>EDtEPA~~$aJAp9`Ttnx}Da70p%RPPZxnot{nYB5~G-=1H* z#!)VF^q6~6h9ZB>=u5bmti!~ZI7Kklw9ILC4x6sc+jl0lC4)EfgZU+y>IadMR!3oD zl@mm5#qm@60AkdA%_ZjzaQ&xMq>V^LIB0%;@_bn5BW6fZLi+FV=Ja z*cACLPN)Jr2AWoqBLlm^Hr?`>=e#C|)!i#Qt#%vDdW;@_A>N>R8_Xt%ef~XtCG!07 zDdd|opwqKE!zMq~dU%K2L|li>dciG7dO4*7{H z{};?|A0Pd{*lk9Lt+Ri*b)chI6e>lSz^^1;uJ7r}?4`TPS)6uYc%0SibdkjW+328B z-O#tKx3n7Yua%BVKj0!d!0RAq?h5k1Bl~!%TVdp`>yWkl_HQs=Q0Jou3&6ZPfI`5r zZndKCVK>+La>`-zPZu|R9JGAWV1N@(DB!(1>H+vWq-h`kPLREy+KWH^P8X^H`6O^5 z*Z)gzlSGTZThFc7s=sOzLj{VYRyh4TK^s~fYrFqnaGM*DA?UIU=HC7EMf{jK#Hm>R zFAHEwmnpL?4$hwb7k9t&3cMaWZ?ku1TIw(X{9L;|u%*?Z$>MS_X!Cvm^X`lEtjUrL z?=zOJ$!<3C!zW1V;Wop;VLCyVFK90`bwf4;S22)*IEJ7z8mhd-w|RqK&BCfQib2QI zX;NA}_FJl#u=T4BoZw+WTDSgwEYOXeaT_*uUDGG-%izV2vHkp)ypZj>TbjNQ{-^(y ztd9V>9AU_gx6N_=ZphBL`yn0_G4ZNr*|4VG`a~8O1M)kpDD%dMNC-^L!PG&ghKWcP z<39>#=E&EB3OhAko>=GRyfF*qU}4l-+cN7O`%RvsCA(q#L;Fn`Z3dkv2wjJd)3=2& zt{}7qyK_0RQGYpfX5n@=&ud`)vCQORo#R=UI+i~5$WL) zTcnMs%jv#bnTQZ(IW{*9TCz3#D6|fO87qjky5qKO*5=BkD$aGQjpE0g2!pD;p{g0` z`OBKVGQ(b4@(9}~>D~MHGn72jjEkQ3fnMq4-ZblN=wEiwwq8lci2)UZ8aj#U{?7y^ zx3}SG8D$vYIdD5b`0pE@LqMc;AEG-AnJXrzjS2&mtvxiX67sZy4#?PQ;enV{4G|R$ zmfMReZ>FP|ZC4VpKVIRmuGev9yNMvO%{T6M_M)#VIa~`j`41)HzTi>H+1=iJ7?I3o z$JcEjXMw{AzidU5*6Y9a3Dfv8S>+&RxLAqI=oA;rm(ta(e&<5+A0c2#6tiTW^+D z^xO`7iX`N6S=}zn@?weE+`-XYU_SWc|AUQhCjqnZ2K3nA@r>|*MkMy_HkRr+?Q-Wz zw*g|69wdmLpP)xSpJV1%#}6Ds!udnx}e6^|F?s2(-Ce4yVUuS}C5^B0D+ zd^@cwlYBx5oeT3dTW;|0gc|Vg@AgOgPWKz5)^p0+8aPD!4-^P}F8@d}JJEmO0|e8V z`?9!o&YR5{xSUoQjnM-0H-+a#pzc;N%tz$%EgaD*zf;OwOS?5>>) zN}%_PNK5N{Bfhi2!dv5F*M(d3iaZhh2i1x44+eGuQ_>1KJU38EQD1B`?fOf?;00Wh zAuZU_8RJg#hL|Wkrc_)?3O#(R&ORB;z zW?IC+lv8tYjlgHUu%Z~4k2cI0yv77-{JdCq1B-ZsKO;#YZC6oIQDZAB0fDG0DKk)f z*KDZn%CkKnjqu$ByU3SBybc;{t zzW&%OP9m>CH2rwK%aopvi_kpK`P)^`=lPviGD;1@qB9&ld{89UqT`G)tnclOq%OP7 z$DrzrFVNNMkJ4Me%Zx}|pkaNONYL=6!5JJEKV)D^m4@4ylkky34lkIN?^vN&0X1BC z;TYHs2}@>oZgMXCFI+FEf?gEn9~CB7s)A!AlezCaXJO2{?**4piD>>saDwx$>xtNj zCSCSeIW3Elktp~6i6Xj@Kr8=eJ8t9+H!Ga8n~+VKz)3dcVyWOp*x6};0`H8&5D#9T zP_ANOgPly4p;5g$n+s-cV?+n|vk<7NN?KfRCJ-w@KP)tni;i;A`~#;yP^m>~0&xOa zp`)$#XVPM+*L$+$kmpZ=TwAI)%o<&*Vr0hI7~U~f0zC2+nk0eIfaWpxMB?=Nr&C^Q z)PLx3ka@-o*my_%cR>TS*@qloQ|dTV>fB3A|EQzgxbTl6As^6juclVnZvC^S=ti?F zC+&&F*llgiF{KEG++X2H2+EwH2wPiBjtD)L(kjLiYn|G53J#e8RDKld$jwo0i+=74 z6}J3ha$K=zc7Q|_WIhS|p{;(MjN~K@WyFnTo2=%@Qew&e+eMVc)3~TVoAYNjUSUSk z;Tbhppz>$NHF4BHWOR4p3j##`&2+4x4``|koP4PUcs_#j`lsDu>2sR(Bt=0ufWou( zimzY~_z~w|LX%#nv9-C`y$AFt08WV@{^C&OAp*dddHzTqn2Ur4fW>TJtP-6apZMgj z!P(|THCvUh#9lrWO1@%?{RRv`kE(IuVXbp!qsfjgV#n!h>OVEzxQ&0C<;{wW53<$9 zbk9KA03+YkX1m*24gpv5nA#t$Yypc)rx7CL_d+19sf4f2 z{G;0$dDXLJ-1Kr)>+_$^7U^DO%`>Cl7nA&bM$94mzhQP==SoZFump08(e8R9l zp+u{^h6s2zADbUoZz(g}AaNe$l1&SSgjbZMQHlUZ(#Ui}WfvZi_7#~C{k_C~N>v43 zjGS86j}SQ68m2mx+<>48%zqUW{=#icvSgtdLUPYW6NkgG9xA5tdG2qI>+z)udsDEe z72Sd5>%%R-i0YJhg8Lfq!ux-o(&?dmVRJ(CK8>Fdco;d#^?y{vppw^V_T`Cn`Nikt zDlnbHtx^5FQz&legE12H70}D1zzeq-Wnz~d72^4+LLN46mgagfYHUc2#+(rqV!AgjAl~?p=e)%+yOyrJchl$J)xpXu2^!{TDJa5 zV_rkb&|x&lkh^}EI_P&W!DtgF#UFd}!s)IunfksMTVe$W@USQ~bq;W~%el@0d7Ccs z)&{064RszZyxYHCYDY9OFc8cK|IwN}$jRPg{+hRC)w^@{&AwcS%M%ptIKa|EF{)@@0q4Torgj6fdR^i#`WGhdA`S*@Lyr7I|)m z*Dc%GoPOSD-JyY4Zz0pTxw)ghOY)K%`Jgm8%rPNhw2r z5#Co8QBE#3E~tu^ghTa~B2E4t`27bhd_jwn2;d83Vz0wfCwMH@Ur zRSy77n0&q;Nf6ir066;IZS=SO(M(-j0UxZgOrVwt#thJ+s>8I;T_W8_zk&DJR10JG zJA6xmrh(r>E#Fn+9L&H~=S8YTUcd*iD&X)ci7KA|PIGRFYdifZ4@KyG5M5U9eFWjC z^Yt_dEYQm7^pl-?xLJb2r5)@PPwfO&g6ib38zQ-@bx&-|wbD7gvT}7fnpnH!tcM1}Bv^62b*9 zJct8nN0V!|3$a%@%ms6ngaMn1Y1-yiUJvVM_Nzx7K5<=l(_o%?CEnjt3^;e)*0{yF zqvI5YMV!HD_woMZv1zX>=KH#4F`>rOkHFOR{7~m0_>t?g^Z6I_5&ss#3>_$>@4Qw) zmGgX<<*@B{xkIK&uOY< z+t=mejf7sSb#`4A8qn*$(~t#GiTC;PgA*_mUFlob3{m-(G~{BKR}lZ184&VlEQ2BFp4|ds22V7_?auUH6Qj?^da}@o=C^88cin&|D*~CCH~@ z%P&>Cx@nFg@3eaO*BHL~=j=d`EsciHfh_e`lH{n)68^gmpt`5cFFYmgp7WT?N2MLw zH8LKiPc6Dh&au+PMI5hTSFt60KYfrz-yTIwHeqi(glYo~c;3K8nIlf}}HUbrW< zO+MI;185>zST8#vrn?sl+xPszp(SnX?eAtWa^?zZLf1$ugu4wt#(sqsGvDI+vz|HF z#NDzLMtBt?x(t8mzy%wDHZvA#4pSQgm2&M8m*ru9{1z%2Y)rYXqGH3kNIP!nN31By zHw#)3ytmvDhJ+5Z+;ag^;0K=^AEuuX9`EVTK=$&xL#c?U*=i%mOu8| zKFDuGE~60&4?;z;(eBG0A4TNU=;FkZK$^03q7BD|f%x_-)FUa=n=juj+x2u*NZi0H zj}6!Le7ss&WQ*_oc%G9aA@X>SQWUzI)Lhnn^YOWAT4?d8*I##vxFADtIqYos?2Fj` z{JWE;@1B9gg)12F@dm!Yes`|#>;w#J_jtb?@EC5mCS6@TY%y?t;@8>KU0JtZc0X-@ zAz^$zT-Kc%Bx>2QAEQWnA8?rIIBB;j3Wy-O^~*F$%kl6xJzca&a#5g3HSo3qc!F&m z*laM3PGe4F8JhM%DEzR1C!y=VRDw5Ac+OuNL1~g{2KOUtz*0p*A!LAk>tQAM{f;lF z{CGVA0h`cqv_Mhl?fm5^Ti~#CPLjx}wTFd1j_;xf@AISagzcb2 zma*sG6^fAWhJ4Y;mivSx0#5hsY1RF_XsYbhOu*;HhJ(kFVI8i|nf%VSe@9U~-^UP+ z;W+z%%E6-ek->EbR+{1NHs8p!uj#mbM@%Go9f{wbbXm-%eU_blxBsFcW7l)m&gy9t zmAS>~E%3KQGL06S#E$O-MVjGFQjtG5cn^2hPBw&uPLfAHZWJYmxkSq$J(>??9YM!g zt+X35L&JPJm?%7@-*SEWt~B)gUwp0z`R;bdIxZSq7VWzP>SF$4??J3)-Of)G)Bn$B z-uG{xwt3tS$&)-b%q-Gwpg(<qrN#(fjkHDPHHpY@i3jELk%d~In?(~43 zyvW^sxeW@G%Mw?Kv9r_oV|F|4zdy;zl937pCHGxYj5mU%6}0NfOv@8<<`PCR;q+*fBjaBRYOn{#C7{!yo_1j?yF$_8Do){}8JhQ|*?|G1z zL+wcZbg+#2vCGhR;AZ8I9fR^b!mncR9s1uUB;@0g^LRCQwbO&O?Ow2hi6yXTYq6ux zTWZ9jaZ{J|wphNY)7m>;>5R=LVdnDRbbJ2uyrJ0L#RZnU+N3d{BYi%XFPzfd`V_7I z+$`P7S%6Uu?(qdC*X%U-(WROGdd21vbmzU@zX-VS%AHfN1+@%7{OlJ_b6x)(gakxs zP;I)l7h%t`u&6HHY5V#Zd}rk581E*y*D0VfrqFW2aaVs@s3?;@0B4IKU}qJXQPV;+ zOG!1eY(AlF8|-T7BqeGcQ6q^i`rwl{`0Mb#`dBHN+)l~1b8n%xPh~m5kgn=rOs~FP zpm!^lJ7Zm>8g{jmA=~YQR?R4P_~){YHEBVuZag4x)s})v5C@rY&oEW&mRY)w6qb2V z0!W6BR6>;HzyS>nFqr|GxR2}6IYvc_ELI0Q6?$+&FEBtthZ~`We!FpQI9HhC3oatK z8B=5&Dg6rS^SL`(Df76O=VEF(XU+Rq{B^hOJ3;kXzZ9;2-GQL}*tTSiWEjvz9?#ou zO`z@ig2+W}1Y_~h(u>=FD}Jo4y>J$1>z*QGr__@?Tot?zV-C5W{8LXn+H{Cm zO>hKQpz-BsUk?Lpvi_Gy#~0|q>pev;FS(vQ(Yt+_EUtkh#i3d74Ji32u}$2LVM}$! z4afbgbe7MUZRjV{bRqE+-nUM+pQkXe0h^>@7EY^{MA`pi6ve3a@r z-kS`(9=f4;Spk((%ed0B!;{F>!jDPad$;dH0Hr8Ay5WO{JokmC1x4-7+2F}uU&Glm zkpeAAToaTP1#o${W4_04SvF?&wwS2BYBs9iNEGJtC^JchnJ0&tE*&RKRj$Z}g=Mfz zyrM3ALli+2O-Ov46gWkj-HME$+#V?fuc|IPYko7Y_u)pKCs+XwGeSO(Nk9vsF@w{q zE0XT9l~q}epR@6MlQWdFOs=b$g($krl*l$K+!iZ4G$5?ktG}>MBzBm&Y)Jr&AYToQG`(Y9Shkp?rr&E2}F-gBgZK%o*Y> zI3{ACE)&We18CqrZ^ngkmPe0(y3Ulol!5~5r_|ixiZA`dtl11|m>0EiySma(c-kDo z_GVuixGl%`$$fyzFl|vTd*SH^=4{7HghUg{I7Gi3?}kS)KjGGzrC7RIYa~HAB~A30 z>$bXQ_`t;SX6HL>7D}UhyFLjq)LC0ff;VOpOge}a`o?Tat4%Tb4x4XT;Jz7g3HNjja8vJR3NEDX0%eCmJ9`m-C|G`B@s6m zdP;}0DxnGTAa6AhvSzs&8KfskRo=&vW&ePrFG}WMY1g*=5Ht`-Tq*vtZAlb zm}3v}WD)T~j5{Tx|NWN>^QXjd+McaV5^76zy|hToV(i)*ZL5&EJD+`d(Gd ztZr#0jcP{|EsPr;Bz3DZJqvvdj)*A9QiY2~xUIk-c5Y)a zHsCH}<-REp%Sk11AwM}HPl|zy#GH53jC{ONXGp<$Y`+X;&lDRo(<`CxJAaA4?1`d! zp%V^1;n7&?IrUmt{ZnOn#6vJ` z3%kJma%+k`Nv}%+b>IneFl$r#rgdyiEUppG%1lz!22`)br%#lR{n!&W;u8SrVN6Z& zlBo)2jbwv)`K5-(=NK3-2KKb55V)|B89A#`xpk3uUD+n=U|`eA4ekudm#^4ax+fO# zmqa6nU(T-Rm&0?Dc0CYQOz5fvOeT@gt%@+IVl?uKzc-??EZnr?Ad7QSQU%Pp#`Unf z9MVs0u7ubFEzpE<+5}GZPoie>Nlx-v=9=r)ofR+rB*dK0!(TeIARyH}>Ze(dgHyfO zRR1;9K6uLTryuAeNG0YD@SBw6WLoHh&C)R;Lr4)tdA{+kT7XZ#!2N7U(z?ot<`=J0 zYO|vTNpnqwM&DGc~+^Zv|;6wnknkCvrsbMa6P zRju{uKDd^eIxRZPJFI=s8vUW8Vc=$EUdPmRq| zn(HjlpUAAjh^Kv4*%@*Mf$m8zPggwDgFAc{9Q+nE8NLIyZ^B6^h(>H5+MSD}lkgp|97 zJtl^s8NXb;nDRm+G_@!GOcx?i%^z~~M|9>8BK?MPx(}st5Xtp$aAsdLIUZ%IBKt&c zqsWO=5L`-yVdf37I8$!3)Z$=CSX0=ssKdcIeu(@iZKdpHUa}aC4>jXBeo_Q|z~Y&; za+)jOyngV9CiZpMci5=kDZa^qPLMOJDo<~=QuQM$YOVO#(oEIPzxjX$g@h-A(DhFh z5f!lVSB301%^40MO|uYP|36=~+&t$^G|GEnYVvqXr6ZtSQfEVLMwjH@M}j)Z!+9RD zu_;Q{LRa;E5$D;_nEfRVB9k85fL+VZEyxpRg-a|fpVv$3(6#fXE~{Tu4_sja(QB6r z#2qnM)uE1SG5|XWjte8zA!GQ=7a*j+TPPRx5c8uncKmi{mIWKUn_(Q8`yf=a%m3p` zgKjR`=spxbK(G+9S}G?>ulfkGa-%Gq&dz?`1nhmSV$E8)uk5^`7W5+LbuXH;mO!~a zhLwGRm5&(O5fS>aW==xsD_Sb$Vt1vYtV}q-L z5^km2x~y*E=b>#9fla%H&8LILx#d)n&6RwYOhy#qA~5D?HaYQV%)b*zT1P@At011{ zqMW@<4sTeeM^jAGqqu4F z{$spfT&XhL*17hLd($kk$qzYO0Yu7Y_O{wnZ+$blmLMc{j#f5I$2xI*9!B8bYdfaB zdhoGks1_<)zWX2hh(eBGC z)10anPgWj$B8L?jWF9;5nKq9PyfjJ>9%jDaLP*6wgf)%`<9tkkUQ<)<3+XQb$T7NJnBvTr7Ak zhCP5&$H`&xtP(7ZgWXb)C@C%PhE}+vP{De|+|rvmVx+?|JA72CL3CX#Z?|3}66eSkRdM08~zP7;dE$tYlp^m_IRBR&{ z-K9BPCNIJanOkt4TA;A0rJX2cg{o8(s{O7GL63F>h zNGxVd8yXrhgc)(*f70zxON%DVv`u2(Kq|hLW9_T4-?d0Z*4nR`N^M@+mrzM&U$*c| zyBJUx=)lIpr{V`ktocXKn%YbJK1-2PQF$!j1&ZbHW~)rF>VKAO)B+?I5i+cc>{?g- zlw(c`&(TSbPKhQ#;}LtQZe9sZdw9%jyH|+W@JUN>@(WSOB%tT|e^~$=$0V-6kWMvR zb2s{lI5h5LSpQ zx|%SbOh$>46-7sE^PRRRPN1VqZPCGM=u@gDrS(IA#au!qQXFTh4eemHAfuUx56EP` z5bE;Mlt53OZib1XfHx-&%L^L8r(VP@pDFFH%fyRWSh45(TM&c66bfG7H)*tSvr^bM zR)UQ5hK)G{oy9jwQUR?xRxSQ~in}_A#@;9UeU$wdbSV2q>ImLSJ}oJ`i$RMuimf`l zMHR7I-$?tf!=_j@L>*{YN+{+rYSyyf=0{S*7zs#WQO6-f*Vm=;*cP&@;dyQc4}&*T zB-%`;aQksgmqnOtYVc|30H`eIC;*ni*}LB}00GGM2;z34i)_vNyGZ#hePB1LD^q=* zK>w;>_BV@I=W6`56o?WhFp-akw1L>XgUK_++@iKIQlMa3N{G+PraRP^J|icKyWm%# zkkAgjfOi`r9kWJjIWfGCBiG)|DzkakxzyI%;&wE?u*^!xULp@`>XxpDkj?uOW;gTT z(SLN`NMCdNHW3qubo&Rvry>wrw_HpUJxHC?jVS07_9r$w zj^f|W_;c%0W?yf6yk{*NpIY@RxPW<+>3G{n-4XB0acK zrKop>=$Djqkiwi^*XWjB1y_`D3!|KqF)ORdS6r70KS@WnEg~ywY+qhBf;FSE)z2Vc zLIzL)^B8$;h85;mnv}-#fA?l!$--~`5Y%Af3Ie(KOkotc7CAh!zt0+I5Lm?8raHIx z4Nv~mG?FrY!2gGV5BLHb^C(CT4?!Dp6)mw184VkbOvLN6eBadbPQlRzjE*GsriR~1 zjh?Qkwv$CvoK5Ekh7(#@V%gN0P|Tqn{0dD#UkjWQ8fa|AG@OKTRwqj)!Mj=Go;dh~ zZY@2x-nCD^3#aTv)D14o2#uLuOmbi~Sw|x}q$7m@ZA9(oZ?*NKJ+r?u*&s|)m-g~!VF1yjp zmOF!$I!f0|5$QjRbu-d`qcoo;wL1AsVFHCh$^NJ}wGlCHg$Y4IL{VR25te={P%7PM zcv-f2_?w{VJEt#AxzX8e%h-g!T4XL5G4)V?>o1Y3=O1kPN;f_id4HLK&mozy-^swu z6ssb8Jij&9!x{X(pyK=8=Mis1NIp3hfsMm^-t@LvQ>tWX*;Ef7p%Iqe!g`l8eeG6& zBF%}Zrr`o;uHsYL3z>3zj^ibKHlf0C82WofHs`?|f+1tsJRC=7DEV0Xjb_Jd~v z7ME&2ixYg2PBG$QW$fXa#xTJGAkjiTNFRz{o@Y_I$hkc`-?n{vxDOf?bXgpg|7AoH zY!UCevu$=ybebun^5#4IFy$}!{^dIpfiz>u8G2hBrJ2i0F7m71t`r)ZJAyorao8NL zBOg56}rh*! zXwFHFw!aS2L#evK*px~Y*jBAJwBO$Ai0>-DHo=j{tK(($TemP1d&3_J880FwyeD9} zZkr0z?vAHpl_CuF#0Z!V>Ho6TU>rY&p>o{}tW+vuLsMoKGqjN^TKh403^;yPfhb8t zjrFt$`VqHfDKTO{__e8wN}>1{>L?AKt2*KzjM+qa02{mI+Wd{8yqXGo*SDprN~sar zf=nvQHL)u5+yr?tF5IjlamROfNmR%I)DYAkKD$O}kux=22D|+s=r-W))`o;3iQl%% z4(Q|M8RK?7gIrM;oa5yBe7szAKh%(khUI*wMEtDY%--`#fH> z5)$}00@P2=%L={!{VqRLQI_X5AkPKW8%|IiFo@z`znp2q*tD3))Wd(&(DVMV%;NFA zT|poG{dVnwP502sY2gMMLoYJeKI=4$DLtV^9b?|%e&KV3)-uz{z zNKbKRQUavh1WQd}ZN}KW=hAbQI<(6c_Rjl_3~mj2>d@*79h|NkDw|)uDlm*Ll)H5Z z^%s?ACrvmdvP^*(?JHTq?06o03~O+#cW;YQj%jikI%Z*Hm0CD+o$KoK-_J*q);KCM zAnuJ75(Jrr1Siir}_G6W3SlF-e2{m`L}B`*n+)D|F^%dQX!TDw~GhSlXv9IbSu zz^_Gz6hRCIFc*-GgGjqupmavqX81dn+s{ylcwPTJI}M9(dKMv##1MHr@*LT5`+|D( z{ZESDNYYtcumS%yhDJ!8k7BHFRy!usj_;-kX;7NdT0JnT{VP{SH^x zCFoJZ(bIZ5PA3WZv}w135y$7guicZ)X>xd^X$VTQ$nAFAmDG%HuayXRm=%SYyaGgT*RAy2S>tBS_7d@akLOFY-tCAwR0ZUeZL^#VSXU)ml#0B%is8d{ax{K=bs~f=j zBJwyZU=8*+x)6EICO@^J=*kqDxdbeCc~KpdFG^k=3^9o{g<5QksveR%6?KYODYgh3 zVqIH#;p~*c+4FVZyAVH4{0uYUT(h_~&XYDJ zSffntr)6b`=R&8PR*3rWGbRNf{M@jGWLw2aiKs#~)aLAL={u14Nz zAYp_9BV#q#J_PLN?UHmdP?p8MM>^KsLcy~#!J<;PHvCMMZ$Sx3El=gxfv{wmk;7aU z*-ngATzrs-;0wv;96^~3MK!_=7lxgqY^4R4ywGM}n2!#4xOTh=0Q{_O>k~{f+8#M> z-&8!odT6j*z|(R(8B7caIdp*@RTYIyQaKz}T01Ti^CY*JUpsuxyN3=9WnnEFPu7jz zF2a#?-Li;0a``+M0bmBeMrAZUj{E%I1Y?iMW)6Va<8qU(uHE}dUjkgKct4)$Y~(tR8phjcSM5Ez%Yz;f)_`9yG_C+=ByOnP;q8*ZG zObh^3h)l8R_bK^NC!_Xq$WkBU{Bp>js$YK18Or$untZ>P1SlJ9^8Q-?J}@LF!vJ%L?wysd(>5%vUw>g*_@I3)dhYzPMLXKM(Sb`yjmi&xUCI)WlkUV8AE-I7o&oVj5K7n$ApXQ%vWDR z`&@lRr&Nt^cIaI`C){Q(no!FmJ&{J*y1>OaT}T))hly3j;0#$rNK#w&&YT+kZC^q8 zz>4%c4|*^}_IrH?*r@C-0Nn%L@oaP|JMHtZ?Q@KHc+J`0KX7<6{J+qSraeC!xp6 zbIZ0rpX$2v1f$Pr-&ec#If*XB&c_ zU=ngYp3MW@r-T1+Gq}NO%jiX51hKX7F3AHa2G9%JR70A+aF^%-nv2lOv^Xo)^+ve+ zPy1t5t}G8O`RjYf%s1C$l)Ht^xO5tGs}eO!cGYL z@O)X`-~gZBMX^~_lT}@`Lak-jjKvb0zFboaZm2)m7)ajE!lBW_?j{uID9jKV?eE+em+0U%dI#nPAl-YSZi^KT+l9)E zRCx{)M3w(w+q?~ zEDiffVF&7U9`V4xkAdY8&BVv`@`l4z>)9m%5{aPi^XuCM@M%|w+cZt!aeP021~gTd zs%yUHGW~fW>v9+>{3#yLs>GhC8{J;(>O~(2YEv_vR2C9Y$o<-7StK{3zi2KNV91jj z`IaL$uGw&MQVHb3cl%9WqfCPVYg1@q?seb zeOA<@U^1iiK8xx=-BY^Qnc3VSY+#2)qxYTJk%C{xaNSDIWh`+dfl zA#Q2>hYIiGX+=W&`N>3|A$D21Yr?VF>ge@4|?HAsH~muxw8W5ey} zlX$wqy}X=}$5r!0VS@n>Jda=%r0ip(#LAwGajAYad@a2VTozKY9m|*vK;WL$g+Vvf z#baL~!J7=RKRtFbAIG^!xu9B{kR;&!W~WT9?OHKl+b_>gsBP2vtnNwO`=Kaa(7Fk; zy=TtS795{x1~)6s_ezc5osWg{uB5UP>%vpX43+ zqjm@>IVe9UyRW^nAUH2?!^GXsqjNuS?SR_K+8~eW+#TuZR}@U!Z>3QinW8af+6npY zhk_f6>_R|d51zSFC07EuZZ7J#I3cXA%FtukWH#hP&|~nb9HbhTotD@iO!rEny>@C8 z)L9dymTEM>;>D8SvC@-xk{|I8C~2O^AP#GH@ws!r2MHW)B0`2RtsETc$-4;9_=DoX{iH1U;~E z(xE|)^*?xSD&uaPWLn4}DV7tT({`1sdE2_j?_lVBJ~1--|z?Ty|weHWL%A`-5-k|5Di_K*9?8(a}@^naucO z;#9HNQd??DcA^q1s+cA!wZXgjdxFk4Xi^vu_<7{ipBq?!pYe%R^Ha7wR&~u7I=~+_>&p zha~P2N;VOrJC!N|ZGTs_^-)bC@GEPOCU4WKWuBhSXp60fvrxstk&qaD`}c)KIPyQe zknO>3bxM*HLjPQ`mQ5GJnGllH&5-$+Q|5+%@G`w z)Ww?184OQ}!=}hAltXxCHP|96EfqU16ejFKsEDpW{|{f^7*}Z<^_y$5CmWN!n{3;5 z?Oc;>+qP|cvTL#?Om>r9XV3G#=iB+6zU>d~d*2t#(8(RKWUExC&&3G2B z%_j9%)bWoFPzt?15N1w3(Q>q~9QD}e2vM68L0C`Z=BG*t9td}xkG~Xg-gN@i z709`+*RC6doVJ3$ixoq&=(SKu2tXR+z>q=!GUZSkuc)2sn2%tbf>FWXgu4t=)zWv^ zlVqS7qQ2Z$pOr*J2)Y68u#XiBQp{i;nBj`@9w}vJPf7XP9z0#fE(*ek*1?sYT6}|` z=OF`oS36lxwje@SVmy<3pD9`#pvrHHJLPP=OrDP z1(5t4thRsCbf*BRd2@#PEiBf^anC9&Y6$?Bzli`bs^07W1t{hJ5nS-fb;W*&ran?% z)m#43pD3WQF++j!ULm=0uA{bnty*@{axdg|-9439L)~g#?uL;lx8|XHF-2)eX~a9NC6>Qs&mmFU~xhrqG^hh?_32Re+>$X3q5q? zAS3~V{m&YBohZ|YD`VS|6~7Z6sBmPgE7GK^;p4VbKc{DxE2vSL6PLOdm}T5yp&Pf5 zNRdY-yR1{9C)oM&Gwh0E2_WfdVIc?G^f(xNKkRNXR-N>a%zDl0& zg#&dwUE#qJ{#z^#5bH*#xehtmcKU1A#Wu%|pACw<3|EW0$Cj6P+PyTswgw4V$fW6h z6Jy+rG{c&kT5O9Au;|5TK3&$m95KmX)KRJtTJe|@TcVahugyYXt?;rki}l>RAJTd* z%rU3(=O-BwOUG>M%y{YQv69Zm&EI4ds?}g=ojj4=IP>a+Iu&1_??d9+`TK=)5aEQa z3N#L69ALe1qkwf zLA4=I>tIYK`s;XskBkQn9wj}y(V(FibM1wc1~`l{B15=uT-qeZn1#tw>*8p67EB>T zhY1G=$em{8d>b}v%?S`Qa>LdW{;@LZ3nW{COSd#1S5J#lGMfXy&nKmvt}89XT(WO` z79egP}x<;i@jY3tL;Q)#eT+wR0Iw6Hy?K!g8-U;|IllVBU;Kn0+JHhn>65I>WQEo!2DN<_1W zluv8p7*cEchk0fEys4I%l*Od@Dokm$QB!J6jaW7gU#MzTsTyD$8wNbI0hc4^Rdx=v zur*ERYLe7-E>6GSTL?K6H7h2@H+5h&31t!VP0H5aSr#`?I3kFH36et157t!>l++?q zhc^?U>BOk1l+p9x$pu>+vLEtLJZIpio0Yj1t;5(x>=)&*gI}qq6#c1i%PG~An-T+Z z+1Mprb?}2~B&E1ZctER$5=F?VSK}lbUq*2VxV<2xOPG8lx*eNyep{)ebHG$V_`9}Y zG%$?u?{RK3NfUd$HwWdD*A!p|tLV_Fh0cvoijG23qm!c2N&czl=$(Ly2SuJe~q6{vIt)Cz-;|{JaugX>~1rxrKb21Kgg~ z)@dVUgevFB=CVhVZ*D4BOGC5%CL>-&O389Y3ufzOz z-A3VShTPRS-c^Ec{z|?PF8cGc9j#URz)XNGK;8v- z2r*<`^X)KR8WBGnX*K{5hPQdnebDcq#yWmfdAilx&M~Pb0rtfAG*e+K{y&6(qJXq~EPaTg_l)hV>P7SHihEnUu08a4 z5}V@2oY4Qp0;pMwXUJnSj>;MBIfe<{kw1In-1&Q><^Gb+SV*_DQ%=li`)))G@nc%%v4CQ-9a>)lpN5Ft6?QsI>~Un@5x8c|ekdV|{r& z_F*^gGOvu{c}%SRMR0^wJr@$^K4rSC<9sEQu?=d&=Nyjq>g##=mwV=D%KlbmHv`Bb zGK*q_D5yL@Y01~v#2a}xWEmV%;c*k+83c+*@A663NSg@CQQNR822Q1+JB$NQ!W7OD zi=IhG1T6lA3*-H(>aWSZm(lvc2Qm+;3^7sdh|1Dq&Wfi$Uny3=?90)DV;A`l#Os7P zvcBN;Pt0eY9IjT(gk5tQV{xz&|GFo0CL)XL43>7nYCvkxQpS~f7V9v=QdD&xcJ@;2z4x{7j}%_(rD!F7<<61HyN5Wa7DgowPEy3?XAD;K{XPJle5*2#uei zfxLVPvBt~!%XJz8G!=YUb~n*j*0xd2IKzA$@`TaP02dcR6kw!~HY;kE2xB^iAEg=~ z4@M2nsou(b($bo)#?E5TZQ5!PTYc`XCo`eVnZIa<|3wr>mpg_!MACK0Q!{;1=Hr|$ zZ%rJ)CCarum$r54 zAGL7FN{pJntW2Qs3d`Am(m=_Fk&&LGwDzWmz=*4-B^5?{U}%0W@xH+?)hRjZ`BBIs@UDEZ zIkGxzH;z?_xgZ%4kO!K358 zkY4Vgov2X`9Cb9;g@@-YXHm+hQ|B;EcP<`WIKUduJ#r1f2a?l@JT-QA*jhB1)oYa> zG>l(2ZzrufB<%sO2M8sb!VY>lAT7|Ex;(T4$2ZFumc8JC`{$)EZs$m!%tkX&g4l4fAQyh1=KyP51J@341i8Ox1T;$~|vx zp?BtD&=AFRj^;u&rTP;G)vOVXgGwFC{F+QfI1YA=vbN9&eYD^lgx z6u1R?t1KP%1f>`Xwu5wVDF2cD#^nVM?(wM!1^a+sZ8i(Ea4#)CsyNRWQ^=AQoG{A~ z)y7(gAoYqi`BbAUb}RrX7W`6v7`Z7sY(SK=gNO*qZqS%)PCi0$vk8n+tPtbt0ZIZAI$UrZT@=j&bIt{LWJDrv^bu`;#qU^m3`T;eey?HU|0aS>!H8WH!zZ-9A zoyxZknkoe;8kp9~5vIXgG-F+N=+TGG0iC6pT;*Mm%3ElYg;}|Bo}Aja7vw&d%9^Kk z`tio8GOL`DJgp%cp9|k0=)(Nshy{gYH)I)zE0UFR);f9LceJ7;wL_X5QUtlym-FRr z5UuPThMfUiJ7~Hxc0y6R6cI_*nakzGgA~b7oOFvz-Ns}%0Ve3yr@_z}3C5*3Z4;(> z_nsq|Xf$U(g8h#V{(upn&}}%8k@^H7P^vqLk`3X1**qHexk1G&`w zaJ+Q-eI@L84kH@IUv|etyD3(jq}HgMmX_pHykKL=NHr|$TqU>|>n0ybB1P&%V;!;7 zy~wG4o16`VSHVUT@&`kMF~WhFyO*!g`)^>K!PhxAGNCLeBj=uWlGdgS#?W3u%{p|M zMOk#Rn!+`c`)2RhWqZd(<%+q5L|)m8FB{ND_~EkJy&&4 zJSJL**p>}5uj%)1WbrJTp~b$+5YPK6=0}!i6dEu*DQDjZ1sI{#8227HW7}M`=ln)R z7*(#*7E8$o8&0UIuEAL4MvBstb8v9Q>RuA z)n1|wCz8SYo$rQ^nB)1Q<@v1=Y%k3%>f+y8b`GYD25XlN8jqUF zP;jd@96AgkY>NgI>7P|(v}^bHFhc1>UEuNOaj{`f7DBZC%$sDmzXc6e3Q`$ps>C#< zwK9)YNoBF(Ge?Z)T-;hK59e3y%%vPw=k)?K-v@&m>6&esLgBM z(IPyTrF%El{y9|iV=O+uvu@iu?BG6n3m`l_lwkb8yx}oVa0F5wtBOtI? zpBL8rk1Zn^7f^r1IpS>%D^Db6bT=aeCI~9SA2i@sW@DbeX#A+0%8r#V^OmPDsj3jp zwM+n^A`Xe7;C<@rlUrtaLEKHC5&9tNAagR&nPJyC2&s<9k2rK+ihp_P>}1B`x39W% z;RHVyI0o+B*NWoI2;}fmAw%(M3?409OG{br78s(>gTWAVXv+_0ve8wmqf9&sVEz;IPV>qT>S$9My|8VEIQp_Xo z>$#Y)80j>e*|`!Wku0t1AJbra{Itgbf_ykGUC8 z%9>eLJsCmx`Q}=cn7RKACLeK(mObSG?#Ep&tjaK)y-XKo^mCDQj^x|vUp5@)-n&0) zvNEH({G-vnttymT&s9IdulE+7i^ki9jGzXQ_=j2mbOi0yVyV@!YRGI*OCzVCVWCa* zYf&eGN#nUG8ww9cNlwWi4M8q$u@9_IW~_OxZomUe?zHtTpVtjMeh? zSkL$#|C2_CW-oeNFiClDyJ2d6>OnNJ(?v%vhPmzIRirr^_CgcRWZ4OI{Fk3g?M1k* zTA4*|bS+baHXa--FF;wH)Jl)jd;fR|pv(jAu2kvmwHN6A4yph~76dhf=(sGGTg4E{ zEQgEFBV*|n*o=o6*gm!j83WzYF-jNM33g5}7&5s|6Z5|AZ_>A6p1 zA6j#HsJ4u6w~wcAl5^vCXjWNHUhVqYpR?VoseE(PxOS&ZsM_*Kkh-kOHaM_MD zttx`orPqjlX0|TgGIRp07FLdbTe`_F;(F?skM0bSUGz2^>9nvHmlqC4(zR7wudRuA za(?Mf$`z_mW3I+TPuL2hpmn`I=co0|zVZ*|z2+*(JoxMxH*ZBKdCf^;;}iywtHAul ztG@H zn;H;2FcGa@?r$;0Q4BmreVBJlh-XNbRC1R%%Us+dVV+ikajEC;j_SnU^37+rqg;~K zuzwKqqSWI~qB$d>Eg;$GuTYDbqIHvs;kB2OsIKv*vOHUa0wW-->mQ|Hw`}nIWu(s| zz%I?!7UBVf9gB}U#x~!>=Rsw{Vm#YlKp3RrP(D7(M#t>^c#{}f_sEK#IwZ2<{51u% zH-Og@8MJ0+O*t!?h??d=?i@tDrutjy{-Y}MvfK`Z8`R+Nsp$pn=8P3Y@$I!XWU4xX zp?_-^R6~($SCZ}WxVxh($k}V9@#ozdY{vg`A*DvqFG*o0lq#n~akEw|MAi_jJyxz* z(h$*D&064*dSFG`q!b_wW(*p=!s6jBqkf2g_Z8Oy&Ogo!ryWegC3v^66QXt&>P~be z$*@oS5=uqa{ba=9ntW^{)CVOUzh!%__xLNP)m5(}d;`=(Y8%CvJuRvZ(WJ2zrQV*B z1#f(z{xC=DHoicbSXN(DcqefHloekEtX02&nq%*3rWrs0gU6L9X#nr3`^Y>{Y={ZC zGu}>{hIF`xzCIG-nJ26HB1qG2b}0AwD8AL1KIzkDn%UIdVtC?u2xnmhYfgkcJ)HJ_ z4j5%@d!aJ=9N;AGbGnSq8jSmBnt$o)d%p|*?7j~y>(3lz_3Gead)g+HsL@)UF^Jlu zy{IguwE4UbSd+5!Y{(7#`J5J%F+2ynS!TpG%UP2ycuSue=94$WvY;9AI&~7n>{Ml8 z&SFijrM$xoBjA&5800%^k7{R{jHL*N2*ED+bgLYtU{xjA1&dpvWAlIixpL=2>s3>7dz$^-`RZaYLQ!739S#b!>~TlZmI4nc_&uVchQ`3+EC zyQb8FJ)3LIB~!)SaS;X!{SFrHTPA3x1-bMR(nVH$6MdGkgC$3AO?@WJ+0X-+=r9A< z6#FyFsw6#Y<2;1%^H(*O^f=T)NX*a%Nrq6NRUZm-D*tT^3zSaRK-}mggA04v8QpSW z%TcP~l)v;UhUiS% z8W>?)hys1x$T^(Uzl&_Zp=+Q~^UdcT7kH=dR&(GHPYjloxIajxYW_gmTEi4JT(;Lnk1%vb?e9)W#Trg-F=MmK zU1_KG=TlpwpOnPVy4AJe^K%X@$@YKxaWU2t5qO#L{O`<+;)Yq}{S)H3X1;a3#bFl~j~wZ_;F0A@CB*b%XNq-P{6F%{%)s!})s1s0m?mP4wM(;j>AcP^g z4vgG_hml9c1;4-)$&&FnrR;4xvGzwcawy96pK+ER-`rN4eie;8LNjMvP)gqsHi8>3hATOq9~ z^kU!-mv@T2K-pNGn*m`3xp=Ny%QGTa-VFFexh>Pf!k7ar@fn)~ybR_2R1ylu?C5n~`aWirf>vbx1)R^Pw+B=a%2YMi8iC&6f$CCF+j1 z@xF}WsqXP45|KknP2xD>RLZ;&)6sK0fD~6e!?{oEXSPkd z9(8h<7>B}}ozczu_W9$XxJR^N?wSRewN)K0&m25C9|vxaU4<~83Vx&25sOb#4FxgE ztl30uY8TAu&5|zL$xTGq+M!+BB0?#_Y^}wlqCfA1DNcn1-{633JqkDP&$_HA7!VF@4croj9-BSfgF_+EX7hpzq?jZa+o8PAHoLtk-aQOSZnQhExdOl4FAF_mfq%Ovc%=T{ z)Ccz{qIP(%q*FS&uL1$H18)iAz~XR*3S+w0o@p{uqtPaj0dFReRJ2BHSEa7fk`|OQ zF>l(gq@1(;e)s2vg6UpY8AG)-sJArZmdaKBUR4o_sEp<{jZGCS~ zimni4u80JG)c_ST#Odd>bqr;3qPb+ik@HpQztH48b5|Er1TLEv2}LwIw-$rN`vy>4 z(pgWGwl8zk1GZT8eGk|3b!Dz|IC_Q_6)tlcYKZfc2|&I7sj5`1*+4*$al4L@9g;Is zUPXk5UoSKY$1i$1fQsmS!uQIiQ-&R!=oir>Po-zT;-zrJFlQmpG%D4 zm+WpUvK%_~ZM%S{=m=S3b}5#xR3htFTYpEHt#_%mnmU7FmA9q=lKsGyo_JLK)5|qL zt^oc_R)w3n+2b9=0h`#(I!zgM;xTO!o3Lp9R_{ULR5*>plw*J}xINgaPvUd-H?*c@ zgJOdUHLq)yQJHX^4eG$H#ny&?gOC+papuc6a(wg{y)HXIfqTS|D!@W6W}HUZlD%)f z@dRasKyU0vN1@W+_xK)#z+fkBvvh;8=P8_y_(g*+_~Sn#ZW8BGpuZ2gqbxCgp&S*n zH0SUskNIXORTI_w64);k_%w8s>bT3cNn_G08Bb-}?Gpc;@sAQT*ux`i_^Jg!OvKJR zR!Z{*x!;tho@`+XX6|I<+7W+DtpG{xFjH|T^@|wOS0*@lJRB}DS=2Is#3Z|X2y^j? z83R`c_Y51LtOyWlG{m2k>O%Totqc)+k;Sspq;(gs%P(;B?lU)l?o+4!&V%_&{z>Gt z9CCe>R)IJDr3?z=g6TJtclkl(XWz52fvRaTmq%6Lb#<8dLFf^^HAi6YH@thvP&AvW z5=s_*ZEb=i%XXAKHVegT+A{7+$|QQnWZJr~=oggGtb=iUI%>|hWDrjNt|YI}Z7l@| zC!uxAoCCt+xN)~PY zyV!DMO@FVLUzS@nhXNDbXuy|6lWaF_GbPVz#ctsbkzs0}D`oXnoRq%p){Z+e;X%12 z+vR~17L?UIvWqHk{x6^$_am>6Xj|H>GyEEerTA&qDE7CGKOs5;nsTKo0JVQ^#koLu z&nD}Kj3=*o=QfJSdpy0AUUboe4PcyN&|o@bnXS~;Macj)PRhF2@fa^se%unyMq!W6fvHzV4q8i6o24p2S$6nHZ#D1V|zEIv6E7s>4lwY0j7j6p(rna96m$~ec`PXBOX&} z-Qn)t4od!@CpDEI2&i_n*U`bFfThbLfEGjnP|5o+K6F zR}?wBt^rzRk{DMo@Oz9rI!t*yEMw=NFd)eSm;wtBzWmVA6-(X|-7Y{_D?Sx{3493B z76(Qseg+=|=-bFE_@AUkOlg#N&Y?a^osmKfPHyx!9vkFI1L7Kn12#>9osaFpGn zOwUit_q?!6?*%O}rqwJ%k<})0`|a`@juU)C2G6+M6Q#}&Rk;we*wt}Rzh`}9^K`yF zos-tchVrUm{Un$m4Z2;l$>QE{{CWE)d9u3D3^sIt$dQygzM#%tl8xK1BXR|CzOJHh z|Cc!wh@m4Q3$mF!5Xv{A>mzF6*C=X%x^eA|Zmgv2Xul?)#hj~#of4W~fCLlt)W-=n z!WoMgmpx$a$h1^EGbZIql3mq3VdmlQ%Hpx_ zYb&y4&?Tz4Xa-Co`sLQ|9^1<$=xeW6-f;}2R; zwPL&0iq+W{2|bAPuUDiIfx&63-TT`%+A7ZU6Ea;`(}m2Mf)=rf5tzqJ69)MCM^-1z zF&|82DOdgU@&y23Vnf-#L+?tz89(2fpURkxnX(%O3TpJzr`EhG_FkCDvr@{yKfI%z zm?#C%fF1gt1ZHCV^Ae#bSrqJ`)X+EZ1lv`kw z7#C~4bQNAD#FEI7_GgW-OtL)=g(n-If2hZaFn$OsNN39E+ax?$$>e{NA-zvN;CcML ze%?L5n0_{9qH&P256 zEw3XOqcs@*72Jxrg;>?BwvFxf3BOV!lM&MM8?qZG(KmfY6Y5F+wy^A$1gKnee@p{Y zC6#-QhT(NEnd*`i>;@k5oOJqx@L5sy2n3nwbpFQ#BIxrOo1VqA>kza17>um9;tCBlK>USTcP!W*(8kRIC|Kd}j-f;KulDc&>{*+_Fm{GeW9qIVnv zD@M_{4i!9OR{omkJUdH?2lU11I&WC8ihOYg0~)(h;xLe5@p@Qx>MWqV{f=mk4$Sx= zL)~;I|6epnImUkIXj-`N4_s1!_LkIm%r&!o8p~bJu9$qX!P-r|#28rbS>U3%nd+oZU{?-E9Ct9;K6XG}B;$wuIZL=QW!x#7c)WG3!8N7)Cz1Bk``baV>8+P5(fdxm=^pWh7#N^A3J~cJcySrv?%LuBWG8O%x>G(?y_j8 z>w+5n4 z7cA(al#<=dyz~JqBEtQ5z#1Ac)^-tPY>eq+8!7_AuDr-ts_-6m^NdMa7xhQrMdc^0_C zPoY@%JtsQ;>yB9W6r((l^a2FfoCOEQE=SyQq=kb&dJauPF)fJCFg$tl&YQU&b1j>!gdPw@fcX}Dug;c_j3Mr6M3NBkd$2H5k!w1WtDVO& zm2;5b^{plSP z!4#87G6Oa%DSU}XF@4*uebtQ4OCzF4@>Aw%Ac!?HY)(j(BbB>I;1>YD#hp&{LI4s0 zj06E%vZNFzP&|;CG+ZF*9chaZSlPagrJA5&ry#vR4h8!h`Vp{${TiE@7eTog^v{E= z42ovP7Rp=X%g*f26DuOp)Tmq*5SR!449%S@&T~t>*V^2`){Je;W;QPz}HeJ-{vzSyE#p)QEMBHs^E=xqfx*+;qUGp{qe^ZB^ z++2T5_#nK6+S|0Ck1OB7$4m{jY?9K2rl#iriM?i>KcUlA7Gf*b(TPO@b4!DH`1Sn! zDZ8MvYj@l9Yt1z6a!T%uoQ`d=uo*?o#s)JokLV#x`x_@$ms!1n!W-rZFTW3Dx@m*$ zn|%n<@(3KYrI|2yj?c`DJzFuMPcu4p)pS-it%^p~+69gQniAac*}uOigZDDjnQ`+S ze!RlPItQ|M|8ZuVJ6Ize0H{oBQ~$2wYJ$cG&H9Qlf#6w~JIl^BQ>q^Cw>YHt3xgr9 z0_?8QObv&zK9!@9G!*R>5$rmfU2$#$yvM=_L?N4{|wxJhlmo^z_a%RnjcVOa*fqA+awVO-85}ij3 zcY2Jq%6tykf-F0H@S1g{tDo0nbQY<}j`C#0K~a+E^XYj$7~g3!GVxfX>|odM zO3AWxWqXT5+SA}6inC`D1xMr5G>_~bxrQ|-*?{1-yZ}uUk)6f0vrtOjgyM<`HnI2>CB9}Q`dq2x7G(-&w8}VZziCb7wK*1f zN#>E1ueGBysa3Hczy?WvGS2`|<2Lh;FZ^r2@?5p=oog)=`R$GVKJ=*IuYOE%0eNL6 z2O+Nt*!M4~;{y%?BL0bN=00<-8wN$}jrtfzP~Oneh8Bo~&E#_UTrl}nAaw?#mgRcS z?@M6-XES{d#}?M}SztTutX$*bG^>Wq^E_U}{NDJyEZ@>M3Txdaq^J**D|@iNk8t)i z+=HGja2=sQ(Q$`(kXgPNvqjh3Brk9=AN3J$P{(YCQHo)}o-z`}itfF7b^f$rpTp<0 z4idYS=Q=r>D$!a1&Pp@lvWEJ;EHs(R>AX%_my~*tv2j0IhnmOmUd#&|-5Zhh3Cd8H zjDXBqNLw8?;(6~DM9gQiTOZPvS#RM<<$0dJCQ)y3dL90IF4mNPb5OlU#g+pZ=lV`9 z1TC|99&?l%*1E}TzQfljXT1gJU)&BXvtFsR3ux>9?qX|77qk-AxU^a7Lcgxq)wQW*8^9Hj*Q-%Q-gSHsa<|)W!ZmD^OD}JV@%@D&0EF<-!GobEl zkycWFBWEh=guPA_hGIwl&}8ct&flUV84j)fKUEr^=v|Q!KHX#{^rnt;8}b~GG%ugq zW(b`k+-YH{^jHjxDDz%9l#Xq~u-*7ym*qO&B3|x%Rzd-Gm~v}yLmj>Z=kW@)W3dT* zlIOAv@{N{0E7cI5Q05pe!zgzvdc{hn4AL@j*_^odli9RGX2G78E!`xe2#mw)EKX{CJuDKUKFADx13Q+EQ7G%(B;{R zAF_4>l`_nE)eK-#rsY`kG=K%d%ZbWU_*R#i^ovx?<1R9)GR@kK5w;!f*hE6#deT#` z|5Rr7eS&tZ6mu6M9Y0`7Vfn}>%0&L1E~o(QY4N5CtTdgZbPf}|jnYtfvtPw)tBn-H zx+Sb;_hxz5wfqzr(SNfk$i_!30apF%)uN9y2DXyMR%m(MXjHeZE9ZE$L0f19_q*5B zK!J~;^FL>GZSSocPX?7JZJQ3Gwr;-@+7|sjAN_25mQs156~EP7fEGakjS6Gueq#u+ z&)s{_L*H&N4&JL7 zzpJlh*(0g)p>@;?6qF>zQji24;n}Subvn11_9nciy*WXJ9nN58RA3ja>o9#nU~6$~ z+Kw|@15@r71T3^mOATEH)!2?znca1OeZyTTAW+=oCO>s_8sR90_!P(WK<1PE#KQY; z=&&p?j5>BpQcb!UhHX36&><`TS6_J=rz8t&I{IQkA&SdNQ>c@5siMoV5~Ktry>NZn z)l+MZEICQdy=YF@mmZ)Zd{}V>B@{cHKQotW(b`HP?soxhaoHnj$N++mLGy;6bogyE z!ReJ# z(8Ru{Vx6H46GguLsC90|8s^jKrO2=2&KPVJM2`G;jFkE0zuxkb_q+S>y5fIdOiI&r z9RIfA`+CmsI4_<-Uj2T+G@Z-w9;;&q;SUl7r=9rwdOKS}D}LU*z&6YOcr)o_v1=qj zbUzx!=&=KW+GKFw2V;DiUk_t%fF58G`Xz}9q;{XEWBcrq=PB22eXj3ySwI=f`&=CL z=}rn})87B0q3bv&f^iiEc!*uKl*llT;oxUF6PxAK1fG->4IQNFJVY!X?NoB8ggV)g~#%zT;2lXemFh!&^I(LtkuJI;Z{CIdz`rLCXr*&e~C4 z-uu4FRrhOcYT23vf$v!Vr`tUTvG-r0!tAO9#6^d-H-#|jxyCEnYLFW1k=4QsWi2x=+=csMn1v79WqK%BQb~hv$<>^rYzUhkBefzzZHCWl+ShFR`7iz&+L69>iYL@ zz$_c*$@?NAFXxG&t`T3$nieuWa@XJ24|Bz3;Xu_Zq_8@-;bA{ti-DdvK5nzA7|!U` z>y3G05J*Qwf%`fEmRhdEZ$L?c;PMYEm_G+UF^`q&X*mukV{!pKc>FJi?L)Ptd5*8u zIs9#gZ$yinZu?XrqS6G~;c#^0P^{y(rbg2eOM``gpM?$Dkd+X4pR0(N1CE^2h>A)n ze0pKxNe&xYtLV!zn1SA?56WhDnJsKrMO{bmlLA>4{JGBT6qyq6?31b82H(Wey3Q`M zN;Xaw&9=VN1y6g0WX7$1XTALj_BtcI_A!PfRF^5IMK`8D-MlPLCF)Qr$TzqAtKa$S zD;=2*G1*tMCKyFdeMOL)4EZzl@s?oXHb0EiNxrGes*ObNAr+#n5>~WS0u!AoO8Ti> z(73s1ZFuT}-nK4zbJ1L~5O{+}ifiO4`u!-s+PHmN6l(oiG=TpMKR(4~-EmsRQCD&8 zDcc(n1i-_K0TF-!KKhJFna=LiHV2K9sb7eka)6}S2Ad_UtOy66*F&M4buEvPDJ_AgKT3(wbfHb+x!k)vJba%6Q6?iX@248ed=KeGX$D3i z+u2^dQ$H3_;@bbId9NEs)wKP-IT|Izzp#2cVG-cp{|UL}akNPj$J_Y_X7FE@4s7B& z4V^PP1MYydzSa!i@9|>9aYmT>->yEjYu0S|pBGg?aCve3>c*Q16yB%DwvYR|Y0k~N zuCA+A!~VdgSuPYXpuqiNiiSbc%W2-6#cmtOeB|G!bJoe|ry2Qwx)Uuc+hAY{{P*nB zO@IF0n}dGsU?pXmwlrJ;OEJP%U-sAWGQj!|$UGDA(%I~mOYSq>GS73mvudZ6O*hD& z|9?#>-rK1r>zb~QUj-u6vBVOSy&wxC?Xy}GFi^Z|-+BDH^r3=&w1!iS+?&;6DX1oGu3J}riibCM32-pjY2-VUe=G#5@i^l zJ7#Nr-;eRlLbX1hM#Tribfn8xo!a!|zhAB0DKfS-X6bHm%nq8Zn)AX?%~`pH&8Y*83Gqy-)M)*L$0+Zul&_aEIzMF#aG7 zuJix52A8!lf7grohvx}pTO6U+mi^vdnXMeV@P4_$`{8d;Okg5}1`8v6dna^T{dmGq z@N}4&93^_+Q&XSAqLhT>*y=Iu#p~VjoaKG}{Q*ndcrt?jIU7MO+xZ!Q+e8GpQA6O; zQy`gvo2F^wFoG}a-!gc(7Qy77y#+nXd;44a44IhwZXp2$8f@fKiI_HqAr56hdYB)R z*<&{t!PoB(66bcI(jNe^xMA0GZkP7vB#+f0y&&(~uOPQoyN$hA0gx-E0ndl|Xl>^y z?V7xZ`=Qpb5+=x*YHvTmoWS+3kk@(VS?e}#0z(Z&@CRl;eusYKDwXP3Ok?61 zKhGIudk}L+wKSCHA?9fqkvGXAN{*F)-a|gzcv!$fCZY+N%-hcNW`>@ALS1AcJG(}F zTLrv5f>k#OejXC#T3Ii!K-J-13%ruJc{bX(V2dJ}?u_Gg(yQ1*@aT#GZ%sS@MaVjK zskgBH6kMb?YMyGNazU?d%Re*XAtTaXIJ_5|%Lx*UQprGh_cS|W^0{#=zMiPznNHT)%dl(wawS}{C73o@TNG~puSq*sfLd|t z@ow|Y9p$a3mP#GhpyiTuEEgJCCkhS-5!vXKDE4Id({L5sXO$FIVrszCK+i4CvCOr$ z`$qa-t_o6b^LzAq>Nz^}2BT30k2SeOLS-qZiS`=ZmY)zgf48-(So}A%Dt)xP*0e z_8BE<{2<4%P^0$kM-=|^Fo_)J8%wYspna5Dg&haV4?IEYl2x^x6QEObC*bvR>p^E* z_noZ@@+U~x0Rc=y-{roQ=hAz*&X4W%W$x?8$t>947CFusc#urg-nr8ZKAX5X<>5?@ z7f7N`&vV!S4CLk-VxH%;wRV*4c3U$cgZ63NVgxEI9o3&66B9jytX#KU9{IFi@Nc(p zT2Cwa?=$&L4nbZ<_+b2xYfH1A(`z#Hy-(;-OdlZ}`~tQkvS2uFD|#AwJg5Ie58v-Q zitKPesf>bs!}E&w&^oitYCSXpHZQx`gpPgR`{Kf^uJ<#RSur?B_hjwt!C}vi&}o#e zuG{hYK;v!i|FHGW!I6DY+h~WA$;7s8+qP}nwkFBMwr$(CZB6VgqaOd!K!JueJ7io@cGx*qheahDQ%zH241KdGZbX!oSU+KPtUZ&+F_c0Sh~N1o01^ z({h<2uwEMfPO#5zFMjznmHB~>S5ok^=>C)v(3 zodz>m>UQ0}Q@qczYu@y}sog&x)xM7KzkPgqeV@XEHgH>Z?bhm4{e3QH@v^x-m(}$< zPkP>Ky56v~+@|TP9FO$rdcQ`nN#Cag*SX?3pjpMQI%oCN^|`I~!Qi`I_NC3g&TS@R z?Fv%aP3)w@Ew`R`e4jsdzrNZ}^xJ?M?b=>G^>Zhd02M_OXP;|4&_1|L`%Dkxk;>X0 zzgb^o;6NJ`sT+p&QQTDuHcI?yW}QK(w#YoUe_clY!1I;8#L=;r`Bg;A#$uei@A7`P zqVqiuL;_77-4kJaqRTzG1-tzA`v^9?TzWzqI*7rR?m;b<>$Wn`BE4;~i$(XuN7)$V zc0U1!xxh=~d3{CK$MPJZ|IY2cfQu^_d#g1w0}*xVP@W>F`m6jGAPC>jjSBvgh$;+G zMFma}4nhtA{Bf!@r?d>?8is;%3@KPQ2nn2|gD4#pB8hiNGri!#ny*z^ESYuM$eMQe7KDAyo!R9l+q-y zOtf01<7fOQyu>_+=-2V_b1?xM1MvZBQ@#aO1C+|eX(d@xBvq_zxKr}^4o8*a4JIsp zhR@0}d~*5As7Sk1bLO_U)T6U1?nrBpMrJfVde973%N9RLl&g6Ml+c^sMP>4-%>!8i zU-Cv#QM}5aK#ZDHLqnjJKtGAlk0Hr?M4@hu>p~=|5~^JKLE<3F3F`7@sNGoIC5+#@ z?5HMK3EMy+KrUlkES%S-$F_gyV4orqb~HBl7Y^cPgOTe{i(4Jaq0iXHWH5})5nrN> z#OhR;fdV3kW65NwLyQv>$og+D!_`nK3e9q#4ZdiM93mJKX?R8KTw<{6Hd6>+0E^pa zcu4iYfDjCV{16CXRCsGYV6UgUuL$Au91iR?j#3ib%qC(huKLGOh7QK&`=5YY4j5<} zlffhuMr>ccpQ+K68BJA7sYF`laglq~qm!b5wFaoSD1`g_lm)?J!ygaxh2rCnhUZ-1 zrmK~I5GpkCf%Uvj7SGJHU02>7u`e%@t${scfuCZ44b7$6otmvys`R?Gh~n28OfN=c zGeHd8^zcU7%%(F`D^=DT-R-H~!X5_S9sv$toF{B{OLbby6|i)@HoH5%fV%5H_<+21 zRP_hH7ecQ>eG>A-Buee4wfcjKQuybt?+G*6&TZ$L+XJ5*hN}_f|=#Jn7TzKkKg=oy*OX)4w!M+9}2gKjqbUw^?yCU z|Ni&)n~#XHAx;cgg9EMsIQwR+6qC*o{6A?|O89l$Rd+_s+<0!$1qGa$Gf?1DmpT@{7D2 zt@1+42VJdphBkR#uuV4DBwnv~wkj1z1l0FXTB>q7Ro5p@98|UbwF=lo90aHd0>O*LhD-8i=aX)Jv*{=Oj);7$nriB6Ab;0{EN95h2Y{2Ood$}=QlB1 zA)_BM;#54}C=F%i&^+0VTGx%9;m}CFN~~wkS7;WnOD%H%%cB z9*@^~6&3lbu+rlqgSKJkHa?i!6=6U!o;Gsl&{C&2RcX+eOq^Mv45B@uTtuwDD=Bu@-?Dk(GZWneO8?863^~hv^qi#5ye|u?6 znwr2))e}-4rFG6EzSSgGq8Z{!4S~n^v)s@7zvw42*>4ge>8RFvc++L{1S3$W$xFW4Wu zzbKVVeZ>mq``qp+UvIT-A} zf>x?)a=HBlFD_~`nP|n;qz1BUs|3-Xtx@FI2LXQ~w&FjHmh+O-p_pYUeS}j@8ozm- z2PT1r>UdEe_G<36C7auQ!s*V$jG}4>aG{M$FKpNlCn*S(Rx+jRATUz_^@1kgL(Q@3 z2c}jQ*=S)1Mv+Ju1A>FS01@9*w-uVE^-C%>gajAFgRRKa^AN_FKA|ti)A=4J^m+_z zM`4^@-+!4ciI+akogCm$5SKhzE-`>!?=7u}qaJNA3BG)%+PjCIvXg*EoRnB&$SO6S z4z6h**$xUrORFu+N0u`GE1{t{H{g zy6?Jm{JAPOl|mT=fr_U^pH#F_LPZkgf^HgS0O6U`7jIW>?vOq8R2vaiex~1|!)WeH z-=v5sth_?%ge((;)#fo9Nf8$v3`1zS;N5j)hb$yASOooN0*AP^-V=tU{SlW(6@zZX zHLTn_p*v9YO#pt~1HH0Og#cQ65$V)QUZ~;sy9ZBB72i?VI4lLx9*Yq3&OM<$kek`x2mz@wv~eH~?_98DyD?)Bp9 zdl)`JxSrc=G`+su9-QPjyV0O=`@H-MAP<$vU~+v2cGqkKHUPUl0K`d<6k$wf+^nor zD~rqcH_6}3;Bs#*AN0s(wo0t)DU{Or!Zn1_Ols9TsV@Y5g?M^6Pkw4UNI)m*XRrTm(K$k5Je}g!V7!7n%9)F{}0cbLSb(_fPn5adJE^7mLMX+SIRH z_qE|~U8nI1)=E?!95A4dd ztViyzySbibw$q9OoXqAuPb2;!k-X?jI_OJuz@NJTDj5+al3e%a!vts3uzo zu7N7PdQ=~)+um+h8_P|S#%#J_cG-I?k&db>20t!qeBa@-9J&1c>Zk73d|irk+8c71 zp18qw=d|*`e!z3Gi9j*bC{|ajgz~(u#gSb_ysh%qctYI4G~2At=ypC`?aITr?#<=% zdOzp*uB1QN{^$J?bBhP#4Tzg_n`p7#MpMOlrVzl8o8hYDz=L7Y9Eb=t-=&eIQBmEu zrDpEXjDJyhqu}x93FdASA)e}Q(IQ~ZE29(Iw@8-ikc1MD#uYFH?M}KYJ7|EZre+yp zhABC&5LQHOmx-witpwYMqu&SrB==l5%zcXo_dTu&1T8ItSM)mN4Dlj%7cPJrkPsl! zpVlzoC6!X9M@L;OtMF!5|!)`0oNeQAgZqL`ioh7wk-H zx$hVJr5!>(R*x;{-L(Lf_FkDsuurk1HAlONC=>|)EqDB)`!E)?)GR< zvIOK27vZZ~^;j{1JRQPY2&G^?AP_}uO{&dzyWpS!)2Z-ucoPfso$T#U~d=$=qp?8KD_`Mt$u^I2cz=5k4rVJJ5I8b zXrFjzvgkMu9^d4UygN0z*Z_{3tj1hmAchQv-}`UC=KX9YyAuwd(+L=++JC+`lS9Jo z0jmXOcJAFx(j5`pfqcHZb{F4=`S&;g?^u7lFkP)xZ#0wT8uUELQEn7_?0TItB*S`p z+C*)2Ie&O85Cu+st=s)ZbvlDiy9X3NGr6IrFxO<6s6mq=LGs4GQED^{9m)e@aKA!3 zovE){ZMEEBI@y*+pyPj~Z{K^h(&2jX@fY5|ty!5o>J}cGE$trVY;l&)-dng5?#hnm z{jw3St9FzWUH@U+;xBre;Biz2tF;+$R__msAbB&MC;!c`J)!mIXaBpG51ZN6HSfpu zaV$UX_IZc(4e(8fqMN~E&3$h<&!F*=yWH$6^3`(eXE1E3d~tI(D6R+Re>Zd-s4((k2^T?oZOIoSk*X zT)a~E!-mOAsOU zrGK>Vbd)25_IRo)O&u-pOfOTUn`l_S!RFAjEyvSWiOj*t-9%s1{#<|9NsZVNlZqN)knUdY z=BfWch$^35Q=S{Ygos?uAn#O?V{S;;qm0;`N^Gv&zpxO9o-D@k2}AA5BQ7H7SpU>K zYju#Jbdogh6Ec1EJJ*$1S{-5uEh?8*A%WCBE`mx>OHhj zoH@0n_wzy&FPOj?M-Z_V7K_PgiY)|ti`{a8=RL7_?AOb|lcxSm2{R1#?GzaAb@V8* z^W8Du_Z_v{J~c1{^6_$;xv{-=89@fY|Mk-E&;RDL<)L&4^t+#L@Ta@Avp~P)_K)&&EzfS-lv<4>aa^@ho!xS2Y^SZ;dbOq}7WQ=W;_uhz+tRS+|4pmif^|+=3_N74lqq)0*Zu*<7HaISw?+0<}->((F&R0C!ET4y}*yPvPiOLMqvhL{USqagauOGLzD z@VXnlW5wTj?iTK6Q}~-dN~SZvKaaHw=4>~i#Xjy|5rzNIXmy#4FBG5CRdDybW&`>W{FcH07Bh&z7>pw%{Z%VKz2ft_zxw~NeuumK3NN0G5Kb4=&-C#OWw;B zs@Xh#mtVV2voCj(K!2%zTPnG;Zg)jQX&x35#@UW5Nf<=ZLrr;?R(%~AN%45KOXC&3 zP;3%j9VQXlePBXzn;m8-`#4=1lx$LK(Dh&uU6qh*Csm9_M;8GSyjUIgL07?b&ag~@ z1=+p~oriFBE1|hEA6nJZ<806(-eIj@3(nqp4pAI_iWjgJxlbg6D~qOqTn~Ws#_N|z z51F{&9RW{)6DMqHy+y)Iq7=7RvG(f^efHI(v5rX**sl~I_J+(a{3Acsv=ZP+G!`VmP_Z-*;~ zrNzPC>U1P!%e7U+k48|~zYaKQ$nM-9oU*dZvmEW}tLPg#ldhu&M z`TU2NzhyFm_qE0ss3hbXec$=N`Ko`4+NJ+EGRyMD3b ze)0h?XSAx@ZOytIZJ}|He(_cX1oG&~d?>;FCXPV?B19LNwa1TF&l)>H5H$EwbhHqP zu_E^hOsEc2mE>r9lCzLC<)*)s+I8aj$Aiych{&XtwXE#tsrIolS9TqYL7MZ({<#9^ zi8aQm@|0IM^{@xTim!Xvd6O4MV!EAON$x z9~-00zXfsOQ&j&{R>WWSd4Dg8!j&Riuc5+=t&|gvRzeHm<9=aoNeGb)%h#Y0i2)z!1JoFGT3|s_8}92-ZQO zluUKkD3us8{`mtArJji`8kaxcsW^hwT4ncfvX<=CI#=`k$iMrETOc=*3$9G3d_nye z`ojCgq5vsDLw{PMEm6G1+TPs{@5dFC2I-Q2EEX*+N>>}rwH6PhwP>_dJdXQ0o!1+! z?l%Rb(k7U&s{&-KLIbQ%*BIc;!{v$*rlF>yz)Gm1)~kHNM#5j8B4t?X`z{gAvjZEn zJa>cv8&Cjh2Xp;`eRBKFM0#q$SE6rCOh~Wjtk5_)8yw4LDlsBm)TyMuytPq8!RVHn z!$y@x_IXg{6c_uCi4+6|!r_5oLU%r9Sg;zeXqqd!2O2{k>rKzKdH$L~SB=f#tN3C{F$AHDx(hxk*G@ zwXj4{Sq*NTB)|==-2&@Je#&eDI8Bh$Kbej%v0tmZ9g)k9)WFQ7ne_5rdOv=>zwe!$ z{pRz1OTwT!KeO7k@0E=8rQnm=&6=*GrJ=F$7)}QHRX%QB*px~iu@Uk&0Ab6?xfB@D z)6>xCbi3Kc{_(=)b(85%61&u)7RvS7F8YO3t|f?Wkio-p9qi*_+O1 z4GAzrmD5wUwx)u0^|?2=##G0(;tdNfJ?@tbs~KfPKgZjX4W`ijD(UN1Usllx{n6KD zGqt^jV3y^(hKfpZQW== zeKK6Q$x5p)TkPCG*~(I&p7PXLk~9R^sZa<$oTakTMBgTbimv@>gBUM%6xs2|ck`m= zUYdzqaiMV(h_W&WWE5e#j8R{`$JXxzQVfcH`7DQSe0$b#zo`zzR9P>Y;xuI|&=B31 zuc9Pt1N9J{W~hOcN~}aoLKp*7vU=0?#J-y!zK~-${fb28x4B;=viwdDW9O{aks9eR zre!DzBypsX{JM<%CTv;@G^|A8*c?QEA?~kC?e1VGBbb?7y_(mhR3=bx#xUDZyP)^y zgz>N4*-s0ZJzVQ>aijp6N`kd{;P|Ow#T?cf;0zL=tn41QKU`Ugpa+LsE^D$Lw~7`X zWv?A;Z6Rq>_x{C(Ldfb0K(pSBas@RafmqBrNLO>Rc%9=0+dBfl$v1^qf)gyF*G8#dOBCtmgr;Dq=k=kcx@?5(4Ok8@P1gvA zxWG2QVTf23aCrC&%K-vdtu#_Bx!AuR66k?5Apq=1x{zJ6s<9FZYy#}Mv(WQEmk{DQp*!3; z8up1~=X;{k%sbf@f9C`o14)*}g{iPNf)D~QSO5UQ?qakQ zQmL8Pya;CbvLiI-^N?-~u^2rmC;f8i)T1C1@(Iv+$m?!sGPKMwo)<<=DPk5A;tOIP zZU4)FYt^p}qKP=g1TFbwWjUc-zQpNa$*t6)}e35xU#oKX$EVYMj9V>I&tGHPZ! z%tlBF$%f;S1j?*`?Y^cT08r+_;|B?4BfW;)j6%11rUIKjxSiCQWz+{-NZ3oA|Nby~ zizYb*tu21Zb(=RWhUo7_Co)*a;^49OOFnYR!GKfSm4taeVLC#d@kjZKB}-1;C?}J> zu#nX9Ct`FzyediFM=XOIkQcM<(8_Oo>32tmC(O9d$O&QjP4`Hvm?$__Yyp!HmF7MF zI*zVJR{0a+Y{CihA!FSR4Bht$Sy74-Ou(E%m>jYEV3>tgk{KmO0zoDP$LzIxQ{_-f zUH6zrxnB=uXesu59BHtOfP)QwFs>2L>*D@>JNxBg>GWeq4yBSDX<}Gcu`SaYX*7SYenCo6(n*nu>;FHe57=w<72`l(#DS zVHt+mSwM`=1Kd9Lul6sHQRDh1k9w$NcCHXb2rYZQC6ZC^MQ8HpGvY6DyRT*^)I4E&d#RNvDo`l8 z6;aF?M@)-LJu7kbEWUF$jI=V`rrM;npS0VD+?P^!HnjyVd9xUVNfJrnr46_1A_)Hb zjl@6{!YIl(yv^ByvEc{9z*Iui)puIgCb4}B0KnkPfwcZLX@0O>Fd8i-5~LHGnK*46 z3jRpZZbK_j7RJ%U*gQ0d^q96>S!88((XK^o^@CL~x7_M`hvNUPd~uLm38yaFLh@Xl zNOj70EQs!c>0%$sgYrEAhNHjc*>!U(!h!><4g4k3P=o!}d>kP)mx4*{c$by=C!{I`R(CxC65%I+upQmoFmoILtFx9_Hqc#}*m!+!GvN#P2Bo;y( zEt%+^1pk0ckHTG)%ab`?&AyV8{E!)uwn3}SoS+Q_D$Wi^B8Lfcv{NShm3aS5*j_!j^&rX-SQ47z zLmk|KmQ^smnG6I3Fm@|qDYx!h&Oa$%R{dgt71mBkmLVeyHM(tcK4fsx6E=kRARP?k ziXQxJe#M&FIiN(gKuxpo*J2ln&Yx>;uR$?_>5Wcg^7xOZi8vy%L6R(r6FH&7@-#p5`Ns`{Wa31rh~{H&&u7R_Q$xUe z41>&MmN1DPJc0W0oVU!{a zDU#-`2ad6gVH5%w)21*qVQ@QK-_D&p1f>gJ6ywO+SN-qgri2vK*ii+VV^cuhUqveg z=Scl?EJZ}_aWTTZC3|WMJ0`>}NULHp08%IuVgO~238y5!VbT8a*imI@dW9kao9?f? z5pH|5T7XcBsix$w0F{5w+$hWdmr$l8LS(6J#S{qAHiqH|^Q~lLUkOH3?hf2`t z^Bfv!5gsNBR?7ek?{5fDo%yYy$5^cE!Rv?t?cY$Yx4IMF0R?p&NmSw6L{PxAk5hZt z5iYpmzYdnJcuJ!2!BVJ7dP-va88>V~Nx6Z!`tWt4tR2kL+HosgF#fI6;D2Gn!36 zV{Usj2}j85C4%~wpiPX@s7}cl@8UtwN)7A*aRq~;SFV7lIe+E<-HqJB&euuKr##0D z0Jy`rP_;%WTo%-0kS9vQaO8w>Yv&YOQ*ZBs&ilX04W=l&QHGc71VtkoDyT_n_?@t; zW2(r;313u|okZ&zw+U8C~)eW zX8KQ33vZW zIbf9BRa76lEx?EpOWtPUu_?{K&#*BdFeh*Yg^IL( z^S8+dV``#Y^8S08m4+;PQq2VGMDCOclvfbLDgIwW6(q?&#TIW}HI#Ap1Jf<-J zDt|+x%t;Ud`T{hAJ`7+E4z0x~oFihm>vz%VO{$cFfef$Hp=bEcxX_wtz;=TUn;3XX zO7TcWst~S6al*xtmI6G00fMs=s8&^KOctT5Wd4*$jGh=*fmJ3OPBArn-ZFoljKiD& z%oWF@%}iebb8q`A1xpD_U8~KuslJxKfrk@RLmR?h&>uTB_`FUg`-ha?&sT-Wyhp@D z0}N8yMST~y;_oq;434Yxy&FDyeqWl{_$Oby9^bxXTSaV1<&_~MzLKj+Tl;}ONI!T2 z{CtJfM6pOEmxN4*DokORQ}tI{e4mP8w`WGG`qum`!kXfEF4ca~s~of#gxSR3cj&jhFS%m{d!IES8}g+TXh}cPXd6`4v*bJ0>YmA> zPA-?<;W?*=MBUku#d^a=lIj%3@V4~D*_=;ilF8#D!apAUyqFFNrbGKVtV26(z$29^SKhW)8#FE@T{?l#TAAa+!xiL-eodIaT6)N4o~3<NG$_ImHO>A{+gGy&2D6hk8%BD=$>$rRgII+>$x_M%P^_X0u=U+?^ z=njhjQ?i<-mp8Cd&TD`DOzw1Q;9zVu)eH>@3Bt&c0=8<;*TL{Xm`{0FR%C}R*F-98 zNaCF!!2g+wtQjI0O)L;u$Odp|H+!X3gp}rBTM@d~?83)IVX!zKVBv5Oi9shL0wYzHm*jWZbYv1C^5c|c5}A!1WWkpN2?C=~ zw#uA_C6v*UT^vcVKpfw)g8T9A7|$g&idhnC;ZbvQiUb_6!f(akATqL~en8>|m1-hF zzeoCjJKK^^Em#&IeCdY;WhF+kx*hVJ)40aN83kyHuyTw;3ZV=cBD-*L-($Tp9jai& z!$UO&X<*7gGA;~8$kV-uWc1k5%ZwxdFeoD5V@Pbw3Q@){#QEqY+K5Qw1};#Ovlk81 z5h6oWcx$>cd97B52k@@iu76qK$I)L)21{e?y)&7OR%iR=2cy7ILjAn7 zPcqSGrfuCs6T^-9w3}TVcc!v_(NC>V*Ome~9K75NJ`xj#K9T?Ion;OukeD zYx4YlhxYK9Wr#w;qg`NlzpV5qRm+t;mluXt_21PK7J%TkI<2lwv6QK=VDeGA-EWXJ zyMvSr+7|Wg4%aa?{i9pNAp0eEU=siKK^a&q_RR`7&(O_3{k`@@*Lj$5SDP)my@m%Z zwh$yorMZ4H-+sDZ&lk`w_CErmGuhW$d#`tdC!W0OPF6jg|1*M%o#^SXk8CiEJ%GJy zZaZ}8S2yf(8dr4D8cI6^nppbx-bi)d#?$uFKlE9t??BWLh?`YLq93~UUcga75-8L6 zdQ>QOSGe@CSxLBOG6IKpJb(n*QD|l>__CgT)9A2uKwbokOV0&9UDir$? z-|z;yKqug;elzaXw>Os1XK|O#?&7V`mef7dBgXRIFC|W*(Q3qTU-Z9wD=Z6KZSF9b zUY<~=(qu7u?svPpM&@Jai_6#w3KeyytY1BDN0`1+r?>(YHFSed!sr!Zr~P=_&ZYkK zUT6FCWKq_OZ@>Z-&S|0E+)s(IcxR7sx+LShj`^@j>$23mUgw2Vx)JOK! zvurg&|KWxY)R@rMn9xf#i{0A@)GHdxX$pzBqzYk2VmYv))z+PB8Vl&6)^-{Uey5^ zclYryUUeB9{Ax{=m4hOBNgp~>A!eKc>GY!R;#I2Rw=j-#$%4ggZsvZ?W(qP)Vp2i) z;VCftEeYBeL<%&QLy?X=c=XC8FoI4vZt+C1Y|L*O@bCX{|HW+gUDsnH;X=5*je4n0 z-Tf%<&dC4uLPR&8R~8eM%seI`ctZCE1Asyh0`AO0;LiNXYPn@`-jrpY>tC-p2#MeI z{?z4p->X}X1hBK({Q_z?v4L1^11j}qQ^yxjq_NXsyP46vd)DsSQ+{CliHFOze`dN{ zQ|5f#E)S3IcDZ&7Ge4Ka)2+Jq*9Kk1>CZ;-3E4g5g6!=?l(R3&d%H|_Uy(hscuq#+}LMkrZ+p){R4h4 z+}+tR8>ejBvRpO$eTD+3yi}n|ZEqHnulfiBlBbzSh9CV^C48cdt>d;HmM`35v!221 zT#}P7xGO>05_ef=u~gSzv0Mo&y*Vny+Vyewh|RX+X#ZRyoAF`XXY8yCpI4u6;^WD! zTt*7=L=6FuYaLg1#a5-XMHkJsKhJCM0Y+AGGf}P=E06w7H+}u`$1=H$9&-WD-_P;P z?o@sZWteq$c8x~G#*jjM)~0`b8v_Espz}wdGoyK@avlG)Z%*(L3N@0+@*Tf_&;a5x zpBrb_7k0E=!0W#I`hm{_8WiH`oc82YNF&Lw(+&-M-K#YxpS+jpW!3D+M;ENU-#ML| zO?J!veR;GHn|N2Bt&8&C!1}DP82h^Vwy5pPjti za3ch;qYj%9nqU3{0X^riNV1ObV*wdBAWnwNaiO6yhM*b$C`kzzU?NeisWBKXm;f{y zT-JfM7)Uk_hvnbiIa;9v@*OkYAOKN5?n|t+HP~f9n z`{{h4KE0O9%fG++?l*eRgI>tWhf`^SHR7?D-jmbWUp~vpFaX__OMZPH%g2mnfPl+h z#fQF{Cu*~utMAo@xz1+Eb_^~zz~KEUx69m*KBmYjcx8@}9@;<;HX4`x?-l!QnP%fi zjc)H!nch_eb>^ebseMl|OUkMX_U;q3lvgM)TK4`LPE8y)0TQlhGuVMNuuNZ&QwQI{ zG!kx_8Lq~sf#Jw$DejQx@25@a+Ab^26`+jbru$+hX*9JH1F6q3e+iOFH5Qj$Z^sq^ znghtSlEj)cjymyue4NpD1L@m(y`KciCVG5cCz7eI);rZrDFGJS=Ui5O1y`H?Wcyuq zzYQMN9EJFkYLeG6LUx0Lc*zCqm;2}5yyT*Dp=Pr%nX`v!M{I6H_h9ZR0d*#4PJU_5 zlUh>yJHGEZ-e<`sh7EZJ-jT=tWWGDh^g+1X?q0{DJACvRgkov0<(T%m;Bx#v(+yS8 znJpZj4o6gd4&JHSrN@Ud|GiT$>m_emZJq6EYjiWRgxAR$UAxbh#d*(PXn?+d<~je- zX6(!^$KF;eQ%r5Qy4Dkmi4BWKZDYV{5ALzUFF%zR za5G5^sn+vR^|bo-MHhfawhRabgEd{8tw61~2H^soV&_`lripfSjgV14O>W=O)`RMU zKi_kE$J_jecwerKnB1iP^?D$B%xME`9i>gv%Ah!>Im8)U61~s{Adc25iblIg{u1rz z$i67NDY7b>ppO2glw?Kczdmn+a)u&ybjEB4RWr8LYWc-~f?9&7Z&)O^${QH>_*400nXz31)9} z3uq`%wa-mx$q;u!K&o^ zHGTlphzOE8eJJIKMcwS6F^CD!6x?$2lCFc#<5C9HjyyfCn`d+S?UUS5e81mZ=qkw1 zR{VcOF9{xddxGyqZ&RA`Fg_m>CF)bzy?Y}o)zHv>I_*}hl*_$0#Gj_cELc_+a&~&L z!14pEwiBzr(5tn&$;?Nlfcx-?R<&KJ7!N3Z6FnGVtx%5~K1ilk)oS_B<{AVtKv(=m zFS{1iHHCqcO!SYJ!f3u9q>9o1u!s)RfIRlhRboRv-8PT$S^m$ZzauU7v0lBpn=Rb# zmmeDd_+*VQ?a{jmJ7W6b7IlS%G7tbZyKRHJ9#|jz#p>=#JFgZznV=x+IJqVrA`?M1O!ZE>6l??=8LxEZw3dO-~vI7`rU>c6$d3E&c9tv=P zzhYna-eoyjl3F-aVU?cX7sg0%I3prAezRKLnRgB0)l8j4uivfJ{Nc*K*4lfybI_yP zC#AW^x2i$ffGUFZFJHid@((;pD%L#F`n*y+J!*)mkbzNO)I$|$Mb7T!%UAYptUryT zRIyg-*4n@RaH!!YJH3a+g*tmx-@n;JIx`}iZI)8`y22GG6BalaWY2Cwkpy-b3CL~? zqhs30iWW9MHD9G1wT=gdZXg&_{tlVouZFi@S%$SI-Q6ascTpBhzES)J)RDxh5g)8tlLomf`8nC37;I6O>?hLB*+Y{Y#)!u1 zxD14cbjb8HpYmz20Scv(o#9zJrD!(GMa}=3@%E=c1L~8T7+Ne=FcXv@1JHiPyS8Qa zg%Te!q20UYJ^iZG^L?MrNu=i6_TTI4di|x<+TnNo0a0DsYd6t^lc)s9TT~DP2LIb7 z#-$^$|7lqAv{N_n+G@T3WZFLt=jnS~r%#|#^L{T-14;8$CVw+)dqa()s)YZ*IZwP$ z)sj5cqA*-U8V~e~6=3~k9pVV~ET1Cc=keP=jJewA<~{#}V{gIbw@i>y&4?VjtHG+U z1B1LOR>PWfNo9y)gz2_^PlVz#5_*PJP6+7oe!8sIX-^Q;w3nlmL2Hm#VS9+ch@zL= zdIfUeZSBsN+CbE;Vz-Y}x5o#6y(IC%d_i0Ffo)HFYTV%8+6(3sM9u>p(IDVe53TD;*mV zLw^weVjAYcTG@yb;XD3_B#9e|*mRIq%~f*Q{Ope6 za!om^j^^$}G99`89P^b|k;t{xk52996s&Aq?j)0!6yxqmFaV_lEFz5U95-U|;%F zCVWB^NlsoMk1|eocJnR^D05#40#!B3^xN+CUaipuGNy|r7)-Th^tD^s4)-I^SE`wp zMUi}^&(45!*YM!O<$?cSsRwVa2F*&7<3X!T{cih>S(;G+8nnJGinXgu@BGwY?`KeJk^$YMP7Kcu~rYeokZlQ>Img^qK zw9awgX+I#7ds=2d6ZV>v?u_p0j>;lPp`tgHfR6=A(^7HVRa@nm#L3xnc%rdNDgTkNvAMz#hLcV7~?(KIQ^OG`FSP3v`0Kt@`QGTAII zXV%wPY}9Ys-ed6URCo?uGfjaymyKroZ;*a_g8W9qhSlSL@x%#&!DIL$f=y5W-_dv2 zQY)!v(sFLli0GdH^|CSK2Sfr$UDXmuxY!Nd`)py{8^ZBi;k zjOb#BtX*nMVbls=#8Df_K7JQ%Bo10|hjU0}D<#rY^k9-pIgNCCN_G~1rj80Sh zP%=?RBE{+BSk5tjLX;NoC!UB0#K3?QVBn>qP-t&_UrY1QnNx1eo^=BYN+*McMwUo{ z7RgENxc^F-oaHD^O*wf?LUf+<5uakpOw~ZhsJOLsW-_Rw>GqPSMWCr!K~l_4zA9m^ z2kw+kM1~ET_oTS#+b2cF*a85H7&A<=0|xkCB3|>QxxPD3p)0r>+a6Er=8yl6njyS@ zz1cp>r*x7w`{u^+1}Lvc)a~8LZgu}J)#91KZl4o!3q13!RDIgrr_hELgTtoh^mtyR z98cF)s5M)yH<<2U!?j)1eqLO)ZfmvLW%C1N6s>OO!Hi#qgOJ_Fz|fJJ!oo}R;D3Y| z&lk$|Mi7aQ57@-JXA3~pz*G`>60@%uFaWRZeb`5h#s+S&_ly+U4%hB!zb3E8j7Ykv z8s(D@4H~yu+-)jIE@a{2zqHw?SZ^u{R(hF0G~@oHWV)g8Vzo>!I#j{^>do}J>-7`= z>VA1Zl*~NpUy6T|{cr@T#cDrKLp*--0Q=(*Q zb-cCjo0BYOx6!AoFE822`P^94Do0Xt*xepS^VZGYEVgFLM6!_xV?I3dPK%u_h*W(y zOCTx$lACvk`jfFIOR2R&%22iSHhI`haTE)jm1Y z+Wl8-(-~~x`5r{^9#a==VN-9FSu<+2VviL^6HNA$z{k4cYv_b+BrEK~by`lNyu}Vv zB1V%ZL5h96kbcyAGzu+eDsOYYczA7`JzwkD1}d%@-|p+#m}k3AvJ!zdD;ubpdex>^ zNBH|YfOBjLgpkdCd!g$!w^FrQ3wVI{pgG<|=Ks9B|37rSWl$Xb7yUT|g1d%5(BKvv zg1fuBySuv+T!Op1y9Rf6cXxNTpWp7kYG3U3%c+{4uIcXE-@f;A&S9z0aB8kO2UeEP zy3rR&nx25NO=NXJYrlEqR{wg5%Vq7NSsVg%HC&YCbn31#T9%gOFaaztzXLCKM@POT z&9I}fFe1H_N+W+Mc6TmAN1`F-@Z7#dDtJ(0HXBSvN?dkkv8Z)uUO<({NB8^68&mKl)#oK-12#4d|(KJWf@x|^TeEjG}r#?<>IqFTvd+F*MftF!z#^8Rz@h$fai_e$H+b!H@;NTdzIv~H#nq`j_jn;?o{nQm1)xppbs+| zN&Lb367TKh-gSL2gk9Hp*C5>7i4w5{na=F-FikAdAyZkv`yD43N2jyEa2@jbZ=ADS z(0;EJ;1^E;Ne$@>>~p>=TYIDYm_2>~pUu{G`36Ig9pW36Ff3%zs^=(A?#8DB!dY>R z9dRBcq;TXg8aeZm%8j4p)qlU9!p*ZPos^dJNOA#-&xke-NB3FgK3`f_B%@JdNO&lp z&*a>bAA2F`n8$@yp=QDJVlREsH>|+@vDL9WTWDK(lYzvY{+s6T*+kg$WgDtYxpL)x zlx{F;bVB%XEMk~HVY=Fj1H_E$yRK6srksyL?OzQS3qf0AZUh01{jN@nTez2JiX24= zft3hqW=z#htH6W2iei8trNcE^K*XB{snuJ~N^v5moO}ofeiXOsm}cH}BvhdPy|0jw zBj69mK+E<0YGqxhST87x5UCW2ir{^}YjC&~Q~dahfF0bsW}Zmwghg*ka1@SyE5xrS zhy9Wfz{JS+p!8yvfVA%NHM7;=uIDDG{$ap933_5zlu&>240`~4LH!3>HoCBRe7gXe8(eo@;;6ZXZB+$(VFuXM)m z&AA$fMeF_wab5A8RRU+i99VRC%wH7yG6e~p)bfVc8k5KdG4c~%ovY0*gPM$a{M8eh zh=?VBY4{3tW0M;D`l)Ivg_f1%Axi(O{eNT(`{O#@S930Ck2OHmOk%8JiWw|W6GHXQo?w7>M7dhtOQnvtRGRX?uqr5rEc>Q^;TBSj=zKU71)XCt z2E~?`zoQ#5^$mUduJ}`<7ewCY$ZiP!=()cSn#Zw}YQ08KeSbeL6Z!)ugWGjj35bi= z+f0X9DVe!$PB}KXX|5`~VFR2097PEE@sUv4=3A7Png1N28rfmG7YA3Wd8-uF5G`*` zienL~=17-cd9@;d0)0`*`w5R+sWb$et`jaXy2K5a`~93SB=|Xb|6QA$&y2*Tvq4U^ zo9WJB&gK-|DUpkhedK8#b21Qh$RxWkrBeVu7XQJG&VZ z5m z!N-=2tgcUWjqbR=R#nP;HzkC58Fzw1;2@VMk(EaKMgOg!?e^>L<(OhlVw{`BbVG7! z&l=Ikm$~;4W5RngBA?iAWS2<_jEe+xN$E$&6N326I9fiCwn$%$9k8P`k@#d&agG`b ztu9BHj=(R{PiJ9Dyo2fEfxI5!AJPk~N<3n^`@htQDkGPl;RzplfK(uwCsuI$$GFDc z2zP19L^V#H)HrG}L-QOw&4b?GUz+seN-jVW*=(zZvKWlyLJX6D5|A}gSB=&sjkX5~r+PEh2Blp5(^a9=A}f*9 z|4Y3m7onHX&s0hr#F!>K9KY7z@?V$Gk)AOKz~@KgJWG?xM<_~gzw*vn++_3q#4PP4 z)zzoRknviV_==5Sfce=Jg$VmFH@miEJo(W)h%O5CnD-+JcoX1bWL^usVs_@lHhu*E|q33Q{fGMl&FO^ zg^WP>Ph14S?Vp$(nb_iF&kbY^*DXh#Ne4NTORqW%DSep2*MPT6ul?Z2Py26_<674l zjK?dyl1yWmh15YrMG}ETX>-)AwX`qkdju!&UvtM0kN)?E{+&U;!tlT?`A0P5@H>Ei zRW~s^NLb#>1LX+qA3YVW4aqoz+_n&^E+kms+j!w)lsejss3PjnYfw_PO8}G!GlGcN zKTW;m5o}EZdz%&dL&xxLv$KI*PUJ1B!%ist*^}?Z@59mqf?iNRS zr15MiqWp5$y`KMA*chB2L7Fa)76yW5J% zq5rTRyw&LQidlUpoHlWg=% z|z4z$erDz(-__zhz7j)*0FWt>t0YiUr7TWYa&F#M2jJ47WJg>hYhvSw+-Ia$hin16R59h{ zZ+}tua9<+q7}P?+^v50{YrI7%ErQ=hDWOOAzQ@Hv3(X%Lie?DqWTvO+`hlE!pks{G zlxK*V4uTj36{b7phh>2$O->vi-)>88iY_q5@8A&=K$#ESCDy_wZj$d5RK9elmgK7qWXvU_J$DCoH^RCN#8Vjt>40+sCz)%-9?K1&DAc`{1}yrnFmX zS}wL+A6r8gHc0|21Kz?xl2B4qbnr}846R^Aj0FGl4ke`7WAh6cIQu2;exCLfbEvt8 z&P*PmDp%XJYi0KkS#~yA-&PG2kq^W^{ANKQJ>tP-45yBG;M(Vnwv_Y+xMZ{$gzpl% zw66zW-ts|c;Eae#o@SC%ujdfMcHB(aDenJ}()z*;?i`szOM#xK`Ac&`jE zUM;!EY-YR>9W}^ zNuf>J32dwcYpc~Z3 zgE|ePt~xnW&~}i^wNSFN$fR`cA$6;MoGWW+OX%M^|AOXG%;fr@Wg?ap9+qq_fY#{9 z*Fo)2!Q{qIY**`8#E}f2n%!9Nn@w45Ah7P~^+gw@O@}Ht{BxGAiomQ$WNQ&^UYh2M z)mPGgdwt}50L zLQ?zrcshQb1c$J9o$A9WV|mtyZk$`vq4H_3Oc*8}jnBt<9m(1daX6&*wkBK{Ch88t zGO;-ch7|!}6QOo>(yf{nEh5*C464n-!3fzi#4%3KBrGG zjEk6vYn2HmQ9fn>sXIQ~+1W&8FE$=)3`)31a(Jod`1W#OuVVO1QbaB>{Sx#&RIwqR ziG&ecS#*EbC7a6smAw({?h~ScL5b ziQ>RN3AK9s9R{r!TP~6Iq9A-u*%Ee^cc++%C82&+Pwaah6zMaQdP=Mcgq&IKP3g&y z2K+P<@k6@1HFs^X_)IhTV+knL6fPd4QybR!)&5A1xS`_QgNtq6D`E)WnguIN{O*#L z0g*FQVBhc>J`>Dmrd|>-fj`Q`CiUK3k$CVDBCe!e>t(8D!YPIf9t^?mPNvzH&}SkT z=lw%vmah`_?Jz%Am!m;OzvtWF?zQ0Gw(I5YejzlD>LW(T>hk==dRh1!*R|LkPwsW@ zpy5bIx1U&=K0#V4kQ=@|;g*s_g=^V-YFAXFpEom33OBX2mhb{95W``-6iH})=t{RW znPguG6C?qBX3L8a`InLO|7u*KHDyXoDqVrnA(243P|kq@*3Bws@(y(xE1 z19W89tFZsKbY6bse_%h>UNH4|k2Nrg=amicJ(C6bX>Im3z6dkjoQ^@)=;boW{Jd_% zFL4hPbQD~f`V|T2loZSKiPgo%K7=$GG7hvYEDtIP;8)qDy#AG?yCxVcDNmJ*@JN)X zkHOLl?QrEh5-S##ozNH0_1Omo;SExiC_g;LY-ZZZ-0}G@oF6wq1a3!CyDchI;!IeuN^ToN*v~gUe@`%^~Zn3{Mj@l zb^URw{q(oM;rH=G4Nj2q4F9!i#7dCV@a`@hj2N+oO+Mpt%ugJZOsYQ(M6TX(>GBnB zNTdj}1>IHrm70OvM}y&(&>+h@Y@?||Q9!E>)FaAu#TW3i?!XjRi4MNf#rh&7w&*N>`n|b9(ls8kmAUOFHr1Jm8uuQJhEs8T8Q{K|& zeQHX?6#p8FZ|6ig59@K(fepUqtv~ZJ1DO!@54jKFWNsCMK9!G7EI8 zQ55Bg$+7+z`4#eT-|(d387L0aeR`TW!zf?zx!<8U=-bZNBBtq^6w4Xhcz*`b!c?i3 zL=bTiH=t_`(DN{Ja!hhz2LPfO6*=65#4yW$-eIAvGQAgmZhxeZ1W%75CR8y5bSepy zh=4>%eK=wWw$^tLwm-1wMGi#%eiQ8ncX)76rOEAi6f;vXaFrwQpLt3uJmAu6K_$Li+Gls1Q=wX4_Tea|kRmD| z)cz3ngdA%ad0vTc^^|Hrboea=ODQH4X^KNtVK1WOy&6xTi*guW|KBq#c7jMxS}Bzb zW*8gE=Mx$A^(Bic8&N*_-{>{jB`=@s{wgl(3m&{=*zil7k~70YZ6VPS(f#C>*97;@ zdMoMQrb9~2=obv!Fe_gSB9IM@jDY(YP%b1{0i5~VC|BT7@266esB1X=U*o@QUhsf{ z5a1xBN}U-RuZM+9WBkRk7bu-QWt=tTZ}TX`$Ybvc*g6%B=NZa+T{IPa|u7YqPcB!K^Y%lR%6jhn*eHUcnBM0?o$ z%6s>)BLDlshE;;ehnlAOP=(yg50g8>Q75ZaBb^o9;TfX@WMT2y$+~j{dQ1LF>$o> zMbTyxTEj!(u?P0t|C21RI_ZiNpsqI)W+LLF_?f|aJ;;J1kzR+}tKt+sv#}>pYc<;4 z{(WuT%oBhYgh&>J2U8Ut?i!S9%ZcqtCPLFWN(m^M-CK(($7W|pl2#Z0khDdL$T6*` z52bU_yMczt*>XmGDfvzrd!-krc_avqAd%I))x6eC`3h3{O5dfb`JyNkcQAGED3lxi zM-zS85F-AK2uaWcZOKijA93JD4wlaxgZ@h7ouIVpMOiWnO5r!kM6jh0Do5t~VE*Xw zo_*B|`ZF7jdp8j%#zlH*lsbw!nm$+hFrN~u)1k~typS^c>=IToY;OWtu4?-jSKqqa z8sn@n^z@FYAy4R*`%fB-YTQJ$XtUED${%dxca1XMhk?69W4xIJ70FK^3Y+_nH%hFu zxE(*ae>NFYVtI@7&;L|(z|2GVzJt%r5p7S&&m}cPW$ks0z%7s-7-y2kD^sIH_Zv9J zQAK2o2`&b%!?}m^k1?{~T#ghck9o8d(42LhUvrJeh~+T<^Uuuu@~wFD zl-~FnRp>r{0gVbSc{{j9Ni~!v4NLiJ8aAv{3NhQ4S+~RV{|uuVHup{DK)#y~m-uW? z!!u-5xQQ{su?k`?={fwE<0o^xqH>SqL5+H?Qif@y&8k`J+?KRKDVJskl2Myo7lFlmjT^d9ihSqDf@q>(THwDRxvvfg3z<6QEAazl4q8r zW*(ifYMF>&PPSEy1l|^Z$uw&d_t#3P!90t5nO8vEE!bb3(w=!mqo< z#EK>Om1NA8H>Y=EuE(*<@Fb-)l@ycvm|QB6vQbZyDUe>6UXfIe6cZqb6`k{Zp?*O> zYsnl(5d)^U!#_dcBs(m+R#*-U2H6v8`p-)hg7!B7SyGN0F8YPkvhtdte{bl*Ykwy8 zI-soM2%#)F=uTYN@78M0Ba@0N+&iI(so_~G&-sU5xp!#j{Wr}rI2o#z=Vl1^W8lbk z`~MI_4CQSLgzQymemsi2&Q)ryev~v1FJt}xXc-=VtQ$*bv;*>nuPr*AH~!PY#$n%k zIhj|QtQd{fk`p(nQ|XOnI$YLK{`7;g^@CuYCq@#fxbF9KUsE@@)d2fxlMp10nAiPq zl0T$T&u4Ut^*;|lz9IN$&rTcZfMnzK?m{Shu0kW^%`lUrPxonxFi*IX-4uYCO~zH( zSRZ3Ikm5zIUElD*@jegAp5YGnxdByG@E~=u;q!uodE_W*QKoxP8P-{WeE?l+yFfDfL}_}nl{`?o>ZpMN@ry}?18HT0}5)=a!Ty+EjE}V{Hj~GUlz333uj8^KdgGOG*owChPaX z9$NxLu}8CQi|NO+%76&Osi*n1Z8Kh!t%~NHQQ+ce#pqyenCdU}%jD^2DS$$alL2~! znbVv#Y@KpIe6o^%U5GQlUXCnb^Yl1XTjOohKpO^T&L3;{ZC@izhlWFl2$U&p7Y`&`PN(262jNL~sh)wy_0CGHVN+hNsI1+#J!C1ONNK!^Xcp7f*1d%iB#(Z3!jKx} z@UqnjslF10F+35&E@1;O`2Lqq`eJ!drj{tsjs79cVQAfKc5<|5C-X}3*{rTh*oDO+ z>+kEyD61}SYZXVKJtuFf_FIby&YpQ28}^nsue1!D73p_o91}*Itw1hM(nOJ_8oieL zDW&klDFIrm%w^7cLGr9;D&d111dK3xYqn^z#;?VHo{ez)a(H-D6G0T!v9f{Z zO8!HLA3N8sDdh}zu#3ydXY2abMRnUQUzM5yi_yEk#SI$*#!|AtYJeleo1is|;2`x@ zYXU+zGfvncqs|afHo*z^+n2%7(A$uq$apGF3?W_hz--RzgAb)V1DZzjOwEd~$>yVF z2icRD##f(Au0fmZM$WvqjtZ|2fFJf|j9zb2h3azS{5>7#>)nFYDgd7#f*_H+%&(@3 zF4`V1CRo=UwN{;j;mcIY=*j+nR1=^nz>V-f4n(wTP`O-FtwMbs)90fOMnEL;;?WUM z-YDeVO8vk;eLR{%k)eBa7Rqp#^m2cy2JGy8IA7`jhb%*#6%Ysz9eF*^FAhXx@h1H) z&}{jPa(@KuxB+9chuKLEU^33L8|~wmske4@GwK6abw_!$v0BaS0fixr!{(!jO8Luw zj{LQBRL4UyL_nqpKb!`vXjeZ<4fC|*W0W9~X~n)J)-0`_dGTwv$khNFL_B!IAf;iyV$e$e^{kPOr&V4^fUZVSz+M zcMCSD7QUH;?*h+p_1fQq=ga1Yl;A_4+#S2NUrt}{@vGktvtAxgJpf{CmFVGO{n5zU z8USRB$6jWnkEbpMmRsCB9)o$Fgl0XIesmAEbLzSHV9GZ!e1F@k{wISt>xdJco;|A) z8Jwi^0USk+ddkN@wg7Q3qM47uDqykfNzZjSBk@sXbJ+#JDfd})?Sc$^$~ zfwR%?3#DqaX5uW)^*^Q=D~X8~WSegOrvw4SI1bw0_YL&BWWP~Sd>bE2jR+$HnDN}L zaf91G|AUS{U!DFtMHf+UEg9)=2fk1wjBDZ$6v{)ItxYN!^9Twk2I2|)&sS{&j)LER ziqDvp`Y+VCBR(|ksb{GP&~a+O0fp|M$>xs!4e&JRs^X>vN zyW|>JHyAX$yzY|{YvoTP;cGHdN~@aW6r5t((!7`NjCn!)R$>eVjlHTGMuPmrH7S~B z!N#cF!7rAY!PySk0~a}?!Ws|}lobQW_VF*=KGQDSZ-pitK>*@C2zXGgl?Zs~{H$>* zI|aV7yTWn~=&-;*t4*JRJnNsUHgun-%%im|)+?TuS}xk|!z3*Jc}4zKU(raVfcz+l zB&$_rUh)494shnpVD;e!!TTI!`Is#;SZci=Z)ZMs-A}ajeg7;d_oL5zoLAxSS^f%g zIGh9oXqL}6`#|tQy~(9^mhg12QEFH|;Jf_kd0jAXvG4^%zjdxEg^dydKhN}FwO(0!X+72U-p)eW*zAS!WhrI*GTe!@K3S?1C2G2l zkU*V^hC3?@4fk+QdaM88|S@dsBez6cZy{J*oc0LeY!RLudV3mB}&mqOsV-|1ub z0;Z7@Z10YgzYJn2Z%%7IO)kg5>8Qdzu1h^GlavHx0@(@_RV99czv%3O+J5Mbkdnzx=P+o}39aE;uwsl%4f)f22XRo*?L@5lyrLWo;Qf+_^Ncc?y>5mMk&Z6bD24C#+$o6 zbIu0lI`_uMh$R&~b*rIXtD*)6{qhx6)K1bnIjUkHi09Hw)pYLLV1PJ^(^lV5lw%dq zLK-DTB+*C?Ih*5YtwQ?cXL9eF0xt_D2_+^R0YjJN@jHvq z37DxE(&n>XQPwlYtJ6M)%2~}T9-hc3V#_(pYWsmw)tXC|7hZF3_&?ib;FGt#+AL+Y z!%UYC3+?A76Q5fPAQiBm=QB&k^K^By<@{llL!(pw_1tC6ZZI#(^;S-#eVMdUyRNWi zOWWhjuD4VP;{|udY4LL*v$bP)f}?5K_*B?0)OA;?t4U{Z&0%su!{#eUgKG3R5+&p_ix{yfYyszVv5Icg9`LLL>E_grvuwg&SehqPMhh%f z>ELVMQ2k!TP|@s@Z&}sHz1QPr*Ryfj`BOI3d3A62wCP>i zrsn6VMHRTO!vs%ODBfK*)PF}YeZ66nBGVmDdt!`+QrU8d$KhpG;VGgeKSbPQ1nW^H zl$AjXL9o^OVK~WUquOv%m}XsR#eg$GD=^t)b-v=HVYALeh_(sQc<*3{g)W3JSkx^l zbd~>LoVry!GmMPgSI`FgC)3n>rZQk&be{W1(eFrjbm#7<>TYgk>^vB15HltN;jegT ztItsIg^JGS@Y&7ZE1qdT@ZZ-ubX-VxwkA$#Kh_I$B$u(Q@f<*vEKC^!Z(?zbCK;i= z)4fTA4Sc^eV!&ajy60_NN{U<2Yg;XeI{Q@fC*P~tX7xQtqF^nXN?4$HZbuqYxeDeS zx2@4cIi8fjFHWl-24Sg*`(R-bz$Y{dA1w(ydC^rjWlxz@FUXpRF}#Itt6*yfw}z&^ zDCq2S;Vv)4nk9(!G$?4i-%^zFxQVfvSQw`&{-Ai8`j@QC1chK&{QIe0_J?QiGEvQ5 zZrVwZKZGJ+$dtf_3y)mF*u30|dCks9F=aC(nr8fcw$B*6r`fGWJ32TkiV~Nn$1aLUro)9BjYOey@1K66&(ykV#oO{C zLi-}yRf+f8k^t6HqDHv~>rL{o5#aLgcsa*zAIsL;$D7s4r6@aY@Mr=9RcM>}ZQFi> zM;^P~&LyWld=WCCLCNqwP|>++Kg_r)ndJOzfy(?ytom6=gdIO{43aZXmM0af&}gC1 zY(K4Rli})ZJ2JR8hl;bVt(K)w`xZ$6kzkJ2?yZsa6{E1%BvUhnjrX)E}0-r{l=L#@a0tu)dRca zfSl~{Z8*=L2!>+t^lhmt5QIW`itPWUxwE8@WB~p(4Z-4oM{%(^0UOQ=}0CxMQetY z5it4@$CK__jUJR0F9~{i-G){`iq8jXM~~O3eFr!8dl-dO5}*{PgtLtfUZoZ0YAF05 z35=`!JV)?2-;UzEY#78_+_VjtoY8mx0T20lUN;Go^)g11r0xE{Quv6ES34`+Zc?Sw z^^pt26JCjYZ2r-HsXcF8f2fImzO`JQiCDGndjG3oz3h@TNH$Wg(KOL1Fg7znRq46Z ziAb1Vz;`|x z)oEO{Zp(B&P`N#CdF=FHUA3H5RuXmbRlW!+O_a)l^5t^b^eRzzUp>2U6Y58^%g8AQKsg>ZZRd+eI@p}FqLdO-)d&Vao}3+Dl^SDT)h6E>pMF; z6C6BeC~fDkAfM;CqA%SvO>6qmJStd0KuX#Jz_WQ41u{_ac_vAC|A6-G8?QJ?$FMRY zA~@A1OS#|3S_Aguvfi=spgmCFdaFWJ^$V@s%Lvfr0)+#`3LOo_x?>(3?+Wr4C2%V6%jr zLOI*Bx-Ti|CQ+DaET-h!T>alByB;vTGw!$Lm2~-Y%vFdG+xBm$IHg~9zP+7YtS@A* z9+$~V^PF_GrG;+ZPrB)tG?X>??&YNjt0`qn4~7n8J%LQoOcK+(1tBX(DedKI^Py2l z_wi683wXD%qZ+=UgKR5nc%+Yj+5uF-@~Fbq`OH?G$QcE=6B%BKm!2ePw?&SPhutjA zhuKj&p9jXw>m!l(`O+KtrtJWzw;epS=qI#0j{l8$WI z)*K$Wf_widWPVVOI{bI@PHuQy*1QsfZQ*SGwy?9iMzUD&yx5~_Kbh)!ely{Iztwru z&l==G1aZ6fkY((5wR|9zsn~SPE0cNe?5b!w%>&WWFEujWupsE8)>EG{V>66eKFL7M zcE7!TT2Sbu=ZemN26m)J)?LPBX5B%i2j!!3hs)=CrY(^1f&}@rK)k8BPQAAqu2kFy zF8H>fwizZ>9V`4S+F?b?c85Xd)64VGd%Agda7)|ltCa!+s$Q*Z<2>@?NcY(es%YXJ zB9hse*x9anJ9u5NH3Z9!2ooSBto7BMrrK8Ahl6aXr1d*y(H`g5?)eU-WQx9jttwJS zMOr9mMH2r`mRi>My{$`WSZY-T2}OzObJ)2fMQjIV`Ce)qyJdj!gXtIQ=r}}YuRIag z0&P0k4YomORvnG&rG8-s>HN6-_T{C4zruqr8Dlxti_n=j`})qX#YPQ3{Yh5z-XlD_ zgzlLA1eOK!q^<$I%pWo7s_?x!k{5Gz%x|u&A$9-IBU2$``+R;u>B%R+Z_R;ipuQ>fYYGQ1s~R`K0NXl1dGxJP zp^a~Vf<~?ea{kE2!mJX?xuhc9LFzLlCh5=JP#0GRtexI~@Qbxv{l3xV<971%5Nj8j z^XB}L^X11S+vk~0m6pe+O4r9YaMLrUH5lKg3g~>)_HI1A0KnX7WyeJ|arDc$P30tJ zIWUv3HH;pH0##k>Ccx- z9qxB{Q1j)-E0Wi}#fJTp9=_|Pk7Y~$-$iYg^=tfh)w~xpZuhtNhs~~+xBYk?B#?@x z+dLeiHw@?}C!T#d`E1yb<_!I3{psy*RF;qo9A16){1xkgAUjG9M9T&hz;-#Q)b;R7s_=W z!T7mTBEz0Her*DJIy;nc2TIGsvy6}ZADYIeMVGE3cMR=Z5oTxKP>;On)xIKh5U3BP zsaBukOAkl%N7AX!>nix?iJFYpP5fos=Z8`m5TMj{Xj|yx_2{AfnyP{jlIJk_x#8oz z6`-^O70qS6zS2PFy5aD+`3M7?4yT<%Zl4h|pxb!5P{DCi+=TD6m-e}shkw5``1Z`a z_|__%0<%z|Rc0a-wj(wCWjNbCR@oU%Wov`+-~C2i&qmr+eu^#<5~(WZ{@g5aWUf%x z2lwamq{qg8tCex)#lkfMLP%?+>QRYvuJ6tj$1db*Ormv^l+zzP6G_;3&S6Bv_xG{6 z&N$3Ox0SbN_Rn&*Q~+5U=Jaj;>^i#4CEKoXqZqN6&4CqTSJrn=xJ+ZWpWK@-j##;F z)(X2#c2ylM|3#@g#oB=tj^r&HQGU}2qFc8CH+-Bv6=Lzao+U~i$K%)2R7$zYokfrw zX-w9B7=sUkpWJ>$fMg*W0|{sXMDpBszEA2<4jVMi?}ubrP|qr@ZFNa`vL|fkC4SDN zPk{p(XB^^a3f`A@+Pxjxc(R1%>O-6IArJp>)bb)>R4b{%u2*dw->0~D!}>IbuqgW~lJhSuVB&DL|4g=x1G$tc?WnNG|m#f3qw5 z*SXP@E0k#WG5OW0Sz+7zlO=BrTRP4|x=EEb2y`ZKe&rPBhauBU3&_74i+I&6&y z!NmFfjO1sMO$(jn{nT;WxbB>G$oUzxsQs8`IDPf?5&Ps$yuf1IdvBiKGI^*sIuug~ z9LdZ;59=!hr4PoBn%jvDmNbxE8BNpM1Z&qraBp<;S5qHeW&R@{TwGw+O>kG zy85Eu510Zed&c}a=JkS>4{#|#GO6De!P3|nE1;-~3Rq$pK8w&LUKM|>#A6@F)*xs1 z(~-sS*y$@{95gi8rRBSUhi+>;K#j5A zy&Y40ZL(EdNKnKS0t*e;j%lGw_na3a{mT|mOW!zlPf+mXbYGU@k3Gpmxw zpImD3y0m|)!ZS+ z5{V0jTTgr%KKzw(CVXY8kNGQ-*OCB_>zQ5B``Jw@7Z@6ueW(R~o;IvCk$3ap5_RLh zG$NEo5*EG`Xdnb+#|Ygq%aXr3=__kcbE41Q_*a8jHq$M`*go9woXN<(S7$0)b{(Pl z;OPakt{}05hdKq&v$5rdOn9&X)( zHqmXe%qfVw?Xge7z$5kdJ;+gpkwlQ~DI2R}*GhzjmiA+k&gVIGv8(1_F-aSYtnAeoVd4}o3*xjAbqq&3lyl#XDujP** zO@$T$DtB1&d4^Kh8$`36K}qV?s=h2}Plvif)2)9bQKhnv;32iOxtGDA|!M|%YBF**iK(^zJV!BjU|xPJ2cza zsb$U8E3~?Jxj^v!{~{aYOIcW6ZlH^+sCgsh>Ve0QDdCoxld1)F~FlS zXUoV&v)TtWWB5w0Uf*(DY80%aH?URFp4;+_?Z_dVbdn-dKwmL`xmj;FMvfAtY9e{e{<`Z#r<*L84;H$uRaET?wOuCLD5cX5ALm(_)lsW)23g2Y^O zcWSEcOMV=~KXvmxQK(UsRnzZSku)GYElGKyVsk$M(y?~tF5YP}h;PO^1Wmk$s;%D6 z1vSiPLUFaW3V1KxEmiZbZmb00Bg8Z?WUh7Ki(^~s4v)9TlVL1!5WA+XR-0w5;bX<3 zvZ?me2%9c4B?8n%(*kxfk*!s=QZ4Q7Bt+8D8#sUJ52R^{DcY+WP{X-y!HHSyQ1+Z% zVFba1635PqD)>j=FrD;vS~(S}1mO-t_*|Wc=%**SN-_~vr1cD-u%+onX) zbbgPI&s{+(q-Y_9uegc4Ux?DhFrYzi=SYkPGqp$5|3eutvvH{942@0&!wJ$ae zi9t2~c0D1iC{wNZW@hb)hY%u={bG@kh(Mo4&V&{H(1{u=R#Hqol1pyu%l7Ttv*NP) zB+Z07eO-y=TPG~fbXp}Bi(@TykkRVNzGdr1v)ee!VdA)>M5{SS&`3_+%x2@t!6TLM zo-Etr#OyoMx|FF*U7qtluR~!QjcV|hnd017zsHkncURaZqd2F-_?u;eyT`H_86t*J zKlr6x_mp^BesVP{2JeqZudBvp&L9o`j~wnCqAw>`2rXRD%A3~}J78OHsx}pF{locn zJB_m6WYw7hBx_D89L;(KR0)Ud-XWzZ2UQ(wP|PxMzGx1gX|~_&vC8J{?>vJ|-W#%l zsn%dhDEO0sdyC0g8lw`#jgYR;OUyK*@^C-2oHh^ihcArrTlz1N@>lKqesOXCJcNGI4A39DFmvYJ zn;NT7jl{ZQm$KTiOtFiY1M@Ow8;vf+hp~Z=i>T6={%u`0^p$yzTvghe^8;=z9EV^Izl{P{;01@z(u-;H5OWZiouDvX@tG1q(g*E-hvW149oVE20^u>qgoAfdLpp>&}fuaO+}u>INMEp`J2^zNp*Py7A+hpd6^CnC@=i+D3t3$oo1S3%-*Z;SU=& zNw5vd6iGB@(^u)_gSgY3$;J~VDT8jeO!&qdWM7mXX;hm|nvPd~l=wroFGHR_L#-rB z{R@FK{-JfTA<~+NUXYt@%l|v9Yec2iXX%WqWP58b8NZZuJ=n(9(&=U2lV0vF6mOZ@E5grimJmWgWXnLO|BI@343ezt zqII*3F59+k+qP}1yKKA5w#_bf*|uF>wp};h@0|1FW<>tWh};o-@440-Ym8^6QR#6*HL~OF@NK0(XcjbZSo2j>W8dij@B?k!n)0MYC*d{m_TSFZFc_QP5Ln{lwKW)rr z?|LeZWSZY9m4rvNq6LfTo6CYk*|y!&sv&y0vPoW!NG>!IO%(>{pauG^IiU>>i`zuq zQ{pWYNSQJp;AMrXDivH|XuuuDEWo%=xNoLnb5o<7SA#C8O`VnMHGaAIm_SlA^)_^P zv%32HIt4^(7>{8qbPD^?&?quK*=U|fFz-@mkA$or(F$wD3&-FoJBs&}8+y%8YT+y# z4H732|2$yrz|O}tek!^48E8b0GzcL8)bnJHw%gJCKv9M z8*~H?v70TYxJcq(Fmu6b9cZ?FVayDz8bX>ol{(0#SYfJ*^?UNsDIdS}P*@9`9c_%8 zeHwAtrBWd>JYLru_2OuF-fd9)$=Nw$&*KprS$xu;$m`5hfp%-fSkwd{VhS zbB;XKdRb0BA)(pvsuuE!U~?+N{Cpw~1Y2r`t||SwLg8@2@pUjqOzQ`( z&986*G{goKx96D_D43q^#gWk1;a+sMXKMJO20+A!mR5P4CPsK-*-greCd)Tv zT68o70@TrZ?5Ma0M!f~~cry}%nHhH?>z!b=T|P++H0crbVgudMd0KyQd7`_Lb|C@u z8eIlV0@j-xIJA8((gT}5P}O^0R8_>~jJ?N5b5?YkBr_p+W@nFVEWN5&SL}#Wz}(=F zWK1bt=aXVOJdN&1)D!@PrR|`DGwPPyZlEKXYM`Kj59LbO(kwA;+x9~Tf&NTml!I*a%Uf1?Esgjid?m9ejW#Y(;+lj8xxdp>PMjiuRbVJl z*jeKLc>&NGzDoX)UqHW6zR+Vq*kAl=ma5G7q)^Z%3AVR9s5br4+OM!QGu6$e2$3f+ z;0bx?R`R(>Du8%0u(Ffj-9z%nzn*{sdS6Awygi}fYkubZ-L+;TKoj43Af1)cMR$W`C?)r0b*)s5Fqf9qC#X7L1Fx8 zgN9fR16@QRKXW#JlmufdS}8+xprLO6;Lzm2YAtW9P;XihRjssfrzf$i)GdCF@toQQ zEB}M6l`1AKYzE|8cH_E=@&mS1fn{xzP2q)QY}V2S|wMJ#{it^K5Ens&DM86~}0{sPs5D8OW=&RnWDSpnOAi6t36(X&Pxe6|wCU zy_G-Fhinj|7*-^z`iCayLKL5;Xk}v28_c8-obmef$@Dl2Wdrg8m5^3n?6tG;gcB0A zLTB;8S`JdcQ=$|-)>Q8PW8_Q_k(Z++&o+nEvRkMBEMkm)YHeD9f}?x?o^wY1X|-Zz zfc`VIv7MH~LlRNR`D6Pm=8b15fBh^cJh#%L#{t#JB{}Rz-aI(T9gJjjcXn|~C=3x7 zh5h7i>s&v%SRN-}*IQxF8&qU4bgtitt6HT$dbodr?aojn{Y&O!U%+*T6*LvtTn3KT zZq)~7vu=vDw&z{AE7U6jFE9O z8iuy*v0nPF0BMCCq&9s#l5}Y>ZNKmP>Pb?iNMJzJdZK3p2X_Dy>s0XS+_L5BC3#to z(XVgQbSUlbE?TvIYDrVTxH6<*qlEPy#4I35i6}kfEVZ5K+{UMdbK#~oBwg5ns5=_a zm6k5M7in>f65{h53ka|?o3RZvB6Z)ATDe+VQp3iD2>F{cN&vFfBNu@>eUaO)>IE@|B_HL6*RcUyfK$U!?c2>sbWQ?y>P%wXVFcD zg%S!{)KMcv0BfyKp|cXRjMq==9%(j7NW!QpMsI11)lE50T@GY`AoR*4n#$3v8gk;o zio=jVF&PeH`UxAh`YjA>K(&DrN&Ae98j%x}vQ;D;EzBZ?)58yExZPoOwjNa&#%XK` zKv639)Lhr#&jP(uM%0@v9@j@A1S}TQOK05 zf=CD)qqbn*dR+5#4TdmVHn*x=df>8Uu#*Of$OFudVRpp7V@nm1<1xH`>SipTUc zQ7}b5P=jv{kLso4NZF`36j`y9I@htZW(&EtV^Kwl@&XSFX~wFlnDej+Km>SBBU#P4 zX!Kog>F(^}7H32=q_H;P{5$$~*&s`}Q)Pq;RZ*;oW)KV1dwtLY^aeku<;F&$3#BxQ z*~Oh|R&k+@#27LJmm-wxmMf7LTks2Z;xwQu6=owGnOW?Y|0R5S)^No5pekR2zYaQp z$Nyj&PS~yzUs0*OjeYDUikw*a6J8mNSYI?VFCmX{znK9KW8fOXD# zOr+ZN4>Jf{ReU1opGp|;bIDj$DjClidMmTD2qAOs>H?`YL=4^ z?EE+576<6S@Oc?G5hqrN@d>_aTbu@zm~d>7y>wzFcK3VOadi(k^aJtlxfK{WHQ6{M z0(4HBtjU?XQfj7J>wz`4SGAp&E+!Ynym|u)2xds=5gu|zF5o*GN2FztKMfS+c)@Bhe?jOT8y>h-gjq^}Ka(aJ4%WsVc z`yGQ2VtZ#!y|vGaQQQ|J{S($Fa7|usR)`mf7hak*&{{P!PJ(cwWCZ*=jEzf5v%|Qu zwPp*3F3%)}i7KRu0u2uq_9fZS9h8Tj9JZ-?4g;tGO*QGquuOzawu-R->*y=W;F*%wxTwS$ zDVCD)c(P|R5O6<)td5esj5r(kcyM+GK2ndFP@+bw{kSM#A#|O0ESM})wUe>c`+mJl z6g-YIqv5G{#n^`9Xrff2YHnm2j}2ISOAC2`zPOb*idpC zz8jc!e7neJ*Yr{@)ZOjkld=zU*RSk|D#GhY4-O{&h{D+agU2y_Zp8eq^U>af!cHo% z3c@8So1HB!#f6`^R?A*v#cZ9JKd4-2hQ89RCy(khs?o^vQJ>g>s?w|Iy-&%fElmA~ zC}xI8EwTNxYU!I$+HB>H=YH9Q-bUf8YG^v@McRwe(H7R4V)QWa=|E*%v6(zBMGi6? zZ}@vrMMksOs0X{$S@4Wj-L3%^@W3tz@Zl_#^#@^@nq6wDb_;89#bNbF+{ZzW5rMX6 zA}*N9dB(6D^mfgVQLvz`sy)0vypa}0O=^C%d`#-&TDH(A(+rnvq;3e5NovAIb$N@^ z;KUnE1UKv%zN$9RLzNlv%jH&2Q8oX63yry$EE@hKgnaE)(|gJ$3;7Or(&JJLULL&8 zDOz+04+PsILf%J>dz)!lKHB^2z5yn~)YYYZ{!uV3K7+P`aw!{z>RpgNKAmx_ClRJM zt7g1unUz*Sb;D1okE%$f*OcffP!eTHst)Ps6bL7wJuVTJz#%sW9cW9d6%w;=Yf*hl zhR4!mIY#juqvJxadquIwv8!p|fVduMb!>{Yi(lG_DI53nl&3>BmK;lZCUMBQXmaC? zmqym5lNvDiIgELjcg))AO}w4>We}~IoPmTHuHaZxhvGHC&4S=c)kwu4oj(0 zI6bN7%3hX}rM*%4?Kh(_uyYE;SK{WKM>Ymg4dI(C#N1wtSw#zM*m8yq6uh=enFofN z2g;*iuv^#}R8Ne1*@Z2b9+WeiPSDw^dz&BF5iA?ljK&@b8xb64j3E3=Z)|a%=bL?8 zu9HlSEBsG=fluex#0|<7`M=B1B9vZIKDlV#tMMw)guPPVfMQV=L?Uya3@~B_MC4Py zU8duhDsU>to)O~fksc^IU^SkMZjj4bt%5)q3k`Kf-8OZS&WzwBwMPIPbS?(Me{4_rOY*bA*^c=>EAH;Cz|WdwLgjtbX^7=`CEBY>Yc;Br0-N zdI+gi<{4>fgKL>sG$chwa~V?;Lpd*udS%O3<$hflgE*Z~%@>Dh5`P_P*4Cx|M!!SkMXmH{a$4oGzlQ!lZir%kVbB2gvj+#Sq zq&t&`Y{XEFh5gds5G_A zMWFq!>%O)Bs8pcfh3e|fOGlv@0YXIFF4X1?8pm3PWZzyF-e&c5q8sY~W_>3_>(Gz*Aw(Ty6}` z`*7`}jxOrA71MuA5Ori`2&+ zWqUodE16UX065)v&^U^o6#LZG`~q1y6j0r)C^Hv!B}h3MoQhrX9iLhtOKv3x>2p)r zYh{jXyl-9D^%kr|eYot10)%$Dxw)9Y(tjlL=ikyp2jD*Wj%OPzmK9n;r{fDF^Ev8ah*95VDaewW0ncX*uA z%>G)QJKDH-IXS-i>|jNP`f2d<_L||-qzlh8{O8@f?h-eBNao;k*WT5XmVKuDHRPJU zwk;@k|2o1SXhH2$6noOU;d~1ZyTz(rqt9frx^GgkWnW!BC@$zp8Le~q-ynt?uQi@a zv#EHIRh1?6wGn*ggu*j@iWIMr?r%hr+BxkUJ!o2T*^RoCsQ3<(c`9PbpIJRuZ&M~| zTH5;ANmp3di^dtbi|}Op@)4Dkzkr6T$3DwT^8nU2ow{_hzrYt4oDEB3#UTJBu}nBt zIa(%&zDZLu4L)PeSUD5AMN=n*DhkK9_P5uAr?wIzP%ButEA$M$^r|d3FDh2ZRNB`~ zNL(P)dBnbZjm1DD!&eMOT{XvL#-G&Z0|XSOdTqq?#(#u-P(+Z%y)*emhqZOHHA$}2 z70Pgo*r0j;+G8^r4%uU5ELT}sMTkvwC!gH|#cH%Z3?1*&b_A3Zb4ezdd%vG-h-TZL zj{a-UcW<@`#SohS`AS#X);61BQ;vNy8Wbg~%xgsg{TVrYrznbQIvY;Sn}}m#l72$b z07p41-Ga_py8Tw=h`Pj^$6Nc?sCf(w;C%bFq%3GU8#In&_SF)BRcI?KaPGFe3MD-M+IqzaSozI47mD2 zPS+67^Kz#C!}6Jd(Rd=mpM_g|Wgkr49_KGhROC{!yF+}9xlW2WbpBZiOQ3P4zA4I< zlzR{^l&OueQkjZ6)gY-#ayR|Oj|08XkwU<=ZKYI?V@kw@#wXui4bgmtY~XWsX}|26tK z*l0<0MJa{qi&iyq>Wt=Nz*`s*M%aI(GN_3f+kj6;eo!zHwaV`T;76$N{vy?RKUl_C z^AcxH5QmD{9xGK!wYI@g~>_2T53L+j?)W+t?ZPbd1cbq z`y;W6qKZu?blOc=X@DY}a9GtdtfKd%LHaI}hg5cz!X0dO4V z8`x2-I)`OS>cDh!eJL)DX(PRGa+ObgY7(3*3fd4uLHpcSS%lcB>56?phM?a4!?h%2 zU$j(Hut6=U=6?M{&%PNp`8> z*h_0=P5=a5T$p^%i3uy;_sg#7^Ce*wDpkv$)G=Vi{5)dWFsWZVX13dBHq|{1oY_wU z;}Xl%9Bj+OOijB4&*} zH(6LiaGHyVQ-x2l9<=50;}xn~-=$+3^*YtBIraAp+<8418n1i+bVt;eA*zk|9>M)a zZ&+=Auz{dK%oiIw*o}>NMnnqcIYof%UA;xU?k|k4JFex|aLL}~jfU~o3&%Z3Jh`DU zzB46i4MI28PF_#Y5(_zg|GGHQWAM>e==QYLMF;FoxPMKZ$E1)Yj9wfM$ z)r`$|7tUJOVgFkyF z_9-3@B4}hr+%V$u`)Ww3Z)-UliEc}O&HPPr&&iqoF-xS`o$4cP?Z6Q^Ck=;nNN zo>bDrghc9(45>C9gzdm0hML>Z{72rHcbrVeN+%PURvGolq=(cpJ`ttNgjqga)&VB7 zt!OQ}@oY7>Z0jG3`iHumvY02cNhaXw(we7>WCF5b*1h2;g~VR3TA*UwMZ| zQO9B42-6bY5G6M6IA|-+R{hfWl6?TnrWEpMs`KCRvhlkL2+`kqanmXOu`MlqbN+NRbzj4DN{;=&!v{x7E1Fp8!grP3RW?PE@|yUu&MdqHr4+=gvug?nW-JB z9{hW)Tez!Xx~tJ3=Fea?pjdIE|BzJvv&6Sb>K3EFM2)&>i0OZ*5bW^7XD$Ewf3WHWa!(D}I!yCW zaP9L3N@kJtV*Cj`FIzIv(dztnZ~>2i{29p3S%Ar;O7WHrsmivhTn-)WWuFqP0PA`Y z+P>(7UbkL!7DPfmJ$5VH9O>-7d5d%_)M1w%S{kmkf;@3lp2Q*4)U1VVJfjIt9(n!J z))ENV=kik*t{tH@4^(dFPtHacwW{8aBBJhs4#Hiq8GnWZ&7u?)*s5=n4qBMv4g&@_ zWs^*N^K&_7Z-wpxQymZ;<$>A1Lmz$_6vz@fp@HiY$E#&#*SY6<9rZpW1~8acc$mg9 z9KBf2Zlkueq`kcGpTlnYsA?l?={cI%-dFS?zlXvPSg{ zP;cW`^S~2P6TbcGDWdtRDR&@m6y!{GVakb85dO;PN10d_oI$2*bvw)sxg{;!-&{f=^f%rPspRyRt6xe zaTcU+jI~n$NYib}v#EgX4qJnDTS-3BqXS)jYbjXt9YuqZJGk27uORzM8@W<=vkoNe z`hp>>{$0^*5|c3-sE2nrT5?EDS}O*76>})>z z#b)<^ZTUWe8|W{PL>O#o+iiGk@;Ie3p_t(%Ly%Dyv9gY!Gf>YQ z3}OWspHA+>g#I%&d7W7kSXIiFu02m*oW-1~bk=x;@jbcjwnylXZvKEdSW6-$zCFoZ z?HQx|Kq#d+nhe+}VA=$ZB@At0z`{rk`0g_+u@i%;mEMaH4)T1W00$ZKRFUUaJ*Ogy zsEuf1w<0Y;8*0+34CO_qtWOGaF9?81(zwkdd*8sjZgMRsuQq>zB?WjUp)5(I9-ze5 zVqN~4UCmEV>vaqHefUc{{UAm3m77gWvbJWYd{_?E0=i#GXRt7=dXyH)wB?CMb{dk! z#GFh2^!Mjw=M{-+v-CJ-1xJi1Kk z3~kw*=$4U{Obtg63fcZLmay2}`{{dFGfO30+lQRnN_9G-+!DQSUgD1Q%g1KbrY(OV2OsZ zQ96!s6f4ABsDG2=gml&|Ib(Hu1cJL~N7fbStc_wP5705)YJm-vh122cw0LiT`U&ovSxfAH@T z8+k~%DE#3dWzy47z6w-66(k^z9Y>k&iF{#Q}?5i;*8DTQH9_q zbI0%@UVsjuim6kYjQ!;i_xm^?8GoH?p3O)B5_@5uO}esgwi%YabZX;*8*VJj4W>)d zN8%5JxN~@E&w>US8O@Md(o3;L#qzL8YdTa6>O+$6MKuHBL(vpUJXW_8r>oM2%16^H z5x#V-6dWeW?Uo(v#fkztG|QNq0j<(yef|Tl`GAT3u}<;& zA`G5hrv(p`Nu}(HXp4hZ3(+49pJjC82VFl@ZH1Dy6C-&M6h960c8|&JBIBC^eddKm zZWOrS`R9R|s2?OOrsrC}COPmX*ujx9{?(r@e;pZ^9r+I)j;HMTu7x&ZQ-}vfztY)g zpOuqp6>p-&UO2W$494Cd!$_+9NM9pzO3a>g*OoIiHy|2exEM#;uercPqT*pVT*LkQ>)U z))XJ4aS#;ozYUia^im2DQL1dEBvPhzh@{BXFca&6cI#U>3x83tkkU><9uNKBD zn+XIC2h;qf+VE*CXmSJ~~dx zEdD*7ravM#*7qHvY=UAw5c`&XuBwfY#gVM#EuPs=CScqD!YN1hdt+a_k!*pi@geGfYt=7ff zB6qn__idI4Z2g?^UXPTGV!b1E3`B1z9UH%6QN3(}OrLmrco~ zP(&NhqN$nSc;F3jE=~NpESv@UWeZu5%bnbKekB$15~yO zQ{ip*Ty>rl>h4|RTa6}6au&?*}zms;+)C|NZuoCFhMBdv{}XnXp6ir zvOB6aG$Mj*8oC4HAR^T6kl1Fr;dY(GQFVP0)HIC=d0k50Nt^Jq5?YW7)yW3^!p4f6 zYGs|)epHN&qB1dY4(uedpz1l0D|LTk3hZ9bCLwWC{vHD&v25wLx0;^mVt@_Vdmq2&zXN1u*7BP6Y$~+s_4<~h)nZxy#dSqref9F89D)D5T z*-Yqm@V3D!Fiijmywf+GcvE9j9oKD&bndSYlviOjq=y< zLxR9V4ZMZ=iABKo;O#+j6N}wJS|%X?^3BKIl=SoCu%^DFTpH-C|5MXunGPhNG8=_T2@?z&xv5z*kz%IT>t#b2sr0dOBlKB+1qllFX%&od3p3H1y zj4+=|&jCAWrnqhT_hhyqZ@`CN&yHpCfnlO}8Dt>$c*dM_jFd843Y-edpA>$qMJj-_ zSPEnIV5AtmiUL64dGWW)ip|Ju>Kuy~%7ssGE7vpw&&q{v8|iTBW#$fNkH&SCao|wN zvL3iS@9Wb)&lQqI>NV&VX)Uu<6X1C+E5PO$Lru@X)*sS>aA(qe>>XU0Ik8ucQK`yv zFUe3`Je^f&YN4&}2Zya&&uE<|+C1yV>tZk_-=su0jtT)$E^?`k<$p~_nvyPOmmJJ; z48EOi2AGH@VHy++|M+n=e4PCgZ2f)$YsUU_$$-YLZUqqVwhoUK6L!&7tAZ#cGJ3&M zx*V-7QKV43Qvrl^nsV$yQ@0)dN(kx#? zWK;4YygKfq!($4jIIw$|k>q4Py{X8_~U(YWl+_mo2 zD$>drNu9PQV_suJgQ2V4WX$b$UdrH5^Z$jYY$5J+H5@Uc?u2bF62dCcSGi|=)#Xfm zuI|~S%YiG53i%ktabF5%So|&>rSJI4G^;^E$UeW8O;5&eSMtm8RYX&!%t>L!P*GP! z!>)8~9V>EDH#I7OYCKTu?=V>H4GW zuhC(0tU%H2V;734&_qAjx{Ye^LX{b%mC%QHXTYvvbhKu*o6BIshSmP5G@jCLrZR1M z)Y7y)J29$))KniUYfzbb%;hI(qXhM2m~Ka2DdE_ba5UwaVyn?F7ko`mOWv=0(?C*% zo0rUEY`n3xjW=znB|Y12JAEbbC)_T*+g1NLS1qgu%Qs|< zC%I`LQ7b`$P*Bu{p&jd8zTIEufY}R2_o%)q`ZEbxlK|$RunXevH54;>6w8wpn@J4K zyOw6^dUoOyrRFaRT6!E;Y3cB^%Nl^+m|;Z)XcntN9oD*8`(OcDSPQ9Sae#{O>iYs7 zD6I#x#jumzuKbajzSHFDS)*KLWuag8k?cL35zNU?i-)P;HUo1MxioW{5Kk)~8dNZJ zl0-K|qraXK*2-vVsl&?zKHC7G%%!_9K=3r{OZfeg<=Fl&=-RM(vGt)DoNWqWHeAMf zUFrjM%P@`@scTC|KI3MX%WESF_GcM43J&d3#{Ous0|4=2Q-iBlWAG~$49bp|Uqj!- z{N6khx)D-O>;-GXqDr|GN5Cd0n~pUKPn_r(1$pf}U0U_bh!l0UgFZT-Vc)WlzJ~zO zbtXT};Yt&gx58tTNm~sf39c1bp$%UT|g;qKR~EDK+bZu9@BF zfNDL@4Sv$d|D&UWXeLIL%Z`mzDx&eej4{l={I$gaIY+A*qR&^wTU|-i1eF&8LUp(F zv6w#8uk#Q>)`vhf`fxjXBkE$&JWp7`AY2ljsbQU)LjF#Nm0d zrGLaXDk><^dFq$)%3fXHY4|y}9b2}+5TO-Ol*zA9L^e**I4TywOpsX1p2v%gd0=fm zZ#Vjo{UIt%kR1333`)Qng*E>Iy@c4IDeKt#laKf#lRVCXEpmG$CZrNHJ-6= zdA&=jOq=oeHpuT`LHK+U2Y{wpzFgz#_zzkiihK0SR`$`a;%bkK4(77?#8^%ZWtXJ$ zQN@xSP9+G_pkv>lvIjW_1!3XDn4ME++`mX?X#*E3X9M@$NhpqAZAuE>f?OOT?VAkl z#v)w^7`RVRy)0>fU2>I5&l2ntw|l%v6k<^~9q-4^;VD5ceBC-lS?}JlNTfz_Me67= z2yRSFThdyS=j+>xocy&ro$s;bjl=euHvvVT{%?$WDvY(X#6do#h}c7dwd3yN;lspvA!+bZk*gvYC5Jz0ng~BS>2Md424=Zq;ws7Y z{J#M4KZzBMvPIZnJP(Ri@P8#DMMk*`#aXz#24TMn9{Dgk=YgZE@m6$@lbME*kk71v zD_xiS5{pd@QD66zZ;wl<9w+l8VdDO^&Ss^+9>S~=@621s0fb*v|UL6>X(t9q05a#elPxxjZvxRtZhrW@T1Nqo@wyVv}S!$cTFJ+G36^ z?4UewJ&b&B*8GU7?5H6ZwGi#FU0b%ssDGEKs=_0ep@A*LJ%e1icy1(#I$SQgZ*xJc zJc=o7V2>ipLFGR?7MD{^OvHzf+qC9|T5In8D86Uy7kNGqMLh1pg@X__z*G0RiqaBC z)|5RK*XktUNMtOH^vf(GZ73OmJZoZjLNg3A8aOsPAX0y3e!*v6t#&tk&7HpI14y0z zviS!juS_=O-af2Zfd|z29pD;%4s%+R)&l#hzhDo|w{wRkpX3|tMm}H*ZMw3!{A;S= z_U76LuTY}I29-#bCbdG*^#A}n-c9wdGySqPJT^(tF7&&8$io%4K{3bxDr=33Y2^Zp zEJ>snVK9vsMp$wtGueuW7(ivmrBlQo91UKkTL-xr*%~t2Wu+R~y<`2trVk!k!wAu| zb40agz`mZ*ww81%qk{3C#a&&Q)$w({;G(?5Jl0A>-=_xAy;|mnxdZeUa3X{jZ25*FLVp-r>=HSIrQaBNOIp&;nmmpABA9pA{Quz~{4X|M&#s z`x|zdx?PrI>)JoTzb~4C?_)q3NFvozEWu-$eAy%Ool_+Ojy z+CN4x^FG#QE*^HFEO`#4-><*d6my*BUXMTa8wm}arq{l`9y(h$T_$MGi%|u;f!Diz zcQo+dH4C=C6q@dQZ%=V<&@Ddh+UXaLfA>~qBc(eziWtSD)`K;(2+V<)Y?bOlS;>F) zGyP0nBiSM&e)AwU#oT{3sDT+h6!hR@*$-}h?7@ED&kB^o zJl=GjdGe9_(X~y37yCHtyX{7T^M@=g%+m;JIsIP*F$;Z#FA7mx6A%#BcX4WyG@4>a zcGi?mS~sKe{@1Oq>448SjJ{(`w6~D4h1l4!+s|R&eE~|c5RKOb*{&aFDE%?*+C5Rp$GP9)rhIi#Gh(u97_ zHimx!=MS=Z{Z0x(r1st)N|KgOzH-?LLUo&A$+`|ZBJB9=66k?$@Y`O{Qrmjz8l%X9 z3m4_Z9?jTl{u<KGl@T2ej~>UJg>Bd?>vBNAZrJ>Dt)vkDF}QA{eak*`+kU9ven3QSwH36thWKi z^#K7Xng*}HAN;+65`;Dv-Gys^k5N6v1DW?wsClxig;ot)-O*S#||)gpI2khWYHwg>3eYg#k@cq@BgvQ%m31c>GxfT zD(F9t4}`bfL>v5C#WfhgM(_d>6$GBU*sE6f?oSoH=YHf7o_VRZGAREe)k;AHMZH=A zC&+ExYu&hhxlZcY<>?(WeAyf`9K8fk#xH>s4(FN22#VksW;wrMcY)ogI2xC9xCbn= zZRZ&B%V*vZ7C8QbUuolhupU;94G*JOWl4xw)QmcO>jX#dMj0aC$J6W&@iJ5ulE`+M z#j=L4D0u+W>fqjwo9nH5f>gIISH1+(nD?ykoL{|;TBU7*?+t;Ztn^YwA1~{Km7F=t z)IMRV&d>ZUz22r;m37t5Tv@PDn_M-t2sS`5S(Z&r#jqlBoGYXb0|vq!-ATS_Cx%YM zWwC-{f1fEYdQA%9S}}KG@mqY6aa^G1??*BO=!J5~?5?$? z?_WQzGM?zIqiZnUTO4RR&TRsf2(Zx1PS zrb_2Z;}a~+LFIZ3)VVOs!D)8&Sl|;J6S1T>V1Ox!fl%uj`3Z>q$KekF?Rq%@3E?_q zg!$K`fhr0Gs4qK>Ue%b?b-C`c_{$Tvp#d_WgW$VBOhhGlAv|faQ!-%*JRr?;3~KDC z5_|%$GP$OY1UrgmQN$sn(fzdN$D?#28i})Br!=(D$S_KCIovYG(eaqQZi2s0JfQ@R zfwUFEkGr1s<6Q6mYG3p;@3Eu7SEH$*&&PVp`QM*?q5hwnV0mpjeq}kHM_=!kKLD0_ z-VUY}&BH*dMqqnhIo0^kkT{_2v^4AMp!<5qentQ5tsQE+$K%q!>-p1W4fXr|{`$KP zQJWiZlQiM?_TRVbnC}=^foHgZxTt-`uV>YXM!pC2y4S~+mCucykNarDm!RS5Nw1uj z*QD+5KGPcPNEINxaL@a)|-{){+i?HvazGU)S~bT$UH)@7DWyP00V0zfs3?y{%iP z9;5ls#n#kf@Ryze7c%)zHxF7VKSmp-RV(G;ip(W3AM5&oR4^3-Qru>IdF?6&bMA8w zs#tS$L~*9AS{1We2W6TAviok%+cOA*M%3yHBXw`aSl_$0(Bl$=2_g;OP2e+>)1 zN(2GK|IQr~;LO*fmc*=M$rbuLnr7JNW64v*l>xn0X26IHGgeT05Zu}En!Da`DFJSU zZ~_$uC<)`7{5stbOmn1MT}1O7`u(^}w;xFujR?o$cwv=z$6p`*$|=&T`8I>3!nRN} zM4?Zs0zJCPM-P5`F<@uG!}0Gwlv+d^kWHrl26o+iI?a3S^SHF)0~|d54SdoG>c3GH zc<(1EuX+Rl*}l`Bu_g1VKK~XOFFPg}mX5D|p0fwy`Dl7DKDNSuG)qM%Anj}b>Glms zUHKm)^1kP1pm+wVcE%$Q5UsgqK_HCNFI_QwqG zw>L%rLQGFD=9Mxe93Go_a)vSg z8zlAQVk_<_HDZmr(T-jBwr2jMSY@0gd8sis(yClE5)v^zt#aVxH&$&JF|K=C@+m*@ zMBS-KYh^pMb@mFns^A%}@)$IT7^i3a;PjfH>h2xgf~RxZhY2ql(AEGL7<`w>2@@p_ zBpt?2KCw~OI+^9F)Op>RP6Av|aOg%$gL08fN>-YUh^QgZ2(>kS`&G6D)LHZ`Ajs5E z;J^*@7^&Kz8xr7m6HK`6z2p0Sbsv)B;dSHCdF3*cqFJNUGEVFMcKWg3REY*i-?5Tg zoo+eDiPO}@S#r(GAdnp&t30Xgyb^efVSRZNZZ&{mtyEExj0ZoF(Jp6;&Cu~W5hb|G z_5WV!GrCEs^Zg7L>@XX8+Q5HIB@F|+CI=%=u~}>F2)Rw2AO3S=Oyq=@X%4kZUBe@! zRjFI_(41|ZEstZGz?c9M;Bea>o7$gq$p-p0sXzED%Cv-bF@NHHGhMF^60{PDP>naJ zo~t!YLl_naHqbT@Hp>Sf{#%HPJ@z89fN&?@Mbv;5`q`FZ_E*Bob>5EPkQO%+u-Qnd zSNzv4ZMVHar^qgU{T?n|RYr`=TT1W6hHLns&sC12YOoi7KOKT*aHS+p&BF z>UFW$u0^gS8<4W&Z;kuiiwn}{KJ>hv1Rx%} zh)*Rz^=z#Ar_@jr7VNo3Ncq=Z!s~Kio#uvqMWa4u#4c4CKfym&RaaX?ha&>S@-)V? zX34jSrf!~Aq#-$}D?aQ?y;f{Yj+j4V;*mGB^4X~gx!_aKKLmJ$m{)>bgH{xS-e_b@ zt9}cHcPz<$i0MbLNQli@@?s8^o;E7eFA4es%$8hT@%C{}EFAf>~UV&g*P=J`v=5~CAzz%Soe`b8^W6ga^^Z%~w0Sma!{aH)*NM3>l0CGx(6g6o{-6Enk?6IYII)#^fEd+{b4M+RN94uu>Wuv#wZt;GLc}G}1=M0F1aFEYHtlY+qI~(A?&FTbo%h~Xb z`|MKxi=^OqD$Yo_>>|ihyya9q7!%0B=Zjr-ih?2+u z#E3Vt@ZFvoQ%=pr$1LxTGHqEdhNs9^ar)HF8ZvIE?4n=CG>S4ykG4?m_z<6H zDILb_C&YBt0lq=qG%Jkerb37?lPj5=pqTZAvR5rca!t0|o*Vrt*PUM`Dl18&!%=6H zNCr(352ejYXOfMju1fTbea!m89T6~JI#(|6a-moy3xaHO($ww&7XE|O$XVXtI!}Ur zo~jz-)~&@vrpZUIx;%3Q7uw`8&g77Rjdr4tN=|6KXa<*59x8wW5HRw!mY3rk^^Uy% zA2lpRQ}6ZB(eJ$1@_R{Bk@ufunjQ-t!t+JzqY=L^V83n zDiqDFU#1<4?*D(tA8lRN-LkI3=S!Kumem1}((H2W`)uFvdh}nvkE>DBu^&aN$bT^D zmiY7UWqF@b{R9IdRKS*p=S%1IEeC+>lh*KasZPV-*BoN5Tklui_atRq*IOp#)wR%Y zmg8UU)Fmy(6qJ(Mj<+-5CAR~m1)mSn5kt>M^(Tx7Hhs@Wb|AHE!z7yCz-zP*`0o>m z;g;Q7a|`ZMOBo$HSl=H#ttAv!qNE-l2sa*LT$ht|lh#m10(vBwmb0z&^dnJ96BOxI z_+@@GVI2+G_GzU4Rcoci@1uUpsH1R!Nfg%bcGd}hqOMIF@~7k_H^S)1(obNJv6QFo zf0QhJ8u4{kx`1)R=mU43{gBbRTT1=c5G=!o9T|}J7mNEhO5-S3)TC2`D z917P)g&{vdq?MMvEPQ}0efrG$fOMMwp{G7gfzHp&Z<&XRsys}PIwwolo`$`q=o_o= zrKc*a911Psss^-5F?{>~jvr{vrB52VK$+K4pN}~eAPk4Le^e@3Z`+*>UN4q`)}K5s zk$b+sik@8UpGQ5^nf#&jdr=cEv2s2(a*fs}HsOTG;YD*}oqg$%eVy_UFIoU&TDH~? zt?V5_1agvl#jXYhIoHc@o%k}#-I#dv40Q%h{3TWTmV7%NkK_?(P3=O4sD{*0P5Llv z9Y?&FtaJ^|=sK@w%ch%LWpY6yPSXQhSxDC}cRODq z^jcW21@)P)#}ldUcghHYmy6!^?VhheVi1S(sq?Z!4k`dAMnYp;(5++d|GWSb zuLr+9HP`T2y^rTc3BFis7jTq#o5#J+g}cuKKuA#GuSO~1tNMhGAuGkn+d&Y;(`86+ z+kc9)*Z(|8iool|#OULw)kW5;gXlg(>DSBZq$-Gvn6WSH9;|CI^MWC`-;Sbmvx)D$ zk1&G&JqrlK^I{P}K;RyTu}3Jv{u$ab(tCemCWKBq?Dz8LLNXI?Sp4fyVWJGVdO-76 zcEw?asP3hmG*3wM56#_d##?ksBa_%>ZAV*6K-5aK;ThiJij2XQr&9)YAuN%|s&``8!E-M)K_*toNrcm##RClk; zY~91L${LOyW~E@qDzntTi-z9>sKNA<)JkykXF_5BpAnJ-G!gcOIzY>Mlia-=bo-?l zw5e3LOQ@t;@P0#f;vwN@Eu=lNl;el|qwu>=dBeu*=4c^MA?-1}SQ#pSx*#hf5j$hF z0y@YrW)@@Ej*7^0RO7@uhvVA6M*n(PP{e%pxNtuxA(x9}KuX|@RnC4eTx8v@`;l0) zwx)DKtLuXD>!GC;1ZGa}IwSsM%~@2Vn(9S)L!MQ`P_PkaD~X%ZSBc=89%npLSk2_3 zu}HEfUk%@QQG$1_uZ`xa)ptZuIPyAK_+qP%bQVBXJG4p}!=2H|}q6^86S9zusDj6PBR7V&J+f_&pWOFnNHKA25IXzoK+V zdCU;q|2k<}EB7Q{_4>}NA~MY>(njZqDv_%Ql=VDd+?xy{K)aR}dHO%Z!^Y@`E-E8U zt5vx9NwnF3z#~SmZAj%BwMjs~?xpCvi703Pfm~c|bXUbPZ>|w}>6<7uuKyhuoVG(5icdl4JBxtAdy-FI(*>fP3OIj# zfbFbX1+f?ptL0nDd`@ROf zX?IRVDT{Ru|Aw5YLZpg*`|a$SvEmql15_;G`*i%}@E5oT74iJ+tF%dy6$Wdkgy4z(SDJ|5jj|fQ4x*NHoXRQ393n{MrPCy62%!8=Ty18F$7IS z7x)<3#|lYu96-7-nOL4gue_rPu@wBG($5yv=QTLS;`m(AYYv2>%QrJYi`7A`4SV(a zr>eNQcuKqUy6SLBv|y2DgVod0Wd5D(?=(h#L(p;*EKHlRqc1jxYbZ;Xdr?;AcmoXx zIt2=70kALBr(&pH`vYBYaT1hy^+@Do5J}cD2qkM{`GGo%0*~OVwRX)L91Xl%R9Gzy zaa)ymkRje)>IE~bkAn7gAUjY>!MXqa`rB3Ke|YXqbCX?<-nWnR8J_)AHKoc15bM=j z_U(ZcPbNW%fJ_5X6{c@iS?mV!)ScPbQ6WY1sk<$7C6sZc! zqP04T>1GSr#G&NUw&jMlpTqjPS2ud!EJ;|fau@AG%+<3(s3H_Zk{D9)6p%sBhB8;wF1<-KiRmRvD~{Y%Yo3 z&pz%6lu!KGwf#c4z{p)+&eLR-wIB#hFxn+g96o7jcvU+7)W@)G!8wue$l}(`n*&APX zgfIf{$0Un0=+0698wo_v`5##CQ0AU!-`1v%l$%qm~kdLjxL-vFCUzS(ddwPqag zY#1Z8C;*d%@<$MmF?(H%5rT5-Je+ zXY~CGn%ilrNaL3-drCoIbp_Zz41{10C@IOoiArH~PMISLkpX2b`2;Dvl}$vE)~0Q& z-M@aEV|pZ;qm##c{l&${C<(acQq52K)f28xJ?%;|>^R<>hHP5ViZqOl-m$j2t9z$pbE_r6Dbw2!#eq0UmEumiioj_f&eJYUWt6KDw?-Brx{Q!sZiEFYdHLK z9J}uvjcpmrVBRw}VUprtcW6*Ap`q9XUp#^-(g-(a8y)z*V^M1V^9F!l(T}{Xf|cE+ zM6!aZVdY5JSh@hA_P$lJGKne)fYbAtW}iBEnt>~u?)j*y7xvk)MpsZ%L3pAgIu^hz zg$X2-LmX{YBRTwbPGgPNY`L^sn&6!LVdPsPT~kB*N;;`RqLei3lP*Jg>9M*LXYN?d znp^%wWrK!gwUA}0fl`e@3^Z{ChKJ7fOtEyCmj>~6oj5>@>dg1@ z4a5*vLltet0Z7X+wa1DM^av26WyjF#SW_q_xOCsiHLA&@Zdn##;%;_;{ycEGuBs83 z_Bcsy>CYH^{y1gEm7*YgOAE^m_wVi%ED-Pjb@m4~NGM0F_{CydvtUV!ChEy0v*J z*X*5#H^x%cUGWrUY0-$XsAwp%iy5#3$xrf%LEpS2VVF6MnEL> zU2_(>DNG4(V`v@RMl*g9*iK+YV56kzYPG{7-&Gu@t9`fdbr{5WH9rRQcXP&(O{3Tgw?O&nfk~`A z;@*lrjri>iPD0`QxvJAgaB6$B1v$2>mP2ID5ph8b_k)CotJ|pG2 z+b3!U+;upnY$02)KX3shGp8L}AV|7%TS{1i%gPNy|H|KEzA-A@Ir@(L`SCZccp(0& z#>(d=69n)?b!MqhzB@CqVJtEnz5J^~+3=e9FTb%}8hv9@vNVEv+_ad1<7YGVZ+vx; zg)T{~dfhS0cpqj{BJY)UOCt0{V~ECFQna6-4Ae!W`Tc3ZfB)y$6`C>t@fD6pqi>5X zRPSuF1{iNMQq$PuUD?V^23MuyR)D36lB(R5NZ*ji@U$Cse4U=bA)RE9OPr*p6fxey z9Vl$p3g31NQj-KMIjndorpF3!IhP{br!EbVp;t>dT4{b9**O+Pe#j-t15M+l&{$rM$Bd;UaJNsaCwkIkC5c1_Hvsy%C z)Q2~oY|ZD4dG=m>>Mj#qhLqalX?x#*8WKEIbGz~4z-tegnI|^+jkjc? z!9bZcbwQUsWKYiVvtbsK09uR2XF%(NEZ5uR|C-QMaef6L zuU|TRO?S(_-lT18%ZE1_v^PqVVz2=r#`bb)0tGqVF`(2KoX2B%;*{3pfWq!63hjHM z#kb;bZ9hLgg4pP>Ak#(T{K+lc)l%bnwl}62LeZi!Hmo0l>Ab~)(Xa968-`d|J&|fQ zsv#b#kAg)pJg4s;5&2#5Z0i7ytPs42?io!Ac&_@}vFib3dQ6+Vmq(%+g za7)#e8TDDu$w$e1k|6>AOakSk5wd>}8RK-RnLF41?NjJUl1r*jw}5{Z{~m^$=)1+V zk+VjeVDDGMAFWVis1sNzJ{y2aE9U9#knRMTT39I@xTwfylBT&j-m)2&R`x$Yd|)V3 ze`|;`F^Tf%1(-ak!8xac+-b46m(p#5l@E#FI3rP6=r4AH>;*y1yQbUD2@ddYSg}5h;EP=flOb>KQxRrVZ-#crz*!9}AC4HR7 zgfeQQ(5k(|?HN9@ESAxJ4yfEYaLL2xjF@6_qNcQq@oM06_cB1uvcHzd>$*}_QJY;x zy3xy-bB(@4sTos9ys9D>lZ-|t(B5a0v86Mzk&^+f&6XCfSIENuykZ|&Ppd2hFFXx; zrj;7>^kL|GN9<4XT{mf64n<=Z$%Jv=6C@5<2h(i*iZGuD-aBDO17~9R@3rzQ#gQ5{ z4|#q0h|G)%CMt9I|1$WBQ2o-P*{iwF#q|a71miq~1!XoX-)fn|XI?Zj)D$dGlk2u|F*(YlsiAI=${rDA zrH<1`axct3Ui~-cz!I+{_!^-KnR)) z#iXL??U%66GAIqGzPZxU5)7iQfkaE9n~o-5p8|pEfll;A1QSv|kVFR)6_`pvBdPvi z2<-n66&xMNAd^N>C5@cCAIu;#5L{Qs{`hfnbvACWIo}BO>h~0s34i>H&#j~5{4$Hq zDzZtuz;`cuO6%@dS#uoVlz5NAi(cWc4WwO924g~T&LM1W=)rPk^6K8wDVXe0iddy| zu1?)PodUvmIIEyNI(}qUmKMt=iT1!XPaV&62-0VtOV}kwS3Ju7TcKy&aH1n&C=U7} zddX@76{>m!FXpa3MFm;Gx8ihsv_f}f=UU3igu>0m;Y2qu_T(F!g6VGYY6;D>e2N~B1}an3KT4llY#!TusF1nQwLqiJQcqs}(v0Izyc8 zzsJv7is|*+KD|j4LbkCyFfO6=6WoLYb|fyp45Ldju>DA<-yN=2pXPCe%7fYFxH=|4 z>mLmA3+Ozn8kL*~dUBje!|FDFeV?eUb5`S;-oos1)@GuOT~TbjMJQB11}1HQPWX7m zier=HH@b?7g_#ahs^7R-;zc#R?yY&O!@Rfdz`Jayx7k?M$n*$oaLAi>qX>qCew6%m z94my{Yo`|d(V&I8H|{E?t{Y{?HaXOT300sj!149&%pl0JS3h>)L58z8N2NICPO!%S zUXuk|9Z+u$^o+sXK=L*rx2*GTZ z-B978zj|zqWU%%(?p>E?Xzb>;vLXjw%&=IJ6Ab|ylEe@pY63g#iiZh*()$!VulAhV zKeS2dp=@VXx|fc~T3f8f?O1d=k|G@VGgW=w@^nQC2GK6~DxB!EyWtbyP(|JOo{<{a zmH_aK5+6aC!Loj)4;`H(5ECjpkm&ZxNq!+YASdrSak-S&?D)!HJ3f!a=So0J=O5Ap zPD!(8Rb~SCOpYMG{cG$#wcv^I`TyRYsL$ z4H;tK)JV5M{c%5?F{Z(n!_5osM;-G!!S@{M}inOr~>!T@vdQyJ=Ac z`@O3u|Ls&qH>;6%rlkUlpED$4h6fz4jP|E5SwpAol=T@!;M0%w`3ITRo52Hsm z8kHPn&vpJw5(z246}$P2mGdj}PgHk~0=7I~ZgxT6n$}~#i{b`E9`iC838hy`V{5n@ z_TiXmUxm(#pc~3FiMyYO|AV;ap_fItIS=0VAi>2Nab-mJ#1xi>IO3jjIVS(mm?YzU zDipK$$_jJFLjCGuU`pHw-UXYd`Fs&V^X=jL<0gpbFchc`%y7AA0qi*N4K_|Hu4&*( zzf6@-@+JPrTu7qWhkH*D_n|SPk>Nxd&)lUPIpNc!AQ74%<6yYTC6+SBj+9>vt0HTc ziBxXnZPfY)Ts9bY>A)dACT_8C;6s5E;{CbQRhHN~p;XAx-#l3_*NNTi&whobLn3lt zc$2>tX>|n9LsoAbBc%_VVQJxyq@WBNGy%juPDs0d%TF3O&f=$rMImkK;U{2+1?*6y z$i}5=|JUeZyQqj^khO#?mwzbF;K3x+Ir^Y3ev9 zQVkvYGWE|SfHC7dD2xaISTW5Ceg4<`{mv1i9=GFamh%n(U*xd?Y#N$1(;^%t&iv+cb+&A~;qG{xN>!Y1})ZnL|@>m+e+K#yOi z^pN>YoF8*jkAs%nB67*+mRtKQYwLZD-Bgz%UI8xxoLK79Iy(k^`fS|)|mp>*9C!o`t-k`l@H zQo|iH3;;kyjxY*%1eqQT8ho8~)8l8@eF(mH;^awF>8Bpp<3*kPHjP&ssKPTw7B507 z`ea}V@fyb#h9tkD=Yn%C1+0siCv^pzPW}pF2xO$77jw0TKfq7m&{3;kR3AhWg*01d zVBU3$an}pA)N@Zpruv{@3AJM*dEnz5$@S2AAP5CIjz==OfFUbIja#N+nkY>igo=1G z(IHD1!IEe8Z!D6|(o>7uYddPLgq`_fPu4;tkrK0M>sVWlpGD)Dzyh5Q&DtrI6*d-=aXmvR)A3NTrIpbdn^+OcjbH<;0GWC{o!k*t{mC>Kl#? z?gn2&TdYuDZSfmrpK0!`)T~~9do<`WKh0`B2LKp}Y?oR+YWoMb^qVd1SF;_wT~87( zE-v6wder3bxjc>Mzihi~pK~+I8?WBA4h;njX`B}|uDgW6aZa|H?@{LcK^3^WQ8og; z=(~Mz&zXFBUc}zGW^#F)+5CpDIV-gA`K(2FFtY?6-+)b83pMxq)CxjBPG+wwHHH7? ze@6eTj7>&5UzW=e1i3K40a?OJ7g#EcMdsC6oR-tFgr8S$oD~`$-jl~MILro(?wjRR zRq#J6!2xN^viP^RW3LoKk=}bbnaOTr z00`u3wu#H;Ii161tOONVuIq<*zFN)Z^QfugRUSkPs~OGWy8K%|*hea^Rc)}`Ci?Ll z-rMf6-4mDn$pU20HEQyVLhFVvTcboP<1)lnv3W-R#$n!3V6qT=A&e+rtC2h-ZT?ltjW$gqXYFy^jqV(__XTNx=ATz^+A%wK+$wSp=bAl|>@0 z-jsw7;OFo)IcoP3@kf&Z04Fc{ouDHhPL~6eMtTedJB)lTIr+eK#+aa%sX0v~RT-DZ zRj0Hpu-cm=CatbXPSwL7$=4~(YF{u({m$)|M3vcFuwDzlnISr$MKyf8;V8Lj45!GV zGxJEbgykpjJbT=NUgv$U({y>G((EAO>I#e&k&gl2D8B$Rs z!5Za+Z8`z+#!!%jT{2TS=s?NF{BnE-em4(D(Z727t{4m+dEe&p4O7Glb}_;`|3)IL z$W9Il7jfYu>_?WC4RrFIE5g;UbZJLwY`6vik1n*{+kb`2sA4RT=}Ya0*LtEK>V$kOK>|kmec8;kjHbn(?1!YQDI)}alYZaaBTGc zi;th3-SzbDaQod+|6Yn%Bc|ghD}dws#)-P-5{8oC{cAqAuF!{_`_n(GT<->_U9q;w z2;zXd={Iukt_>K#>`PL(jEu~1G`9WyLQ1{%#i{#@+r?V<*Les4V89=xDfJoz>gn;X zriiOGqr~<$<{tv|&7XrP_;M{1skHaCvL2K2oI34SvD_nZqpCqU>a^G`UkQdp^px-#{-jkq+Guy3_&c9K#NXn! z{xmZZySS`f?6lju{bf8jqF^Gi=s5&(BxuWqL(E`dUoiU+u^kw@woZlarn4@o@$I?H=fp z22t@hhGg_w?S(yAT>qw)>$Ny^KIeAERfQv+rPI1@B6J&m`W>D@zgmlK;)_D8I)g5x4W-{*X+b zLOUr7A~FIfFo5ukZ1wZ3_<;zA*-{lxxAXf@l!wHKFzDLlm+-3(m9)9oozD*bfP}UV zDyn+)3My1~a=YuDI(qUq$A%j9fr{@eJV&Z4l0#LneCS zM4l-0(*#>sw~1(won`wPoYnjm*5$Rm2Nx8!18%}!ciqT1=~L6Qu@KkSu1k!1s^8sWIcg?;sx z@*8Z#850o+qEkJVrYKHEr`YAiy5fPG5H-*o7By0)LAIEjp@{}G9if>SbIp)Ze56Us9r{mVYm$eHc!$#Y6zxGOP(@LI<&BZ?*5w`&^t*Q>Zf!I_-VFO z7cONqT(0oXBd{7Ka6phY2X>6)R5aK>f<8*7JFMBx=PMB0Yvi~$o|xINiUvSZ0*v}w zBKLgysG4WUyqm1^Td7h)qwSIl)}+2rLW@aHtaRIH5NW;jnnkE~y$uae=l2%hcsy;O zSuA~8S<9ruMu{GEvD)ZyT(b!XG{R;A!W#HJE>hNXoYn4+e%R8~tuNjW3kez>taJKY zbuAnD9bT<@FzPlmIS)eP;=V0cZv!~GoJsCUK7C&&aR(!|l&h@g(6tPj-PYar&kMvO z6o2uQt2v9V4ItaEPiAwPt=>I6;&YWwXUbhQ6pn-;;A}XEceySznaNNAjL)A4tMvpN zEMEi%wmb(Ph2`Ji0yeuWChS|cEKm0YjJmXcoo&E#nC>6uGWRe<(?GyK!{_|e@A7;* zUR$csX;lA{s?76Czw3q07Rq_}?vVZIdS-I+!8lycGp6idZxZq|9SnN4wRI$0e86 zvq?eoOVvO}HbXpSWGbEWY+}A z!O52UjL`i0_}Ru|Sjj~CJa&16kPCuwrcZ$c(#hlpg@qlREF&r-j4u+XZi#*gYA|57JYMPV??)EFAC;%+g=ib~Us0Dl=s4tu8BU-HT zAUF1zoAN!IC`qK6KV)J(;+!XeI7;R8^;qgEX+3@~5y8HT#+b>s#oc$Q^Q}{Tch>;E z{;lzL5!IZ*R}v6LHsTes#N)XA`lq?|Wi{55D|{AjE78k6(qP-09Ujbt%_vs3iA!Db zA)lgBPPr-7P<{=a3t_S-#+i-;02{5I!IiAgShaKuc%nO)48e2D95Iz6VR6< zf<%-V+0Zv*9=n7$(E9O?LEQ@OR)g7k<#(OanjC`_@En5jY-v7J$Xg_Y3s)T}w$ML% zHR*)lh&GH*T*w6T#!fK+9r70NrTP~KxjUfO{qM93|*#o>sxeY{A89~b<<05`B2 z0o9|1(@BnO=~ULjmy}@SiCZ26NY&-)F#WACHPB4!w z{cLs!0pj~N%=o_vZv((Ekt0AGF#mxjXs){lVZa8lnDrl+chTT@BQ!C9h*`STJw15e z8p*eC5aqYtVFmg_PAP{ZU?%v0^80PGIhhI$*lVJYDoFtX`0FmT?sbWUo0nXqm{|6| z4t>^ArUry0r55E4ZNLy+nNNxZySYFg{7_mVQ6PY9NcnGz#t3zYUkfHoOdf=1zeEpI z1gca5A;0g-jRB`^TSc?|8!|uyv{1(8J#0oM2;tt|Qj-gPn*XWoO-A54-wGfG>}++O z1IdyQaF_`Aet0g|Z1VE*a&I_&Fmi)(XI?xuI{<-$5h(kIGb6d}l(MPPva+TebPZk2 zwj)&w5kzHrr}66(Kk47@t5&l>Sy-66|L%`(Wn$yU`21c$OM_$AuJ^tzXpK=*m9<{# zcG?}NJv}A=y5Anv6ZX<@aapAE@a7ssYu)h0_*779Z?N#V-n8|d9v|}E-MRBDbya9TW0Sc zeouA+Td0Hl#}WuC4A~X{!T_~c8ua-bLNb}#z6|qrtU@^`k#i-u4R|Op+j;Z0cwm*L zusGl*Dm|7qUZY@f7!iTIn8@6&DtJEy^YhbD&yRQl zUbX;H-Q9sOTlGp!vXUVwa$ybi)qtJ8NuBaI;_o~kZ`b~M^<)Id>AjCFPCP%p29caH zxs-%8D!m`q9T;H%8NBqI)YQiyal*Y%-Q;+G(N^1|-|K8Pg|`R>C=wzLsl3=~d{)=g z1a;TmPt%8^YP|#^-e_(f%LdSo^R0cq-dB&1(B}VK(}C zwp5~~?TF_55kX9sncQHySW#6qA9uDa4r{+&Pfo6T<37EqNttHhx5td>P&`w4zrO36>tm>s(N2dCDSg zUfy=2y!26}tfA1jpvQCW7Mr;)v9LR-1cE=~e11&)>ki9Fn&cE`=!F}*PHYAVOP8(d)BaEVv1K#cZcc+g^1so zwRziF&Ru!-H$U?Z!LSr&-@Ci2{KWoZIGsf{N6YIBsiVPDP*Eq+n9-5`X8Iwq4!;^F zp@~ypGD%iU9aX|!eD8%Ywog`)JF-B8j!T&-3}y<)a_Hi~H;NA0Gu&$Qt;i$Px6ao$ z0M$I#xEydC>%)NHh7zEvGb8Q&M)FW%0@hSiaxNyyO+rRl~fRaN@N^yhUiD(-owG2lFeS z**)3Bnexi)i}5-L`BBkm5{YSFeXW##i2%aHccoQ_ zgeVe=KQp!y*!HoDlNVs%*l6Q_Ba`_sLiKC|Fxgu-VWkEDVsX=fLp7NC*u45Aea^X0 zms6r)BXucb+M2fM)}{11VLT{hzEw}T;KA!g4Ah_pYgNAjeUWzv)3L$gBBrlP{R6Hp z+FNFXHmhBK_s-;Qw)nlhM5Pc`J`?kJ&h*57*{Y^eBrt=&fN{YiJt%Mz3X4Ez?1d7#}={Z5?R;W+$#P9&GS}d z0(9@^8gru+7L&g9PGW(Y|BH(K?y=cOX=gewD3Al?0XZL`QDPtfOS#3EcD2Vkt@?Y&DD)|SDhuc=uzQUKk8TDG&#Cv8zfw^*FMS7iz1G&x4(&A$C zi|sGjFR*iNJC4nZrl61r_i|DWqEX3ZMZEfgpskNr6j1JL*!_{YRbKY3>siI3tux@4 zpvTqf6QOta%6^DPgpu<qB`+qhpPESD^YHx6)k9&V4o!;lZ zjd@hx|KFi_csJ+warK!?Hj<0l|E`2GiiR_-3`aoAe@6djrXvd{Nx#^89W_at zW_ip}h~!F5tP|0uGJ}V@oimFGRVUO6EZeP9&8>x=X@Uh(5p@q zIJD=E`-}O2+h_M7Yai~<9~LM`x=kHv_*Q26R+3RAiEUnkXsX&EiXw;is(7(rHzXuu!+22*R?crmlRi665|AJ#yM)AQ9JzXT$`dO=5BGZSj9$Z4l`Ve~d`((k5^{ zOk5E1))C{hgAczVa}e`)u%ZYXeW;s+Y||NhH0k&A?=q&><&$RUVMMck2|-FeN4lK} z3AK-LhtWg*k1akEG=ouU8c49t6(wA*byL^c!=aLh1h)0p61e1BzUPL$v{{aNg@qpf zv;UN!K>z2rnw;DH#-!gc)ZWDY<2^CJx1_X{qNzM}!V;dY&C@Lw%p$|&B#f-drrZu& zF&t2Dt;H4RbbtqTsq~jG9&)+R(Ykc&1%-HL5Pf@zJ2bWgO1dKuXKv}vf2kl4svX6D z9u82KKV_{VQzN14w1|TTW+nxj{~_`aX7{I2IXgp79S0TnLOJ6(yN8|r9ufNLIVvm|%sK5tAyvh-l+0waxT;Y3Sbli;g@Cix z^4)ds<@N!Keoq4gcQ1*JM@2FGyZd|LqEQ8?#3|N<_|b|pR=}h2lRCY9F+F(OK=+(! zQI|jwAWn9v?gz7fSm;LTK&UqIi&W)MTO+zIRog-;C4TDQAR&si)sU=H!H@H_tA>S* zv1K~r5HCWUjW28uO$`=2P<_*SMqb0jir&dX-1$%j_^rq&y?!HOM4V3|UshSpA)WXc zjlw#8@GxxIlsx+)e@eB&RkJS>$BO-ssU+>}KFkX??)HHlXB&Dj25;KY54gDtznAx> zZ^z;j3cEI{7 z@`)naN<|IBPDRayh|y56+UiA2iG)aTbkiU&TmvCVNb(^dLHEKVY4+oV$%5y$k${7` zev4+#lLs?QyMQK?m^aV*^QE%(;m@Bxt99SiB5F3{Hb-(|o2DtBg+^P5WZj|f>q#Q z0^QKIHw=F~f@uAT$$fGg+KPlXnB_j@mOJaGKY6a^L`MdQ|iY&4CqGX zkRNYy0v@ai{X8sVP#3rGQ_nYp)4_k2cme_NVFO9hJecrkKZ?y5pOOafCN!AXX)SBr z$wEm2M@nZ%AP0A0^Q8#zAvdE&^|K%-F`_WvBgH6_A$TazErug0m{j!B1E>n3(V%at z10&Uy@CUimy83Uq*lCZ<&}a9 z{km-aYH&)n-yxysVdSl8rCJV+Fi8tPB}ziIqSEi7*?LSoUnbOjT7qmd$-@W%!c7lT zXZzNBiV-;Bz_2r}+^&**jzLZIeL5s3d4@H}+^dEWqM$Fl%Q6N?0T$yQW(`%LTH#u!{|X!JCR7qej{>&n5i@{K1q=Y-w9emBDkl&l)je9%?Wk$BCni)&8P4lW5*xqU55x{`JHbE?j zmRn?ZT@w-qY{%}4vpQ>qw*(uV0pmx!Pyl*yg{fP?5rw?fMxxisiO#8dQVY^|*VIH5 z2}12T>Ce7ZqW05LF_K4ofID*xzG9D5kbd+e-)OikbYk5M#WKlsgYdqV!io!3E~(xh zOa=YlEmYxeim0O4dA=0Ayf%j9Z1uXR@z%*~(`>gQcqkkr?zIV|p~k+u=Nqy=0IvH5 z!;f-d04C#$7yUA2Qdb-V`kY&GrM74yoV_DjTEa;4yrkwsc5s?33<=mUG80fh3-KY# zi83fkrnz-20(}M#%IzcGt=UUC4J==nqkc*V!qOuN0QN2_0-Dm5`*yFzt(;=o)pxX% zIw=G{=6)jFR7qd03>oN8D)z^-5M}H?QkLp|>qwJxrk;X8o$8&yo;xW^tW9vfWYU+~ zwKr_=tc}2RJDi~ctdgyd)i#;jt zTZb~nT{;tE>6#G55mT)h$kZ>;%7@nG~4a_M?E=lN(LeaDOA0)Q-VTG{x%#-VVh z7!yz)WgaE(XWMJmL*a%m2L4^23|$Um5i2%kz;wvQsUoAUMmna5(&gT>JNVOLonGI@ zxH1rspD`>11Dp5_QqKwU{~EQkT^;qI35<93H&kv@^72CJ>0oIhctL21^Rzl+;rIqu z7Beb!P;j$Tl&XZZ0N0D7am5%NphMDo(C3wm)##HS6oDf@3mTg*6VTti1bfjV$-F>LDoK=1N;VT+h z3AI;7?|5lT<%q%$LzyXg-K1&+a8sEovnF&J%Fy;&S8W+E_TH*smki@~@vDZ;)W~ zL4=4XAj#It7{OW&GQ@#P!Chtb+-ZjBZFvY+ca-TI$Y&H%piE=O;9FW0!`lvq_6!E> z!fuY>yVIP;f;iBYP6s}0rj*N_L4{^M&4WL~_GkZgfO7pEi2YSl2icm=oq$f`2z5v^ z0-;aud0kJJ@Arcg96;tO<@ko3`dqsVuI~#AdjbGW8Dn}coZPTS-`Y{6YDPn(XL80S zCr@Y(HWg4Qo)&did?HOUtf*tIRsEj|Xn{v||=d41WnLLf^odZ?Zh_ zo3f@k{K4X3ZIOCJ2b4O-k8CkMFewrudvnz>6WMvLUJ^XAp<|hm-{9X-V43nU%syXJ zJhXCWS)IA0R0M@LnweF;0i9G;Re1=wP7H#nB-;Y3yssb&O+sV@$U{-1CCp&+l_?N2 z!)B@sDDZ75#e|?(hDiXC%+M>QKm+e=*mW9yEHt+$F-bC$x*o%~R<=^*P{tsjSrDrw z>c{wEiMq%Z<1101C4T-R4|Np+BluR0EiXJcW(@8HduX7r0jmh07qo8uH}594O3%vw z5n<_+=Gb$s&HMdY_GgrbTvVviLn@D#ww|*6XB0ichX@OhN9V?TO8IX_&fG&TOm@3& z&3=Em0EIB=T|f-&Kq^N&$O|td-t9bWE;Q&$H&j|d#Xoe$A~S|I)UoMI(MuI$h*VU9 zPSexpQYH_E6ROHH*Mo}Tn>-JmWYUx!i3v%h#0mjG-9>7}346DI&P}^lp$nvvs40v8 zX4PI5Pnx{Hw+RR+CQbH~@v8nl&~vp%;93lC?byfjDh*pgpmXjkN#+3QOh$xq49D$P zE}V|Xy$0&4G7Z>5^PSJHZZ0HWKV_1zTMT8*o^VM5O=<9A#9#+WUDlBrD_#oV@tT=FE7U`F$gZU8%0P_`fsvOUwc~Sbu@;UFuQE{yC-Y`1FnrDzX zeD6_sR`dVS^_Br~HQTm!;{*xr4#C~s-9ku$ySuv+g1dVlxVw8GxF)!}yK4h?@$R$t zJ?DPs`?=_5Np-ENS#v&PlvelxDqcotali%Wolr}8Iak2mVJ0r}lmCDOXeiX)`kS4c zf1ldt6b!b#p20_v5*KG$4bb69tzvrMAT#<$JdnSeD_5t(6O8y@FzULh`0PM{slgUv zkH756iZxZ*YleU>&d|SE0N0)Ro>nb#CaMguc&*T z*)qkOJ7Du{F?NZdJ4mY#=d-4-&k(9VQbD12e%$LPct3v%%u=1+CX!+X8gLo>Ld-rP z%6@)^2|y30oZ*UX!NBOruqDNe+TE7Od!xyJUvC8@uoUp7i)~gO4R;IO!aj*9kS}I< z#44hK&|l>uCXee@qj=upr*i-IsHDO<{-b`9G{vrPgH}8+9ViiX_bTr)N84lcHrPw8 znJU;PsB!X9ryS=PXDaTM7Pp{cl#i}*+g#&a=}!|qDe8Ik*DFGeiEHCJ?~|L zuKf~wFXLR_v1b?sgy`7}nVi*ORI+3il(2GK^u z^G0+h`F&%oWCLvWIV}xN)FT^T!K9k-G0pY<1yXS7l;S+wX_-N(;0R^ekxrHjmjsV4 z4wHmv^ckKOApQ!<$NGcv`O$?Td92nfg-^rDt_`l(hLM-FPzhW8GvX1 zh*Mg1Ti=6<@PviWQRfH;AxM`8O+bFRz#ZSU(3YyKNa^^wa!#^J<1X9 z%bowWMZMyaF&;fyoen|9yM8EE!qE4Bx7rat?~nT4v*Y#O?7cB+0w<~&GV%UUvb(C$ zL(GPFNaW+Sk@82dlw}pl4aA2Bz*6xZ$C@eY3?gt@ju851sNi)s-2%Di7(|MO;GsD= zBnT~}CG0rIco_Pz*{O+&K^m_tl8l4P=WFeR$N_5Dk@~8}lmNBiN4cCylLr>@Oj!@u zXJyEy^n3q%lVgz&f3m7uLnwwum>X-8PdAB_M@g`o@zHbevLSsba!?n;5>Lmd{R8Y! zLw%P{VN>2y%LiN8u67V@ti*$-g5}@CW=G%%5j@dS(2*$XIlh+FtS)F?T6;(J<^Ihi z1c~yXlX35pzUEIsh&ejwB}Y@pnw6 z@HP0LH%Ya2l3}GMbcfGT6uKick`&DUJFi}KKITzy3VObrBDi+m&2ke#S5=7t%W&ohgc_7~qOs-#VWKb-7#mwkj(e#t8r&3Y}i08WKoIDm-Ug?IYOTf5EaIrk>Oc9%> zq$QxWHlY+FT4fg4P+*3LmJlPe#8?B1-DqSMG_2IgW=Q2JV~Xe4!v~AOquH$->)?mJ zXPZLJO*iZCG(L={ZLSo-2Z3r{dR&mz#0E7Ck%4kXm`Ezk-x2NG*rvc+5V^bCB-CV~ zs6VQM9N8Sg2TK^zj)5hl^2@-xpEIbtXoIDA5t7Ob{TT$LB4Q44sDD5p6t|N9BHGCn zhP0O5w~$e$JGu;}Ocgv$O-<);yf&-MUS0@5=P%L}T|oPSL@Mw(bv;_t=7U?HpcB=Fpjd?M&-Za#;kvbK2rZ?RB zzu5fjn4^Kuw+#JzSwQMa|L3m-^b=?S&H{NqWsg_Gru(6C$)l>YOO7rMZ+gh31^w_n zzBAGPHc{v=GwT>bd|h31R+=MnZNX4tJ; zZQ_NvqovrwuWmFn%Vi{NPB+g1F-07E$fzQyzhvIRC)nu-y2Eaz+nIS5K8K?BnpHs- z)D-@x!(qE1kXRf`?~*P2*{%dRbiXggAh~yiaVQR!R@g0COTD0i4!rf}Bn6J}1qPPw za8YHQI7*RxG3&5m3$`oJ7X4<;vNK5H7z$l zl-&0lE~!5%j2B|Gp=1O;Kkf%=91=eBpBF8CMqKY^Y9F=$vCB+L*=#*+!dw;DW@C9e z9E%I`dpdanosKAlE; zoj!O9k3opM8BNxGep26rUj@v)$9U{PplYW(rmdsDMg#VJ^^y^l?VI7PcWXr!B2kAb z1JT3{)*Asg^nMu+zo!eM2sX<97nr_vi=lJK;Sds3@3VW*!d_Gbp!t*a4T=f4o z5Qn8}?}j962*S+@Kn}YXz}t>#6cV`ZaW8N$8Owx$J4mAb#fLVc@a@s;x+Pe@BML$8GIr6t3Hp1P-$^+ipy(Zqmt9*uUfeU3ekb!Uvc0=LY2SD@=e)@>@Ldt8%30+=jy zIusd_G&yLKF{*! zx?Qw7e^!c{*{m`3@w&qoI3826noaIFDC7=#KQt~R>^o^pfdfIx@x97rwREQD*(rvj zc&$yT3kvS_c&csBWlpC|m}RIp2m3?lPJ@|Iy3lrtEn)g>w zq%r|a<2B1G7{v=n^L?AKn#FHvu$%?T>@N3hXLH4>H%F}5%)0HyV~Z{z|BpnA?26G} z)PA&C-W=RaMsz$?>NGJ?7W6{h^~qBWdp`Wh5$~$fe3tqC2-JJo@5QB<8eFlOk=474SX) zf2xp6vf+0Xy3&4HY_J60hBNXbxeILNf6?Jte}H%nm&JV0UsRm0(Qd9?qs}ubBR0lg zI~jS+2ugjcU+b*hERtZJ;Qya$7Y}|T?z1@_{u^ppb9`<4Q!@3AY=*)0oz+y6jK3dSEAS3h#C*?2HHx3y_I2NWj%O*$6(gNIz{erfKhL|3&{6hVxYAi#QGU{Evv zhxOh$oOS$tW5R|)vN=`N)rq9L*X*%!xXOI8;pc)^K++P$Oz~^AmtDP*RD7Sp3q$qM3!QNWtPMdQ%6LcfcFd0td zbvs?Iy}kxCVQ=TCV>P;2qKBRuSwnxmxhkK2L=grONJt&8rOpGR(_giZ*ku_BI*EIB zxpw~xt?v1yYE0Xn!y>*BHOr{gi*Xh5{+*!^F(IFKaU=oy@}1XxNdmRB_x;7VPTPQD zrt`TzRp;k=@^Ep1Q_7#5LH6~3Xu00AHlW5v5mWPRLa&}{_4TN5yY2cw79^MdqY+TGjc(*rOzbgn=wve8?vXh&_No$HX~97qpPIm ztCP{wGOG`n6iI|*GS3;yjN$C5o^fsUx2_=Iyh=}+^i_5}wT#HGY)eJZ>rK)}{li>Umk#29vlPF77g&D>-qnzmYc~mCP&e!gx5EC&q}%@NWMes34oExX zXb6F0@0mkRQ({OsHk8eHK+Qv|+KyYD-ag|4s1k9`&b61?EN8b}7-h8Pb8Ip^>P#85 zvO0Z#_fPXW#k5+mLAfwbWbvQfsOhz|-Rb~btj%(@s8s)p%MtgwCi9*5g^7nX2o%U2 z^$+S?I@5B5D4)VS$1(F|G$V@}a*35bD;3A{cTB4Anf5rccAo&~*WC@#8_%vGEe>`8 zyI*Yf`A3B2q854Shz^LU)j)v!{fW4d>_Gl>iOktGetxE=g^hUk8lM*R01*V6Zzl*e z-{>PNzj)*lHn)T9 zJNwl>+x({9rWwRRIfYZeAv{n1eIc9+(SVs-M+t6x*yQ?3;7Cj{`mgOrm-MQ8+NwI3 z_)g=w|P4EMAw%Vp% zwRvSJe}Ap`RLZuPlROU7ckBk?5ME9{R7KN?211)MkZ+bt&Eo5o=CNUSVk!VK5MY8k zFeatAKzY+>yF}_(2w#h4tis20*I$MY3fpY~49+<}B-y`Ta_x%!fMVkO zwT|?bl`g6SB!*kw;M~77NI_y7u|LeSQ$y`J115Vj-Y-qe^wuH0R@(@_Q!gS0=;`ct zSoIwI5RQGM57pgsSjm_LpXfqcW2Z*2#d*?HAZX9hG%e1;uG!plkJyhq`f*EZf)mL6 z;p-+q&{ge_+hk0{kecxD8)@u*1I1T@oR)vlF?)tkR=jRsOhnVmS?q#ylUX_RVWC0x zWYp4go}ibD6x900^a3d|F+~K29|G)qBWK5Z1S*DE+^nHeTIl z7s~}yL3i-|)U~91GHy0IyAH$I4eHeg1j|wCHu8uc8+5xE5L+Nr0#wN7&|I`4FAJWr zzt7RgP(2R6*0b<1ib~8G)(yv9XC#-tDE)y$mX2b%`4pSrm zJrkizi$yaj*&>J?@fVX|3!*S4lbQ%}SQjme)ZwtXYr5QVl!xpv&2NgCA;njvtaGI`B zG1DS_9Mm<*^m_xQKTWgTSJ^~R1XV$!?q>4u=;y4LLIgr&mel`6XbFTSM*pbcGK4;o zK-<48p1J=u1tu(uZ?;UEG5-@|)y^s^^1W{kuPBkK>$|*I*L&r?azoxq%>f-m>r742 z!Bh0pCX~KBy-ZC^Hc1Wmu#Cda?=onAW?K-92KHn=L-)jra(~)C!8KXz*#2662 z>iXLko3CIi z6v|CfuBJ0gOJXHO}zLlm;^msV^AxdE_MvuKRq35P^n>G*&6f<5Y0zx0GRSlUMjO% zV>!JMAt;AoHv)^%6R@(!re)Y?6TXq3?C=o!csFT}tICLI)rx*tfeq5XN@kqX(+ghy zk%_6kgbjZ~(q!B6K;<1^{x8y+9-Ri{r_yg&({MC9SE)k}MB~lx5`eitxnz>4Y_3uT z5!0lPy+BPvW+vC{UOMJ^r{YVZ>d-8dM~1%q*L%_s@6&-R0s}rcoSI#9)IZXFG{xkw zmGFvcvlO`kwb2g&AQ3C#Anmr_Lc*U=w*NZq8p{thv6`y0bJL!Tqs|5dlVVcnL2Vmn zyP9TqP>dJ%bU^Xg>g0X|Z|}<6%daXlCsZ_p@M=C)hrsG7=!o2SQaQ}EE1@opbFb~t zjOt-rw2Hb5UW#2YRvnJ4NGI+}+IL=le(4n1{LVV0C?_XJmk1s8m+E571>AtH2Pz_M z-(e4bo3f$BWPvjBMnjD%^5u7yxWR@nH4Po}RVK28(6hxymkMnfI#^>mdz~Xugs?+| zCHMowST%!m>21*w>@F;^y<~-+)J}@tPoJkkgSb96{^s2XDLDWG#F^u%_4z z(vWJ4Cg$avu*8Yhg&Eb9KGB>f0D686)K4oj6OhPmwpziw za#rc#w3-!~YaCNzH_I9x=5qz#3%Xd|dEB^2f5Y!bq~(G`#m*XPu@~jFB?bL#s{AVE z)rNFSH#e4tJzo4FG?DIj!-?!eau7Na1oy$zKIMI+h)bo~lD)-R<9Q8w8*6Hh>h^v%OqicG zf7>1>kzWb^qzD5hqs;v~jrKH7CQh2SmUnoRwX2R+S=3aZwle49>7N9_n@!KNLWK3iw4+7)CN7CEjwKZJ-z7N z274T0$FCN4+1w@Y&(@HOU7n=BmsvA0y@J>|<{uN?nbE5!ATDun-a$P7PZ0MP0OI=H z|CLG6G02X2yk6zot#SWC6$u3b^mG*q7!@FpQRic!@lgC(Cno~{@kcOsm8$1}c_S+E zuWq<0fvj#>9vF=E=!yq5()+0oq|eYjNCovIJBYj?Ei$XZMV{6l7^xpF>Ij zWplcq-RcVz+;s=*S&H6c$MVq{$}|8a6Q{iZJAG}13}IZ%0m7HHS9>U;Z!ugJwLr0f zh~L!`|4*CV>$j@TR{Pb=<71~OzpMt!8_ge@#tD0)*;Nb1pXVa8zsTwo)qNCxnobaG zbpr;X#SSaCm{s6j7RnX^?fRpb)oynk^rBn9mm?uaURHqk*Z;WcBhiEIIFO#Pdtr_d zT)h5qCmowR-C*2GDB2GORQpBhtjyopcDn#AW*_`95M)Tga^YPmVB4yx$+iW4n#LD2 zwGK-xyN2}dP#G~4B1DK|MFE*#?;8OyutR-9^n-vqzH0IHu1Am;R?P--=RhzdpltSP z^a;^rzP(>x*-+E=?Wkf=BbRaW%$!T9 z_FQh~B6zrF$m}q!P=lN{iB^Y$T9@D-rdU?(i%s2Lg4}OkYGLM|enRQ8u3dOHm$XU0 zfj?cUFmWk~B?zBKSUBIXPzU*uY&vu%0`8%zz%e3{F)IOq60a+bqR9#>^|nthP5VGC z&`Ue7`jEbMP(j~rVDulcJk+mcU%o10WGHA- z2)mX%Io+jLKeR9jU%keBv$Ia{rkA2@>0=?*4*-T!-h>Rsmlf zHmw|J%*r3<-c944+`mL7uL6H0cY_dKLkDVc@?OfFL5BaEL4SzeNKQC@p1DH+oZ3P5_+$bX-RrO`@b%)5A*NWpIchOohYj>QWL9 z6bGZed`&wViM%&A{?)6~`xCNF5%o%R6pn>7mv~vRf$3BO?>0!6z0Wv$ByF|Ai}l|u zKuc?Ny_@%OD38Q~3XuiTyDLilM*$3v`71}c@eh7myVEe#R)6)X0nprkX3r-hT0L>;K(*C>Ut`YYI06Dd1ZO-K%XO&ejH z9AgRppFT~@~XF{WhzIG@!`br;vGCGyuk-UChvYD zf;MW{8ccl0mav!b^LO8ak#Dmm2IpO&g2jIE7-#V2r;yW!k(7Xb-OxzZYbtWC7#smS z4s>h>I*!9+U>GEp1bHLgLf?ZS>bi2=R$J`6|1Q5Ex5_tI}*v+mu@%uM7AE@ZzupLXS1a(WT}fC$oEC>jI7 z7WXU(o$V1n7KC2o5faw{VGC5yfF3LT5gkT*Mq=6dx>R9!G_=4IYE9*Ro#N610UbhF zAjHp87!55VAQ`-N^GDy%NRqn;R9}ZH8Tt4qmZks`aSg?f% z_=PC`g6tBfmj-wpNGAxOe;IS+0boFI&vYY!DU&E4d)Tj26FL}k?K271r_Q28DXcG= zo1c*Ww6og~PZrZ#hjx0rPli_+%#d0bEv@FYE@R?Y*rQ2<1PCkc|3a-~2$?F1uAnzR z8`NMRkmRAEPjt0NsX|u1<71RV-9w*v-bNy{NZ_7iBrT#nOA@A;jeJQIAr$CK+2HMP&K$6vc zyt)Zi%m}GG(63KCy(fntkjQoAd;iWrvXns_jM+Z&c^mS4m!PFD=2!`-A)p1_jItT4 zpk>BM%rJzC!j0BLMXr1^0Rmg8Zynh64$}+oWZfweN-Af%o zqW3uUxzz1YCoVgNv1~G;nIJ^ihbCRI;VLn#TsG9tPAu?}$;CEKh70qi!}%@oTMNX3 z^S=I6%D8rLB_n)|KN^wU@W{827h&>YNoTl7rPIHnvI3@fh^8gOV?u**{cr z>OxLbvPs1!C}q7AzS0cHEpF;}Nxci9T#dGrPz!XfA*+h8rRa0n^dlo;%vbxNIjFfg zX@zaDjirFHSv7nS3w>h& z9tbpcl5}D?sOyFVkuC2719Bhid!;)h2S_vsW1Q&zTwY#f+<*-kToKZJp_yd09{P_w zl?YScPSCtQsaQER_pb=1vLIEI7B9Q|z=YHBiKnQ;U$GRjAwc3rNGT&#`MjUs13jR< z4RRs?8io1OqgCKp*??H|0bcF_N>&KRm?iPYkJ1&9ih$ha$tX@4aD+-JHGXPbU~Iu#1HO4aVENJbPUH=9BfoT<%YccH%)RMshpUfq9%xpt05g(z>Hr#!*Lx1)Ye56E1hk26;Jsy&{5=3gx$6D^~QJVMXn zYrpb+@KDqsxiz)4le^U>|0peBn)@_xDDydfrjs~ppO6k=+wrDn*juKcYC^2vV|Xc4#wnx~x05RFs}NBs zLu;j;kA0K>mMA?GMx4l=pH6p=G1D$Of6!ZtFV)#Z-vbB#{ab!a3tMzoGtO-^zdUpU zSCviyBi&o8|ASbI_{$?=(Wy~(!9u@5YLMH!j^C!<{S2Ib&Uy+ek#Tb%{`7!klfnaa zK5U3`v;qRPcyZnr!(Sv%X<@a&eE3kj>O|A5Hp!!bWrM!V5J{+8*^9_+n3EUsa8uE( z5AY2Cxezhwd;rDUAv((Qnl81RBnZX+X3EO%ray_fBwnjM z)%ddWPQAL*qM6s z_cNTRBIa3WA(>e6cc7g2tWMBfe7eOrttkv&d&_0#aCWY(eDK$*&RD8a~4gw8VGcvpv0yiML|-eELz( zY`^s;(lxN9FL!+7p+jbiJ9edPh*Y{O@M1YQ-l>359w}1Uv&P#e#Uu07;jNu=5pB{r zwlHQkaud;grX&CN^?(ZpMEU!V%Oep9oCC_dN2W%g*q$+0(YbXS-YGvGg8MJG)Q_29 zpfulPcV)e~T}E~+r>u>&&QCJ^hAso^7s`F}G$sfX zjEpCNr%s!nBWWhF-N~^(pD)9UJT2-~0y*sXR@A8wK4Z z^#8OaDKo3lEW_4NwPDiXO@=^eTHiW3+0PVaIjdELnQ?i9z45FcTt59kLF;lc7Id*` zc=C@=sQVNZQLA%>%fz!?=S`#015m{LTCD8?cpia!*T(7m%O(-9=%zd5_ug0qowzsj z4alf=0u|!RMH+kuYrGn7WzC3zbk?v7R12|h?@Cq9nFWK2`h4)+61EPsw(pign<$nUgceJ92UFr;`M^F>gk-)g59e1R!+mI5O+?1M5>rn;v)Vfx7Q2klw+^tu1n90s-UzklTQ zr3(yV%jtZ_u|>sn;Trvo+}@c-PQebJy-LormM)-ql$xwaLWXdJUtXThhB>X&%0EBH znZ|7O0_lM%cBRJ3*K=`i4@vCrq1mRpv_JK{tgyW^1zZkiAjZq&ptk+A%XK`igzW?X zi-ba9t|!`h(0kCc-oe!w++pYQD%_ImaWh|m@e16j60P#)gfPl(gAO+7wV#e7Bu=9k zNx|Mt0X080V<#+r29bQ=woAelH)$Y<^q|%HW_5Vbz+G(GZ#X{sTeo+zeDF4c?dUH) zoV@xF!ipOV zeis6XNgW@Tk}0$C`?-J!j1fOA2S74!&(jW6QJRWTrUtOF+`Y#l zN(_hfdhyZtaMElQ_~b`ZFcSdtR5%R)-vziB$!#iFz_Ky@;yKZ!t7szaV#>)T>s^rb zS~6W4oA-V!z?}eom)U@&WEY9If8uh5e31zv4xn_rHH@+4sgb%VHIj~bbJYYKC&$1B zmQ(#v_OpP8GJxvLye0`n?2c)4(wr0!uQ;f-IGP|+!~4mu{D0glz1vzfPduZ|Q>v3G zj1_0?<|3G#69!FzW!fqso4Lwk6<{Rkb~^uUl$^hSXoZ&T&GB)6&91L1Vk(8KlvWnGW;t=3S*=TQT35eePzo<c(p6`$ zMMV*@Kw)^;dvPD`epg`tG=k^TSPr7;geG{T{nln_-7uV?!K+VE3Lcan>OqG2o2_~l zA8_$pz`Y*akjJ*R{03bN`cu-E2Jx*(c^YjM7H<5CikIg2zR^CZ(AhEc;pC&2lqqPUz;cWPwTlcy{ z=vAs*UVq=fA^Tj7rgcGp5{i8FYUFMJcLJ@7TfmF0( zpJle_+-5Am?h(wLk9^eBKnda>Y2e#v(QXLXr-A(EbPw2l4&BBw1o5N#sJyu;MH`6i zZui3rB4DAPTrKr4CiNgd$cKVRAocodH4;i3pr;qr)&efd2q5)N8XF*~S_D3)7}xA@ z)!C7AQ^;aVVtB2ROER7Kfe136t(Q%SCW3vB*J^pvDs^+zAq*b#dAhY(z77GJ>el?f0j>#1`)g-quTg;c))DAjGw2 z{a(OU^69L_?7o_t?LDD7kPuNWQys%+H!FDWclV4xQ|c?YdnFl>g4^&vSs`4#y-H0V z&yH)uvrenI3VB&t82o){Y#hADRvQika8u5y^nDrW26n^}0Kj|G|#~`tt@H9em`?_VESh4_R6e z@z?w1i$1UVJQDHTn`N&GR<)gKX7(YDHbT=87Q6=*DS$DJ^U<=!uUKx^<9Urvu#MSx zCd6j*EvzAf`O$vchfE$QI%d0=t>SroK{+WZl)FX*Xa&dqrKqEoo|i z?6M_ZrByRt1uMr{+B%J~9Xg|Z7VuFmMI%Fju3tpmXthg&id(X+_`EZIvgGCsq%b=> zyy6c?qQTcAcCRVGh+K)!>8saZxlZsq_pkZLZp_Fw4}$i^(=b#T+*wE4N4YTcuEHXv zhm8Sp$?*2YqNcbukE3L(s*c;XGrwX_vz^asDd`+0mMMEnDRe59K(UVE1Uv$ksvV5TEg?X1 zNeUO;`|?oo$&B>c&422Y1RtCZk16F-gk}!kb$xhy(Gbct0iGm@4gv(!oeEJ_@qB@f z4JRxPzaeF+LAu+lmcsZr;f{&4m3`~*~(90A8gz}sYp27|2reok-7PYVL1-fnF1 zct&5ugx>G2m%YWea&GBDGXYT zfP-zf_!@bW>%kk*#N0pMp#cAtM{WZdN)iFb_vsl0Koy*Cms>ck=1z80xxzBQFYpEl z!W0Z2GL~CSA}-=xX@A|#b*TDzL;&?_TJV<&txFfWeFaQCNqceE*z5b^O?hL$ zU5qCNMqy~5sFv3pCexBoM?yiZSZv=#+sg-uZGP{Mo_K%D!bbUEn^Ox9IXGzIYUx@Z zo}bl`CNnpAnJtmhL4;hFPM|4Khw{}ePArJTX7YXjkG;0;q$v^@(K~;z05aSt0)EqL zKdDYmXBLqDG>+z0*e6oZdKz_hCjVB^+~bYSOs+>vr49%Lyf0hJjY`7L^Lc<|06>gy zUx_^c7-4B6K}=071jJiP;ln zJ3xG@>fZoJ%H6+^6wmc<0Ft8jA0#Exje>jC{`qdow*B07tF}EP6}tH|ocyjjO?G zhE9cz67xMZ4s)mF4Zik~NMVQkF~Bl}V=?dU$HG`3^4Ht2+s#Irj7-hh&8PC2o&Gi2 zo%MZPTTKgDQU3bw_3K@So#7zC>IZ)rbuk%uQF7D|1T^WQ!f8KIWyR2wl@?NPT|*2^ z2|c6?phaOr8EU=9K?VcL!oAWGq|gfrAUq9fvUd?bV_9QioZ2S9f3;NHR9tRc?bhxD zyQn8JyvoWBGx=0>e4efk=v3PDe|$P@S?f9nsmc8gyx3AvJYDiU+KPEvtRG6CJP{lH z%LKYVOQI(lxDe_B50_o-jl=rKQ8@p|HB`4d3*GqLA#DjdALl=FXV?6?p<$NkHj6ie zz_~l4{@Z9InNdScd^ZF5x2mxWCyC;X7PB7?wqoK{I?O|h1x0p86-qp(R$m@o5OQfb z6+cRPYITi_^RHxFluzfCp1aYjf`31(9TV|gBeI)*pbjBF86Hjmx)*oIDEK;G_6wEY zBYnuYz;j~4M;+(>sR;%p+TioY^g+93)3HS#Q(ro8DIaECzdUmnU@@}NF;PloCH2)- z-EeY=k7tbYdj-N*OY=c)E{=k)YH%GpcoBM#jjNuidz|tO2D1xN?ADWm`?{lqm0F{4 zKbSreWD~$n9IB$;I`)eN8voFim?nbSk!EAhANKpbt0=EdkK_jf0G*Yuifd(Ss`>7f1BgdVn& zBC0%&PRvd35#5sPZaKWt1z$q4s6f^)N7Bq4mk8vQuj}8RQ80CP)$3eOnrqs2tQkd7 zp+!*x@iuPhmi)Y*pbC`;xU6w;txu9Q535_Qbp3o9?j8{R*tga?{bUc)@9cLd(?#XJHs9sY1`v+^f#(*9Ug57biF` zM<~k1aNN~tCIzdLGj~=;$3mc)9q}Fj=g4V-E`S0zGu0e23mTK3n;2p zI!AmJR+X*s8p@P8YagaXs{}ychmJebaX!OK-=~wNwfwxj3I2!PEtG7Z{C=;^8NB55 z`nAr1(QG$4&61zhwL@u(CWL;y74$=3TH1mynC>RxYfK>Pcf{!j^wVi-{J@R@zk{Q~ zf{WrShSFUR{$8uiq9xU6l-5lOe25D2GsFr`_-V%DfV2 z9X&(6wb?o|qH&T#BED&DyZ}=80MbzJ>zkW}Dv9Ky z7uf!tFNGOZT?eMjCI?0%VsQ0td34VwrM#GvO3CZ@M|!V|=J4arb1vCFrw=7xsAC9u zH)ko`6f)QzzF<(loN5STTi>KNctytq&{Ic}ba|dEE>FIKSG~?UpH8QTp5$XX?*c?U9v-2v7|pcf&;egCff9CWUzXQ@ynbLaBW)Yfnf2ybMT(7JNyF} zy5B7u#jq?9x1Eh=s4W`XNhoHpX_Pfj+7T#>NKGIqP=);Lv5wB!p2>liG*uqjKHrp| z91=D4Nc2XJTV&}-O*Wq=1y$?MJF`G@y6|94Gai*9e&g}rO=3&SFK(YGzDF`N=5Tzy zWPHrgAcdiTQ7KLP6`-kp|3feL!;~kHB&uaD(@Ph=}uUSF&V-)fb`kT657apgr zcbyT;9mg95@?-KVertk$>KBoBF+JIJm)#*GLQl(AjW!ea%cAT;Zn19SkAp@rL3oY$ zY|x-pKfje^MlC}V&JeN3FeuNN!#Uxn1t{rgTvqc>F+_m~OnRN0g9~*eew$%8B;Mz% ztuAmMvm3oz&Wto22Y!USoREe1?ToY?*Iv<51GeK;N~_6@+&{AV=AO-8mU*eO?Uz$^ zq?P84z%|m0JX-`sULn30znJGLeYQ$RI)z;>w~5@A9s2i#-KN15Hw`V7ZKfxS7GJ2f zl4s00#`&K{?JeHZQe|9%vzZCKr`st8q6pfaZ;_+Dk!1tT9ZHit8ETf6ezNF-R92z}cvpwn2wC2e2s zJ)AhOAC+2+2;T7k|1Bp9gQ->dhBWBUDiQ^^IJy%hTFevNS2Gr z3?cU2uBESHD>0rfCNd?yEEps4ah}hl!1>{`YGIb?b3V$P?bR)8YKi~P+$~|-zGBjO zRh2@>wKv#y+A+~s?%`y5g-852M)B&f6u+~X8&Fb^ukE{|Qn$-^e|pCR$zf!=jpWWZbrEI_>e@~^?9?*GvvL`)mW2ih3Cph_0hgg@Xf95 za`VLz^^eORejVGb1bH1h9Kg#ogie^E>)Y4#dO_m*{OkEU?2Y$Pk6+8t>Jw<)ZK9IL zX#YT-L<<%aBhc#n`b<>;A3%84c}Bft-8L4>+(8Wj5emvmh<;5&1oj1X++O5fy>CN& zIe1trI?E{87;igUXb19=(Sncl2}+C27E|<9ot`7;uS`BuyJG{yemx6j46VoU5l#5D zGs7xnm7TkqDuM>>kGy+&=M`PAPa%FcBQZjY;HlTwh(G*=%r4KIYJR4V&SzITO)HQf z<__?1dCL`O{Wpq`z-=*11a{V}HJ4h2cEf(=RZo%w$2NU|MeTg$Q;;jAtplB%O8%ck`)-OBHw46ft4`pZY*2ji+QwmR`IsT-{XwuG#P_ey6SUe9{7ub16$ zz??O9j;gjHTZ6zEJj?+SHq0%91wy!TbL zR-6WGfY`5jv$PLI5G->@7RAY-I2&2~HGitsR1(s+`dNYNV2FOSC^)@wG}l+X)ztBi zx-L6w;UbHC!XA|Vp+*|%-633(VKu{dZ)5zb#mF4YBnqt#KBr(w#Y=Z#Nx{Ba%?^c9 z`5_B+tSy}h)BMU##t{1W3ismNOYqg~7hA3j5&{7p*TKdU-n#d%8#lrTU&b}-tIa-5 zyxsSfl2F4|bY7?L=wGK!z7g#V^`Ir2rj?zww)^lh96iqmtnB#>3_YQ3RNds@2qy5} zUm!NP(i1p8pDX~*>khn3o$lw|8-I}rxNPUEyS3^6HP0vzzU+w4Rq4H+H8E-2JRYv} zNAenNlwb(AP-k!aMkay$^?q|n2Y7?pA9j~EboGFr{8Gru&;^bvM(CCYq>#-w^JKYn zJ58J5cXJd%{HATvk%kgcQkpPH(e?(yD}mP@KSsaXmYTLG-iQ0G_R(~4GV7*}TN^d4 zw+Jg&+wrd(Fh6ZyvrmjW7r*8?yCgNx*h|&6An@nsN8^_o%a~RbT`04%W(B#4co|m+ zBm3FxTs{`Gew?j3&@LoqNI>k0#mHWAbLfvzg7EKq%G@SOYhE*ECVq%z_PwY*(@8A4 ze7s0naMF7^O9H(OtjjJ(e$JXi|1<0 z&KDg*5m+H0nJ2z4c<-TH7slA>=x{J*-L)dOEc_?GR6%#78a}kUdMGIM%cgPPXc|p( zK~8xM?ZpTTcm)rE(k7`y&%LhfaF4%0WUz^EPH|2r0trGt|AKG)X0Hv$*K2B55mY@h z5bUgp^RL?>9Le@^1y+7QYz^s={e-;jPxaPJm4%Bmv#!bl*1Q@j3|$@(918*Bd~Wtw zuD{!lKIZ4LAd(x6D*PO-4*t>Ci$83WSE#8v`#$8!&oln;)1BcZ7yZ8mOG!c&mqQX& zfhh~dP&P6+4pCGI?hC~mD&=(X=k!w@hTQS5t$a|<<_+f4zGD)$PuuE`c}UJ!^xwN{ z(EZ##7t#Hn0I3&N=%rNUwI>LIAP9mW2qFVkrxhRwf*^<@^n34;;fAc`Qk_*Z#hezG zRW3~N*|2QZr8$`HU{=!g%{|icEvcMWTBa&O?=wr}Po`w4m>>v(AP9mW2y@5*O%Mb@ z5Ot>Cd)T{$*fJ4W`^9jL5$sY$` zv0-8x%C=3t4qAYhZd?|DF@`QWjsuAPF-8x(iGEJX8qiWlv&Jz^5ClOGZ6fEbW7}`| zI)00rhbnzZ6&fV_Zg}N)V6%Yc`v$0bIq*X}j)Qcd0C!Qcm}_kcq#vNH$aN zzAUSl;E#9iQW?D*Rn&U9yvB^7>pG4L+%O}Eeh)3dK@bE%^e3_|vs+TFgimKJ)!uvQ zjH7f7;G&x^7Z<8wN!qy?6Wm(Ohrfu6*t6$bOyk0%RUqIJ& zTCEl^up15Vyw4y!^hL?F5&8fnIk@2_ZMGEir|B}Aud9djj7e+l?k&&R+m{XCRZ?W zC|4AbEGw1ktC!X^&n%M8W$3!-d7q;q1Ti3>2xx*J2!bF~Zb_K78{FtDVQqjS0CJxdY_1XJD1xi7DaXNjq?EOO{EQ@Mb%5 zoTvq<1^`PBdW|bp++taKw*3y}9H8-e(fJvZ=w=Fy9|S-|+p>EG^?2TANK66oxr3Y2 z@$qpI>Q%xM~Wy=k99?!FBTejV>Ef&4B9qsRj0L*mv zzv6omB0y}jIQbTZfk?z)8b?4t$8iwRvMpv=!8k}xFDh?jcsVC`We)0c-Z22zab4HZ zKQADN{tYd`K@bE%bR)^1ZFTvHDIwaTq$98a|0_3(@nfdag{K&HtEz?~LqhF(4wY)> zh>L=id7JR6WFLW;qhMJlTE6q8q!TTS*{a298}?uk!)hAR<~GXuNaq$bJi(K1dDr-Q zM6`kAbtGj(q&?vqU?3o4&}=rFJx#_eOulT9<>J5!gqcRM%;H2L-=Z+`KKtJR!9~|; zdERH6^FD_~jI_vwg5aExXZdFlGTD6Q9Pl ze1t>iKLzBC18i%0{8y!39EE zmI-B1r5?)E6U%awXPSDbD64CQs%cv5A#j@_8mlL@UR0Jb0Jr71uIv3wE%HQ!AiA9> z0{WPv7d&|X&!&H;|vrn&faI}WrXDD5(5__=H!Ju`fVA!*{ zYA(m5d?hTNP%cId?bNwh%d;i}1@+HfJe!x6>sFSW%FK6%lh&N-#7AxxO{0_ZXGI}m zd0o1laS?X=nV6)zes2)%0|6lld}hKXele7wxQPt%+H zg=go?|L40g#YEs|Atw8k%edbyp<^`MCs0;4nTWv!h*!_BEbv?FiJC~&gQNvyO=DtN z!7K_xMd}$^j{$@oBvvRmwbSH=)(e}4{?3!+cP0oBmf#5H%qqmt*+viq(P^0CbN7Of za?Q$kMXTdaLvxjiT)q>|uL?=HcO?oGsJS#}S?rEWpDjz3JQzDBtqsLIM6HnCiYKy2 zK<*A!T{aI`_E5>|t}TJ=j`+AYUw=;N>oEcAabDI!31e#RO6&x>Rmi2Ey@c-ScO3|R z;B!w;Pq^P;*gn?jN`yka_)*cGOi(W=L~6aD zMBD->Ga80vt?XK(~AOqHDHa*vK+TMTwAlv<~%CAgu6qrAH zxTT`~WjC0`Y`ftd;~y0$`%Ez(>wmka7DY??t?tyWRfP%GDv zKo*l3Exkj%G2=Q8y2$B8{%2yKLz@s11VIp0K)%O|xqd?hF3D9FBkik z3IAsk&SL+|zowK;suM;FSA$YL>CBq5E`zd)Z2D4u)Uv|z@gzP>8WG(V?|lZ=pWay@ zh`dA&=wZFRqeks8c+j8@YC{kNLG%~O_$^!CpKA3~tUK>ibM$hTg?;7Hw!VWO07Tbi zR!uW^pTd2XF1PfQbbYbtMxqsZ5wHnJ7^&zJZ}pDdUE5ClOGnW^tBnW19s{JF_8hPl-N zFYKnaz1&fZ%u-qiaN)giWG~{z>&!hq6@j`c6EW_VzPm{8bn_Nf8kMY&m?}p%%<{dP zY+#T|T94eY?C3Dd85XMV2qK{74+7gt$)-R=+p>EG_1F#D`<{9ks>9I40Px+&zEZC1 zwpuO5nAe^(-B2!sRZ5o(1O_B&=uPHR~mRmt^#MozoAVM0k?{%2j34$O933(Q% zB|1wx`^%HnUB7l|JQqY|z(ibU%FDi3XljYCx+_iBi8sPLxE9lLS38#$i2}}Di7Gz} zZkXGEfd@H7lWO$T)!HwoAXJZsRBv@DqqiSHKe{4HGld`c+-&-;XOC|5^#_{|x=zb= z(XuT+@RDPdDBD-$eP9*N}8Co9;XRo3=y4{6Fn+0dNxZC0|?rLkRS-6 zOQ0JeA{`neRls}ky23$|&=5;hTVEA&*-90aLH*RMYVTVK?%Go9oVAi;j<-H@VLyscgwA@}YzdS`j#tQlp^L8L03wq#fglKg z5;q~F3qC;*1VIpWMRglsc6)$fW`i(KQ#l>HGhtzjPA(Zu|z8hiOU!Lk_n0(b%IUxJF_ZdohL`ML4fzQC2O+WCt)9Pe} z3!C+ZJ%a0EtJOjTtKoZ}!#s?C<|`IYJgZ~=q#?#YVS7_UsG9zvolnw3R)*@OgT*?3mHddaeJ;s?ZUf%n<*p9Xi|ASZ~nQd$Ib zL1=Y$f*=T@`=PL@tYk7*S+*^!p0c{zz}b-!U&Uf~y$UH6Ktnzo71=AT&YJX*5II{H zod6(EpEwqYs}+Oinag!vz0nuHdRCdONl zcquKWiOvFnA3wzcq2-zXb1JD`ylF`bNU||tuH(3_3*^os2s2U~&@Vo>yghml1VIo) z_mkt6wR7Hwf#UZl{cX#T+~!M)$XZp*YsTOBwwJi#?H^U<66-VK%hjZ~6SJL`sZTEi z7`>rh1tt2j2R!{hD7(uD1E1~CQ40|HDcieqVD7Jo-VTB2ef5{!XxP!-q>)cO*u$1Z z&GenTzRQwD*&tSy%N8XDakoN+$!xN+ftNKZ>uVya$Cr(XP?cq|reSEWAo4i$-ii%L zHA_-GNjAj@&f|3mLHK@f)M9MBW?p42uy2!bF8 zVnCv~ZLZiSGEi>V)$NQ2%>_4*9aJfQ@p9G9J@%@$Ud;0@dJnxNJC!=rVZ;ZwwK`qG z!_3&ZoTX{L2@^qQZ6N*RDrM5kREg(pF?oJdKi4@y)DJIa)w1kH!?r97BJXorG43ox z#N106pxODXt0CNM5CIti0wT7Y767vw!G41Y_55p590m*-q;64|%o3(Vo?PFHDlf}o zX<}Ka2x-}*T!jb-el&41F_IfrqAY7HA{mnH5$0DIm=l4a51JE!ak+u}oFyxjsOLJ4 z>$ssE2!b%7E=zC_1VIo){phU6ft(%XlIYF&U2*$2q)50^>p~4x^3Xcpb>8QaDE_8@ zSVQ{kQcZ+xZTl9WuyUSFbA*JO6zPQF`u}!+=9GRprY8!iWHyl(_}mBrpS`5uNm}Hi zlWh0Lgs(+5A!KQpF^Joh9~F`S5FOWb9M=k#-B6*hl;LH`#Lg-&c9CJ6W1du&7wam` zC94S{NY5gvC)Nrv3c*M&u)zE5KlM(OB?v-AT{a;k2!bH8LqB(_W&qxu_TxcSL2sId zXfefCl-|*`7p7LA8wLZa?|&;1SG)$^U0#t4laX19t?D*Hio|p)-4LCGyw5C~k4aNe zB4xnaHl57gXWO!S2KCsyqn0Hc%$-IPTaAb;41WeM@Y!))*Rn0kwo$ldV=UrXU8#{$ z^2DT1S5ljiZHsn*K`XL~kXbJwMkkk#y_QvPK9olNax;TjUOUnbcs#cW8k;8pDX_v|5O0**3EnzmSOk zwiF7lO@)cVlQ0ZEMBZxjue!15;V5TRL`;#22$L}`H^}C>%TXeiPf0$#lRn%PKZs@J z7U0y2d6@<4Ve%EUq)lQvGg%@hS1c>DfNvOy1*Dw|2#9XWL3G1qI>`G>5Sggs5*&0A z69hqIq;%mQK4R2E2fE@Ob`Iu5$X zShyV|K@i!fV+1ro5CoAC^=(z&U0evF-@=T~i^_wxir>J*Zs*dF=jvv^OiEWW&9}T5 znk#o$ea>>ZsL2JQth1nu%F*PkEZ#|(&i$<7;(nU$Cv;cwX_*?>&9hv+X*T@8XY_o3 z>Tc2PMp)WQ8-7KhtfbIbiV)h2$N(JIby_XUwpi$W_J~&ejr_9Fp~$1jALZUlh}^8& zvZ$|+OF=;d1BH4B+$tz6Ar}R?d|4J35oTkOY>+M@)^Leg_|cP)%fdvd1-LmuuwM8- pSDU(NQtJUoywCkA<{QHry{6emHC{#|AN4|?%9sSO;jUgb_@XIdzW&VEq-v zGlcPc0Wx94j~{)}MXy`<4j($51y@s!FG{xFUDCm&(KowM48~q*#721MNEy625`5_+ zcf#_P(C(76?Nz$^LW+*~`jxLRHQt{GWAO9eS5e!pw?L^*L)SB8v8B1c<~g-CW%=2| zyu9CuejDw-_x$hH|9k|Y2i@gaKU{NCTrDID{d?N~9{RrzW}L!&BI;|Mrtj+mInu4A z`lF~ijc!*l(sAG*AEWw^8(1%Qp52l|Ut}qw)zOA*X(y7~h5|vLg z{aiTUF?f2=`@&3iWuST#?_F1)!W=%<*u_*53Ybxfa^!43!zo@-7O~pR!aO znWW<2+Z=kbbbl5QGonxRpG{M2Z$DnFzBoJkA}h`3e0@aX{gk6ZD{KD-pbpZiHI;34 zyK=ich>46etRw>73pgE3=E>KSDd)(Fq`OAgzq za)u_GjkwYLZ^`^KyGtwu;$}#iQ(Qw(&mJ-?PnPRKI&bLXrGi3H>HCrS#t(T zPp(cLCgH~W0R#Q+L9>y#eRrs_ei*IA>`+Jbr}W;oT)e;&lT;5x0HQ181f3@JTumuv z3lE5V&)1^;*FeO51S3t*s3)b-IpMgh<=(>J<#~HB&O0jJ<#eqblS*DIQzmy)W4X6k z-{^r>&moonMMU(V##@YB8H)ol6dy*!NA52=nz~$Pj>%R^$ZgOTr|+TI;&C@MHKm*< z4_#L)ZZZ(f<95r; zl_;8VoB0VLF&D;QVX8nnjse!^?qUZn9KXA#Ks#?_j>X7grZ^!f$^D}B#p`jON;-B} zvdPTjM5F8#Fy@Nnsw36oTmHlB3;9{Vg7^MJ4wZc3RJN^=|Jc*%DTn1OB^6ch+`6?8 zRXB-$v+1zdiAARM!cc<1Ly=qxy`mZ>%Rv*mguW1se#;}5a_&@#vP6c0f2u&E$)Q?~ zlDXxsbbaX4#LFYot{Mu##!|M@{&IDgT#M{f^xbm#Vr)z5wAL_}#_4T?v&2XXJziM05_c?3GQSkma@q!;P z<~XYHAbJ+sP*x7R?ii~p72`&X?Fe0IKHKd1LKFWd?Cy(jXVh2qRH`1;%k!kUuj!F$ zC(T~sU15KO5)u-$Yptc-Zc44@E0rl_Y5xp5A1%>zv*@{99lb$JNN(z*QD4}FN^niu zvj#6<{NGMjjJ#Q^b}#$MDvxWT^%hWo$T@8bTzI!CPI=9fJDDsu=X$5QZhW;>Ps59* znU|BLV|(>iIZA3E+Uo4KCkzU#9o5?-pb;C_Y+}BP4;@M2l}+QcKCH2JhOS&)UqcrD z78FpFqg-Q4yAMCJ?yl}#dOFik@x{p(1@}Ui8=Vyt#xlEuW7wO&wg1@K+G>8dh7mrT zDUna+$GduT74v?fiK3#58CZ6|4#5++KV9#9(Q9q7>W_p+#b0XmZdDlgD7lcjI5qwN ztgYl>^yP5%RNW!|?VeZwaec1QsCJfF-F zbGfX65mJVwJhVihimsMapSsDzd^H7Ar8nTtZR>bXqUxrUroj;7KY4`|T}FiXA$6qB zK7TvT{elAEhQFQQfrDduZFX91F>m)+XAAmnYHF(c^$8J+$L(Nzd_t8eP0RoozgL>w zhKMG&FiCu?rf74yftei|`|b0UD>r~fhUDZ}mq(?+PvBcq7O0~+BibcO+#YqZgiOD8pL6Y}bKP1(^I zhz1J_t6gJN?>GE8AN|?;z*< zC<_l{Lz>kfM&7+Z>(XMyKL_?M(W<_Nu99G4!U7o?8J$1hVvk1GK6O!jyuG`FY0E_= zU~ap8gX!Vvxw(ldGx3*}d>78n>GVFg*(k;CJU;q{pmfZ!d*?c|E%ejjG zUJo}=FjhUZJUv(+dnh&y|Gl7v0|b$IU!^;*rp3n48oh|s1#)L|Iv#12zdYGT?O8fo3m-#P7 zQlM}DbHm)uG8TTftx#n3oHZMdqkTRyJ9`rsL$^vvakanfJ}_0FN~>O~oEN6B#*f?BBJE z!=SbF2o;Lx6a7yN9-WQL%$JIxy;IK@R#d@29?RSnD{$hlgY2?0|y5eL#yWS{d;-!g;+#98R)f$^KlpD7mjfL#(FteHmHbWz^UfLHFzT| zJnB6!_pPc9A>ySo6ZU{AHiB=p|?I^lV|35;~|3GBZ!^T)=VmYWky` z7oXdKV*C?@cqpGNt2e}zn8dReh{0N4&JX|> z7niNAZ}cjK8WpNVYHVhs@IJS>FpB5$#&YRt@0A%@@oRrlX=DcMTCZfJGhRh4xf>bO*s*?54ea1LMQzd{V4Q zm#dCgop$T*&uP7&lCQ9SmBeLN-(=VwV2^z3)O2@E73bXIa#5gMkL!hIf49x1~ilP<|ceXTz8H1f9Q?}>K9{dS?WBP zf$ZE|$jdPo(AU@Ja(yGJLFcKi)E@7YD7FW>Bz_om1BIE)8*}* zB{Zvhg7b4&R>~IIIQAYsQ${d4*6vE{z)W9Gk!Cny^BQf<>ok&0u15iIne;p^PrptV zs`iHAO`a8%$xwf2-P$k$jhWHW`FTyssAiA5$TzNdm`2F297H^{+V7}{{StSCJW7VJbSTu4 zgX0)W^y=*%YOHTMI-Z+tv-;w=-~cftN>N0kV#&(K!d$b_6eCVzvCl5^iHz2kq)1?TFKE^0I;P)S%nQ#8?A@YK z1`Ia*-%RGpJ-Oc5oqfDN4ora2&2qcSlTRDiK0lZ)dbqpm?(I%klP61;R2iPhu0mFz zsR(ZUvLH@%!R@TUuRRor|k>Xh;Syz_Bpn zqz*d2xG*wG3`f0orZ=>4v0W>L8D^yDO1Jlr6>n_?)(?*(p{+03s&qh|>&1@FNQleI zvt;&5HR8s#BeAg7K$_^g^pqna?>!+3{_FWtOR}B0e$b0SKPDzRURy)wx66J5_Z9`^ z^7M4B)(j0`zWIW1eXLz!q5ADxK2I24w#3beGNt^?o29?5Y>mPp9BuJ0U06s||79;o zu_X46JnjZ>!m1z3e=xelNaYbUj}bP0&y)Kl;&!#4#YQu+x=I4f%}3kSFKL(+i|nks zpT}eEnyT{uiy*l0MkMe?r|7$g#saa)Oq*iG{Q$5-rVxRN zX&ZSyKE9X7&2SKznyDWbs}{}VM|`+BS*(4kT@??ft1$P*2V~Mge5PsB=nN35!SPEAjnt*$;ruqC@uvo=Q}0B z0fWg{21~V)g}<)$;_xrDs9;VM5Lg}_E&&s^e41bk9hRfT?Dgd(eMdMtJ~z|16AHPZ zuwP#1)a02jZN53uaU)2Q=Ri(5F~t`eB8nqWq~WhIyu?{~7BiaBN`K`gb*(%e?>ale6{!rI;c(Ey|BguA4pI zueu&Az(NhI5DO;rv`<+g&}a01e5fU5`oPs#82(blRRJh;=ZUK6$*JkR1rP&ZeSW9` zKmawqwiP4i|0TH7e&ldxl+#Wm-WT8fNC_vWnyP!^#o5vD#$e4uWy+|E0XwiVgFsGt zNxX-eUJXS?M`x?h4#qGfMMk~?zzTwEo@DSxjKcwR))U9U4x&VJ6E@cy{P}?F!-q|< z1_mR?;K+c*d}aUxO5a7A#?JOPac!(f=|a__YfcsnAXUgaH8ysp(qwQ>9bOPnl{BDs zN#2{vR+@4B!nR;%Z?E6oJzb!ibmwH4!t40%-MjcJE=FO8Zbuq?FXzQED%?iooI z&@ND!DbnU*W-ed#fdR2RK9|$cBOG$E3TaU$TbMYaj1dUT(L2 z7?!->2)P@DG15%K;Hapm@XTg1lnOp0@^EvPlkx5bNIrm^mgRKi_WooZw$%1%#wU9_ zyNQXR^I`fBekOnB{50k?nupbwXIu=73>8`s-M72inV6>9e|m{78a1alUMV3SiK1f* z@p>bk-)i({MF?M74gvwgeznDPs(?E@0489txG`KUDbvb9s!}XaqR3I|*U1!9pvIEQ ziCk>zu4sP_Yp>9A74t~Ey(gIYS=%}$vg?*qJlh(iBVYH=Q^snU&b-<*x?X<+Bkv1{ zE$<&-g=1({`33m(db-L7hosHEmQ|!OmTJEUstlKr1AW-%bH-V-8Z^2Mm+^{OrMj)D zk&#N{t1pKbA4;Dd$|}SGQYx;vW>q^!M>ro4Pm5|q{c@$Yn5Gwn>JvPgD=a;5y*Jp) z6UkVA2?~T2R&qlM-RJZTwGj^(jFF-!!77*iAH7*_eooxN$aa8PoIdFkSBOyJvxK!AzwyZK~D%DucUmq`E-)Ya$pT|L~MupA@XUK)l8B!Ryov;f7 zOLZHJO-#fDT{pA}Ri5szUO447sXe-SorPX5qf%sgN+b6-j`&T^x4cVrrKM#{^jp1V z8Fkf)wcr4$obwx@mt^*@KXe$;(9p`X%ZRbA2x1d@JDPDF&IxDucNdViNbSwFKR8~f zM%i>noe-i%i;W~E zBI4WJ++2-pLetedj(RZ5q+N4Vf3cerf4?~@#AUt2ZGA8`R%Mn#NW|xO@Yi9UwTK7e z>aysqrKRQI0D|(<1;;~RlO;=BOhUrm1UKd4mH(o=hlfXrj}I=B{wray2$|o;2toqc z7QN4xQECj@yu3W%TGxnO?7TcYUhvrOzB04OJ5K(W2?GmP;LZvVVYkd z%@Yq2n3aN_J45AUpEmTGI{#5($YqYH_80Ll*nqMF5#Y_+!@4pY>^A0-ayMdzs9B9i*1_4%m7PGmooRa z*Vh}@6f0mnbDUS1w^=e?K8H(d}*^#+uSIweoe<=E0kArP4tJ*-wbN?(eR9w~aQ| zfj=>ERr`;=XZqJktM)_xqhrWd-~5kcHYM{;2w5Ve35ra*#AE!K)f?uiQ?`-;i=fxt z{hu0TvF50>xVShpiBmR_`Rn)(xLU~az0(XmFjwtfD?|BUdTuN)KibvR`tH`&5_JR9QNmA!hZo56;}=ZIVy%i-05QKu-BB+|_wi{B2_X3^yjFSC zH`MEle7uP%DIvUKH=u$v2%pdGZ*8r!sAxx|$spu8@9JpMX$05A@TZQr?>i&lu1IB@ zZ&}{{%jf)7*bfg9Mt2uwt>8{lE7tG@O7$9hJo3WUFB90F?k@|#-0k9WyKr@w(3ZmI z1XeT=^QMCBvyC>ZAkE4`Ry13h!e=HIezM$ovYf=}*&yjba0DF)vGKdWhAUH2n$;g^ zHe0`@*R$b8y!xM4Mm*1IfL=*MLnA(qd)Ax(fV8Dw5NX~$)_!skPH!l2<~;5pFmKGL zSH}$Lc>TmtWua2m;<;Ee`g|jFGV7mXRB-?Cf6yx$C1}}`^?!-h7YMk<=y-=BJ4rB8 z=6$<2K4m^R*A~2>D{A^@vqV=+I5+?9xx_?@1NOui+P zB?o`XdGtWjKtbL7Yai?7*SSYkj2QaIv0KwBOvcDVtA?Ik78eVP8Vl+3 zlo=)s&a~-6pt>PJ&6(17mh0jz;tv-==5iLn)tEcvL#~mQu_p97)Nigrx^lkIk4b0~ z3=-K6zGq=@Rh%MdEy_fwc(2RzQE_5Gd5_fB`oH#!_4n}qbDH4?^C3tS3l5R}B5A(9 zN`|yYtIC{*O;+`V+*GD0B{sCc@=p{YtanQruIy@J3tJnreqhFYzvjP?L zuU|PXPY%Y_!lUy&^h|kFqp*sy%#<2uc)%FR(3!WzXZ{g)*?B}ruWk<-<)!_rDCFpM zh`g|bZqFKdkLf3xVIY_iBs`1v!#Jq>BkL2DQa2VdP8K2+aBf=iw4}_O_&P)?+pFSJ zN>M03_85o!i-YoB~VgK1*4ud#lIUPdX{`Onuu-$G*<#(yLqVv}E zKP%dt){O?MKmT*UANA-kiKil2i4QW0At-?`e|!9kIeV@0{k5{Kfxo5=Ht{-9bJO`a@yDuAcOE~$dnKZi3{FY< zpF2|b|DoVUBw>8dEY?qLx{aEWB-llTesBWC9_0<2%TNqq9hZ-xpuYOgOp{ek>3NPvN%jsbyOE_!Bs|7iMiT7-}4%YiH&r=3sw z?-44fmg8Ttx@ZKm)6ze5NLz615`;{tSeCn*#p*}|#Uum{U&uAIuiyRd5g!ZhIjK%@ z8*`WLF*J4jlfQOhczjSv1M_Q=pI!sBdT=XFbgLNt+S`w7&(TTj{J3~p&Tt|YyW#Y#P_Md(Ta@S z`})ZHMUcdH_xk2y7cXUn^_R)U?jeEguG;cKHO0dZ<{qhlSKnk5u^OA$L<`3Si$pAA z;T41D-&?Zdhp?!xW8e4BwP{JGTO7xH3wra0$7Ao=o9pDo+331<61Bk>y+a!7<^Qw* z8>_(p@Xh3l)>*xAAHq-RjD7Llk=T~tYAb1h;*5?3x2))z8Gm2%kz9+G8a*Cfjqer~ z{oIqGy+7yz4aN$3N|L-dX5dA?wKvssmFfhcplLU_WORFA4l6f*O{a}z)cYp-8*wK^ zTZ!?@j(&|)*RoWFze=OYodO^0E8o+0BW#%a!Sqt!D}v<)``LV5`l?)60f((`6OG24 z{&gu2R%UKv=;i)_jx&XC4N})c6UAK*whaD zcIBPY!^hYxx0j>+N%E5=H-}xdu9QU#XNbg7{j>mepYVvq0w@QlvWy$Yq^h>MnMWIp zJLLQJ_8r7r_2Tu*(}M>TvdsR4`)+4@hZv0~CNh>bUW-oRHM=ZbG$5>qmBnMwvpo0Liva*cSrd*X=GoS3Au~w%G}ZYbe5St;L!?ET-DYiOHst06qK<)b z%(U%p?~SVNimL^KMnz8vitF;gaALNp&Qil0R)Hh1z^B)Q|BdAblNghWf}HLpnmaI` znTyQ9Q+aKsBaLDOTXpnkHpD``FZR)Mq1t@1NPBk8b~C9K(s&t|_Ie_y>E2lMcU@@e zUy=)!!ndg6vA4n_GUda?>v~&Q=QP5FDgRU!IBh#KKBYSKN)Jxfd`^e$s7LcQK;!Yw z!SzGUu-Qn;t~j^LZC{70eJ$icfJvzJ4iqQj9SH^0B?Fpz|TJ1~m@wywY%-_La=10XQoD6iSiFG3S z?eKYem~&L{*n4xE*Z1(8>~o{ELg!rhKW3XunohPR@IwZ;ppj9lObJbkrVy>+A zG8DIvV3!@-wyWHz0=k`}15kLG>H`IOL)$LPwQHWP+i%K$TF&*=%4heQm3qcsOy=U# z&OEzitnX3m@WlrNz!f3G=4+vge!J|$5NLF~xGDR7JP{BdKi4hv_#PXZA;%Y-3l9jP zHf%q>K%S}#*%|zsr9~1SUT3p)FQ&sz&~}|u1(l?@?HH(tNXZmPqlgnlL{35ep&Nw| z#W!QiKX?(s-|H19b$4~uKD;Hmx7>yN6F}UdNjEn&tx!;LSuV|utUQkr@p->kB1F9= zV>jKJ1rg!-^|co^ZmaF!jIx>Nuyekp!fyWVc$r?eE$oLhev?`W6r#w8RNIq|)g?qw zV{^CNYjV6$^JW?+_e~AF?4;Rf8rs3s*-fjH)A7XJ?Y{En55ELm4ht0_+dZIa*=%i1 z0wcWsO&}^Bf4=@|rO6X3E1S(~J>Qk~@H&M4Ww1QtJYpnA|Q%%nAy`K4n^wU@{sn`a#+f(>TSL#|Io0O{7DERE0=A9WUP4rZk`)csCu_u6nOlBg3+rPkk?LaNFG2sAZWBZeJcg?%56wS?|7R z(dLKp0UCA2^BJ4HK)Tyico=lC_vo0*VJ@pT;z$|Je=HtD-%{0PPgASlHOe3k6Rm!! z&gCF3xODa4(zRzv%-YOlPxMxEXokgyGWYBu#_>5pk0?G#1yV26MK?!P#E3j_87+Q33Dg zGw5&<0jCX&57>qcxlde8|DBIkE1ID|9V1zm{ra%I8U0wuVNc$d__{2m(d*%YiSmu; zH>=aWmS%VS$xaJ7kBm=?4AhcEfntcvHKu5m#rT#<-vdu}4h?hPz-V0N-NjoeJoFd2 z5F#6!*+;*1C^`)Yx96d9$8G#UFE)@BGM8l&?J5QQ;Zaa^i)PXt9bTE1OU>yE8VtRs z3!9(*_LYIkCQ!mMlP$A~&XM+Tb^PYIm1g{5qg$D!uCczpzOh-}%jO=ItQu#jQR1c@ z76IkSZ7NxlEq5e-y7&ubfKI#kD`4eAweeZU%5o#iBACN~@3(VjuE@A-WKR#5sjRjg zmtZqkE={e(A|^UI`fOFk{gL|}^GxHrlMHj!`Uc07kADY^DZ>c(%JudA$DTU_XN#+* zf(Un#X-qlYGs)h`4Bw*?HD2*!ygMHZAEd8@*i`j|c9QU; zF9f3>tmfTBZ1!&3@o@1AwUVCqPnyam#Y2I1H|DGaOtQQmypDGEj@IK%^I(TJYc$-hL4J&or$X}f5~VsLW09& zF_jKO(5g8}86ltQwZil5U??H$Cz_4Mi_uId)O2|1@c~NYeyw$XG5QGs^<=dO*Qi_~ zjuFHZrOR~%%A+e}d2$T;4cU<61q-wHos!a09RN_0$dz<9ytQpP^URb#nEwVdmESX0 z^>vBT9)g`zNusYmAOhkQ@-)GxV*4>J+TBAoTO4{#t-LRj)2+|=BxwqHU#fUz6B#rr zqiqW$6yhq{Kg>dwrs~zxqW(LYoB`=Bw_jA%r2lx zYV)!g{@bX>U$5?TlZmb;>}@VJ60=Ly^kUU6$S-N)N;G;ppZUf zHwRy!>Qiqx+qT;?e}i09Zki*~1T8)QTp}LuiXVUND*($M#y2R4!ameNhCz>8{Z%iH zNQs=5YNw}PuMWLYcTnwNlZ&gX{@re2Z2LV4feZ!wt3*?E z4@#eMNxGK7H9g(?%Oh}0qY|(h`#7PwODuPWk?BP&9u z7rqRK!)ZEl-X|?i8^&RgF6F2L%vQOS1&r_y`aNBMu#?ku4xKtk1?Mkj8w@75ez!Gv z5-*x92@eiND_*58_xhmbX?kvJ=ak6oH1ycL%4M_cbTBjzUTxkKN5dZvCaW697^BRW z$}_5hFaDHCK<1iEhWg3~IP-0CMXDlh&;5CDPzwe_X2m6)n9SQ)m z?NYp~c5MnTW@3E2%W+R=tJ8^L9w#8|A=&g45And0b65it0L+c4`knA3E_A#&~7UKsc zN+4UibVb0G@b$L{NTpqzpO>ySB|JVqO`0ht)xPwc9NelRc)uV;*imR9mX25erPwF(59fAf5mKqJX#8%`>cgR%+`PnI-S7KJY;$+SSIG zJ-yu|$UI++Jm`+}baWnj9S>Q^p||7h+BGju_eb?0Vwr_J*BXtc>Mg76&Zc{LeiHp8 zpDdVi%KLSY#9J`P1;h?Q%~p=NY*|Ryj~C|`kfnR3JI{g1{9WyrTfZ`_M{~!`g6Wvs zx?3ZvPs}~FogEt+8$zWZ3bq;$d3p%&|C!3|NhwJ7pU1g9x_p1}BHSlTCM5FKYra?P z+FWXCa$iR?((nHI`u!$2wbdq11mL;e>A1DgS-L*@{PGldov}MwPA@ zPgQbjw__j3WTo)ZLY9$1C7%G{RHcmuxA;cQ7! zqanO9*Mk0OunXb--X6Et(O%Na^1#T5qAE#SJu>b!5kJ-y|NU@Mm!Cwq065B*qFAd1 za9Us>nPm5TfN1FGcr-USz8_rL%&OwN1eG~Agxu&?{Jbn@#~E3@se-{4)0F`V#wqAT zX$j~7I*JMg9YLcMw>#R#l12+y>dy_J&tC3WFU}J?^_DI-|8<}HJOEwQ&1)6ayw`1q`nnJ1;fFS7RiQ(Ako{z-yVmA za1C{SYJCCCeC52oi(A*|4ra>?bVMFUxAU$uBPzMr_b(ecgYBJxDMFs-_n}GaXe0rt z0&$Pepze{Gl$23WkcCB&>Wz2j$Vdk-*KDD0MK%FM-uWh?GqC2{!q8$73PqHwo6AzO zciM8&pWC0yBLgGX-<@HBvI&z%kEdMu1b)w;-14J4)q=>E2u!NExIr*uq2_`{TwCS8tJ^-{?0@%01S`TnHO0Y`ld zP2AuI^0d9JQF?*ov@|r}?hfwAibfJn-Wg5x$}KL#m{s06yz%A)7ELJ}SGoDUk?DLW zxC`K?P!v23&=o{C2-KoR2S%K3zRyb07b_?8+M90FRYc{=?#|=|Ha`5y_>{5F1HG&7+2w ze;3!DERn@=Af!NfPB?@3db+3%K7~Wz2m^u!3NsDRLAyLYzRGCM4&?C1Gg6$aw#r%& zWb_|r#kqq^kM(2W`VrHlG>ZaXP;DGA8s|D=S2Q<2S`h+EUxHPM52eM?}8+??H?D zIhM$-u7b&V6MM(<+DVUm1wz z%{I;>F!PZ6QzxL1`LR{UW1y-HZ;S^wKL+Nco)EVdYhn`M%F|&J%odAa8DdVbmv~B% znr0XS@$8$6!Et5Z)cs6znUgRh&E?2b@QSe-tq?o%TQn(&wj$ICPKe>LpSnk~>NtNpl*Vs%vp%=7TDmrQAW)>PKkFwwqZ zdR1JwvRyRWB=svVCMdLsXPPeTG?_T0LMbB~T@*`6wd|h2j~zV8fPQ1sJd^z*(rQE{ zzq7TY+j^&8Z)Y-pN)qPGH zlHEEXhy6z$HUX6s4>`TJB&gRCh|P^LiP!9d?Zc&ZH+Dyw$qsB3H`b~0n-eD-I!y=e zZqqj&l?;^IzNt+`S0|{ki9vqND5k`xx4XZy;^>yMzUbBdjlDk>77xKpli=AU_*(~%|B3CpP%O`zAcja;6cIe5`hIzBH*<#FkLhh z-u1b}nGZ|q*nE>x$UEk~Z;>|t1e4y0wP4k4GjO;MzN{f&GZGbNNj!!8UyG)lJ%8&4 z8WkC-g;;j1@st%lcXMt5H)Wh>+1(OUM3kOzPWT=jognXOyDfQ%kcvt|FNwU7SRgE4 zGYcMC>icxx0@5otIfG5^mTF~Zr;7dxG>A2TJK785-P6djd$iPt7UmCegD=gl_RBv* zo8eLDkN4;E$*OKyKMT5QRb+bKoo_pARG}s*rooth)GgL~BBf&L?T@eyj8~*eU~!Vu z3yZ4yu|`j`z++VMxgZTqf!JhjA@ea0 zJ;-(-utHG{fDl;AsgTfcGcRLf)4GOe!%Ri2?cKw{gw23$ySu9wNXhEo`kS?OQ0WV{ zq{>Fni#%qOkfy{Y8v>_E8j3P)w{*Jhi&IT=6P~aLdb!I6YSls$E6!}S?hKu_a-Af1 ziM22>lv#rcRu;d0wOOUi$uY~HIiFFXVeDfnS1xcQOuIq|)Y!JNveGdSmJJdO!6DRO zTT}JmH=J=Yjcu8Ug}|knlru zLAao8|4^TUBTY9x&EamIC9}+!0YtBKOf}jzR;^IY10J0^zC@YOb4JXO%wk1``c-Wp zYQCo5Vki7eVYfJPvF4p7-XM!Cl&cNSC*xQ<;UHc+e)M9FHA;)KfSr}4hj;8Km>9u z8`DydiQ1fv4`l_dD`( z5XM<)8oe`z zL|DFBwUj}L51AjlTmrjq==%OX&%@$A$jj_6S4k|&YeV_I|9P|8_#&*37q;B!RG?Eo zF}D_RbucquWg|4};Bwn3ukHEny~begVz7G_3V=q;|8BwYZlL-n>cQgTq95mooSZaj6NR+Vqo}IzXF9=Qi@Z5U|^TxaVUn@{1Czg%~x1S({pQcuPSFm$keg= zwi|-&u-K&f@+~`Ktzqvki7_8JCOh8}v7aXOW6n2&XH=@pM)I|Cq)48KYc|zo4vDyE zHCh8f)>H8?w&bet4^tKO&^Yu!c z1EfSuJhfe32}2?+e%CME@&l*PBlR3J*Rr3)j|B~TxrWT=AN&nN2nCC^eY(JnMl*tAQer;B4^DxWRih| zCja_^6>~6c?VS?m7w3U!MEqZm;**z_%oG(HZ!F*&W}ll+v`xvM&`4}$p>xf7rlH|ZPc6&c-6m%fBz3DC_m;CK_|ru! zjW`UNJx}>-cdaj}0!9nF$BO}}e52JkSX1-WDg}NLVdpqm+Hs7vCrhr+{0m1&WLS9G zTu=Arbkh>MZ%^jo0QpqG!|_@nz}UnTm5BX22-rbdhDpCEng3}qK3;>;6r#5>7SRrJ z)q3@hy-JKZdQBenUX!M#8z=1_B#@D|K)wy1%S{DTs)6Ty8gEDd1Bewma5Ps{D}EL3 zWVL*-v2p$sE_5v9@p`J!`D9+Z%B?zOv8Il@(c`64{vn(Y<~3W(1EhUu9(OdEv2Rq! z^fbVx|6sWVb8N4usMB)|0~OuF>2FL>uW5v8YG#5;#B4BeYYR?~g~=#)C>a~` zA&AW!&i1jb5Y?wF@GV~E^RM~bYD-|PQEZh2`OSDLZ!gR~d?kEBTPIc6!>x;Lig$V< zX~Fep31d!n{DiaRrn@RrU4Hw9bRXqrS_%@_wxH@moRI|k=dCXi5`h8Iu|&L1D1fzQ zYmKAybRH?%(Hso8-eOmKlW6FKJYF5Mvt|RgwjqJ`yG(9aXByBNwN;jqY1a7FUoqP( z@SfZF1~ZRvtDbxpI(_|*k4?&EBP)$BKB2{yiT&7QA!psvaq{eZSF<%GJoED)YqUjd zLhPq8I5N`gZmCjsy&DU%Y$MX%_jhX%St06RuWk!z;Rl^y)U43(W?M!l*yrgCd`m23 z%I=MJxY2Q0ZaHJKc3lphzq3N)lP(L~cFH0bC>~+VAg+;CFq>7%d7EGA+u#6Qh{+2S z1LhPq(QSB4IT>1Nkv@Lyz6%L(EksmJvraChBq1VJ4p5-69y~XM=B;U%6M4~L0*eR^?2TJ#$bbnb{lToFc<4#FdnV+Q?E`4vm z^Q1>o+*j-K?1smY%z)`rR!Y;;HW;=%c?RW%%Lq^RvgZeAcx&;WKXPl`oDwza)N|O!vbyxsa{8wbZalFKj$u!qq`pxvlFh4o= z*GF!Ik{=UUe60{~bPX_<*`fo)GUx5IhW3vBD!pMBKQQ4$&!0Bzx|5$4RcRmkYO<|G z^m~3mXdWF|13vqoW;4Lco~9=H)HWASpm?9-lbc2r&5&uo=hKfxO#>J%nHdL}Fe@!l z>FJDLM8Sg^zqF6jo;Yv-#Z>RXWHeZ?8$sYKlf|tR3UIauhomXx81vKNkMx zPu1F-nf$Sk+r9M3hq(uwH}ESHT^%yhH?lyG-W<-+eKh_!HE($-e_bALBeg{(I|&NM zBQevgU$N?7bX+E~WCZF~o2E>=X(ZthFH)1o7%7CzgwvN4<_uZy%2NuI=BU+Rmyrw_ z$`Bp!8icWVn6upM;o|>Hb^VUB5UHTsFxg+?lM`y`N~gs;-TblEXG_$KMoLB&NA$*w z%~5O$R7w$ii*o)yEr2j7;A4$6#x85~bd0ut_TfX?XK}%bR3U%E*YF|KK}z0J$d@)P zDp{P?6>1mK-iV=d)E-DoP>ECj%>Cmv`9T6%9R!4@ABDMAmIFnM$Ym72PtJbgJB0rJ zSfN!eMce~FVR0@7{8ti18uY5Pa!568dVpR@*6^L(q619atZYFznv7l<-anO1>DWcFXC2;mDSL zO{3Bx%bzZThrh1Xk&@|TXgS}MCa8!m9t=3Le+A|SL$>+}nJ9|2q?9!O z1NHv+`+`Ch{|(q4AX>|_XDAMygH(hF(;*WkttCB5jVLr_!_NmgqQRHwE9_}$Af+fg3b=MH9qr%Ik(IQ;xF3HD` zug+kaRZ&kWaPz0eU35HN*fhWRjbh%mX+{haS0XP%t(4kMy(YqUkER8897(_u>mD8Xpx zDAiJSD}5u4cFF#Qr9}QKP3=hROJ8DpRpcVm`vMKk=OH$cc@Z~)1vEj`|3}t41!vYi z;oeU;v2EMN#J0_eIdLX-CbpA_ZEK=QGO=w;Y@6SD|GV}+`Ob3iRI1jhzPs<${p;)E zN2E=pl1&Ad85g?Il@?-pA6d0ib7gucIeyu`LG{L08HVs!D`2p$A)#hF z-;~Hi6Hku;2YJ+Q=)Nn))WH}Wc{5ECsJ783t-?2vpv!=>vU4=n&=gBE(#T8B_Xu+!`TtJzjnc$>{?F%OuBSM$&e#zsN*5!Eg$8Ag#cTlkyl6z$Qb; z`th*U*dQ{M&s55%FpBxa)OQ+-@QJUb_6BpEf5ZDT-7DETAAQF@0;4aR1utu z|E!QG_G%34zr(ez7|2UVH4p~nsndycok15$yL?&{I3??Z;9L`%hPWQW>s^&jI@p?p zu+m^ShpI;0xqPCKnj)+fNykMEP#x%XV5B?Xmov|&j%L47%$hwbDT!-B)%iwtJ9P)) z97es&&}x>l*2|8U%fq*T{iThfth#=(@Y($rXJv~E>-!Q0NWX|g9sh(G;c}&i{f`u2%;p`$4GXXZK}}E zV0lh+*tR5d$j111ZhR=0Ae2Gva%IpUhD15m%Jf^cW-e-_Ah|kE5@`k|d&q+>4R&V9 zJ`@yOaS+TDq+n4K{Ou}IqN}^!m$`<<;dKEgc&f_ZqNJTBHP$349;FEp5;dwm9ZyF1 zGcCwo$cC&_sf)}qz%-%~4_~PK*8rLQ!s@MX{lhaQno1ARd?M>kx09JIVJL26x@Tk+ zem_N;{FS(OW&C&6NW21y|I@mwgA@;-!qBRd^({e>@*Nb7qH|7V6aRIG!?Gi}BNNpw ziHaX%8lR-;@C<$K!|KoBYugzZq+|SU^?UFx>L=JO^odvRWsV^t%zS6}RC=|i*mHw~ zngE1wra3oCD2;nP;-tT{gCPqvq;_?jw!>&$n>qYmxWfdr(;+sjjQmNIV|`yLKMy8eDmEeB_s}Ie8%-{eT0uES#8Jjri!>K(%JDMwY|2Cw}@ig!vqSrZg znhbT_t-^W5?27z07LJ;HE&^Mq!zY3e#dUY(s%MG~Y1?#;IxK6b?ZB(DG}lRv=5qqr z*L}d)jgX2`IE)t>@c)e8n;Z%R>%z_Gp^K$JJaz}4a$!X@B4w+UQ1JLVYbaWfLueuml ztYIZOV%v=CtVvFjF06;U75w~+2Sg=rrC6mH0=jjT=(#N{}e)lb+HOe%Y z%0~mVU#mFf=?nhlPC6y04&rDf=$g_Q2J2;M?L8y^O0Lix^MAqOAl27Uv|onFP}Q$A zcVS7NrWqrg43Jb!{vdVx!#9LO?&VLEVSWty4QWD9k@%M~P1Gx(C?P^G|*oU4N2d}$i|#Q?75*!^1z`u~t%4-z>?lt@CH zwv$GryURdk(am1u>G@e20ZBBf-CMN{@bHv`YwsZ3jn z#~Bjt5MPUc`Pp4)He6k_!CgNzUb#f=Q47A6ilZPQP+AzaGgiHr{ zx;W^!W8f0Cm|csWT57*dj#5Tp*=^j}CYag#@xM8Z>?riqa56FisOAqBb$inp@C}38 zryrO|5+2HMVE+$Qb%6i?SL2%7+k^4M@3KW;RtPt)1dyVzVdFqnqGmA;L7_|vOnpK4 zX;~%{Zng}**kf>rt8v>EHEttGtQZxyx9%|R-0D3mcj1hxLlcQuXMHbHr zICPoiQ>$ygk14{NOEl26n7P0<R3B8y%2T*x!}jl2HOBT!$}8P%*xf0)lmxG}S2D%#mpnV0Xp;H z(Q}2<>n6-wk@bkfMde&iM)-+=gOY|2YN}O~6Jy51bdK-(?M*i4zkwEjF6Tm;hymDk z?N-b6`QJ06f}?@D%@Yk6P@@AZM(t(=j>%Etbd5rm;l^(y0xmKpCSa55kBuTre80gj ztECc!+KUa3HOUSxdoQ=$tpQ*mL{y20-|=a>8`LvK#d05`F8}JYH ziM(+B^}-l6)4rBc#AB>=oVQfoANZVWU{7`ve(N1H5iguh>ugrjZSjTGom2YZZ9-<^UcxYU2k!K2}^ALZ6_c@)yX(vu8tzWYt>`rwXNXQ^&UaeXD z-%8`(-Qfb)zQJeZ%MgjxpS>1yoMnw!S!+4IU#j-?BLr!VadBM^u=`G7Ap64Lb%KJG zzy1k8EiiL;4*;1WXdeo&Rpm?s2J%m6|A-6=sOiO5;Ezv2b1{_D*pG58I6eq!UqqqS z=7#UZb%$P8b2yEl4YGD4zwziZ^7curPxYWzg_D6sg{~^H4n+goQORu|Qz0?XtFVu5 zr)M*r*3HxTQTsxTwqg6BgyI<7@i$DgCLViuBE!<&Tf2^Az=xnX4%N*xzkxiPIKA=P z{s||`7zFkx2g)@bwpK3cVcdxExzG;Ge%Z0VIQj`xpXSB@t68GCSp9BSLWt+ zUqf#*&IJX$%X}oP*2}i#ER}>hy-(-s$+P+WC@D4OsABxq8jfG~qmVD&u$}jmTk|F@ zI_y`xSSlt?w?y%WW(VNgnYW2oJG@7WV9%!hi9zSW^ImUH`U8u1+V5ji>mdO7nf=v= zd#<>a?z%M7V2w`a@X`i#Zx#+F8%>{r&w* z>YdWIj{wpuhCWTV*~;&1`{T=xj}D&;`SaDl@tW@<*`BA$K550Qjl_E*MJu2`f1ONg zjk-N{M~fY(l*}Lorex7irZ+eJKGs*T?8A&LEnDrb`#QKkyWEfa+GYxuuPCD+mB`*( z>eV;6QW*^M*6i+5x8qgj(-Vv?*So0s`Lhu3t{+~2q-C4NwBF-(yWIPp>%W)-i(M<0 zuRcBy{Fo<9+9F1J`2O}rwAHg#C1c8Ua77wiYw#O5fq$d)3nkr3H1E^4S$Ywn`T0A{ zw{AH=PH@-yR49?4|L(*H%H>mRxGZQyCT{4>tCeodA#Ru|7rtCONxF9sD=U2A)F|ZV zJ}W5IR_P9)8pbwfa8BrZF;{S?jX5T$ApuYo=M{#V(ir-8tmWaR-zio0@uxW@7%(8K zVl>le8cC0BrdF_%{Y1{o!^%a4gQOas*z`&%t7fXCn5*CUTnhBo?V_=)Oip70dYT9g zPKc|+#|F?lnOr*Z9GD01-*%gANXHFsg1m82a;9`}*x%%N94+L9_iGaD#SN(}$9y6+ zed{>1#3MLu?NWCv?jPBVvXbo#$LIz4Ns@V6kq-nZ*^Y|xhrYf|9+}xd!Cm7eC1hY~ z_ppN2+nk*iR^7hD5$sxQHR`q27Y1W97&<@tc}!~&`aL`8oKQQx3}=_mutuYgOG7&%m2oXw#`1K6Wm1h2m;7=mSvELr<0M z(lG0;o*8ECP=tXgabb=W^0SxO*ug|kmcZ?(kk;h}@)uak;(9k8Di5>LT0ZS2Lea{D zi67@{TU|;$l8AT=22CVXR1f3rE}g6^PBFr3#_qmC{{J33JGA-y7JA3VY!5HG?7|z9 z=3=*6EX^&I-rWyQxg!F>n(311htAN-#S+v(({11SEmfxOk!8RA7m$D~mN!7-l*ST% z-)OI_NJ28offXoKryGbOz`Xwo5Mn^39Xp&%zl3gV)wn(Ac(_QK1!==Q{x34ggwgHr z7C_0strvIj#EBLpg|L_*Ty)X9K6rN*L{MmLBLT7Sm0?5J4TcQ^QJ7m< z2#-5n55@lRY3^okj4|`26!zj8D+ZrthiFH8Zc0?Bnh)M0)EuZD3~gsWKX&k6h@l}t z_|N6HdO{5+2HFU4p`!Wf&SMfZIokU6hfMO{qLF_NEcT(u+QTEH(l?7o7~zv+IG)Q@ z4zTnx%=+2U)r?sQK|-~34q}73w5WSE&2UkW&(cBmq5gnBJ)c$@peDorj-YL<*O9c) zKxgi0l(1;4%ZP7BH0zue*{gq-gX@UHk!LiV!45ELV1EwIds-cq+^+&Y8V_-w;+HZS zEmzKczaZbAZ=B98=Hj5`p?*3Y{!k^@bT^M$a`gBA?Ck73<#ssO+oS05|Gd+|=&(UPc#etutf&u5V7iiJdN0 z4ylLtHmb@Jehie;$Tf)>sLsu%)@lPvjR0}I*8JS$-?K^gu5xLyMfUiKArXT})b6si z89gq~Rky1}`1VfkGt+KsVnPO@py;&t5iy@HO$Yjwkkf55!S^0arrL!i_4iq=bV@$^ ztMzdlz_o<-^n4E8pM2E4Vdtw?BN~mzxD?(~S8E3YQaoc?H3!z9J`4*&G#CkR)I3-& zfDrw!D>(~h6j%M4#ZHT3D=~-qrMdB&>P<~cRaWW`6$>h5emr9X&ot`Hbnn&HA@C>> z+fs=?-E!5JjcwkYGmzk(-;>m5cm!PI+ObG3f54yL{z+;x*ea07${j0)dpC4mY_s~4QUMagTiy242Kl$Nvb7wt) z$B9@1aCR^sULH{v6F!|?G#TS_{e_ODLZ?OqC=QMZF4wdBfMVBVuAt}p-~=!f%I5V3 zumNw-6)@$SnsOMNr)4iu{6=nRVGb71k)@Y0Tb%pVcMuW~u;XH6G+;oM<78EVf2*z1 z!LBCQcW$2~>mhTaX{gjDnYY6+9PBQz&RkKHQMkWyv}{4lNs(O0pE*~?n_)I&L3aS# z)|tQk@bxNp*Dm$-eeRhWOQG*DJ^cRN*jQLt-{)%~`RVrYKh~Sme~i3t9^7X+z3QOw z$2<&Y{&@$`j|D`MyY**J7YpCnh5?|h9K;7~TwoJ_Z08#%TyC(>#UvOZ+pbi#`w<4Y zLwMlb`+(L!kTe&EY=I-BBC zim2BogHSdUjirRff~nDK1yM58lEVs&GlQPPCCW1BMV}{=Q&Z`YX*6Q0h1-VFhCzcI zD@`9>%Ag@pRbO>2W0}IT{<$Zko=N^d8%Wfi=QZFoV^ z^4tC)@z)K3)LMN)d~7Lt%&f&)vE*LaMP7NVu5qm6LRvzn)DA)Go7YEx3b$Eoa{}li zXyhXyi}~S;u2;$)|EXX4=%tFEuRD~6wpEf4Am>m~4*$&u+I-Py9`H}g%ip_IWzAP3 z>&4PT63Ut3>R=+F#gUP4N>In)1>w?|kQfpwsF-K_I%Q;n@LfMJP~wqhz13D{C63`c z9u+r<=Tu8Kyj%bHTp(MjPV(}Om?bi|XGHsZ8vJ%$p?Kn0ewwDDlM`OFYYI(u4Ec^c zD4gw2m%*&(d6WO>euVZHiPTJhA4lz{C*PhHU!riCZRz2VQs%ho;Z1GR+P$6omithj ztjwW14a;WT<69{FSZb}uo=}XRQTNV_B%g}{c0 zBnccsQi8zUr}X;WA6d!P3cYG>m{I}vH1D^#E#x=`Yt}vA=SAAawWV9njLF(`y+g2o7+c%UBDzJS2olM9d?Y0hxi<23qn8gQOrKT?58p z5VTc9=Y#4vVR|j_cKy>wM~#e=x{D#o&qLGO&|$yb;F-~*6(t+s44N=ut(CKkDq;WX zGT!LJn`-D!EFe{>n*O@!-Dx&Hh(-j0%&V}WAdn0Q7t1Y=Ljs==B!`Hf{9|VDnwsy; zNPtvYQc|w1uod)IS4%S2F)`M$9h-A(;(I;(Z{^f$yrAUCKUGoV=EAv=e~wJqry9ku zreieFz&FqtaF2V8cY|R$jmp1k+Cth^8ESMG+uEz9W76rVIYD&m)lH0b!;3Q&4FB_J z@)yx^-=6M$xj&`c^e~MjSP_$z#+QuA5tKc0ON! zXJ1UGNwd|xq2}v#KVLAY^y|$mYcbS;4ns9LhuIb0a|O|>`j3Xf%9G>Ku!@pw!EA3G z&9^zb=%GwbF>gBCCE3}WQLX0E*?~6K|9;T&{d^h8yUjif$)O$`3a;~Gl)hMYW3}^m z7n#$;xUYy-w{1eqZ211o?`*Su?(c}&=c+2Xb~a7S+%8D&^_z3I>CcQDzvO}#yU$>QysDS zWcTRtscnfIF9jINIRRPGK^`;}uv7e8g`AAdYdh8^-MW#aWuJFsh}V0Z+AZj&ywbafvV6k8hpPE*N{hi(=mLJe}C`%Sa=adT8AuSiX&m~vdf%5z12(5{DfQ7OA zeyNY&jtN-ZN38>MmXm0L;&`1z6F;`P?nhG?=L)CfeAGu%=+AR6@0>3UbNz3=UFf%e z@;Mq0U!m$I#~|A~uOKMSHWI=`Q=k3z;&l60u%*jk`*Lk*#IwhCb$&(qxL96jphUzC z4FaTT);eP(I^bVDU)|emCNc?lp%DK_8mIcDLO?n~xO(q*u&w?CfiWCWJJ7(jfSbMA zqG0zy-FUM0fK8}`vJ$#wXvH&RcGd_OqjqzRP|&$PEuN;2&sNq?*-(HFmRp9uB6}=q zW1tBcgTfaQrUx1L36N~VN{SyNrk0r5;u~Y}s~qx1WPdQG@(qShN}O390Yt*tiZF8p zt%RiH>8>e7)OoYGAPwfrGjG zY@s``w5>Za7S>D9IJT%8UY;>CU-Nwof8M1PA2QpSS zl!PvpyKJw%5SurVf`LQAYzG*BaSf1%L_mR~B!NPOK!hBgs0;oz#Y5?eJ1o^PPOmU1 z;W2y)*rYe2&yGZ64*=hs?Q^!T43dM1gN@x@Nt2pu=^kz7ggA&dTUd^bTZikIn& zGA&yQ6)w{p;XAGNjClR+H1y6|VjhrQ&vArmEX%Yao6^UqaB`ZxNS`lg&k8iB^2amI zAt@xI9_IhC08iqkG3`M-II-dpEKbyR{dF%c+}_njWO2{J@4jkueGTF1wc0gt)A+o!w{I2s z>m>hhSKtlF8^9S=n2s_1cIl=uiw4AxdtHqm37X?6`$z;=g6Mftv})Fw1o?8tl)fjK zO1S1hk5ldS)281w^@eznbW1EI;U!qb{LSx#hD8Et9}&KO51bA+Lo-oS_^s35dU!E{ z;$3UO$nu`m^<}4sFM!(2xyPXK6b?{qBcB|C0bWFad`v(9QoKw+a!7p3#=!Ee-MEH_ z;(`F`85=X7|_kE(_Lxm!4skAsT8)!BsDmgw{ruAL2cmw`uwbv%*Qt#r6 zv^0IPek1?!-GhyEgbNLDGa|?d;L(BlLj(p!ND>?fMjn!^EKN*q@+W*btUyWfXhUXI z2qsE2+|16<#AafzSR;K7`_{wMP6omTJ1!?8P10h!b(!U0#uN9psvQ^Ro{S8&GRO^{ z)zu+B(_PtYa11+CQH{1Y8+ z7^YZWGwttvURF9s6WuLLU>>)1k!`3ubA~8W3FgPI>lNu>#AZun4~c<8D29A#! zyW_NKp$twQlIN*~al2xUK%R8e1Y;Bw z!3jRmiPZr&*o2PmS|J_E8P7K5Ro5JnA_=JrZhs3mv3qYrhhj-|3?}XqKfSX^No0JZ zJJ0^lOq_}xoN&YBjfxvB0t79gLUXa4>bodyuQXp>+BHQ{O~j5PYU;D&Qs+5@%e80l za_ScBnw8?YI+(8FGH{g4_m$8hKc0rg#$)qu}uhMmgJ3f0D_Bmuot_>~RGj^Qhp%smuE^uUmaqltmdQmxOQpGYOv`VP9|==Jrz zJV~D~F7oE2@U_B0Sx>i&4<7k2QUy$bHX7m0C|a9x&Pizsc}@>XWEF|1Y$_ zJ;a5DzYMdWc;`-_fLMl=K_(|AD4F3%^W0t}r$jP|3C?%$rW>1vQ0Z%VGO+2Xwp1<& zOFE(EL_hE%+_@-g(-;`6?gX+C#F?8q)Q~DKyJHq_wlUMo>Mr8*7n?bcz5KO;D#y_fgQEOI z7G`<9jw*|Tg-;8O-(`ZEkY+6$kKb?2^2z6Hj7pt$mY&{=RG2uQ4Jji2Y13+6+|Y&T zoTKl@1R5L<3R+q`xd#pLO&~Deg8o;Muw^CjQMUO)2L;1KNq5tVnMeq{Py-e5zw0Ax z{8EqqBTts*2{ls0?`sXclIQuJP8~SbDcaRCixPmRLY@F4D!ul~u$LXNwRPg!n1KK7 z&$!R#0hVdiIZ9(h%usbPOkhPtd3pIiN1T;;s{rjCuk26{?KR;HztK#=VQuQG)h_fM z?Zg4(*Rx8ECp+1iTkUyvF+Orp#oq!qXQvx5$=~miZdbyomYTVLszFS5_k`7-LP-l| z*iPZYPr2)Sy}XMnIqdBlqru>%a`ZCnOrbh4)OuwEmjE*@Aoaw|K~hri>bCM>V0jwD zCqY8tP8v60?!}?|FXfm-{#T6=K+w_gXtFTYOGHu+U~KGnF~$kua5(gEq5(9cxTs+~ zr&6}~2?ZHJ?QzRF(H6$Uwk7o|MQ6^5rSuJ4g5LbF6rjMTDPc%&iN*sW8)P%(62|PL zLsM1uMXmev^Zt(qh!+mg9DY;VuzXikkP|`>5^42_ka%CRE`{fCZO=sG8)st3n(hEr z%yHRBa$Zu81)Drv5xsh6SI+#T-f$XJ(hlsoVL*V@-f+CBjTu)Xy1OacS1*{gVC#UZ zcj?T)qr0!{lTTR3P^AyD>}cy43h6&l%sGh$ab92CAZi4ZRqLsfn# zEd4R*kPdoM=T0Zcb6r_6yLDu9-O~o-^rr&R(YUxN&P|s zm!IKB(ON4iN{WliwI}inrVM-7(l}|C(zi4D#wl9v(%n=OZVR_P(MUFXzcybz{f zlPZ&=R+)sLs4@($eD&|2E;k@eLL{jkk^O^$6b76i=pz@a-e3wQkXL4?4L%t>k&_ zyx<0Q@xnZMjq-*TcE;Ut8CXP72a$g^W)pZyuW1rk=;6gp5)2#DWiIVxt&v%+a4=2%*IqW0FIWp6?-|{|u$V zM%0P3v-pMZNA$ZPr*suRnq;Nc`49^G#_d7}NZF z0<%9~p>zUSM~hvR{xMQJX{_wrb9LZ;wi$;;IMkB+S!2q0FQB%a+G@fd8J^L^u-z{o z_a|(I{Oa2sj1SH>o}}nVBBfup06NI)(buiFU<+jYyb}s&oc}J>G+>kf*GrVjKVuq)5Mg z$#3=)?smFls{#eLcloNC`{H(jK@;!4^&uqmdZ}f*Slu|aUosTy#y{>6KXsFQ%nsdo zo0FxFJA=f|?A5hg$p7m86lYok4t4W*KG)&5@!JO>2Qfv4BSZdl(Z)=tDS2J7v36-7KA zj#lG+3MRMFS#%GwJ*?3<6r3j$ze>%-pG+lb(RGeKlKbTx@li!M5_gJJn1tJk&B%y} z9Bm_83i^#AE4PN_L6GXDdbx|vSOZ{;*yvku(6blpt>i&^um*iZo2i#<$M#JaWd-q4PyCRf{G#b-TUx9jlmV_jRqQHcirBnzU+1$%{CfINl8(F{guVr zRpXSuUMI!m!Te%HOiS?7 zueS5&fWGv4oQq{kCE0fk0U3@&GcvUL0;Xb5S%>3+#b(9ZnV09f9b!cUYl0pw)h|RLO0z{zM1(`e;<2v=&OneOz14rTYN32@`3L<6EEl?OrLf#OH;~E)5RG z-#>ZqFBy8#i{M!o1=`==+8?HV3H>l^>mMAoe7gkp!Pghv5CRPS?^Ep8esr#1BA&ai zJ!D(Bt~9hxWwOb1Ec!v8RO+uHR}~zunT~(|d|nEC6ncRK@%=a>nS~N{+u#@KvA#`B zd%a)!&i#GWP7+sezOco9>ziZ>qn_lBSbUn?1B2~`foo0t!Js0nc8F;Hl;F#DBXf@p zkW%ETxvJBE>B@P(2idBmW#b?$h{bQ#?AGfxwOWD5y9uys^#5=pAtn9S{qpGdG-6q~ zSOpcJB=lJ@6O0Hb`8@0|iP<@Wt(gj0JS?MhA+w)?&*l0PK5g$Rf#tajAzdK4ZXj(4 zjp^VQv<4F{Q@srM;|tswM;%Obzj(pu*9sz_2nYK?-wnoOO&PUKmzcu~N&rc$#!%ti z`iuwE)|%5jr-ScRW!O<89fi7I2EMK&lk z-O^?Rr$$>{ZDfY_%%C4`rP~zJ>a4-x&5~q~y@}p8>1`J-n5Ct`NdPt-yOFnSX?Es3 zISfHp02&)5J^gDbZvP19X#Ynd)PzOQ1WU}V8$VHqpUtHMGj({I#}#_6>)p)jviLyJ z4n+kw{G-1f{|3iG&nS%j)%{l7;=|F#+qefS^Q#db2hrNVahY+OB9-Jgo(IkS_=*dj z(2LdPS5KRTs&9%jtiq=U6PqWWFX5Mx+%~gz(_e@MUdP#$TC9r)EXGppKi;4UCH=P= zy<3g27~ZxEm45#?2kz9*i{C$8I{;<$`I?Nq$&fq$-!h+VRt8=-I0#;M60{Wha69v4 z^DS4{7NPOD1U?_u4uZ~gV*U8nv; z;E~%W1PSZmwk6b@ten|?xmAin1)C5?=7PT5LUoq-l-uWaYf6*p-TvgMo-vbip)U%9 z*5tJR9kX(C;(5B#S}TQ(pfb?)e2@j`=e3z0)&P1LR10M} z>{79S7>y0Y-a8P%FPH4ue1ff>r>T|Y<vHq%MP~Dcfv%dkXd&6G`YKtuj&MWIYr6hs0ybMAm~9j0we1 zu+vI?=S$$vu16M44a`b9Rg7#a=-pw74HKkvNN}u))PD`&e16iGq(p~yk5@Q$TTQv()pDRgjV!Vv+cADS&3ZwsWSzVp) zPz?dE^WDjFU&VqgGhj4e6#~f6MdRFWtUvdF|A|1S_QzvyF>fp}rIrT=MPE0h&;x6^ zP@o=WBf$3|cD>yNdpP$p*Z*_>Z_+~o6t!%~cuU}s*+Wd0zu$->H9L>g>IiEVlk*0+ zJ&7;Ma?nz(Rx5B$(W#W2W??{e_G=Gdmz_WE0DK4z^J2ApH~ll_`)t8NxmsxyHa#3@ zD3)EhFzJzJ;xTgs&$$4 z+Hc0UEHec@Jj(UtO3=)5S<-%<^Sd7mC+rU7Fjwhz4W86PNar>8N6a+!S0S&g^-@JC zpmz!S;*bQu4s>SnnA?2#JQG>Zhey{K)iQzXmjAobD`d6qjVBaZs3L+`4&7~+s>j^= z5p5UWd!vBLyL=(w-Q2_ec_nrNT4HMg%R^I*F9;A6Ap0^cy|(c!L?>{NkC#`g=$1?s zk20QI?MYZQla)>Erqk#!tDMl@=f??-GaWZ=HQxI9Wo zaXh518c>Z?ih)*z7zJ7{ohHnKj?gFWF|64c`(XOIe0X)m7k15HcMitJ+ju2{OFaNy zs4Y3!!gt*v0so8mkkhkyGT`8uusyo|cnIld!>GDlCmO6@6fp?m3v8}Lm1)4q<{dQV z7D=mQ_qJ+ib%i=phm-H&Utihf65)vFRZCq?GDDiYbKuB^IR0mqkp|d12)vuE>9`!E zlSXi3F{l;|(=*?1Hk$`OJdVnBMWs#0RRETaY8o1A_-^+$HZ~_3pkYrj#kqd5pK)c{ z_ZNUQvds7aX%(K!l8;?rIVIfGWMlmoT7RI;p)=B2OVIa!KN)#rRE49@A^B=4B%xXcWQUt!^xY@F|8*KDHk4QB&&JVZA zi)i3Lb}KFRdq1`Sd)&j)`dxsnS*S2~VNW0?CM#`~M2I{SgLMBr06fG~@Al&+!BgzB z00p~jMfO8`-M!btw{`7(k03U{1C@MYt;zS{c@pr*#piGohAqTC|9tr4$n*BvXVhw^ zz0}}2ClQra76LJ$FL$JmcQBs)IG$v0Igyct6gqO^Xcx9?x=3tcxZFc%R_9QVj7%;6 z``~{;cS;@tSh?ypUc^!BHj@W|WHk@OzHbuwAOX zTxDUqp$200zc`7&aV6;*BE0t5-)I{sg8GP90oPSxeTl2B{AZ8tg2K@?a;A1o4R z`IsMpv1{F5M{lWw8hdM-wH^1FAhu>Q45>Pl@=*$QZ*Fl^3@T4on@gc78a76y2Epk~ zJk6%w6O*#B)&^aszr(gY1>6}_F_@;|Dml_>SNKHmVZAQH1f zA`O_e-}#g?Uvpx734Z?={>l4q++)L}v3j-gVb7ky$GPZd!VRY)x~X1FA9^urv5^ga zA!-VZ%Gu^`x0lY@xVa;{xBny%+|N9KD-z$`|T`U8u@u5k=a|5R(cx5F9XXM2k zP3tIE-U%l)vTcQhg$32^$8pAS*!!I=JCR{mueQ;v6tvBFxjkKzl09aoOFGNGlN=O^ z(5kAbJ)W;2gH9J6(pf!CN|C0J2<`+y1cE+$<(9bsM5lG3&;9G;b-WB!3;=>?C+_vb z0xuD{Ok;?=-Reyw=1MViAnlreTZetN`J~ojS~+~NkP(B?LC1VjzS=DXfz{~H>`jEo zBvooutJdXx@Gf_H-mGg>+fbnCbebLSP|7v4&tG=5=423=cKUzjHXck;di$V*S-SX& zn!bp_k}5ARr3+eGinjG8ba{9t=h_P%kAIb!m!aN-w%=7|!Y+=Ft&{L%`LIW))cGNGGB&jq394un6W zquT~L`4`oeJ{Z6K>fct7zlnWhOSLPZTE=3K+a+SHHt7AZ;yz<{8SxmT)K}W@jN|P_ zVXF#tjx1~zud~7pl_yx*{CBry>4(S9gcgxb`hUnL+NCg_M!oUaNx0oRTm#^-FM)1yuB=Uaef8jDaX1#SP0 zK=*z;w|%+_cDBV;9(!?jl>1O4r<`4a)b4yhA@)S{>IFT6v|{5sD#1Ulo5fQQ z_TkQ>klpj`mf==`Bl3eqIKUPR1MGb*u^6z;LBf?+=;Ct|&7U4r(DS*$=m z?Hh<1h{B}z)uZ)Auk;emu<0kFEfo%n+EFneuaf9|}MN&-QRAwI(zS#1zS z5gvf7Dzqm!BrVX`*^qtgy!RjoLrF&5s^Xt3F~P7<^N{!rkA+W{Fg`438b(|Yx-3<7 zEh-%;ejE{+<+P@DC`B+fjOauEInZVLJS-cIxM>U_C9lWVN~&S6$xc(q5Q;En!7iWB zYGO!BOZ_RIHoG!lze)WwmS6$6SJ!0orFK`V55VoOwR$%w)e<$Ks=h|Yp)BrIq~ns2 znhFFvh7a;Ng;Zf3Zo60xH^8qISqYc6Yn@mc3d$Ia5v%GhBl5Zg50|?AUlxD^xWhK# zvXdpSY%Rk)>YDUC-4zbT3943~WFr!_`9E$ zC-)!`AcXZ>;N>HOZU6km8?z|KT2z0PuK;m#KI^d{A+6H=c7}dlUS+_3+%IyO%BXjc z1_j@|%wMVgeeJhKbHxwA`Mlm%v2I@XJHY9eozTS~j3jp-I1lYUssHvw8SvY-J}y>5fGRa> zxlFZcb=I!(zW~+l$IL*+`(CZC^Wi8adlH11A;8Cwgs|X{Tb%5DshXmY8BCG;8504? zRZ_n^K9)-!IN%B81(nJ}#V#Is3!XHNb3{H1)T<>ranHaFo5Kn#rlfiaF<>+k{5(t2 z7>wgX+E0c46GB}Bu{2bp%A&zwO7JJeuvSeKxRM0AY8VrH;vTJ7k>uq+c|8%cnb`^H z+K=ewZ>fHXn>QOCUuh38ai=4+%#uQ;gt0@GppZ5fw}yvZvj282u~r5Z5u0*K?EXYk zg(y(wu^w&u|8q=F5g!BBgDX!2NuOik+?nIvOlz&p3a9k9B!HP zwqPJ(k=aN)^$s;E0&1=p?4^EGK1SFD)AMCz{lfVWYLSg61ng) zb%0T0;K_M(AG_lRy?&9SuI{RlKjG1>Y!7fbTQccSkY3}emfP^M9ZgA2snqnp8AwZ0 zQ*F`*RQenAx!N?>^7|VZq%>{AoI>`_w?R5Ui*)wC7O8NnRyTd2J&YqGpqaATKD8>| zTa;dH>-FVJ0rRh-B!cqFPD72S;mV=R{S-4)xNjOHK}Ibja@6Fv;BC$g9JRPs6~ZvW zG2-eP8u39GkdW=;#Cjq+*6W#4_VKN{@T_spEhbviYXs}_y=(&w} zU;SxdYuwxgy^4DL<3$)Uv1`~>Z6UVP*os^dm}{4V=OviMUN8p!NV3he)=S~WxBlfM zLtmpw>7l9CN>VP2A+f`?(?X4nv^U`;P3C)T3HiSul_*7|L%fBaThm-<>$CK%#16Ig zk!Kt;f2E^n>onc+r4YVi9lMeyoC)vWUTA;EveV_`ov4U#K?Wqk*lieNM-?(bFl@5; zf4?E(cIBvAQrrv>F`pi-f%z=}RH1lN@KD2|{DH+07Kuzm0gu^Wr@k^q%e<31iWiYr z1FVCpZvr=O$fmoygTZhDtKhQj&F_AX!NU|uK=gg37#X90xWSL%^8EjZddr|Xx~^+? zBLRX#2u^T!cXxMp5AN;+cXxMp2^Ju@ySqbhcQ}1NZ+&(6*;VY`)w|bPQ?4;)xQU70 z2I^}kYF7`;yep33Ik|d7!SRu`22M^i9`Mi5VHD?(XQJUoHs~;EwTKb?LSZ1FzMO%M zXza7sIP}%S-#Jh)l+npTu+lz@)BJ3o3bBzp;y8Q|*$aKJ7+KwcB}(qct^TxQ>ITyO zxyU%=fVtMi@X$-@@E5K-o3M^6RXp#~s9|a^Jq?3I-B)ljEs4WXTqBYP_4)_WX?#hg zwxO!gQiT`VSgX?^QfjI^#3gU26z$yt5`rz)E0d>Lm6d zk2`}DM>uc=Rp1XYk6?Eh;esD@OM|G4sw%cJdHmCs5oB-8y z;z0b&#JS!KKELJTSi+f zXZCM#Qi|5w8xd%HKIZO(FjNb*e74g>yVb5Tti8z9d`*C(K?tVj6}+=(!q_nVd@ao@ z_~S)#llB76>QV_`w~V}oUv1p%4%LVw;f`)->auV4Tlz}N|Gl%~6qAxbml+@~Ap9qy zhTzUTP^RExh6!55j7FN>9Bhx1Df-u>;wElP1Lq|~qRU`~Uh=2HUiJx?^P#eL**C$xYjwuR3&M6);+sa7NoOXIIq8?ea@%2CWjssOc*|yi!OU1AYwQAI;jQ0Fec1*I%->_=~F~Bq!Wq} z=)c{84`RZp`}6ePaq36F6VmCrT9`Mo1;{o^$_T=1e~4Xvc*(*f9ND9v=4*OZ$J@q`gob1ed?OK~F>=Kz6e& z{|4;_{t%Wf(SL(MwE|~Mgm+2`@^vqx!72e4rOKjVtZfT`v-yFZVSZ3di?T{HJ62(U z(CdsU6ozxl0Cm0`Z4Vhxe~qURr!)iUaHqGss&#%rFy#(CI($C33f-xNjCnKX2A*fjt zSH03Ovj;^3KbL+L(%#kA^A(uo1f3l07-P4SUYUI(yYebOW_qLh$Ovb#DzAKZ&VV0m z9Sf-0tdsmUl79W6=u_6k&cX2PT+)13|D7uKw1mrGcs)oA2BKdn3BUYeltvr>C9x;~ zw+$t;3OOsQ7r;`7$i7%wtC18xIk~^^3`s|ytEdJ$%Oi!o{I&lf*k!&ldsPPh6eTsP zKVraWT7uFvj^ zD-0``0=CK~40*9kVeNG~gF2--Ok8)~>S1X}6oJ)dq2*mw71P7E9(GWJd-S{7dB5fStvBwEMGa3vRY71#J+O?~QJQqAl6V4oKUL#uEdZnTR1ES#70ON??a$;9DO_i>^M}To9Fkv=9cI~sWE8GE)xSp(h(8IQ!DW0gkTAc0Myuc{Zx?Y{wL$leGX{|ICks~BzX$ zUJH!L+gwD(T;xzHjUA$=1EIcd#c2jhc_UecSYsoFDI_}J5*}eN)W)U3Y6mr&#s4AJ z>d0spHq&ue5Ld#$Vq1?YjWzz#-9;kTC>+U!oRBV>f}MIT=Vza_;4p6;$=3PwZJ54M zlDkM;9by6l2GOtcxM0W9TJ`XzjhhODi*)OPv)Y*TmF?26ky_Y9`1B1_q*|KX=OH?h0+lp(AZ&EpC*gW0N0Mpyei#UBF#;Foq!6e8O;^*&NqXH-;=j z-{oBW!aQ2>=P;KkmGGp815Mbw+DfcB+FC)dm496&_n4_8Kacw-R-ftZ?Xd`X5$LM7A4^*xwTIM3#z@x z9vGS~-oSUqb`qZ)2z)9`HBJ5GyAM?4#QbF@>2Yt)hXP#D-4Uuxo)n99reAB->&wfE zbcL@zzgpLuMJ$9cP;nDE=9**Vm@#Ogx%~tV{|e7fC09P!qDN~g?N%lHfwdtS`u=h? zR&BWG>0d4Ineuzf_*5=$kNJX9UB{Bx$;mwJ6y#!J+t>&Xjz0()fCJ#i1fl>}YySlv zE{s~q?=dSj&_|C8a z7sEt=aTGC7O~dU~bl5xjy074M5=6sdIgVN~7_ybnC&twEOUWBt?Cl4_xSsp1AWIUg z@Q_ym%^c}bo%@ba!6H6!_%e)4sB-JWrFsLwxMu|eM)$K~ny3aHQ(;`^zK8QB6xfnn zE432Sdrs@-Xs6*{kmfneR$zgOR&-+_1kMi06pYRWqvuJeL?;>@z~I?cx8&X8PuF zkhe|N8BA8`YO`IeHe6SK)V9U8F9x9aPx77qGLEXoYT?uwoM%9c1V5)c76_s4J^VQz z3~No=r$&=mC9y-qy;xi6EiNh*ENF^&{J9z-3g=e!x!2VS9S2OAqU$t%$4|Z}8^(@x zZdGtqIy7{c+25pA`psaP-$Sc(sd#HJK^KMMUr`Zn4+)}-0Dm#W0b;f%* z?Y`&S5SuJ!LxU{y-14fw?RRKT7ggE|iIDrR*DaLUYjwLk&i^gxpHsh$8|?fI1}^xB z4@4l&iVlfolB%f!8c^0Obh5~}6BKw8X7Zrlg{4QOQyaWYb;XlVo3x=~QGeV4~FQ zJu9@X>H;1z`U_h{OznIz&XC|?Q{j@fA`L~A^vt+S1Gf2cZ)Y5I<5vNjgNULLXg~+Y z_(00deOS2nKJj2y(k%3{+p2$m83$xkZ*cO29+^$0ZqS)1*f+4;8O#Vmqf{bkcRhyC zG>x($Qp2-g_z4_o0w8`En4jnfIQ)9`|2BYX_7&Q9r@PC?2r<`8zllt~NpiSgA-JQ7 zi?=r?Gl?PdwNEy`i^Y4ZBbm(EbrQi?Fk%FQAoqg;(drB~VzNrL25L%5=A-fFqqFW1 z7KT#X$A!wJ0?EWl`iCkXzh6jv&q?E60DN|s)n-1GV~o&JLcN?9VsRTZ0#c*Xny=7g z&VO`<`+Q%@@X8eJBWk@Gfp^3u3_=$9i-N28{R?G8%A7$SN_*{Q*F+}E$;)o!JvPtX zb!l$q;?MdJkL`~KDXCFl-1-NvS4x!4dV^|nM)Q*0I?0&T{!41CZi~I(?GQf3zXhp$ zPBuV&T3iyaE%A>g$Qf&?B-gJ&N_6>ba*QgEQ&unlb9U~ud}VVYoY>pGHip3!PHKdY z=B1D{4lbT%WSm|o4z12KP=b=^V;GsQxJYN5i&Pai!@1-FIWxRHo~DumH`1^xGi>)t z7(8#HPpzm1z0uTxW54&6D6V*tfRyq(ht~rxFk(@c!Rzp_xiXb5?Q@_M|2wT`WTMDs zv4oym(1;?hLPG{>u_+D=cvL5T9-)WEc*GptI7%_fQ8!J<_Ss6~7g8q@MUh7M$ z<{UTQYm-5}xQY3g*#!D{db7)W#!2GfQhB-vS$n0{!VGa}wSKep#0}{d;%mt)-aOMY zFx3sK@$k*-f#yAH6$83WN@n196}S??r;SZ*SV?SgJ7r&&6;PB`C{>f4TRll6J6mmV zSV}?AUaHk)FjuR^Xb(jrwYAe*^9;At>BqKi>hs84s(vN(SJFwBTOE~qw?g=l11z!4cqD9ghPniAEqjt|1Vh`eu0VE9xlRs?~`XXoA|Hd zUP=FWve>v(K35ux&)-Y#)d^JWZV&O;4HI0~fYS0GA5Wi`fmA>1<>@BLJ$k<90joM`@7qZOA&d6ur_{+vMvUQc$)G(8N4D@u?{I-fvzt=)A-X z-t#iF-oO*bh|>=`;k1&#m!+^2eUOp43)4!{MXBFbI_0YC`scnVhijTxfH0||phQ@C zu&lDHqD=QfS^;x0!f|EGoI2*so$iD8>d7SJOgy*KhF;!NgSV#*SAb6>Tb$M+WY_sH z`U`3ObEY)+a-+N3-Y6gX$8Y-UL7Z4TZaO6rbIgFB6`0GeR;$~yz6~&eC1C@U*}>vl zLpK5j?>Tg4_p2R8aDbK0>Elc0>&Hu@ZM7BzFlPf;RdZ&O37N4V`*%+l=)Vc#!16<+E*n9ng@yJAS`8NE&lftI;`$;dVV+H&xqgyFGeE z!ju?mdQ3k3`{K~{oNXwieWzMFc1IcJe97G81!gdEImY*TnfmqX3RMdIaD3p3P{p*y+(H=3N;)p3dhowb|vPe_FdS30$Arm^9QL9zTV!?#m>+6^Mt ziRALKS#0-1^?SgV@3}<4RJcpY{N%CE+krr6I2z`&SZ%5eL4*)^zS-C8a%L>_+|GL} z9cK|UPWvq2h4O#g{Gre^JmL3)XSz=C7qExOXR)21=J(yzGYIMCo=&%m-UGbqnGor#$&Y6(2|=jYi&HuuCxj~B$IrKBBOE|=5d z+Ak;wfpn%~bGbBu{Z-M)D_g3hC#5Nj(}n76a`hbHP$WNQ$Nk;nZU}*BuL_s*<#M4m zM~|C*K1ULdc_jYv40e1F$tEU`>7firrDgoQB-m!Pb*tW~HC;^2r01!t6=90~XB=vkFC%5LwDVHjR8Xcej4>0E+AEmj6 z$nsM8{WxBa$BM0T=j&~b_*~xZ%Vmnve)>?L)-65Hf4}RsGFjvCHQGv4;ss=j#XbocRQu0>S5B&c@enUi%q4>AyfWjrt6X zwd8x>et-R8dw1C#gCk%RD#KG|79T7#K^3;N8^o{1xF}RLYg$nvOkaFVNYJX#e-8t< z-e0 z@_H?m`Kq^0W>cro=aS1`^o7Poy?poqXZ9D6z;WUuG$|Qb4xba*$wkMv2GiH;BgR6% zr|>3reSpQgJ>YdZ%mpB^uqDo?hK4D)6`}ZKc*Yaa4<{G0U-moVDN1Qk51rf4PJiz_ zGwS)H_}(AW`D!~WHl{K;Z8lyIF5x|M69igJf;TZ z=jGWCY`Q6Y5Ag9@bvc&c;cHK7Fty8N72WzW`%+%odbvz$F?)fLVy%wGgdQk9QEWPF zZ-)Vb2}Vt!NwfQnQ6isFXZQKxYu8y!ipT5dE)wm0vYD6|KhOdm^}h2u=l8jBlOV;d$Zz;Y+`h?n<_(B` zW1noD3&|#+e6D61r+DUCWUZK6P$};xvAA1lI9{F z3_~Bz*II0Y!E(8LEZ+xZW8X^SIf>khcKW($G>Yn{fLP0?QNKHW%kNVnGUXTF%Wt0! zR~zjX7E?0S+W&k&pki4s=4$ni5b-KDJjg*=-R|{D_eD|*iIX|p?Do^I$rVdwD!d~` zxi;}Cg)cQ5Uf4XVPsP6P?U>+Tc^-RYy4<{<3w1lO&DOkL7whs+NV9S>e11Dd#s65T zRBH{7r7Bc-Eh6eK4FFc3T2|kPukfJPgErgY^xL8M ztrSY#mxCpJyY=>kxcDvf4$)5(+udk(+GiilAq+kDB9BO5ma*^E1-F~(T&IKJZO@9+ z5fmaDO_rqgQ<;GJE!i%S)i;QZ+t`0O-KUe>3qZA61X)O8=gB+>WU!srt72AHqx z?-!~jTB^!cn8w6@v!iJOsNhLnPZo;>&$ptHUr>K^?O)1B_Fc8cvf&XYgh zGkLH3uN1ewcRZsfhz`@!1sG=C6%5__6Zqhq;(Fb zF|kw=R8cO$yxiYMzGqW~Cs=ttL3E%dc*WDHDM~WqTBK26A$0?5f%$aAG&m6J|ScB6iZ4EiKC5`LR2uH1DSgbQ>hF7LTLn%weHZw7XB=5RLK zO|A1uDw#h3ac#HSi3Nfs-E1;Bxtwx2SuK;CW85S6=6LD?3~J0i4$J;~e?K+0w&RD| zyOvLbZFPT?`O!~_Gn-d?k^qnKwea_%ssqH#(Q!XMwx(NCfSzU@t-iED_>!_VgeD64aG;m$mFUXt~X4 zsbC;-jW6G6PM-g{|IFjoY%)DFD~o5hV`i=8(*0$m1xp#!t$IL6$a%ZJTybJ2+dQVIFmI*n>&7#EzB*zA2KWj~D59bse%wg+LF3CvNPzr}1|n3; zbu2DwU!ayT+Fh|ZJ?}d8{dgUA_eYzp{C;r9taD^}lXwiCaboWAvsrUFlC)VKjEcdd z>niYobJO)C^|;`$;gLbMSgn~&)^-CYDE;%#o8iy*I-jFSS9zY^l(_ZFzY6H%Uy^lT zY;}UcKp%5;h5(J@b${CG+jnR@6!Y2QJTkR+-!4k+u!B&h{x|>v^#I%^>EPv zw7As*Q+>S7bAB=(rRtkaWV+oQ&%}Se8onYH4mTBkEZ3b}#qW>0sr;ovq$DgNIPEky zsh?VE9qa10RV$QIrneAM)kNvBxoA&+X12oW|!3{4vX>iFkhZ%CZmGg zu;mOiCkw^D53M~p<__0o+%j(-!P7qkzt@SkcQi#3DR9&y*0BCm^I4)=l)YWi4X3Fe zXWY+Zi)@Y)WoRLn?h0(<563TB;k2;EEP40@r^Upvz>VBx57rH@B0JGTM9RNj);1PD zK7WK#uU0Z0*bVLr@qX5MHHXFcBN@5!+d>(5DZ#cMW{degpZahd_d5y2Cml`40CW`# zbV#qkVD`74_rK@qYXlgzbUdDQwd(0IY^IHf$6B5qaJyYB4%IY7|3$?-&!`kBxqEXG zM*tJ}cv|!Nffbv0C2z^Jk@H12Scf>cHWWUS(|q$SeXiB+ZEwv`c+11?s^L5J2`U!$ zy#t|?#Bd6|-KO8ibLoh2Y>n=prdho2fU}Q$e!qx-LZ^lzh{N@b17tFlWAi%5-(sir z380fY(db{sIK}MzkC7|urB^#aGk4Fm9p~Qf?|7w^Qjt z;o)Y10BY0VGxuVH^O?qRSh|HykHusilugw-ynQ{sBpfojmX8ULcTI&<|IU%aT*C;w z9?sU-tJzocX?gHBas(yRaT)`K{}-EMi!Sm(Z~@DR0Gc-`N$teF2#G z!+XF!rh>P`F0-rIVOZhEEU1>o8k)i{~ zseL>!vK=sY1dOKs%*W<1APMvX^QA{q`SBh8FgH`GHD<$;$k`4avh*T{fo&I%Av1ue zG#h^V*5HHpxG!Ds0xUf-N#ZSDR5eOBV;8#%@*zqh$zL9|43tO^NS#IE~WGCG$3ljQrbF@`w!K^6d2rF_Z3d*7r0R1)z-v#n4NO(*`P?ObV z&W-74x`_WF1z@E0Zy*u_ZhxwjB4UIU$BFBd9|8SUI0SruD)kc3$dIVk`YPv(kfM#| z(r=Z}YB%+N2lzFBk=`Fkj4-M;z7|2fB^1<5I@Pw`tN^OQ2(=o`FHiNx6B#U6tS^4C z?6%%F{UZS7Dg^TDnX$Lm1YdGoAt`oJE_A4HX=UQ2QRdW^azV3A(spcHn4%ysOfOz+ zQ;1G$E#>7wO;IZD)Yt>hM9aU-l@m87S;IsIJuIh0ZnT75q4^@`)D zcc0c|NG{;py=lbS0$|O*_n{YA9Kf;q_TJaycHj56;4kQl+FX^r96&)>S6J> zAQg$C*Zb{$wtStGghtl8P+1O&OG#PmlwBj&YWYuSc4Xw~NyDHlkm_Lse*SAN&nHO4 z`78lPRAaRli&z-vkxuu|Tem*a2!M69F`4Rll)Fv+*yw&SE4#cgL1pnhoB7=&EYsQt zAF?7>fGeT%3NejIaHRk=PaF6e*ubj0O1=KfKei4?2YqcI)%XG*EQD4psyBFTH3k9! zCQ2_GnD$v54osc_F!?pvIr!`rH!F=t<2}I2#{j{iQy7Gx(P(VvGJkSJfd37}tSg|9 zq9~ehnbPm9^FA0A$7a=Oaa<@wz?n?v2Zj;d)uQ})8m){>{g_m0_6G@Y!><;3#5cG8 zO*6Bnh$LLvZ{6(XstE&2om<=+pz8Mm0oe{i4C zcQJ>+xR!wowo2ZUbud5$4CK%MY+xVY{mlP*GbSvaupr@noT^Xs1?vYxf}za*KoXRd zmRUMxfem42nPJLoG3Wyk(w^Ob295)B?VnxTu@z7Cv(qwiDoxb3jR2w5L?K$B42pEw8$`-8#Yfc~$ci-DGp9J;H z7!QHv{hZMTfsB{`2WY3|H;>sy|FATAVQl>tT*eKOY>g3-O~Da}2&g||%$8-uicYh? z><5$vU^{vU81y>pt#aNM6h*yz~879lYj6amXf6Y{n@_b;48bZUKt?VdGyqP_Y-*`xDMZmLBRG)J zPnMpF9q>&P8J8Q)W1Qy0kTOGNe~Thte; zU8N$|MgYeAcV88)SS=cR>*F#M2=sDzT>hOs!>z7Nn`{CS*q|WDzg{VYFvPOA(>uf? z-^Y^K@l^A5+Jr|&_M>#8MHmMA2hFErH$jZAG_UU+1r)56>iF+_@~7-Jzz5B@-C{(1 zr?njX?{@CjM!*@$oI8U;sjk$?CjyGg$jG22%=|w`6$wmucDYQ>Mv)Ozz(`KD{muqh zcQ=Oe=wfDX4#i<^SC0?~YE^Dx!tkj=1vA0FBhxCKRPX7?G}E3UIdS0*v}!#dtA!mi zH0F=e=_1L{CcBmj0{by3-$f3bRncksGP zV5fy46o4`IK6|?6X>)=gP#wr@wXW9fFa!KEjR$4Rl2r<&lBsam?Vv!Sia@&J!~Nn1 zv_3dIZsvg$a>R{V!&n^>bnxFX0hF@Ps9mKeaU0yqc$J0er`FJ9`A;%O{~>C`sZ-?I zp@K8b6%B8&O#;Fx;9iM;7s5RI5I9Fz+L0QM2v~uT;XJ3K(qbuJ;dqk!a=pcv+<*g! z)Hi)zvH9Ne8k>!VGiu*DF)XjFiRV6gui8NdclDE@4l{igul*q`^N z|9`v)C~o2FPY@=TBY+HOxp{oF&9)|2XykhXZ1VkusSkUbKma(f!X8_cinUsQ`T|~i zWHK35!Lhj<<=2I=EMA=>)vYOKi_gzMY8ai#5RcYjdfEaw{a62=rR7R|FS>;ayduy{ z15juTdMz~2XcC<+Kt=2Wd(R*QrqteNnk}5zYnz zVyO82{nh3KG*L+j3HM_8TJPr@CJ&?^d@9|(UHySZcJ_xm*NJ5O54mEpIQ(i2CgHYt z+-i&wQ6PZUlq&$&O^ed;M3m zn-sYJZXc4>x|94&f#_wW-zD&SW$GiMeUxmfG`XBUw6j{J((BV*4+b6z_j@PCVK`o0 zXSqoakLfh=#FZhGUxng;4!5}1`B|iQ&w|z<3cG$T&vmG{GVBFmD4Lnao*;^RJu2vezboPs8h9yBiS0`WB0-S|a>$v^E!X0sBt_nz=V3taNBRAtV>Ffa z_AXJL=VQ4L&~42Xu-UAxmza(%SS{sr+wY8be=b%kOTV_HRaAt=;sVEC2^+)l(j%#j zfk6TA4!^&4IRbB#cI!{qtuB{|`bwyO#6cPF@c1x;?U88@Bx{M0t`|MTx3u4?+Fj$U zG;B>tGocmnz_sJAkyaK!1Tdj})N0kXk1A`>7af<2+R{xw7n^p35qul@K0-io7kwG? zp}0d)c)2QFo`7ivwHgioQ#RQ1?Ljt&X@uF}P_B=IT{ag!qG#(1uN#n|my6wd>D(a; z4M}!dRM({QVj{~|?tH1nsn;%MqQbbQX+bcQ4b`UI!pCe;uT}2r(xpN7K9WpKSE!bpkLI+#3MaRccP=YJmaOJ14Hd7IWydve#Jq=f`sQ=iik^ zr~P3*pkk?PHfhhA0kN%rqijCWeo`XT)!`;BBO?POIQL)>t>?>vWUpsqwa^cj-S(4b zxSS10xNm1`#@y@WoMo9TJ~52*hDW&uPGgSc}z%wPul0I2WGYl_Ah zPjmBt#|aiGnK#W|22og1Z#VtnkivC5=&R{i z(ud)G7>@04!z*!oD}7kJhx=6T8aDaXrDGJ<0^hf1jLXjF!(IJDK)~{T?glNJ!?wX< z_U{f0;iB8llc$Bh!!`p8I*@Awv#3z-H1+k+?%Z?)Xhf!_r>>l`@*&^UrTqy*{n%$P zj|~iSWuhR5zLtSCgi=Dw1u=icV`-<}_PW??@@Pz{ygaq*-01$C4er+I@-zipx3L**j0Q$k+nf$&2Wx;*y7Tqr z*x9Hk+O(EuFOyfaePVW#X3aFOr9%fvpJcd+NSlR-Ee>{zWsG6_z#SK;=hP0t{bV5L zvU7po?*p7%J_ncaUq}3w&*idEO0@>-cJ?E%8kd{rZvF5$p8iJqAmYtF=G1C6))=Q= z@V2{Qao*tsO#_C!FMl2~(C^Q$?8fP(|9`*PiNsm(L|JU7`rW{l?%^=L^%^hdPlmy} zgP$hJdMGNN74kD@hK9>#^C5^uFZa=!gF-Zc=m|S zym`qdV1O9PfD!i;5{%(yFVerxuyFn|v%dw@R$xL1bD#n~BLZ1z!`mZl)n51RJAXoP zic3lcr{X~Ah-CChABBD$9)EBqnR4v?{usi`2{n{yq+V-ik2-qAro4h zqPI!mu3n_qi7Mhdg0-l@ich;Sx*~>7qHu~*j4&hu#$$-M&n6;ywqFYa8KyEUzkUU;K{E-9_Mqb> zSd>PKmNyf140aig1Tp;0tIz=YyeABUn>^4q!9(cvDdK{v3-(&TRT9o52Dgj#fe7^T z_3Jjuxl(h<2hI?u`f-?*r{$q4RY*T(nNY!wxwIdIkO^A|BGufB1(*%~F<_}@%)*Qj z4adDaipLFggO#D?>u=oSE#^c=|1z=zSvfi1hoILUe_fxFrX%+M>d3NSAOiyzxy6yF zWfCuLk5_ajG(#l8Ql)QOcmFPJ%iu&x%R=p^Chr8t&0`a_5JAJ0!2*xW-BZ*!ihI|3zQPS@i z8PQ>TCI!Ep!RZ()R|9OXGsD@|t{QH`h_=iDb^idbRE z-I9{E@sOjxYN^+p9D9<*_-htFqoskIzWaQ>&CW7Sa{Q4V&TJo^)QB{OfYF8Cw{zvrOP^u~Na zzUt^+`f)o97m&otB>=^;JI%_L1~Q@y`OpBZfTVtQch;(WHc-)+@z480G0H zRw=l)!eFOek+|CjEaK8lsb?9*ZZn*ZR1L53?|e^MA~6+Y-K-1Nup@ES4qEu~&PTjo znV%#c3{fry>tSE?I)7915|-L6k@Nt2ybZ53i0|&A*baAffsOmJ<07^1vw7LDzoLVn zM*Ey0qQygqp70RKWo|2f*J77Rz?fH^aV+J~KUiITLbk?eQu(yM@L~b`sb=CwvMQ4v zlN|Q&HVj$kIr}$^)$3n*X%0H*?Z1sbVB$ z=c{g%0U%WXe1|!gQ+ZJ=V>#*mlwlnFl$$z3Ug}lFHv@gpH;)`2J#iFeKhG?#SpWHkFt`^{7iySOiA8u6wP@?!A+Lvpt?ns-2b|z zWxWbr-qA+8>(tLPWo~BXIEqr|n%`+K9N>-}Fat;WPZrb1hK-xtOir7zg%IjMr8T@5 zH7v{TZ?UElvkvhKE(C1S6lxn}5Y($jMC^GCyub1EHzfA(qzWIB(;+?_>7F_Zy^y}Z z8Q+4!6g37eH$rsdUhI#LMJ2)pdlThDKBg)s27ZBEta;zkRu$dXz!vRwDHXV{(l>fV z*efGCr#M4>p1+4-V~#lL$M_C#F}GHa`KKdV#kvMd@4{7c!|q2e+2d+-utGoa_BsDda4#$gpvrSTpKNiB1-M{vPy1n)x=|d>VP)hh^Qd!HU?+>zGe_Pm;Qmo~FK2!h3WU%n-z~VlLpLVD zLNu|3jKeB2S!LPheWz+Od^&G&xeB%L23H{T#{78TAZ34e5~$oP zE<+VSlv(A4LB6YR?y3n3C$br8*WDE=Jp!5-$;Ym`SUvX52 zh!11XR#q0F9IeWiYtBmCcs;w_=I+p*Qa}DDx#{vvFTkpmyajVbP7u=nwDu2E(xb)N z<^KBX1=Sg5LM{`tq48$xK8LHFR6WY z(&>A}Hv@NS`_aThoBziGJpO!VJK;)2T+9$+D2K~Z_#Hp(!h;g@x@anSi8eA`LbRhx z{=IFY)ZR@_g0ZKdX{4Y^<-Z@RT>(j;R!l@B&5#XKrPASbqyzScDdta?AB@mqU8YW& zi$raDZ2XE5VPJRwa_j9w`=4i{qLlmvN%iixIe7c ziPU6proBIh5^=q3qP&_2&3(SqpHC9%+v}5M>Uza7NTJ{j*%y4?`8qj)GbD~Jso?PF z?H4>&)mN>dxku8W0S{ztuJA(yi{uFL#)g|tlP-T(ykx_v!m^p(vG0H12lWqIo&1d@ zO_spNgm2wl?RwqJI2qwew>|R*&vB=Ao?3`Vod+G57EI*#Qdq2ok*pgtSOeu@ zsqj#yx!%4dS`>6VHhP3h;m!vCy*1kEAu7n|?eMSKxTDnqp5**oV9^hMJ>9S{hOq`g zwVcl0?k))Q0$SAGv&Osv5(19bd=t$wWJ_)IWj4zrWzM`|Qu<8U{rtA!!Gl2RK&#!d zBU1=^9LRm}IZZQRxcps`F){0D@|cR$1|D#h^!0;@{yeLi$cWwzBid@0-mY68Tnap+|ijgaJ*M z>|NnLMFp{9-s=q?l++d1*?T!%rLe{F zbT#0`-x_xR4yqhZpbPD(c(I{)0VB|DUbJUrk~kdOVW)`ptQL(cGz(qdP5Ea3E^ba2 zTv-1XG-3R=?SDZ*Hd`@Z06oG9EI5U_3s|!YT1|N*c)@=GM}3KB^z=$mMe#L4$+WD` z6%5NP_Hm^dhQ!{73J`}4ydSL#K@Kzk9iFxvoZP9POB z()!W}GCY(?#r~D+T1}5*T*EcP*zaK|M_XljKNN82^|GVZC8TuCJhFsr;$a%*hKF&* zzJ4!)Wv#o9!6JA!6=+OhGR1xvAQce%l}3F&Epp_3R538Ur(t^T9xl05 z=Tf(g(O35sjo=T8>@aJQIL(;(y&=5W;h^IZzp&%{RUNsdS!7G3iGCfX9I2&bB@}0 zT>AniCugQ6Jtn?As~C{Cn(6WbZ)+b4yCs-GHCYmqx6rGJwn8D8USuCz!rJ_= z7Xmxxc#y)|crSIP(YUj6rDupcTf#RGa_^SF5tk}lar}_JP+WmEtqxVgt0|uPklgbF zp>Q1grbvzwAJg-D(R z>w#oWI0_#jk#sKle*bocO0}Z!JrF>wl8~H6Z)p;bnY)qKkNPOlS#ioxZg_HYa(+z0 zgLT5*%`1yihSh<322+3Ary>-*Jn-ne4i$n2rVJe}B91;ucJMi$rhG>i3)(GSO{*4H z`3Qd!h?IZUhfB&mca$#wCn`I}diyO5`_k7|RHLN?mncAPb9*i18_}AFQi+ZlBja`8 zInu;Ip$ipX3RiCU^0wu?jOhm7Yr4E^xt!7OA~Wh$x?x5Zv~%u+3$3v^2G;%vq$W(s zb>5WvUMuN6oZ^=X#sQneu)<2`nYDCH4#}} z+Gam}E){5p6KBJm9HUFMa^O`!arRACY+3l5aHsV%PlSAwzMK!TqCHAnxs4qrWzq&z zZiGB%%6DF@16Swj&ayQ^Yj(SQ09OmFAvc1J(N+Xa#AZ0HQf2YsZj1O4al4nBPk{&? zaKo#zQ7lp)9mBBr5O<9$=41R|7nrBab;UO33wfu0%YSv^jA4ujSIB@NbL-0NbvLcD z)cXq=?RB*V$7oV|>pJ7(&y?ARRarOe(EimALiIv#3#Y6Ssi8GE>hEnB@UQTuKikT% z_&c{(f9FH2<$C?cfdFrWv(f3a537GXm^g`(g<21-X|LAQZfv(?c)}L#gJUSS&O5r)u*9yR!|%9`4TH5g2QS zAkQfRU`nFXg^=cgj#BQx;w31YeoM2ylVc4f3N|iR>$@CMS78Lb{T`;RHuTm$H6GED zFAO&=j=xzMZW~!1Gx_w_)In~hu;lQxH>S*U8fXbUyQp=pm1V%$YqPAe{$4@445MYF zETVuFM&zxa2Bg(h(Noy^jwPU!y^i_~x^HbKe=H7eJOek5|AOH-+j9-Uef2OAVdnh| zTVc!Vyey1-3N5rdyd5>}gHmNdzT&$Jpe#=N&Q4~9W%k~RFq$;Lr1fWtFPA(Zc|!+{ zHQ_cXimAqxVr}Js<+~c+)91|{6*7=(p>w~o-c?w!5{%|RJ?N?&mqPS1hTA1eD9176 zzB}eGU&C;Bl=1&aDy76H^2yM5$aqtT$;xdX%)DKQyPg;GeIBgd)N?icr3v++psVp- z25WbSiN>$+i4s`-RGMr}ga`Bj<(Ww9^-7Jg#m2~ccwe$EQ(%0AWD$wt>u(YCfG#S5 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�(yj@h?n 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

>)yOs5?j$&zRuTQ(zSOE17Pd3@q)*GAJ%C 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 z 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Ξr~b;tw=8Zm=%ZmzHGfBgc>qy9@A56r4) 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

*@R}UrVwLB&_m~42B79!S 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%0D%KJ4 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�d_zzI8V59p&!H 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%0D&q1bq4BwJvo)cq>aJjb)3rKo$9$A``ma?hA=E% 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 z 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 z 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 MW?{-;WM>2TA73j+ -Date: Thu, 2 May 2024 17:25:45 -0500 -Subject: [PATCH] implement foreign toplevel management - ---- - Makefile | 5 +- - dwl.c | 93 +++++- - ...oreign-toplevel-management-unstable-v1.xml | 270 ++++++++++++++++++ - 3 files changed, 366 insertions(+), 2 deletions(-) - create mode 100644 protocols/wlr-foreign-toplevel-management-unstable-v1.xml - -diff --git a/Makefile b/Makefile -index a67fdd3..e0e1260 100644 ---- a/Makefile -+++ b/Makefile -@@ -16,7 +16,7 @@ LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS) - all: dwl - dwl: dwl.o util.o - $(CC) dwl.o util.o $(LDLIBS) $(LDFLAGS) $(DWLCFLAGS) -o $@ --dwl.o: dwl.c config.mk config.h client.h cursor-shape-v1-protocol.h pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h xdg-shell-protocol.h -+dwl.o: dwl.c config.mk config.h client.h cursor-shape-v1-protocol.h pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h xdg-shell-protocol.h wlr-foreign-toplevel-management-unstable-v1-protocol.h - util.o: util.c util.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland -@@ -37,6 +37,9 @@ wlr-layer-shell-unstable-v1-protocol.h: - xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ -+wlr-foreign-toplevel-management-unstable-v1-protocol.h: -+ $(WAYLAND_SCANNER) server-header \ -+ protocols/wlr-foreign-toplevel-management-unstable-v1.xml $@ - - config.h: - cp config.def.h $@ -diff --git a/dwl.c b/dwl.c -index bf763df..648616d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -126,6 +127,11 @@ typedef struct { - struct wl_listener fullscreen; - struct wl_listener set_decoration_mode; - struct wl_listener destroy_decoration; -+ struct wlr_foreign_toplevel_handle_v1 *foreign_toplevel; -+ struct wl_listener factivate; -+ struct wl_listener fclose; -+ struct wl_listener ffullscreen; -+ struct wl_listener fdestroy; - struct wlr_box prev; /* layout-relative, includes border */ - struct wlr_box bounds; - #ifdef XWAYLAND -@@ -347,6 +353,11 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void createforeigntoplevel(Client *c); -+static void factivatenotify(struct wl_listener *listener, void *data); -+static void fclosenotify(struct wl_listener *listener, void *data); -+static void fdestroynotify(struct wl_listener *listener, void *data); -+static void ffullscreennotify(struct wl_listener *listener, void *data); - - /* variables */ - static const char broken[] = "broken"; -@@ -392,6 +403,8 @@ static struct wlr_scene_rect *locked_bg; - static struct wlr_session_lock_v1 *cur_lock; - static struct wl_listener lock_listener = {.notify = locksession}; - -+static struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_mgr; -+ - static struct wlr_seat *seat; - static KeyboardGroup kb_group = {0}; - static KeyboardGroup vkb_group = {0}; -@@ -458,6 +471,11 @@ applyrules(Client *c) - if (!(title = client_get_title(c))) - title = broken; - -+ if (c->foreign_toplevel) { -+ wlr_foreign_toplevel_handle_v1_set_app_id(c->foreign_toplevel, appid); -+ wlr_foreign_toplevel_handle_v1_set_title(c->foreign_toplevel, title); -+ } -+ - for (r = rules; r < END(rules); r++) { - if ((!r->title || strstr(title, r->title)) - && (!r->id || strstr(appid, r->id))) { -@@ -1288,6 +1306,8 @@ focusclient(Client *c, int lift) - client_set_border_color(old_c, bordercolor); - - client_activate_surface(old, 0); -+ if (old_c->foreign_toplevel) -+ wlr_foreign_toplevel_handle_v1_set_activated(old_c->foreign_toplevel, 0); - } - } - printstatus(); -@@ -1306,6 +1326,8 @@ focusclient(Client *c, int lift) - - /* Activate the new client */ - client_activate_surface(client_surface(c), 1); -+ if (c->foreign_toplevel) -+ wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, 1); - } - - void -@@ -1599,6 +1621,8 @@ mapnotify(struct wl_listener *listener, void *data) - c->border[i]->node.data = c; - } - -+ createforeigntoplevel(c); -+ - /* Initialize client geometry with room for border */ - client_set_tiled(c, WLR_EDGE_TOP | WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT); - c->geom.width += 2 * c->bw; -@@ -2232,12 +2256,17 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - c->prev = c->geom; - - /* Scene graph sends surface leave/enter events on move and resize */ -- if (oldmon) -+ if (oldmon) { -+ if (c->foreign_toplevel) -+ wlr_foreign_toplevel_handle_v1_output_leave(c->foreign_toplevel, oldmon->wlr_output); - arrange(oldmon); -+ } - if (m) { - /* Make sure window actually overlaps with the monitor */ - resize(c, c->geom, 0); - c->tags = newtags ? newtags : m->tagset[m->seltags]; /* assign tags of target monitor */ -+ if (c->foreign_toplevel) -+ wlr_foreign_toplevel_handle_v1_output_enter(c->foreign_toplevel, m->wlr_output); - setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ - setfloating(c, c->isfloating); - } -@@ -2351,6 +2380,9 @@ setup(void) - gamma_control_mgr = wlr_gamma_control_manager_v1_create(dpy); - LISTEN_STATIC(&gamma_control_mgr->events.set_gamma, setgamma); - -+ /* Initializes foreign toplevel management */ -+ foreign_toplevel_mgr = wlr_foreign_toplevel_manager_v1_create(dpy); -+ - /* Creates an output layout, which a wlroots utility for working with an - * arrangement of screens in a physical layout. */ - output_layout = wlr_output_layout_create(); -@@ -2691,6 +2723,11 @@ unmapnotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->flink); - } - -+ if (c->foreign_toplevel) { -+ wlr_foreign_toplevel_handle_v1_destroy(c->foreign_toplevel); -+ c->foreign_toplevel = NULL; -+ } -+ - wlr_scene_node_destroy(&c->scene->node); - printstatus(); - motionnotify(0, NULL, 0, 0, 0, 0); -@@ -2802,6 +2839,12 @@ void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); -+ if (c->foreign_toplevel) { -+ const char *title; -+ if (!(title = client_get_title(c))) -+ title = broken; -+ wlr_foreign_toplevel_handle_v1_set_title(c->foreign_toplevel, title); -+ } - if (c == focustop(c->mon)) - printstatus(); - } -@@ -2929,6 +2972,54 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+void -+createforeigntoplevel(Client *c) -+{ -+ c->foreign_toplevel = wlr_foreign_toplevel_handle_v1_create(foreign_toplevel_mgr); -+ -+ LISTEN(&c->foreign_toplevel->events.request_activate, &c->factivate, factivatenotify); -+ LISTEN(&c->foreign_toplevel->events.request_close, &c->fclose, fclosenotify); -+ LISTEN(&c->foreign_toplevel->events.request_fullscreen, &c->ffullscreen, ffullscreennotify); -+ LISTEN(&c->foreign_toplevel->events.destroy, &c->fdestroy, fdestroynotify); -+} -+ -+void -+factivatenotify(struct wl_listener *listener, void *data) -+{ -+ Client *c = wl_container_of(listener, c, factivate); -+ if (c->mon == selmon) { -+ c->tags = c->mon->tagset[c->mon->seltags]; -+ } else { -+ setmon(c, selmon, 0); -+ } -+ focusclient(c, 1); -+ arrange(c->mon); -+} -+ -+void -+fclosenotify(struct wl_listener *listener, void *data) -+{ -+ Client *c = wl_container_of(listener, c, fclose); -+ client_send_close(c); -+} -+ -+void -+ffullscreennotify(struct wl_listener *listener, void *data) { -+ Client *c = wl_container_of(listener, c, ffullscreen); -+ struct wlr_foreign_toplevel_handle_v1_fullscreen_event *event = data; -+ setfullscreen(c, event->fullscreen); -+} -+ -+void -+fdestroynotify(struct wl_listener *listener, void *data) -+{ -+ Client *c = wl_container_of(listener, c, fdestroy); -+ wl_list_remove(&c->factivate.link); -+ wl_list_remove(&c->fclose.link); -+ wl_list_remove(&c->ffullscreen.link); -+ wl_list_remove(&c->fdestroy.link); -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) -diff --git a/protocols/wlr-foreign-toplevel-management-unstable-v1.xml b/protocols/wlr-foreign-toplevel-management-unstable-v1.xml -new file mode 100644 -index 0000000..44505bb ---- /dev/null -+++ b/protocols/wlr-foreign-toplevel-management-unstable-v1.xml -@@ -0,0 +1,270 @@ -+ -+ -+ -+ Copyright © 2018 Ilia Bozhinov -+ -+ Permission to use, copy, modify, distribute, and sell this -+ software and its documentation for any purpose is hereby granted -+ without fee, provided that the above copyright notice appear in -+ all copies and that both that copyright notice and this permission -+ notice appear in supporting documentation, and that the name of -+ the copyright holders not be used in advertising or publicity -+ pertaining to distribution of the software without specific, -+ written prior permission. The copyright holders make no -+ representations about the suitability of this software for any -+ purpose. It is provided "as is" without express or implied -+ warranty. -+ -+ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS -+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -+ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY -+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN -+ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -+ THIS SOFTWARE. -+ -+ -+ -+ -+ The purpose of this protocol is to enable the creation of taskbars -+ and docks by providing them with a list of opened applications and -+ letting them request certain actions on them, like maximizing, etc. -+ -+ After a client binds the zwlr_foreign_toplevel_manager_v1, each opened -+ toplevel window will be sent via the toplevel event -+ -+ -+ -+ -+ This event is emitted whenever a new toplevel window is created. It -+ is emitted for all toplevels, regardless of the app that has created -+ them. -+ -+ All initial details of the toplevel(title, app_id, states, etc.) will -+ be sent immediately after this event via the corresponding events in -+ zwlr_foreign_toplevel_handle_v1. -+ -+ -+ -+ -+ -+ -+ Indicates the client no longer wishes to receive events for new toplevels. -+ However the compositor may emit further toplevel_created events, until -+ the finished event is emitted. -+ -+ The client must not send any more requests after this one. -+ -+ -+ -+ -+ -+ This event indicates that the compositor is done sending events to the -+ zwlr_foreign_toplevel_manager_v1. The server will destroy the object -+ immediately after sending this request, so it will become invalid and -+ the client should free any resources associated with it. -+ -+ -+ -+ -+ -+ -+ A zwlr_foreign_toplevel_handle_v1 object represents an opened toplevel -+ window. Each app may have multiple opened toplevels. -+ -+ Each toplevel has a list of outputs it is visible on, conveyed to the -+ client with the output_enter and output_leave events. -+ -+ -+ -+ -+ This event is emitted whenever the title of the toplevel changes. -+ -+ -+ -+ -+ -+ -+ This event is emitted whenever the app-id of the toplevel changes. -+ -+ -+ -+ -+ -+ -+ This event is emitted whenever the toplevel becomes visible on -+ the given output. A toplevel may be visible on multiple outputs. -+ -+ -+ -+ -+ -+ -+ This event is emitted whenever the toplevel stops being visible on -+ the given output. It is guaranteed that an entered-output event -+ with the same output has been emitted before this event. -+ -+ -+ -+ -+ -+ -+ Requests that the toplevel be maximized. If the maximized state actually -+ changes, this will be indicated by the state event. -+ -+ -+ -+ -+ -+ Requests that the toplevel be unmaximized. If the maximized state actually -+ changes, this will be indicated by the state event. -+ -+ -+ -+ -+ -+ Requests that the toplevel be minimized. If the minimized state actually -+ changes, this will be indicated by the state event. -+ -+ -+ -+ -+ -+ Requests that the toplevel be unminimized. If the minimized state actually -+ changes, this will be indicated by the state event. -+ -+ -+ -+ -+ -+ Request that this toplevel be activated on the given seat. -+ There is no guarantee the toplevel will be actually activated. -+ -+ -+ -+ -+ -+ -+ The different states that a toplevel can have. These have the same meaning -+ as the states with the same names defined in xdg-toplevel -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This event is emitted immediately after the zlw_foreign_toplevel_handle_v1 -+ is created and each time the toplevel state changes, either because of a -+ compositor action or because of a request in this protocol. -+ -+ -+ -+ -+ -+ -+ -+ This event is sent after all changes in the toplevel state have been -+ sent. -+ -+ This allows changes to the zwlr_foreign_toplevel_handle_v1 properties -+ to be seen as atomic, even if they happen via multiple events. -+ -+ -+ -+ -+ -+ Send a request to the toplevel to close itself. The compositor would -+ typically use a shell-specific method to carry out this request, for -+ example by sending the xdg_toplevel.close event. However, this gives -+ no guarantees the toplevel will actually be destroyed. If and when -+ this happens, the zwlr_foreign_toplevel_handle_v1.closed event will -+ be emitted. -+ -+ -+ -+ -+ -+ The rectangle of the surface specified in this request corresponds to -+ the place where the app using this protocol represents the given toplevel. -+ It can be used by the compositor as a hint for some operations, e.g -+ minimizing. The client is however not required to set this, in which -+ case the compositor is free to decide some default value. -+ -+ If the client specifies more than one rectangle, only the last one is -+ considered. -+ -+ The dimensions are given in surface-local coordinates. -+ Setting width=height=0 removes the already-set rectangle. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ This event means the toplevel has been destroyed. It is guaranteed there -+ won't be any more events for this zwlr_foreign_toplevel_handle_v1. The -+ toplevel itself becomes inert so any requests will be ignored except the -+ destroy request. -+ -+ -+ -+ -+ -+ Destroys the zwlr_foreign_toplevel_handle_v1 object. -+ -+ This request should be called either when the client does not want to -+ use the toplevel anymore or after the closed event to finalize the -+ destruction of the object. -+ -+ -+ -+ -+ -+ -+ -+ Requests that the toplevel be fullscreened on the given output. If the -+ fullscreen state and/or the outputs the toplevel is visible on actually -+ change, this will be indicated by the state and output_enter/leave -+ events. -+ -+ The output parameter is only a hint to the compositor. Also, if output -+ is NULL, the compositor should decide which output the toplevel will be -+ fullscreened on, if at all. -+ -+ -+ -+ -+ -+ -+ Requests that the toplevel be unfullscreened. If the fullscreen state -+ actually changes, this will be indicated by the state event. -+ -+ -+ -+ -+ -+ -+ -+ This event is emitted whenever the parent of the toplevel changes. -+ -+ No event is emitted when the parent handle is destroyed by the client. -+ -+ -+ -+ -+ --- -2.43.2 - diff --git a/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/README.md b/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/README.md deleted file mode 100644 index 6f7118c..0000000 --- a/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/README.md +++ /dev/null @@ -1,29 +0,0 @@ -### Description - -# fullscreenadaptivesync — Enables adaptive sync/VRR when a client is fullscreen. - -Adds a function that automatically enables adaptive sync/VRR when a fullscreen client is detected, and disables it once the client exits fullscreen. - ---- - -1. **Why** - - Some VRR implementations can introduce distracting flickering when the display’s refresh rate is synced with the application’s framerate. While VRR is useful for some applications (especially fullscreen games), this patch automates the toggling of VRR whenever a client enters or exits fullscreen. - -2. **Requirements** - - A FreeSync/G-Sync capable monitor - - GPU/driver support for adaptive sync - -3. **How it works** - - When a client enters fullscreen, adaptive sync is automatically enabled. - - When the client exits fullscreen, adaptive sync is disabled again. - -4. **togglefullscreenadaptivesync** - - Adds a switch to enable or disable the fullscreenadaptivesync behavior. - - Enabled by default. - -### Download -- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/fullscreenadaptivesync) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch) - -### Authors -- [julmajustus](https://codeberg.org/julmajustus) diff --git a/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch b/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch deleted file mode 100644 index ccc012b..0000000 --- a/dwl-bak/dwl-patches/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch +++ /dev/null @@ -1,122 +0,0 @@ -From c003f450c197a0c960bbb355511f8dca7a35e3c3 Mon Sep 17 00:00:00 2001 -From: julmajustus -Date: Sat, 4 Jan 2025 14:24:59 +0200 -Subject: [PATCH] add fullscreenadaptivesync - ---- - config.def.h | 1 + - dwl.c | 40 ++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 41 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..886f1ab 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -142,6 +142,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_F5, togglefullscreenadaptivesync, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index a2711f6..7be05ef 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -322,6 +322,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); -+static void set_adaptive_sync(Monitor *m, int enabled); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -340,6 +341,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglefullscreenadaptivesync(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -413,6 +415,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static int fullscreen_adaptive_sync_enabled = 1; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -2269,6 +2273,31 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+void -+set_adaptive_sync(Monitor *m, int enable) -+{ -+ struct wlr_output_state state; -+ struct wlr_output_configuration_v1 *config; -+ struct wlr_output_configuration_head_v1 *config_head; -+ -+ if (!m || !m->wlr_output || !m->wlr_output->enabled -+ || !fullscreen_adaptive_sync_enabled) -+ return; -+ -+ config = wlr_output_configuration_v1_create(); -+ config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output); -+ -+ /* Set and commit the adaptive sync state change */ -+ wlr_output_state_init(&state); -+ wlr_output_state_set_adaptive_sync_enabled(&state, enable); -+ wlr_output_commit_state(m->wlr_output, &state); -+ wlr_output_state_finish(&state); -+ -+ /* Broadcast the adaptive sync state change to output_mgr */ -+ config_head->state.adaptive_sync_enabled = enable; -+ wlr_output_manager_v1_set_configuration(output_mgr, config); -+} -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2332,10 +2361,12 @@ setfullscreen(Client *c, int fullscreen) - if (fullscreen) { - c->prev = c->geom; - resize(c, c->mon->m, 0); -+ set_adaptive_sync(c->mon, 1); - } else { - /* restore previous size instead of arrange for floating windows since - * client positions are set by the user and cannot be recalculated */ - resize(c, c->prev, 0); -+ set_adaptive_sync(c->mon, 0); - } - arrange(c->mon); - printstatus(); -@@ -2739,6 +2770,12 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglefullscreenadaptivesync(const Arg *arg) -+{ -+ fullscreen_adaptive_sync_enabled = !fullscreen_adaptive_sync_enabled; -+} -+ - void - toggletag(const Arg *arg) - { -@@ -2809,6 +2846,9 @@ unmapnotify(struct wl_listener *listener, void *data) - setmon(c, NULL, 0); - wl_list_remove(&c->flink); - } -+ /* Toggle adaptive sync off when fullscreen client is unmapped */ -+ if (c->isfullscreen) -+ set_adaptive_sync(selmon, 0); - - wlr_scene_node_destroy(&c->scene->node); - printstatus(); --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/gaplessgrid/README.md b/dwl-bak/dwl-patches/patches/gaplessgrid/README.md deleted file mode 100644 index 6921d54..0000000 --- a/dwl-bak/dwl-patches/patches/gaplessgrid/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Arranges windows in a grid. Except it adjusts the number of windows in the first few columns to avoid empty cells. - -On widescreens (w > 2*h), it splits to three columns before splitting rows. - -### Download -- [2024-09-18](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/gaplessgrid/gaplessgrid.patch) -- [2024-07-14](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/gaplessgrid/gaplessgrid-20240714.patch) -- [2023-08-01](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/gaplessgrid/gaplessgrid-20230801.patch) -- [git branch](https://codeberg.org/dhruva_sambrani/dwl/src/branch/gaplessgrid) - -## Pre-codeberg -- [2023-11-14](https://github.com/djpohly/dwl/compare/main...Sneethe:gaplessgrid.patch) -- [2021-07-27](https://github.com/djpohly/dwl/compare/main...vnepogodin:gaplessgrid.patch) - -### Authors -- [Sneethe](https://github.com/Sneethe/) -- [Vladislav Nepogodin](https://github.com/vnepogodin) -- [Dhruva Sambrani](https://codeberg.org/dhruva_sambrani/) (Revived to codeberg) diff --git a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20230801.patch b/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20230801.patch deleted file mode 100644 index 2ade7da..0000000 --- a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20230801.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 958cf2c2415927e2f7b471da9ada7c6e7d169a63 Mon Sep 17 00:00:00 2001 -From: Dhruva Sambrani <44899822+DhruvaSambrani@users.noreply.github.com> -Date: Mon, 8 Jan 2024 16:11:30 +0100 -Subject: [PATCH] revive gaplessgrid - ---- - config.def.h | 2 ++ - dwl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 48 insertions(+) - -diff --git a/config.def.h b/config.def.h -index a8ed61d..7400b7f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "###", gaplessgrid }, - }; - - /* monitors */ -@@ -134,6 +135,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_g, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index 632dabf..4d810f7 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -268,6 +268,7 @@ static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); -+static void gaplessgrid(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); -@@ -1311,6 +1312,51 @@ handlesig(int signo) - } - } - -+void -+gaplessgrid(Monitor *m) -+{ -+ unsigned int n = 0, i = 0, ch, cw, cn, rn, rows, cols; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating) -+ n++; -+ if (n == 0) -+ return; -+ -+ /* grid dimensions */ -+ for (cols = 0; cols <= (n / 2); cols++) -+ if ((cols * cols) >= n) -+ break; -+ -+ if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */ -+ cols = 2; -+ rows = n / cols; -+ -+ /* window geometries */ -+ cw = cols ? m->w.width / cols : m->w.width; -+ cn = 0; /* current column number */ -+ rn = 0; /* current row number */ -+ wl_list_for_each(c, &clients, link) { -+ unsigned int cx, cy; -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ -+ if ((i / rows + 1) > (cols - n % cols)) -+ rows = n / cols + 1; -+ ch = rows ? m->w.height / rows : m->w.height; -+ cx = m->w.x + cn * cw; -+ cy = m->w.y + rn * ch; -+ resize(c, (struct wlr_box) { cx, cy, cw, ch}, 0); -+ rn++; -+ if (rn >= rows) { -+ rn = 0; -+ cn++; -+ } -+ i++; -+ } -+} -+ - void - incnmaster(const Arg *arg) - { --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20240714.patch b/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20240714.patch deleted file mode 100644 index cf430b9..0000000 --- a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid-20240714.patch +++ /dev/null @@ -1,89 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 22d2171..014a909 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "###", gaplessgrid }, - }; - - /* monitors */ -@@ -139,6 +140,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_g, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index 145fd01..dae1d1a 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -287,6 +287,7 @@ static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); -+static void gaplessgrid(Monitor *m); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); -@@ -1467,6 +1468,56 @@ handlesig(int signo) - } - } - -+void -+gaplessgrid(Monitor *m) -+{ -+ unsigned int n = 0, i = 0, ch, cw, cn, rn, rows, cols; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating) -+ n++; -+ if (n == 0) -+ return; -+ -+ /* grid dimensions */ -+ for (cols = 0; cols <= (n / 2); cols++) -+ if ((cols * cols) >= n) -+ break; -+ -+ if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */ -+ cols = 2; -+ -+ /* widescreen is better if 3 columns */ -+ if (n >= 3 && n <= 6 && (m->w.width / m->w.height) > 1) -+ cols = 3; -+ -+ rows = n / cols; -+ -+ /* window geometries */ -+ cw = cols ? m->w.width / cols : m->w.width; -+ cn = 0; /* current column number */ -+ rn = 0; /* current row number */ -+ wl_list_for_each(c, &clients, link) { -+ unsigned int cx, cy; -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ -+ if ((i / rows + 1) > (cols - n % cols)) -+ rows = n / cols + 1; -+ ch = rows ? m->w.height / rows : m->w.height; -+ cx = m->w.x + cn * cw; -+ cy = m->w.y + rn * ch; -+ resize(c, (struct wlr_box) { cx, cy, cw, ch}, 0); -+ rn++; -+ if (rn >= rows) { -+ rn = 0; -+ cn++; -+ } -+ i++; -+ } -+} -+ - void - incnmaster(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid.patch b/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid.patch deleted file mode 100644 index 2af1072..0000000 --- a/dwl-bak/dwl-patches/patches/gaplessgrid/gaplessgrid.patch +++ /dev/null @@ -1,89 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 22d2171..014a909 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "###", gaplessgrid }, - }; - - /* monitors */ -@@ -139,6 +140,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_g, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index dc0c861..875d8cd 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -292,6 +292,7 @@ static void focusstack(const Arg *arg); - static Client *focustop(Monitor *m); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); -+static void gaplessgrid(Monitor *m); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); -@@ -1510,6 +1511,56 @@ handlesig(int signo) - } - } - -+void -+gaplessgrid(Monitor *m) -+{ -+ unsigned int n = 0, i = 0, ch, cw, cn, rn, rows, cols; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating) -+ n++; -+ if (n == 0) -+ return; -+ -+ /* grid dimensions */ -+ for (cols = 0; cols <= (n / 2); cols++) -+ if ((cols * cols) >= n) -+ break; -+ -+ if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */ -+ cols = 2; -+ -+ /* widescreen is better if 3 columns */ -+ if (n >= 3 && n <= 6 && (m->w.width / m->w.height) > 1) -+ cols = 3; -+ -+ rows = n / cols; -+ -+ /* window geometries */ -+ cw = cols ? m->w.width / cols : m->w.width; -+ cn = 0; /* current column number */ -+ rn = 0; /* current row number */ -+ wl_list_for_each(c, &clients, link) { -+ unsigned int cx, cy; -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ -+ if ((i / rows + 1) > (cols - n % cols)) -+ rows = n / cols + 1; -+ ch = rows ? m->w.height / rows : m->w.height; -+ cx = m->w.x + cn * cw; -+ cy = m->w.y + rn * ch; -+ resize(c, (struct wlr_box) { cx, cy, cw, ch}, 0); -+ rn++; -+ if (rn >= rows) { -+ rn = 0; -+ cn++; -+ } -+ i++; -+ } -+} -+ - void - incnmaster(const Arg *arg) - { diff --git a/dwl-bak/dwl-patches/patches/gaps/README.md b/dwl-bak/dwl-patches/patches/gaps/README.md deleted file mode 100644 index 4925a47..0000000 --- a/dwl-bak/dwl-patches/patches/gaps/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Description -Adds gaps between clients, providing the ability to disable them at run-time. - -`smartgaps` can also be changed to remove gaps when there is only one client present. - -### Download -- [git branch](https://codeberg.org/bigman/dwl/src/branch/gaps) -- [2024-07-12](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/gaps/gaps.patch) - -### Authors -- [peesock](https://codeberg.org/bigman) -- [sewn](https://codeberg.org/sewn) -- [Serene Void](https://github.com/serenevoid) -- [Rayan Nakib](https://nakibrayan2.pages.dev) diff --git a/dwl-bak/dwl-patches/patches/gaps/gaps.patch b/dwl-bak/dwl-patches/patches/gaps/gaps.patch deleted file mode 100644 index c025baf..0000000 --- a/dwl-bak/dwl-patches/patches/gaps/gaps.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 50e3dd4746b6cb719efb9f8213b94ac52a5320d9 Mon Sep 17 00:00:00 2001 -From: peesock -Date: Mon, 24 Jun 2024 20:06:42 -0700 -Subject: [PATCH] gaps! - -Co-authored-by: sewn -Co-authored-by: serenevoid ---- - config.def.h | 4 ++++ - dwl.c | 34 ++++++++++++++++++++++++++-------- - 2 files changed, 30 insertions(+), 8 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..b388b4e 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,6 +6,9 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -+static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -+static int gaps = 1; /* 1 means gaps between windows are added */ -+static const unsigned int gappx = 10; /* gap pixel between windows */ - static const unsigned int borderpx = 1; /* border pixel of windows */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); -@@ -135,6 +138,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, -+ { MODKEY, XKB_KEY_g, togglegaps, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -diff --git a/dwl.c b/dwl.c -index dc0437e..dc851df 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -199,6 +199,7 @@ struct Monitor { - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -+ int gaps; - unsigned int seltags; - unsigned int sellt; - uint32_t tagset[2]; -@@ -336,6 +337,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglegaps(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -949,6 +951,8 @@ createmon(struct wl_listener *listener, void *data) - - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ -+ m->gaps = gaps; -+ - m->tagset[0] = m->tagset[1] = 1; - for (r = monrules; r < END(monrules); r++) { - if (!r->name || strstr(wlr_output->name, r->name)) { -@@ -2638,7 +2642,7 @@ tagmon(const Arg *arg) - void - tile(Monitor *m) - { -- unsigned int mw, my, ty; -+ unsigned int h, r, e = m->gaps, mw, my, ty; - int i, n = 0; - Client *c; - -@@ -2647,23 +2651,30 @@ tile(Monitor *m) - n++; - if (n == 0) - return; -+ if (smartgaps == n) -+ e = 0; - - if (n > m->nmaster) -- mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; -+ mw = m->nmaster ? (int)roundf((m->w.width + gappx*e) * m->mfact) : 0; - else - mw = m->w.width; -- i = my = ty = 0; -+ i = 0; -+ my = ty = gappx*e; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { -- resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw, -- .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0); -- my += c->geom.height; -+ r = MIN(n, m->nmaster) - i; -+ h = (m->w.height - my - gappx*e - gappx*e * (r - 1)) / r; -+ resize(c, (struct wlr_box){.x = m->w.x + gappx*e, .y = m->w.y + my, -+ .width = mw - 2*gappx*e, .height = h}, 0); -+ my += c->geom.height + gappx*e; - } else { -+ r = n - i; -+ h = (m->w.height - ty - gappx*e - gappx*e * (r - 1)) / r; - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -- ty += c->geom.height; -+ .width = m->w.width - mw - gappx*e, .height = h}, 0); -+ ty += c->geom.height + gappx*e; - } - i++; - } -@@ -2686,6 +2697,13 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglegaps(const Arg *arg) -+{ -+ selmon->gaps = !selmon->gaps; -+ arrange(selmon); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/genericgaps/README.md b/dwl-bak/dwl-patches/patches/genericgaps/README.md deleted file mode 100644 index f27897d..0000000 --- a/dwl-bak/dwl-patches/patches/genericgaps/README.md +++ /dev/null @@ -1,25 +0,0 @@ -### Description - -This patch adds gaps around windows and works with any layout (the layout code -does not need to know about the gaps). This patch is a modified version of -[vanitygaps][vanitygaps] patch. - -This works by allowing layout code to place clients normally without gaps, and -then correcting positions and sizes of clients afterwards to add gaps around -them. This approach is very flexible but there is one small downside: you will -always have "outer" gaps (between edges of a monitor and a window) if "inner" -gaps are non-zero. But for me it's not a problem because I always want "outer" -gaps to be as big or bigger than "inner" gaps anyway. - -[vanitygaps]: /dwl/dwl-patches/src/branch/main/patches/vanitygaps - -### Download - -- [0.7 2025-02-11](/dwl/dwl-patches/raw/branch/main/patches/genericgaps/genericgaps-0.7.patch): - added support for `smartgaps` and `monoclegaps` settings and removed the suck - from `arrange()` function -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/genericgaps/genericgaps.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/genericgaps/genericgaps-0.7.patch b/dwl-bak/dwl-patches/patches/genericgaps/genericgaps-0.7.patch deleted file mode 100644 index ff27889..0000000 --- a/dwl-bak/dwl-patches/patches/genericgaps/genericgaps-0.7.patch +++ /dev/null @@ -1,375 +0,0 @@ -From a11488df97c0592486c3ce86d9c5dbddb0f88524 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Mon, 10 Feb 2025 23:32:59 +0100 -Subject: [PATCH] Add gaps to windows regardless of layout - ---- - config.def.h | 23 ++++++ - dwl.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 221 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..7b50d9d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,14 @@ - /* appearance */ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ -+static const int enablegaps = 1; /* 1 means gaps are enabled */ -+static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -+static const int monoclegaps = 0; /* 1 means outer gaps in monocle layout */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappih = 10; /* horiz inner gap between windows */ -+static const unsigned int gappiv = 10; /* vert inner gap between windows */ -+static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ -+static const unsigned int gappov = 10; /* vert outer gap between windows and screen edge */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -@@ -133,6 +140,22 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_h, incgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_l, incgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_H, incogaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_L, incogaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_h, incigaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_l, incigaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_0, togglegaps, {0} }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_parenright,defaultgaps, {0} }, -+ { MODKEY, XKB_KEY_y, incihgaps, {.i = +1 } }, -+ { MODKEY, XKB_KEY_o, incihgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_y, incivgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_o, incivgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_y, incohgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_o, incohgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Y, incovgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, incovgaps, {.i = -1 } }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index def2562..9bf4651 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -200,6 +200,11 @@ struct Monitor { - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -+ int enablegaps; /* enable gaps, used by togglegaps */ -+ int gappih; /* horizontal gap between windows */ -+ int gappiv; /* vertical gap between windows */ -+ int gappoh; /* horizontal outer gaps */ -+ int gappov; /* vertical outer gaps */ - unsigned int seltags; - unsigned int sellt; - uint32_t tagset[2]; -@@ -246,6 +251,7 @@ typedef struct { - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); - static void arrange(Monitor *m); -+void arrangegaps(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -@@ -273,6 +279,7 @@ static void createpopup(struct wl_listener *listener, void *data); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -+static void defaultgaps(const Arg *arg); - static void destroydecoration(struct wl_listener *listener, void *data); - static void destroydragicon(struct wl_listener *listener, void *data); - static void destroyidleinhibitor(struct wl_listener *listener, void *data); -@@ -293,6 +300,13 @@ static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); -+static void incgaps(const Arg *arg); -+static void incigaps(const Arg *arg); -+static void incihgaps(const Arg *arg); -+static void incivgaps(const Arg *arg); -+static void incogaps(const Arg *arg); -+static void incohgaps(const Arg *arg); -+static void incovgaps(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); -@@ -313,6 +327,7 @@ static void outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int - static void outputmgrtest(struct wl_listener *listener, void *data); - static void pointerfocus(Client *c, struct wlr_surface *surface, - double sx, double sy, uint32_t time); -+static void preparegaps(Monitor *m); - static void printstatus(void); - static void powermgrsetmode(struct wl_listener *listener, void *data); - static void quit(const Arg *arg); -@@ -327,6 +342,7 @@ static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); - static void setfullscreen(Client *c, int fullscreen); - static void setgamma(struct wl_listener *listener, void *data); -+static void setgaps(int oh, int ov, int ih, int iv); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); -@@ -340,6 +356,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglegaps(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -413,6 +430,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static int resizelock = 0; /* do not actually resize during arrange */ -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -515,12 +534,52 @@ arrange(Monitor *m) - : c->scene->node.parent); - } - -- if (m->lt[m->sellt]->arrange) -+ if (m->lt[m->sellt]->arrange) { -+ preparegaps(m); - m->lt[m->sellt]->arrange(m); -+ arrangegaps(m); -+ } - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } - -+void -+arrangegaps(Monitor *m) -+{ -+ Client *c; -+ int n, gaps; -+ -+ if (!m->enablegaps) -+ return; -+ -+ resizelock = 0; -+ -+ n = 0; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ n++; -+ } -+ -+ gaps = !(smartgaps && n == 1) && -+ (monoclegaps || m->lt[m->sellt]->arrange != monocle); -+ if (gaps) { -+ m->w.width += m->gappih + 2 * m->gappoh; -+ m->w.height += m->gappiv + 2 * m->gappov; -+ } -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (gaps) { -+ c->geom.x += c->mon->gappih + c->mon->gappoh; -+ c->geom.y += c->mon->gappiv + c->mon->gappov; -+ c->geom.width -= c->mon->gappih; -+ c->geom.height -= c->mon->gappiv; -+ } -+ resize(c, c->geom, 0); -+ } -+} -+ - void - arrangelayer(Monitor *m, struct wl_list *list, struct wlr_box *usable_area, int exclusive) - { -@@ -991,6 +1050,12 @@ createmon(struct wl_listener *listener, void *data) - for (i = 0; i < LENGTH(m->layers); i++) - wl_list_init(&m->layers[i]); - -+ m->enablegaps = enablegaps; -+ m->gappih = gappih; -+ m->gappiv = gappiv; -+ m->gappoh = gappoh; -+ m->gappov = gappov; -+ - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ - m->tagset[0] = m->tagset[1] = 1; -@@ -1173,6 +1238,12 @@ cursorwarptohint(void) - } - } - -+void -+defaultgaps(const Arg *arg) -+{ -+ setgaps(gappoh, gappov, gappih, gappiv); -+} -+ - void - destroydecoration(struct wl_listener *listener, void *data) - { -@@ -1526,6 +1597,83 @@ incnmaster(const Arg *arg) - arrange(selmon); - } - -+void -+incgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov + arg->i, -+ selmon->gappih + arg->i, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incigaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih + arg->i, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incihgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih + arg->i, -+ selmon->gappiv -+ ); -+} -+ -+void -+incivgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incogaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov + arg->i, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ -+void -+incohgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ -+void -+incovgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov + arg->i, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ - void - inputdevice(struct wl_listener *listener, void *data) - { -@@ -2034,6 +2182,31 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy, - wlr_seat_pointer_notify_motion(seat, time, sx, sy); - } - -+void -+preparegaps(Monitor *m) -+{ -+ Client *c; -+ int n; -+ -+ if (!m->enablegaps) -+ return; -+ -+ n = 0; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ n++; -+ } -+ -+ resizelock = 1; -+ -+ if ((smartgaps && n == 1) || (!monoclegaps && m->lt[m->sellt]->arrange == monocle)) -+ return; -+ -+ m->w.width -= m->gappih + 2 * m->gappoh; -+ m->w.height -= m->gappiv + 2 * m->gappov; -+} -+ - void - printstatus(void) - { -@@ -2185,6 +2358,11 @@ resize(Client *c, struct wlr_box geo, int interact) - struct wlr_box *bbox; - struct wlr_box clip; - -+ if (resizelock) { -+ c->geom = geo; -+ return; -+ } -+ - if (!c->mon || !client_surface(c)->mapped) - return; - -@@ -2354,6 +2532,16 @@ setgamma(struct wl_listener *listener, void *data) - wlr_output_schedule_frame(m->wlr_output); - } - -+void -+setgaps(int oh, int ov, int ih, int iv) -+{ -+ selmon->gappoh = MAX(oh, 0); -+ selmon->gappov = MAX(ov, 0); -+ selmon->gappih = MAX(ih, 0); -+ selmon->gappiv = MAX(iv, 0); -+ arrange(selmon); -+} -+ - void - setlayout(const Arg *arg) - { -@@ -2741,6 +2929,15 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglegaps(const Arg *arg) -+{ -+ if (!selmon) -+ return; -+ selmon->enablegaps = !selmon->enablegaps; -+ arrange(selmon); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/genericgaps/genericgaps.patch b/dwl-bak/dwl-patches/patches/genericgaps/genericgaps.patch deleted file mode 100644 index aa62b92..0000000 --- a/dwl-bak/dwl-patches/patches/genericgaps/genericgaps.patch +++ /dev/null @@ -1,350 +0,0 @@ -From f2a1b84369266d252fbea57c6f1eb64253617452 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Thu, 12 Dec 2024 22:44:53 +0100 -Subject: [PATCH] Add genericgaps - ---- - config.def.h | 22 +++++++ - dwl.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 190 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..930af12 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,6 +7,12 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */ -+static const int monoclegaps = 0; /* 1 means outer gaps in monocle layout */ -+static const unsigned int gappih = 10; /* horiz inner gap between windows */ -+static const unsigned int gappiv = 10; /* vert inner gap between windows */ -+static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ -+static const unsigned int gappov = 10; /* vert outer gap between windows and screen edge */ - static const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); -@@ -133,6 +139,22 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, - { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_h, incgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_l, incgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_H, incogaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_L, incogaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_h, incigaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_CTRL, XKB_KEY_l, incigaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_0, togglegaps, {0} }, -+ { MODKEY|WLR_MODIFIER_LOGO|WLR_MODIFIER_SHIFT, XKB_KEY_parenright,defaultgaps, {0} }, -+ { MODKEY, XKB_KEY_y, incihgaps, {.i = +1 } }, -+ { MODKEY, XKB_KEY_o, incihgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_y, incivgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_o, incivgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_y, incohgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_LOGO, XKB_KEY_o, incohgaps, {.i = -1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Y, incovgaps, {.i = +1 } }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, incovgaps, {.i = -1 } }, - { MODKEY, XKB_KEY_Return, zoom, {0} }, - { MODKEY, XKB_KEY_Tab, view, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -diff --git a/dwl.c b/dwl.c -index def2562..c14ae43 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -107,6 +107,7 @@ typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ - unsigned int type; /* XDGShell or X11* */ -+ int interact; - struct wlr_box geom; /* layout-relative, includes border */ - Monitor *mon; - struct wlr_scene_tree *scene; -@@ -200,6 +201,10 @@ struct Monitor { - struct wlr_box w; /* window area, layout-relative */ - struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[2]; -+ int gappih; /* horizontal gap between windows */ -+ int gappiv; /* vertical gap between windows */ -+ int gappoh; /* horizontal outer gaps */ -+ int gappov; /* vertical outer gaps */ - unsigned int seltags; - unsigned int sellt; - uint32_t tagset[2]; -@@ -273,6 +278,7 @@ static void createpopup(struct wl_listener *listener, void *data); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -+static void defaultgaps(const Arg *arg); - static void destroydecoration(struct wl_listener *listener, void *data); - static void destroydragicon(struct wl_listener *listener, void *data); - static void destroyidleinhibitor(struct wl_listener *listener, void *data); -@@ -293,6 +299,13 @@ static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); -+static void incgaps(const Arg *arg); -+static void incigaps(const Arg *arg); -+static void incihgaps(const Arg *arg); -+static void incivgaps(const Arg *arg); -+static void incogaps(const Arg *arg); -+static void incohgaps(const Arg *arg); -+static void incovgaps(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); -@@ -320,13 +333,15 @@ static void rendermon(struct wl_listener *listener, void *data); - static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); --static void resize(Client *c, struct wlr_box geo, int interact); -+static void resizeapply(Client *c, struct wlr_box geo, int interact); -+static void resizenoapply(Client *c, struct wlr_box geo, int interact); - static void run(char *startup_cmd); - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); - static void setfullscreen(Client *c, int fullscreen); - static void setgamma(struct wl_listener *listener, void *data); -+static void setgaps(int oh, int ov, int ih, int iv); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); -@@ -340,6 +355,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglegaps(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -413,6 +429,9 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static int enablegaps = 1; /* enables gaps, used by togglegaps */ -+static void (*resize)(Client *c, struct wlr_box geo, int interact) = resizeapply; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -481,9 +500,25 @@ applyrules(Client *c) - setmon(c, mon, newtags); - } - -+void -+applygaps(Client *c) -+{ -+ struct wlr_box geom = c->geom; -+ -+ if (!c->mon) -+ return; -+ -+ geom.x += c->mon->gappih + c->mon->gappoh; -+ geom.y += c->mon->gappiv + c->mon->gappov; -+ geom.width -= c->mon->gappih; -+ geom.height -= c->mon->gappiv; -+ resize(c, geom, 0); -+} -+ - void - arrange(Monitor *m) - { -+ int save_width, save_height; - Client *c; - - if (!m->wlr_output->enabled) -@@ -515,8 +550,26 @@ arrange(Monitor *m) - : c->scene->node.parent); - } - -- if (m->lt[m->sellt]->arrange) -+ if (m->lt[m->sellt]->arrange) { -+ save_width = m->w.width; -+ save_height = m->w.height; -+ if (enablegaps) { -+ m->w.width -= m->gappih + 2 * m->gappoh; -+ m->w.height -= m->gappiv + 2 * m->gappov; -+ } -+ resize = resizenoapply; - m->lt[m->sellt]->arrange(m); -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (enablegaps) -+ applygaps(c); -+ resizeapply(c, c->geom, c->interact); -+ } -+ m->w.width = save_width; -+ m->w.height = save_height; -+ resize = resizeapply; -+ } - motionnotify(0, NULL, 0, 0, 0, 0); - checkidleinhibitor(NULL); - } -@@ -993,6 +1046,11 @@ createmon(struct wl_listener *listener, void *data) - - wlr_output_state_init(&state); - /* Initialize monitor state using configured rules */ -+ -+ m->gappih = gappih; -+ m->gappiv = gappiv; -+ m->gappoh = gappoh; -+ m->gappov = gappov; - m->tagset[0] = m->tagset[1] = 1; - for (r = monrules; r < END(monrules); r++) { - if (!r->name || strstr(wlr_output->name, r->name)) { -@@ -1173,6 +1231,12 @@ cursorwarptohint(void) - } - } - -+void -+defaultgaps(const Arg *arg) -+{ -+ setgaps(gappoh, gappov, gappih, gappiv); -+} -+ - void - destroydecoration(struct wl_listener *listener, void *data) - { -@@ -1526,6 +1590,83 @@ incnmaster(const Arg *arg) - arrange(selmon); - } - -+void -+incgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov + arg->i, -+ selmon->gappih + arg->i, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incigaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih + arg->i, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incihgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih + arg->i, -+ selmon->gappiv -+ ); -+} -+ -+void -+incivgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov, -+ selmon->gappih, -+ selmon->gappiv + arg->i -+ ); -+} -+ -+void -+incogaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov + arg->i, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ -+void -+incohgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh + arg->i, -+ selmon->gappov, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ -+void -+incovgaps(const Arg *arg) -+{ -+ setgaps( -+ selmon->gappoh, -+ selmon->gappov + arg->i, -+ selmon->gappih, -+ selmon->gappiv -+ ); -+} -+ - void - inputdevice(struct wl_listener *listener, void *data) - { -@@ -2180,7 +2321,7 @@ requestmonstate(struct wl_listener *listener, void *data) - } - - void --resize(Client *c, struct wlr_box geo, int interact) -+resizeapply(Client *c, struct wlr_box geo, int interact) - { - struct wlr_box *bbox; - struct wlr_box clip; -@@ -2212,6 +2353,13 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); - } - -+void -+resizenoapply(Client *c, struct wlr_box geo, int interact) -+{ -+ c->geom = geo; -+ c->interact = interact; -+} -+ - void - run(char *startup_cmd) - { -@@ -2354,6 +2502,16 @@ setgamma(struct wl_listener *listener, void *data) - wlr_output_schedule_frame(m->wlr_output); - } - -+void -+setgaps(int oh, int ov, int ih, int iv) -+{ -+ selmon->gappoh = MAX(oh, 0); -+ selmon->gappov = MAX(ov, 0); -+ selmon->gappih = MAX(ih, 0); -+ selmon->gappiv = MAX(iv, 0); -+ arrange(selmon); -+} -+ - void - setlayout(const Arg *arg) - { -@@ -2741,6 +2899,13 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglegaps(const Arg *arg) -+{ -+ enablegaps = !enablegaps; -+ arrange(selmon); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.47.1 - diff --git a/dwl-bak/dwl-patches/patches/gestures/README.md b/dwl-bak/dwl-patches/patches/gestures/README.md deleted file mode 100644 index 0fbe418..0000000 --- a/dwl-bak/dwl-patches/patches/gestures/README.md +++ /dev/null @@ -1,23 +0,0 @@ -### Description -Add swipe gestures to trigger functions, similar to [libinput-gestures](https://github.com/bulletmark/libinput-gestures/tree/master). It supports the following gestures: `SWIPE_UP`, `SWIPE_DOWN`, `SWIPE_LEFT` and `SWIPE_RIGHT` - -> NOTE: It requires that you have previously applied [pointer-gestures-unstable-v1](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/pointer-gestures-unstable-v1) - -```c -static const Gesture gestures[] = { - /* modifier gesture fingers_count function argument */ - { MODKEY, SWIPE_LEFT, 4, shiftview, { .i = 1 } }, - { 0, SWIPE_RIGHT, 4, shiftview, { .i = -1 } }, -}; -``` - -**NOTE:** the example above requires the following patch [shiftview](https://codeberg.org/dwl/dwl-patches/wiki/shiftview) - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/gestures) -- [2024-07-09](https://codeberg.org/dwl/dwl-patches/raw/commit/13d96b51b54500dd24544cf3a73c61b7a1414bc6/patches/gestures/gestures.patch) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/be3735bc6a5c64ff76c200a8679453bd179be456/gestures/gestures.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/655fd2916c1bcaa022ce6dcdfb370051cf64df66/gestures/gestures.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/gestures/gestures.patch b/dwl-bak/dwl-patches/patches/gestures/gestures.patch deleted file mode 100644 index 4f74325..0000000 --- a/dwl-bak/dwl-patches/patches/gestures/gestures.patch +++ /dev/null @@ -1,169 +0,0 @@ -From 42f97e88bd901d81b81da61c44a790b583706308 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Fri, 5 Jul 2024 11:18:49 -0500 -Subject: [PATCH] implement gestures - ---- - config.def.h | 9 +++++++ - dwl.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 77 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..8b75564 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -14,6 +14,8 @@ static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ - -+static const unsigned int swipe_min_threshold = 0; -+ - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) - -@@ -174,3 +176,10 @@ static const Button buttons[] = { - { MODKEY, BTN_MIDDLE, togglefloating, {0} }, - { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, - }; -+ -+static const Gesture gestures[] = { -+ // { MODKEY, SWIPE_LEFT, 4, shiftview, { .i = 1 } }, -+ // { MODKEY, SWIPE_RIGHT, 4, shiftview, { .i = -1 } }, -+ { MODKEY, SWIPE_UP, 3, focusstack, {.i = 1} }, -+ { MODKEY, SWIPE_DOWN, 3, focusstack, {.i = -1} }, -+}; -diff --git a/dwl.c b/dwl.c -index ded83e2..5d861e8 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -88,6 +88,7 @@ enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrOverlay, LyrBlock, - enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, - NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ - #endif -+enum { SWIPE_LEFT, SWIPE_RIGHT, SWIPE_DOWN, SWIPE_UP }; - - typedef union { - int i; -@@ -103,6 +104,14 @@ typedef struct { - const Arg arg; - } Button; - -+typedef struct { -+ unsigned int mod; -+ unsigned int motion; -+ unsigned int fingers_count; -+ void (*func)(const Arg *); -+ const Arg arg; -+} Gesture; -+ - typedef struct Monitor Monitor; - typedef struct { - /* Must keep these three elements in this order */ -@@ -251,6 +260,7 @@ static void arrangelayer(Monitor *m, struct wl_list *list, - static void arrangelayers(Monitor *m); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); -+static int ongesture(struct wlr_pointer_swipe_end_event *event); - static void swipe_begin(struct wl_listener *listener, void *data); - static void swipe_update(struct wl_listener *listener, void *data); - static void swipe_end(struct wl_listener *listener, void *data); -@@ -416,6 +426,10 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static uint32_t swipe_fingers = 0; -+static double swipe_dx = 0; -+static double swipe_dy = 0; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -435,6 +449,8 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" - -+static const unsigned int abzsquare = swipe_min_threshold * swipe_min_threshold; -+ - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -657,6 +673,11 @@ swipe_begin(struct wl_listener *listener, void *data) - { - struct wlr_pointer_swipe_begin_event *event = data; - -+ swipe_fingers = event->fingers; -+ // Reset swipe distance at the beginning of a swipe -+ swipe_dx = 0; -+ swipe_dy = 0; -+ - // Forward swipe begin event to client - wlr_pointer_gestures_v1_send_swipe_begin( - pointer_gestures, -@@ -671,6 +692,11 @@ swipe_update(struct wl_listener *listener, void *data) - { - struct wlr_pointer_swipe_update_event *event = data; - -+ swipe_fingers = event->fingers; -+ // Accumulate swipe distance -+ swipe_dx += event->dx; -+ swipe_dy += event->dy; -+ - // Forward swipe update event to client - wlr_pointer_gestures_v1_send_swipe_update( - pointer_gestures, -@@ -681,11 +707,53 @@ swipe_update(struct wl_listener *listener, void *data) - ); - } - -+int -+ongesture(struct wlr_pointer_swipe_end_event *event) -+{ -+ struct wlr_keyboard *keyboard; -+ uint32_t mods; -+ const Gesture *g; -+ unsigned int motion; -+ unsigned int adx = (int)round(fabs(swipe_dx)); -+ unsigned int ady = (int)round(fabs(swipe_dy)); -+ int handled = 0; -+ -+ if (event->cancelled) { -+ return handled; -+ } -+ -+ // Require absolute distance movement beyond a small thresh-hold -+ if (adx * adx + ady * ady < abzsquare) { -+ return handled; -+ } -+ -+ if (adx > ady) { -+ motion = swipe_dx < 0 ? SWIPE_LEFT : SWIPE_RIGHT; -+ } else { -+ motion = swipe_dy < 0 ? SWIPE_UP : SWIPE_DOWN; -+ } -+ -+ keyboard = wlr_seat_get_keyboard(seat); -+ mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; -+ for (g = gestures; g < END(gestures); g++) { -+ if (CLEANMASK(mods) == CLEANMASK(g->mod) && -+ swipe_fingers == g->fingers_count && -+ motion == g->motion && g->func) { -+ g->func(&g->arg); -+ handled = 1; -+ } -+ } -+ return handled; -+} -+ - void - swipe_end(struct wl_listener *listener, void *data) - { - struct wlr_pointer_swipe_end_event *event = data; - -+ // TODO: should we stop here if the event has been handled? -+ ongesture(event); -+ - // Forward swipe end event to client - wlr_pointer_gestures_v1_send_swipe_end( - pointer_gestures, --- -2.45.1 diff --git a/dwl-bak/dwl-patches/patches/globalkey/README.md b/dwl-bak/dwl-patches/patches/globalkey/README.md deleted file mode 100644 index d250f92..0000000 --- a/dwl-bak/dwl-patches/patches/globalkey/README.md +++ /dev/null @@ -1,33 +0,0 @@ -### Description - -This patch adds the ability to pass keys that are specified in the config header globally, similar to Hyprland's approach. -This might deal with Wayland's lack of global shortcuts. - -Example: -``` -static const PassKeypressRule pass_rules[] = { - ADDPASSRULE("com.obsproject.Studio", XKB_KEY_Home), - ADDPASSRULE("WebCord", XKB_KEY_n), - /* xkb key is case-insensitive */ -}; -``` - -This will pass the `Home` key (alongside with mods) to OBS regardless of what client is currently focused, if any. -The string "com.obsproject.Studio" should match the exact appid of the client. - -To get the appid use [dwlmsg](https://codeberg.org/notchoc/dwlmsg) or run stock dwl from a terminal then launch the needed application inside, dwl will print all the info to the stdout. - -Note that if a popup (like [fuzzel](https://codeberg.org/dnkl/fuzzel)) is focused, no keys will be globally passed. -This is done so these menus don't get closed after hitting some of the global keys. - -## Warning -This patch is a stupid hack, it doesn't work all the time. -Examples: obs needs to be clicked on once before applying global hotkeys. -Electron (discord/webcord/chromium) with wayland backend ignores the very first press. -Other programs might not work at all. - -### Download -- [git branch](https://codeberg.org/korei999/dwl/src/branch/globalkey) -- [2024-06-08](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/globalkey/globalkey.patch) -### Authors -- [korei999](https://codeberg.org/korei999) diff --git a/dwl-bak/dwl-patches/patches/globalkey/globalkey.patch b/dwl-bak/dwl-patches/patches/globalkey/globalkey.patch deleted file mode 100644 index 07d3856..0000000 --- a/dwl-bak/dwl-patches/patches/globalkey/globalkey.patch +++ /dev/null @@ -1,131 +0,0 @@ -From f36e3f134c9f14a9821783d9908471ed0bdca0ed Mon Sep 17 00:00:00 2001 -From: korei999 -Date: Fri, 14 Mar 2025 20:05:45 +0200 -Subject: [PATCH] implement globalkey patch - ---- - config.def.h | 8 +++++++ - dwl.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 69 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..25486c8 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -122,6 +122,14 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "wmenu-run", NULL }; - -+#define ADDPASSRULE(S, K) {.appid = S, .len = LENGTH(S), .key = K} -+static const PassKeypressRule pass_rules[] = { -+ ADDPASSRULE("com.obsproject.Studio", XKB_KEY_Home), -+ ADDPASSRULE("com.obsproject.Studio", XKB_KEY_End), -+ ADDPASSRULE("com.obsproject.Studio", XKB_KEY_F12), -+ ADDPASSRULE("WebCord", XKB_KEY_n), -+}; -+ - static const Key keys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ -diff --git a/dwl.c b/dwl.c -index 4816159..9ad64dd 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -217,6 +217,12 @@ typedef struct { - int x, y; - } MonitorRule; - -+typedef struct { -+ const char* appid; -+ size_t len; -+ uint32_t key; -+} PassKeypressRule; -+ - typedef struct { - struct wlr_pointer_constraint_v1 *constraint; - struct wl_listener destroy; -@@ -293,6 +299,7 @@ static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); -+static void keypressglobal(struct wlr_surface *last_surface, struct wlr_keyboard *keyboard, struct wlr_keyboard_key_event *event, uint32_t mods, xkb_keysym_t keysym); - static void keypressmod(struct wl_listener *listener, void *data); - static int keyrepeat(void *data); - static void killclient(const Arg *arg); -@@ -1628,6 +1635,12 @@ keypress(struct wl_listener *listener, void *data) - /* This event is raised when a key is pressed or released. */ - KeyboardGroup *group = wl_container_of(listener, group, key); - struct wlr_keyboard_key_event *event = data; -+ struct wlr_surface *last_surface = seat->keyboard_state.focused_surface; -+ struct wlr_xdg_surface *xdg_surface = last_surface ? wlr_xdg_surface_try_from_wlr_surface(last_surface) : NULL; -+ int pass = 0; -+#ifdef XWAYLAND -+ struct wlr_xwayland_surface *xsurface = last_surface ? wlr_xwayland_surface_try_from_wlr_surface(last_surface) : NULL; -+#endif - - /* Translate libinput keycode -> xkbcommon */ - uint32_t keycode = event->keycode + 8; -@@ -1662,12 +1675,60 @@ keypress(struct wl_listener *listener, void *data) - if (handled) - return; - -+ /* don't pass when popup is focused -+ * this is better than having popups (like fuzzel or wmenu) closing while typing in a passed keybind */ -+ pass = (xdg_surface && xdg_surface->role != WLR_XDG_SURFACE_ROLE_POPUP) || !last_surface -+#ifdef XWAYLAND -+ || xsurface -+#endif -+ ; -+ /* passed keys don't get repeated */ -+ if (!locked && pass) { -+ for (i = 0; i < nsyms; ++i) -+ keypressglobal(last_surface, &group->wlr_group->keyboard, event, mods, syms[i]); -+ } -+ - wlr_seat_set_keyboard(seat, &group->wlr_group->keyboard); - /* Pass unhandled keycodes along to the client. */ - wlr_seat_keyboard_notify_key(seat, event->time_msec, - event->keycode, event->state); - } - -+void -+keypressglobal(struct wlr_surface *last_surface, struct wlr_keyboard *keyboard, struct wlr_keyboard_key_event *event, uint32_t mods, xkb_keysym_t keysym) -+{ -+ Client *c = NULL, *lastc = focustop(selmon); -+ int reset = false; -+ const char *appid = NULL; -+ -+ for (size_t r = 0; r < LENGTH(pass_rules); r++) { -+ uint32_t rcode = xkb_keysym_to_upper(pass_rules[r].key); -+ uint32_t pcode = xkb_keysym_to_upper(keysym); -+ -+ /* match key only (case insensitive) ignoring mods */ -+ if (rcode == pcode) { -+ wl_list_for_each(c, &clients, link) { -+ if (c && c != lastc) { -+ appid = client_get_appid(c); -+ if (appid && strncmp(appid, pass_rules[r].appid, pass_rules[r].len) == 0) { -+ reset = true; -+ -+ client_notify_enter(client_surface(c), keyboard); -+ client_activate_surface(client_surface(c), 1); -+ wlr_seat_keyboard_send_key(seat, event->time_msec, event->keycode, event->state); -+ -+ goto done; -+ } -+ } -+ } -+ } -+ } -+ -+done: -+ if (reset && last_surface) -+ client_notify_enter(last_surface, keyboard); -+} -+ - void - keypressmod(struct wl_listener *listener, void *data) - { --- -2.48.1 - diff --git a/dwl-bak/dwl-patches/patches/headless/README.md b/dwl-bak/dwl-patches/patches/headless/README.md deleted file mode 100644 index 990a5d9..0000000 --- a/dwl-bak/dwl-patches/patches/headless/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Implements `swaymsg create_output` command, it allows you to create virtual/headless outputs. But in combination with a VNC server (for example wayvnc), this allows you to essentially have additional monitors, by connecting to the VNC server with an appropiate client (for example on an tablet or laptop). - -If you plan to use wayvnc, you'll need [virtual-pointer](https://codeberg.org/dwl/dwl-patches/wiki/virtual-pointer.-) patch as well - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/v0.5/headless) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/0096e49402bc59b4050e12cdb9befb79d0011006/headless/headless.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/headless/headless.patch b/dwl-bak/dwl-patches/patches/headless/headless.patch deleted file mode 100644 index fb01fda..0000000 --- a/dwl-bak/dwl-patches/patches/headless/headless.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 2e1123af5c7ae4354ec997d59cb36143fb2fdd27 Mon Sep 17 00:00:00 2001 -From: wochap -Date: Mon, 8 Apr 2024 10:23:40 -0500 -Subject: [PATCH] feat: implement headless backend - ---- - config.def.h | 1 + - dwl.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 59 insertions(+) - -diff --git a/config.def.h b/config.def.h -index db0babc..f0a2080 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -141,6 +141,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, XKB_KEY_M, create_output, {0} }, - TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), - TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), - TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -diff --git a/dwl.c b/dwl.c -index ef27a1d..79a63b0 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -12,7 +12,10 @@ - #include - #include - #include -+#include - #include -+#include -+#include - #include - #include - #include -@@ -58,6 +61,9 @@ - #include - #include - #endif -+#if WLR_HAS_X11_BACKEND -+#include -+#endif - - #include "util.h" - -@@ -327,6 +333,8 @@ static Monitor *xytomon(double x, double y); - static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); -+static void _create_output(struct wlr_backend *backend, void *data); -+static void create_output(const Arg *arg); - - /* variables */ - static const char broken[] = "broken"; -@@ -335,6 +343,7 @@ static int locked; - static void *exclusive_focus; - static struct wl_display *dpy; - static struct wlr_backend *backend; -+static struct wlr_backend *headless_backend; - static struct wlr_scene *scene; - static struct wlr_scene_tree *layers[NUM_LAYERS]; - static struct wlr_scene_tree *drag_icon; -@@ -2321,6 +2330,16 @@ setup(void) - cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1); - LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape); - -+ /** -+ * Initialize headless backend -+ */ -+ headless_backend = wlr_headless_backend_create(dpy); -+ if (!headless_backend) { -+ die("Failed to create secondary headless backend"); -+ } else { -+ wlr_multi_backend_add(backend, headless_backend); -+ } -+ - /* - * Configures a seat, which is a single "seat" at which a user sits and - * operates the computer. This conceptually includes up to one keyboard, -@@ -2746,6 +2765,45 @@ zoom(const Arg *arg) - arrange(selmon); - } - -+void -+_create_output(struct wlr_backend *_backend, void *data) -+{ -+ bool *done = data; -+ if (*done) { -+ return; -+ } -+ -+ if (wlr_backend_is_wl(_backend)) { -+ wlr_wl_output_create(_backend); -+ *done = true; -+ } else if (wlr_backend_is_headless(_backend)) { -+ wlr_headless_add_output(_backend, 1920, 1080); -+ *done = true; -+ } -+#if WLR_HAS_X11_BACKEND -+ else if (wlr_backend_is_x11(backend)) { -+ wlr_x11_output_create(backend); -+ *done = true; -+ } -+#endif -+} -+ -+void -+create_output(const Arg *arg) -+{ -+ bool done = false; -+ -+ if (!wlr_backend_is_multi(backend)) { -+ die("Expected a multi backend"); -+ } -+ -+ wlr_multi_for_each_backend(backend, _create_output, &done); -+ -+ if (!done) { -+ die("Can only create outputs for Wayland, X11 or headless backends"); -+ } -+} -+ - #ifdef XWAYLAND - void - activatex11(struct wl_listener *listener, void *data) --- -2.43.2 - diff --git a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/README.md b/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/README.md deleted file mode 100644 index 0b4bebe..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### Description -Hide all clients (and layer surfaces) behind the current client if it is -fullscreen, only the background (layer surfaces at the background layer) will -be shown - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/hide-behind-fullscreen) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/hide-behind-fullscreen/hide-behind-fullscreen.patch) -- [hide-behind-fullscreen-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/hide-behind-fullscreen/hide-behind-fullscreen-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen-0.7.patch b/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen-0.7.patch deleted file mode 100644 index de2dfc6..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen-0.7.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 78e5c4b42cf125be70814fd65a09cbcf0a18aa7e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 10 Apr 2022 22:38:53 -0500 -Subject: [PATCH] hide-behind-fullscreen -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 2 +- - dwl.c | 24 +++++++++++++++++++++++- - 2 files changed, 24 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..1d5a4c84 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -12,7 +12,7 @@ static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ --static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 0.0f}; /* You can also use glsl colors */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -diff --git a/dwl.c b/dwl.c -index a2711f67..56356f29 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -484,7 +484,9 @@ applyrules(Client *c) - void - arrange(Monitor *m) - { -- Client *c; -+ LayerSurface *l; -+ Client *c, *sel = focustop(m); -+ int i; - - if (!m->wlr_output->enabled) - return; -@@ -515,6 +517,26 @@ arrange(Monitor *m) - : c->scene->node.parent); - } - -+ if (sel && sel->isfullscreen && VISIBLEON(sel, m)) { -+ for (i = 2; i > ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; i--) { -+ wl_list_for_each(l, &sel->mon->layers[i], link) -+ wlr_scene_node_set_enabled(&l->scene->node, 0); -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ wlr_scene_node_set_enabled(&c->scene->node, (sel->isfullscreen && c == sel) -+ || !sel->isfullscreen); -+ } -+ } -+ if (!sel || (!sel->isfullscreen && VISIBLEON(sel, m))) { -+ for (i = 2; i > ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; i--) { -+ wl_list_for_each(l, &m->layers[i], link) -+ wlr_scene_node_set_enabled(&l->scene->node, 1); -+ } -+ } -+ - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); - motionnotify(0, NULL, 0, 0, 0, 0); --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen.patch b/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen.patch deleted file mode 100644 index f82d0e6..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-fullscreen/hide-behind-fullscreen.patch +++ /dev/null @@ -1,73 +0,0 @@ -From ac1537f068ea626f1984803ed8db08faf7943b18 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 10 Apr 2022 22:38:53 -0500 -Subject: [PATCH] hide-behind-fullscreen -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 2 +- - dwl.c | 24 +++++++++++++++++++++++- - 2 files changed, 24 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..1d5a4c84 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -12,7 +12,7 @@ static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ --static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 0.0f}; /* You can also use glsl colors */ - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -diff --git a/dwl.c b/dwl.c -index ad21e1ba..f5395fe6 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -505,7 +505,9 @@ applyrules(Client *c) - void - arrange(Monitor *m) - { -- Client *c; -+ LayerSurface *l; -+ Client *c, *sel = focustop(m); -+ int i; - - if (!m->wlr_output->enabled) - return; -@@ -536,6 +538,26 @@ arrange(Monitor *m) - : c->scene->node.parent); - } - -+ if (sel && sel->isfullscreen && VISIBLEON(sel, m)) { -+ for (i = 2; i > ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; i--) { -+ wl_list_for_each(l, &sel->mon->layers[i], link) -+ wlr_scene_node_set_enabled(&l->scene->node, 0); -+ } -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ wlr_scene_node_set_enabled(&c->scene->node, (sel->isfullscreen && c == sel) -+ || !sel->isfullscreen); -+ } -+ } -+ if (!sel || (!sel->isfullscreen && VISIBLEON(sel, m))) { -+ for (i = 2; i > ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND; i--) { -+ wl_list_for_each(l, &m->layers[i], link) -+ wlr_scene_node_set_enabled(&l->scene->node, 1); -+ } -+ } -+ - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); - motionnotify(0, NULL, 0, 0, 0, 0); --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/hide-behind-monocle/README.md b/dwl-bak/dwl-patches/patches/hide-behind-monocle/README.md deleted file mode 100644 index 507d2e1..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-monocle/README.md +++ /dev/null @@ -1,10 +0,0 @@ -### Description -Hide all clients behind the focused one in the monocle layout - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/hide-behind-monocle) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/hide-behind-monocle/hide-behind-monocle.patch) -- [hide-behind-monocle-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/hide-behind-monocle/hide-behind-monocle-0.7.patch) - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle-0.7.patch b/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle-0.7.patch deleted file mode 100644 index 76b6e96..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle-0.7.patch +++ /dev/null @@ -1,332 +0,0 @@ -From 9bb408e6921b582dbcf5adfc36a7618086219998 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sat, 8 Jul 2023 17:25:16 -0600 -Subject: [PATCH] hide behind monocle -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - dwl.c | 87 +++++++++++++++++++++++++++++++++++++---------------------- - 1 file changed, 55 insertions(+), 32 deletions(-) - -diff --git a/dwl.c b/dwl.c -index a2711f67..70687178 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -288,10 +288,11 @@ static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); --static Client *focustop(Monitor *m); -+static Client *focustop(Monitor *m, int onlytiled); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); -+static void hidebehindmonocle(Monitor *m); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); -@@ -497,7 +498,7 @@ arrange(Monitor *m) - } - - wlr_scene_node_set_enabled(&m->fullscreen_bg->node, -- (c = focustop(m)) && c->isfullscreen); -+ (c = focustop(m, 0)) && c->isfullscreen); - - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - -@@ -750,7 +751,7 @@ closemon(Monitor *m) - if (c->mon == m) - setmon(c, selmon, c->tags); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - printstatus(); - } - -@@ -1185,7 +1186,7 @@ void - destroydragicon(struct wl_listener *listener, void *data) - { - /* Focus enter isn't sent during drag, so refocus the focused node. */ -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -1220,7 +1221,7 @@ destroylock(SessionLock *lock, int unlock) - - wlr_scene_node_set_enabled(&locked_bg->node, 0); - -- focusclient(focustop(selmon), 0); -+ focusclient(focustop(selmon, 0), 0); - motionnotify(0, NULL, 0, 0, 0, 0); - - destroy: -@@ -1249,7 +1250,7 @@ destroylocksurface(struct wl_listener *listener, void *data) - surface = wl_container_of(cur_lock->surfaces.next, surface, link); - client_notify_enter(surface->surface, wlr_seat_get_keyboard(seat)); - } else if (!locked) { -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } else { - wlr_seat_keyboard_clear_focus(seat); - } -@@ -1366,6 +1367,7 @@ focusclient(Client *c, int lift) - wl_list_insert(&fstack, &c->flink); - selmon = c->mon; - c->isurgent = 0; -+ hidebehindmonocle(c->mon); - client_restack_surface(c); - - /* Don't change border color if there is an exclusive focus or we are -@@ -1420,14 +1422,14 @@ focusmon(const Arg *arg) - selmon = dirtomon(arg->i); - while (!selmon->wlr_output->enabled && i++ < nmons); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - - void - focusstack(const Arg *arg) - { - /* Focus the next or previous client (in tiling order) on selmon */ -- Client *c, *sel = focustop(selmon); -+ Client *c, *sel = focustop(selmon, 0); - if (!sel || (sel->isfullscreen && !client_has_children(sel))) - return; - if (arg->i > 0) { -@@ -1453,12 +1455,15 @@ focusstack(const Arg *arg) - * will focus the topmost client of this mon, when actually will - * only return that client */ - Client * --focustop(Monitor *m) -+focustop(Monitor *m, int onlytiled) - { - Client *c; - wl_list_for_each(c, &fstack, flink) { -- if (VISIBLEON(c, m)) -+ if (VISIBLEON(c, m)) { -+ if (onlytiled && c->isfloating) -+ continue; - return c; -+ } - } - return NULL; - } -@@ -1515,6 +1520,25 @@ handlesig(int signo) - } - } - -+void -+hidebehindmonocle(Monitor *m) -+{ -+ Client *c; -+ if (m && m->lt[m->sellt]->arrange == monocle) { -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ wlr_scene_node_set_enabled(&c->scene->node, VISIBLEON(c, m) && c->isfloating); -+ } -+ -+ c = NULL; -+ -+ /* Enable top tiled client, fullscreen is considered tiled */ -+ if ((c = focustop(m, 1))) -+ wlr_scene_node_set_enabled(&c->scene->node, 1); -+ } -+} -+ - void - incnmaster(const Arg *arg) - { -@@ -1653,7 +1677,7 @@ keyrepeat(void *data) - void - killclient(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - client_send_close(sel); - } -@@ -1780,8 +1804,7 @@ monocle(Monitor *m) - } - if (n) - snprintf(m->ltsymbol, LENGTH(m->ltsymbol), "[%d]", n); -- if ((c = focustop(m))) -- wlr_scene_node_raise_to_top(&c->scene->node); -+ hidebehindmonocle(m); - } - - void -@@ -2049,7 +2072,7 @@ printstatus(void) - if (c->isurgent) - urg |= c->tags; - } -- if ((c = focustop(m))) { -+ if ((c = focustop(m, 0))) { - title = client_get_title(c); - appid = client_get_appid(c); - printf("%s title %s\n", m->wlr_output->name, title ? title : broken); -@@ -2401,7 +2424,7 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ - setfloating(c, c->isfloating); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - - void -@@ -2670,12 +2693,12 @@ startdrag(struct wl_listener *listener, void *data) - void - tag(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (!sel || (arg->ui & TAGMASK) == 0) - return; - - sel->tags = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2683,7 +2706,7 @@ tag(const Arg *arg) - void - tagmon(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - setmon(sel, dirtomon(arg->i), 0); - } -@@ -2725,7 +2748,7 @@ tile(Monitor *m) - void - togglefloating(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - /* return if fullscreen */ - if (sel && !sel->isfullscreen) - setfloating(sel, !sel->isfloating); -@@ -2734,7 +2757,7 @@ togglefloating(const Arg *arg) - void - togglefullscreen(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - setfullscreen(sel, !sel->isfullscreen); - } -@@ -2743,12 +2766,12 @@ void - toggletag(const Arg *arg) - { - uint32_t newtags; -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (!sel || !(newtags = sel->tags ^ (arg->ui & TAGMASK))) - return; - - sel->tags = newtags; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2761,7 +2784,7 @@ toggleview(const Arg *arg) - return; - - selmon->tagset[selmon->seltags] = newtagset; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2785,7 +2808,7 @@ unmaplayersurfacenotify(struct wl_listener *listener, void *data) - if (l->layer_surface->output && (l->mon = l->layer_surface->output->data)) - arrangelayers(l->mon); - if (l->layer_surface->surface == seat->keyboard_state.focused_surface) -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -2802,7 +2825,7 @@ unmapnotify(struct wl_listener *listener, void *data) - if (client_is_unmanaged(c)) { - if (c == exclusive_focus) { - exclusive_focus = NULL; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - } else { - wl_list_remove(&c->link); -@@ -2883,7 +2906,7 @@ updatemons(struct wl_listener *listener, void *data) - /* Don't move clients to the left output when plugging monitors */ - arrange(m); - /* make sure fullscreen clients have the right size */ -- if ((c = focustop(m)) && c->isfullscreen) -+ if ((c = focustop(m, 0)) && c->isfullscreen) - resize(c, m->m, 0); - - /* Try to re-set the gamma LUT when updating monitors, -@@ -2903,7 +2926,7 @@ updatemons(struct wl_listener *listener, void *data) - if (!c->mon && client_surface(c)->mapped) - setmon(c, selmon, c->tags); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - if (selmon->lock_surface) { - client_notify_enter(selmon->lock_surface->surface, - wlr_seat_get_keyboard(seat)); -@@ -2925,7 +2948,7 @@ void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); -- if (c == focustop(c->mon)) -+ if (c == focustop(c->mon, 0)) - printstatus(); - } - -@@ -2935,7 +2958,7 @@ urgent(struct wl_listener *listener, void *data) - struct wlr_xdg_activation_v1_request_activate_event *event = data; - Client *c = NULL; - toplevel_from_wlr_surface(event->surface, &c, NULL); -- if (!c || c == focustop(selmon)) -+ if (!c || c == focustop(selmon, 0)) - return; - - c->isurgent = 1; -@@ -2953,7 +2976,7 @@ view(const Arg *arg) - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -3024,7 +3047,7 @@ xytonode(double x, double y, struct wlr_surface **psurface, - void - zoom(const Arg *arg) - { -- Client *c, *sel = focustop(selmon); -+ Client *c, *sel = focustop(selmon, 0); - - if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange || sel->isfloating) - return; -@@ -3141,7 +3164,7 @@ sethints(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_hints); - struct wlr_surface *surface = client_surface(c); -- if (c == focustop(selmon)) -+ if (c == focustop(selmon, 0)) - return; - - c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle.patch b/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle.patch deleted file mode 100644 index dfe23dd..0000000 --- a/dwl-bak/dwl-patches/patches/hide-behind-monocle/hide-behind-monocle.patch +++ /dev/null @@ -1,332 +0,0 @@ -From 8022376ee59d616831271dbc9f289a8bfd4fedda Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sat, 8 Jul 2023 17:25:16 -0600 -Subject: [PATCH] hide behind monocle -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - dwl.c | 87 +++++++++++++++++++++++++++++++++++++---------------------- - 1 file changed, 55 insertions(+), 32 deletions(-) - -diff --git a/dwl.c b/dwl.c -index ad21e1ba..cad3b0b2 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -285,10 +285,11 @@ static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); --static Client *focustop(Monitor *m); -+static Client *focustop(Monitor *m, int onlytiled); - static void fullscreennotify(struct wl_listener *listener, void *data); - static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); -+static void hidebehindmonocle(Monitor *m); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); -@@ -518,7 +519,7 @@ arrange(Monitor *m) - } - - wlr_scene_node_set_enabled(&m->fullscreen_bg->node, -- (c = focustop(m)) && c->isfullscreen); -+ (c = focustop(m, 0)) && c->isfullscreen); - - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, LENGTH(m->ltsymbol)); - -@@ -807,7 +808,7 @@ closemon(Monitor *m) - if (c->mon == m) - setmon(c, selmon, c->tags); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - printstatus(); - } - -@@ -1243,7 +1244,7 @@ void - destroydragicon(struct wl_listener *listener, void *data) - { - /* Focus enter isn't sent during drag, so refocus the focused node. */ -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - motionnotify(0, NULL, 0, 0, 0, 0); - wl_list_remove(&listener->link); - } -@@ -1280,7 +1281,7 @@ destroylock(SessionLock *lock, int unlock) - - wlr_scene_node_set_enabled(&locked_bg->node, 0); - -- focusclient(focustop(selmon), 0); -+ focusclient(focustop(selmon, 0), 0); - motionnotify(0, NULL, 0, 0, 0, 0); - - destroy: -@@ -1309,7 +1310,7 @@ destroylocksurface(struct wl_listener *listener, void *data) - surface = wl_container_of(cur_lock->surfaces.next, surface, link); - client_notify_enter(surface->surface, wlr_seat_get_keyboard(seat)); - } else if (!locked) { -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } else { - wlr_seat_keyboard_clear_focus(seat); - } -@@ -1420,6 +1421,7 @@ focusclient(Client *c, int lift) - wl_list_insert(&fstack, &c->flink); - selmon = c->mon; - c->isurgent = 0; -+ hidebehindmonocle(c->mon); - - /* Don't change border color if there is an exclusive focus or we are - * handling a drag operation */ -@@ -1473,14 +1475,14 @@ focusmon(const Arg *arg) - selmon = dirtomon(arg->i); - while (!selmon->wlr_output->enabled && i++ < nmons); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - - void - focusstack(const Arg *arg) - { - /* Focus the next or previous client (in tiling order) on selmon */ -- Client *c, *sel = focustop(selmon); -+ Client *c, *sel = focustop(selmon, 0); - if (!sel || (sel->isfullscreen && !client_has_children(sel))) - return; - if (arg->i > 0) { -@@ -1506,12 +1508,15 @@ focusstack(const Arg *arg) - * will focus the topmost client of this mon, when actually will - * only return that client */ - Client * --focustop(Monitor *m) -+focustop(Monitor *m, int onlytiled) - { - Client *c; - wl_list_for_each(c, &fstack, flink) { -- if (VISIBLEON(c, m)) -+ if (VISIBLEON(c, m)) { -+ if (onlytiled && c->isfloating) -+ continue; - return c; -+ } - } - return NULL; - } -@@ -1557,6 +1562,25 @@ handlesig(int signo) - quit(NULL); - } - -+void -+hidebehindmonocle(Monitor *m) -+{ -+ Client *c; -+ if (m && m->lt[m->sellt]->arrange == monocle) { -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != m) -+ continue; -+ wlr_scene_node_set_enabled(&c->scene->node, VISIBLEON(c, m) && c->isfloating); -+ } -+ -+ c = NULL; -+ -+ /* Enable top tiled client, fullscreen is considered tiled */ -+ if ((c = focustop(m, 1))) -+ wlr_scene_node_set_enabled(&c->scene->node, 1); -+ } -+} -+ - void - incnmaster(const Arg *arg) - { -@@ -1695,7 +1719,7 @@ keyrepeat(void *data) - void - killclient(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - client_send_close(sel); - } -@@ -1824,8 +1848,7 @@ monocle(Monitor *m) - } - if (n) - snprintf(m->ltsymbol, LENGTH(m->ltsymbol), "[%d]", n); -- if ((c = focustop(m))) -- wlr_scene_node_raise_to_top(&c->scene->node); -+ hidebehindmonocle(m); - } - - void -@@ -2092,7 +2115,7 @@ printstatus(void) - if (c->isurgent) - urg |= c->tags; - } -- if ((c = focustop(m))) { -+ if ((c = focustop(m, 0))) { - printf("%s title %s\n", m->wlr_output->name, client_get_title(c)); - printf("%s appid %s\n", m->wlr_output->name, client_get_appid(c)); - printf("%s fullscreen %d\n", m->wlr_output->name, c->isfullscreen); -@@ -2406,7 +2429,7 @@ setmon(Client *c, Monitor *m, uint32_t newtags) - setfullscreen(c, c->isfullscreen); /* This will call arrange(c->mon) */ - setfloating(c, c->isfloating); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - - void -@@ -2680,12 +2703,12 @@ startdrag(struct wl_listener *listener, void *data) - void - tag(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (!sel || (arg->ui & TAGMASK) == 0) - return; - - sel->tags = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2693,7 +2716,7 @@ tag(const Arg *arg) - void - tagmon(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - setmon(sel, dirtomon(arg->i), 0); - } -@@ -2735,7 +2758,7 @@ tile(Monitor *m) - void - togglefloating(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - /* return if fullscreen */ - if (sel && !sel->isfullscreen) - setfloating(sel, !sel->isfloating); -@@ -2744,7 +2767,7 @@ togglefloating(const Arg *arg) - void - togglefullscreen(const Arg *arg) - { -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (sel) - setfullscreen(sel, !sel->isfullscreen); - } -@@ -2753,12 +2776,12 @@ void - toggletag(const Arg *arg) - { - uint32_t newtags; -- Client *sel = focustop(selmon); -+ Client *sel = focustop(selmon, 0); - if (!sel || !(newtags = sel->tags ^ (arg->ui & TAGMASK))) - return; - - sel->tags = newtags; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2771,7 +2794,7 @@ toggleview(const Arg *arg) - return; - - selmon->tagset[selmon->seltags] = newtagset; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -2795,7 +2818,7 @@ unmaplayersurfacenotify(struct wl_listener *listener, void *data) - if (l->layer_surface->output && (l->mon = l->layer_surface->output->data)) - arrangelayers(l->mon); - if (l->layer_surface->surface == seat->keyboard_state.focused_surface) -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - motionnotify(0, NULL, 0, 0, 0, 0); - } - -@@ -2812,7 +2835,7 @@ unmapnotify(struct wl_listener *listener, void *data) - if (client_is_unmanaged(c)) { - if (c == exclusive_focus) { - exclusive_focus = NULL; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - } - } else { - wl_list_remove(&c->link); -@@ -2893,7 +2916,7 @@ updatemons(struct wl_listener *listener, void *data) - /* Don't move clients to the left output when plugging monitors */ - arrange(m); - /* make sure fullscreen clients have the right size */ -- if ((c = focustop(m)) && c->isfullscreen) -+ if ((c = focustop(m, 0)) && c->isfullscreen) - resize(c, m->m, 0); - - /* Try to re-set the gamma LUT when updating monitors, -@@ -2913,7 +2936,7 @@ updatemons(struct wl_listener *listener, void *data) - if (!c->mon && client_surface(c)->mapped) - setmon(c, selmon, c->tags); - } -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - if (selmon->lock_surface) { - client_notify_enter(selmon->lock_surface->surface, - wlr_seat_get_keyboard(seat)); -@@ -2935,7 +2958,7 @@ void - updatetitle(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_title); -- if (c == focustop(c->mon)) -+ if (c == focustop(c->mon, 0)) - printstatus(); - } - -@@ -2945,7 +2968,7 @@ urgent(struct wl_listener *listener, void *data) - struct wlr_xdg_activation_v1_request_activate_event *event = data; - Client *c = NULL; - toplevel_from_wlr_surface(event->surface, &c, NULL); -- if (!c || c == focustop(selmon)) -+ if (!c || c == focustop(selmon, 0)) - return; - - c->isurgent = 1; -@@ -2963,7 +2986,7 @@ view(const Arg *arg) - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -- focusclient(focustop(selmon), 1); -+ focusclient(focustop(selmon, 0), 1); - arrange(selmon); - printstatus(); - } -@@ -3034,7 +3057,7 @@ xytonode(double x, double y, struct wlr_surface **psurface, - void - zoom(const Arg *arg) - { -- Client *c, *sel = focustop(selmon); -+ Client *c, *sel = focustop(selmon, 0); - - if (!sel || !selmon || !selmon->lt[selmon->sellt]->arrange || sel->isfloating) - return; -@@ -3145,7 +3168,7 @@ sethints(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, set_hints); - struct wlr_surface *surface = client_surface(c); -- if (c == focustop(selmon)) -+ if (c == focustop(selmon, 0)) - return; - - c->isurgent = xcb_icccm_wm_hints_get_urgency(c->surface.xwayland->hints); --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/hide_vacant_tags/README.md b/dwl-bak/dwl-patches/patches/hide_vacant_tags/README.md deleted file mode 100644 index fae2a4d..0000000 --- a/dwl-bak/dwl-patches/patches/hide_vacant_tags/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description - -Prevent [bar](/dwl/dwl-patches/wiki/bar) from drawing tags with no clients (i.e. vacant). -It also stops drawing empty rectangles on the bar for non-vacant tags as there is no need anymore to distinguish vacant tags and it offers a more visible contrast than if there were filled/empty rectangles. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/hide_vacant_tags/hide_vacant_tags.patch) - -### Authors -- [sewn](https://codeberg.org/sewn) - diff --git a/dwl-bak/dwl-patches/patches/hide_vacant_tags/hide_vacant_tags.patch b/dwl-bak/dwl-patches/patches/hide_vacant_tags/hide_vacant_tags.patch deleted file mode 100644 index ae3966e..0000000 --- a/dwl-bak/dwl-patches/patches/hide_vacant_tags/hide_vacant_tags.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 54b75630d9f93bd1a8ab5949df64f086043e96eb Mon Sep 17 00:00:00 2001 -From: sewn -Date: Fri, 13 Dec 2024 17:31:33 +0300 -Subject: [PATCH] hide vacant tags - -https://dwm.suckless.org/patches/hide_vacant_tags/ ---- - dwl.c | 21 +++++++++++++-------- - 1 file changed, 13 insertions(+), 8 deletions(-) - -diff --git a/dwl.c b/dwl.c -index 1e199f3..24d4b20 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -721,7 +721,7 @@ bufrelease(struct wl_listener *listener, void *data) - void - buttonpress(struct wl_listener *listener, void *data) - { -- unsigned int i = 0, x = 0; -+ unsigned int i = 0, x = 0, occ = 0; - double cx; - unsigned int click; - struct wlr_pointer_button_event *event = data; -@@ -751,9 +751,16 @@ buttonpress(struct wl_listener *listener, void *data) - (node = wlr_scene_node_at(&layers[LyrBottom]->node, cursor->x, cursor->y, NULL, NULL)) && - (buffer = wlr_scene_buffer_from_node(node)) && buffer == selmon->scene_buffer) { - cx = (cursor->x - selmon->m.x) * selmon->wlr_output->scale; -- do -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != selmon) -+ continue; -+ occ |= c->tags == TAGMASK ? 0 : c->tags; -+ } -+ do { -+ if (!(occ & 1 << i || selmon->tagset[selmon->seltags] & 1 << i)) -+ continue; - x += TEXTW(selmon, tags[i]); -- while (cx >= x && ++i < LENGTH(tags)); -+ } while (cx >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; -@@ -1530,20 +1537,18 @@ drawbar(Monitor *m) - wl_list_for_each(c, &clients, link) { - if (c->mon != m) - continue; -- occ |= c->tags; -+ occ |= c->tags == TAGMASK ? 0 : c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - c = focustop(m); - for (i = 0; i < LENGTH(tags); i++) { -+ if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) -+ continue; - w = TEXTW(m, tags[i]); - drwl_setscheme(m->drw, colors[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, tags[i], urg & 1 << i); -- if (occ & 1 << i) -- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, -- m == selmon && c && c->tags & 1 << i, -- urg & 1 << i); - x += w; - } - w = TEXTW(m, m->ltsymbol); --- -2.47.1 - diff --git a/dwl-bak/dwl-patches/patches/hiderule/README.md b/dwl-bak/dwl-patches/patches/hiderule/README.md deleted file mode 100644 index bed2475..0000000 --- a/dwl-bak/dwl-patches/patches/hiderule/README.md +++ /dev/null @@ -1,9 +0,0 @@ -### Description -Adds a `ishidden` option to client rules, that allows hiding any matching clients entirely. - -### Download -- [git branch](https://codeberg.org/minego/dwl/src/branch/hiderule) -- [yyyy-mm-dd](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/hiderule/hiderule.patch) - -### Authors -- [minego](https://codeberg.org/minego) \ No newline at end of file diff --git a/dwl-bak/dwl-patches/patches/hiderule/hiderule.patch b/dwl-bak/dwl-patches/patches/hiderule/hiderule.patch deleted file mode 100644 index 8ed1a84..0000000 --- a/dwl-bak/dwl-patches/patches/hiderule/hiderule.patch +++ /dev/null @@ -1,57 +0,0 @@ -From fb48ec754d63b3d8e40fff2d047050675887d7f4 Mon Sep 17 00:00:00 2001 -From: Micah N Gorrell -Date: Wed, 27 Mar 2024 12:53:18 -0600 -Subject: [PATCH] hiderule - ---- - config.def.h | 9 ++++++--- - dwl.c | 4 ++++ - 2 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9009517..c476057 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -21,11 +21,14 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - static int log_level = WLR_ERROR; - - static const Rule rules[] = { -- /* app_id title tags mask isfloating monitor */ -+ /* app_id title tags mask isfloating monitor ishidden */ - /* examples: -- { "Gimp", NULL, 0, 1, -1 }, -+ { "Gimp", NULL, 0, 1, -1, 0 }, - */ -- { "firefox", NULL, 1 << 8, 0, -1 }, -+ { "firefox", NULL, 1 << 8, 0, -1, 0 }, -+ -+ { "firefox", "Sharing Indicator", -+ 0, 1, -1, 1 }, - }; - - /* layout(s) */ -diff --git a/dwl.c b/dwl.c -index 5867b0c..799fd89 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -228,6 +228,7 @@ typedef struct { - uint32_t tags; - int isfloating; - int monitor; -+ int ishidden; - } Rule; - - typedef struct { -@@ -464,6 +465,9 @@ applyrules(Client *c) - c->isfloating = r->isfloating; - newtags |= r->tags; - i = 0; -+ if (r->ishidden) { -+ mon = NULL; -+ } - wl_list_for_each(m, &mons, link) { - if (r->monitor == i++) - mon = m; --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/hot-reload/README.md b/dwl-bak/dwl-patches/patches/hot-reload/README.md deleted file mode 100644 index e387ca4..0000000 --- a/dwl-bak/dwl-patches/patches/hot-reload/README.md +++ /dev/null @@ -1,110 +0,0 @@ -### Description -Enables hot-reloading of dwl; meaning almost all logic can be changed at runtime. -This obviously requires some black magic so for now there's a glibc 2.0 or later -dependency to this. -In particular this allows for every option in config.h to be changed at runtime. - -#### Reloading -To reload rebuild dwl.so, perhaps reinstall it and then run trigger reload function (bound to Mod+Shift+R by default). -This currently calls `notify-send` in order to inform you of a reloading taking place. -So in short: -1. make changes to `config.h` or `dwl.c` -2. run `make` to rebuild dwl.so -3. run `sudo make install` to reinstall dwl - - -#### Limitations -Reloading the compositor will replace all functionality except for `main`, `setup`, `run` and the reload logic. -Note that you're responsible yourself for reloading ressources like fonts, which may only get acquired once. -A lot of components of dwl will also only get run on a trigger (the tiling for example). -So not every change will be immediate. -Furthermore, any patch adding more global state to dwl cannot currently be reloaded properly since -we keep state in the cold part. These patches will still work and their functionality will (hopefully) be -reloadable but you will need to restart the compositor once. - -#### Notes -##### reduce compile errors -This patch triggers `-Wpedantic` a bunch (I don't think there's a way around this, `dlsym` yields `void*` pointers to functions). -This will show a lot of warnings but cause no errors. -So you may want to disable this compile option in order to get readable compiler output. -##### runtime dependencies -This does depend on you having a notification daemon like `dunst` or `mako` running as well as -having `notify-send` installed in order for the compositor to inform you of the reload. - - -#### How? -Most of all dwl functionality is moved into a shared object file `dwl.so`, which can be reloaded at runtime. - -#### How do I make this work with other patches? -Most patches should already put everything in more or less the correct place but if they don't, then here is -where you learn how to fix it. - -The concept itself is quite simple. We compile dwl.c twice once normally and once with the `HOT` macro defined. -The first run will yield the executable and the second will yield a shared object file to be reloaded at runtime. -From the cold part there are some newly available macros: -> symbol names are written as-is, never as string literals -* `TSYM(T, s)` dynamically loads the symbol `s` with type `T` from the shared object file use this if you need to call functions in the cold part (i.e. the `setup` function). -* `CSYM(T, v)` dynamically accesses the value of the symbol `v` of type `T` from the shared object. Use this to query values from config.h for example. -* `LISTEN_GLOBAL(E, L)` is similar to the `LISTEN` macro. `E` is an event and `L` the name of a global -listener. Current implementation is a bit messy and I may fix it if someone bothers me about it. -* `UNLISTEN(L)` takes a listener and unregisteres it. This is important for reloading. - -When adding new code there are some considerations to be made. Since dwl decorates all symbols with `static` by default, we cannot access them as-is. -C's macro system is a bit too powerful though and we use this to our advantage. We will repeatedly define and -undefine a macro called `static` in order to replace the `static` keyword inside some sections. -This allows us to do less refactoring and preserve a lot of the original patch compatability since we're only -strategically adding lines. We're tring to be as minimally invasive as we can. -As a general guide: -* global state should be global for the cold part and `extern` in the cold part meaning it should be inside a block like this: - ```C - #ifdef HOT - #define static extern - #else - #define static - #endif - ... // your global variables go here - #undef static - ``` -* function declarations should be visible in the hot part but not included in the cold part meaning they should be enclosed like this: - ```C - #ifdef HOT - #define static - ... // your function declarations go here - #undef static - #endif - ``` -* static data like the event handler structs in the current `main` branch are a bit more difficult but we will let them reside inside the hot part. -Thus, we enclose them the same way we do functions: - ```C - #ifdef HOT - #define static - ... // your struct wl_listener event handlers go here - #undef static - #endif - ``` -* function definitions should go in the hot part, so they need to be inside a big block like this: - ```C - #ifdef HOT - ... // function definitions here - #endif -* enfore use of the `LISTEN_GLOBAL` and `UNLISTEN` macros (I know this sucks but what can I do, I need to get -access to the callbacks somehow). So you want - * `wl_list_remove(listener.link)` to become `UNLISTEN(listener)` and - * `wl_signal_add(event, global_listener)` to become `LISTEN_GLOBAL(event, global_listener)`. -* Make sure that any patch you're using also uses static everywhere. -* If a patch adds any config variables that are accessed in the cold part (i.e. probably `setup`), -then you'll have to manually remove the `static` keyword from them. - -Note that usually you do not have to create the big `#ifdef` blocks yourself. -There is for example already a huge `#ifdef HOT`-delimited codeblock at the bottom -of dwl.c where all the function definitions go. - -If you have any troubles, feel free to reach out. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/hot-reload/hot-reload-0.7.patch) -- [main 2025-05-30](/dwl/dwl-patches/raw/branch/main/patches/hot-reload/hot-reload.patch) -- find the repo for the patch [here](/Sivecano/dwl/src/branch/hot-reload) -### Authors -- [Sivecano](https://codeberg.org/Sivecano) -- Sérécano at [dwl Discord](https://discord.gg/jJxZnrGPWN) diff --git a/dwl-bak/dwl-patches/patches/hot-reload/hot-reload-0.7.patch b/dwl-bak/dwl-patches/patches/hot-reload/hot-reload-0.7.patch deleted file mode 100644 index 1611684..0000000 --- a/dwl-bak/dwl-patches/patches/hot-reload/hot-reload-0.7.patch +++ /dev/null @@ -1,770 +0,0 @@ -From 559c635056f23d55df3f83c12d1201a7328f648f Mon Sep 17 00:00:00 2001 -From: Sivecano -Date: Sun, 26 Jan 2025 18:30:02 +0100 -Subject: [PATCH] redo hot-reloading in one file - ---- - Makefile | 19 ++- - config.def.h | 5 +- - dwl.c | 337 ++++++++++++++++++++++++++++++++++++++++++++------- - util.c | 34 ++++++ - util.h | 6 + - 5 files changed, 351 insertions(+), 50 deletions(-) - -diff --git a/Makefile b/Makefile -index 3358bae..e7ee9ff 100644 ---- a/Makefile -+++ b/Makefile -@@ -13,13 +13,16 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement \ - - # CFLAGS / LDFLAGS - PKGS = wlroots-0.18 wayland-server xkbcommon libinput $(XLIBS) --DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) -+DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) -fPIC -rdynamic - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` -lm $(LIBS) - --all: dwl -+all: dwl dwl.so - dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ --dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ -+dwl.o: dwl.c config.mk cursor-shape-v1-protocol.h \ -+ pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+dwl.so: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h - util.o: util.c util.h -@@ -49,7 +52,7 @@ xdg-shell-protocol.h: - config.h: - cp config.def.h $@ - clean: -- rm -f dwl *.o *-protocol.h -+ rm -f dwl *.o *-protocol.h *.so - - dist: clean - mkdir -p dwl-$(VERSION) -@@ -63,6 +66,8 @@ install: dwl - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dwl $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl -+ mkdir -p $(DESTDIR)$(PREFIX)/lib -+ install -m 744 dwl.so $(DESTDIR)$(PREFIX)/lib - mkdir -p $(DESTDIR)$(MANDIR)/man1 - cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1 - chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1 -@@ -70,9 +75,13 @@ install: dwl - cp -f dwl.desktop $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - chmod 644 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - uninstall: -- rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 \ -+ rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(PREFIX)/lib/dwl.so $(DESTDIR)$(MANDIR)/man1/dwl.1 \ - $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - - .SUFFIXES: .c .o - .c.o: - $(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -c $< -+ -+.SUFFIXES: .c .so -+.c.so: -+ $(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -shared -DHOT $< -diff --git a/config.def.h b/config.def.h -index 22d2171..6e3dda1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,7 +7,7 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); -+const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); -@@ -18,7 +18,7 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - #define TAGCOUNT (9) - - /* logging */ --static int log_level = WLR_ERROR; -+int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -@@ -127,6 +127,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_R, reload, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index def2562..1c9ab67 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,15 @@ - /* - * See LICENSE file for copyright and license details. - */ -+ -+/* stuff for hot-reload */ -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+#include -+ - #include - #include - #include -@@ -67,6 +76,7 @@ - #include - #endif - -+ - #include "util.h" - - /* macros */ -@@ -77,8 +87,34 @@ - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) --#define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) --#define LISTEN_STATIC(E, H) do { static struct wl_listener _l = {.notify = (H)}; wl_signal_add((E), &_l); } while (0) -+ -+#define SYM(a) dlsym(dwl_module, #a) -+#define TSYM(T, a) ((T)SYM(a)) -+#define CSYM(T, a) *(TSYM(T*, a)) -+ -+#define LISTEN(E, L, H) do { \ -+ (L)->notify = SYM(H); \ -+ listeners = append_listener((L), listeners); \ -+ wl_signal_add((E), (L)); \ -+ } while(0) -+ -+#define LISTEN_GLOBAL(E, L) do { \ -+ struct wl_listener* l = SYM(L); \ -+ listeners = append_listener(l, listeners); \ -+ wl_signal_add((E), l); \ -+ } while (0) -+ -+#define LISTEN_STATIC(E, H) do { \ -+ struct wl_listener* _l = malloc(sizeof(struct wl_listener)); \ -+ _l->notify = SYM(H); \ -+ listeners = append_listener(_l, listeners); \ -+ wl_signal_add((E), _l); \ -+ } while (0) -+ -+#define UNLISTEN(L) do { \ -+ wl_list_remove(&(L)->link); \ -+ listeners = remove_listener((L), listeners);\ -+ } while (0) - - /* enums */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -@@ -242,6 +278,9 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+#define static -+ -+#ifdef HOT - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -253,7 +292,18 @@ static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void cleanup(void); -+ -+#undef static -+#define static -+#ifdef HOT -+ - static void cleanupmon(struct wl_listener *listener, void *data); - static void closemon(Monitor *m); - static void commitlayersurfacenotify(struct wl_listener *listener, void *data); -@@ -321,7 +371,18 @@ static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void run(char *startup_cmd); -+ -+#ifdef HOT -+#undef static -+#define static -+ - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -332,7 +393,18 @@ static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void setup(void); -+ -+#ifdef HOT -+#undef static -+#define static -+ - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -356,6 +428,16 @@ static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); - -+#endif -+ -+#ifdef HOT -+ #undef static -+ #define static extern -+#else -+ #undef static -+ #define static -+#endif -+ - /* variables */ - static const char broken[] = "broken"; - static pid_t child_pid = -1; -@@ -400,7 +482,9 @@ static struct wlr_scene_rect *root_bg; - static struct wlr_session_lock_manager_v1 *session_lock_mgr; - static struct wlr_scene_rect *locked_bg; - static struct wlr_session_lock_v1 *cur_lock; -+#ifdef HOT - static struct wl_listener lock_listener = {.notify = locksession}; -+#endif - - static struct wlr_seat *seat; - static KeyboardGroup *kb_group; -@@ -426,6 +510,33 @@ static struct wlr_xwayland *xwayland; - static xcb_atom_t netatom[NetLast]; - #endif - -+/* undoes the shadowing of static from above */ -+#undef static -+ -+/* this is where we put global hot-reload state */ -+#ifdef HOT -+#define COLD extern -+#else -+#define COLD -+ -+static void* load(void); -+static const char* get_module_path(void); -+ -+#endif -+ -+COLD void * dwl_module = NULL; -+COLD void * last_module = NULL; -+COLD struct listens* listeners = NULL; -+COLD void reload(const Arg* arg); -+ -+#ifndef HOT -+static char* runpath; -+ -+#endif -+ -+ -+#ifdef HOT -+ - /* configuration, allows nested code to access above variables */ - #include "config.h" - -@@ -673,6 +784,8 @@ checkidleinhibitor(struct wlr_surface *exclude) - wlr_idle_notifier_v1_set_inhibited(idle_notifier, inhibited); - } - -+#endif -+ - void - cleanup(void) - { -@@ -687,7 +800,7 @@ cleanup(void) - } - wlr_xcursor_manager_destroy(cursor_mgr); - -- destroykeyboardgroup(&kb_group->destroy, NULL); -+ TSYM(void (*)(struct wl_listener*, void*), destroykeyboardgroup)(&kb_group->destroy, NULL); - - /* If it's not destroyed manually it will cause a use-after-free of wlr_seat. - * Destroy it until it's fixed in the wlroots side */ -@@ -699,6 +812,8 @@ cleanup(void) - wlr_scene_node_destroy(&scene->tree.node); - } - -+#ifdef HOT -+ - void - cleanupmon(struct wl_listener *listener, void *data) - { -@@ -712,10 +827,10 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_layer_surface_v1_destroy(l->layer_surface); - } - -- wl_list_remove(&m->destroy.link); -- wl_list_remove(&m->frame.link); -+ UNLISTEN(&m->destroy); -+ UNLISTEN(&m->frame); - wl_list_remove(&m->link); -- wl_list_remove(&m->request_state.link); -+ UNLISTEN(&m->request_state); - m->wlr_output->data = NULL; - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); -@@ -848,7 +963,7 @@ commitpopup(struct wl_listener *listener, void *data) - box.x -= (type == LayerShell ? l->geom.x : c->geom.x); - box.y -= (type == LayerShell ? l->geom.y : c->geom.y); - wlr_xdg_popup_unconstrain_from_box(popup, &box); -- wl_list_remove(&listener->link); -+ UNLISTEN(listener); - } - - void -@@ -1179,8 +1294,8 @@ destroydecoration(struct wl_listener *listener, void *data) - Client *c = wl_container_of(listener, c, destroy_decoration); - c->decoration = NULL; - -- wl_list_remove(&c->destroy_decoration.link); -- wl_list_remove(&c->set_decoration_mode.link); -+ UNLISTEN(&c->destroy_decoration); -+ UNLISTEN(&c->set_decoration_mode); - } - - void -@@ -1205,9 +1320,9 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data) - LayerSurface *l = wl_container_of(listener, l, destroy); - - wl_list_remove(&l->link); -- wl_list_remove(&l->destroy.link); -- wl_list_remove(&l->unmap.link); -- wl_list_remove(&l->surface_commit.link); -+ UNLISTEN(&l->destroy); -+ UNLISTEN(&l->unmap); -+ UNLISTEN(&l->surface_commit); - wlr_scene_node_destroy(&l->scene->node); - wlr_scene_node_destroy(&l->popups->node); - free(l); -@@ -1226,9 +1341,9 @@ destroylock(SessionLock *lock, int unlock) - motionnotify(0, NULL, 0, 0, 0, 0); - - destroy: -- wl_list_remove(&lock->new_surface.link); -- wl_list_remove(&lock->unlock.link); -- wl_list_remove(&lock->destroy.link); -+ UNLISTEN(&lock->new_surface); -+ UNLISTEN(&lock->unlock); -+ UNLISTEN(&lock->destroy); - - wlr_scene_node_destroy(&lock->scene->node); - cur_lock = NULL; -@@ -1242,7 +1357,7 @@ destroylocksurface(struct wl_listener *listener, void *data) - struct wlr_session_lock_surface_v1 *surface, *lock_surface = m->lock_surface; - - m->lock_surface = NULL; -- wl_list_remove(&m->destroy_lock_surface.link); -+ UNLISTEN(&m->destroy_lock_surface); - - if (lock_surface->surface != seat->keyboard_state.focused_surface) - return; -@@ -1262,22 +1377,22 @@ destroynotify(struct wl_listener *listener, void *data) - { - /* Called when the xdg_toplevel is destroyed. */ - Client *c = wl_container_of(listener, c, destroy); -- wl_list_remove(&c->destroy.link); -- wl_list_remove(&c->set_title.link); -- wl_list_remove(&c->fullscreen.link); -+ UNLISTEN(&c->destroy); -+ UNLISTEN(&c->set_title); -+ UNLISTEN(&c->fullscreen); - #ifdef XWAYLAND - if (c->type != XDGShell) { -- wl_list_remove(&c->activate.link); -- wl_list_remove(&c->associate.link); -- wl_list_remove(&c->configure.link); -- wl_list_remove(&c->dissociate.link); -- wl_list_remove(&c->set_hints.link); -+ UNLISTEN(&c->activate); -+ UNLISTEN(&c->associate); -+ UNLISTEN(&c->configure); -+ UNLISTEN(&c->dissociate); -+ UNLISTEN(&c->set_hints); - } else - #endif - { -- wl_list_remove(&c->commit.link); -- wl_list_remove(&c->map.link); -- wl_list_remove(&c->unmap.link); -+ UNLISTEN(&c->commit); -+ UNLISTEN(&c->map); -+ UNLISTEN(&c->unmap); - } - free(c); - } -@@ -1292,7 +1407,7 @@ destroypointerconstraint(struct wl_listener *listener, void *data) - active_constraint = NULL; - } - -- wl_list_remove(&pointer_constraint->destroy.link); -+ UNLISTEN(&pointer_constraint->destroy); - free(pointer_constraint); - } - -@@ -1306,8 +1421,8 @@ destroysessionlock(struct wl_listener *listener, void *data) - void - destroysessionmgr(struct wl_listener *listener, void *data) - { -- wl_list_remove(&lock_listener.link); -- wl_list_remove(&listener->link); -+ UNLISTEN(&lock_listener); -+ UNLISTEN(listener); - } - - void -@@ -1315,10 +1430,10 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - { - KeyboardGroup *group = wl_container_of(listener, group, destroy); - wl_event_source_remove(group->key_repeat_source); -+ UNLISTEN(&group->key); -+ UNLISTEN(&group->modifiers); -+ UNLISTEN(&group->destroy); - wlr_keyboard_group_destroy(group->wlr_group); -- wl_list_remove(&group->key.link); -- wl_list_remove(&group->modifiers.link); -- wl_list_remove(&group->destroy.link); - free(group); - } - -@@ -2212,6 +2327,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); - } - -+#else /*HOT*/ -+ - void - run(char *startup_cmd) - { -@@ -2251,11 +2368,11 @@ run(char *startup_cmd) - if (fd_set_nonblock(STDOUT_FILENO) < 0) - close(STDOUT_FILENO); - -- printstatus(); -+ TSYM(void (*)(void), printstatus)(); - - /* At this point the outputs are initialized, choose initial selmon based on - * cursor position, and set default cursor image */ -- selmon = xytomon(cursor->x, cursor->y); -+ selmon = TSYM(Monitor* (*)(double x, double y), xytomon)(cursor->x, cursor->y); - - /* TODO hack to get cursor to display in its initial location (100, 100) - * instead of (0, 0) and then jumping. still may not be fully -@@ -2271,6 +2388,9 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+#endif -+#ifdef HOT -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2428,17 +2548,19 @@ setsel(struct wl_listener *listener, void *data) - wlr_seat_set_selection(seat, event->source, event->serial); - } - -+#else /*HOT*/ -+ - void - setup(void) - { - int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; -- struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; -+ struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = SYM(handlesig)}; - sigemptyset(&sa.sa_mask); - - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -- wlr_log_init(log_level, NULL); -+ wlr_log_init(CSYM(enum wlr_log_importance, log_level), NULL); - - /* The Wayland display is managed by libwayland. It handles accepting - * clients from the Unix socket, manging Wayland globals, and so on. */ -@@ -2454,7 +2576,7 @@ setup(void) - - /* Initialize the scene graph used to lay out windows */ - scene = wlr_scene_create(); -- root_bg = wlr_scene_rect_create(&scene->tree, 0, 0, rootcolor); -+ root_bg = wlr_scene_rect_create(&scene->tree, 0, 0, TSYM(float*, rootcolor)); - for (i = 0; i < NUM_LAYERS; i++) - layers[i] = wlr_scene_tree_create(&scene->tree); - drag_icon = wlr_scene_tree_create(&scene->tree); -@@ -2550,7 +2672,7 @@ setup(void) - LISTEN_STATIC(&idle_inhibit_mgr->events.new_inhibitor, createidleinhibitor); - - session_lock_mgr = wlr_session_lock_manager_v1_create(dpy); -- wl_signal_add(&session_lock_mgr->events.new_lock, &lock_listener); -+ LISTEN_GLOBAL(&session_lock_mgr->events.new_lock, lock_listener); - LISTEN_STATIC(&session_lock_mgr->events.destroy, destroysessionmgr); - locked_bg = wlr_scene_rect_create(layers[LyrBlock], sgeom.width, sgeom.height, - (float [4]){0.1f, 0.1f, 0.1f, 1.0f}); -@@ -2620,7 +2742,7 @@ setup(void) - LISTEN_STATIC(&seat->events.request_start_drag, requeststartdrag); - LISTEN_STATIC(&seat->events.start_drag, startdrag); - -- kb_group = createkeyboardgroup(); -+ kb_group = TSYM(KeyboardGroup *(*)(void), createkeyboardgroup)(); - wl_list_init(&kb_group->destroy.link); - - output_mgr = wlr_output_manager_v1_create(dpy); -@@ -2647,6 +2769,9 @@ setup(void) - #endif - } - -+#endif -+#ifdef HOT -+ - void - spawn(const Arg *arg) - { -@@ -3121,8 +3246,8 @@ void - dissociatex11(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, dissociate); -- wl_list_remove(&c->map.link); -- wl_list_remove(&c->unmap.link); -+ UNLISTEN(&c->map); -+ UNLISTEN(&c->unmap); - } - - xcb_atom_t -@@ -3185,17 +3310,141 @@ xwaylandready(struct wl_listener *listener, void *data) - } - #endif - -+#else /* HOT */ -+void* -+load(void) -+{ -+ const char* path = get_module_path(); -+ char load[PATH_MAX] = "/tmp/dwl.soXXXXXX"; -+ void* new; -+ -+ if (!path) { -+ fprintf(stderr, "cannot find dwl.so\n"); -+ } -+ -+ do { -+ mktemp(load); -+ errno = 0; -+ symlink(path, load); -+ } while(errno == EEXIST); -+ -+ new = dlopen(load, RTLD_NOW|RTLD_LOCAL); -+ -+ unlink(load); -+ if (new == NULL) -+ fprintf(stderr, "error while loading %s: %s\n", path, dlerror()); -+ else -+ printf("loaded: %s\n", path); -+ -+ return new; -+} -+ -+const char * -+get_module_path(void) { -+ char home[PATH_MAX]; -+ strcpy(home, getenv("HOME")); -+ strcat(home, "/.local/lib"); -+ const char* abspaths[] = {".", home, "/usr/share/lib", "/usr/local/lib", "/usr/local/share/lib"}; -+ const char* relpaths[] = {"", "/../lib"}; -+ char paths[LENGTH(abspaths) + LENGTH(relpaths)][PATH_MAX]; -+ static char out[PATH_MAX] = "./"; -+ -+ for (size_t i = 0; i < LENGTH(abspaths); i++) -+ realpath(abspaths[i], paths[i]); -+ -+ for (size_t i = 0; i < LENGTH(relpaths); i++) -+ { -+ char tmp[PATH_MAX]; -+ strcpy(tmp, runpath); -+ strcat(tmp, relpaths[i]); -+ realpath(tmp, paths[LENGTH(abspaths) + i]); -+ } -+ -+ -+ -+ for (size_t i = 0; i < LENGTH(paths); i++) -+ { -+ char tmp[PATH_MAX]; -+ printf("checking path: %s\n", paths[i]); -+ strcpy(tmp, paths[i]); -+ strcat(tmp, "/dwl.so"); -+ if (access(tmp, F_OK|R_OK) == 0) -+ { -+ strcpy(out, tmp); -+ return out; -+ } -+ } -+ -+ return NULL; -+} -+ -+void -+reload(const Arg* arg) -+{ -+ char* error; -+ void* new; -+ size_t i = 0; -+ -+ // deinitialize previous module -+ if (last_module) { -+ // dlclose(last_module); -+ last_module = NULL; -+ } -+ -+ wlr_log(WLR_INFO, "reloading"); -+ -+ new = load(); -+ -+ if (new == NULL) -+ { -+ wlr_log(WLR_ERROR, "couldn't load new dwl module from %s", get_module_path()); -+ -+ if (fork() == 0) -+ execl("/bin/env", "--", "notify-send", "-u", "low", "failed to reload dwl", NULL); -+ return; -+ } -+ -+ wlr_log(WLR_DEBUG, "---------- listens ---------"); -+ for(listens* a = listeners; a != NULL; a = a->next) -+ { -+ Dl_info info; -+ void* old = a->listen->notify; -+ dladdr(a->listen->notify, &info); -+ a->listen->notify = dlsym(new, info.dli_sname); -+ if ((error = dlerror()) != NULL){ -+ fprintf(stderr, "reload failure: %s", error); -+ a->listen->notify = old; -+ return; -+ } -+ wlr_log(WLR_DEBUG, "replaced listener: %s", info.dli_sname); -+ i++; -+ } -+ -+ wlr_log(WLR_DEBUG, "---------- done! ---------"); -+ wlr_log(WLR_DEBUG, "replaced %zu listeners", i); -+ -+ last_module = dwl_module; -+ dwl_module = new; -+ -+ if (fork() == 0) -+ execl("/bin/env", "--", "notify-send", "-u", "low", "reloaded dwl", NULL); -+ -+} -+ - int - main(int argc, char *argv[]) - { - char *startup_cmd = NULL; - int c; - -+ runpath = dirname(argv[0]); -+ dwl_module = load(); -+ - while ((c = getopt(argc, argv, "s:hdv")) != -1) { - if (c == 's') - startup_cmd = optarg; - else if (c == 'd') -- log_level = WLR_DEBUG; -+ CSYM(enum wlr_log_importance, log_level) = WLR_DEBUG; - else if (c == 'v') - die("dwl " VERSION); - else -@@ -3215,3 +3464,5 @@ main(int argc, char *argv[]) - usage: - die("Usage: %s [-v] [-d] [-s startup command]", argv[0]); - } -+ -+#endif -diff --git a/util.c b/util.c -index 51130af..2000731 100644 ---- a/util.c -+++ b/util.c -@@ -49,3 +49,37 @@ fd_set_nonblock(int fd) { - - return 0; - } -+ -+struct listens* -+append_listener(struct wl_listener* new, struct listens* list) -+{ -+ struct listens* l = malloc(sizeof(struct listens)); -+ l->listen = new; -+ l->next = list; -+ return l; -+} -+ -+struct listens* -+remove_listener(struct wl_listener* l, struct listens* ls) -+{ -+ struct listens* out = ls; -+ struct listens* f = NULL; -+ for(struct listens* last = NULL; ls != NULL; ls = ls->next) -+ { -+ if (ls->listen == l) -+ { -+ if (last != NULL) -+ last->next = ls->next; -+ else -+ out = ls->next; -+ -+ f = ls; -+ } -+ else -+ last = ls; -+ } -+ -+ free(f); -+ -+ return out; -+} -diff --git a/util.h b/util.h -index 226980d..11aab34 100644 ---- a/util.h -+++ b/util.h -@@ -1,5 +1,11 @@ - /* See LICENSE.dwm file for copyright and license details. */ -+typedef struct listens { -+ struct wl_listener* listen; -+ struct listens* next; -+} listens; - - void die(const char *fmt, ...); - void *ecalloc(size_t nmemb, size_t size); - int fd_set_nonblock(int fd); -+struct listens* append_listener(struct wl_listener* l, struct listens* ls); -+struct listens* remove_listener(struct wl_listener* l, struct listens* ls); --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/hot-reload/hot-reload.patch b/dwl-bak/dwl-patches/patches/hot-reload/hot-reload.patch deleted file mode 100644 index 627fa88..0000000 --- a/dwl-bak/dwl-patches/patches/hot-reload/hot-reload.patch +++ /dev/null @@ -1,1029 +0,0 @@ -From 44ce31430dd7d2c0a6c1dc29534f22fb33b25bca Mon Sep 17 00:00:00 2001 -From: Sivecano -Date: Sun, 26 Jan 2025 18:30:02 +0100 -Subject: [PATCH] redo hot-reloading in one file - ---- - Makefile | 19 +- - config.def.h | 5 +- - dwl.c | 484 +++++++++++++++++++++++++++++++++++++++------------ - util.c | 34 ++++ - util.h | 6 + - 5 files changed, 433 insertions(+), 115 deletions(-) - -diff --git a/Makefile b/Makefile -index 578194f..69c1b54 100644 ---- a/Makefile -+++ b/Makefile -@@ -13,13 +13,16 @@ DWLDEVCFLAGS = -g -Wpedantic -Wall -Wextra -Wdeclaration-after-statement \ - - # CFLAGS / LDFLAGS - PKGS = wayland-server xkbcommon libinput $(XLIBS) --DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) -+DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS) -fPIC -rdynamic - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS) - --all: dwl -+all: dwl dwl.so - dwl: dwl.o util.o - $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ --dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ -+dwl.o: dwl.c config.mk cursor-shape-v1-protocol.h \ -+ pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+dwl.so: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ - wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h - util.o: util.c util.h -@@ -49,7 +52,7 @@ xdg-shell-protocol.h: - config.h: - cp config.def.h $@ - clean: -- rm -f dwl *.o *-protocol.h -+ rm -f dwl *.o *-protocol.h *.so - - dist: clean - mkdir -p dwl-$(VERSION) -@@ -64,6 +67,8 @@ install: dwl - rm -f $(DESTDIR)$(PREFIX)/bin/dwl - cp -f dwl $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dwl -+ mkdir -p $(DESTDIR)$(PREFIX)/lib -+ install -m 744 dwl.so $(DESTDIR)$(PREFIX)/lib - mkdir -p $(DESTDIR)$(MANDIR)/man1 - cp -f dwl.1 $(DESTDIR)$(MANDIR)/man1 - chmod 644 $(DESTDIR)$(MANDIR)/man1/dwl.1 -@@ -71,9 +76,13 @@ install: dwl - cp -f dwl.desktop $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - chmod 644 $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - uninstall: -- rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1 \ -+ rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(PREFIX)/lib/dwl.so $(DESTDIR)$(MANDIR)/man1/dwl.1 \ - $(DESTDIR)$(DATADIR)/wayland-sessions/dwl.desktop - - .SUFFIXES: .c .o - .c.o: - $(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -c $< -+ -+.SUFFIXES: .c .so -+.c.so: -+ $(CC) $(CPPFLAGS) $(DWLCFLAGS) -o $@ -shared -DHOT $< -diff --git a/config.def.h b/config.def.h -index 22d2171..6e3dda1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -7,7 +7,7 @@ - static const int sloppyfocus = 1; /* focus follows mouse */ - static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ - static const unsigned int borderpx = 1; /* border pixel of windows */ --static const float rootcolor[] = COLOR(0x222222ff); -+const float rootcolor[] = COLOR(0x222222ff); - static const float bordercolor[] = COLOR(0x444444ff); - static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); -@@ -18,7 +18,7 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - #define TAGCOUNT (9) - - /* logging */ --static int log_level = WLR_ERROR; -+int log_level = WLR_ERROR; - - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { -@@ -127,6 +127,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_R, reload, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index 4816159..70e99be 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1,6 +1,15 @@ - /* - * See LICENSE file for copyright and license details. - */ -+ -+/* stuff for hot-reload */ -+#define _GNU_SOURCE -+#include -+#include -+#include -+#include -+#include -+ - #include - #include - #include -@@ -68,6 +77,7 @@ - #include - #endif - -+ - #include "util.h" - - /* macros */ -@@ -78,8 +88,33 @@ - #define LENGTH(X) (sizeof X / sizeof X[0]) - #define END(A) ((A) + LENGTH(A)) - #define TAGMASK ((1u << TAGCOUNT) - 1) --#define LISTEN(E, L, H) wl_signal_add((E), ((L)->notify = (H), (L))) --#define LISTEN_STATIC(E, H) do { struct wl_listener *_l = ecalloc(1, sizeof(*_l)); _l->notify = (H); wl_signal_add((E), _l); } while (0) -+#define SYM(a) dlsym(dwl_module, #a) -+#define TSYM(T, a) ((T)SYM(a)) -+#define CSYM(T, a) *(TSYM(T*, a)) -+ -+#define LISTEN(E, L, H) do { \ -+ (L)->notify = SYM(H); \ -+ listeners = append_listener((L), listeners); \ -+ wl_signal_add((E), (L)); \ -+ } while(0) -+ -+#define LISTEN_GLOBAL(E, L) do { \ -+ struct wl_listener* l = SYM(L); \ -+ listeners = append_listener(l, listeners); \ -+ wl_signal_add((E), l); \ -+ } while (0) -+ -+#define LISTEN_STATIC(E, H) do { \ -+ struct wl_listener* _l = ecalloc(1, sizeof(struct wl_listener)); \ -+ _l->notify = SYM(H); \ -+ listeners = append_listener(_l, listeners); \ -+ wl_signal_add((E), _l); \ -+ } while (0) -+ -+#define UNLISTEN(L) do { \ -+ wl_list_remove(&(L)->link); \ -+ listeners = remove_listener((L), listeners);\ -+ } while (0) - - /* enums */ - enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ -@@ -239,6 +274,9 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+#define static -+ -+#ifdef HOT - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -250,7 +288,18 @@ static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); - static void checkidleinhibitor(struct wlr_surface *exclude); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void cleanup(void); -+ -+#undef static -+#define static -+#ifdef HOT -+ - static void cleanupmon(struct wl_listener *listener, void *data); - static void cleanuplisteners(void); - static void closemon(Monitor *m); -@@ -318,7 +367,18 @@ static void requestdecorationmode(struct wl_listener *listener, void *data); - static void requeststartdrag(struct wl_listener *listener, void *data); - static void requestmonstate(struct wl_listener *listener, void *data); - static void resize(Client *c, struct wlr_box geo, int interact); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void run(char *startup_cmd); -+ -+#ifdef HOT -+#undef static -+#define static -+ - static void setcursor(struct wl_listener *listener, void *data); - static void setcursorshape(struct wl_listener *listener, void *data); - static void setfloating(Client *c, int floating); -@@ -328,7 +388,18 @@ static void setmfact(const Arg *arg); - static void setmon(Client *c, Monitor *m, uint32_t newtags); - static void setpsel(struct wl_listener *listener, void *data); - static void setsel(struct wl_listener *listener, void *data); -+ -+#undef static -+#define static extern -+#endif -+ -+/* this is cold */ - static void setup(void); -+ -+#ifdef HOT -+#undef static -+#define static -+ - static void spawn(const Arg *arg); - static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); -@@ -352,6 +423,16 @@ static void xytonode(double x, double y, struct wlr_surface **psurface, - Client **pc, LayerSurface **pl, double *nx, double *ny); - static void zoom(const Arg *arg); - -+#endif -+ -+#ifdef HOT -+ #undef static -+ #define static extern -+#else -+ #undef static -+ #define static -+#endif -+ - /* variables */ - static pid_t child_pid = -1; - static int locked; -@@ -406,6 +487,10 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+#ifdef HOT -+#undef static -+#define static -+ - /* global event handlers */ - static struct wl_listener cursor_axis = {.notify = axisnotify}; - static struct wl_listener cursor_button = {.notify = buttonpress}; -@@ -429,6 +514,7 @@ static struct wl_listener output_mgr_test = {.notify = outputmgrtest}; - static struct wl_listener output_power_mgr_set_mode = {.notify = powermgrsetmode}; - static struct wl_listener request_activate = {.notify = urgent}; - static struct wl_listener request_cursor = {.notify = setcursor}; -+ - static struct wl_listener request_set_psel = {.notify = setpsel}; - static struct wl_listener request_set_sel = {.notify = setsel}; - static struct wl_listener request_set_cursor_shape = {.notify = setcursorshape}; -@@ -436,7 +522,15 @@ static struct wl_listener request_start_drag = {.notify = requeststartdrag}; - static struct wl_listener start_drag = {.notify = startdrag}; - static struct wl_listener new_session_lock = {.notify = locksession}; - -+/* undoes the shadowing of static from above */ -+#endif -+#undef static -+ -+ - #ifdef XWAYLAND -+#ifdef HOT -+#define static -+ - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); - static void configurex11(struct wl_listener *listener, void *data); -@@ -446,11 +540,45 @@ static void sethints(struct wl_listener *listener, void *data); - static void xwaylandready(struct wl_listener *listener, void *data); - static struct wl_listener new_xwayland_surface = {.notify = createnotifyx11}; - static struct wl_listener xwayland_ready = {.notify = xwaylandready}; -+ -+#define static extern -+#else -+#define static -+#endif -+ - static struct wlr_xwayland *xwayland; -+ -+#undef static -+#endif -+ -+/* this is where we put global hot-reload state */ -+#ifdef HOT -+#define COLD extern -+#else -+#define COLD -+ -+static void* load(void); -+static const char* get_module_path(void); -+ -+#endif -+ -+COLD void * dwl_module = NULL; -+COLD void * last_module = NULL; -+COLD struct listens* listeners = NULL; -+COLD void reload(const Arg* arg); -+ -+#ifndef HOT -+static char* runpath; -+ - #endif - -+ -+#ifdef HOT -+ -+#define static - /* configuration, allows nested code to access above variables */ - #include "config.h" -+#undef static - - /* attempt to encapsulate suck into one file */ - #include "client.h" -@@ -695,10 +823,12 @@ checkidleinhibitor(struct wlr_surface *exclude) - wlr_idle_notifier_v1_set_inhibited(idle_notifier, inhibited); - } - -+#endif -+ - void - cleanup(void) - { -- cleanuplisteners(); -+ TSYM(void (*)(void), cleanuplisteners)(); - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; -@@ -710,7 +840,7 @@ cleanup(void) - } - wlr_xcursor_manager_destroy(cursor_mgr); - -- destroykeyboardgroup(&kb_group->destroy, NULL); -+ TSYM(void (*)(struct wl_listener*, void*), destroykeyboardgroup)(&kb_group->destroy, NULL); - - /* If it's not destroyed manually it will cause a use-after-free of wlr_seat. - * Destroy it until it's fixed in the wlroots side */ -@@ -722,6 +852,8 @@ cleanup(void) - wlr_scene_node_destroy(&scene->tree.node); - } - -+#ifdef HOT -+ - void - cleanupmon(struct wl_listener *listener, void *data) - { -@@ -735,10 +867,10 @@ cleanupmon(struct wl_listener *listener, void *data) - wlr_layer_surface_v1_destroy(l->layer_surface); - } - -- wl_list_remove(&m->destroy.link); -- wl_list_remove(&m->frame.link); -+ UNLISTEN(&m->destroy); -+ UNLISTEN(&m->frame); - wl_list_remove(&m->link); -- wl_list_remove(&m->request_state.link); -+ UNLISTEN(&m->request_state); - m->wlr_output->data = NULL; - wlr_output_layout_remove(output_layout, m->wlr_output); - wlr_scene_output_destroy(m->scene_output); -@@ -751,37 +883,37 @@ cleanupmon(struct wl_listener *listener, void *data) - void - cleanuplisteners(void) - { -- wl_list_remove(&cursor_axis.link); -- wl_list_remove(&cursor_button.link); -- wl_list_remove(&cursor_frame.link); -- wl_list_remove(&cursor_motion.link); -- wl_list_remove(&cursor_motion_absolute.link); -- wl_list_remove(&gpu_reset.link); -- wl_list_remove(&new_idle_inhibitor.link); -- wl_list_remove(&layout_change.link); -- wl_list_remove(&new_input_device.link); -- wl_list_remove(&new_virtual_keyboard.link); -- wl_list_remove(&new_virtual_pointer.link); -- wl_list_remove(&new_pointer_constraint.link); -- wl_list_remove(&new_output.link); -- wl_list_remove(&new_xdg_toplevel.link); -- wl_list_remove(&new_xdg_decoration.link); -- wl_list_remove(&new_xdg_popup.link); -- wl_list_remove(&new_layer_surface.link); -- wl_list_remove(&output_mgr_apply.link); -- wl_list_remove(&output_mgr_test.link); -- wl_list_remove(&output_power_mgr_set_mode.link); -- wl_list_remove(&request_activate.link); -- wl_list_remove(&request_cursor.link); -- wl_list_remove(&request_set_psel.link); -- wl_list_remove(&request_set_sel.link); -- wl_list_remove(&request_set_cursor_shape.link); -- wl_list_remove(&request_start_drag.link); -- wl_list_remove(&start_drag.link); -- wl_list_remove(&new_session_lock.link); -+ UNLISTEN(&cursor_axis); -+ UNLISTEN(&cursor_button); -+ UNLISTEN(&cursor_frame); -+ UNLISTEN(&cursor_motion); -+ UNLISTEN(&cursor_motion_absolute); -+ UNLISTEN(&gpu_reset); -+ UNLISTEN(&new_idle_inhibitor); -+ UNLISTEN(&layout_change); -+ UNLISTEN(&new_input_device); -+ UNLISTEN(&new_virtual_keyboard); -+ UNLISTEN(&new_virtual_pointer); -+ UNLISTEN(&new_pointer_constraint); -+ UNLISTEN(&new_output); -+ UNLISTEN(&new_xdg_toplevel); -+ UNLISTEN(&new_xdg_decoration); -+ UNLISTEN(&new_xdg_popup); -+ UNLISTEN(&new_layer_surface); -+ UNLISTEN(&output_mgr_apply); -+ UNLISTEN(&output_mgr_test); -+ UNLISTEN(&output_power_mgr_set_mode); -+ UNLISTEN(&request_activate); -+ UNLISTEN(&request_cursor); -+ UNLISTEN(&request_set_psel); -+ UNLISTEN(&request_set_sel); -+ UNLISTEN(&request_set_cursor_shape); -+ UNLISTEN(&request_start_drag); -+ UNLISTEN(&start_drag); -+ UNLISTEN(&new_session_lock); - #ifdef XWAYLAND -- wl_list_remove(&new_xwayland_surface.link); -- wl_list_remove(&xwayland_ready.link); -+ UNLISTEN(&new_xwayland_surface); -+ UNLISTEN(&xwayland_ready); - #endif - } - -@@ -908,7 +1040,7 @@ commitpopup(struct wl_listener *listener, void *data) - box.x -= (type == LayerShell ? l->scene->node.x : c->geom.x); - box.y -= (type == LayerShell ? l->scene->node.y : c->geom.y); - wlr_xdg_popup_unconstrain_from_box(popup, &box); -- wl_list_remove(&listener->link); -+ UNLISTEN(listener); - free(listener); - } - -@@ -1239,8 +1371,8 @@ destroydecoration(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, destroy_decoration); - -- wl_list_remove(&c->destroy_decoration.link); -- wl_list_remove(&c->set_decoration_mode.link); -+ UNLISTEN(&c->destroy_decoration); -+ UNLISTEN(&c->set_decoration_mode); - } - - void -@@ -1249,7 +1381,7 @@ destroydragicon(struct wl_listener *listener, void *data) - /* Focus enter isn't sent during drag, so refocus the focused node. */ - focusclient(focustop(selmon), 1); - motionnotify(0, NULL, 0, 0, 0, 0); -- wl_list_remove(&listener->link); -+ UNLISTEN(listener); - free(listener); - } - -@@ -1259,7 +1391,7 @@ destroyidleinhibitor(struct wl_listener *listener, void *data) - /* `data` is the wlr_surface of the idle inhibitor being destroyed, - * at this point the idle inhibitor is still in the list of the manager */ - checkidleinhibitor(wlr_surface_get_root_surface(data)); -- wl_list_remove(&listener->link); -+ UNLISTEN(listener); - free(listener); - } - -@@ -1269,9 +1401,9 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data) - LayerSurface *l = wl_container_of(listener, l, destroy); - - wl_list_remove(&l->link); -- wl_list_remove(&l->destroy.link); -- wl_list_remove(&l->unmap.link); -- wl_list_remove(&l->surface_commit.link); -+ UNLISTEN(&l->destroy); -+ UNLISTEN(&l->unmap); -+ UNLISTEN(&l->surface_commit); - wlr_scene_node_destroy(&l->scene->node); - wlr_scene_node_destroy(&l->popups->node); - free(l); -@@ -1290,9 +1422,9 @@ destroylock(SessionLock *lock, int unlock) - motionnotify(0, NULL, 0, 0, 0, 0); - - destroy: -- wl_list_remove(&lock->new_surface.link); -- wl_list_remove(&lock->unlock.link); -- wl_list_remove(&lock->destroy.link); -+ UNLISTEN(&lock->new_surface); -+ UNLISTEN(&lock->unlock); -+ UNLISTEN(&lock->destroy); - - wlr_scene_node_destroy(&lock->scene->node); - cur_lock = NULL; -@@ -1306,7 +1438,7 @@ destroylocksurface(struct wl_listener *listener, void *data) - struct wlr_session_lock_surface_v1 *surface, *lock_surface = m->lock_surface; - - m->lock_surface = NULL; -- wl_list_remove(&m->destroy_lock_surface.link); -+ UNLISTEN(&m->destroy_lock_surface); - - if (lock_surface->surface != seat->keyboard_state.focused_surface) - return; -@@ -1326,23 +1458,23 @@ destroynotify(struct wl_listener *listener, void *data) - { - /* Called when the xdg_toplevel is destroyed. */ - Client *c = wl_container_of(listener, c, destroy); -- wl_list_remove(&c->destroy.link); -- wl_list_remove(&c->set_title.link); -- wl_list_remove(&c->fullscreen.link); -+ UNLISTEN(&c->destroy); -+ UNLISTEN(&c->set_title); -+ UNLISTEN(&c->fullscreen); - #ifdef XWAYLAND - if (c->type != XDGShell) { -- wl_list_remove(&c->activate.link); -- wl_list_remove(&c->associate.link); -- wl_list_remove(&c->configure.link); -- wl_list_remove(&c->dissociate.link); -- wl_list_remove(&c->set_hints.link); -+ UNLISTEN(&c->activate); -+ UNLISTEN(&c->associate); -+ UNLISTEN(&c->configure); -+ UNLISTEN(&c->dissociate); -+ UNLISTEN(&c->set_hints); - } else - #endif - { -- wl_list_remove(&c->commit.link); -- wl_list_remove(&c->map.link); -- wl_list_remove(&c->unmap.link); -- wl_list_remove(&c->maximize.link); -+ UNLISTEN(&c->commit); -+ UNLISTEN(&c->map); -+ UNLISTEN(&c->unmap); -+ UNLISTEN(&c->maximize); - } - free(c); - } -@@ -1357,7 +1489,7 @@ destroypointerconstraint(struct wl_listener *listener, void *data) - active_constraint = NULL; - } - -- wl_list_remove(&pointer_constraint->destroy.link); -+ UNLISTEN(&pointer_constraint->destroy); - free(pointer_constraint); - } - -@@ -1373,9 +1505,9 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - { - KeyboardGroup *group = wl_container_of(listener, group, destroy); - wl_event_source_remove(group->key_repeat_source); -- wl_list_remove(&group->key.link); -- wl_list_remove(&group->modifiers.link); -- wl_list_remove(&group->destroy.link); -+ UNLISTEN(&group->key); -+ UNLISTEN(&group->modifiers); -+ UNLISTEN(&group->destroy); - wlr_keyboard_group_destroy(group->wlr_group); - free(group); - } -@@ -1541,8 +1673,8 @@ gpureset(struct wl_listener *listener, void *data) - if (!(alloc = wlr_allocator_autocreate(backend, drw))) - die("couldn't recreate allocator"); - -- wl_list_remove(&gpu_reset.link); -- wl_signal_add(&drw->events.lost, &gpu_reset); -+ UNLISTEN(&gpu_reset); -+ LISTEN_GLOBAL(&drw->events.lost, gpu_reset); - - wlr_compositor_set_renderer(compositor, drw); - -@@ -2232,6 +2364,8 @@ resize(Client *c, struct wlr_box geo, int interact) - wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip); - } - -+#else /*HOT*/ -+ - void - run(char *startup_cmd) - { -@@ -2271,11 +2405,11 @@ run(char *startup_cmd) - if (fd_set_nonblock(STDOUT_FILENO) < 0) - close(STDOUT_FILENO); - -- printstatus(); -+ TSYM(void (*)(void), printstatus)(); - - /* At this point the outputs are initialized, choose initial selmon based on - * cursor position, and set default cursor image */ -- selmon = xytomon(cursor->x, cursor->y); -+ selmon = TSYM(Monitor* (*)(double x, double y), xytomon)(cursor->x, cursor->y); - - /* TODO hack to get cursor to display in its initial location (100, 100) - * instead of (0, 0) and then jumping. still may not be fully -@@ -2291,6 +2425,9 @@ run(char *startup_cmd) - wl_display_run(dpy); - } - -+#endif -+#ifdef HOT -+ - void - setcursor(struct wl_listener *listener, void *data) - { -@@ -2437,17 +2574,19 @@ setsel(struct wl_listener *listener, void *data) - wlr_seat_set_selection(seat, event->source, event->serial); - } - -+#else /*HOT*/ -+ - void - setup(void) - { - int drm_fd, i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE}; -- struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig}; -+ struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = SYM(handlesig)}; - sigemptyset(&sa.sa_mask); - - for (i = 0; i < (int)LENGTH(sig); i++) - sigaction(sig[i], &sa, NULL); - -- wlr_log_init(log_level, NULL); -+ wlr_log_init(CSYM(enum wlr_log_importance, log_level), NULL); - - /* The Wayland display is managed by libwayland. It handles accepting - * clients from the Unix socket, manging Wayland globals, and so on. */ -@@ -2463,7 +2602,7 @@ setup(void) - - /* Initialize the scene graph used to lay out windows */ - scene = wlr_scene_create(); -- root_bg = wlr_scene_rect_create(&scene->tree, 0, 0, rootcolor); -+ root_bg = wlr_scene_rect_create(&scene->tree, 0, 0, TSYM(float*, rootcolor)); - for (i = 0; i < NUM_LAYERS; i++) - layers[i] = wlr_scene_tree_create(&scene->tree); - drag_icon = wlr_scene_tree_create(&scene->tree); -@@ -2475,7 +2614,7 @@ setup(void) - * supports for shared memory, this configures that for clients. */ - if (!(drw = wlr_renderer_autocreate(backend))) - die("couldn't create renderer"); -- wl_signal_add(&drw->events.lost, &gpu_reset); -+ LISTEN_GLOBAL(&drw->events.lost, gpu_reset); - - /* Create shm, drm and linux_dmabuf interfaces by ourselves. - * The simplest way is call: -@@ -2522,24 +2661,24 @@ setup(void) - - /* Initializes the interface used to implement urgency hints */ - activation = wlr_xdg_activation_v1_create(dpy); -- wl_signal_add(&activation->events.request_activate, &request_activate); -+ LISTEN_GLOBAL(&activation->events.request_activate, request_activate); - - wlr_scene_set_gamma_control_manager_v1(scene, wlr_gamma_control_manager_v1_create(dpy)); - - power_mgr = wlr_output_power_manager_v1_create(dpy); -- wl_signal_add(&power_mgr->events.set_mode, &output_power_mgr_set_mode); -+ LISTEN_GLOBAL(&power_mgr->events.set_mode, output_power_mgr_set_mode); - - /* Creates an output layout, which a wlroots utility for working with an - * arrangement of screens in a physical layout. */ - output_layout = wlr_output_layout_create(dpy); -- wl_signal_add(&output_layout->events.change, &layout_change); -+ LISTEN_GLOBAL(&output_layout->events.change, layout_change); - - wlr_xdg_output_manager_v1_create(dpy, output_layout); - - /* Configure a listener to be notified when new outputs are available on the - * backend. */ - wl_list_init(&mons); -- wl_signal_add(&backend->events.new_output, &new_output); -+ LISTEN_GLOBAL(&backend->events.new_output, new_output); - - /* Set up our client lists, the xdg-shell and the layer-shell. The xdg-shell is a - * Wayland protocol which is used for application windows. For more -@@ -2551,19 +2690,19 @@ setup(void) - wl_list_init(&fstack); - - xdg_shell = wlr_xdg_shell_create(dpy, 6); -- wl_signal_add(&xdg_shell->events.new_toplevel, &new_xdg_toplevel); -- wl_signal_add(&xdg_shell->events.new_popup, &new_xdg_popup); -+ LISTEN_GLOBAL(&xdg_shell->events.new_toplevel, new_xdg_toplevel); -+ LISTEN_GLOBAL(&xdg_shell->events.new_popup, new_xdg_popup); - - layer_shell = wlr_layer_shell_v1_create(dpy, 3); -- wl_signal_add(&layer_shell->events.new_surface, &new_layer_surface); -+ LISTEN_GLOBAL(&layer_shell->events.new_surface, new_layer_surface); - - idle_notifier = wlr_idle_notifier_v1_create(dpy); - - idle_inhibit_mgr = wlr_idle_inhibit_v1_create(dpy); -- wl_signal_add(&idle_inhibit_mgr->events.new_inhibitor, &new_idle_inhibitor); -+ LISTEN_GLOBAL(&idle_inhibit_mgr->events.new_inhibitor, new_idle_inhibitor); - - session_lock_mgr = wlr_session_lock_manager_v1_create(dpy); -- wl_signal_add(&session_lock_mgr->events.new_lock, &new_session_lock); -+ LISTEN_GLOBAL(&session_lock_mgr->events.new_lock, new_session_lock); - locked_bg = wlr_scene_rect_create(layers[LyrBlock], sgeom.width, sgeom.height, - (float [4]){0.1f, 0.1f, 0.1f, 1.0f}); - wlr_scene_node_set_enabled(&locked_bg->node, 0); -@@ -2573,10 +2712,10 @@ setup(void) - wlr_server_decoration_manager_create(dpy), - WLR_SERVER_DECORATION_MANAGER_MODE_SERVER); - xdg_decoration_mgr = wlr_xdg_decoration_manager_v1_create(dpy); -- wl_signal_add(&xdg_decoration_mgr->events.new_toplevel_decoration, &new_xdg_decoration); -+ LISTEN_GLOBAL(&xdg_decoration_mgr->events.new_toplevel_decoration, new_xdg_decoration); - - pointer_constraints = wlr_pointer_constraints_v1_create(dpy); -- wl_signal_add(&pointer_constraints->events.new_constraint, &new_pointer_constraint); -+ LISTEN_GLOBAL(&pointer_constraints->events.new_constraint, new_pointer_constraint); - - relative_pointer_mgr = wlr_relative_pointer_manager_v1_create(dpy); - -@@ -2604,14 +2743,14 @@ setup(void) - * - * And more comments are sprinkled throughout the notify functions above. - */ -- wl_signal_add(&cursor->events.motion, &cursor_motion); -- wl_signal_add(&cursor->events.motion_absolute, &cursor_motion_absolute); -- wl_signal_add(&cursor->events.button, &cursor_button); -- wl_signal_add(&cursor->events.axis, &cursor_axis); -- wl_signal_add(&cursor->events.frame, &cursor_frame); -+ LISTEN_GLOBAL(&cursor->events.motion, cursor_motion); -+ LISTEN_GLOBAL(&cursor->events.motion_absolute, cursor_motion_absolute); -+ LISTEN_GLOBAL(&cursor->events.button, cursor_button); -+ LISTEN_GLOBAL(&cursor->events.axis, cursor_axis); -+ LISTEN_GLOBAL(&cursor->events.frame, cursor_frame); - - cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1); -- wl_signal_add(&cursor_shape_mgr->events.request_set_shape, &request_set_cursor_shape); -+ LISTEN_GLOBAL(&cursor_shape_mgr->events.request_set_shape, request_set_cursor_shape); - - /* - * Configures a seat, which is a single "seat" at which a user sits and -@@ -2619,27 +2758,27 @@ setup(void) - * pointer, touch, and drawing tablet device. We also rig up a listener to - * let us know when new input devices are available on the backend. - */ -- wl_signal_add(&backend->events.new_input, &new_input_device); -+ LISTEN_GLOBAL(&backend->events.new_input, new_input_device); - virtual_keyboard_mgr = wlr_virtual_keyboard_manager_v1_create(dpy); -- wl_signal_add(&virtual_keyboard_mgr->events.new_virtual_keyboard, -- &new_virtual_keyboard); -+ LISTEN_GLOBAL(&virtual_keyboard_mgr->events.new_virtual_keyboard, -+ new_virtual_keyboard); - virtual_pointer_mgr = wlr_virtual_pointer_manager_v1_create(dpy); -- wl_signal_add(&virtual_pointer_mgr->events.new_virtual_pointer, -- &new_virtual_pointer); -+ LISTEN_GLOBAL(&virtual_pointer_mgr->events.new_virtual_pointer, -+ new_virtual_pointer); - - seat = wlr_seat_create(dpy, "seat0"); -- wl_signal_add(&seat->events.request_set_cursor, &request_cursor); -- wl_signal_add(&seat->events.request_set_selection, &request_set_sel); -- wl_signal_add(&seat->events.request_set_primary_selection, &request_set_psel); -- wl_signal_add(&seat->events.request_start_drag, &request_start_drag); -- wl_signal_add(&seat->events.start_drag, &start_drag); -+ LISTEN_GLOBAL(&seat->events.request_set_cursor, request_cursor); -+ LISTEN_GLOBAL(&seat->events.request_set_selection, request_set_sel); -+ LISTEN_GLOBAL(&seat->events.request_set_primary_selection, request_set_psel); -+ LISTEN_GLOBAL(&seat->events.request_start_drag, request_start_drag); -+ LISTEN_GLOBAL(&seat->events.start_drag, start_drag); - -- kb_group = createkeyboardgroup(); -+ kb_group = TSYM(KeyboardGroup *(*)(void), createkeyboardgroup)(); - wl_list_init(&kb_group->destroy.link); - - output_mgr = wlr_output_manager_v1_create(dpy); -- wl_signal_add(&output_mgr->events.apply, &output_mgr_apply); -- wl_signal_add(&output_mgr->events.test, &output_mgr_test); -+ LISTEN_GLOBAL(&output_mgr->events.apply, output_mgr_apply); -+ LISTEN_GLOBAL(&output_mgr->events.test, output_mgr_test); - - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the -@@ -2651,8 +2790,8 @@ setup(void) - * It will be started when the first X client is started. - */ - if ((xwayland = wlr_xwayland_create(dpy, compositor, 1))) { -- wl_signal_add(&xwayland->events.ready, &xwayland_ready); -- wl_signal_add(&xwayland->events.new_surface, &new_xwayland_surface); -+ LISTEN_GLOBAL(&xwayland->events.ready, xwayland_ready); -+ LISTEN_GLOBAL(&xwayland->events.new_surface, new_xwayland_surface); - - setenv("DISPLAY", xwayland->display_name, 1); - } else { -@@ -2661,6 +2800,9 @@ setup(void) - #endif - } - -+#endif -+#ifdef HOT -+ - void - spawn(const Arg *arg) - { -@@ -3142,8 +3284,8 @@ void - dissociatex11(struct wl_listener *listener, void *data) - { - Client *c = wl_container_of(listener, c, dissociate); -- wl_list_remove(&c->map.link); -- wl_list_remove(&c->unmap.link); -+ UNLISTEN(&c->map); -+ UNLISTEN(&c->unmap); - } - - void -@@ -3178,17 +3320,141 @@ xwaylandready(struct wl_listener *listener, void *data) - } - #endif - -+#else /* HOT */ -+void* -+load(void) -+{ -+ const char* path = get_module_path(); -+ char load[PATH_MAX] = "/tmp/dwl.soXXXXXX"; -+ void* new; -+ -+ if (!path) { -+ fprintf(stderr, "cannot find dwl.so\n"); -+ } -+ -+ do { -+ mktemp(load); -+ errno = 0; -+ symlink(path, load); -+ } while(errno == EEXIST); -+ -+ new = dlopen(load, RTLD_NOW|RTLD_LOCAL); -+ -+ unlink(load); -+ if (new == NULL) -+ fprintf(stderr, "error while loading %s: %s\n", path, dlerror()); -+ else -+ printf("loaded: %s\n", path); -+ -+ return new; -+} -+ -+const char * -+get_module_path(void) { -+ char home[PATH_MAX]; -+ strcpy(home, getenv("HOME")); -+ strcat(home, "/.local/lib"); -+ const char* abspaths[] = {".", home, "/usr/share/lib", "/usr/local/lib", "/usr/local/share/lib"}; -+ const char* relpaths[] = {"", "/../lib"}; -+ char paths[LENGTH(abspaths) + LENGTH(relpaths)][PATH_MAX]; -+ static char out[PATH_MAX] = "./"; -+ -+ for (size_t i = 0; i < LENGTH(abspaths); i++) -+ realpath(abspaths[i], paths[i]); -+ -+ for (size_t i = 0; i < LENGTH(relpaths); i++) -+ { -+ char tmp[PATH_MAX]; -+ strcpy(tmp, runpath); -+ strcat(tmp, relpaths[i]); -+ realpath(tmp, paths[LENGTH(abspaths) + i]); -+ } -+ -+ -+ -+ for (size_t i = 0; i < LENGTH(paths); i++) -+ { -+ char tmp[PATH_MAX]; -+ printf("checking path: %s\n", paths[i]); -+ strcpy(tmp, paths[i]); -+ strcat(tmp, "/dwl.so"); -+ if (access(tmp, F_OK|R_OK) == 0) -+ { -+ strcpy(out, tmp); -+ return out; -+ } -+ } -+ -+ return NULL; -+} -+ -+void -+reload(const Arg* arg) -+{ -+ char* error; -+ void* new; -+ size_t i = 0; -+ -+ // deinitialize previous module -+ if (last_module) { -+ // dlclose(last_module); -+ last_module = NULL; -+ } -+ -+ wlr_log(WLR_INFO, "reloading"); -+ -+ new = load(); -+ -+ if (new == NULL) -+ { -+ wlr_log(WLR_ERROR, "couldn't load new dwl module from %s", get_module_path()); -+ -+ if (fork() == 0) -+ execl("/bin/env", "--", "notify-send", "-u", "low", "failed to reload dwl", NULL); -+ return; -+ } -+ -+ wlr_log(WLR_DEBUG, "---------- listens ---------"); -+ for(listens* a = listeners; a != NULL; a = a->next) -+ { -+ Dl_info info; -+ void* old = a->listen->notify; -+ dladdr(a->listen->notify, &info); -+ a->listen->notify = dlsym(new, info.dli_sname); -+ if ((error = dlerror()) != NULL){ -+ fprintf(stderr, "reload failure: %s", error); -+ a->listen->notify = old; -+ return; -+ } -+ wlr_log(WLR_DEBUG, "replaced listener: %s", info.dli_sname); -+ i++; -+ } -+ -+ wlr_log(WLR_DEBUG, "---------- done! ---------"); -+ wlr_log(WLR_DEBUG, "replaced %zu listeners", i); -+ -+ last_module = dwl_module; -+ dwl_module = new; -+ -+ if (fork() == 0) -+ execl("/bin/env", "--", "notify-send", "-u", "low", "reloaded dwl", NULL); -+ -+} -+ - int - main(int argc, char *argv[]) - { - char *startup_cmd = NULL; - int c; - -+ runpath = dirname(argv[0]); -+ dwl_module = load(); -+ - while ((c = getopt(argc, argv, "s:hdv")) != -1) { - if (c == 's') - startup_cmd = optarg; - else if (c == 'd') -- log_level = WLR_DEBUG; -+ CSYM(enum wlr_log_importance, log_level) = WLR_DEBUG; - else if (c == 'v') - die("dwl " VERSION); - else -@@ -3208,3 +3474,5 @@ main(int argc, char *argv[]) - usage: - die("Usage: %s [-v] [-d] [-s startup command]", argv[0]); - } -+ -+#endif -diff --git a/util.c b/util.c -index b925987..8fb9b77 100644 ---- a/util.c -+++ b/util.c -@@ -49,3 +49,37 @@ fd_set_nonblock(int fd) { - - return 0; - } -+ -+struct listens* -+append_listener(struct wl_listener* new, struct listens* list) -+{ -+ struct listens* l = malloc(sizeof(struct listens)); -+ l->listen = new; -+ l->next = list; -+ return l; -+} -+ -+struct listens* -+remove_listener(struct wl_listener* l, struct listens* ls) -+{ -+ struct listens* out = ls; -+ struct listens* f = NULL; -+ for(struct listens* last = NULL; ls != NULL; ls = ls->next) -+ { -+ if (ls->listen == l) -+ { -+ if (last != NULL) -+ last->next = ls->next; -+ else -+ out = ls->next; -+ -+ f = ls; -+ } -+ else -+ last = ls; -+ } -+ -+ free(f); -+ -+ return out; -+} -diff --git a/util.h b/util.h -index 226980d..11aab34 100644 ---- a/util.h -+++ b/util.h -@@ -1,5 +1,11 @@ - /* See LICENSE.dwm file for copyright and license details. */ -+typedef struct listens { -+ struct wl_listener* listen; -+ struct listens* next; -+} listens; - - void die(const char *fmt, ...); - void *ecalloc(size_t nmemb, size_t size); - int fd_set_nonblock(int fd); -+struct listens* append_listener(struct wl_listener* l, struct listens* ls); -+struct listens* remove_listener(struct wl_listener* l, struct listens* ls); --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/inputdevicerules/README.md b/dwl-bak/dwl-patches/patches/inputdevicerules/README.md deleted file mode 100644 index 3f87ef9..0000000 --- a/dwl-bak/dwl-patches/patches/inputdevicerules/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Description - -Input device rules implemented using custom device create functions for -keyboards and pointing devices. - -Examples provided: - -- ignore unwanted input devices -- configure a toggle input device -- exclude certain keyboards (eg ydotool) from keyboard group - -### Download -- [git branch](https://codeberg.org/bencc/dwl/src/branch/inputdevicerules) -- [v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/inputdevicerules/inputdevicerules-v0.7.patch) -- [v0.6](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/inputdevicerules/inputdevicerules-v0.6.patch) - -### Authors -- [Ben Collerson](https://codeberg.org/bencc) diff --git a/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.6.patch b/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.6.patch deleted file mode 100644 index b9e9fd2..0000000 --- a/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.6.patch +++ /dev/null @@ -1,173 +0,0 @@ -From 620a68ffbcecf996916a8fd637f0bcff7a72e004 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Sat, 15 Jun 2024 12:34:01 +1000 -Subject: [PATCH] input device rules - -* customise input device handling -* ignore unwanted input devices -* configure a toggle for an input device ---- - config.def.h | 13 ++++++++++ - dwl.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-- - 2 files changed, 79 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index a784eb4f..88006d79 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -57,6 +57,18 @@ static const struct xkb_rule_names xkb_rules = { - .options = NULL, - }; - -+/* input devices */ -+static const InputRule inputrules[] = { -+ /* name kbcreate ptrcreate */ -+ /* ignore bad device - like a touchpad ;) */ -+ { "BAD DEVICE", NULL, NULL }, -+ /* ungroup ydotool device - fixes a bug */ -+ { "ydotoold virtual device", createungroupedkeyboard, createpointer }, -+ /* put your touchpad name here to enable toggle touchpad */ -+ { "Elan Touchpad", createkeyboard, createtogglepointer }, -+ { NULL, createkeyboard, createpointer }, -+}; -+ - static const int repeat_rate = 25; - static const int repeat_delay = 600; - -@@ -139,6 +151,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_u, togglepointer, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index 3dba2bf5..a11c7587 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -141,6 +141,12 @@ typedef struct { - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -+typedef struct { -+ const char *name; -+ void (*kbcreate)(struct wlr_keyboard *); -+ void (*ptrcreate)(struct wlr_pointer *); -+} InputRule; -+ - typedef struct { - uint32_t mod; - xkb_keysym_t keysym; -@@ -266,6 +272,8 @@ static void createmon(struct wl_listener *listener, void *data); - static void createnotify(struct wl_listener *listener, void *data); - static void createpointer(struct wlr_pointer *pointer); - static void createpointerconstraint(struct wl_listener *listener, void *data); -+static void createtogglepointer(struct wlr_pointer *pointer); -+static void createungroupedkeyboard(struct wlr_keyboard *keyboard); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -@@ -335,6 +343,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglepointer(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -406,6 +415,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static struct libinput_device *togglepointerdevice = NULL; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -1092,6 +1103,33 @@ createpointerconstraint(struct wl_listener *listener, void *data) - &pointer_constraint->destroy, destroypointerconstraint); - } - -+void -+createtogglepointer(struct wlr_pointer *pointer) -+{ -+ struct libinput_device *device; -+ -+ createpointer(pointer); -+ -+ if (wlr_input_device_is_libinput(&pointer->base) -+ && (device = wlr_libinput_get_device_handle(&pointer->base))) { -+ togglepointerdevice = device; -+ } -+} -+ -+void -+createungroupedkeyboard(struct wlr_keyboard *keyboard) -+{ -+ /* for keyboards that need their own keyboard group */ -+ KeyboardGroup *group = createkeyboardgroup(); -+ -+ /* Set the keymap to match the group keymap */ -+ wlr_keyboard_set_keymap(keyboard, group->wlr_group->keyboard.keymap); -+ LISTEN(&keyboard->base.events.destroy, &group->destroy, destroykeyboardgroup); -+ -+ /* Add the new keyboard to the group */ -+ wlr_keyboard_group_add_keyboard(group->wlr_group, keyboard); -+} -+ - void - cursorconstrain(struct wlr_pointer_constraint_v1 *constraint) - { -@@ -1467,13 +1505,27 @@ inputdevice(struct wl_listener *listener, void *data) - * available. */ - struct wlr_input_device *device = data; - uint32_t caps; -+ const InputRule *r; - - switch (device->type) { - case WLR_INPUT_DEVICE_KEYBOARD: -- createkeyboard(wlr_keyboard_from_input_device(device)); -+ for (r = inputrules; r < END(inputrules); r++) { -+ if (!r->name || strstr(device->name, r->name)) { -+ if (r->kbcreate) -+ r->kbcreate(wlr_keyboard_from_input_device(device)); -+ break; -+ } -+ } -+ - break; - case WLR_INPUT_DEVICE_POINTER: -- createpointer(wlr_pointer_from_input_device(device)); -+ for (r = inputrules; r < END(inputrules); r++) { -+ if (!r->name || strstr(device->name, r->name)) { -+ if (r->ptrcreate) -+ r->ptrcreate(wlr_pointer_from_input_device(device)); -+ break; -+ } -+ } - break; - default: - /* TODO handle other input device types */ -@@ -2647,6 +2699,18 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglepointer(const Arg *arg) -+{ -+ if (!togglepointerdevice) -+ return; -+ -+ libinput_device_config_send_events_set_mode( -+ togglepointerdevice, -+ libinput_device_config_send_events_get_mode(togglepointerdevice) ^ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED -+ ); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.7.patch b/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.7.patch deleted file mode 100644 index 18f6f9e..0000000 --- a/dwl-bak/dwl-patches/patches/inputdevicerules/inputdevicerules-v0.7.patch +++ /dev/null @@ -1,173 +0,0 @@ -From 89f870a04f903681b0a7a0ac4eb1ae70c4984b46 Mon Sep 17 00:00:00 2001 -From: Ben Collerson -Date: Sat, 15 Jun 2024 12:34:01 +1000 -Subject: [PATCH] input device rules - -* customise input device handling -* ignore unwanted input devices -* configure a toggle for an input device ---- - config.def.h | 13 ++++++++++ - dwl.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-- - 2 files changed, 79 insertions(+), 2 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171d..0b287ab5 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -60,6 +60,18 @@ static const struct xkb_rule_names xkb_rules = { - .options = NULL, - }; - -+/* input devices */ -+static const InputRule inputrules[] = { -+ /* name kbcreate ptrcreate */ -+ /* ignore bad device - like a touchpad ;) */ -+ { "BAD DEVICE", NULL, NULL }, -+ /* ungroup ydotool device - fixes a bug */ -+ { "ydotoold virtual device", createungroupedkeyboard, createpointer }, -+ /* put your touchpad name here to enable toggle touchpad */ -+ { "Elan Touchpad", createkeyboard, createtogglepointer }, -+ { NULL, createkeyboard, createpointer }, -+}; -+ - static const int repeat_rate = 25; - static const int repeat_delay = 600; - -@@ -142,6 +154,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -+ { MODKEY, XKB_KEY_u, togglepointer, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, - { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -diff --git a/dwl.c b/dwl.c -index a2711f67..f6f91938 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -143,6 +143,12 @@ typedef struct { - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -+typedef struct { -+ const char *name; -+ void (*kbcreate)(struct wlr_keyboard *); -+ void (*ptrcreate)(struct wlr_pointer *); -+} InputRule; -+ - typedef struct { - uint32_t mod; - xkb_keysym_t keysym; -@@ -270,6 +276,8 @@ static void createnotify(struct wl_listener *listener, void *data); - static void createpointer(struct wlr_pointer *pointer); - static void createpointerconstraint(struct wl_listener *listener, void *data); - static void createpopup(struct wl_listener *listener, void *data); -+static void createtogglepointer(struct wlr_pointer *pointer); -+static void createungroupedkeyboard(struct wlr_keyboard *keyboard); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); -@@ -340,6 +348,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); -+static void togglepointer(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unlocksession(struct wl_listener *listener, void *data); -@@ -413,6 +422,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static struct libinput_device *togglepointerdevice = NULL; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -1133,6 +1144,33 @@ createpopup(struct wl_listener *listener, void *data) - LISTEN_STATIC(&popup->base->surface->events.commit, commitpopup); - } - -+void -+createtogglepointer(struct wlr_pointer *pointer) -+{ -+ struct libinput_device *device; -+ -+ createpointer(pointer); -+ -+ if (wlr_input_device_is_libinput(&pointer->base) -+ && (device = wlr_libinput_get_device_handle(&pointer->base))) { -+ togglepointerdevice = device; -+ } -+} -+ -+void -+createungroupedkeyboard(struct wlr_keyboard *keyboard) -+{ -+ /* for keyboards that need their own keyboard group */ -+ KeyboardGroup *group = createkeyboardgroup(); -+ -+ /* Set the keymap to match the group keymap */ -+ wlr_keyboard_set_keymap(keyboard, group->wlr_group->keyboard.keymap); -+ LISTEN(&keyboard->base.events.destroy, &group->destroy, destroykeyboardgroup); -+ -+ /* Add the new keyboard to the group */ -+ wlr_keyboard_group_add_keyboard(group->wlr_group, keyboard); -+} -+ - void - cursorconstrain(struct wlr_pointer_constraint_v1 *constraint) - { -@@ -1531,13 +1569,27 @@ inputdevice(struct wl_listener *listener, void *data) - * available. */ - struct wlr_input_device *device = data; - uint32_t caps; -+ const InputRule *r; - - switch (device->type) { - case WLR_INPUT_DEVICE_KEYBOARD: -- createkeyboard(wlr_keyboard_from_input_device(device)); -+ for (r = inputrules; r < END(inputrules); r++) { -+ if (!r->name || strstr(device->name, r->name)) { -+ if (r->kbcreate) -+ r->kbcreate(wlr_keyboard_from_input_device(device)); -+ break; -+ } -+ } -+ - break; - case WLR_INPUT_DEVICE_POINTER: -- createpointer(wlr_pointer_from_input_device(device)); -+ for (r = inputrules; r < END(inputrules); r++) { -+ if (!r->name || strstr(device->name, r->name)) { -+ if (r->ptrcreate) -+ r->ptrcreate(wlr_pointer_from_input_device(device)); -+ break; -+ } -+ } - break; - default: - /* TODO handle other input device types */ -@@ -2739,6 +2791,18 @@ togglefullscreen(const Arg *arg) - setfullscreen(sel, !sel->isfullscreen); - } - -+void -+togglepointer(const Arg *arg) -+{ -+ if (!togglepointerdevice) -+ return; -+ -+ libinput_device_config_send_events_set_mode( -+ togglepointerdevice, -+ libinput_device_config_send_events_get_mode(togglepointerdevice) ^ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED -+ ); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/ipc/README.md b/dwl-bak/dwl-patches/patches/ipc/README.md deleted file mode 100644 index bf648a4..0000000 --- a/dwl-bak/dwl-patches/patches/ipc/README.md +++ /dev/null @@ -1,28 +0,0 @@ -### Description -Largely based on [raphi](https://sr.ht/~raphi/)'s [somebar](https://sr.ht/~raphi/somebar/), this patch provides an ipc for wayland clients to get and set dwl state. The ipc is intended for status bars, but can also be scripted with tools like [dwlmsg](https://codeberg.org/notchoc/dwlmsg). - -Status information to stdout is currently disabled as dwl tends to freeze. For now, `dwlmsg -w` should act as a drop-in replacement. - -Note to [pertag](../pertag/) users: apply [this](./ipcpertag.patch) for ipc tagsetting to work as expected - -### Download -- [git branch](https://codeberg.org/notchoc/dwl/src/branch/ipc) -- [2024-08-16](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/ipc/ipc.patch) -- [2024-07-29](https://codeberg.org/dwl/dwl-patches/raw/commit/d235f0f88ed069eca234da5a544fb1c6e19f1d33/patches/ipc/ipc.patch) don't focus other outputs (apply [this minipatch](./focus-tagset-output.patch) if you'd prefer that) -- [2024-07-16](https://codeberg.org/dwl/dwl-patches/raw/commit/642b2559d522034785c1c1203c6d426855ec19ca/patches/ipc/ipc.patch) -- [2024-06-30](https://codeberg.org/dwl/dwl-patches/raw/commit/9a751e5020133d3ab9219e68a43109c6f3c931a7/patches/ipc/ipc.patch) -- [2024-06-21](https://codeberg.org/dwl/dwl-patches/raw/commit/f96ee44cbaef06bd38b8fa29ac7ecba8b1b5abd5/patches/ipc/ipc.patch) -- [2024-06-19](https://codeberg.org/dwl/dwl-patches/raw/commit/e69afc7263b8d982a7923e5d4910f2e1f7140bb8/patches/ipc/ipc.patch) -- [2024-06-08](https://codeberg.org/dwl/dwl-patches/raw/commit/f8598a91b44acc3bd7e9041be97265bbce8fa219/patches/ipc/ipc.patch) -- [2024-03-13](https://codeberg.org/dwl/dwl-patches/raw/commit/0150cfebbcd85f2d6e6728afad345a11a0c45947/ipc/ipc.patch) -- [2024-02-20](https://codeberg.org/dwl/dwl-patches/raw/commit/0c5ae06e4bc1d7f641376e8fcb86b43bd48ce2ee/ipc/ipc.patch) -- [2023-10-28](https://gist.githubusercontent.com/fbushstone/b116c44340eb7a7878de1119dd931ca5/raw/ee66ac9e2a5dddd9b528df553e21080c2811e974/ipc-v2-fixed.patch) Updated version of 2023-04-29, prevents ipc from freezing the compositor in printstatus. -- [2023-04-29](https://github.com/djpohly/dwl/compare/main...madcowog:ipc-v2.patch) Use this for dwl-ipc-unstable-v2. If you are using commit [9d68554](https://github.com/djpohly/dwl/commit/9d68554c59a886b641d27a364884fb461af2d4f1) or later, use this. For status bars this protocol is supported by dwlb, Waybar and dwl-bar. -- [2023-04-29](https://github.com/djpohly/dwl/compare/main...madcowog:ipc-bbdf2.patch) Use this for dwl-ipc-unstable-v1. If you are using commit [bbdaf2a9](https://github.com/djpohly/dwl/commit/bbdf2a913b72e7a308ee0dfde6518a4285d4a775), [release 0.4](https://github.com/djpohly/dwl/releases/tag/v0.4) or earlier, use this. For status bars, this protocol is supported by dwl-bar. -- [2023-02-20](https://lists.sr.ht/~raphi/public-inbox/patches/39166) Use this for net-tapesoftware-dwl-wm-unstable-v1. If you are using commit [c69a2bec](https://github.com/djpohly/dwl/commit/c69a2bec3ff417fbc4ea8fec0a49096773e01e7d) or later, use this. For status bars this protocol is supported by somebar. - -### Authors -- [MadcowOG](https://github.com/MadcowOG) -- [fbushstone](https://github.com/fbushstone) -- [notchoc](https://codeberg.org/notchoc) -- [snuk](https://codeberg.org/snuk) diff --git a/dwl-bak/dwl-patches/patches/ipc/focus-tagset-output.patch b/dwl-bak/dwl-patches/patches/ipc/focus-tagset-output.patch deleted file mode 100644 index 2ea3015..0000000 --- a/dwl-bak/dwl-patches/patches/ipc/focus-tagset-output.patch +++ /dev/null @@ -1,24 +0,0 @@ -From b65477621f0438b0ed6c405f74c9d15e8fb57e96 Mon Sep 17 00:00:00 2001 -From: choc -Date: Mon, 29 Jul 2024 21:26:06 +0800 -Subject: [PATCH] ipc: focus set_tag'd output - ---- - dwl.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/dwl.c b/dwl.c -index 4a025f0..dcbb063 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1533,6 +1533,7 @@ dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, - if (!ipc_output) - return; - monitor = ipc_output->mon; -+ selmon = monitor; - - if (!newtags || newtags == monitor->tagset[monitor->seltags]) - return; --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/ipc/ipc.patch b/dwl-bak/dwl-patches/patches/ipc/ipc.patch deleted file mode 100644 index 9f989e7..0000000 --- a/dwl-bak/dwl-patches/patches/ipc/ipc.patch +++ /dev/null @@ -1,597 +0,0 @@ -From 6c6d655b68770ce82a24fde9b58c4d97b672553a Mon Sep 17 00:00:00 2001 -From: choc -Date: Mon, 23 Oct 2023 10:35:17 +0800 -Subject: [PATCH] implement dwl-ipc-unstable-v2 - https://codeberg.org/dwl/dwl-patches/wiki/ipc - ---- - Makefile | 14 +- - config.def.h | 1 + - dwl.c | 257 ++++++++++++++++++++++++++---- - protocols/dwl-ipc-unstable-v2.xml | 181 +++++++++++++++++++++ - 4 files changed, 419 insertions(+), 34 deletions(-) - create mode 100644 protocols/dwl-ipc-unstable-v2.xml - -diff --git a/Makefile b/Makefile -index 8db7409..a79a080 100644 ---- a/Makefile -+++ b/Makefile -@@ -17,12 +17,14 @@ DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(WLR_INCS) $(DWLCPPFLAGS) $(DWLDEV - LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(WLR_LIBS) -lm $(LIBS) - - all: dwl --dwl: dwl.o util.o -- $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ -+dwl: dwl.o util.o dwl-ipc-unstable-v2-protocol.o -+ $(CC) dwl.o util.o dwl-ipc-unstable-v2-protocol.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ - dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ - pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ -- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h -+ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h \ -+ dwl-ipc-unstable-v2-protocol.h - util.o: util.c util.h -+dwl-ipc-unstable-v2-protocol.o: dwl-ipc-unstable-v2-protocol.c dwl-ipc-unstable-v2-protocol.h - - # wayland-scanner is a tool which generates C headers and rigging for Wayland - # protocols, which are specified in XML. wlroots requires you to rig these up -@@ -45,6 +47,12 @@ wlr-output-power-management-unstable-v1-protocol.h: - xdg-shell-protocol.h: - $(WAYLAND_SCANNER) server-header \ - $(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@ -+dwl-ipc-unstable-v2-protocol.h: -+ $(WAYLAND_SCANNER) server-header \ -+ protocols/dwl-ipc-unstable-v2.xml $@ -+dwl-ipc-unstable-v2-protocol.c: -+ $(WAYLAND_SCANNER) private-code \ -+ protocols/dwl-ipc-unstable-v2.xml $@ - - config.h: - cp config.def.h $@ -diff --git a/config.def.h b/config.def.h -index 22d2171..1593033 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -127,6 +127,7 @@ static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -+ { MODKEY, XKB_KEY_b, togglebar, {0} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -diff --git a/dwl.c b/dwl.c -index 8a587d1..7a4949b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -68,6 +68,7 @@ - #include - #endif - -+#include "dwl-ipc-unstable-v2-protocol.h" - #include "util.h" - - /* macros */ -@@ -144,6 +145,12 @@ typedef struct { - uint32_t resize; /* configure serial of a pending resize */ - } Client; - -+typedef struct { -+ struct wl_list link; -+ struct wl_resource *resource; -+ Monitor *mon; -+} DwlIpcOutput; -+ - typedef struct { - uint32_t mod; - xkb_keysym_t keysym; -@@ -189,6 +196,7 @@ typedef struct { - - struct Monitor { - struct wl_list link; -+ struct wl_list dwl_ipc_outputs; - struct wlr_output *wlr_output; - struct wlr_scene_output *scene_output; - struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */ -@@ -286,6 +294,17 @@ static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); -+static void dwl_ipc_manager_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id); -+static void dwl_ipc_manager_destroy(struct wl_resource *resource); -+static void dwl_ipc_manager_get_output(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *output); -+static void dwl_ipc_manager_release(struct wl_client *client, struct wl_resource *resource); -+static void dwl_ipc_output_destroy(struct wl_resource *resource); -+static void dwl_ipc_output_printstatus(Monitor *monitor); -+static void dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output); -+static void dwl_ipc_output_set_client_tags(struct wl_client *client, struct wl_resource *resource, uint32_t and_tags, uint32_t xor_tags); -+static void dwl_ipc_output_set_layout(struct wl_client *client, struct wl_resource *resource, uint32_t index); -+static void dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, uint32_t tagmask, uint32_t toggle_tagset); -+static void dwl_ipc_output_release(struct wl_client *client, struct wl_resource *resource); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -@@ -338,6 +357,7 @@ static void startdrag(struct wl_listener *listener, void *data); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *m); -+static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); - static void togglefullscreen(const Arg *arg); - static void toggletag(const Arg *arg); -@@ -411,6 +431,9 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static struct zdwl_ipc_manager_v2_interface dwl_manager_implementation = {.release = dwl_ipc_manager_release, .get_output = dwl_ipc_manager_get_output}; -+static struct zdwl_ipc_output_v2_interface dwl_output_implementation = {.release = dwl_ipc_output_release, .set_tags = dwl_ipc_output_set_tags, .set_layout = dwl_ipc_output_set_layout, .set_client_tags = dwl_ipc_output_set_client_tags}; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -703,6 +726,10 @@ cleanupmon(struct wl_listener *listener, void *data) - LayerSurface *l, *tmp; - size_t i; - -+ DwlIpcOutput *ipc_output, *ipc_output_tmp; -+ wl_list_for_each_safe(ipc_output, ipc_output_tmp, &m->dwl_ipc_outputs, link) -+ wl_resource_destroy(ipc_output->resource); -+ - /* m->layers[i] are intentionally not unlinked */ - for (i = 0; i < LENGTH(m->layers); i++) { - wl_list_for_each_safe(l, tmp, &m->layers[i], link) -@@ -983,6 +1010,8 @@ createmon(struct wl_listener *listener, void *data) - m = wlr_output->data = ecalloc(1, sizeof(*m)); - m->wlr_output = wlr_output; - -+ wl_list_init(&m->dwl_ipc_outputs); -+ - for (i = 0; i < LENGTH(m->layers); i++) - wl_list_init(&m->layers[i]); - -@@ -1334,6 +1363,192 @@ dirtomon(enum wlr_direction dir) - return selmon; - } - -+void -+dwl_ipc_manager_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id) -+{ -+ struct wl_resource *manager_resource = wl_resource_create(client, &zdwl_ipc_manager_v2_interface, version, id); -+ if (!manager_resource) { -+ wl_client_post_no_memory(client); -+ return; -+ } -+ wl_resource_set_implementation(manager_resource, &dwl_manager_implementation, NULL, dwl_ipc_manager_destroy); -+ -+ zdwl_ipc_manager_v2_send_tags(manager_resource, TAGCOUNT); -+ -+ for (unsigned int i = 0; i < LENGTH(layouts); i++) -+ zdwl_ipc_manager_v2_send_layout(manager_resource, layouts[i].symbol); -+} -+ -+void -+dwl_ipc_manager_destroy(struct wl_resource *resource) -+{ -+ /* No state to destroy */ -+} -+ -+void -+dwl_ipc_manager_get_output(struct wl_client *client, struct wl_resource *resource, uint32_t id, struct wl_resource *output) -+{ -+ DwlIpcOutput *ipc_output; -+ Monitor *monitor = wlr_output_from_resource(output)->data; -+ struct wl_resource *output_resource = wl_resource_create(client, &zdwl_ipc_output_v2_interface, wl_resource_get_version(resource), id); -+ if (!output_resource) -+ return; -+ -+ ipc_output = ecalloc(1, sizeof(*ipc_output)); -+ ipc_output->resource = output_resource; -+ ipc_output->mon = monitor; -+ wl_resource_set_implementation(output_resource, &dwl_output_implementation, ipc_output, dwl_ipc_output_destroy); -+ wl_list_insert(&monitor->dwl_ipc_outputs, &ipc_output->link); -+ dwl_ipc_output_printstatus_to(ipc_output); -+} -+ -+void -+dwl_ipc_manager_release(struct wl_client *client, struct wl_resource *resource) -+{ -+ wl_resource_destroy(resource); -+} -+ -+static void -+dwl_ipc_output_destroy(struct wl_resource *resource) -+{ -+ DwlIpcOutput *ipc_output = wl_resource_get_user_data(resource); -+ wl_list_remove(&ipc_output->link); -+ free(ipc_output); -+} -+ -+void -+dwl_ipc_output_printstatus(Monitor *monitor) -+{ -+ DwlIpcOutput *ipc_output; -+ wl_list_for_each(ipc_output, &monitor->dwl_ipc_outputs, link) -+ dwl_ipc_output_printstatus_to(ipc_output); -+} -+ -+void -+dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output) -+{ -+ Monitor *monitor = ipc_output->mon; -+ Client *c, *focused; -+ int tagmask, state, numclients, focused_client, tag; -+ const char *title, *appid; -+ focused = focustop(monitor); -+ zdwl_ipc_output_v2_send_active(ipc_output->resource, monitor == selmon); -+ -+ for (tag = 0 ; tag < TAGCOUNT; tag++) { -+ numclients = state = focused_client = 0; -+ tagmask = 1 << tag; -+ if ((tagmask & monitor->tagset[monitor->seltags]) != 0) -+ state |= ZDWL_IPC_OUTPUT_V2_TAG_STATE_ACTIVE; -+ -+ wl_list_for_each(c, &clients, link) { -+ if (c->mon != monitor) -+ continue; -+ if (!(c->tags & tagmask)) -+ continue; -+ if (c == focused) -+ focused_client = 1; -+ if (c->isurgent) -+ state |= ZDWL_IPC_OUTPUT_V2_TAG_STATE_URGENT; -+ -+ numclients++; -+ } -+ zdwl_ipc_output_v2_send_tag(ipc_output->resource, tag, state, numclients, focused_client); -+ } -+ title = focused ? client_get_title(focused) : ""; -+ appid = focused ? client_get_appid(focused) : ""; -+ -+ zdwl_ipc_output_v2_send_layout(ipc_output->resource, monitor->lt[monitor->sellt] - layouts); -+ zdwl_ipc_output_v2_send_title(ipc_output->resource, title); -+ zdwl_ipc_output_v2_send_appid(ipc_output->resource, appid); -+ zdwl_ipc_output_v2_send_layout_symbol(ipc_output->resource, monitor->ltsymbol); -+ if (wl_resource_get_version(ipc_output->resource) >= ZDWL_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION) { -+ zdwl_ipc_output_v2_send_fullscreen(ipc_output->resource, focused ? focused->isfullscreen : 0); -+ } -+ if (wl_resource_get_version(ipc_output->resource) >= ZDWL_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION) { -+ zdwl_ipc_output_v2_send_floating(ipc_output->resource, focused ? focused->isfloating : 0); -+ } -+ zdwl_ipc_output_v2_send_frame(ipc_output->resource); -+} -+ -+void -+dwl_ipc_output_set_client_tags(struct wl_client *client, struct wl_resource *resource, uint32_t and_tags, uint32_t xor_tags) -+{ -+ DwlIpcOutput *ipc_output; -+ Monitor *monitor; -+ Client *selected_client; -+ unsigned int newtags = 0; -+ -+ ipc_output = wl_resource_get_user_data(resource); -+ if (!ipc_output) -+ return; -+ -+ monitor = ipc_output->mon; -+ selected_client = focustop(monitor); -+ if (!selected_client) -+ return; -+ -+ newtags = (selected_client->tags & and_tags) ^ xor_tags; -+ if (!newtags) -+ return; -+ -+ selected_client->tags = newtags; -+ if (selmon == monitor) -+ focusclient(focustop(monitor), 1); -+ arrange(selmon); -+ printstatus(); -+} -+ -+void -+dwl_ipc_output_set_layout(struct wl_client *client, struct wl_resource *resource, uint32_t index) -+{ -+ DwlIpcOutput *ipc_output; -+ Monitor *monitor; -+ -+ ipc_output = wl_resource_get_user_data(resource); -+ if (!ipc_output) -+ return; -+ -+ monitor = ipc_output->mon; -+ if (index >= LENGTH(layouts)) -+ return; -+ if (index != monitor->lt[monitor->sellt] - layouts) -+ monitor->sellt ^= 1; -+ -+ monitor->lt[monitor->sellt] = &layouts[index]; -+ arrange(monitor); -+ printstatus(); -+} -+ -+void -+dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, uint32_t tagmask, uint32_t toggle_tagset) -+{ -+ DwlIpcOutput *ipc_output; -+ Monitor *monitor; -+ unsigned int newtags = tagmask & TAGMASK; -+ -+ ipc_output = wl_resource_get_user_data(resource); -+ if (!ipc_output) -+ return; -+ monitor = ipc_output->mon; -+ -+ if (!newtags || newtags == monitor->tagset[monitor->seltags]) -+ return; -+ if (toggle_tagset) -+ monitor->seltags ^= 1; -+ -+ monitor->tagset[monitor->seltags] = newtags; -+ if (selmon == monitor) -+ focusclient(focustop(monitor), 1); -+ arrange(monitor); -+ printstatus(); -+} -+ -+void -+dwl_ipc_output_release(struct wl_client *client, struct wl_resource *resource) -+{ -+ wl_resource_destroy(resource); -+} -+ - void - focusclient(Client *c, int lift) - { -@@ -2033,38 +2248,9 @@ void - printstatus(void) - { - Monitor *m = NULL; -- Client *c; -- uint32_t occ, urg, sel; - -- wl_list_for_each(m, &mons, link) { -- occ = urg = 0; -- wl_list_for_each(c, &clients, link) { -- if (c->mon != m) -- continue; -- occ |= c->tags; -- if (c->isurgent) -- urg |= c->tags; -- } -- if ((c = focustop(m))) { -- printf("%s title %s\n", m->wlr_output->name, client_get_title(c)); -- printf("%s appid %s\n", m->wlr_output->name, client_get_appid(c)); -- printf("%s fullscreen %d\n", m->wlr_output->name, c->isfullscreen); -- printf("%s floating %d\n", m->wlr_output->name, c->isfloating); -- sel = c->tags; -- } else { -- printf("%s title \n", m->wlr_output->name); -- printf("%s appid \n", m->wlr_output->name); -- printf("%s fullscreen \n", m->wlr_output->name); -- printf("%s floating \n", m->wlr_output->name); -- sel = 0; -- } -- -- printf("%s selmon %u\n", m->wlr_output->name, m == selmon); -- printf("%s tags %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"\n", -- m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); -- printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol); -- } -- fflush(stdout); -+ wl_list_for_each(m, &mons, link) -+ dwl_ipc_output_printstatus(m); - } - - void -@@ -2584,6 +2770,8 @@ setup(void) - LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply); - LISTEN_STATIC(&output_mgr->events.test, outputmgrtest); - -+ wl_global_create(dpy, &zdwl_ipc_manager_v2_interface, 2, NULL, dwl_ipc_manager_bind); -+ - /* Make sure XWayland clients don't connect to the parent X server, - * e.g when running in the x11 backend or the wayland backend and the - * compositor has Xwayland support */ -@@ -2681,6 +2869,13 @@ tile(Monitor *m) - } - } - -+void -+togglebar(const Arg *arg) { -+ DwlIpcOutput *ipc_output; -+ wl_list_for_each(ipc_output, &selmon->dwl_ipc_outputs, link) -+ zdwl_ipc_output_v2_send_toggle_visibility(ipc_output->resource); -+} -+ - void - togglefloating(const Arg *arg) - { -diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml -new file mode 100644 -index 0000000..0a6e7e5 ---- /dev/null -+++ b/protocols/dwl-ipc-unstable-v2.xml -@@ -0,0 +1,181 @@ -+ -+ -+ -+ -+ This protocol allows clients to update and get updates from dwl. -+ -+ Warning! The protocol described in this file is experimental and -+ backward incompatible changes may be made. Backward compatible -+ changes may be added together with the corresponding interface -+ version bump. -+ Backward incompatible changes are done by bumping the version -+ number in the protocol and interface names and resetting the -+ interface version. Once the protocol is to be declared stable, -+ the 'z' prefix and the version number in the protocol and -+ interface names are removed and the interface version number is -+ reset. -+ -+ -+ -+ -+ This interface is exposed as a global in wl_registry. -+ -+ Clients can use this interface to get a dwl_ipc_output. -+ After binding the client will recieve the dwl_ipc_manager.tags and dwl_ipc_manager.layout events. -+ The dwl_ipc_manager.tags and dwl_ipc_manager.layout events expose tags and layouts to the client. -+ -+ -+ -+ -+ Indicates that the client will not the dwl_ipc_manager object anymore. -+ Objects created through this instance are not affected. -+ -+ -+ -+ -+ -+ Get a dwl_ipc_outout for the specified wl_output. -+ -+ -+ -+ -+ -+ -+ -+ This event is sent after binding. -+ A roundtrip after binding guarantees the client recieved all tags. -+ -+ -+ -+ -+ -+ -+ This event is sent after binding. -+ A roundtrip after binding guarantees the client recieved all layouts. -+ -+ -+ -+ -+ -+ -+ -+ Observe and control a dwl output. -+ -+ Events are double-buffered: -+ Clients should cache events and redraw when a dwl_ipc_output.frame event is sent. -+ -+ Request are not double-buffered: -+ The compositor will update immediately upon request. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Indicates to that the client no longer needs this dwl_ipc_output. -+ -+ -+ -+ -+ -+ Indicates the client should hide or show themselves. -+ If the client is visible then hide, if hidden then show. -+ -+ -+ -+ -+ -+ Indicates if the output is active. Zero is invalid, nonzero is valid. -+ -+ -+ -+ -+ -+ -+ Indicates that a tag has been updated. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Indicates a new layout is selected. -+ -+ -+ -+ -+ -+ -+ Indicates the title has changed. -+ -+ -+ -+ -+ -+ -+ Indicates the appid has changed. -+ -+ -+ -+ -+ -+ -+ Indicates the layout has changed. Since layout symbols are dynamic. -+ As opposed to the zdwl_ipc_manager.layout event, this should take precendence when displaying. -+ You can ignore the zdwl_ipc_output.layout event. -+ -+ -+ -+ -+ -+ -+ Indicates that a sequence of status updates have finished and the client should redraw. -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ The tags are updated as follows: -+ new_tags = (current_tags AND and_tags) XOR xor_tags -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Indicates if the selected client on this output is fullscreen. -+ -+ -+ -+ -+ -+ -+ Indicates if the selected client on this output is floating. -+ -+ -+ -+ -+ --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/ipc/ipcpertag.patch b/dwl-bak/dwl-patches/patches/ipc/ipcpertag.patch deleted file mode 100644 index 97e3c33..0000000 --- a/dwl-bak/dwl-patches/patches/ipc/ipcpertag.patch +++ /dev/null @@ -1,97 +0,0 @@ -From c7d77ff4dec1da5a68b4da8aa42d4ed78dc41a00 Mon Sep 17 00:00:00 2001 -From: choc -Date: Thu, 14 Mar 2024 11:18:37 +0800 -Subject: [PATCH] fix ipc to work with pertag - ---- - dwl.c | 50 +++++++++++++++++++++++++++++++++++--------------- - 1 file changed, 35 insertions(+), 15 deletions(-) - -diff --git a/dwl.c b/dwl.c -index a1a7809..d86e6e2 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1526,28 +1526,37 @@ void - dwl_ipc_output_set_layout(struct wl_client *client, struct wl_resource *resource, uint32_t index) - { - DwlIpcOutput *ipc_output; -- Monitor *monitor; -+ Client *c = NULL; -+ Monitor *monitor = NULL; - - ipc_output = wl_resource_get_user_data(resource); - if (!ipc_output) - return; -- - monitor = ipc_output->mon; -+ -+ if (monitor != selmon) -+ c = focustop(selmon); -+ - if (index >= LENGTH(layouts)) - return; -- if (index != monitor->lt[monitor->sellt] - layouts) -- monitor->sellt ^= 1; - -- monitor->lt[monitor->sellt] = &layouts[index]; -- arrange(monitor); -- printstatus(); -+ if (c) { -+ monitor = selmon; -+ selmon = ipc_output->mon; -+ } -+ setlayout(&(Arg){.v = &layouts[index]}); -+ if (c) { -+ selmon = monitor; -+ focusclient(c, 0); -+ } - } - - void - dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, uint32_t tagmask, uint32_t toggle_tagset) - { - DwlIpcOutput *ipc_output; -- Monitor *monitor; -+ Client *c = NULL; -+ Monitor *monitor = NULL; - unsigned int newtags = tagmask & TAGMASK; - - ipc_output = wl_resource_get_user_data(resource); -@@ -1555,16 +1564,27 @@ dwl_ipc_output_set_tags(struct wl_client *client, struct wl_resource *resource, - return; - monitor = ipc_output->mon; - -- if (!newtags || newtags == monitor->tagset[monitor->seltags]) -+ if (monitor != selmon) -+ c = focustop(selmon); -+ -+ if (!newtags) - return; -- if (toggle_tagset) -+ -+ /* view toggles seltags for us so we un-toggle it */ -+ if (!toggle_tagset) { - monitor->seltags ^= 1; -+ monitor->tagset[monitor->seltags] = 0; -+ } - -- monitor->tagset[monitor->seltags] = newtags; -- if (selmon == monitor) -- focusclient(focustop(monitor), 1); -- arrange(monitor); -- printstatus(); -+ if (c) { -+ monitor = selmon; -+ selmon = ipc_output->mon; -+ } -+ view(&(Arg){.ui = newtags}); -+ if (c) { -+ selmon = monitor; -+ focusclient(c, 0); -+ } - } - - void --- -2.43.0 - diff --git a/dwl-bak/dwl-patches/patches/kblayout/README.md b/dwl-bak/dwl-patches/patches/kblayout/README.md deleted file mode 100644 index 259694c..0000000 --- a/dwl-bak/dwl-patches/patches/kblayout/README.md +++ /dev/null @@ -1,32 +0,0 @@ -### Description - -This patch adds per-client keyboard layout and ability to send current -keyboard layout information to a status bar. - -Only per-client feature is enabled by default. You can edit -`kblayout_file` and `kblayout_cmd` variables to notify a status bar -about keyboard layout. - -[Someblocks](https://sr.ht/~raphi/someblocks) config that works -with the example settings in `config.h`: - -```c -static const Block blocks[] = { - /*Icon*/ /*Command*/ /*Update Interval*/ /*Update Signal*/ - {"", "cat /tmp/dwl-kblayout", 0, 3}, -}; -``` - -Both of these features are included in one patch because their -implementation happens to share some code. If you don't need -any of these features, just disable it in `config.h`. - -### Download - -- [git branch](https://codeberg.org/nikitaivanov/dwl/src/branch/kblayout) -- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/kblayout/kblayout.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) -- [ForzCross](https://codeberg.org/ForzCross) diff --git a/dwl-bak/dwl-patches/patches/kblayout/kblayout.patch b/dwl-bak/dwl-patches/patches/kblayout/kblayout.patch deleted file mode 100644 index 707a4fc..0000000 --- a/dwl-bak/dwl-patches/patches/kblayout/kblayout.patch +++ /dev/null @@ -1,187 +0,0 @@ -From ad18a8b8e9de138c3d89246ac0e25c0467ff5971 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Fri, 11 Oct 2024 10:50:14 +0200 -Subject: [PATCH] Add per client keyboard layout and status bar info - ---- - config.def.h | 3 +++ - dwl.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- - 2 files changed, 72 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..862c104 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -13,6 +13,9 @@ static const float focuscolor[] = COLOR(0x005577ff); - static const float urgentcolor[] = COLOR(0xff0000ff); - /* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ - static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You can also use glsl colors */ -+/* keyboard layout change notification for status bar */ -+static const char kblayout_file[] = "/tmp/dwl-keymap"; -+static const char *kblayout_cmd[] = {"pkill", "-RTMIN+3", "someblocks", NULL}; - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -diff --git a/dwl.c b/dwl.c -index a2711f6..95ca3d3 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -141,6 +142,7 @@ typedef struct { - uint32_t tags; - int isfloating, isurgent, isfullscreen; - uint32_t resize; /* configure serial of a pending resize */ -+ unsigned int kblayout_idx; - } Client; - - typedef struct { -@@ -294,6 +296,7 @@ static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); -+static void kblayout(KeyboardGroup *kb); - static int keybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); - static void keypressmod(struct wl_listener *listener, void *data); -@@ -413,6 +416,8 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static unsigned int kblayout_idx = -1; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -879,6 +884,8 @@ createkeyboard(struct wlr_keyboard *keyboard) - - /* Add the new keyboard to the group */ - wlr_keyboard_group_add_keyboard(kb_group->wlr_group, keyboard); -+ -+ kblayout(kb_group); - } - - KeyboardGroup * -@@ -1056,11 +1063,13 @@ createnotify(struct wl_listener *listener, void *data) - /* This event is raised when a client creates a new toplevel (application window). */ - struct wlr_xdg_toplevel *toplevel = data; - Client *c = NULL; -+ struct wlr_keyboard *kb = wlr_seat_get_keyboard(seat); - - /* Allocate a Client for this surface */ - c = toplevel->base->data = ecalloc(1, sizeof(*c)); - c->surface.xdg = toplevel->base; - c->bw = borderpx; -+ c->kblayout_idx = kb ? kb->modifiers.group : 0; - - LISTEN(&toplevel->base->surface->events.commit, &c->commit, commitnotify); - LISTEN(&toplevel->base->surface->events.map, &c->map, mapnotify); -@@ -1339,10 +1348,24 @@ dirtomon(enum wlr_direction dir) - void - focusclient(Client *c, int lift) - { -+ /* Copied from wlroots/types/wlr_keyboard_group.c */ -+ struct keyboard_group_device { -+ struct wlr_keyboard *keyboard; -+ struct wl_listener key; -+ struct wl_listener modifiers; -+ struct wl_listener keymap; -+ struct wl_listener repeat_info; -+ struct wl_listener destroy; -+ struct wl_list link; // wlr_keyboard_group.devices -+ }; -+ - struct wlr_surface *old = seat->keyboard_state.focused_surface; - int unused_lx, unused_ly, old_client_type; - Client *old_c = NULL; - LayerSurface *old_l = NULL; -+ struct keyboard_group_device *device; -+ struct wlr_keyboard *kb = wlr_seat_get_keyboard(seat); -+ struct wlr_keyboard_group *group = kb ? wlr_keyboard_group_from_wlr_keyboard(kb) : NULL; - - if (locked) - return; -@@ -1395,6 +1418,19 @@ focusclient(Client *c, int lift) - } - printstatus(); - -+ /* Update keyboard layout */ -+ if (group) { -+ // Update the first real device, because kb or group->kb is not a real -+ // keyboard and its effective layout gets overwritten -+ device = wl_container_of(group->devices.next, device, link); -+ wlr_keyboard_notify_modifiers(device->keyboard, -+ device->keyboard->modifiers.depressed, -+ device->keyboard->modifiers.latched, -+ device->keyboard->modifiers.locked, -+ c ? c->kblayout_idx : 0 -+ ); -+ } -+ - if (!c) { - /* With no client, all we have left is to clear focus */ - wlr_seat_keyboard_notify_clear_focus(seat); -@@ -1405,7 +1441,7 @@ focusclient(Client *c, int lift) - motionnotify(0, NULL, 0, 0, 0, 0); - - /* Have a client, so focus its top-level wlr_surface */ -- client_notify_enter(client_surface(c), wlr_seat_get_keyboard(seat)); -+ client_notify_enter(client_surface(c), kb); - - /* Activate the new client */ - client_activate_surface(client_surface(c), 1); -@@ -1554,6 +1590,36 @@ inputdevice(struct wl_listener *listener, void *data) - wlr_seat_set_capabilities(seat, caps); - } - -+void -+kblayout(KeyboardGroup *kb) -+{ -+ FILE *f; -+ Client *c; -+ unsigned int idx = kb->wlr_group->keyboard.modifiers.group; -+ -+ // If layout did not change, do nothing -+ if (kblayout_idx == idx) -+ return; -+ kblayout_idx = idx; -+ -+ // Update client layout -+ if ((c = focustop(selmon))) -+ c->kblayout_idx = kblayout_idx; -+ -+ // Save current layout to kblayout_file -+ if (*kblayout_file && (f = fopen(kblayout_file, "w"))) { -+ fputs(xkb_keymap_layout_get_name(kb->wlr_group->keyboard.keymap, -+ idx), f); -+ fclose(f); -+ } -+ -+ // Run kblayout_cmd -+ if (kblayout_cmd[0] && fork() == 0) { -+ execvp(kblayout_cmd[0], (char *const *)kblayout_cmd); -+ die("dwl: execvp %s failed:", kblayout_cmd[0]); -+ } -+} -+ - int - keybinding(uint32_t mods, xkb_keysym_t sym) - { -@@ -1631,6 +1697,8 @@ keypressmod(struct wl_listener *listener, void *data) - /* Send modifiers to the client. */ - wlr_seat_keyboard_notify_modifiers(seat, - &group->wlr_group->keyboard.modifiers); -+ -+ kblayout(group); - } - - int --- -2.46.2 - diff --git a/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/README.md b/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/README.md deleted file mode 100644 index c52de56..0000000 --- a/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/README.md +++ /dev/null @@ -1,11 +0,0 @@ -### Description -Allows clients to use the keyboard-shortcuts-inhibit protocol to block the compositor from using keybinds. This is useful for virtualization software like looking-glass which requires this protocol to run. - -### Download -- [git branch](https://codeberg.org/Rutherther/dwl/src/branch/patch/keyboard-shortcuts-inhibit) -- [2024-05-10](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/keyboardshortcutsinhibit/keyboardshortcutsinhibit.patch) -- [2023-05-01](https://github.com/djpohly/dwl/compare/main...madcowog:keyboard-shortcuts-inhibit.patch) - -### Authors -- [Rutherther](https://codeberg.org/Rutherther) -- [MadcowOG](https://github.com/MadcowOG) diff --git a/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/keyboardshortcutsinhibit.patch b/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/keyboardshortcutsinhibit.patch deleted file mode 100644 index bea327e..0000000 --- a/dwl-bak/dwl-patches/patches/keyboardshortcutsinhibit/keyboardshortcutsinhibit.patch +++ /dev/null @@ -1,101 +0,0 @@ -From ac1fa09172a401427cabbda045688903bdd3cbe7 Mon Sep 17 00:00:00 2001 -From: Rutherther -Date: Wed, 12 Jun 2024 20:05:40 +0200 -Subject: [PATCH] feat: apply keyboard shortcuts inhibit patch - ---- - dwl.c | 22 +++++++++++++++++++++- - 1 file changed, 21 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index 6f041a0..8cab9e0 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -29,6 +29,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -267,6 +268,7 @@ static void createnotify(struct wl_listener *listener, void *data); - static void createpointer(struct wlr_pointer *pointer); - static void createpointerconstraint(struct wl_listener *listener, void *data); - static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); -+static void createshortcutsinhibitor(struct wl_listener *listener, void *data); - static void cursorframe(struct wl_listener *listener, void *data); - static void cursorwarptohint(void); - static void destroydecoration(struct wl_listener *listener, void *data); -@@ -280,6 +282,7 @@ static void destroypointerconstraint(struct wl_listener *listener, void *data); - static void destroysessionlock(struct wl_listener *listener, void *data); - static void destroysessionmgr(struct wl_listener *listener, void *data); - static void destroykeyboardgroup(struct wl_listener *listener, void *data); -+static void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data); - static Monitor *dirtomon(enum wlr_direction dir); - static void focusclient(Client *c, int lift); - static void focusmon(const Arg *arg); -@@ -375,6 +378,7 @@ static struct wl_list clients; /* tiling order */ - static struct wl_list fstack; /* focus order */ - static struct wlr_idle_notifier_v1 *idle_notifier; - static struct wlr_idle_inhibit_manager_v1 *idle_inhibit_mgr; -+static struct wlr_keyboard_shortcuts_inhibit_manager_v1 *shortcuts_inhibit_mgr; - static struct wlr_layer_shell_v1 *layer_shell; - static struct wlr_output_manager_v1 *output_mgr; - static struct wlr_gamma_control_manager_v1 *gamma_control_mgr; -@@ -394,6 +398,7 @@ static struct wlr_session_lock_manager_v1 *session_lock_mgr; - static struct wlr_scene_rect *locked_bg; - static struct wlr_session_lock_v1 *cur_lock; - static struct wl_listener lock_listener = {.notify = locksession}; -+static struct wl_listener new_shortcuts_inhibitor = {.notify = createshortcutsinhibitor}; - - static struct wlr_seat *seat; - static KeyboardGroup *kb_group; -@@ -1083,6 +1088,10 @@ createpointer(struct wlr_pointer *pointer) - wlr_cursor_attach_input_device(cursor, &pointer->base); - } - -+void createshortcutsinhibitor(struct wl_listener *listener, void *data) { -+ wlr_keyboard_shortcuts_inhibitor_v1_activate(data); -+} -+ - void - createpointerconstraint(struct wl_listener *listener, void *data) - { -@@ -1280,6 +1289,11 @@ destroykeyboardgroup(struct wl_listener *listener, void *data) - free(group); - } - -+void destroyshortcutsinhibitmgr(struct wl_listener *listener, void *data) { -+ wl_list_remove(&new_shortcuts_inhibitor.link); -+ wl_list_remove(&listener->link); -+} -+ - Monitor * - dirtomon(enum wlr_direction dir) - { -@@ -1531,7 +1545,9 @@ keypress(struct wl_listener *listener, void *data) - - /* On _press_ if there is no active screen locker, - * attempt to process a compositor keybinding. */ -- if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { -+ if (!locked -+ && event->state == WL_KEYBOARD_KEY_STATE_PRESSED -+ && wl_list_empty(&shortcuts_inhibit_mgr->inhibitors)) { - for (i = 0; i < nsyms; i++) - handled = keybinding(mods, syms[i]) || handled; - } -@@ -2450,6 +2466,10 @@ setup(void) - (float [4]){0.1f, 0.1f, 0.1f, 1.0f}); - wlr_scene_node_set_enabled(&locked_bg->node, 0); - -+ shortcuts_inhibit_mgr = wlr_keyboard_shortcuts_inhibit_v1_create(dpy); -+ wl_signal_add(&shortcuts_inhibit_mgr->events.new_inhibitor, &new_shortcuts_inhibitor); -+ LISTEN_STATIC(&shortcuts_inhibit_mgr->events.destroy, destroyshortcutsinhibitmgr); -+ - /* Use decoration protocols to negotiate server-side decorations */ - wlr_server_decoration_manager_set_default_mode( - wlr_server_decoration_manager_create(dpy), --- -2.44.1 - diff --git a/dwl-bak/dwl-patches/patches/keycodes/README.md b/dwl-bak/dwl-patches/patches/keycodes/README.md deleted file mode 100644 index b56adc3..0000000 --- a/dwl-bak/dwl-patches/patches/keycodes/README.md +++ /dev/null @@ -1,20 +0,0 @@ -### Description -Use keycodes instead of keysyms. This way, input is independent from keyboard -layout (you can use the keys.h file to customize, or get the keycodes with -`wev` or `xkbcli interactive-wayland` (x11-libs/libxkbcommon[tools] in gentoo)). - -### Download -- [git branch](https://codeberg.org/sevz/dwl/src/branch/keycodes) -- [main 2025-01-20](/dwl/dwl-patches/raw/branch/main/patches/keycodes/keycodes.patch) -- [keycodes-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/keycodes/keycodes-0.7.patch) - -### Config after patching -(run in DWL source directory) -``` -export XKB_DEFAULT_VARIANT=yourbestkeyboardlayout -cc -lxkbcommon -o generate-keys generate-keys.c -./generate-keys -``` - -### Authors -- [sevz](https://codeberg.org/sevz) diff --git a/dwl-bak/dwl-patches/patches/keycodes/keycodes-0.7.patch b/dwl-bak/dwl-patches/patches/keycodes/keycodes-0.7.patch deleted file mode 100644 index 7852307..0000000 --- a/dwl-bak/dwl-patches/patches/keycodes/keycodes-0.7.patch +++ /dev/null @@ -1,883 +0,0 @@ -From 4985178cfed599c9a32d154f42e02cb66db7a82d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Fri, 4 Jun 2021 16:51:01 -0500 -Subject: [PATCH 1/2] allow use keycodes instead keysyms -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 85 ++++----- - dwl.c | 35 ++-- - keys.h | 514 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 569 insertions(+), 65 deletions(-) - create mode 100644 keys.h - -diff --git a/config.def.h b/config.def.h -index 22d2171d..87a6e60f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -109,11 +109,11 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ - #define MODKEY WLR_MODIFIER_ALT - --#define TAGKEYS(KEY,SKEY,TAG) \ -+#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } -+ { MODKEY|WLR_MODIFIER_SHIFT, KEY, tag, {.ui = 1 << TAG} }, \ -+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,KEY,toggletag, {.ui = 1 << TAG} } - - /* helper for spawning shell commands in the pre dwm-5.0 fashion */ - #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } -@@ -122,51 +122,52 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "wmenu-run", NULL }; - -+#include "keys.h" - static const Key keys[] = { -- /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -- /* modifier key function argument */ -- { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -- { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, -- { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -- { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -- { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, -- { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -- { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -- { MODKEY, XKB_KEY_Return, zoom, {0} }, -- { MODKEY, XKB_KEY_Tab, view, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -- { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, -- { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -- { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -- { MODKEY, XKB_KEY_space, setlayout, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -- { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, -- { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -- TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), -- TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), -- TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -- TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3), -- TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4), -- TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5), -- TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), -- TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), -- TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, -+ /* modifier key function argument */ -+ { MODKEY, Key_p, spawn, {.v = menucmd} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_Return, spawn, {.v = termcmd} }, -+ { MODKEY, Key_j, focusstack, {.i = +1} }, -+ { MODKEY, Key_k, focusstack, {.i = -1} }, -+ { MODKEY, Key_i, incnmaster, {.i = +1} }, -+ { MODKEY, Key_d, incnmaster, {.i = -1} }, -+ { MODKEY, Key_h, setmfact, {.f = -0.05f} }, -+ { MODKEY, Key_l, setmfact, {.f = +0.05f} }, -+ { MODKEY, Key_Return, zoom, {0} }, -+ { MODKEY, Key_Tab, view, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_c, killclient, {0} }, -+ { MODKEY, Key_t, setlayout, {.v = &layouts[0]} }, -+ { MODKEY, Key_f, setlayout, {.v = &layouts[1]} }, -+ { MODKEY, Key_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, Key_space, setlayout, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_space, togglefloating, {0} }, -+ { MODKEY, Key_e, togglefullscreen, {0} }, -+ { MODKEY, Key_0, view, {.ui = ~0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_0, tag, {.ui = ~0} }, -+ { MODKEY, Key_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY, Key_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_comma, tagmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_period, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ TAGKEYS( Key_1, 0), -+ TAGKEYS( Key_2, 1), -+ TAGKEYS( Key_3, 2), -+ TAGKEYS( Key_4, 3), -+ TAGKEYS( Key_5, 4), -+ TAGKEYS( Key_6, 5), -+ TAGKEYS( Key_7, 6), -+ TAGKEYS( Key_8, 7), -+ TAGKEYS( Key_9, 8), -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ -- { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, -+ { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,Key_BackSpace, quit, {0} }, -+#define CHVT(KEY,n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT, KEY, chvt, {.ui = (n)} } - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is - * do not remove them. - */ --#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } -- CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), -- CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -+ CHVT(Key_F1, 1), CHVT(Key_F2, 2), CHVT(Key_F3, 3), CHVT(Key_F4, 4), -+ CHVT(Key_F5, 5), CHVT(Key_F6, 6), CHVT(Key_F7, 7), CHVT(Key_F8, 8), -+ CHVT(Key_F9, 9), CHVT(Key_F10, 10), CHVT(Key_F11, 11), CHVT(Key_F12, 12), - }; - - static const Button buttons[] = { -diff --git a/dwl.c b/dwl.c -index a2711f67..68860d4e 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -145,7 +145,7 @@ typedef struct { - - typedef struct { - uint32_t mod; -- xkb_keysym_t keysym; -+ xkb_keycode_t keycode; - void (*func)(const Arg *); - const Arg arg; - } Key; -@@ -154,9 +154,8 @@ typedef struct { - struct wl_list link; - struct wlr_keyboard_group *wlr_group; - -- int nsyms; -- const xkb_keysym_t *keysyms; /* invalid if nsyms == 0 */ -- uint32_t mods; /* invalid if nsyms == 0 */ -+ xkb_keycode_t keycode; -+ uint32_t mods; /* invalid if keycode == 0 */ - struct wl_event_source *key_repeat_source; - - struct wl_listener modifiers; -@@ -294,7 +293,7 @@ static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); --static int keybinding(uint32_t mods, xkb_keysym_t sym); -+static int keybinding(uint32_t mods, xkb_keycode_t keycode); - static void keypress(struct wl_listener *listener, void *data); - static void keypressmod(struct wl_listener *listener, void *data); - static int keyrepeat(void *data); -@@ -1555,7 +1554,7 @@ inputdevice(struct wl_listener *listener, void *data) - } - - int --keybinding(uint32_t mods, xkb_keysym_t sym) -+keybinding(uint32_t mods, xkb_keycode_t keycode) - { - /* - * Here we handle compositor keybindings. This is when the compositor is -@@ -1565,7 +1564,7 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - const Key *k; - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) -- && sym == k->keysym && k->func) { -+ && keycode == k->keycode && k->func) { - k->func(&k->arg); - return 1; - } -@@ -1576,17 +1575,12 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - void - keypress(struct wl_listener *listener, void *data) - { -- int i; - /* This event is raised when a key is pressed or released. */ - KeyboardGroup *group = wl_container_of(listener, group, key); - struct wlr_keyboard_key_event *event = data; - - /* Translate libinput keycode -> xkbcommon */ - uint32_t keycode = event->keycode + 8; -- /* Get a list of keysyms based on the keymap for this keyboard */ -- const xkb_keysym_t *syms; -- int nsyms = xkb_state_key_get_syms( -- group->wlr_group->keyboard.xkb_state, keycode, &syms); - - int handled = 0; - uint32_t mods = wlr_keyboard_get_modifiers(&group->wlr_group->keyboard); -@@ -1595,19 +1589,16 @@ keypress(struct wl_listener *listener, void *data) - - /* On _press_ if there is no active screen locker, - * attempt to process a compositor keybinding. */ -- if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { -- for (i = 0; i < nsyms; i++) -- handled = keybinding(mods, syms[i]) || handled; -- } -+ if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) -+ handled = keybinding(mods, keycode); - - if (handled && group->wlr_group->keyboard.repeat_info.delay > 0) { - group->mods = mods; -- group->keysyms = syms; -- group->nsyms = nsyms; -+ group->keycode = keycode; - wl_event_source_timer_update(group->key_repeat_source, - group->wlr_group->keyboard.repeat_info.delay); - } else { -- group->nsyms = 0; -+ group->keycode = 0; - wl_event_source_timer_update(group->key_repeat_source, 0); - } - -@@ -1637,15 +1628,13 @@ int - keyrepeat(void *data) - { - KeyboardGroup *group = data; -- int i; -- if (!group->nsyms || group->wlr_group->keyboard.repeat_info.rate <= 0) -+ if (!group->keycode || group->wlr_group->keyboard.repeat_info.rate <= 0) - return 0; - - wl_event_source_timer_update(group->key_repeat_source, - 1000 / group->wlr_group->keyboard.repeat_info.rate); - -- for (i = 0; i < group->nsyms; i++) -- keybinding(group->mods, group->keysyms[i]); -+ keybinding(group->mods, group->keycode); - - return 0; - } -diff --git a/keys.h b/keys.h -new file mode 100644 -index 00000000..047b76b0 ---- /dev/null -+++ b/keys.h -@@ -0,0 +1,514 @@ -+/* You can use the macros within this file -+ * instead of search the keycodes yourself -+ * with wev or something like that -+ * You probably are also searching these: -+ * Key_XF86AudioMute -+ * Key_XF86AudioLowerVolume -+ * Key_XF86AudioRaiseVolume -+ * Key_XF86MonBrightnessDown -+ * Key_XF86MonBrightnessUp -+*/ -+ -+#define Key_Escape 0x009 -+#define Key_1 0x00a -+#define Key_exclam 0x00a -+#define Key_2 0x00b -+#define Key_at 0x00b -+#define Key_3 0x00c -+#define Key_numbersign 0x00c -+#define Key_4 0x00d -+#define Key_dollar 0x00d -+#define Key_5 0x00e -+#define Key_percent 0x00e -+#define Key_6 0x00f -+#define Key_asciicircum 0x00f -+#define Key_7 0x010 -+#define Key_ampersand 0x010 -+#define Key_8 0x011 -+#define Key_asterisk 0x011 -+#define Key_9 0x012 -+#define Key_parenleft 0x012 -+#define Key_0 0x013 -+#define Key_parenright 0x013 -+#define Key_minus 0x014 -+#define Key_underscore 0x014 -+#define Key_equal 0x015 -+#define Key_plus 0x015 -+#define Key_BackSpace 0x016 -+#define Key_Tab 0x017 -+#define Key_ISO_Left_Tab 0x017 -+#define Key_q 0x018 -+#define Key_Q 0x018 -+#define Key_w 0x019 -+#define Key_W 0x019 -+#define Key_e 0x01a -+#define Key_E 0x01a -+#define Key_r 0x01b -+#define Key_R 0x01b -+#define Key_t 0x01c -+#define Key_T 0x01c -+#define Key_y 0x01d -+#define Key_Y 0x01d -+#define Key_u 0x01e -+#define Key_U 0x01e -+#define Key_i 0x01f -+#define Key_I 0x01f -+#define Key_o 0x020 -+#define Key_O 0x020 -+#define Key_p 0x021 -+#define Key_P 0x021 -+#define Key_bracketleft 0x022 -+#define Key_braceleft 0x022 -+#define Key_bracketright 0x023 -+#define Key_braceright 0x023 -+#define Key_Return 0x024 -+#define Key_Control_L 0x025 -+#define Key_a 0x026 -+#define Key_A 0x026 -+#define Key_s 0x027 -+#define Key_S 0x027 -+#define Key_d 0x028 -+#define Key_D 0x028 -+#define Key_f 0x029 -+#define Key_F 0x029 -+#define Key_g 0x02a -+#define Key_G 0x02a -+#define Key_h 0x02b -+#define Key_H 0x02b -+#define Key_j 0x02c -+#define Key_J 0x02c -+#define Key_k 0x02d -+#define Key_K 0x02d -+#define Key_l 0x02e -+#define Key_L 0x02e -+#define Key_semicolon 0x02f -+#define Key_colon 0x02f -+#define Key_apostrophe 0x030 -+#define Key_quotedbl 0x030 -+#define Key_grave 0x031 -+#define Key_asciitilde 0x031 -+#define Key_Shift_L 0x032 -+#define Key_backslash 0x033 -+#define Key_bar 0x033 -+#define Key_z 0x034 -+#define Key_Z 0x034 -+#define Key_x 0x035 -+#define Key_X 0x035 -+#define Key_c 0x036 -+#define Key_C 0x036 -+#define Key_v 0x037 -+#define Key_V 0x037 -+#define Key_b 0x038 -+#define Key_B 0x038 -+#define Key_n 0x039 -+#define Key_N 0x039 -+#define Key_m 0x03a -+#define Key_M 0x03a -+#define Key_comma 0x03b -+#define Key_less 0x03b -+#define Key_period 0x03c -+#define Key_greater 0x03c -+#define Key_slash 0x03d -+#define Key_question 0x03d -+#define Key_Shift_R 0x03e -+#define Key_KP_Multiply 0x03f -+#define Key_XF86ClearGrab 0x03f -+#define Key_Alt_L 0x040 -+#define Key_Meta_L 0x040 -+#define Key_space 0x041 -+#define Key_Caps_Lock 0x042 -+#define Key_F1 0x043 -+#define Key_XF86Switch_VT_1 0x043 -+#define Key_F2 0x044 -+#define Key_XF86Switch_VT_2 0x044 -+#define Key_F3 0x045 -+#define Key_XF86Switch_VT_3 0x045 -+#define Key_F4 0x046 -+#define Key_XF86Switch_VT_4 0x046 -+#define Key_F5 0x047 -+#define Key_XF86Switch_VT_5 0x047 -+#define Key_F6 0x048 -+#define Key_XF86Switch_VT_6 0x048 -+#define Key_F7 0x049 -+#define Key_XF86Switch_VT_7 0x049 -+#define Key_F8 0x04a -+#define Key_XF86Switch_VT_8 0x04a -+#define Key_F9 0x04b -+#define Key_XF86Switch_VT_9 0x04b -+#define Key_F10 0x04c -+#define Key_XF86Switch_VT_10 0x04c -+#define Key_Num_Lock 0x04d -+#define Key_Scroll_Lock 0x04e -+#define Key_KP_Home 0x04f -+#define Key_KP_7 0x04f -+#define Key_KP_Up 0x050 -+#define Key_KP_8 0x050 -+#define Key_KP_Prior 0x051 -+#define Key_KP_9 0x051 -+#define Key_KP_Subtract 0x052 -+#define Key_XF86Prev_VMode 0x052 -+#define Key_KP_Left 0x053 -+#define Key_KP_4 0x053 -+#define Key_KP_Begin 0x054 -+#define Key_KP_5 0x054 -+#define Key_KP_Right 0x055 -+#define Key_KP_6 0x055 -+#define Key_KP_Add 0x056 -+#define Key_XF86Next_VMode 0x056 -+#define Key_KP_End 0x057 -+#define Key_KP_1 0x057 -+#define Key_KP_Down 0x058 -+#define Key_KP_2 0x058 -+#define Key_KP_Next 0x059 -+#define Key_KP_3 0x059 -+#define Key_KP_Insert 0x05a -+#define Key_KP_0 0x05a -+#define Key_KP_Delete 0x05b -+#define Key_KP_Decimal 0x05b -+#define Key_ISO_Level3_Shift 0x05c -+#define Key_less2 0x05e -+#define Key_greater2 0x05e -+#define Key_bar2 0x05e -+#define Key_brokenbar 0x05e -+#define Key_F11 0x05f -+#define Key_XF86Switch_VT_11 0x05f -+#define Key_F12 0x060 -+#define Key_XF86Switch_VT_12 0x060 -+#define Key_Katakana 0x062 -+#define Key_Hiragana 0x063 -+#define Key_Henkan_Mode 0x064 -+#define Key_Hiragana_Katakana 0x065 -+#define Key_Muhenkan 0x066 -+#define Key_KP_Enter 0x068 -+#define Key_Control_R 0x069 -+#define Key_KP_Divide 0x06a -+#define Key_XF86Ungrab 0x06a -+#define Key_Print 0x06b -+#define Key_Sys_Req 0x06b -+#define Key_Alt_R 0x06c -+#define Key_Meta_R 0x06c -+#define Key_Linefeed 0x06d -+#define Key_Home 0x06e -+#define Key_Up 0x06f -+#define Key_Prior 0x070 -+#define Key_Left 0x071 -+#define Key_Right 0x072 -+#define Key_End 0x073 -+#define Key_Down 0x074 -+#define Key_Next 0x075 -+#define Key_Insert 0x076 -+#define Key_Delete 0x077 -+#define Key_XF86AudioMute 0x079 -+#define Key_XF86AudioLowerVolume 0x07a -+#define Key_XF86AudioRaiseVolume 0x07b -+#define Key_XF86PowerOff 0x07c -+#define Key_KP_Equal 0x07d -+#define Key_plusminus 0x07e -+#define Key_Pause 0x07f -+#define Key_Break 0x07f -+#define Key_XF86LaunchA 0x080 -+#define Key_KP_Decimal2 0x081 -+#define Key_Hangul 0x082 -+#define Key_Hangul_Hanja 0x083 -+#define Key_Super_L 0x085 -+#define Key_Super_R 0x086 -+#define Key_Menu 0x087 -+#define Key_Cancel 0x088 -+#define Key_Redo 0x089 -+#define Key_SunProps 0x08a -+#define Key_Undo 0x08b -+#define Key_SunFront 0x08c -+#define Key_XF86Copy 0x08d -+#define Key_XF86Open 0x08e -+#define Key_XF86Paste 0x08f -+#define Key_Find 0x090 -+#define Key_XF86Cut 0x091 -+#define Key_Help 0x092 -+#define Key_XF86MenuKB 0x093 -+#define Key_XF86Calculator 0x094 -+#define Key_XF86Sleep 0x096 -+#define Key_XF86WakeUp 0x097 -+#define Key_XF86Explorer 0x098 -+#define Key_XF86Send 0x099 -+#define Key_XF86Xfer 0x09b -+#define Key_XF86Launch1 0x09c -+#define Key_XF86Launch2 0x09d -+#define Key_XF86WWW 0x09e -+#define Key_XF86DOS 0x09f -+#define Key_XF86ScreenSaver 0x0a0 -+#define Key_XF86RotateWindows 0x0a1 -+#define Key_XF86TaskPane 0x0a2 -+#define Key_XF86Mail 0x0a3 -+#define Key_XF86Favorites 0x0a4 -+#define Key_XF86MyComputer 0x0a5 -+#define Key_XF86Back 0x0a6 -+#define Key_XF86Forward 0x0a7 -+#define Key_XF86Eject 0x0a9 -+#define Key_XF86Eject2 0x0aa -+#define Key_XF86AudioNext 0x0ab -+#define Key_XF86AudioPlay 0x0ac -+#define Key_XF86AudioPause 0x0ac -+#define Key_XF86AudioPrev 0x0ad -+#define Key_XF86AudioStop 0x0ae -+#define Key_XF86Eject3 0x0ae -+#define Key_XF86AudioRecord 0x0af -+#define Key_XF86AudioRewind 0x0b0 -+#define Key_XF86Phone 0x0b1 -+#define Key_XF86Tools 0x0b3 -+#define Key_XF86HomePage 0x0b4 -+#define Key_XF86Reload 0x0b5 -+#define Key_XF86Close 0x0b6 -+#define Key_XF86ScrollUp 0x0b9 -+#define Key_XF86ScrollDown 0x0ba -+#define Key_parenleft2 0x0bb -+#define Key_parenright2 0x0bc -+#define Key_XF86New 0x0bd -+#define Key_Redo2 0x0be -+#define Key_XF86Tools2 0x0bf -+#define Key_XF86Launch5 0x0c0 -+#define Key_XF86Launch6 0x0c1 -+#define Key_XF86Launch7 0x0c2 -+#define Key_XF86Launch8 0x0c3 -+#define Key_XF86Launch9 0x0c4 -+#define Key_XF86AudioMicMute 0x0c6 -+#define Key_XF86TouchpadToggle 0x0c7 -+#define Key_XF86TouchpadOn 0x0c8 -+#define Key_XF86TouchpadOff 0x0c9 -+#define Key_ISO_Level5_Shift 0x0cb -+#define Key_Alt_L2 0x0cc -+#define Key_Meta_L2 0x0cd -+#define Key_Super_L2 0x0ce -+#define Key_Hyper_L 0x0cf -+#define Key_XF86AudioPlay2 0x0d0 -+#define Key_XF86AudioPause2 0x0d1 -+#define Key_XF86Launch3 0x0d2 -+#define Key_XF86Launch4 0x0d3 -+#define Key_XF86LaunchB 0x0d4 -+#define Key_XF86Suspend 0x0d5 -+#define Key_XF86Close2 0x0d6 -+#define Key_XF86AudioPlay3 0x0d7 -+#define Key_XF86AudioForward 0x0d8 -+#define Key_Print2 0x0da -+#define Key_XF86WebCam 0x0dc -+#define Key_XF86AudioPreset 0x0dd -+#define Key_XF86Mail2 0x0df -+#define Key_XF86Messenger 0x0e0 -+#define Key_XF86Search 0x0e1 -+#define Key_XF86Go 0x0e2 -+#define Key_XF86Finance 0x0e3 -+#define Key_XF86Game 0x0e4 -+#define Key_XF86Shop 0x0e5 -+#define Key_Cancel2 0x0e7 -+#define Key_XF86MonBrightnessDown 0x0e8 -+#define Key_XF86MonBrightnessUp 0x0e9 -+#define Key_XF86AudioMedia 0x0ea -+#define Key_XF86Display 0x0eb -+#define Key_XF86KbdLightOnOff 0x0ec -+#define Key_XF86KbdBrightnessDown 0x0ed -+#define Key_XF86KbdBrightnessUp 0x0ee -+#define Key_XF86Send2 0x0ef -+#define Key_XF86Reply 0x0f0 -+#define Key_XF86MailForward 0x0f1 -+#define Key_XF86Save 0x0f2 -+#define Key_XF86Documents 0x0f3 -+#define Key_XF86Battery 0x0f4 -+#define Key_XF86Bluetooth 0x0f5 -+#define Key_XF86WLAN 0x0f6 -+#define Key_XF86UWB 0x0f7 -+#define Key_XF86Next_VMode2 0x0f9 -+#define Key_XF86Prev_VMode2 0x0fa -+#define Key_XF86MonBrightnessCycle 0x0fb -+#define Key_XF86BrightnessAuto 0x0fc -+#define Key_XF86DisplayOff 0x0fd -+#define Key_XF86WWAN 0x0fe -+#define Key_XF86RFKill 0x0ff -+#define Key_XF86AudioMicMute2 0x100 -+#define Key_XF86Info 0x16e -+#define Key_XF86Favorites2 0x174 -+#define Key_XF86CycleAngle 0x17b -+#define Key_XF86FullScreen 0x17c -+#define Key_XF86Keyboard 0x17e -+#define Key_XF86AspectRatio 0x17f -+#define Key_XF86DVD 0x18d -+#define Key_XF86Audio 0x190 -+#define Key_XF86Video 0x191 -+#define Key_XF86Calendar 0x195 -+#define Key_XF86ChannelUp 0x19a -+#define Key_XF86ChannelDown 0x19b -+#define Key_XF86AudioRandomPlay 0x1a2 -+#define Key_XF86Break 0x1a3 -+#define Key_XF86VideoPhone 0x1a8 -+#define Key_XF86Game2 0x1a9 -+#define Key_XF86ZoomIn 0x1aa -+#define Key_XF86ZoomOut 0x1ab -+#define Key_XF86ZoomReset 0x1ac -+#define Key_XF86Word 0x1ad -+#define Key_XF86Editor 0x1ae -+#define Key_XF86Excel 0x1af -+#define Key_XF86GraphicsEditor 0x1b0 -+#define Key_XF86Presentation 0x1b1 -+#define Key_XF86Database 0x1b2 -+#define Key_XF86News 0x1b3 -+#define Key_XF86Voicemail 0x1b4 -+#define Key_XF86Addressbook 0x1b5 -+#define Key_XF86Messenger2 0x1b6 -+#define Key_XF86DisplayToggle 0x1b7 -+#define Key_XF86SpellCheck 0x1b8 -+#define Key_XF86LogOff 0x1b9 -+#define Key_dollar2 0x1ba -+#define Key_EuroSign 0x1bb -+#define Key_XF86FrameBack 0x1bc -+#define Key_XF86FrameForward 0x1bd -+#define Key_XF86ContextMenu 0x1be -+#define Key_XF86MediaRepeat 0x1bf -+#define Key_XF8610ChannelsUp 0x1c0 -+#define Key_XF8610ChannelsDown 0x1c1 -+#define Key_XF86Images 0x1c2 -+#define Key_XF86NotificationCenter 0x1c4 -+#define Key_XF86PickupPhone 0x1c5 -+#define Key_XF86HangupPhone 0x1c6 -+#define Key_XF86Fn 0x1d8 -+#define Key_XF86Fn_Esc 0x1d9 -+#define Key_XF86FnRightShift 0x1ed -+#define Key_braille_dot_1 0x1f9 -+#define Key_braille_dot_2 0x1fa -+#define Key_braille_dot_3 0x1fb -+#define Key_braille_dot_4 0x1fc -+#define Key_braille_dot_5 0x1fd -+#define Key_braille_dot_6 0x1fe -+#define Key_braille_dot_7 0x1ff -+#define Key_braille_dot_8 0x200 -+#define Key_braille_dot_9 0x201 -+#define Key_braille_dot_1_2 0x202 -+#define Key_XF86Numeric0 0x208 -+#define Key_XF86Numeric1 0x209 -+#define Key_XF86Numeric2 0x20a -+#define Key_XF86Numeric3 0x20b -+#define Key_XF86Numeric4 0x20c -+#define Key_XF86Numeric5 0x20d -+#define Key_XF86Numeric6 0x20e -+#define Key_XF86Numeric7 0x20f -+#define Key_XF86Numeric8 0x210 -+#define Key_XF86Numeric9 0x211 -+#define Key_XF86NumericStar 0x212 -+#define Key_XF86NumericPound 0x213 -+#define Key_XF86NumericA 0x214 -+#define Key_XF86NumericB 0x215 -+#define Key_XF86NumericC 0x216 -+#define Key_XF86NumericD 0x217 -+#define Key_XF86CameraFocus 0x218 -+#define Key_XF86WPSButton 0x219 -+#define Key_XF86TouchpadToggle2 0x21a -+#define Key_XF86TouchpadOn2 0x21b -+#define Key_XF86TouchpadOff2 0x21c -+#define Key_XF86CameraZoomIn 0x21d -+#define Key_XF86CameraZoomOut 0x21e -+#define Key_XF86CameraUp 0x21f -+#define Key_XF86CameraDown 0x220 -+#define Key_XF86CameraLeft 0x221 -+#define Key_XF86CameraRight 0x222 -+#define Key_XF86AttendantOn 0x223 -+#define Key_XF86AttendantOff 0x224 -+#define Key_XF86AttendantToggle 0x225 -+#define Key_XF86LightsToggle 0x226 -+#define Key_XF86ALSToggle 0x238 -+#define Key_XF86RotationLockToggle 0x239 -+#define Key_XF86Buttonconfig 0x248 -+#define Key_XF86Taskmanager 0x249 -+#define Key_XF86Journal 0x24a -+#define Key_XF86ControlPanel 0x24b -+#define Key_XF86AppSelect 0x24c -+#define Key_XF86Screensaver 0x24d -+#define Key_XF86VoiceCommand 0x24e -+#define Key_XF86Assistant 0x24f -+#define Key_ISO_Next_Group 0x250 -+#define Key_XF86EmojiPicker 0x251 -+#define Key_XF86Dictate 0x252 -+#define Key_XF86CameraAccessEnable 0x253 -+#define Key_XF86CameraAccessDisable 0x254 -+#define Key_XF86CameraAccessToggle 0x255 -+#define Key_XF86BrightnessMin 0x258 -+#define Key_XF86BrightnessMax 0x259 -+#define Key_XF86KbdInputAssistPrev 0x268 -+#define Key_XF86KbdInputAssistNext 0x269 -+#define Key_XF86KbdInputAssistPrevgroup 0x26a -+#define Key_XF86KbdInputAssistNextgroup 0x26b -+#define Key_XF86KbdInputAssistAccept 0x26c -+#define Key_XF86KbdInputAssistCancel 0x26d -+#define Key_XF86RightUp 0x26e -+#define Key_XF86RightDown 0x26f -+#define Key_XF86LeftUp 0x270 -+#define Key_XF86LeftDown 0x271 -+#define Key_XF86RootMenu 0x272 -+#define Key_XF86MediaTopMenu 0x273 -+#define Key_XF86Numeric11 0x274 -+#define Key_XF86Numeric12 0x275 -+#define Key_XF86AudioDesc 0x276 -+#define Key_XF863DMode 0x277 -+#define Key_XF86NextFavorite 0x278 -+#define Key_XF86StopRecord 0x279 -+#define Key_XF86PauseRecord 0x27a -+#define Key_XF86VOD 0x27b -+#define Key_XF86Unmute 0x27c -+#define Key_XF86FastReverse 0x27d -+#define Key_XF86SlowReverse 0x27e -+#define Key_XF86Data 0x27f -+#define Key_XF86OnScreenKeyboard 0x280 -+#define Key_XF86PrivacyScreenToggle 0x281 -+#define Key_XF86SelectiveScreenshot 0x282 -+#define Key_XF86NextElement 0x283 -+#define Key_XF86PreviousElement 0x284 -+#define Key_XF86AutopilotEngageToggle 0x285 -+#define Key_XF86MarkWaypoint 0x286 -+#define Key_XF86Sos 0x287 -+#define Key_XF86NavChart 0x288 -+#define Key_XF86FishingChart 0x289 -+#define Key_XF86SingleRangeRadar 0x28a -+#define Key_XF86DualRangeRadar 0x28b -+#define Key_XF86RadarOverlay 0x28c -+#define Key_XF86TraditionalSonar 0x28d -+#define Key_XF86ClearvuSonar 0x28e -+#define Key_XF86SidevuSonar 0x28f -+#define Key_XF86NavInfo 0x290 -+#define Key_XF86BrightnessAdjust 0x291 -+#define Key_XF86Macro1 0x298 -+#define Key_XF86Macro2 0x299 -+#define Key_XF86Macro3 0x29a -+#define Key_XF86Macro4 0x29b -+#define Key_XF86Macro5 0x29c -+#define Key_XF86Macro6 0x29d -+#define Key_XF86Macro7 0x29e -+#define Key_XF86Macro8 0x29f -+#define Key_XF86Macro9 0x2a0 -+#define Key_XF86Macro10 0x2a1 -+#define Key_XF86Macro11 0x2a2 -+#define Key_XF86Macro12 0x2a3 -+#define Key_XF86Macro13 0x2a4 -+#define Key_XF86Macro14 0x2a5 -+#define Key_XF86Macro15 0x2a6 -+#define Key_XF86Macro16 0x2a7 -+#define Key_XF86Macro17 0x2a8 -+#define Key_XF86Macro18 0x2a9 -+#define Key_XF86Macro19 0x2aa -+#define Key_XF86Macro20 0x2ab -+#define Key_XF86Macro21 0x2ac -+#define Key_XF86Macro22 0x2ad -+#define Key_XF86Macro23 0x2ae -+#define Key_XF86Macro24 0x2af -+#define Key_XF86Macro25 0x2b0 -+#define Key_XF86Macro26 0x2b1 -+#define Key_XF86Macro27 0x2b2 -+#define Key_XF86Macro28 0x2b3 -+#define Key_XF86Macro29 0x2b4 -+#define Key_XF86Macro30 0x2b5 -+#define Key_XF86MacroRecordStart 0x2b8 -+#define Key_XF86MacroRecordStop 0x2b9 -+#define Key_XF86MacroPresetCycle 0x2ba -+#define Key_XF86MacroPreset1 0x2bb -+#define Key_XF86MacroPreset2 0x2bc -+#define Key_XF86MacroPreset3 0x2bd -+#define Key_XF86KbdLcdMenu1 0x2c0 -+#define Key_XF86KbdLcdMenu2 0x2c1 -+#define Key_XF86KbdLcdMenu3 0x2c2 -+#define Key_XF86KbdLcdMenu4 0x2c3 -+#define Key_XF86KbdLcdMenu5 0x2c4 --- -2.46.0 - - -From cc7d880886d91cd8d39ab31a48d03d1f745598d2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 19 Mar 2023 15:50:07 -0600 -Subject: [PATCH 2/2] add program to generate keys.h -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - generate-keys.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 95 insertions(+) - create mode 100644 generate-keys.c - -diff --git a/generate-keys.c b/generate-keys.c -new file mode 100644 -index 00000000..37655611 ---- /dev/null -+++ b/generate-keys.c -@@ -0,0 +1,95 @@ -+/****************************************************************** -+ * Copyright 2023-2024 Leonardo Hernández Hernández -+ * -+ * 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 -+ * OPEN GROUP 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. -+ * -+ ******************************************************************/ -+ -+/* cc -lxkbcommon -o generate-keys generate-keys.c */ -+ -+#define _DEFAULT_SOURCE -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+int -+main(void) -+{ -+ /* Allow generate keys with a different layout and variant. -+ * You can also use XKB_DEFAULT_* environmental variables and let this as is */ -+ struct xkb_rule_names rules = { -+ 0 -+ }; -+ struct xkb_context *context = NULL; -+ struct xkb_keymap *keymap = NULL; -+ xkb_keycode_t keycode, min_keycode, max_keycode; -+ xkb_layout_index_t layout, num_layouts; -+ xkb_level_index_t level, num_levels; -+ int i, nsyms; -+ const xkb_keysym_t *syms; -+ char keyname[64]; -+ bool ok = false; -+ FILE *file = fopen("keys.h", "w"); -+ if (!file) { -+ perror("Couldn't open keys.h"); -+ return EXIT_FAILURE; -+ } -+ -+ if (!(context = xkb_context_new(XKB_CONTEXT_NO_FLAGS))) { -+ fputs("Couldn't create xkbcommon context\n", stderr); -+ goto out; -+ } -+ -+ if (!(keymap = xkb_keymap_new_from_names(context, &rules, -+ XKB_KEYMAP_COMPILE_NO_FLAGS))) { -+ fputs("Couldn't create xkbcommon keymap\n", stderr); -+ goto out; -+ } -+ -+ min_keycode = xkb_keymap_min_keycode(keymap); -+ max_keycode = xkb_keymap_max_keycode(keymap); -+ -+ for (keycode = min_keycode; keycode <= max_keycode; keycode++) { -+ num_layouts = xkb_keymap_num_layouts_for_key(keymap, keycode); -+ for (layout = 0; layout < num_layouts; layout++) { -+ num_levels = xkb_keymap_num_levels_for_key(keymap, keycode, layout); -+ for (level = 0; level < num_levels; level++) { -+ nsyms = xkb_keymap_key_get_syms_by_level(keymap, keycode, layout, level, &syms); -+ for (i = 0; i < nsyms; i++) { -+ xkb_keysym_get_name(syms[i], keyname, sizeof(keyname) / sizeof(keyname[0])); -+ fprintf(file, "#define Key_%-27s %#05"PRIx32"\n", keyname, keycode); -+ } -+ } -+ } -+ } -+ -+ ok = true; -+ sync(); -+ -+out: -+ fclose(file); -+ xkb_keymap_unref(keymap); -+ xkb_context_unref(context); -+ return !ok; -+} --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/keycodes/keycodes.patch b/dwl-bak/dwl-patches/patches/keycodes/keycodes.patch deleted file mode 100644 index cc7e896..0000000 --- a/dwl-bak/dwl-patches/patches/keycodes/keycodes.patch +++ /dev/null @@ -1,883 +0,0 @@ -From 308eda668e1d6496a605e44be34fd44c841a1133 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Fri, 4 Jun 2021 16:51:01 -0500 -Subject: [PATCH 1/2] allow use keycodes instead keysyms -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - config.def.h | 85 ++++----- - dwl.c | 35 ++-- - keys.h | 514 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 569 insertions(+), 65 deletions(-) - create mode 100644 keys.h - -diff --git a/config.def.h b/config.def.h -index 22d2171d..87a6e60f 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -109,11 +109,11 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ - #define MODKEY WLR_MODIFIER_ALT - --#define TAGKEYS(KEY,SKEY,TAG) \ -+#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ -- { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } -+ { MODKEY|WLR_MODIFIER_SHIFT, KEY, tag, {.ui = 1 << TAG} }, \ -+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,KEY,toggletag, {.ui = 1 << TAG} } - - /* helper for spawning shell commands in the pre dwm-5.0 fashion */ - #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } -@@ -122,51 +122,52 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA - static const char *termcmd[] = { "foot", NULL }; - static const char *menucmd[] = { "wmenu-run", NULL }; - -+#include "keys.h" - static const Key keys[] = { -- /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -- /* modifier key function argument */ -- { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, -- { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, -- { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -- { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, -- { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, -- { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, -- { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, -- { MODKEY, XKB_KEY_Return, zoom, {0} }, -- { MODKEY, XKB_KEY_Tab, view, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} }, -- { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, -- { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, -- { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -- { MODKEY, XKB_KEY_space, setlayout, {0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, -- { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -- { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, -- { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -- TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), -- TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), -- TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), -- TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3), -- TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4), -- TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5), -- TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), -- TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), -- TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), -- { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Q, quit, {0} }, -+ /* modifier key function argument */ -+ { MODKEY, Key_p, spawn, {.v = menucmd} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_Return, spawn, {.v = termcmd} }, -+ { MODKEY, Key_j, focusstack, {.i = +1} }, -+ { MODKEY, Key_k, focusstack, {.i = -1} }, -+ { MODKEY, Key_i, incnmaster, {.i = +1} }, -+ { MODKEY, Key_d, incnmaster, {.i = -1} }, -+ { MODKEY, Key_h, setmfact, {.f = -0.05f} }, -+ { MODKEY, Key_l, setmfact, {.f = +0.05f} }, -+ { MODKEY, Key_Return, zoom, {0} }, -+ { MODKEY, Key_Tab, view, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_c, killclient, {0} }, -+ { MODKEY, Key_t, setlayout, {.v = &layouts[0]} }, -+ { MODKEY, Key_f, setlayout, {.v = &layouts[1]} }, -+ { MODKEY, Key_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, Key_space, setlayout, {0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_space, togglefloating, {0} }, -+ { MODKEY, Key_e, togglefullscreen, {0} }, -+ { MODKEY, Key_0, view, {.ui = ~0} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_0, tag, {.ui = ~0} }, -+ { MODKEY, Key_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY, Key_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_comma, tagmon, {.i = WLR_DIRECTION_LEFT} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_period, tagmon, {.i = WLR_DIRECTION_RIGHT} }, -+ TAGKEYS( Key_1, 0), -+ TAGKEYS( Key_2, 1), -+ TAGKEYS( Key_3, 2), -+ TAGKEYS( Key_4, 3), -+ TAGKEYS( Key_5, 4), -+ TAGKEYS( Key_6, 5), -+ TAGKEYS( Key_7, 6), -+ TAGKEYS( Key_8, 7), -+ TAGKEYS( Key_9, 8), -+ { MODKEY|WLR_MODIFIER_SHIFT, Key_q, quit, {0} }, - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ -- { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, -+ { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,Key_BackSpace, quit, {0} }, -+#define CHVT(KEY,n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT, KEY, chvt, {.ui = (n)} } - /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is - * do not remove them. - */ --#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } -- CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), -- CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -+ CHVT(Key_F1, 1), CHVT(Key_F2, 2), CHVT(Key_F3, 3), CHVT(Key_F4, 4), -+ CHVT(Key_F5, 5), CHVT(Key_F6, 6), CHVT(Key_F7, 7), CHVT(Key_F8, 8), -+ CHVT(Key_F9, 9), CHVT(Key_F10, 10), CHVT(Key_F11, 11), CHVT(Key_F12, 12), - }; - - static const Button buttons[] = { -diff --git a/dwl.c b/dwl.c -index ad21e1ba..1c9e0ae5 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -143,7 +143,7 @@ typedef struct { - - typedef struct { - uint32_t mod; -- xkb_keysym_t keysym; -+ xkb_keycode_t keycode; - void (*func)(const Arg *); - const Arg arg; - } Key; -@@ -151,9 +151,8 @@ typedef struct { - typedef struct { - struct wlr_keyboard_group *wlr_group; - -- int nsyms; -- const xkb_keysym_t *keysyms; /* invalid if nsyms == 0 */ -- uint32_t mods; /* invalid if nsyms == 0 */ -+ xkb_keycode_t keycode; -+ uint32_t mods; /* invalid if keycode == 0 */ - struct wl_event_source *key_repeat_source; - - struct wl_listener modifiers; -@@ -291,7 +290,7 @@ static void gpureset(struct wl_listener *listener, void *data); - static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); --static int keybinding(uint32_t mods, xkb_keysym_t sym); -+static int keybinding(uint32_t mods, xkb_keycode_t keycode); - static void keypress(struct wl_listener *listener, void *data); - static void keypressmod(struct wl_listener *listener, void *data); - static int keyrepeat(void *data); -@@ -1597,7 +1596,7 @@ inputdevice(struct wl_listener *listener, void *data) - } - - int --keybinding(uint32_t mods, xkb_keysym_t sym) -+keybinding(uint32_t mods, xkb_keycode_t keycode) - { - /* - * Here we handle compositor keybindings. This is when the compositor is -@@ -1607,7 +1606,7 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - const Key *k; - for (k = keys; k < END(keys); k++) { - if (CLEANMASK(mods) == CLEANMASK(k->mod) -- && sym == k->keysym && k->func) { -+ && keycode == k->keycode && k->func) { - k->func(&k->arg); - return 1; - } -@@ -1618,17 +1617,12 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - void - keypress(struct wl_listener *listener, void *data) - { -- int i; - /* This event is raised when a key is pressed or released. */ - KeyboardGroup *group = wl_container_of(listener, group, key); - struct wlr_keyboard_key_event *event = data; - - /* Translate libinput keycode -> xkbcommon */ - uint32_t keycode = event->keycode + 8; -- /* Get a list of keysyms based on the keymap for this keyboard */ -- const xkb_keysym_t *syms; -- int nsyms = xkb_state_key_get_syms( -- group->wlr_group->keyboard.xkb_state, keycode, &syms); - - int handled = 0; - uint32_t mods = wlr_keyboard_get_modifiers(&group->wlr_group->keyboard); -@@ -1637,19 +1631,16 @@ keypress(struct wl_listener *listener, void *data) - - /* On _press_ if there is no active screen locker, - * attempt to process a compositor keybinding. */ -- if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { -- for (i = 0; i < nsyms; i++) -- handled = keybinding(mods, syms[i]) || handled; -- } -+ if (!locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) -+ handled = keybinding(mods, keycode); - - if (handled && group->wlr_group->keyboard.repeat_info.delay > 0) { - group->mods = mods; -- group->keysyms = syms; -- group->nsyms = nsyms; -+ group->keycode = keycode; - wl_event_source_timer_update(group->key_repeat_source, - group->wlr_group->keyboard.repeat_info.delay); - } else { -- group->nsyms = 0; -+ group->keycode = 0; - wl_event_source_timer_update(group->key_repeat_source, 0); - } - -@@ -1679,15 +1670,13 @@ int - keyrepeat(void *data) - { - KeyboardGroup *group = data; -- int i; -- if (!group->nsyms || group->wlr_group->keyboard.repeat_info.rate <= 0) -+ if (!group->keycode || group->wlr_group->keyboard.repeat_info.rate <= 0) - return 0; - - wl_event_source_timer_update(group->key_repeat_source, - 1000 / group->wlr_group->keyboard.repeat_info.rate); - -- for (i = 0; i < group->nsyms; i++) -- keybinding(group->mods, group->keysyms[i]); -+ keybinding(group->mods, group->keycode); - - return 0; - } -diff --git a/keys.h b/keys.h -new file mode 100644 -index 00000000..047b76b0 ---- /dev/null -+++ b/keys.h -@@ -0,0 +1,514 @@ -+/* You can use the macros within this file -+ * instead of search the keycodes yourself -+ * with wev or something like that -+ * You probably are also searching these: -+ * Key_XF86AudioMute -+ * Key_XF86AudioLowerVolume -+ * Key_XF86AudioRaiseVolume -+ * Key_XF86MonBrightnessDown -+ * Key_XF86MonBrightnessUp -+*/ -+ -+#define Key_Escape 0x009 -+#define Key_1 0x00a -+#define Key_exclam 0x00a -+#define Key_2 0x00b -+#define Key_at 0x00b -+#define Key_3 0x00c -+#define Key_numbersign 0x00c -+#define Key_4 0x00d -+#define Key_dollar 0x00d -+#define Key_5 0x00e -+#define Key_percent 0x00e -+#define Key_6 0x00f -+#define Key_asciicircum 0x00f -+#define Key_7 0x010 -+#define Key_ampersand 0x010 -+#define Key_8 0x011 -+#define Key_asterisk 0x011 -+#define Key_9 0x012 -+#define Key_parenleft 0x012 -+#define Key_0 0x013 -+#define Key_parenright 0x013 -+#define Key_minus 0x014 -+#define Key_underscore 0x014 -+#define Key_equal 0x015 -+#define Key_plus 0x015 -+#define Key_BackSpace 0x016 -+#define Key_Tab 0x017 -+#define Key_ISO_Left_Tab 0x017 -+#define Key_q 0x018 -+#define Key_Q 0x018 -+#define Key_w 0x019 -+#define Key_W 0x019 -+#define Key_e 0x01a -+#define Key_E 0x01a -+#define Key_r 0x01b -+#define Key_R 0x01b -+#define Key_t 0x01c -+#define Key_T 0x01c -+#define Key_y 0x01d -+#define Key_Y 0x01d -+#define Key_u 0x01e -+#define Key_U 0x01e -+#define Key_i 0x01f -+#define Key_I 0x01f -+#define Key_o 0x020 -+#define Key_O 0x020 -+#define Key_p 0x021 -+#define Key_P 0x021 -+#define Key_bracketleft 0x022 -+#define Key_braceleft 0x022 -+#define Key_bracketright 0x023 -+#define Key_braceright 0x023 -+#define Key_Return 0x024 -+#define Key_Control_L 0x025 -+#define Key_a 0x026 -+#define Key_A 0x026 -+#define Key_s 0x027 -+#define Key_S 0x027 -+#define Key_d 0x028 -+#define Key_D 0x028 -+#define Key_f 0x029 -+#define Key_F 0x029 -+#define Key_g 0x02a -+#define Key_G 0x02a -+#define Key_h 0x02b -+#define Key_H 0x02b -+#define Key_j 0x02c -+#define Key_J 0x02c -+#define Key_k 0x02d -+#define Key_K 0x02d -+#define Key_l 0x02e -+#define Key_L 0x02e -+#define Key_semicolon 0x02f -+#define Key_colon 0x02f -+#define Key_apostrophe 0x030 -+#define Key_quotedbl 0x030 -+#define Key_grave 0x031 -+#define Key_asciitilde 0x031 -+#define Key_Shift_L 0x032 -+#define Key_backslash 0x033 -+#define Key_bar 0x033 -+#define Key_z 0x034 -+#define Key_Z 0x034 -+#define Key_x 0x035 -+#define Key_X 0x035 -+#define Key_c 0x036 -+#define Key_C 0x036 -+#define Key_v 0x037 -+#define Key_V 0x037 -+#define Key_b 0x038 -+#define Key_B 0x038 -+#define Key_n 0x039 -+#define Key_N 0x039 -+#define Key_m 0x03a -+#define Key_M 0x03a -+#define Key_comma 0x03b -+#define Key_less 0x03b -+#define Key_period 0x03c -+#define Key_greater 0x03c -+#define Key_slash 0x03d -+#define Key_question 0x03d -+#define Key_Shift_R 0x03e -+#define Key_KP_Multiply 0x03f -+#define Key_XF86ClearGrab 0x03f -+#define Key_Alt_L 0x040 -+#define Key_Meta_L 0x040 -+#define Key_space 0x041 -+#define Key_Caps_Lock 0x042 -+#define Key_F1 0x043 -+#define Key_XF86Switch_VT_1 0x043 -+#define Key_F2 0x044 -+#define Key_XF86Switch_VT_2 0x044 -+#define Key_F3 0x045 -+#define Key_XF86Switch_VT_3 0x045 -+#define Key_F4 0x046 -+#define Key_XF86Switch_VT_4 0x046 -+#define Key_F5 0x047 -+#define Key_XF86Switch_VT_5 0x047 -+#define Key_F6 0x048 -+#define Key_XF86Switch_VT_6 0x048 -+#define Key_F7 0x049 -+#define Key_XF86Switch_VT_7 0x049 -+#define Key_F8 0x04a -+#define Key_XF86Switch_VT_8 0x04a -+#define Key_F9 0x04b -+#define Key_XF86Switch_VT_9 0x04b -+#define Key_F10 0x04c -+#define Key_XF86Switch_VT_10 0x04c -+#define Key_Num_Lock 0x04d -+#define Key_Scroll_Lock 0x04e -+#define Key_KP_Home 0x04f -+#define Key_KP_7 0x04f -+#define Key_KP_Up 0x050 -+#define Key_KP_8 0x050 -+#define Key_KP_Prior 0x051 -+#define Key_KP_9 0x051 -+#define Key_KP_Subtract 0x052 -+#define Key_XF86Prev_VMode 0x052 -+#define Key_KP_Left 0x053 -+#define Key_KP_4 0x053 -+#define Key_KP_Begin 0x054 -+#define Key_KP_5 0x054 -+#define Key_KP_Right 0x055 -+#define Key_KP_6 0x055 -+#define Key_KP_Add 0x056 -+#define Key_XF86Next_VMode 0x056 -+#define Key_KP_End 0x057 -+#define Key_KP_1 0x057 -+#define Key_KP_Down 0x058 -+#define Key_KP_2 0x058 -+#define Key_KP_Next 0x059 -+#define Key_KP_3 0x059 -+#define Key_KP_Insert 0x05a -+#define Key_KP_0 0x05a -+#define Key_KP_Delete 0x05b -+#define Key_KP_Decimal 0x05b -+#define Key_ISO_Level3_Shift 0x05c -+#define Key_less2 0x05e -+#define Key_greater2 0x05e -+#define Key_bar2 0x05e -+#define Key_brokenbar 0x05e -+#define Key_F11 0x05f -+#define Key_XF86Switch_VT_11 0x05f -+#define Key_F12 0x060 -+#define Key_XF86Switch_VT_12 0x060 -+#define Key_Katakana 0x062 -+#define Key_Hiragana 0x063 -+#define Key_Henkan_Mode 0x064 -+#define Key_Hiragana_Katakana 0x065 -+#define Key_Muhenkan 0x066 -+#define Key_KP_Enter 0x068 -+#define Key_Control_R 0x069 -+#define Key_KP_Divide 0x06a -+#define Key_XF86Ungrab 0x06a -+#define Key_Print 0x06b -+#define Key_Sys_Req 0x06b -+#define Key_Alt_R 0x06c -+#define Key_Meta_R 0x06c -+#define Key_Linefeed 0x06d -+#define Key_Home 0x06e -+#define Key_Up 0x06f -+#define Key_Prior 0x070 -+#define Key_Left 0x071 -+#define Key_Right 0x072 -+#define Key_End 0x073 -+#define Key_Down 0x074 -+#define Key_Next 0x075 -+#define Key_Insert 0x076 -+#define Key_Delete 0x077 -+#define Key_XF86AudioMute 0x079 -+#define Key_XF86AudioLowerVolume 0x07a -+#define Key_XF86AudioRaiseVolume 0x07b -+#define Key_XF86PowerOff 0x07c -+#define Key_KP_Equal 0x07d -+#define Key_plusminus 0x07e -+#define Key_Pause 0x07f -+#define Key_Break 0x07f -+#define Key_XF86LaunchA 0x080 -+#define Key_KP_Decimal2 0x081 -+#define Key_Hangul 0x082 -+#define Key_Hangul_Hanja 0x083 -+#define Key_Super_L 0x085 -+#define Key_Super_R 0x086 -+#define Key_Menu 0x087 -+#define Key_Cancel 0x088 -+#define Key_Redo 0x089 -+#define Key_SunProps 0x08a -+#define Key_Undo 0x08b -+#define Key_SunFront 0x08c -+#define Key_XF86Copy 0x08d -+#define Key_XF86Open 0x08e -+#define Key_XF86Paste 0x08f -+#define Key_Find 0x090 -+#define Key_XF86Cut 0x091 -+#define Key_Help 0x092 -+#define Key_XF86MenuKB 0x093 -+#define Key_XF86Calculator 0x094 -+#define Key_XF86Sleep 0x096 -+#define Key_XF86WakeUp 0x097 -+#define Key_XF86Explorer 0x098 -+#define Key_XF86Send 0x099 -+#define Key_XF86Xfer 0x09b -+#define Key_XF86Launch1 0x09c -+#define Key_XF86Launch2 0x09d -+#define Key_XF86WWW 0x09e -+#define Key_XF86DOS 0x09f -+#define Key_XF86ScreenSaver 0x0a0 -+#define Key_XF86RotateWindows 0x0a1 -+#define Key_XF86TaskPane 0x0a2 -+#define Key_XF86Mail 0x0a3 -+#define Key_XF86Favorites 0x0a4 -+#define Key_XF86MyComputer 0x0a5 -+#define Key_XF86Back 0x0a6 -+#define Key_XF86Forward 0x0a7 -+#define Key_XF86Eject 0x0a9 -+#define Key_XF86Eject2 0x0aa -+#define Key_XF86AudioNext 0x0ab -+#define Key_XF86AudioPlay 0x0ac -+#define Key_XF86AudioPause 0x0ac -+#define Key_XF86AudioPrev 0x0ad -+#define Key_XF86AudioStop 0x0ae -+#define Key_XF86Eject3 0x0ae -+#define Key_XF86AudioRecord 0x0af -+#define Key_XF86AudioRewind 0x0b0 -+#define Key_XF86Phone 0x0b1 -+#define Key_XF86Tools 0x0b3 -+#define Key_XF86HomePage 0x0b4 -+#define Key_XF86Reload 0x0b5 -+#define Key_XF86Close 0x0b6 -+#define Key_XF86ScrollUp 0x0b9 -+#define Key_XF86ScrollDown 0x0ba -+#define Key_parenleft2 0x0bb -+#define Key_parenright2 0x0bc -+#define Key_XF86New 0x0bd -+#define Key_Redo2 0x0be -+#define Key_XF86Tools2 0x0bf -+#define Key_XF86Launch5 0x0c0 -+#define Key_XF86Launch6 0x0c1 -+#define Key_XF86Launch7 0x0c2 -+#define Key_XF86Launch8 0x0c3 -+#define Key_XF86Launch9 0x0c4 -+#define Key_XF86AudioMicMute 0x0c6 -+#define Key_XF86TouchpadToggle 0x0c7 -+#define Key_XF86TouchpadOn 0x0c8 -+#define Key_XF86TouchpadOff 0x0c9 -+#define Key_ISO_Level5_Shift 0x0cb -+#define Key_Alt_L2 0x0cc -+#define Key_Meta_L2 0x0cd -+#define Key_Super_L2 0x0ce -+#define Key_Hyper_L 0x0cf -+#define Key_XF86AudioPlay2 0x0d0 -+#define Key_XF86AudioPause2 0x0d1 -+#define Key_XF86Launch3 0x0d2 -+#define Key_XF86Launch4 0x0d3 -+#define Key_XF86LaunchB 0x0d4 -+#define Key_XF86Suspend 0x0d5 -+#define Key_XF86Close2 0x0d6 -+#define Key_XF86AudioPlay3 0x0d7 -+#define Key_XF86AudioForward 0x0d8 -+#define Key_Print2 0x0da -+#define Key_XF86WebCam 0x0dc -+#define Key_XF86AudioPreset 0x0dd -+#define Key_XF86Mail2 0x0df -+#define Key_XF86Messenger 0x0e0 -+#define Key_XF86Search 0x0e1 -+#define Key_XF86Go 0x0e2 -+#define Key_XF86Finance 0x0e3 -+#define Key_XF86Game 0x0e4 -+#define Key_XF86Shop 0x0e5 -+#define Key_Cancel2 0x0e7 -+#define Key_XF86MonBrightnessDown 0x0e8 -+#define Key_XF86MonBrightnessUp 0x0e9 -+#define Key_XF86AudioMedia 0x0ea -+#define Key_XF86Display 0x0eb -+#define Key_XF86KbdLightOnOff 0x0ec -+#define Key_XF86KbdBrightnessDown 0x0ed -+#define Key_XF86KbdBrightnessUp 0x0ee -+#define Key_XF86Send2 0x0ef -+#define Key_XF86Reply 0x0f0 -+#define Key_XF86MailForward 0x0f1 -+#define Key_XF86Save 0x0f2 -+#define Key_XF86Documents 0x0f3 -+#define Key_XF86Battery 0x0f4 -+#define Key_XF86Bluetooth 0x0f5 -+#define Key_XF86WLAN 0x0f6 -+#define Key_XF86UWB 0x0f7 -+#define Key_XF86Next_VMode2 0x0f9 -+#define Key_XF86Prev_VMode2 0x0fa -+#define Key_XF86MonBrightnessCycle 0x0fb -+#define Key_XF86BrightnessAuto 0x0fc -+#define Key_XF86DisplayOff 0x0fd -+#define Key_XF86WWAN 0x0fe -+#define Key_XF86RFKill 0x0ff -+#define Key_XF86AudioMicMute2 0x100 -+#define Key_XF86Info 0x16e -+#define Key_XF86Favorites2 0x174 -+#define Key_XF86CycleAngle 0x17b -+#define Key_XF86FullScreen 0x17c -+#define Key_XF86Keyboard 0x17e -+#define Key_XF86AspectRatio 0x17f -+#define Key_XF86DVD 0x18d -+#define Key_XF86Audio 0x190 -+#define Key_XF86Video 0x191 -+#define Key_XF86Calendar 0x195 -+#define Key_XF86ChannelUp 0x19a -+#define Key_XF86ChannelDown 0x19b -+#define Key_XF86AudioRandomPlay 0x1a2 -+#define Key_XF86Break 0x1a3 -+#define Key_XF86VideoPhone 0x1a8 -+#define Key_XF86Game2 0x1a9 -+#define Key_XF86ZoomIn 0x1aa -+#define Key_XF86ZoomOut 0x1ab -+#define Key_XF86ZoomReset 0x1ac -+#define Key_XF86Word 0x1ad -+#define Key_XF86Editor 0x1ae -+#define Key_XF86Excel 0x1af -+#define Key_XF86GraphicsEditor 0x1b0 -+#define Key_XF86Presentation 0x1b1 -+#define Key_XF86Database 0x1b2 -+#define Key_XF86News 0x1b3 -+#define Key_XF86Voicemail 0x1b4 -+#define Key_XF86Addressbook 0x1b5 -+#define Key_XF86Messenger2 0x1b6 -+#define Key_XF86DisplayToggle 0x1b7 -+#define Key_XF86SpellCheck 0x1b8 -+#define Key_XF86LogOff 0x1b9 -+#define Key_dollar2 0x1ba -+#define Key_EuroSign 0x1bb -+#define Key_XF86FrameBack 0x1bc -+#define Key_XF86FrameForward 0x1bd -+#define Key_XF86ContextMenu 0x1be -+#define Key_XF86MediaRepeat 0x1bf -+#define Key_XF8610ChannelsUp 0x1c0 -+#define Key_XF8610ChannelsDown 0x1c1 -+#define Key_XF86Images 0x1c2 -+#define Key_XF86NotificationCenter 0x1c4 -+#define Key_XF86PickupPhone 0x1c5 -+#define Key_XF86HangupPhone 0x1c6 -+#define Key_XF86Fn 0x1d8 -+#define Key_XF86Fn_Esc 0x1d9 -+#define Key_XF86FnRightShift 0x1ed -+#define Key_braille_dot_1 0x1f9 -+#define Key_braille_dot_2 0x1fa -+#define Key_braille_dot_3 0x1fb -+#define Key_braille_dot_4 0x1fc -+#define Key_braille_dot_5 0x1fd -+#define Key_braille_dot_6 0x1fe -+#define Key_braille_dot_7 0x1ff -+#define Key_braille_dot_8 0x200 -+#define Key_braille_dot_9 0x201 -+#define Key_braille_dot_1_2 0x202 -+#define Key_XF86Numeric0 0x208 -+#define Key_XF86Numeric1 0x209 -+#define Key_XF86Numeric2 0x20a -+#define Key_XF86Numeric3 0x20b -+#define Key_XF86Numeric4 0x20c -+#define Key_XF86Numeric5 0x20d -+#define Key_XF86Numeric6 0x20e -+#define Key_XF86Numeric7 0x20f -+#define Key_XF86Numeric8 0x210 -+#define Key_XF86Numeric9 0x211 -+#define Key_XF86NumericStar 0x212 -+#define Key_XF86NumericPound 0x213 -+#define Key_XF86NumericA 0x214 -+#define Key_XF86NumericB 0x215 -+#define Key_XF86NumericC 0x216 -+#define Key_XF86NumericD 0x217 -+#define Key_XF86CameraFocus 0x218 -+#define Key_XF86WPSButton 0x219 -+#define Key_XF86TouchpadToggle2 0x21a -+#define Key_XF86TouchpadOn2 0x21b -+#define Key_XF86TouchpadOff2 0x21c -+#define Key_XF86CameraZoomIn 0x21d -+#define Key_XF86CameraZoomOut 0x21e -+#define Key_XF86CameraUp 0x21f -+#define Key_XF86CameraDown 0x220 -+#define Key_XF86CameraLeft 0x221 -+#define Key_XF86CameraRight 0x222 -+#define Key_XF86AttendantOn 0x223 -+#define Key_XF86AttendantOff 0x224 -+#define Key_XF86AttendantToggle 0x225 -+#define Key_XF86LightsToggle 0x226 -+#define Key_XF86ALSToggle 0x238 -+#define Key_XF86RotationLockToggle 0x239 -+#define Key_XF86Buttonconfig 0x248 -+#define Key_XF86Taskmanager 0x249 -+#define Key_XF86Journal 0x24a -+#define Key_XF86ControlPanel 0x24b -+#define Key_XF86AppSelect 0x24c -+#define Key_XF86Screensaver 0x24d -+#define Key_XF86VoiceCommand 0x24e -+#define Key_XF86Assistant 0x24f -+#define Key_ISO_Next_Group 0x250 -+#define Key_XF86EmojiPicker 0x251 -+#define Key_XF86Dictate 0x252 -+#define Key_XF86CameraAccessEnable 0x253 -+#define Key_XF86CameraAccessDisable 0x254 -+#define Key_XF86CameraAccessToggle 0x255 -+#define Key_XF86BrightnessMin 0x258 -+#define Key_XF86BrightnessMax 0x259 -+#define Key_XF86KbdInputAssistPrev 0x268 -+#define Key_XF86KbdInputAssistNext 0x269 -+#define Key_XF86KbdInputAssistPrevgroup 0x26a -+#define Key_XF86KbdInputAssistNextgroup 0x26b -+#define Key_XF86KbdInputAssistAccept 0x26c -+#define Key_XF86KbdInputAssistCancel 0x26d -+#define Key_XF86RightUp 0x26e -+#define Key_XF86RightDown 0x26f -+#define Key_XF86LeftUp 0x270 -+#define Key_XF86LeftDown 0x271 -+#define Key_XF86RootMenu 0x272 -+#define Key_XF86MediaTopMenu 0x273 -+#define Key_XF86Numeric11 0x274 -+#define Key_XF86Numeric12 0x275 -+#define Key_XF86AudioDesc 0x276 -+#define Key_XF863DMode 0x277 -+#define Key_XF86NextFavorite 0x278 -+#define Key_XF86StopRecord 0x279 -+#define Key_XF86PauseRecord 0x27a -+#define Key_XF86VOD 0x27b -+#define Key_XF86Unmute 0x27c -+#define Key_XF86FastReverse 0x27d -+#define Key_XF86SlowReverse 0x27e -+#define Key_XF86Data 0x27f -+#define Key_XF86OnScreenKeyboard 0x280 -+#define Key_XF86PrivacyScreenToggle 0x281 -+#define Key_XF86SelectiveScreenshot 0x282 -+#define Key_XF86NextElement 0x283 -+#define Key_XF86PreviousElement 0x284 -+#define Key_XF86AutopilotEngageToggle 0x285 -+#define Key_XF86MarkWaypoint 0x286 -+#define Key_XF86Sos 0x287 -+#define Key_XF86NavChart 0x288 -+#define Key_XF86FishingChart 0x289 -+#define Key_XF86SingleRangeRadar 0x28a -+#define Key_XF86DualRangeRadar 0x28b -+#define Key_XF86RadarOverlay 0x28c -+#define Key_XF86TraditionalSonar 0x28d -+#define Key_XF86ClearvuSonar 0x28e -+#define Key_XF86SidevuSonar 0x28f -+#define Key_XF86NavInfo 0x290 -+#define Key_XF86BrightnessAdjust 0x291 -+#define Key_XF86Macro1 0x298 -+#define Key_XF86Macro2 0x299 -+#define Key_XF86Macro3 0x29a -+#define Key_XF86Macro4 0x29b -+#define Key_XF86Macro5 0x29c -+#define Key_XF86Macro6 0x29d -+#define Key_XF86Macro7 0x29e -+#define Key_XF86Macro8 0x29f -+#define Key_XF86Macro9 0x2a0 -+#define Key_XF86Macro10 0x2a1 -+#define Key_XF86Macro11 0x2a2 -+#define Key_XF86Macro12 0x2a3 -+#define Key_XF86Macro13 0x2a4 -+#define Key_XF86Macro14 0x2a5 -+#define Key_XF86Macro15 0x2a6 -+#define Key_XF86Macro16 0x2a7 -+#define Key_XF86Macro17 0x2a8 -+#define Key_XF86Macro18 0x2a9 -+#define Key_XF86Macro19 0x2aa -+#define Key_XF86Macro20 0x2ab -+#define Key_XF86Macro21 0x2ac -+#define Key_XF86Macro22 0x2ad -+#define Key_XF86Macro23 0x2ae -+#define Key_XF86Macro24 0x2af -+#define Key_XF86Macro25 0x2b0 -+#define Key_XF86Macro26 0x2b1 -+#define Key_XF86Macro27 0x2b2 -+#define Key_XF86Macro28 0x2b3 -+#define Key_XF86Macro29 0x2b4 -+#define Key_XF86Macro30 0x2b5 -+#define Key_XF86MacroRecordStart 0x2b8 -+#define Key_XF86MacroRecordStop 0x2b9 -+#define Key_XF86MacroPresetCycle 0x2ba -+#define Key_XF86MacroPreset1 0x2bb -+#define Key_XF86MacroPreset2 0x2bc -+#define Key_XF86MacroPreset3 0x2bd -+#define Key_XF86KbdLcdMenu1 0x2c0 -+#define Key_XF86KbdLcdMenu2 0x2c1 -+#define Key_XF86KbdLcdMenu3 0x2c2 -+#define Key_XF86KbdLcdMenu4 0x2c3 -+#define Key_XF86KbdLcdMenu5 0x2c4 --- -2.48.0 - - -From 16c0b9be41ba111bf551fd2e5e2bdaa537c6990d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sun, 19 Mar 2023 15:50:07 -0600 -Subject: [PATCH 2/2] add program to generate keys.h -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Leonardo Hernández Hernández ---- - generate-keys.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 95 insertions(+) - create mode 100644 generate-keys.c - -diff --git a/generate-keys.c b/generate-keys.c -new file mode 100644 -index 00000000..37655611 ---- /dev/null -+++ b/generate-keys.c -@@ -0,0 +1,95 @@ -+/****************************************************************** -+ * Copyright 2023-2024 Leonardo Hernández Hernández -+ * -+ * 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 -+ * OPEN GROUP 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. -+ * -+ ******************************************************************/ -+ -+/* cc -lxkbcommon -o generate-keys generate-keys.c */ -+ -+#define _DEFAULT_SOURCE -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+int -+main(void) -+{ -+ /* Allow generate keys with a different layout and variant. -+ * You can also use XKB_DEFAULT_* environmental variables and let this as is */ -+ struct xkb_rule_names rules = { -+ 0 -+ }; -+ struct xkb_context *context = NULL; -+ struct xkb_keymap *keymap = NULL; -+ xkb_keycode_t keycode, min_keycode, max_keycode; -+ xkb_layout_index_t layout, num_layouts; -+ xkb_level_index_t level, num_levels; -+ int i, nsyms; -+ const xkb_keysym_t *syms; -+ char keyname[64]; -+ bool ok = false; -+ FILE *file = fopen("keys.h", "w"); -+ if (!file) { -+ perror("Couldn't open keys.h"); -+ return EXIT_FAILURE; -+ } -+ -+ if (!(context = xkb_context_new(XKB_CONTEXT_NO_FLAGS))) { -+ fputs("Couldn't create xkbcommon context\n", stderr); -+ goto out; -+ } -+ -+ if (!(keymap = xkb_keymap_new_from_names(context, &rules, -+ XKB_KEYMAP_COMPILE_NO_FLAGS))) { -+ fputs("Couldn't create xkbcommon keymap\n", stderr); -+ goto out; -+ } -+ -+ min_keycode = xkb_keymap_min_keycode(keymap); -+ max_keycode = xkb_keymap_max_keycode(keymap); -+ -+ for (keycode = min_keycode; keycode <= max_keycode; keycode++) { -+ num_layouts = xkb_keymap_num_layouts_for_key(keymap, keycode); -+ for (layout = 0; layout < num_layouts; layout++) { -+ num_levels = xkb_keymap_num_levels_for_key(keymap, keycode, layout); -+ for (level = 0; level < num_levels; level++) { -+ nsyms = xkb_keymap_key_get_syms_by_level(keymap, keycode, layout, level, &syms); -+ for (i = 0; i < nsyms; i++) { -+ xkb_keysym_get_name(syms[i], keyname, sizeof(keyname) / sizeof(keyname[0])); -+ fprintf(file, "#define Key_%-27s %#05"PRIx32"\n", keyname, keycode); -+ } -+ } -+ } -+ } -+ -+ ok = true; -+ sync(); -+ -+out: -+ fclose(file); -+ xkb_keymap_unref(keymap); -+ xkb_context_unref(context); -+ return !ok; -+} --- -2.48.0 - diff --git a/dwl-bak/dwl-patches/patches/launchtag/README.md b/dwl-bak/dwl-patches/patches/launchtag/README.md deleted file mode 100644 index 86ad447..0000000 --- a/dwl-bak/dwl-patches/patches/launchtag/README.md +++ /dev/null @@ -1,12 +0,0 @@ -### Description -Straight port of the dwm taglayouts patch, renamed because I have a hard time -finding it on the suckless site. - -This patch allows you to set the default layout for each tag. - -This is intended to be applied on top of pertag. - -### Download -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/launchtag/launchtag.patch) -### Authors - latest at top -- [MayOrMayNotBeACat](https://codeberg.org/MayOrMayNotBeACat) diff --git a/dwl-bak/dwl-patches/patches/launchtag/launchtag.patch b/dwl-bak/dwl-patches/patches/launchtag/launchtag.patch deleted file mode 100644 index c298fd6..0000000 --- a/dwl-bak/dwl-patches/patches/launchtag/launchtag.patch +++ /dev/null @@ -1,49 +0,0 @@ -From e94f4b8363f4122f9b00f774a5b541a00c49fd35 Mon Sep 17 00:00:00 2001 -From: MayOrMayNotBeACat -Date: Fri, 6 Jun 2025 22:42:16 -0400 -Subject: [PATCH] Allow initial layout to be set per tag. - ---- - config.def.h | 1 + - dwl.c | 9 ++++++++- - 2 files changed, 9 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 22d2171..8f2fade 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -16,6 +16,7 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - - /* tagging - TAGCOUNT must be no greater than 31 */ - #define TAGCOUNT (9) -+static int tag_layout[TAGCOUNT] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; /* Modify as needed to match TAGCOUNT */ - - /* logging */ - static int log_level = WLR_ERROR; -diff --git a/dwl.c b/dwl.c -index d234cd2..da46816 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1045,11 +1045,18 @@ createmon(struct wl_listener *listener, void *data) - m->pertag->nmasters[i] = m->nmaster; - m->pertag->mfacts[i] = m->mfact; - -- m->pertag->ltidxs[i][0] = m->lt[0]; -+ if (i != 0) -+ m->pertag->ltidxs[i][0] = &layouts[tag_layout[i-1]]; -+ else -+ m->pertag->ltidxs[i][0] = m->lt[0]; - m->pertag->ltidxs[i][1] = m->lt[1]; - m->pertag->sellts[i] = m->sellt; - } - -+ m->lt[0] = m->pertag->ltidxs[1][0]; -+ m->lt[1] = m->pertag->ltidxs[1][1]; -+ strncpy(m->ltsymbol, m->pertag->ltidxs[1][0]->symbol, LENGTH(m->ltsymbol)); -+ - /* The xdg-protocol specifies: - * - * If the fullscreened surface is not opaque, the compositor must make --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/limitnmaster/README.md b/dwl-bak/dwl-patches/patches/limitnmaster/README.md deleted file mode 100644 index e750300..0000000 --- a/dwl-bak/dwl-patches/patches/limitnmaster/README.md +++ /dev/null @@ -1,8 +0,0 @@ -### Description -Limits nmaster to within the range of currently-opened windows (nmaster will not change past the full horizontal split layout) - -### Download -- [2024-03-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/limitnmaster/limitnmaster.patch) - -### Authors -- [dev-gm](https://codeberg.org/dev-gm) diff --git a/dwl-bak/dwl-patches/patches/limitnmaster/limitnmaster.patch b/dwl-bak/dwl-patches/patches/limitnmaster/limitnmaster.patch deleted file mode 100644 index f4339c8..0000000 --- a/dwl-bak/dwl-patches/patches/limitnmaster/limitnmaster.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 20c948398af900564a59007fc08d15eaa0b65da3 Mon Sep 17 00:00:00 2001 -From: Gavin M -Date: Fri, 15 Mar 2024 17:33:27 -0500 -Subject: [PATCH] Added limitnmaster - ---- - dwl.c | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/dwl.c b/dwl.c -index 5867b0c..210c41d 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1391,9 +1391,15 @@ handlesig(int signo) - void - incnmaster(const Arg *arg) - { -+ unsigned int n = 0; -+ Client *c; -+ - if (!arg || !selmon) - return; -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, selmon) && !c->isfloating && !c->isfullscreen) -+ n++; -+ selmon->nmaster = MIN(MAX(selmon->nmaster + arg->i, 0), n); - arrange(selmon); - } - --- -2.44.0 - diff --git a/dwl-bak/dwl-patches/patches/lockedkeys/README.md b/dwl-bak/dwl-patches/patches/lockedkeys/README.md deleted file mode 100644 index 50f0fd2..0000000 --- a/dwl-bak/dwl-patches/patches/lockedkeys/README.md +++ /dev/null @@ -1,23 +0,0 @@ -### Description -This patch allows you to add keybindings to the lockscreen. - -```c -static const Key lockedkeys[] = { - /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ - /* modifier key function argument */ - - /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ - { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, -#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } - CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -}; -``` - -### Download -- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/lockedkeys) -- [2024-04-11](https://codeberg.org/dwl/dwl-patches/raw/commit/fc4146f3068dcd46035a2a11fe9d6109a97ae6d6/lockedkeys/lockedkeys.patch) -- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/commit/2a6560c167e5c9afc5598ac5431d23d90de8846c/lockedkeys/lockedkeys.patch) - -### Authors -- [wochap](https://codeberg.org/wochap) diff --git a/dwl-bak/dwl-patches/patches/lockedkeys/lockedkeys.patch b/dwl-bak/dwl-patches/patches/lockedkeys/lockedkeys.patch deleted file mode 100644 index f683536..0000000 --- a/dwl-bak/dwl-patches/patches/lockedkeys/lockedkeys.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 70dc03a3817b8fd933244c2db1bb849d9626b12b Mon Sep 17 00:00:00 2001 -From: wochap -Date: Thu, 11 Apr 2024 13:16:40 -0500 -Subject: [PATCH] allow to add keybindings in lockscreen - ---- - config.def.h | 11 +++++++++++ - dwl.c | 20 ++++++++++++++++++++ - 2 files changed, 31 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 8847e58..0d4a4f8 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -164,6 +164,17 @@ static const Key keys[] = { - CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), - }; - -+static const Key lockedkeys[] = { -+ /* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */ -+ /* modifier key function argument */ -+ -+ /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ -+ { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, -+#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } -+ CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), -+ CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), -+}; -+ - static const Button buttons[] = { - { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, - { MODKEY, BTN_MIDDLE, togglefloating, {0} }, -diff --git a/dwl.c b/dwl.c -index bf763df..db4bb2b 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -287,6 +287,7 @@ static void handlesig(int signo); - static void incnmaster(const Arg *arg); - static void inputdevice(struct wl_listener *listener, void *data); - static int keybinding(uint32_t mods, xkb_keysym_t sym); -+static int lockedkeybinding(uint32_t mods, xkb_keysym_t sym); - static void keypress(struct wl_listener *listener, void *data); - static void keypressmod(struct wl_listener *listener, void *data); - static int keyrepeat(void *data); -@@ -1446,6 +1447,21 @@ keybinding(uint32_t mods, xkb_keysym_t sym) - return 0; - } - -+int -+lockedkeybinding(uint32_t mods, xkb_keysym_t sym) -+{ -+ int handled = 0; -+ const Key *k; -+ for (k = lockedkeys; k < END(lockedkeys); k++) { -+ if (CLEANMASK(mods) == CLEANMASK(k->mod) && -+ sym == k->keysym && k->func) { -+ k->func(&k->arg); -+ handled = 1; -+ } -+ } -+ return handled; -+} -+ - void - keypress(struct wl_listener *listener, void *data) - { -@@ -1473,6 +1489,10 @@ keypress(struct wl_listener *listener, void *data) - handled = keybinding(mods, syms[i]) || handled; - } - -+ if (locked && event->state == WL_KEYBOARD_KEY_STATE_PRESSED) -+ for (i = 0; i < nsyms; i++) -+ handled = lockedkeybinding(mods, syms[i]) || handled; -+ - if (handled && group->wlr_group->keyboard.repeat_info.delay > 0) { - group->mods = mods; - group->keysyms = syms; --- -2.43.2 diff --git a/dwl-bak/dwl-patches/patches/mastercolumn/README.md b/dwl-bak/dwl-patches/patches/mastercolumn/README.md deleted file mode 100644 index 14db13c..0000000 --- a/dwl-bak/dwl-patches/patches/mastercolumn/README.md +++ /dev/null @@ -1,16 +0,0 @@ -### Description -This patch adds a layout, `mastercol`, in which the windows in the master area are arranged in columns of equal size. The number of columns is always nmaster + 1, and the last column is a stack of leftover windows (as in the normal tile layout). It effectively differs from the default tile layout only in that master windows are arranged horizontally rather than vertically. - -For gaps, apply `mastercolumn-gaps.patch` on top of `mastercolumn.patch` and `gaps.patch`. - -### Download -##### `mastercolumn.patch` -- [git branch](/shivers/dwl/src/branch/mastercolumn) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/mastercolumn/mastercolumn.patch) - -##### `mastercolumn-gaps.patch` -- [git branch](/shivers/dwl/src/branch/mastercolumn-gaps) -- [0.7](/dwl/dwl-patches/raw/branch/main/patches/mastercolumn/mastercolumn-gaps.patch) - -### Authors -- [shivers](https://codeberg.org/shivers) diff --git a/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn-gaps.patch b/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn-gaps.patch deleted file mode 100644 index 943c4bd..0000000 --- a/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn-gaps.patch +++ /dev/null @@ -1,63 +0,0 @@ -From b6f2ee09778cdea8a1450d16bcf24a8a75e10b40 Mon Sep 17 00:00:00 2001 -From: moe -Date: Tue, 16 Jul 2024 13:56:24 -0400 -Subject: [PATCH 1/1] add mastercolumn gaps - ---- - dwl.c | 23 +++++++++++++++-------- - 1 file changed, 15 insertions(+), 8 deletions(-) - -diff --git a/dwl.c b/dwl.c -index b121094..be33c01 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -1755,7 +1755,7 @@ unset_fullscreen: - void - mastercol(Monitor *m) - { -- unsigned int mw, mx, ty; -+ unsigned int h, w, r, e = m->gaps, mw, mx, ty; - int i, n = 0; - Client *c; - -@@ -1764,23 +1764,30 @@ mastercol(Monitor *m) - n++; - if (n == 0) - return; -+ if (smartgaps == n) -+ e = 0; - - if (n > m->nmaster) -- mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; -+ mw = m->nmaster ? (int)roundf((m->w.width + gappx*e) * m->mfact) : 0; - else - mw = m->w.width; -- i = mx = ty = 0; -+ i = 0; -+ mx = ty = gappx*e; - wl_list_for_each(c, &clients, link) { - if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) - continue; - if (i < m->nmaster) { -- resize(c, (struct wlr_box){.x = m->w.x + mx, .y = m->w.y, -- .width = (mw - mx) / (MIN(n, m->nmaster) - i), .height = m->w.height}, 0); -- mx += c->geom.width; -+ r = MIN(n, m->nmaster) - i; -+ w = (mw - mx - gappx*e - gappx*e * (r - 1)) / r; -+ resize(c, (struct wlr_box){.x = m->w.x + mx, .y = m->w.y + gappx*e, -+ .width = w, .height = m->w.height - 2*gappx*e}, 0); -+ mx += c->geom.width + gappx*e; - } else { -+ r = n - i; -+ h = (m->w.height - ty - gappx*e - gappx*e * (r - 1)) / r; - resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -- .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -- ty += c->geom.height; -+ .width = m->w.width - mw - gappx*e, .height = h}, 0); -+ ty += c->geom.height + gappx*e; - } - i++; - } --- -2.45.2 - diff --git a/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn.patch b/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn.patch deleted file mode 100644 index 425e414..0000000 --- a/dwl-bak/dwl-patches/patches/mastercolumn/mastercolumn.patch +++ /dev/null @@ -1,87 +0,0 @@ -From eb0c6ff53ba823f26d13f18627a084959c353627 Mon Sep 17 00:00:00 2001 -From: moe -Date: Sat, 10 Aug 2024 15:58:15 -0400 -Subject: [PATCH] add mastercolumn layout - ---- - config.def.h | 2 ++ - dwl.c | 36 ++++++++++++++++++++++++++++++++++++ - 2 files changed, 38 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..68b27a7 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -34,6 +34,7 @@ static const Layout layouts[] = { - { "[]=", tile }, - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -+ { "||=", mastercol }, - }; - - /* monitors */ -@@ -139,6 +140,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XKB_KEY_c, setlayout, {.v = &layouts[3]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, -diff --git a/dwl.c b/dwl.c -index a2711f6..49f65ba 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -301,6 +301,7 @@ static int keyrepeat(void *data); - static void killclient(const Arg *arg); - static void locksession(struct wl_listener *listener, void *data); - static void mapnotify(struct wl_listener *listener, void *data); -+static void mastercol(Monitor *m); - static void maximizenotify(struct wl_listener *listener, void *data); - static void monocle(Monitor *m); - static void motionabsolute(struct wl_listener *listener, void *data); -@@ -1748,6 +1749,41 @@ unset_fullscreen: - } - } - -+void -+mastercol(Monitor *m) -+{ -+ unsigned int mw, mx, ty; -+ int i, n = 0; -+ Client *c; -+ -+ wl_list_for_each(c, &clients, link) -+ if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) -+ n++; -+ if (n == 0) -+ return; -+ -+ if (n > m->nmaster) -+ mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0; -+ else -+ mw = m->w.width; -+ i = mx = ty = 0; -+ wl_list_for_each(c, &clients, link) { -+ if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) -+ continue; -+ if (i < m->nmaster) { -+ resize(c, (struct wlr_box){.x = m->w.x + mx, .y = m->w.y, -+ .width = (mw - mx) / (MIN(n, m->nmaster) - i), .height = m->w.height}, 0); -+ mx += c->geom.width; -+ } else { -+ resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty, -+ .width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0); -+ ty += c->geom.height; -+ } -+ i++; -+ } -+} -+ -+ - void - maximizenotify(struct wl_listener *listener, void *data) - { --- -2.46.0 - diff --git a/dwl-bak/dwl-patches/patches/menu/README.md b/dwl-bak/dwl-patches/patches/menu/README.md deleted file mode 100644 index ad37016..0000000 --- a/dwl-bak/dwl-patches/patches/menu/README.md +++ /dev/null @@ -1,18 +0,0 @@ -### Description - -This patch adds `menu` command, which allows dwl to interface with dmenu-like -programs. - -By default, two menus are available: -- focusing a window by its title/appid by pressing `Alt+o` -- selecting a layout from a list by pressing `Alt+Shift+o` - -Edit `menus` array in `config.h` to add/change menus and use a different dmenu -program (`wmenu` is the default). - -### Download -- [2025-03-21 v0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/menu/menu.patch) -- [2024-07-13 v0.7](https://codeberg.org/dwl/dwl-patches/raw/commit/65ea99519bbf7a52f48932aea7385f81f8b30867/patches/menu/menu.patch) - -### Authors -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/menu/menu.patch b/dwl-bak/dwl-patches/patches/menu/menu.patch deleted file mode 100644 index c1dea4d..0000000 --- a/dwl-bak/dwl-patches/patches/menu/menu.patch +++ /dev/null @@ -1,227 +0,0 @@ -From da9861cf0448ca94011470634fd61c3ef2129a25 Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Fri, 21 Mar 2025 21:48:42 +0100 -Subject: [PATCH] Add menu command - ---- - config.def.h | 8 +++ - dwl.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 164 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 22d2171..a5914ca 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -20,6 +20,12 @@ static const float fullscreen_bg[] = {0.1f, 0.1f, 0.1f, 1.0f}; /* You ca - /* logging */ - static int log_level = WLR_ERROR; - -+static const Menu menus[] = { -+ /* command feed function action function */ -+ { "wmenu -i -l 10 -p Windows", menuwinfeed, menuwinaction }, -+ { "wmenu -i -p Layouts", menulayoutfeed, menulayoutaction }, -+}; -+ - /* NOTE: ALWAYS keep a rule declared even if you don't use rules (e.g leave at least one example) */ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ -@@ -140,6 +146,8 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XKB_KEY_space, setlayout, {0} }, -+ { MODKEY, XKB_KEY_o, menu, {.v = &menus[0]} }, -+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, menu, {.v = &menus[1]} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, -diff --git a/dwl.c b/dwl.c -index def2562..b0e8310 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -242,6 +242,12 @@ typedef struct { - struct wl_listener destroy; - } SessionLock; - -+typedef struct { -+ const char *cmd; /* command to run a menu */ -+ void (*feed)(FILE *f); /* feed input to menu */ -+ void (*action)(char *line); /* do action based on menu output */ -+} Menu; -+ - /* function declarations */ - static void applybounds(Client *c, struct wlr_box *bbox); - static void applyrules(Client *c); -@@ -302,6 +308,12 @@ static void killclient(const Arg *arg); - static void locksession(struct wl_listener *listener, void *data); - static void mapnotify(struct wl_listener *listener, void *data); - static void maximizenotify(struct wl_listener *listener, void *data); -+static void menu(const Arg *arg); -+static int menuread(int fd, uint32_t mask, void *data); -+static void menuwinfeed(FILE *f); -+static void menuwinaction(char *line); -+static void menulayoutfeed(FILE *f); -+static void menulayoutaction(char *line); - static void monocle(Monitor *m); - static void motionabsolute(struct wl_listener *listener, void *data); - static void motionnotify(uint32_t time, struct wlr_input_device *device, double sx, -@@ -413,6 +425,11 @@ static struct wlr_box sgeom; - static struct wl_list mons; - static Monitor *selmon; - -+static const Menu *menu_current; -+static int menu_fd; -+static pid_t menu_pid; -+static struct wl_event_source *menu_source; -+ - #ifdef XWAYLAND - static void activatex11(struct wl_listener *listener, void *data); - static void associatex11(struct wl_listener *listener, void *data); -@@ -1768,6 +1785,145 @@ maximizenotify(struct wl_listener *listener, void *data) - wlr_xdg_surface_schedule_configure(c->surface.xdg); - } - -+void -+menu(const Arg *arg) -+{ -+ FILE *f; -+ int fd_right[2], fd_left[2]; -+ -+ if (menu_current != NULL) { -+ wl_event_source_remove(menu_source); -+ close(menu_fd); -+ kill(menu_pid, SIGTERM); -+ menu_current = NULL; -+ if (!arg->v) -+ return; -+ } -+ -+ if (pipe(fd_right) == -1 || pipe(fd_left) == -1) -+ return; -+ if ((menu_pid = fork()) == -1) -+ return; -+ if (menu_pid == 0) { -+ close(fd_right[1]); -+ close(fd_left[0]); -+ dup2(fd_right[0], STDIN_FILENO); -+ close(fd_right[0]); -+ dup2(fd_left[1], STDOUT_FILENO); -+ close(fd_left[1]); -+ execl("/bin/sh", "/bin/sh", "-c", ((Menu *)(arg->v))->cmd, NULL); -+ die("dwl: execl %s failed:", "/bin/sh"); -+ } -+ -+ close(fd_right[0]); -+ close(fd_left[1]); -+ menu_fd = fd_left[0]; -+ if (fd_set_nonblock(menu_fd) == -1) -+ return; -+ if (!(f = fdopen(fd_right[1], "w"))) -+ return; -+ menu_current = arg->v; -+ menu_current->feed(f); -+ fclose(f); -+ menu_source = wl_event_loop_add_fd(event_loop, -+ menu_fd, WL_EVENT_READABLE, menuread, NULL); -+} -+ -+int -+menuread(int fd, uint32_t mask, void *data) -+{ -+ char *s; -+ int n; -+ static char line[512]; -+ static int i = 0; -+ -+ if (mask & (WL_EVENT_HANGUP | WL_EVENT_ERROR)) { -+ i = 0; -+ menu(&(const Arg){ .v = NULL }); -+ return 0; -+ } -+ if ((n = read(menu_fd, line + i, LENGTH(line) - 1 - i)) == -1) { -+ if (errno != EAGAIN) { -+ i = 0; -+ menu(&(const Arg){ .v = NULL }); -+ } -+ return 0; -+ } -+ line[i + n] = '\0'; -+ if (!(s = strchr(line + i, '\n'))) { -+ i += n; -+ return 0; -+ } -+ i = 0; -+ *s = '\0'; -+ menu_current->action(line); -+ return 0; -+} -+ -+void -+menuwinfeed(FILE *f) -+{ -+ Client *c; -+ const char *title, *appid; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (!(title = client_get_title(c))) -+ continue; -+ fprintf(f, "%s", title); -+ if ((appid = client_get_appid(c))) -+ fprintf(f, " | %s", appid); -+ fputc('\n', f); -+ } -+} -+ -+void -+menuwinaction(char *line) -+{ -+ Client *c; -+ const char *appid, *title; -+ static char buf[512]; -+ -+ wl_list_for_each(c, &fstack, flink) { -+ if (!(title = client_get_title(c))) -+ continue; -+ appid = client_get_appid(c); -+ snprintf(buf, LENGTH(buf) - 1, "%s%s%s", -+ title, appid ? " | " : "", appid ? appid : ""); -+ if (strcmp(line, buf) == 0) -+ goto found; -+ } -+ return; -+ -+found: -+ if (!c->mon) -+ return; -+ wl_list_remove(&c->flink); -+ wl_list_insert(&fstack, &c->flink); -+ selmon = c->mon; -+ view(&(const Arg){ .ui = c->tags }); -+} -+ -+void -+menulayoutfeed(FILE *f) -+{ -+ const Layout *l; -+ for (l = layouts; l < END(layouts); l++) -+ fprintf(f, "%s\n", l->symbol); -+} -+ -+void -+menulayoutaction(char *line) -+{ -+ const Layout *l; -+ for (l = layouts; l < END(layouts); l++) -+ if (strcmp(line, l->symbol) == 0) -+ goto found; -+ return; -+ -+found: -+ setlayout(&(const Arg){ .v = l }); -+} -+ - void - monocle(Monitor *m) - { --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/menurule/README.md b/dwl-bak/dwl-patches/patches/menurule/README.md deleted file mode 100644 index 8d8b757..0000000 --- a/dwl-bak/dwl-patches/patches/menurule/README.md +++ /dev/null @@ -1,70 +0,0 @@ -### Description - -This patch adds a dmenu interface to [setrule][setrule], which allows to add or -change client rules at runtime. It must be applied on top of [setrule][setrule] -and [menu][menu] patches. - -You can invoke the menu by pressing `Alt+R`. The menu lists all the rules, plus -a shortcut to define a new one that would apply to the currently focused client -(marked with `(NEW)`). Rules that already apply to the focused client are marked -with `<`. - -![menurule in action](menurule.png) - -To edit a rule, you need to select it, press `Tab`, change what you need and -finally press `Enter`. You can remove a rule by prepending it with `-`. To add a -new rule, just put new values into `[appid|title]`. - -To add support for new rules, you need to edit `fprintf` and `sscanf` calls in -`menurulefeed` and `menuruleaction` functions respectively. - -For example, this is what I did to add support for [swallow][swallow] patch -rules. - -```diff -diff --git a/dwl.c b/dwl.c -index 34397fc..f1b31ea 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -2441,10 +2441,14 @@ menurulefeed(FILE *f) - fprintf(f, "%-*s " - " tags:%-4"PRIi32 - " isfloating:%-2d" -+ " isterm:%-2d" -+ " noswallow:%-2d" - " monitor:%-2d" - "%s\n", wid, buf, - r->tags, - r->isfloating, -+ r->isterm, -+ r->noswallow, - r->monitor, - (r == &t) ? " (NEW)" : match ? " <" : ""); - } -@@ -2465,10 +2469,14 @@ menuruleaction(char *line) - sscanf(line, "[%255[^|]|%255[^]]]" - " tags:%"SCNu32 - " isfloating:%d" -+ " isterm:%d" -+ " noswallow:%d" - " monitor:%d" - "%n", appid, title, - &r.tags, - &r.isfloating, -+ &r.isterm, -+ &r.noswallow, - &r.monitor, - &end); -``` - -[setrule]: /dwl/dwl-patches/src/branch/main/patches/setrule -[menu]: /dwl/dwl-patches/src/branch/main/patches/menu -[swallow]: /dwl/dwl-patches/src/branch/main/patches/swallow - -### Download - -- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/menurule/menurule.patch) - -### Authors - -- [Nikita Ivanov](https://codeberg.org/nikitaivanov) ([GitHub](https://github.com/NikitaIvanovV)) diff --git a/dwl-bak/dwl-patches/patches/menurule/menurule.patch b/dwl-bak/dwl-patches/patches/menurule/menurule.patch deleted file mode 100644 index b74a600..0000000 --- a/dwl-bak/dwl-patches/patches/menurule/menurule.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 7b578d9f4647d84f79a2e8a46a1c65cbacf8d90b Mon Sep 17 00:00:00 2001 -From: Nikita Ivanov -Date: Wed, 19 Mar 2025 02:28:46 +0100 -Subject: [PATCH] Add menurule to tweak rules at runtime - ---- - config.def.h | 2 + - dwl.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 118 insertions(+) - -diff --git a/config.def.h b/config.def.h -index e03a754..77b10ff 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -24,6 +24,7 @@ static const Menu menus[] = { - /* command feed function action function */ - { "wmenu -i -l 10 -p Windows", menuwinfeed, menuwinaction }, - { "wmenu -i -p Layouts", menulayoutfeed, menulayoutaction }, -+ { "wmenu -i -l 10 -p Rules", menurulefeed, menuruleaction }, - }; - - /* Max amount of dynamically added rules */ -@@ -151,6 +152,7 @@ static const Key keys[] = { - { MODKEY, XKB_KEY_space, setlayout, {0} }, - { MODKEY, XKB_KEY_o, menu, {.v = &menus[0]} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_O, menu, {.v = &menus[1]} }, -+ { MODKEY, XKB_KEY_r, menu, {.v = &menus[2]} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, - { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_R, setruleisfloating,{0} }, -diff --git a/dwl.c b/dwl.c -index be007d8..df4901f 100644 ---- a/dwl.c -+++ b/dwl.c -@@ -316,6 +316,8 @@ static void menuwinfeed(FILE *f); - static void menuwinaction(char *line); - static void menulayoutfeed(FILE *f); - static void menulayoutaction(char *line); -+static void menurulefeed(FILE *f); -+static void menuruleaction(char *line); - static void monocle(Monitor *m); - static void motionabsolute(struct wl_listener *listener, void *data); - static void motionnotify(uint32_t time, struct wlr_input_device *device, double sx, -@@ -1974,6 +1976,120 @@ found: - setlayout(&(const Arg){ .v = l }); - } - -+void -+menurulefeed(FILE *f) -+{ -+ Rule t, *p, *r; -+ const char *appid, *title; -+ static char buf[515]; -+ Client *c = focustop(selmon); -+ int n, wid = 0, match; -+ -+ t = (Rule){ 0 }; -+ t.monitor = -1; -+ if (c) { -+ t.id = client_get_appid(c); -+ t.title = client_get_title(c); -+ appid = t.id ? t.id : broken; -+ title = t.title ? t.title : broken; -+ } -+ -+ for (p = drules; p <= drules + druleslen; p++) { -+ r = (p == drules + druleslen) ? &t : p; -+ n = 0; -+ n += strlen(r->id ? r->id : "NULL"); -+ n += strlen(r->title ? r->title : "NULL"); -+ n += 3; -+ wid = MAX(wid, n); -+ } -+ wid = MIN(wid, 40); -+ -+ for (p = drules; p <= drules + druleslen; p++) { -+ match = 0; -+ /* Check if rule applies to the focused client */ -+ if (c && p < drules + druleslen) { -+ match = (!p->title || strstr(title, p->title)) -+ && (!p->id || strstr(appid, p->id)); -+ if (match && p->id) -+ t.id = NULL; -+ if (match && p->title) -+ t.title = NULL; -+ } -+ r = (p == drules + druleslen) ? &t : p; -+ if (r == &t && t.id) -+ t.title = NULL; -+ /* Do not suggest to add a new empty rule */ -+ if (r == &t && !(t.id || t.title)) -+ continue; -+ if (r->id && r->title && -+ strcmp(r->id, "removedrule") == 0 && strcmp(r->title, "removedrule") == 0) -+ continue; -+ snprintf(buf, LENGTH(buf) - 1, "[%s|%s]", -+ r->id ? r->id : "NULL", r->title ? r->title : "NULL"); -+ fprintf(f, "%-*s " -+ " tags:%-4"PRIi32 -+ " isfloating:%-2d" -+ " monitor:%-2d" -+ "%s\n", wid, buf, -+ r->tags, -+ r->isfloating, -+ r->monitor, -+ (r == &t) ? " (NEW)" : match ? " <" : ""); -+ } -+} -+ -+void -+menuruleaction(char *line) -+{ -+ Rule r, *f; -+ static char appid[256], title[256]; -+ int del = 0, end; -+ -+ if (line[0] == '-') { -+ del = 1; -+ line++; -+ } -+ end = 0; -+ sscanf(line, "[%255[^|]|%255[^]]]" -+ " tags:%"SCNu32 -+ " isfloating:%d" -+ " monitor:%d" -+ "%n", appid, title, -+ &r.tags, -+ &r.isfloating, -+ &r.monitor, -+ &end); -+ -+ /* Full line was not parsed, exit */ -+ if (!end) -+ return; -+ -+ r.id = (strcmp(appid, "NULL") != 0) ? appid : NULL; -+ r.title = (strcmp(title, "NULL") != 0) ? title : NULL; -+ -+ /* Find which rule we are trying to edit */ -+ for (f = drules; f < drules + druleslen; f++) -+ if (((!r.title && !f->title) || (r.title && f->title && !strcmp(r.title, f->title))) -+ && (((!r.id && !f->id) || (r.id && f->id && !strcmp(r.id, f->id))))) -+ goto found; -+ -+ if (druleslen >= LENGTH(rules) + RULES_MAX) -+ return; /* No free slots left */ -+ -+ f = drules + druleslen++; -+ f->id = r.id ? strdup(r.id) : NULL; -+ f->title = r.title ? strdup(r.title) : NULL; -+ -+found: -+ if (del) { -+ f->id = f->title = "removedrule"; -+ return; -+ } -+ r.id = f->id; -+ r.title = f->title; -+ *f = r; -+} -+ - void - monocle(Monitor *m) - { --- -2.49.0 - diff --git a/dwl-bak/dwl-patches/patches/menurule/menurule.png b/dwl-bak/dwl-patches/patches/menurule/menurule.png deleted file mode 100644 index 20faac2b97e19ae0b87578a3cc97e2a5a2582a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179351 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%0DK&?m)A;SQqMmaq?XVf&}>< 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 AP5=M^ diff --git a/dwl-bak/dwl-patches/patches/meson/README.md b/dwl-bak/dwl-patches/patches/meson/README.md deleted file mode 100644 index 4641bbf..0000000 --- a/dwl-bak/dwl-patches/patches/meson/README.md +++ /dev/null @@ -1,19 +0,0 @@ -### Description -Add the meson build system. - -This is useful for people who do not want to self-manage a wlroots installation. - -To enable Xwayland support, you will need to enable it in the wlroots subproject: -```sh -meson setup -Dwlroots:xwayland=enabled build -``` -It is also reccomended to see the wlroots meson project configuration logs for any -unusual checks, such as requiring `hwdata` for the DRM backend. - -### Download -- [git branch](/sewn/dwl/src/branch/meson) -- [2024-12-07](/dwl/dwl-patches/raw/branch/main/patches/meson/meson.patch) - -### Authors -- [sewn](/sewn) - diff --git a/dwl-bak/dwl-patches/patches/meson/meson.patch b/dwl-bak/dwl-patches/patches/meson/meson.patch deleted file mode 100644 index 6d78036..0000000 --- a/dwl-bak/dwl-patches/patches/meson/meson.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 136cdeb302fdfe28e5cd5c6a1693b05c3d1bfb58 Mon Sep 17 00:00:00 2001 -From: sewn -Date: Sat, 7 Dec 2024 09:59:01 +0300 -Subject: [PATCH] add meson - ---- - .gitignore | 1 + - meson.build | 93 ++++++++++++++++++++++++++++++++++++++++ - subprojects/wlroots.wrap | 5 +++ - 3 files changed, 99 insertions(+) - create mode 100644 meson.build - create mode 100644 subprojects/wlroots.wrap - -diff --git a/.gitignore b/.gitignore -index 0dde90e..9246a31 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -4,3 +4,4 @@ dwl - *-protocol.h - .ccls-cache - config.h -+subprojects/wlroots -diff --git a/meson.build b/meson.build -new file mode 100644 -index 0000000..e2219ec ---- /dev/null -+++ b/meson.build -@@ -0,0 +1,93 @@ -+project( -+ 'dwl', -+ 'c', -+ version: run_command('git', 'describe', '--tags', '--dirty', check: false).stdout().strip(), -+ license: [ 'GPL-3.0-only', 'CC0-1.0', 'MIT' ], -+ meson_version: '>=1.3', -+ default_options: [ -+ 'c_std=c99', -+ 'warning_level=2', -+ ], -+) -+ -+configure_file( -+ input: 'config.def.h', -+ output: 'config.h', -+ copy: true, -+ install_dir: '.', -+) -+ -+cc = meson.get_compiler('c') -+ -+add_project_arguments([ -+ '-DWLR_USE_UNSTABLE', -+ '-D_POSIX_C_SOURCE=200809L', -+ '-DVERSION="@0@"'.format(meson.project_version()), -+ -+ '-Wno-unused-parameter', -+], language: 'c') -+ -+wlroots = subproject('wlroots', -+ default_options: [ -+ 'backends=drm,libinput,auto', -+ 'default_library=static', -+ 'examples=false', -+ 'session=enabled', -+ ], -+) -+wlroots_has_xwlr = wlroots.get_variable('features').get('xwayland') -+ -+libinput = dependency('libinput') -+math = cc.find_library('m') -+wayland_server = dependency('wayland-server') -+xcb = dependency('xcb', required: wlroots_has_xwlr) -+xcb_icccm = dependency('xcb-icccm', required: wlroots_has_xwlr) -+xkbcommon = dependency('xkbcommon') -+ -+dwl_deps = [ -+ libinput, -+ math, -+ wayland_server, -+ wlroots.get_variable('wlroots'), -+ xkbcommon, -+] -+ -+if wlroots_has_xwlr -+ add_project_arguments('-DXWAYLAND', language: 'c') -+ dwl_deps += [ xcb, xcb_icccm ] -+endif -+ -+wayland_protos = dependency('wayland-protocols') -+wayland_scanner = dependency('wayland-scanner') -+wayland_protocol_dir = wayland_protos.get_variable('pkgdatadir') -+wayland_scanner_prog = find_program( -+ wayland_scanner.get_variable('wayland_scanner'), -+ native: true, -+) -+ -+protocols = [ -+ wayland_protocol_dir / 'staging/cursor-shape/cursor-shape-v1.xml', -+ wayland_protocol_dir / 'unstable/pointer-constraints/pointer-constraints-unstable-v1.xml', -+ 'protocols/wlr-layer-shell-unstable-v1.xml', -+ 'protocols/wlr-output-power-management-unstable-v1.xml', -+ wayland_protocol_dir / 'stable/xdg-shell/xdg-shell.xml', -+] -+protocols_src = [] -+ -+wayland_scanner_server = generator( -+ wayland_scanner_prog, -+ output: '@BASENAME@-protocol.h', -+ arguments: ['server-header', '@INPUT@', '@OUTPUT@'], -+) -+ -+foreach xml : protocols -+ protocols_src += wayland_scanner_server.process(xml) -+endforeach -+ -+executable( -+ 'dwl', -+ [ 'dwl.c', 'util.c', protocols_src ], -+ include_directories: [include_directories('.')], -+ dependencies: dwl_deps, -+ install: true, -+) -diff --git a/subprojects/wlroots.wrap b/subprojects/wlroots.wrap -new file mode 100644 -index 0000000..3d9cbfa ---- /dev/null -+++ b/subprojects/wlroots.wrap -@@ -0,0 +1,5 @@ -+[wrap-git] -+url = https://gitlab.freedesktop.org/wlroots/wlroots.git -+revision = master -+depth = 1 -+clone-recursive = true --- -2.47.1 - diff --git a/dwl-bak/dwl-patches/patches/minimalborders/README.md b/dwl-bak/dwl-patches/patches/minimalborders/README.md deleted file mode 100644 index 2a670c9..0000000 --- a/dwl-bak/dwl-patches/patches/minimalborders/README.md +++ /dev/null @@ -1,34 +0,0 @@ -### Description -Dynamically adjusts the borders between adjacent windows to make them visually merge - -**NOTE:** to disable minimalborders after applying this patch, set `draw_minimal_borders` to `0` - -```c -static const int draw_minimal_borders = 0; /* disable minimalborders */ -``` - -