From 59d1955b2c5f37dd028eeb62aa72dcd0eb72290a Mon Sep 17 00:00:00 2001 From: Clay Gomera Date: Tue, 20 Jun 2023 10:17:21 -0400 Subject: [PATCH] initial hyprland commit --- new-config/.bash_profile | 23 - new-config/.bashrc | 238 - new-config/.config/btop/btop.conf | 212 - new-config/.config/dunst/critical.png | Bin 35927 -> 0 bytes new-config/.config/dunst/dunstrc | 359 - new-config/.config/dunst/normal.png | Bin 3895 -> 0 bytes new-config/.config/fish/config.fish | 241 - new-config/.config/gtk-2.0/gtkfilechooser.ini | 11 - new-config/.config/gtk-3.0/settings.ini | 17 - new-config/.config/lvim/config.lua | 75 - new-config/.config/mpv/input.conf | 12 - new-config/.config/newsboat/config | 51 - new-config/.config/newsboat/urls | 99 - new-config/.config/qt5ct/qt5ct.conf | 31 - new-config/.config/qt6ct/qt6ct.conf | 32 - new-config/.config/rofi/config.rasi | 104 - new-config/.config/rofi/scripts/rofi_emoji | 1859 ----- new-config/.config/rofi/scripts/rofi_power | 68 - new-config/.config/rofi/scripts/rofi_scrot | 93 - new-config/.config/rofi/scripts/rofi_wall | 24 - new-config/.config/rofi/scripts/rofi_wifi | 91 - .../.config/rofi/themes/gruvbox-dark.rasi | 16 - new-config/.config/starship.toml | 33 - new-config/.config/vifm/vifm-help.txt | 6568 ----------------- new-config/.config/vifm/vifmrc | 487 -- new-config/.config/wezterm/wezterm.lua | 33 - new-config/.config/zathura/zathurarc | 54 - new-config/.icons/default/index.theme | 5 - user/.bash_logout | 3 - user/.bash_profile | 18 +- user/.bashrc | 56 +- user/.config/alacritty/alacritty.yml | 447 -- user/.config/awesome/apps.lua | 28 - user/.config/awesome/autostart.lua | 21 - user/.config/awesome/helpers.lua | 35 - user/.config/awesome/keymaps/keyboard.lua | 723 -- user/.config/awesome/keymaps/mouse.lua | 52 - .../modules/custom-layouts/centerwork.lua | 264 - user/.config/awesome/rc.lua | 12 - user/.config/awesome/ui/bar.lua | 224 - user/.config/awesome/ui/icons/centerworkw.png | Bin 461 -> 0 bytes user/.config/awesome/ui/icons/cornerne.png | Bin 272 -> 0 bytes user/.config/awesome/ui/icons/cornernew.png | Bin 272 -> 0 bytes user/.config/awesome/ui/icons/cornernw.png | Bin 263 -> 0 bytes user/.config/awesome/ui/icons/cornernww.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/cornerse.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/cornersew.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/cornersw.png | Bin 263 -> 0 bytes user/.config/awesome/ui/icons/cornersww.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/dwindle.png | Bin 320 -> 0 bytes user/.config/awesome/ui/icons/dwindlew.png | Bin 320 -> 0 bytes user/.config/awesome/ui/icons/fairh.png | Bin 245 -> 0 bytes user/.config/awesome/ui/icons/fairhw.png | Bin 245 -> 0 bytes user/.config/awesome/ui/icons/fairv.png | Bin 246 -> 0 bytes user/.config/awesome/ui/icons/fairvw.png | Bin 246 -> 0 bytes user/.config/awesome/ui/icons/floating.png | Bin 282 -> 0 bytes user/.config/awesome/ui/icons/floatingw.png | Bin 282 -> 0 bytes user/.config/awesome/ui/icons/fullscreen.png | Bin 866 -> 0 bytes user/.config/awesome/ui/icons/fullscreenw.png | Bin 865 -> 0 bytes user/.config/awesome/ui/icons/magnifier.png | Bin 345 -> 0 bytes user/.config/awesome/ui/icons/magnifierw.png | Bin 345 -> 0 bytes user/.config/awesome/ui/icons/max.png | Bin 574 -> 0 bytes user/.config/awesome/ui/icons/maxw.png | Bin 581 -> 0 bytes user/.config/awesome/ui/icons/spiral.png | Bin 328 -> 0 bytes user/.config/awesome/ui/icons/spiralw.png | Bin 328 -> 0 bytes user/.config/awesome/ui/icons/tile.png | Bin 265 -> 0 bytes user/.config/awesome/ui/icons/tilebottom.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/tilebottomw.png | Bin 264 -> 0 bytes user/.config/awesome/ui/icons/tileleft.png | Bin 266 -> 0 bytes user/.config/awesome/ui/icons/tileleftw.png | Bin 266 -> 0 bytes user/.config/awesome/ui/icons/tiletop.png | Bin 5046 -> 0 bytes user/.config/awesome/ui/icons/tiletopw.png | Bin 265 -> 0 bytes user/.config/awesome/ui/icons/tilew.png | Bin 265 -> 0 bytes user/.config/awesome/ui/layouts.lua | 29 - user/.config/awesome/ui/notif.lua | 112 - user/.config/awesome/ui/rules.lua | 185 - user/.config/awesome/ui/theme.lua | 101 - user/.config/awesome/ui/widgets/battery | 28 - user/.config/awesome/ui/widgets/brightness | 10 - user/.config/awesome/ui/widgets/layout | 3 - user/.config/awesome/ui/widgets/volume | 14 - user/.config/awesome/ui/widgets/wifi | 11 - user/.config/btop/btop.conf | 2 +- user/.config/dunst/dunstrc | 3 +- user/.config/fish/config.fish | 40 +- {new-config => user}/.config/git/config | 0 user/.config/gtk-2.0/gtkfilechooser.ini | 4 +- .../.config/gtk-2.0/gtkrc-2.0 | 0 user/.config/gtk-3.0/settings.ini | 10 +- user/.config/hilbish/init.lua | 118 - .../.config/hypr/hyprland.conf | 10 +- user/.config/lvim/config.lua | 235 +- user/.config/lvim/plugin/packer_compiled.lua | 445 -- user/.config/musikcube/hotkeys.json | 68 - user/.config/neofetch/config.conf | 779 -- user/.config/newsboat/config | 1 + user/.config/newsboat/urls | 89 +- user/.config/picom/picom.conf | 87 - user/.config/qt5ct/qt5ct.conf | 7 +- user/.config/qt6ct/qt6ct.conf | 7 +- user/.config/qutebrowser/bookmarks/urls | 14 - user/.config/qutebrowser/config.py | 251 - user/.config/qutebrowser/gruvbox.py | 332 - user/.config/rofi/config.rasi | 5 +- .../.config/rofi/scripts/rofi_blue | 0 user/.config/rofi/scripts/rofi_emoji | 3694 ++++----- .../.config/rofi/scripts/rofi_mount | 0 user/.config/rofi/scripts/rofi_power | 64 +- user/.config/rofi/scripts/rofi_scrot | 132 +- user/.config/rofi/scripts/rofi_wall | 50 +- user/.config/rofi/scripts/rofi_wifi | 70 +- user/.config/suckless/dmenu/Makefile | 64 - user/.config/suckless/dmenu/arg.h | 49 - user/.config/suckless/dmenu/config.def.h | 27 - user/.config/suckless/dmenu/config.mk | 32 - user/.config/suckless/dmenu/dmenu.1 | 197 - user/.config/suckless/dmenu/dmenu.c | 1073 --- user/.config/suckless/dmenu/dmenu_path | 13 - user/.config/suckless/dmenu/dmenu_run | 2 - user/.config/suckless/dmenu/drw.c | 450 -- user/.config/suckless/dmenu/drw.h | 58 - .../dmenu/patches/dmenu-fuzzymatch-4.9.diff | 163 - .../dmenu-highlight-20201211-fcdc159.diff | 97 - .../dmenu/patches/dmenu-mousesupport-5.2.diff | 144 - .../dmenu-mousesupport-motion-5.2.diff | 53 - .../dmenu/patches/dmenu-password-5.0.diff | 103 - .../.config/suckless/dmenu/scripts/dmenu_blue | 317 - .../.config/suckless/dmenu/scripts/dmenu_drun | 12 - .../.config/suckless/dmenu/scripts/dmenu_edit | 26 - .../suckless/dmenu/scripts/dmenu_emoji | 1839 ----- .../suckless/dmenu/scripts/dmenu_power | 56 - .../suckless/dmenu/scripts/dmenu_scrot | 63 - .../.config/suckless/dmenu/scripts/dmenu_wall | 44 - .../.config/suckless/dmenu/scripts/dmenu_wifi | 86 - user/.config/suckless/dmenu/stest.1 | 90 - user/.config/suckless/dmenu/stest.c | 109 - user/.config/suckless/dmenu/util.c | 36 - user/.config/suckless/dmenu/util.h | 8 - user/.config/suckless/dwm/Makefile | 51 - user/.config/suckless/dwm/autostart | 12 - user/.config/suckless/dwm/config.def.h | 297 - user/.config/suckless/dwm/config.mk | 39 - user/.config/suckless/dwm/dependencies.txt | 24 - user/.config/suckless/dwm/drw.c | 451 -- user/.config/suckless/dwm/drw.h | 58 - user/.config/suckless/dwm/dwm.1 | 209 - user/.config/suckless/dwm/dwm.c | 2330 ------ user/.config/suckless/dwm/dwm.png | Bin 373 -> 0 bytes user/.config/suckless/dwm/movestack.c | 48 - .../dwm-alwayscenter-20200625-f04cac6.diff | 12 - .../dwm/patches/dwm-attachbottom-6.3.diff | 54 - .../dwm-autostart-20161205-bb3bd6f.diff | 39 - .../dwm-movestack-20211115-a786211.diff | 95 - .../patches/dwm-pertag-20200914-61bb8b2.diff | 177 - .../patches/dwm-restartsig-20180523-6.2.diff | 139 - .../dwm-scratchpads-20200414-728d397b.diff | 199 - .../dwm/patches/dwm-statuspadding-6.3.diff | 62 - .../suckless/dwm/patches/dwm-warp-6.2.diff | 58 - user/.config/suckless/dwm/tcl.c | 74 - user/.config/suckless/dwm/transient.c | 42 - user/.config/suckless/dwm/util.c | 36 - user/.config/suckless/dwm/util.h | 8 - user/.config/suckless/dwmblocks/Makefile | 14 - user/.config/suckless/dwmblocks/blocks.def.h | 22 - user/.config/suckless/dwmblocks/dwmblocks.c | 175 - .../suckless/dwmblocks/scripts/block_battery | 13 - .../dwmblocks/scripts/block_brightness | 4 - .../suckless/dwmblocks/scripts/block_clock | 4 - .../suckless/dwmblocks/scripts/block_cpu | 3 - .../suckless/dwmblocks/scripts/block_layout | 3 - .../suckless/dwmblocks/scripts/block_memory | 3 - .../suckless/dwmblocks/scripts/block_volume | 5 - .../suckless/dwmblocks/scripts/block_wifi | 11 - user/.config/suckless/herbe/.gitignore | 3 - user/.config/suckless/herbe/LICENSE | 21 - user/.config/suckless/herbe/Makefile | 25 - user/.config/suckless/herbe/README.md | 139 - user/.config/suckless/herbe/config.def.h | 19 - user/.config/suckless/herbe/herbe.c | 233 - user/.config/suckless/herbe/notify-send | 81 - user/.config/suckless/herbe/patches/19.diff | 100 - user/.config/suckless/slock/Makefile | 61 - user/.config/suckless/slock/arg.h | 65 - user/.config/suckless/slock/config.def.h | 28 - user/.config/suckless/slock/config.mk | 32 - user/.config/suckless/slock/explicit_bzero.c | 19 - user/.config/suckless/slock/lockscreen.jpg | Bin 275735 -> 0 bytes ...ock-background-image-20220318-1c5a538.diff | 149 - .../slock-colormessage-20200210-35633d4.diff | 284 - .../slock-pam_auth-20190207-35633d4.diff | 154 - user/.config/suckless/slock/slock.1 | 46 - user/.config/suckless/slock/slock.c | 635 -- user/.config/suckless/slock/util.h | 2 - user/.config/user-dirs.dirs | 15 - user/.config/vifm/colors/Default.vifm | 87 - .../.config/vifm/colors/gruvbox-dark.vifm | 0 user/.config/vifm/scripts/README | 6 - user/.config/vifm/scripts/vifmimg | 53 - user/.config/vifm/scripts/vifmrun | 15 - user/.config/vifm/vifmrc | 34 +- {new-config => user}/.config/waybar/config | 0 .../.config/waybar/power-profiles | 0 {new-config => user}/.config/waybar/style.css | 0 user/.config/wezterm/wezterm.lua | 5 +- .../.config/xsettingsd/xsettingsd.conf | 0 user/.config/zathura/zathurarc | 2 +- user/.gitconfig | 4 - user/.gtkrc-2.0 | 14 - user/.icons/default/index.theme | 2 +- user/.moc/config | 697 -- user/.moc/themes/black_theme | 34 - user/.moc/themes/darkdot_theme | 34 - user/.moc/themes/example_theme | 125 - user/.moc/themes/green_theme | 35 - user/.moc/themes/moca_theme | 36 - user/.moc/themes/nightly_theme | 34 - user/.moc/themes/red_theme | 36 - user/.moc/themes/transparent-background | 34 - user/.moc/themes/yellow_red_theme | 35 - {new-config => user}/.winitrc | 0 user/.xinitrc | 42 - {new-config => user}/dependencies.md | 0 222 files changed, 2260 insertions(+), 30926 deletions(-) delete mode 100644 new-config/.bash_profile delete mode 100644 new-config/.bashrc delete mode 100644 new-config/.config/btop/btop.conf delete mode 100644 new-config/.config/dunst/critical.png delete mode 100644 new-config/.config/dunst/dunstrc delete mode 100644 new-config/.config/dunst/normal.png delete mode 100644 new-config/.config/fish/config.fish delete mode 100644 new-config/.config/gtk-2.0/gtkfilechooser.ini delete mode 100644 new-config/.config/gtk-3.0/settings.ini delete mode 100644 new-config/.config/lvim/config.lua delete mode 100644 new-config/.config/mpv/input.conf delete mode 100644 new-config/.config/newsboat/config delete mode 100644 new-config/.config/newsboat/urls delete mode 100644 new-config/.config/qt5ct/qt5ct.conf delete mode 100644 new-config/.config/qt6ct/qt6ct.conf delete mode 100644 new-config/.config/rofi/config.rasi delete mode 100755 new-config/.config/rofi/scripts/rofi_emoji delete mode 100755 new-config/.config/rofi/scripts/rofi_power delete mode 100755 new-config/.config/rofi/scripts/rofi_scrot delete mode 100755 new-config/.config/rofi/scripts/rofi_wall delete mode 100755 new-config/.config/rofi/scripts/rofi_wifi delete mode 100644 new-config/.config/rofi/themes/gruvbox-dark.rasi delete mode 100644 new-config/.config/starship.toml delete mode 100644 new-config/.config/vifm/vifm-help.txt delete mode 100644 new-config/.config/vifm/vifmrc delete mode 100644 new-config/.config/wezterm/wezterm.lua delete mode 100644 new-config/.config/zathura/zathurarc delete mode 100644 new-config/.icons/default/index.theme delete mode 100644 user/.bash_logout delete mode 100644 user/.config/alacritty/alacritty.yml delete mode 100644 user/.config/awesome/apps.lua delete mode 100644 user/.config/awesome/autostart.lua delete mode 100644 user/.config/awesome/helpers.lua delete mode 100644 user/.config/awesome/keymaps/keyboard.lua delete mode 100644 user/.config/awesome/keymaps/mouse.lua delete mode 100644 user/.config/awesome/modules/custom-layouts/centerwork.lua delete mode 100644 user/.config/awesome/rc.lua delete mode 100644 user/.config/awesome/ui/bar.lua delete mode 100644 user/.config/awesome/ui/icons/centerworkw.png delete mode 100644 user/.config/awesome/ui/icons/cornerne.png delete mode 100644 user/.config/awesome/ui/icons/cornernew.png delete mode 100644 user/.config/awesome/ui/icons/cornernw.png delete mode 100644 user/.config/awesome/ui/icons/cornernww.png delete mode 100644 user/.config/awesome/ui/icons/cornerse.png delete mode 100644 user/.config/awesome/ui/icons/cornersew.png delete mode 100644 user/.config/awesome/ui/icons/cornersw.png delete mode 100644 user/.config/awesome/ui/icons/cornersww.png delete mode 100644 user/.config/awesome/ui/icons/dwindle.png delete mode 100644 user/.config/awesome/ui/icons/dwindlew.png delete mode 100644 user/.config/awesome/ui/icons/fairh.png delete mode 100644 user/.config/awesome/ui/icons/fairhw.png delete mode 100644 user/.config/awesome/ui/icons/fairv.png delete mode 100644 user/.config/awesome/ui/icons/fairvw.png delete mode 100644 user/.config/awesome/ui/icons/floating.png delete mode 100644 user/.config/awesome/ui/icons/floatingw.png delete mode 100644 user/.config/awesome/ui/icons/fullscreen.png delete mode 100644 user/.config/awesome/ui/icons/fullscreenw.png delete mode 100644 user/.config/awesome/ui/icons/magnifier.png delete mode 100644 user/.config/awesome/ui/icons/magnifierw.png delete mode 100644 user/.config/awesome/ui/icons/max.png delete mode 100644 user/.config/awesome/ui/icons/maxw.png delete mode 100644 user/.config/awesome/ui/icons/spiral.png delete mode 100644 user/.config/awesome/ui/icons/spiralw.png delete mode 100644 user/.config/awesome/ui/icons/tile.png delete mode 100644 user/.config/awesome/ui/icons/tilebottom.png delete mode 100644 user/.config/awesome/ui/icons/tilebottomw.png delete mode 100644 user/.config/awesome/ui/icons/tileleft.png delete mode 100644 user/.config/awesome/ui/icons/tileleftw.png delete mode 100644 user/.config/awesome/ui/icons/tiletop.png delete mode 100644 user/.config/awesome/ui/icons/tiletopw.png delete mode 100644 user/.config/awesome/ui/icons/tilew.png delete mode 100644 user/.config/awesome/ui/layouts.lua delete mode 100644 user/.config/awesome/ui/notif.lua delete mode 100644 user/.config/awesome/ui/rules.lua delete mode 100644 user/.config/awesome/ui/theme.lua delete mode 100755 user/.config/awesome/ui/widgets/battery delete mode 100755 user/.config/awesome/ui/widgets/brightness delete mode 100755 user/.config/awesome/ui/widgets/layout delete mode 100755 user/.config/awesome/ui/widgets/volume delete mode 100755 user/.config/awesome/ui/widgets/wifi rename {new-config => user}/.config/git/config (100%) rename {new-config => user}/.config/gtk-2.0/gtkrc-2.0 (100%) delete mode 100644 user/.config/hilbish/init.lua rename {new-config => user}/.config/hypr/hyprland.conf (99%) delete mode 100644 user/.config/lvim/plugin/packer_compiled.lua delete mode 100644 user/.config/musikcube/hotkeys.json delete mode 100644 user/.config/neofetch/config.conf delete mode 100644 user/.config/picom/picom.conf delete mode 100644 user/.config/qutebrowser/bookmarks/urls delete mode 100644 user/.config/qutebrowser/config.py delete mode 100644 user/.config/qutebrowser/gruvbox.py rename {new-config => user}/.config/rofi/scripts/rofi_blue (100%) rename {new-config => user}/.config/rofi/scripts/rofi_mount (100%) delete mode 100644 user/.config/suckless/dmenu/Makefile delete mode 100644 user/.config/suckless/dmenu/arg.h delete mode 100644 user/.config/suckless/dmenu/config.def.h delete mode 100644 user/.config/suckless/dmenu/config.mk delete mode 100644 user/.config/suckless/dmenu/dmenu.1 delete mode 100644 user/.config/suckless/dmenu/dmenu.c delete mode 100755 user/.config/suckless/dmenu/dmenu_path delete mode 100755 user/.config/suckless/dmenu/dmenu_run delete mode 100644 user/.config/suckless/dmenu/drw.c delete mode 100644 user/.config/suckless/dmenu/drw.h delete mode 100644 user/.config/suckless/dmenu/patches/dmenu-fuzzymatch-4.9.diff delete mode 100644 user/.config/suckless/dmenu/patches/dmenu-highlight-20201211-fcdc159.diff delete mode 100644 user/.config/suckless/dmenu/patches/dmenu-mousesupport-5.2.diff delete mode 100644 user/.config/suckless/dmenu/patches/dmenu-mousesupport-motion-5.2.diff delete mode 100644 user/.config/suckless/dmenu/patches/dmenu-password-5.0.diff delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_blue delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_drun delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_edit delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_emoji delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_power delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_scrot delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_wall delete mode 100755 user/.config/suckless/dmenu/scripts/dmenu_wifi delete mode 100644 user/.config/suckless/dmenu/stest.1 delete mode 100644 user/.config/suckless/dmenu/stest.c delete mode 100644 user/.config/suckless/dmenu/util.c delete mode 100644 user/.config/suckless/dmenu/util.h delete mode 100644 user/.config/suckless/dwm/Makefile delete mode 100755 user/.config/suckless/dwm/autostart delete mode 100644 user/.config/suckless/dwm/config.def.h delete mode 100644 user/.config/suckless/dwm/config.mk delete mode 100644 user/.config/suckless/dwm/dependencies.txt delete mode 100644 user/.config/suckless/dwm/drw.c delete mode 100644 user/.config/suckless/dwm/drw.h delete mode 100644 user/.config/suckless/dwm/dwm.1 delete mode 100644 user/.config/suckless/dwm/dwm.c delete mode 100644 user/.config/suckless/dwm/dwm.png delete mode 100644 user/.config/suckless/dwm/movestack.c delete mode 100644 user/.config/suckless/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-attachbottom-6.3.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-autostart-20161205-bb3bd6f.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-movestack-20211115-a786211.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-pertag-20200914-61bb8b2.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-restartsig-20180523-6.2.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-scratchpads-20200414-728d397b.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-statuspadding-6.3.diff delete mode 100644 user/.config/suckless/dwm/patches/dwm-warp-6.2.diff delete mode 100644 user/.config/suckless/dwm/tcl.c delete mode 100644 user/.config/suckless/dwm/transient.c delete mode 100644 user/.config/suckless/dwm/util.c delete mode 100644 user/.config/suckless/dwm/util.h delete mode 100644 user/.config/suckless/dwmblocks/Makefile delete mode 100644 user/.config/suckless/dwmblocks/blocks.def.h delete mode 100644 user/.config/suckless/dwmblocks/dwmblocks.c delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_battery delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_brightness delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_clock delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_cpu delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_layout delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_memory delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_volume delete mode 100755 user/.config/suckless/dwmblocks/scripts/block_wifi delete mode 100644 user/.config/suckless/herbe/.gitignore delete mode 100644 user/.config/suckless/herbe/LICENSE delete mode 100644 user/.config/suckless/herbe/Makefile delete mode 100644 user/.config/suckless/herbe/README.md delete mode 100644 user/.config/suckless/herbe/config.def.h delete mode 100644 user/.config/suckless/herbe/herbe.c delete mode 100755 user/.config/suckless/herbe/notify-send delete mode 100644 user/.config/suckless/herbe/patches/19.diff delete mode 100644 user/.config/suckless/slock/Makefile delete mode 100644 user/.config/suckless/slock/arg.h delete mode 100644 user/.config/suckless/slock/config.def.h delete mode 100644 user/.config/suckless/slock/config.mk delete mode 100644 user/.config/suckless/slock/explicit_bzero.c delete mode 100644 user/.config/suckless/slock/lockscreen.jpg delete mode 100644 user/.config/suckless/slock/patchs/slock-background-image-20220318-1c5a538.diff delete mode 100644 user/.config/suckless/slock/patchs/slock-colormessage-20200210-35633d4.diff delete mode 100644 user/.config/suckless/slock/patchs/slock-pam_auth-20190207-35633d4.diff delete mode 100644 user/.config/suckless/slock/slock.1 delete mode 100644 user/.config/suckless/slock/slock.c delete mode 100644 user/.config/suckless/slock/util.h delete mode 100644 user/.config/user-dirs.dirs delete mode 100644 user/.config/vifm/colors/Default.vifm rename {new-config => user}/.config/vifm/colors/gruvbox-dark.vifm (100%) delete mode 100644 user/.config/vifm/scripts/README delete mode 100755 user/.config/vifm/scripts/vifmimg delete mode 100755 user/.config/vifm/scripts/vifmrun rename {new-config => user}/.config/waybar/config (100%) rename {new-config => user}/.config/waybar/power-profiles (100%) rename {new-config => user}/.config/waybar/style.css (100%) rename {new-config => user}/.config/xsettingsd/xsettingsd.conf (100%) delete mode 100644 user/.gitconfig delete mode 100644 user/.gtkrc-2.0 delete mode 100644 user/.moc/config delete mode 100644 user/.moc/themes/black_theme delete mode 100644 user/.moc/themes/darkdot_theme delete mode 100644 user/.moc/themes/example_theme delete mode 100644 user/.moc/themes/green_theme delete mode 100644 user/.moc/themes/moca_theme delete mode 100644 user/.moc/themes/nightly_theme delete mode 100644 user/.moc/themes/red_theme delete mode 100644 user/.moc/themes/transparent-background delete mode 100644 user/.moc/themes/yellow_red_theme rename {new-config => user}/.winitrc (100%) delete mode 100755 user/.xinitrc rename {new-config => user}/dependencies.md (100%) diff --git a/new-config/.bash_profile b/new-config/.bash_profile deleted file mode 100644 index da13e7f19..000000000 --- a/new-config/.bash_profile +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom bash_profile config -## - -### STARTING XSESSION -if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ] -then - sh $HOME/.winitrc - logout -fi - -### ENVIRONMENT VARIABLES -export EDITOR="lvim" # $EDITOR use lunarvim in terminal -export XDG_DATA_HOME="${XDG_DATA_HOME:="$HOME/.local/share"}" -export XDG_CACHE_HOME="${XDG_CACHE_HOME:="$HOME/.cache"}" -export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:="$HOME/.config"}" - -### BASHRC -source "$HOME"/.bashrc # Load the bashrc diff --git a/new-config/.bashrc b/new-config/.bashrc deleted file mode 100644 index 45597d467..000000000 --- a/new-config/.bashrc +++ /dev/null @@ -1,238 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom bash config -## - -### EXPORT ### -export TERM="xterm-256color" # getting proper colors -export HISTCONTROL=ignoredups:erasedups # no duplicate entries -export EDITOR="$HOME/.local/bin/lvim" -export VISUAL="wezterm start --class editor -- $HOME/.local/bin/lvim" - -### "bat" as manpager -export MANPAGER="sh -c 'col -bx | bat -l man -p'" - -# use bash-completion, if available -[[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ - . /usr/share/bash-completion/bash_completion - -# if not running interactively, don't do anything -[[ $- != *i* ]] && return - -# use neovim for vim if present. -[ -x "$(command -v $HOME/.local/bin/lvim)" ] && alias vim="lvim" - -### SET VI MODE ### -# Comment this line out to enable default emacs-like bindings -set -o vi -bind -m vi-command 'Control-l: clear-screen' -bind -m vi-insert 'Control-l: clear-screen' - -### PATH ### -if [ -d "$HOME/.bin" ] ; - then PATH="$HOME/.bin:$PATH" -fi -if [ -d "$HOME/.local/bin" ] ; - then PATH="$HOME/.local/bin:$PATH" -fi -if [ -d "$HOME/Applications" ] ; - then PATH="$HOME/Applications:$PATH" -fi - -### CHANGE TITLE OF TERMINALS ### -case ${TERM} in - xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|alacritty|st|konsole*) - PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"' - ;; - screen*) - PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"' - ;; -esac - -### SHOPT ### -shopt -s autocd # change to named directory -shopt -s cdspell # autocorrects cd misspellings -shopt -s cmdhist # save multi-line commands in history as single line -shopt -s dotglob -shopt -s histappend # do not overwrite history -shopt -s expand_aliases # expand aliases -shopt -s checkwinsize # checks term size when bash regains control - -# ignore upper and lowercase when TAB completion -bind "set completion-ignore-case on" - -# sudo not required for some system commands -for command in cryptsetup mount umount poweroff reboot ; do -alias $command="sudo $command" -done; unset command - -### ARCHIVE EXTRACTION ### -# usage: ex -ex () -{ - if [ -f "$1" ] ; then - case $1 in - *.tar.bz2) tar xjf "$1" ;; - *.tar.gz) tar xzf "$1" ;; - *.bz2) bunzip2 "$1" ;; - *.rar) unrar x "$1" ;; - *.gz) gunzip "$1" ;; - *.tar) tar xf "$1" ;; - *.tbz2) tar xjf "$1" ;; - *.tgz) tar xzf "$1" ;; - *.zip) unzip "$1" ;; - *.Z) uncompress "$1";; - *.7z) 7zz x "$1" ;; - *.deb) ar x "$1" ;; - *.tar.xz) tar xf "$1" ;; - *.tar.zst) unzstd "$1" ;; - *) echo "'$1' cannot be extracted via ex()" ;; - esac - else - echo "'$1' is not a valid file" - fi -} - -### ALIASES ### -# navigation -up () { - local d="" - local limit="$1" - - # Default to limit of 1 - if [ -z "$limit" ] || [ "$limit" -le 0 ]; then - limit=1 - fi - - for ((i=1;i<=limit;i++)); do - d="../$d" - done - - # perform cd. Show error if cd fails - if ! cd "$d"; then - echo "Couldn't go up $limit dirs."; - fi -} - -# cd -alias \ - ..="cd .." \ - .2="cd ../.." \ - .3="cd ../../.." \ - .4="cd ../../../.." \ - .5="cd ../../../../.." - -# bat as cat -[ -x "$(command -v bat)" ] && alias cat="bat" - -# pfetch as neofetch -[ -x "$(command -v pfetch)" ] && alias neofetch="pfetch" - -# Changing "ls" to "exa" -alias \ - ls="exa -al --icons --color=always --group-directories-first" \ - la="exa -a --icons --color=always --group-directories-first" \ - ll="exa -l --icons --color=always --group-directories-first" \ - lt="exa -aT --icons --color=always --group-directories-first" \ - l.='exa -a | grep -E "^\."' - -# pacman -alias \ - pac-up="paru -Syu" \ - pac-get="paru -S" \ - pac-rmv="paru -Rcns" \ - pac-rmv-sec="paru -R" \ - pac-qry="paru -Ss" \ - pac-cln="paru -Scc && paru -Rns $(pacman -Qtdq)" - -# colorize grep output (good for log files) -alias \ - grep="grep --color=auto" \ - egrep="egrep --color=auto" \ - fgrep="fgrep --color=auto" - -# git -alias \ - git-adu="git add -u" \ - git-adl="git add ." \ - git-brn="git branch" \ - git-chk="git checkout" \ - git-cln="git clone" \ - git-cmt="git commit -m" \ - git-fth="git fetch" \ - git-pll="git pull origin" \ - git-psh="git push origin" \ - git-sts="git status" \ - git-tag="git tag" \ - git-ntg="git tag -a" - -# adding flags -alias \ - df="df -h" \ - free="free -m" - -# multimedia scripts -alias \ - fli="flix-cli" \ - ani="ani-cli" \ - aniq="ani-cli -q" - -# audio -alias \ - mx="pulsemixer" \ - amx="alsamixer" \ - mk="cmus" \ - ms="cmus" \ - music="cmus" - -# power management -alias \ - po="systemctl poweroff" \ - sp="systemctl suspend" \ - rb="systemctl reboot" - -# file management -alias \ - fm="vifm" \ - file="vifm" \ - flm="vifm" \ - rm="rm -vI" \ - mv="mv -iv" \ - cp="cp -iv" \ - mkd="mkdir -pv" - -# ps -alias \ - psa="ps auxf" \ - psgrep="ps aux | grep -v grep | grep -i -e VSZ -e" \ - psmem="ps auxf | sort -nr -k 4" \ - pscpu="ps auxf | sort -nr -k 3" - -# youtube -alias \ - yta-aac="yt-dlp --extract-audio --audio-format aac" \ - yta-best="yt-dlp --extract-audio --audio-format best" \ - yta-flac="yt-dlp --extract-audio --audio-format flac" \ - yta-m4a="yt-dlp --extract-audio --audio-format m4a" \ - yta-mp3="yt-dlp --extract-audio --audio-format mp3" \ - yta-opus="yt-dlp --extract-audio --audio-format opus" \ - yta-vorbis="yt-dlp --extract-audio --audio-format vorbis" \ - yta-wav="yt-dlp --extract-audio --audio-format wav" \ - ytv-best="yt-dlp -f bestvideo+bestaudio" \ - yt="ytfzf -ftsl" \ - ytm="ytfzf -mtsl" - -# network and bluetooth -alias \ - netstats="nmcli dev" \ - wfi="nmtui-connect" \ - wfi-scan="nmcli dev wifi rescan && nmcli dev wifi list" \ - wfi-edit="nmtui-edit" \ - wfi-on="nmcli radio wifi on" \ - wfi-off="nmcli radio wifi off" \ - blt="bluetoothctl" - -### SETTING THE STARSHIP PROMPT ### -eval "$(starship init bash)" diff --git a/new-config/.config/btop/btop.conf b/new-config/.config/btop/btop.conf deleted file mode 100644 index cf427fc49..000000000 --- a/new-config/.config/btop/btop.conf +++ /dev/null @@ -1,212 +0,0 @@ -#? Config file for btop v. 1.2.13 - -#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes. -#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes" -color_theme = "/usr/share/btop/themes/gruvbox_dark_v2.theme" - -#* If the theme set background should be shown, set to False if you want terminal background transparency. -theme_background = False - -#* Sets if 24-bit truecolor should be used, will convert 24-bit colors to 256 color (6x6x6 color cube) if false. -truecolor = True - -#* Set to true to force tty mode regardless if a real tty has been detected or not. -#* Will force 16-color mode and TTY theme, set all graph symbols to "tty" and swap out other non tty friendly symbols. -force_tty = False - -#* Define presets for the layout of the boxes. Preset 0 is always all boxes shown with default settings. Max 9 presets. -#* Format: "box_name:P:G,box_name:P:G" P=(0 or 1) for alternate positions, G=graph symbol to use for box. -#* Use whitespace " " as separator between different presets. -#* Example: "cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty" -presets = "cpu:1:default,proc:0:default cpu:0:default,mem:0:default,net:0:default cpu:0:block,net:0:tty" - -#* Set to True to enable "h,j,k,l,g,G" keys for directional control in lists. -#* Conflicting keys for h:"help" and k:"kill" is accessible while holding shift. -vim_keys = True - -#* Rounded corners on boxes, is ignored if TTY mode is ON. -rounded_corners = True - -#* Default symbols to use for graph creation, "braille", "block" or "tty". -#* "braille" offers the highest resolution but might not be included in all fonts. -#* "block" has half the resolution of braille but uses more common characters. -#* "tty" uses only 3 different symbols but will work with most fonts and should work in a real TTY. -#* Note that "tty" only has half the horizontal resolution of the other two, so will show a shorter historical view. -graph_symbol = "braille" - -# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". -graph_symbol_cpu = "default" - -# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". -graph_symbol_mem = "default" - -# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". -graph_symbol_net = "default" - -# Graph symbol to use for graphs in cpu box, "default", "braille", "block" or "tty". -graph_symbol_proc = "default" - -#* Manually set which boxes to show. Available values are "cpu mem net proc", separate values with whitespace. -shown_boxes = "cpu mem net proc" - -#* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. -update_ms = 200 - -#* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", -#* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. -proc_sorting = "cpu lazy" - -#* Reverse sorting order, True or False. -proc_reversed = False - -#* Show processes as a tree. -proc_tree = False - -#* Use the cpu graph colors in the process list. -proc_colors = True - -#* Use a darkening gradient in the process list. -proc_gradient = True - -#* If process cpu usage should be of the core it's running on or usage of the total available cpu power. -proc_per_core = False - -#* Show process memory as bytes instead of percent. -proc_mem_bytes = True - -#* Show cpu graph for each process. -proc_cpu_graphs = True - -#* Use /proc/[pid]/smaps for memory information in the process info box (very slow but more accurate) -proc_info_smaps = False - -#* Show proc box on left side of screen instead of right. -proc_left = False - -#* (Linux) Filter processes tied to the Linux kernel(similar behavior to htop). -proc_filter_kernel = False - -#* Sets the CPU stat shown in upper half of the CPU graph, "total" is always available. -#* Select from a list of detected attributes from the options menu. -cpu_graph_upper = "total" - -#* Sets the CPU stat shown in lower half of the CPU graph, "total" is always available. -#* Select from a list of detected attributes from the options menu. -cpu_graph_lower = "total" - -#* Toggles if the lower CPU graph should be inverted. -cpu_invert_lower = True - -#* Set to True to completely disable the lower CPU graph. -cpu_single_graph = False - -#* Show cpu box at bottom of screen instead of top. -cpu_bottom = False - -#* Shows the system uptime in the CPU box. -show_uptime = True - -#* Show cpu temperature. -check_temp = True - -#* Which sensor to use for cpu temperature, use options menu to select from list of available sensors. -cpu_sensor = "Auto" - -#* Show temperatures for cpu cores also if check_temp is True and sensors has been found. -show_coretemp = True - -#* Set a custom mapping between core and coretemp, can be needed on certain cpus to get correct temperature for correct core. -#* Use lm-sensors or similar to see which cores are reporting temperatures on your machine. -#* Format "x:y" x=core with wrong temp, y=core with correct temp, use space as separator between multiple entries. -#* Example: "4:0 5:1 6:3" -cpu_core_map = "" - -#* Which temperature scale to use, available values: "celsius", "fahrenheit", "kelvin" and "rankine". -temp_scale = "celsius" - -#* Use base 10 for bits/bytes sizes, KB = 1000 instead of KiB = 1024. -base_10_sizes = False - -#* Show CPU frequency. -show_cpu_freq = True - -#* Draw a clock at top of screen, formatting according to strftime, empty string to disable. -#* Special formatting: /host = hostname | /user = username | /uptime = system uptime -clock_format = "%X" - -#* Update main ui in background when menus are showing, set this to false if the menus is flickering too much for comfort. -background_update = True - -#* Custom cpu model name, empty string to disable. -custom_cpu_name = "" - -#* Optional filter for shown disks, should be full path of a mountpoint, separate multiple values with whitespace " ". -#* Begin line with "exclude=" to change to exclude filter, otherwise defaults to "most include" filter. Example: disks_filter="exclude=/boot /home/user". -disks_filter = "" - -#* Show graphs instead of meters for memory values. -mem_graphs = True - -#* Show mem box below net box instead of above. -mem_below_net = False - -#* Count ZFS ARC in cached and available memory. -zfs_arc_cached = True - -#* If swap memory should be shown in memory box. -show_swap = True - -#* Show swap as a disk, ignores show_swap value above, inserts itself after first disk. -swap_disk = True - -#* If mem box should be split to also show disks info. -show_disks = True - -#* Filter out non physical disks. Set this to False to include network disks, RAM disks and similar. -only_physical = True - -#* Read disks list from /etc/fstab. This also disables only_physical. -use_fstab = True - -#* Setting this to True will hide all datasets, and only show ZFS pools. (IO stats will be calculated per-pool) -zfs_hide_datasets = False - -#* Set to true to show available disk space for privileged users. -disk_free_priv = False - -#* Toggles if io activity % (disk busy time) should be shown in regular disk usage view. -show_io_stat = True - -#* Toggles io mode for disks, showing big graphs for disk read/write speeds. -io_mode = False - -#* Set to True to show combined read/write io graphs in io mode. -io_graph_combined = False - -#* Set the top speed for the io graphs in MiB/s (100 by default), use format "mountpoint:speed" separate disks with whitespace " ". -#* Example: "/mnt/media:100 /:20 /boot:1". -io_graph_speeds = "" - -#* Set fixed values for network graphs in Mebibits. Is only used if net_auto is also set to False. -net_download = 100 - -net_upload = 100 - -#* Use network graphs auto rescaling mode, ignores any values set above and rescales down to 10 Kibibytes at the lowest. -net_auto = True - -#* Sync the auto scaling for download and upload to whichever currently has the highest scale. -net_sync = True - -#* Starts with the Network Interface specified here. -net_iface = "" - -#* Show battery stats in top right if battery is present. -show_battery = True - -#* Which battery to use if multiple are present. "Auto" for auto detection. -selected_battery = "Auto" - -#* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". -#* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. -log_level = "WARNING" diff --git a/new-config/.config/dunst/critical.png b/new-config/.config/dunst/critical.png deleted file mode 100644 index b36d5b22a20e64ebccc255f41e6a4fc5114c7482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35927 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 P00000NkvXXu0mjf^B0Xh diff --git a/new-config/.config/dunst/dunstrc b/new-config/.config/dunst/dunstrc deleted file mode 100644 index 3cbe6d6f8..000000000 --- a/new-config/.config/dunst/dunstrc +++ /dev/null @@ -1,359 +0,0 @@ -[global] - ### Display ### - - # Which monitor should the notifications be displayed on. - monitor = 0 - - # Display notification on focused monitor. Possible modes are: - # mouse: follow mouse pointer - # keyboard: follow window with keyboard focus - # none: don't follow anything - # - # "keyboard" needs a window manager that exports the - # _NET_ACTIVE_WINDOW property. - # This should be the case for almost all modern window managers. - # - # If this option is set to mouse or keyboard, the monitor option - # will be ignored. - follow = mouse - - # Show how many messages are currently hidden (because of geometry). - indicate_hidden = yes - - # Shrink window if it's smaller than the width. Will be ignored if - # width is 0. - shrink = no - - # The transparency of the window. Range: [0; 100]. - # This option will only work if a compositing window manager is - # present (e.g. xcompmgr, compiz, etc.). - transparency = 30 - - # Draw a line of "separator_height" pixel height between two - # notifications. - # Set to 0 to disable. - separator_height = 2 - - # Padding between text and separator. - padding = 8 - - # Horizontal padding. - horizontal_padding = 8 - - # Defines width in pixels of frame around the notification window. - # Set to 0 to disable. - frame_width = 3 - - # Defines color of the frame around the notification window. - frame_color = "#fb4934" - - # Define a color for the separator. - # possible values are: - # * auto: dunst tries to find a color fitting to the background; - # * foreground: use the same color as the foreground; - # * frame: use the same color as the frame; - # * anything else will be interpreted as a X color. - separator_color = auto - - # Sort messages by urgency. - sort = yes - - # Don't remove messages, if the user is idle (no mouse or keyboard input) - # for longer than idle_threshold seconds. - # Set to 0 to disable. - # A client can set the 'transient' hint to bypass this. See the rules - # section for how to disable this if necessary - idle_threshold = 120 - - ### Text ### - font = mononoki Nerd Font 10 - - # The spacing between lines. If the height is smaller than the - # font height, it will get raised to the font height. - line_height = 0 - - # Possible values are: - # full: Allow a small subset of html markup in notifications: - # bold - # italic - # strikethrough - # underline - # - # For a complete reference see - # . - # - # strip: This setting is provided for compatibility with some broken - # clients that send markup even though it's not enabled on the - # server. Dunst will try to strip the markup but the parsing is - # simplistic so using this option outside of matching rules for - # specific applications *IS GREATLY DISCOURAGED*. - # - # no: Disable markup parsing, incoming notifications will be treated as - # plain text. Dunst will not advertise that it has the body-markup - # capability if this is set as a global setting. - # - # It's important to note that markup inside the format option will be parsed - # regardless of what this is set to. - markup = full - - # The format of the message. Possible variables are: - # %a appname - # %s summary - # %b body - # %i iconname (including its path) - # %I iconname (without its path) - # %p progress value if set ([ 0%] to [100%]) or nothing - # %n progress value if set without any extra characters - # %% Literal % - # Markup is allowed - format = "%s\n%b" - - # Alignment of message text. - # Possible values are "left", "center" and "right". - alignment = center - - # Show age of message if message is older than show_age_threshold - # seconds. - # Set to -1 to disable. - show_age_threshold = 60 - - # Split notifications into multiple lines if they don't fit into - # geometry. - word_wrap = yes - - # When word_wrap is set to no, specify where to make an ellipsis in long lines. - # Possible values are "start", "middle" and "end". - ellipsize = middle - - # Ignore newlines '\n' in notifications. - ignore_newline = no - - # Stack together notifications with the same content - stack_duplicates = true - - # Hide the count of stacked notifications with the same content - hide_duplicate_count = false - - # Display indicators for URLs (U) and actions (A). - show_indicators = yes - - ### Icons ### - - # Align icons left/right/off - icon_position = left - - # Scale larger icons down to this size, set to 0 to disable - max_icon_size = 32 - - # Paths to default icons. - icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ - - ### History ### - - # Should a notification popped up from history be sticky or timeout - # as if it would normally do. - sticky_history = yes - - # Maximum amount of notifications kept in history - history_length = 20 - - ### Misc/Advanced ### - - # dmenu path. - dmenu = /usr/bin/dmenu -p dunst: - - # Browser for opening urls in context menu. - browser = /usr/bin/firefox - - # Always run rule-defined scripts, even if the notification is suppressed - always_run_script = true - - # Define the title of the windows spawned by dunst - title = Dunst - - # Define the class of the windows spawned by dunst - class = Dunst - - # Define the corner radius of the notification window - # in pixel size. If the radius is 0, you have no rounded - # corners. - # The radius will be automatically lowered if it exceeds half of the - # notification height to avoid clipping text and/or icons. - corner_radius = 7 - - ### Legacy - - # Use the Xinerama extension instead of RandR for multi-monitor support. - # This setting is provided for compatibility with older nVidia drivers that - # do not support RandR and using it on systems that support RandR is highly - # discouraged. - # - # By enabling this setting dunst will not be able to detect when a monitor - # is connected or disconnected which might break follow mode if the screen - # layout changes. - force_xinerama = false - - ### mouse - - # Defines action of mouse event - # Possible values are: - # * none: Don't do anything. - # * do_action: If the notification has exactly one action, or one is marked as default, - # invoke it. If there are multiple and no default, open the context menu. - # * close_current: Close current notification. - # * close_all: Close all notifications. - mouse_left_click = do_action - mouse_middle_click = close_all - mouse_right_click = close_current - -# Experimental features that may or may not work correctly. Do not expect them -# to have a consistent behaviour across releases. -[experimental] - # Calculate the dpi to use on a per-monitor basis. - # If this setting is enabled the Xft.dpi value will be ignored and instead - # dunst will attempt to calculate an appropriate dpi value for each monitor - # using the resolution and physical size. This might be useful in setups - # where there are multiple screens with very different dpi values. - per_monitor_dpi = false - -[urgency_low] - # IMPORTANT: colors have to be defined in quotation marks. - # Otherwise the "#" and following would be interpreted as a comment. - background = "#282828" - foreground = "#ebdbd2" - timeout = 5 - # Icon for notifications with low urgency, uncomment to enable - icon = /home/drk/.config/dunst/normal.png - -[urgency_normal] - background = "#282828" - foreground = "#ebdbd2" - timeout = 5 - # Icon for notifications with normal urgency, uncomment to enable - icon = /home/drk/.config/dunst/normal.png - -[urgency_critical] - background = "#900000" - foreground = "#ebdbd2" - frame_color = "#ff0000" - timeout = 5 - # Icon for notifications with critical urgency, uncomment to enable - icon = /home/drk/.config/dunst/critical.png - -# Every section that isn't one of the above is interpreted as a rules to -# override settings for certain messages. -# -# Messages can be matched by -# appname (discouraged, see desktop_entry) -# body -# category -# desktop_entry -# icon -# match_transient -# msg_urgency -# stack_tag -# summary -# -# and you can override the -# background -# foreground -# format -# frame_color -# fullscreen -# new_icon -# set_stack_tag -# set_transient -# timeout -# urgency -# -# Shell-like globbing will get expanded. -# -# Instead of the appname filter, it's recommended to use the desktop_entry filter. -# GLib based applications export their desktop-entry name. In comparison to the appname, -# the desktop-entry won't get localized. -# -# SCRIPTING -# You can specify a script that gets run when the rule matches by -# setting the "script" option. -# The script will be called as follows: -# script appname summary body icon urgency -# where urgency can be "LOW", "NORMAL" or "CRITICAL". -# -# NOTE: if you don't want a notification to be displayed, set the format -# to "". -# NOTE: It might be helpful to run dunst -print in a terminal in order -# to find fitting options for rules. - -# Disable the transient hint so that idle_threshold cannot be bypassed from the -# client -#[transient_disable] -# match_transient = yes -# set_transient = no -# -# Make the handling of transient notifications more strict by making them not -# be placed in history. -#[transient_history_ignore] -# match_transient = yes -# history_ignore = yes - -# fullscreen values -# show: show the notifications, regardless if there is a fullscreen window opened -# delay: displays the new notification, if there is no fullscreen window active -# If the notification is already drawn, it won't get undrawn. -# pushback: same as delay, but when switching into fullscreen, the notification will get -# withdrawn from screen again and will get delayed like a new notification -#[fullscreen_delay_everything] -# fullscreen = delay -#[fullscreen_show_critical] -# msg_urgency = critical -# fullscreen = show - -#[espeak] -# summary = "*" -# script = dunst_espeak.sh - -#[script-test] -# summary = "*script*" -# script = dunst_test.sh - -#[ignore] -# # This notification will not be displayed -# summary = "foobar" -# format = "" - -#[history-ignore] -# # This notification will not be saved in history -# summary = "foobar" -# history_ignore = yes - -#[skip-display] -# # This notification will not be displayed, but will be included in the history -# summary = "foobar" -# skip_display = yes - -#[signed_on] -# appname = Pidgin -# summary = "*signed on*" -# urgency = low -# -#[signed_off] -# appname = Pidgin -# summary = *signed off* -# urgency = low -# -#[says] -# appname = Pidgin -# summary = *says* -# urgency = critical -# -#[twitter] -# appname = Pidgin -# summary = *twitter.com* -# urgency = normal -# -#[stack-volumes] -# appname = "some_volume_notifiers" -# set_stack_tag = "volume" -# -# vim: ft=cfg - diff --git a/new-config/.config/dunst/normal.png b/new-config/.config/dunst/normal.png deleted file mode 100644 index 505e12c93392262f693add945b7fdf9e671f7dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3895 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 diff --git a/new-config/.config/fish/config.fish b/new-config/.config/fish/config.fish deleted file mode 100644 index 979162e9a..000000000 --- a/new-config/.config/fish/config.fish +++ /dev/null @@ -1,241 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom fish config -## - -### ADDING TO THE PATH -# First line removes the path; second line sets it. Without the first line, -# your path gets massive and fish becomes very slow. -set -e fish_user_paths -set -U fish_user_paths $HOME/.bin $HOME/.local/bin $HOME/.config/emacs/bin $HOME/Applications /var/lib/flatpak/exports/bin/ $fish_user_paths - -### EXPORT ### -set fish_greeting # Supresses fish's intro message -set TERM "xterm-256color" # Sets the terminal type -set EDITOR "$HOME/.local/bin/lvim" -set VISUAL "wezterm start --class editor -- $HOME/.local/bin/lvim" - -### SET BAT AS MANPAGER -set -x MANPAGER "sh -c 'col -bx | bat -l man -p'" - -### SET EITHER DEFAULT EMACS MODE OR VI MODE ### -function fish_user_key_bindings - # fish_default_key_bindings - fish_vi_key_bindings -end -### END OF VI MODE ### - -### AUTOCOMPLETE AND HIGHLIGHT COLORS ### -set fish_color_normal brcyan -set fish_color_autosuggestion '#504945' -set fish_color_command brcyan -set fish_color_error '#fb4934' -set fish_color_param brcyan - - -### FUNCTIONS ### -# Functions needed for !! and !$ -function __history_previous_command - switch (commandline -t) - case "!" - commandline -t $history[1]; commandline -f repaint - case "*" - commandline -i ! - end -end - -function __history_previous_command_arguments - switch (commandline -t) - case "!" - commandline -t "" - commandline -f history-token-search-backward - case "*" - commandline -i '$' - end -end - -# The bindings for !! and !$ -if [ "$fish_key_bindings" = "fish_vi_key_bindings" ]; - bind -Minsert ! __history_previous_command - bind -Minsert '$' __history_previous_command_arguments -else - bind ! __history_previous_command - bind '$' __history_previous_command_arguments -end - -# Function for creating a backup file -# ex: backup file.txt -# result: copies file as file.txt.bak -function backup --argument filename - cp $filename $filename.bak -end - -# Function for copying files and directories, even recursively. -# ex: copy DIRNAME LOCATIONS -# result: copies the directory and all of its contents. -function copy - set count (count $argv | tr -d \n) - if test "$count" = 2; and test -d "$argv[1]" - set from (echo $argv[1] | trim-right /) - set to (echo $argv[2]) - command cp -r $from $to - else - command cp $argv - end -end - -# Function for printing a column (splits input on whitespace) -# ex: echo 1 2 3 | coln 3 -# output: 3 -function coln - while read -l input - echo $input | awk '{print $'$argv[1]'}' - end -end - -# Function for printing a row -# ex: seq 3 | rown 3 -# output: 3 -function rown --argument index - sed -n "$index p" -end - -# Function for ignoring the first 'n' lines -# ex: seq 10 | skip 5 -# results: prints everything but the first 5 lines -function skip --argument n - tail +(math 1 + $n) -end - -# Function for taking the first 'n' lines -# ex: seq 10 | take 5 -# results: prints only the first 5 lines -function take --argument number - head -$number -end -### END OF FUNCTIONS ### - -### ALIASES ### -# navigation -alias ..='cd ..' -alias ...='cd ../..' -alias .3='cd ../../..' -alias .4='cd ../../../..' -alias .5='cd ../../../../..' - -# neovim as vim -alias vim="$HOME/.local/bin/lvim" - -# newsboat -alias newsboat='newsboat -u ~/.config/newsboat/urls' - -# bat as cat -alias cat='bat' - -# pfetch as neofetch -alias neofetch='pfetch' - -# Changing "ls" to "exa" -alias ls='exa -al --color=always --group-directories-first' # my preferred listing -alias la='exa -a --color=always --group-directories-first' # all files and dirs -alias ll='exa -l --color=always --group-directories-first' # long format -alias lt='exa -aT --color=always --group-directories-first' # tree listing -alias l.='exa -a | egrep "^\."' - -# package management -alias pac-up='paru -Syu' -alias pac-get='paru -S' -alias pac-rmv='paru -Rcns' -alias pac-rmv-sec='paru -R' -alias pac-qry='paru -Ss' -alias pac-cln='paru -Scc && paru -Rns (pacman -Qtdq)' - -# Colorize grep output (good for log files) -alias grep='grep --color=auto' -alias egrep='egrep --color=auto' -alias fgrep='fgrep --color=auto' - -# file management -alias fm="vifm" -alias file="vifm" -alias flm="vifm" -alias cp='cp -iv' -alias mv='mv -iv' -alias rm='rm -vI' -alias mkd='mkdir -pv' -alias mkdir='mkdir -pv' - -# audio -alias mx='pulsemixer' -alias amx='alsamixer' -alias mk='cmus' -alias ms='cmus' -alias music='cmus' - -# multimedia scripts -alias fli='flix-cli' -alias ani='ani-cli' -alias aniq='ani-cli -q' - -# adding flags -alias df='df -h' # human-readable sizes -alias free='free -m' # show sizes in MB - -# ps -alias psa="ps auxf" -alias psgrep="ps aux | grep -v grep | grep -i -e VSZ -e" -alias psmem='ps auxf | sort -nr -k 4' -alias pscpu='ps auxf | sort -nr -k 3' - -# git -alias addup='git add -u' -alias addall='git add .' -alias branch='git branch' -alias checkout='git checkout' -alias clone='git clone' -alias commit='git commit -m' -alias fetch='git fetch' -alias pull='git pull origin' -alias push='git push origin' -alias tag='git tag' -alias newtag='git tag -a' - -# power management -alias po='systemctl poweroff' -alias sp='systemctl suspend' -alias rb='systemctl reboot' - -# youtube- -alias yta-aac="yt-dlp --extract-audio --audio-format aac " -alias yta-best="yt-dlp --extract-audio --audio-format best " -alias yta-flac="yt-dlp --extract-audio --audio-format flac " -alias yta-m4a="yt-dlp --extract-audio --audio-format m4a " -alias yta-mp3="yt-dlp --extract-audio --audio-format mp3 " -alias yta-opus="yt-dlp --extract-audio --audio-format opus " -alias yta-vorbis="yt-dlp --extract-audio --audio-format vorbis " -alias yta-wav="yt-dlp --extract-audio --audio-format wav " -alias ytv-best="yt-dlp -f bestvideo+bestaudio " -alias yt='ytfzf -ftsl' -alias youtube='ytfzf -ftsl' -alias ytm='ytfzf -mtsl' -alias youtube-music='ytfzf -mtsl' - -# the terminal rickroll -alias rr='curl -s -L https://raw.githubusercontent.com/keroserene/rickrollrc/master/roll.sh | bash' - -# Mocp must be launched with bash instead of Fish! -alias mocp="bash -c mocp" - -# network and bluetooth -alias netstats='nmcli dev' -alias wfi='nmtui-connect' -alias wfi-scan='nmcli dev wifi rescan && nmcli dev wifi list' -alias wfi-edit='nmtui-edit' -alias wfi-on='nmcli radio wifi on' -alias wfi-off='nmcli radio wifi off' -alias blt='bluetoothctl' - -### SETTING THE STARSHIP PROMPT ### -starship init fish | source diff --git a/new-config/.config/gtk-2.0/gtkfilechooser.ini b/new-config/.config/gtk-2.0/gtkfilechooser.ini deleted file mode 100644 index 65fa2a6e5..000000000 --- a/new-config/.config/gtk-2.0/gtkfilechooser.ini +++ /dev/null @@ -1,11 +0,0 @@ -[Filechooser Settings] -LocationMode=path-bar -ShowHidden=false -ShowSizeColumn=true -GeometryX=0 -GeometryY=0 -GeometryWidth=772 -GeometryHeight=560 -SortColumn=name -SortOrder=ascending -StartupMode=recent diff --git a/new-config/.config/gtk-3.0/settings.ini b/new-config/.config/gtk-3.0/settings.ini deleted file mode 100644 index 7b4e43bc1..000000000 --- a/new-config/.config/gtk-3.0/settings.ini +++ /dev/null @@ -1,17 +0,0 @@ -[Settings] -gtk-theme-name=gruvbox-dark-gtk -gtk-icon-theme-name=gruvbox-dark-icons-gtk -gtk-font-name=Cantarell 10 -gtk-cursor-theme-name=Simp1e-Gruvbox-Dark -gtk-cursor-theme-size=24 -gtk-toolbar-style=GTK_TOOLBAR_BOTH -gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR -gtk-button-images=1 -gtk-menu-images=1 -gtk-enable-event-sounds=1 -gtk-enable-input-feedback-sounds=0 -gtk-xft-antialias=1 -gtk-xft-hinting=1 -gtk-xft-hintstyle=hintslight -gtk-xft-rgba=rgb -gtk-application-prefer-dark-theme=1 diff --git a/new-config/.config/lvim/config.lua b/new-config/.config/lvim/config.lua deleted file mode 100644 index 99e347642..000000000 --- a/new-config/.config/lvim/config.lua +++ /dev/null @@ -1,75 +0,0 @@ --- nvim options -vim.opt.shiftwidth = 2 -vim.opt.tabstop = 2 -vim.opt.relativenumber = true -vim.cmd('autocmd FileType markdown setlocal nospell') -vim.opt.wrap = true -- wrap lines -vim.opt.spell = false -vim.o.shell = '/usr/bin/bash' - --- general -lvim.use_icons = false -lvim.log.level = "info" -lvim.format_on_save = { - enabled = true, - pattern = "*.lua", - timeout = 1000, -} - --- change theme settings -lvim.colorscheme = "gruvbox" -lvim.transparent_window = true -lvim.builtin.alpha.active = true -lvim.builtin.alpha.mode = "dashboard" -lvim.builtin.terminal.active = true -lvim.builtin.nvimtree.setup.view.side = "left" -lvim.builtin.nvimtree.setup.renderer.icons.show.git = false - --- automatically install missing parsers when entering buffer -lvim.builtin.treesitter.auto_install = true - --- additional Plugins -lvim.plugins = { - { "lunarvim/colorschemes" }, - { "ellisonleao/gruvbox.nvim" }, - { "puremourning/vimspector" }, - { "OmniSharp/omnisharp-vim" }, - { "SirVer/ultisnips" }, - { "CRAG666/code_runner.nvim" }, -} - --- vimspector options -vim.g.vimspector_enable_mappings = 'HUMAN' -vim.g.vimspector_enable_mappings_for_mode = { - [''] = { 'n', 'v' }, -} - --- code runner options -require('code_runner').setup({ - filetype = { - java = { - "cd $dir &&", - "javac $fileName &&", - "java $fileNameWithoutExt" - }, - python = "python3 -u", - typescript = "deno run", - rust = { - "cd $dir &&", - "rustc $fileName &&", - "$dir/$fileNameWithoutExt" - }, - cs = function(...) - local root_dir = require("lspconfig").util.root_pattern "*.csproj" (vim.loop.cwd()) - return "cd " .. root_dir .. " && dotnet run$end" - end, - }, -}) - -vim.keymap.set('n', 'r', ':RunCode', { noremap = true, silent = false }) -vim.keymap.set('n', 'rf', ':RunFile', { noremap = true, silent = false }) -vim.keymap.set('n', 'rft', ':RunFile tab', { noremap = true, silent = false }) -vim.keymap.set('n', 'rp', ':RunProject', { noremap = true, silent = false }) -vim.keymap.set('n', 'rc', ':RunClose', { noremap = true, silent = false }) -vim.keymap.set('n', 'crf', ':CRFiletype', { noremap = true, silent = false }) -vim.keymap.set('n', 'crp', ':CRProjects', { noremap = true, silent = false }) diff --git a/new-config/.config/mpv/input.conf b/new-config/.config/mpv/input.conf deleted file mode 100644 index 593273e45..000000000 --- a/new-config/.config/mpv/input.conf +++ /dev/null @@ -1,12 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom mpv config -## - -l seek 5 -h seek -5 -j seek -60 -k seek 60 -S cycle sub diff --git a/new-config/.config/newsboat/config b/new-config/.config/newsboat/config deleted file mode 100644 index 9246557ae..000000000 --- a/new-config/.config/newsboat/config +++ /dev/null @@ -1,51 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom newsboat config -## -show-read-feeds yes -auto-reload yes -reload-threads 10 - -bind-key j down -bind-key k up -bind-key j next articlelist -bind-key k prev articlelist -bind-key J next-feed articlelist -bind-key K prev-feed articlelist -bind-key G end -bind-key g home -bind-key d pagedown -bind-key u pageup -bind-key l open -bind-key h quit -bind-key a toggle-article-read -bind-key n next-unread -bind-key N prev-unread -bind-key D pb-download -bind-key U show-urls -bind-key x pb-delete - -color listnormal cyan default -color listfocus black yellow standout bold -color listnormal_unread blue default -color listfocus_unread yellow default bold -color info red black bold -color article white default bold - -highlight all "---.*---" yellow -highlight feedlist ".*(0/0))" black -highlight article "(^Feed:.*|^Title:.*|^Author:.*)" cyan default bold -highlight article "(^Link:.*|^Date:.*)" default default -highlight article "https?://[^ ]+" green default -highlight article "^(Title):.*$" blue default -highlight article "\\[[0-9][0-9]*\\]" magenta default bold -highlight article "\\[image\\ [0-9]+\\]" green default bold -highlight article "\\[embedded flash: [0-9][0-9]*\\]" green default bold -highlight article ":.*\\(link\\)$" cyan default -highlight article ":.*\\(image\\)$" blue default -highlight article ":.*\\(embedded flash\\)$" magenta default - -browser w3m -macro v set browser "mpv %u" ; open-in-browser ; set browser "elinks %u" diff --git a/new-config/.config/newsboat/urls b/new-config/.config/newsboat/urls deleted file mode 100644 index c66f25428..000000000 --- a/new-config/.config/newsboat/urls +++ /dev/null @@ -1,99 +0,0 @@ -http://static.fsf.org/fsforg/rss/news.xml "~FSF News" -http://static.fsf.org/fsforg/rss/blogs.xml "~FSF Blogs" -https://fsfe.org/news/news.en.rss "~FSFE News" -https://dot.kde.org/rss.xml "~KDE Dot News" -https://planet.kde.org/global/atom.xml "~Planet KDE" -https://pointieststick.com/feed/ "~This Week on KDE" -https://www.kdeblog.com/rss "~KDE Blog" -https://thisweek.gnome.org/index.xml "~This Week on GNOME" -https://www.omgubuntu.co.uk/feed "~OMG Ubuntu!" -https://www.omglinux.com/feed "~OMG!Linux" -https://blog.thunderbird.net/feed/ "~The Thunderbird Blog" -https://thelinuxexp.com/feed.xml "~The Linux Experiment" -https://techhut.tv/feed/ "~TechHut Media" -https://itsfoss.com/rss/ "~Its FOSS!" -https://thelinuxcast.org/feed/feed.xml "~The Linux Cast" -https://9to5linux.com/feed/atom "~9to5Linux" -https://blog.elementary.io/feed.xml "~elementary OS Blog" -https://blog.zorin.com/index.xml "~Zorin OS Blog" -http://blog.linuxmint.com/?feed=rss2 "~Linux Mint Blog" -https://www.gamingonlinux.com/article_rss.php "~Gaming on linux" -https://hackaday.com/blog/feed/ "~Hackaday" -https://opensource.com/feed "~Opensource" -https://linux.softpedia.com/backend.xml "~Softpedia Linux" -https://www.phoronix.com/rss.php "~Phoronix" -https://www.computerworld.com/index.rss "~Computerworld" -https://www.networkworld.com/category/linux/index.rss "~Networkworld Linux" -https://betanews.com/feed "~Betanews Linux" -http://lxer.com/module/newswire/headlines.rss "~Lxer" -https://theevilskeleton.gitlab.io/feed.xml "~TheEvilSkeleton" -https://tutanota.com/blog/feed.xml "~Tutanota Blogs" -https://vanillaos.org/feed.xml "~Vanilla OS" -https://techcrunch.com/feed/ "~TechCrunch" -http://www.techradar.com/rss "~TechRadar" -https://www.zdnet.com/news/rss.xml "~ZDNET - News" -https://c3po.website/rss/ "~Blog de C3PO" -http://yro.slashdot.org/yro.rss "~Slashdot: Your Rights Online" -https://freedom-to-tinker.com/feed/rss/ "~Freedom to Tinker" -https://act.eff.org/action.atom "~EFF - Action Center" -https://www.eff.org/rss/updates.xml "~EFF - Updates" -https://victorhckinthefreeworld.com/feed/ "~Victorhck in the free world" -https://invidious.sethforprivacy.com/feed/channel/UCHnyfMqiRRG1u-2MsSQLbXA "~YT - Veritasium" -https://invidious.sethforprivacy.com/feed/channel/UCtMVHI3AJD4Qk4hcbZnI9ZQ "~YT - SomeOrdinaryGamers" -https://invidious.sethforprivacy.com/feed/channel/UCl2mFZoRqjw_ELax4Yisf6w "~YT - Louis Rossmann" -https://invidious.sethforprivacy.com/feed/channel/UChI0q9a-ZcbZh7dAu_-J-hg "~YT - Upper Echelon" -https://invidious.sethforprivacy.com/feed/channel/UCj8orMezFWVcoN-4S545Wtw "~YT - Max Derrat" -https://invidious.sethforprivacy.com/feed/channel/UCkmMACUKpQeIxN9D9ARli1Q "~YT - Shadiversity" -https://invidious.sethforprivacy.com/feed/channel/UCNYW2vfGrUE6R5mIJYzkRyQ "~YT - DrossRotzank" -https://invidious.sethforprivacy.com/feed/channel/UC36xmz34q02JYaZYKrMwXng "~YT - Nate Gentile" -https://invidious.sethforprivacy.com/feed/channel/UCg6gPGh8HU2U01vaFCAsvmQ "~YT - Chris Titus Tech" -https://invidious.sethforprivacy.com/feed/channel/UCVls1GmFKf6WlTraIb_IaJg "~YT - DistroTube" -https://invidious.sethforprivacy.com/feed/channel/UCxQKHvKbmSzGMvUrVtJYnUA "~YT - Learn Linux TV" -https://invidious.sethforprivacy.com/feed/channel/UC5UAwBUum7CPN5buc-_N1Fw "~YT - The Linux Experiment" -https://invidious.sethforprivacy.com/feed/channel/UCylGUf9BvQooEFjgdNudoQg "~YT - The Linux Cast" -https://invidious.sethforprivacy.com/feed/channel/UCoryWpk4QVYKFCJul9KBdyw "~YT - Switched to Linux" -https://invidious.sethforprivacy.com/feed/channel/UCgkyQiY_Q5AlrygIXGWO2Zw "~YT - Tux Traveler" -https://invidious.sethforprivacy.com/feed/channel/UCxkw-TfCK1t1VKxfHwPzD6w "~YT - Our Walk in Christ" -https://invidious.sethforprivacy.com/feed/channel/UCld68syR8Wi-GY_n4CaoJGA "~YT - Brodie Robertson" -https://invidious.sethforprivacy.com/feed/channel/UCjSEJkpGbcZhvo0lr-44X_w "~YT - TechHut" -https://invidious.sethforprivacy.com/feed/channel/UC2eYFnH61tmytImy1mTYvhA "~YT - Luke Smith" -https://invidious.sethforprivacy.com/feed/channel/UC7YOGHUfC1Tb6E4pudI9STA "~YT - Mental Outlaw" -https://invidious.sethforprivacy.com/feed/channel/UC3jSNmKWYA04R47fDcc1ImA "~YT - InfinitelyGalactic" -https://invidious.sethforprivacy.com/feed/channel/UCONH73CdRXUjlh3-DdLGCPw "~YT - Nicco Loves Linux" -https://invidious.sethforprivacy.com/feed/channel/UC1s1OsWNYDFgbROPV-q5arg "~YT - Michael Horn" -https://invidious.sethforprivacy.com/feed/channel/UCOSSzBN8e3JHOxvltQbf_mQ "~YT - Jack Keifer" -https://invidious.sethforprivacy.com/feed/channel/UC05XpvbHZUQOfA6xk4dlmcw "~YT - DJ Ware" -https://invidious.sethforprivacy.com/feed/channel/UCAiiOTio8Yu69c3XnR7nQBQ "~YT - System Crafters" -https://invidious.sethforprivacy.com/feed/channel/UCAYKj_peyESIMDp5LtHlH2A "~YT - unfa" -https://invidious.sethforprivacy.com/feed/channel/UCmw-QGOHbHA5cDAvwwqUTKQ "~YT - Zaney" -https://invidious.sethforprivacy.com/feed/channel/UCNvl_86ygZXRuXjxbONI5jA "~YT - 10leej" -https://invidious.sethforprivacy.com/feed/channel/UC3yaWWA9FF9OBog5U9ml68A "~YT - SavvyNik" -https://invidious.sethforprivacy.com/feed/channel/UCS97tchJDq17Qms3cux8wcA "~YT - chris@machine" -https://invidious.sethforprivacy.com/feed/channel/UCl8XUDjAOLc7GNKcDp9Nepg "~YT - Locos por Linux" -https://invidious.sethforprivacy.com/feed/channel/UClVi5MQZ6T0InZYT7oFs6wg "~YT - Mumbling Hugo" -https://invidious.sethforprivacy.com/feed/channel/UCmyGZ0689ODyReHw3rsKLtQ "~YT - Michael Tunnell" -https://invidious.sethforprivacy.com/feed/channel/UCv1Kcz-CuGM6mxzL3B1_Eiw "~YT - Gardiner Bryant" -https://invidious.sethforprivacy.com/feed/channel/UCcf2Mr1qNoX51XXDUd3Rquw "~YT - ByteSeb" -https://invidious.sethforprivacy.com/feed/channel/UCCIHOP7e271SIumQgyl6XBQ "~YT - OldTechBloke" -https://invidious.sethforprivacy.com/feed/channel/UCIFzjAer2W9gTWVECZgtDzg "~YT - GaryH Tech" -https://invidious.sethforprivacy.com/feed/channel/UCMiyV_Ib77XLpzHPQH_q0qQ "~YT - Veronica Explains" -https://invidious.sethforprivacy.com/feed/channel/UCsnGwSIHyoYN0kiINAGUKxg "~YT - Wolfgang's Channel" -https://invidious.sethforprivacy.com/feed/channel/UCnIfca4LPFVn8-FjpPVc1ow "~YT - Fedora Project" -https://invidious.sethforprivacy.com/feed/channel/UCH5DsMZAgdx5Fkk9wwMNwCA "~YT - The New Oil" -https://invidious.sethforprivacy.com/feed/channel/UCs6KfncB4OV6Vug4o_bzijg "~YT - Techlore" -https://invidious.sethforprivacy.com/feed/channel/UCYVU6rModlGxvJbszCclGGw "~YT - Rob Braxman Tech" -https://invidious.sethforprivacy.com/feed/channel/UCSuHzQ3GrHSzoBbwrIq3LLA "~YT - Naomi Brockwell: NBTV" -https://invidious.sethforprivacy.com/feed/channel/UCvFGf8HZGZWFzpcDCqb3Lhw "~YT - All Things Secured" -https://invidious.sethforprivacy.com/feed/channel/UCvjgXvBlbQiydffZU7m1_aw "~YT - The Coding Train" -https://invidious.sethforprivacy.com/feed/channel/UC9-y-6csu5WGm29I7JiwpnA "~YT - Computerphile" -https://invidious.sethforprivacy.com/feed/channel/UCbiGcwDWZjz05njNPrJU7jA "~YT - ExplainingComputers" -https://invidious.sethforprivacy.com/feed/channel/UCy0tKL1T7wFoYcxCe0xjN6Q "~YT - Technology Connections" -https://invidious.sethforprivacy.com/feed/channel/UC8uT9cgJorJPWu7ITLGo9Ww "~YT - The 8-Bit Guy" -https://invidious.sethforprivacy.com/feed/channel/UCoL8olX-259lS1N6QPyP4IQ "~YT - Action Retro" -https://invidious.sethforprivacy.com/feed/channel/UCW-HHEyt67RhZ6q21n4p2zQ "~YT - Mac84" -https://invidious.sethforprivacy.com/feed/channel/UChT0QzAGfz_pUIbQnePV6KQ "~YT - Pendleton 115" -https://invidious.sethforprivacy.com/feed/channel/UC-ErgHYY0_Yjhjz2MN1E1lg "~YT - RETRO Hardware" -https://invidious.sethforprivacy.com/feed/channel/UCjgS6Uyg8ok4Jd_lH_MUKgg "~YT - Claus Kellerman" -https://invidious.sethforprivacy.com/feed/channel/UC0W_BIuwk8D0Bv4THbVZZOQ "~YT - Surveillance Report" -https://invidious.sethforprivacy.com/feed/channel/UCBq5p-xOla8xhnrbhu8AIAg "~YT - Tech Over Tea" - diff --git a/new-config/.config/qt5ct/qt5ct.conf b/new-config/.config/qt5ct/qt5ct.conf deleted file mode 100644 index 08368ab5c..000000000 --- a/new-config/.config/qt5ct/qt5ct.conf +++ /dev/null @@ -1,31 +0,0 @@ -[Appearance] -color_scheme_path=/usr/share/qt5ct/colors/airy.conf -custom_palette=false -standard_dialogs=gtk2 -style=gtk2 - -[Fonts] -fixed="Mononoki Nerd Font,10,-1,5,50,0,0,0,0,0,Regular" -general="Cantarell,10,-1,5,50,0,0,0,0,0,Regular" - -[Interface] -activate_item_on_single_click=1 -buttonbox_layout=0 -cursor_flash_time=1000 -dialog_buttons_have_icons=1 -double_click_interval=400 -gui_effects=@Invalid() -keyboard_scheme=2 -menus_have_icons=true -show_shortcuts_in_context_menus=true -stylesheets=@Invalid() -toolbutton_style=4 -underline_shortcut=1 -wheel_scroll_lines=3 - -[SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2\x84\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc) - -[Troubleshooting] -force_raster_widgets=1 -ignored_applications=@Invalid() diff --git a/new-config/.config/qt6ct/qt6ct.conf b/new-config/.config/qt6ct/qt6ct.conf deleted file mode 100644 index 6f85a8818..000000000 --- a/new-config/.config/qt6ct/qt6ct.conf +++ /dev/null @@ -1,32 +0,0 @@ -[Appearance] -color_scheme_path=/usr/share/qt6ct/colors/airy.conf -custom_palette=false -icon_theme=gruvbox-dark-icons-gtk -standard_dialogs=gtk2 -style=qt6gtk2 - -[Fonts] -fixed="Mononoki Nerd Font,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" -general="Cantarell,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" - -[Interface] -activate_item_on_single_click=1 -buttonbox_layout=0 -cursor_flash_time=1000 -dialog_buttons_have_icons=1 -double_click_interval=400 -gui_effects=@Invalid() -keyboard_scheme=2 -menus_have_icons=true -show_shortcuts_in_context_menus=true -stylesheets=@Invalid() -toolbutton_style=4 -underline_shortcut=1 -wheel_scroll_lines=3 - -[SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc) - -[Troubleshooting] -force_raster_widgets=1 -ignored_applications=@Invalid() diff --git a/new-config/.config/rofi/config.rasi b/new-config/.config/rofi/config.rasi deleted file mode 100644 index a4a28cbc8..000000000 --- a/new-config/.config/rofi/config.rasi +++ /dev/null @@ -1,104 +0,0 @@ -configuration{ - modi: "run,drun,window"; - lines: 10; - font: "mononoki Nerd Font 14"; - show-icons: true; - icon-theme: "gruvbox-dark-icons-gtk"; - terminal: "alacritty"; - drun-display-format: "{icon} {name}"; - location: 0; - disable-history: false; - hide-scrollbar: true; - display-drun: " 󰀻 Apps "; - display-run: " ï„” Run "; - display-window: " 󰖯 Window "; - display-Network: " 󰀚 Network "; - sidebar-mode: true; - dpi: 100; -} - -@theme "gruvbox-dark" - -element-text, element-icon , mode-switcher { - background-color: inherit; - text-color: inherit; -} - -window { - height: 380; - width: 1000; - border: 3px; - border-color: @border-col; - background-color: @bg-col; -} - -mainbox { - background-color: @bg-col; -} - -inputbar { - children: [prompt,entry]; - background-color: @bg-col; - border-radius: 5px; - padding: 2px; -} - -prompt { - background-color: @red; - padding: 3px; - text-color: @bg-col; - border-radius: 3px; - margin: 20px 0px 0px 20px; -} - -textbox-prompt-colon { - expand: false; - str: ":"; -} - -entry { - padding: 6px; - margin: 20px 0px 0px 10px; - text-color: @fg-col; - background-color: @bg-col; -} - -listview { - border: 0px 0px 0px; - padding: 2px 2px 2px; - margin: 10px 20px 0px 20px; - columns: 1; - background-color: @bg-col; -} - -element { - padding: 5px; - background-color: @bg-col; - text-color: @grey; -} - -element-icon { - size: 28px; -} - -element selected { - background-color: @selected-col; - text-color: @fg-col2; -} - -mode-switcher { - spacing: 0; - } - -button { - padding: 10px; - background-color: @bg-col; - text-color: @inactive; - vertical-align: 0.5; - horizontal-align: 0.5; -} - -button selected { - background-color: @selected-col; - text-color: @red; -} diff --git a/new-config/.config/rofi/scripts/rofi_emoji b/new-config/.config/rofi/scripts/rofi_emoji deleted file mode 100755 index e90268c05..000000000 --- a/new-config/.config/rofi/scripts/rofi_emoji +++ /dev/null @@ -1,1859 +0,0 @@ -#!/bin/bash -wtype 0 -if [ $? -eq 0 ] -then - sed '1,/^### DATA ###$/d' $0 | rofi -dmenu -i -p " 󰙃 Select Emoji " | cut -d ' ' -f 1 | tr -d '\n' | wtype - -else - sed '1,/^### DATA ###$/d' $0 | rofi -dmenu -i -p " 󰙃 Select Emoji " | cut -d ' ' -f 1 | tr -d '\n' | wl-copy -fi -exit -### DATA ### -😀 grinning face face smile happy joy :D grin -😃 grinning face with big eyes face happy joy haha :D :) smile funny -😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile -😁 beaming face with smiling eyes face happy smile joy kawaii -😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh -😅 grinning face with sweat face hot happy laugh sweat smile relief -đŸ€Ł rolling on the floor laughing face rolling floor laughing lol haha rofl -😂 face with tears of joy face cry tears weep happy happytears haha -🙂 slightly smiling face face smile -🙃 upside down face face flipped silly smile -😉 winking face face happy mischievous secret ;) smile eye -😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy -😇 smiling face with halo face angel heaven halo -đŸ„° smiling face with hearts face love like affection valentines infatuation crush hearts adore -😍 smiling face with heart eyes face love like affection valentines infatuation crush heart -đŸ€© star struck face smile starry eyes grinning -😘 face blowing a kiss face love like affection valentines infatuation kiss -😗 kissing face love like face 3 valentines infatuation kiss -â˜ș smiling face face blush massage happiness -😚 kissing face with closed eyes face love like affection valentines infatuation kiss -😙 kissing face with smiling eyes face affection valentines infatuation kiss -😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring -😛 face with tongue face prank childish playful mischievous smile tongue -😜 winking face with tongue face prank childish playful mischievous smile wink tongue -đŸ€Ș zany face face goofy crazy -😝 squinting face with tongue face prank playful mischievous smile tongue -đŸ€‘ money mouth face face rich dollar money -đŸ€— hugging face face smile hug -đŸ€­ face with hand over mouth face whoops shock surprise -đŸ€« shushing face face quiet shhh -đŸ€” thinking face face hmmm think consider -đŸ€ zipper mouth face face sealed zipper secret -đŸ€š face with raised eyebrow face distrust scepticism disapproval disbelief surprise -😐 neutral face indifference meh :| neutral -😑 expressionless face face indifferent - - meh deadpan -đŸ˜¶ face without mouth face hellokitty -😏 smirking face face smile mean prank smug sarcasm -😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye -🙄 face with rolling eyes face eyeroll frustrated -😬 grimacing face face grimace teeth -đŸ€„ lying face face lie pinocchio -😌 relieved face face relaxed phew massage happiness -😔 pensive face face sad depressed upset -đŸ˜Ș sleepy face face tired rest nap -đŸ€€ drooling face face -😮 sleeping face face tired sleepy night zzz -đŸ˜· face with medical mask face sick ill disease -đŸ€’ face with thermometer sick temperature thermometer cold fever -đŸ€• face with head bandage injured clumsy bandage hurt -đŸ€ą nauseated face face vomit gross green sick throw up ill -đŸ€ź face vomiting face sick -đŸ€§ sneezing face face gesundheit sneeze sick allergy -đŸ„” hot face face feverish heat red sweating -đŸ„¶ cold face face blue freezing frozen frostbite icicles -đŸ„Ž woozy face face dizzy intoxicated tipsy wavy -đŸ˜” dizzy face spent unconscious xox dizzy -đŸ€Ż exploding head face shocked mind blown -đŸ€  cowboy hat face face cowgirl hat -đŸ„ł partying face face celebration woohoo -😎 smiling face with sunglasses face cool smile summer beach sunglass -đŸ€“ nerd face face nerdy geek dork -🧐 face with monocle face stuffy wealthy -😕 confused face face indifference huh weird hmmm :/ -😟 worried face face concern nervous :( -🙁 slightly frowning face face frowning disappointed sad upset -â˜č frowning face face sad upset frown -😼 face with open mouth face surprise impressed wow whoa :O -😯 hushed face face woo shh -đŸ˜Č astonished face face xox surprised poisoned -😳 flushed face face blush shy flattered -đŸ„ș pleading face face begging mercy -😩 frowning face with open mouth face aw what -😧 anguished face face stunned nervous -😹 fearful face face scared terrified nervous oops huh -😰 anxious face with sweat face nervous sweat -đŸ˜„ sad but relieved face face phew sweat nervous -😱 crying face face tears sad depressed upset :'( -😭 loudly crying face face cry tears sad upset depressed -đŸ˜± face screaming in fear face munch scared omg -😖 confounded face face confused sick unwell oops :S -😣 persevering face face sick no upset oops -😞 disappointed face face sad upset depressed :( -😓 downcast face with sweat face hot sad tired exercise -đŸ˜© weary face face tired sleepy sad frustrated upset -đŸ˜« tired face sick whine upset frustrated -đŸ„± yawning face tired sleepy -đŸ˜€ face with steam from nose face gas phew proud pride -😡 pouting face angry mad hate despise -😠 angry face mad face annoyed frustrated -đŸ€Ź face with symbols on mouth face swearing cursing cussing profanity expletive -😈 smiling face with horns devil horns -👿 angry face with horns devil angry horns -💀 skull dead skeleton creepy death -☠ skull and crossbones poison danger deadly scary death pirate evil -đŸ’© pile of poo hankey shitface fail turd shit -đŸ€Ą clown face face -đŸ‘č ogre monster red mask halloween scary creepy devil demon japanese ogre -đŸ‘ș goblin red evil mask monster scary creepy japanese goblin -đŸ‘» ghost halloween spooky scary -đŸ‘œ alien UFO paul weird outer space -đŸ‘Ÿ alien monster game arcade play -đŸ€– robot computer machine bot -đŸ˜ș grinning cat animal cats happy smile -😾 grinning cat with smiling eyes animal cats smile -đŸ˜č cat with tears of joy animal cats haha happy tears -đŸ˜» smiling cat with heart eyes animal love like affection cats valentines heart -đŸ˜Œ cat with wry smile animal cats smirk -đŸ˜œ kissing cat animal cats kiss -🙀 weary cat animal cats munch scared scream -😿 crying cat animal tears weep sad cats upset cry -đŸ˜Ÿ pouting cat animal cats -🙈 see no evil monkey monkey animal nature haha -🙉 hear no evil monkey animal monkey nature -🙊 speak no evil monkey monkey animal nature omg -💋 kiss mark face lips love like affection valentines -💌 love letter email like affection envelope valentines -💘 heart with arrow love like heart affection valentines -💝 heart with ribbon love valentines -💖 sparkling heart love like affection valentines -💗 growing heart like love affection valentines pink -💓 beating heart love like affection valentines pink heart -💞 revolving hearts love like affection valentines -💕 two hearts love like affection valentines heart -💟 heart decoration purple-square love like -âŁïž heart exclamation decoration love -💔 broken heart sad sorry break heart heartbreak -❀ red heart love like valentines -🧡 orange heart love like affection valentines -💛 yellow heart love like affection valentines -💚 green heart love like affection valentines -💙 blue heart love like affection valentines -💜 purple heart love like affection valentines -đŸ€Ž brown heart coffee -đŸ–€ black heart evil -đŸ€ white heart pure -💯 hundred points score perfect numbers century exam quiz test pass hundred -💱 anger symbol angry mad -đŸ’„ collision bomb explode explosion collision blown -đŸ’« dizzy star sparkle shoot magic -💩 sweat droplets water drip oops -💹 dashing away wind air fast shoo fart smoke puff -đŸ•łïž hole embarrassing -💣 bomb boom explode explosion terrorism -💬 speech balloon bubble words message talk chatting -đŸ‘ïžâ€đŸ—šïž eye in speech bubble info -đŸ—šïž left speech bubble words message talk chatting -đŸ—Żïž right anger bubble caption speech thinking mad -💭 thought balloon bubble cloud speech thinking dream -đŸ’€ zzz sleepy tired dream -👋 waving hand hands gesture goodbye solong farewell hello hi palm -đŸ€š raised back of hand fingers raised backhand -đŸ–ïž hand with fingers splayed hand fingers palm -✋ raised hand fingers stop highfive palm ban -🖖 vulcan salute hand fingers spock star trek -👌 ok hand fingers limbs perfect ok okay -đŸ€ pinching hand tiny small size -✌ victory hand fingers ohyeah hand peace victory two -đŸ€ž crossed fingers good lucky -đŸ€Ÿ love you gesture hand fingers gesture -đŸ€˜ sign of the horns hand fingers evil eye sign of horns rock on -đŸ€™ call me hand hands gesture shaka -👈 backhand index pointing left direction fingers hand left -👉 backhand index pointing right fingers hand direction right -👆 backhand index pointing up fingers hand direction up -🖕 middle finger hand fingers rude middle flipping -👇 backhand index pointing down fingers hand direction down -☝ index pointing up hand fingers direction up -👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1 -👎 thumbs down thumbsdown no dislike hand -1 -✊ raised fist fingers hand grasp -👊 oncoming fist angry violence fist hit attack hand -đŸ€› left facing fist hand fistbump -đŸ€œ right facing fist hand fistbump -👏 clapping hands hands praise applause congrats yay -🙌 raising hands gesture hooray yea celebration hands -👐 open hands fingers butterfly hands open -đŸ€Č palms up together hands gesture cupped prayer -đŸ€ handshake agreement shake -🙏 folded hands please hope wish namaste highfive pray -✍ writing hand lower left ballpoint pen stationery write compose -💅 nail polish beauty manicure finger fashion nail -đŸ€ł selfie camera phone -đŸ’Ș flexed biceps arm flex hand summer strong biceps -đŸŠŸ mechanical arm accessibility -🩿 mechanical leg accessibility -đŸŠ” leg kick limb -đŸŠ¶ foot kick stomp -👂 ear face hear sound listen -đŸŠ» ear with hearing aid accessibility -👃 nose smell sniff -🧠 brain smart intelligent -đŸŠ· tooth teeth dentist -🩮 bone skeleton -👀 eyes look watch stalk peek see -đŸ‘ïž eye face look see watch stare -👅 tongue mouth playful -👄 mouth mouth kiss -đŸ‘¶ baby child boy girl toddler -🧒 child gender-neutral young -👩 boy man male guy teenager -👧 girl female woman teenager -🧑 person gender-neutral person -đŸ‘± person blond hair hairstyle -👹 man mustache father dad guy classy sir moustache -🧔 man beard person bewhiskered -👹‍🩰 man red hair hairstyle -đŸ‘šâ€đŸŠ± man curly hair hairstyle -👹‍🩳 man white hair old elder -👹‍đŸŠČ man bald hairless -đŸ‘© woman female girls lady -đŸ‘©â€đŸŠ° woman red hair hairstyle -🧑‍🩰 person red hair hairstyle -đŸ‘©â€đŸŠ± woman curly hair hairstyle -đŸ§‘â€đŸŠ± person curly hair hairstyle -đŸ‘©â€đŸŠł woman white hair old elder -🧑‍🩳 person white hair elder old -đŸ‘©â€đŸŠČ woman bald hairless -🧑‍đŸŠČ person bald hairless -đŸ‘±â€â™€ïž woman blond hair woman female girl blonde person -đŸ‘±â€â™‚ïž man blond hair man male boy blonde guy person -🧓 older person human elder senior gender-neutral -👮 old man human male men old elder senior -đŸ‘” old woman human female women lady old elder senior -🙍 person frowning worried -đŸ™â€â™‚ïž man frowning male boy man sad depressed discouraged unhappy -đŸ™â€â™€ïž woman frowning female girl woman sad depressed discouraged unhappy -🙎 person pouting upset -đŸ™Žâ€â™‚ïž man pouting male boy man -đŸ™Žâ€â™€ïž woman pouting female girl woman -🙅 person gesturing no decline -đŸ™…â€â™‚ïž man gesturing no male boy man nope -đŸ™…â€â™€ïž woman gesturing no female girl woman nope -🙆 person gesturing ok agree -đŸ™†â€â™‚ïž man gesturing ok men boy male blue human man -đŸ™†â€â™€ïž woman gesturing ok women girl female pink human woman -💁 person tipping hand information -đŸ’â€â™‚ïž man tipping hand male boy man human information -đŸ’â€â™€ïž woman tipping hand female girl woman human information -🙋 person raising hand question -đŸ™‹â€â™‚ïž man raising hand male boy man -đŸ™‹â€â™€ïž woman raising hand female girl woman -🧏 deaf person accessibility -đŸ§â€â™‚ïž deaf man accessibility -đŸ§â€â™€ïž deaf woman accessibility -🙇 person bowing respectiful -đŸ™‡â€â™‚ïž man bowing man male boy -đŸ™‡â€â™€ïž woman bowing woman female girl -đŸ€Š person facepalming disappointed -đŸ€Šâ€â™‚ïž man facepalming man male boy disbelief -đŸ€Šâ€â™€ïž woman facepalming woman female girl disbelief -đŸ€· person shrugging regardless -đŸ€·â€â™‚ïž man shrugging man male boy confused indifferent doubt -đŸ€·â€â™€ïž woman shrugging woman female girl confused indifferent doubt -đŸ§‘â€âš•ïž health worker hospital -đŸ‘šâ€âš•ïž man health worker doctor nurse therapist healthcare man human -đŸ‘©â€âš•ïž woman health worker doctor nurse therapist healthcare woman human -🧑‍🎓 student learn -👹‍🎓 man student graduate man human -đŸ‘©â€đŸŽ“ woman student graduate woman human -đŸ§‘â€đŸ« teacher professor -đŸ‘šâ€đŸ« man teacher instructor professor man human -đŸ‘©â€đŸ« woman teacher instructor professor woman human -đŸ§‘â€âš–ïž judge law -đŸ‘šâ€âš–ïž man judge justice court man human -đŸ‘©â€âš–ïž woman judge justice court woman human -đŸ§‘â€đŸŒŸ farmer crops -đŸ‘šâ€đŸŒŸ man farmer rancher gardener man human -đŸ‘©â€đŸŒŸ woman farmer rancher gardener woman human -🧑‍🍳 cook food kitchen culinary -👹‍🍳 man cook chef man human -đŸ‘©â€đŸł woman cook chef woman human -🧑‍🔧 mechanic worker technician -👹‍🔧 man mechanic plumber man human wrench -đŸ‘©â€đŸ”§ woman mechanic plumber woman human wrench -🧑‍🏭 factory worker labor -👹‍🏭 man factory worker assembly industrial man human -đŸ‘©â€đŸ­ woman factory worker assembly industrial woman human -đŸ§‘â€đŸ’Œ office worker business -đŸ‘šâ€đŸ’Œ man office worker business manager man human -đŸ‘©â€đŸ’Œ woman office worker business manager woman human -🧑‍🔬 scientist chemistry -👹‍🔬 man scientist biologist chemist engineer physicist man human -đŸ‘©â€đŸ”Ź woman scientist biologist chemist engineer physicist woman human -đŸ§‘â€đŸ’» technologist computer -đŸ‘šâ€đŸ’» man technologist coder developer engineer programmer software man human laptop computer -đŸ‘©â€đŸ’» woman technologist coder developer engineer programmer software woman human laptop computer -đŸ§‘â€đŸŽ€ singer song artist performer -đŸ‘šâ€đŸŽ€ man singer rockstar entertainer man human -đŸ‘©â€đŸŽ€ woman singer rockstar entertainer woman human -🧑‍🎹 artist painting draw creativity -👹‍🎹 man artist painter man human -đŸ‘©â€đŸŽš woman artist painter woman human -đŸ§‘â€âœˆïž pilot fly plane airplane -đŸ‘šâ€âœˆïž man pilot aviator plane man human -đŸ‘©â€âœˆïž woman pilot aviator plane woman human -🧑‍🚀 astronaut outerspace -👹‍🚀 man astronaut space rocket man human -đŸ‘©â€đŸš€ woman astronaut space rocket woman human -🧑‍🚒 firefighter fire -👹‍🚒 man firefighter fireman man human -đŸ‘©â€đŸš’ woman firefighter fireman woman human -👼 police officer cop -đŸ‘źâ€â™‚ïž man police officer man police law legal enforcement arrest 911 -đŸ‘źâ€â™€ïž woman police officer woman police law legal enforcement arrest 911 female -đŸ•”ïž detective human spy detective -đŸ•”ïžâ€â™‚ïž man detective crime -đŸ•”ïžâ€â™€ïž woman detective human spy detective female woman -💂 guard protect -đŸ’‚â€â™‚ïž man guard uk gb british male guy royal -đŸ’‚â€â™€ïž woman guard uk gb british female royal woman -đŸ‘· construction worker labor build -đŸ‘·â€â™‚ïž man construction worker male human wip guy build construction worker labor -đŸ‘·â€â™€ïž woman construction worker female human wip build construction worker labor woman -đŸ€Ž prince boy man male crown royal king -👾 princess girl woman female blond crown royal queen -👳 person wearing turban headdress -đŸ‘łâ€â™‚ïž man wearing turban male indian hinduism arabs -đŸ‘łâ€â™€ïž woman wearing turban female indian hinduism arabs woman -đŸ‘Č man with skullcap male boy chinese -🧕 woman with headscarf female hijab mantilla tichel -đŸ€” man in tuxedo couple marriage wedding groom -👰 bride with veil couple marriage wedding woman bride -đŸ€° pregnant woman baby -đŸ€± breast feeding nursing baby -đŸ‘Œ baby angel heaven wings halo -🎅 santa claus festival man male xmas father christmas -đŸ€¶ mrs claus woman female xmas mother christmas -🩾 superhero marvel -đŸŠžâ€â™‚ïž man superhero man male good hero superpowers -đŸŠžâ€â™€ïž woman superhero woman female good heroine superpowers -đŸŠč supervillain marvel -đŸŠč‍♂ man supervillain man male evil bad criminal hero superpowers -đŸŠč‍♀ woman supervillain woman female evil bad criminal heroine superpowers -🧙 mage magic -đŸ§™â€â™‚ïž man mage man male mage sorcerer -đŸ§™â€â™€ïž woman mage woman female mage witch -🧚 fairy wings magical -đŸ§šâ€â™‚ïž man fairy man male -đŸ§šâ€â™€ïž woman fairy woman female -🧛 vampire blood twilight -đŸ§›â€â™‚ïž man vampire man male dracula -đŸ§›â€â™€ïž woman vampire woman female -🧜 merperson sea -đŸ§œâ€â™‚ïž merman man male triton -đŸ§œâ€â™€ïž mermaid woman female merwoman ariel -🧝 elf magical -đŸ§â€â™‚ïž man elf man male -đŸ§â€â™€ïž woman elf woman female -🧞 genie magical wishes -đŸ§žâ€â™‚ïž man genie man male -đŸ§žâ€â™€ïž woman genie woman female -🧟 zombie dead -đŸ§Ÿâ€â™‚ïž man zombie man male dracula undead walking dead -đŸ§Ÿâ€â™€ïž woman zombie woman female undead walking dead -💆 person getting massage relax -đŸ’†â€â™‚ïž man getting massage male boy man head -đŸ’†â€â™€ïž woman getting massage female girl woman head -💇 person getting haircut hairstyle -đŸ’‡â€â™‚ïž man getting haircut male boy man -đŸ’‡â€â™€ïž woman getting haircut female girl woman -đŸš¶ person walking move -đŸš¶â€â™‚ïž man walking human feet steps -đŸš¶â€â™€ïž woman walking human feet steps woman female -🧍 person standing still -đŸ§â€â™‚ïž man standing still -đŸ§â€â™€ïž woman standing still -🧎 person kneeling pray respectful -đŸ§Žâ€â™‚ïž man kneeling pray respectful -đŸ§Žâ€â™€ïž woman kneeling respectful pray -🧑‍🩯 person with probing cane blind -👹‍🩯 man with probing cane blind -đŸ‘©â€đŸŠŻ woman with probing cane blind -đŸ§‘â€đŸŠŒ person in motorized wheelchair disability accessibility -đŸ‘šâ€đŸŠŒ man in motorized wheelchair disability accessibility -đŸ‘©â€đŸŠŒ woman in motorized wheelchair disability accessibility -đŸ§‘â€đŸŠœ person in manual wheelchair disability accessibility -đŸ‘šâ€đŸŠœ man in manual wheelchair disability accessibility -đŸ‘©â€đŸŠœ woman in manual wheelchair disability accessibility -🏃 person running move -đŸƒâ€â™‚ïž man running man walking exercise race running -đŸƒâ€â™€ïž woman running woman walking exercise race running female -💃 woman dancing female girl woman fun -đŸ•ș man dancing male boy fun dancer -đŸ•Žïž man in suit levitating suit business levitate hover jump -👯 people with bunny ears perform costume -đŸ‘Żâ€â™‚ïž men with bunny ears male bunny men boys -đŸ‘Żâ€â™€ïž women with bunny ears female bunny women girls -🧖 person in steamy room relax spa -đŸ§–â€â™‚ïž man in steamy room male man spa steamroom sauna -đŸ§–â€â™€ïž woman in steamy room female woman spa steamroom sauna -🧗 person climbing sport -đŸ§—â€â™‚ïž man climbing sports hobby man male rock -đŸ§—â€â™€ïž woman climbing sports hobby woman female rock -đŸ€ș person fencing sports fencing sword -🏇 horse racing animal betting competition gambling luck -⛷ skier sports winter snow -🏂 snowboarder sports winter -đŸŒïž person golfing sports business -đŸŒïžâ€â™‚ïž man golfing sport -đŸŒïžâ€â™€ïž woman golfing sports business woman female -🏄 person surfing sport sea -đŸ„â€â™‚ïž man surfing sports ocean sea summer beach -đŸ„â€â™€ïž woman surfing sports ocean sea summer beach woman female -🚣 person rowing boat sport move -đŸšŁâ€â™‚ïž man rowing boat sports hobby water ship -đŸšŁâ€â™€ïž woman rowing boat sports hobby water ship woman female -🏊 person swimming sport pool -đŸŠâ€â™‚ïž man swimming sports exercise human athlete water summer -đŸŠâ€â™€ïž woman swimming sports exercise human athlete water summer woman female -â›č person bouncing ball sports human -â›č‍♂ man bouncing ball sport -â›č‍♀ woman bouncing ball sports human woman female -đŸ‹ïž person lifting weights sports training exercise -đŸ‹ïžâ€â™‚ïž man lifting weights sport -đŸ‹ïžâ€â™€ïž woman lifting weights sports training exercise woman female -🚮 person biking sport move -đŸšŽâ€â™‚ïž man biking sports bike exercise hipster -đŸšŽâ€â™€ïž woman biking sports bike exercise hipster woman female -đŸš” person mountain biking sport move -đŸš”â€â™‚ïž man mountain biking transportation sports human race bike -đŸš”â€â™€ïž woman mountain biking transportation sports human race bike woman female -đŸ€ž person cartwheeling sport gymnastic -đŸ€žâ€â™‚ïž man cartwheeling gymnastics -đŸ€žâ€â™€ïž woman cartwheeling gymnastics -đŸ€Œ people wrestling sport -đŸ€Œâ€â™‚ïž men wrestling sports wrestlers -đŸ€Œâ€â™€ïž women wrestling sports wrestlers -đŸ€œ person playing water polo sport -đŸ€œâ€â™‚ïž man playing water polo sports pool -đŸ€œâ€â™€ïž woman playing water polo sports pool -đŸ€Ÿ person playing handball sport -đŸ€Ÿâ€â™‚ïž man playing handball sports -đŸ€Ÿâ€â™€ïž woman playing handball sports -đŸ€č person juggling performance balance -đŸ€č‍♂ man juggling juggle balance skill multitask -đŸ€č‍♀ woman juggling juggle balance skill multitask -🧘 person in lotus position meditate -đŸ§˜â€â™‚ïž man in lotus position man male meditation yoga serenity zen mindfulness -đŸ§˜â€â™€ïž woman in lotus position woman female meditation yoga serenity zen mindfulness -🛀 person taking bath clean shower bathroom -🛌 person in bed bed rest -đŸ§‘â€đŸ€â€đŸ§‘ people holding hands friendship -👭 women holding hands pair friendship couple love like female people human -đŸ‘« woman and man holding hands pair people human love date dating like affection valentines marriage -👬 men holding hands pair couple love like bromance friendship people human -💏 kiss pair valentines love like dating marriage -đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘š kiss woman man love -đŸ‘šâ€â€ïžâ€đŸ’‹â€đŸ‘š kiss man man pair valentines love like dating marriage -đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘© kiss woman woman pair valentines love like dating marriage -💑 couple with heart pair love like affection human dating valentines marriage -đŸ‘©â€â€ïžâ€đŸ‘š couple with heart woman man love -đŸ‘šâ€â€ïžâ€đŸ‘š couple with heart man man pair love like affection human dating valentines marriage -đŸ‘©â€â€ïžâ€đŸ‘© couple with heart woman woman pair love like affection human dating valentines marriage -đŸ‘Ș family home parents child mom dad father mother people human -đŸ‘šâ€đŸ‘©â€đŸ‘Š family man woman boy love -đŸ‘šâ€đŸ‘©â€đŸ‘§ family man woman girl home parents people human child -đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘Š family man woman girl boy home parents people human children -đŸ‘šâ€đŸ‘©â€đŸ‘Šâ€đŸ‘Š family man woman boy boy home parents people human children -đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘§ family man woman girl girl home parents people human children -👹‍👹‍👩 family man man boy home parents people human children -👹‍👹‍👧 family man man girl home parents people human children -👹‍👹‍👧‍👩 family man man girl boy home parents people human children -👹‍👹‍👩‍👩 family man man boy boy home parents people human children -👹‍👹‍👧‍👧 family man man girl girl home parents people human children -đŸ‘©â€đŸ‘©â€đŸ‘Š family woman woman boy home parents people human children -đŸ‘©â€đŸ‘©â€đŸ‘§ family woman woman girl home parents people human children -đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘Š family woman woman girl boy home parents people human children -đŸ‘©â€đŸ‘©â€đŸ‘Šâ€đŸ‘Š family woman woman boy boy home parents people human children -đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘§ family woman woman girl girl home parents people human children -👹‍👩 family man boy home parent people human child -👹‍👩‍👩 family man boy boy home parent people human children -👹‍👧 family man girl home parent people human child -👹‍👧‍👩 family man girl boy home parent people human children -👹‍👧‍👧 family man girl girl home parent people human children -đŸ‘©â€đŸ‘Š family woman boy home parent people human child -đŸ‘©â€đŸ‘Šâ€đŸ‘Š family woman boy boy home parent people human children -đŸ‘©â€đŸ‘§ family woman girl home parent people human child -đŸ‘©â€đŸ‘§â€đŸ‘Š family woman girl boy home parent people human children -đŸ‘©â€đŸ‘§â€đŸ‘§ family woman girl girl home parent people human children -đŸ—Łïž speaking head user person human sing say talk -đŸ‘€ bust in silhouette user person human -đŸ‘„ busts in silhouette user person human group team -👣 footprints feet tracking walking beach -đŸ” monkey face animal nature circus -🐒 monkey animal nature banana circus -🩍 gorilla animal nature circus -🩧 orangutan animal -đŸ¶ dog face animal friend nature woof puppy pet faithful -🐕 dog animal nature friend doge pet faithful -🩼 guide dog animal blind -🐕‍đŸŠș service dog blind animal -đŸ© poodle dog animal 101 nature pet -đŸș wolf animal nature wild -🩊 fox animal nature face -🩝 raccoon animal nature -đŸ± cat face animal meow nature pet kitten -🐈 cat animal meow pet cats -🩁 lion animal nature -🐯 tiger face animal cat danger wild nature roar -🐅 tiger animal nature roar -🐆 leopard animal nature -🐮 horse face animal brown nature -🐎 horse animal gamble luck -🩄 unicorn animal nature mystical -🩓 zebra animal nature stripes safari -🩌 deer animal nature horns venison -🐼 cow face beef ox animal nature moo milk -🐂 ox animal cow beef -🐃 water buffalo animal nature ox cow -🐄 cow beef ox animal nature moo milk -đŸ· pig face animal oink nature -🐖 pig animal nature -🐗 boar animal nature -đŸœ pig nose animal oink -🐏 ram animal sheep nature -🐑 ewe animal nature wool shipit -🐐 goat animal nature -đŸȘ camel animal hot desert hump -đŸ« two hump camel animal nature hot desert hump -🩙 llama animal nature alpaca -🩒 giraffe animal nature spots safari -🐘 elephant animal nature nose th circus -🩏 rhinoceros animal nature horn -🩛 hippopotamus animal nature -🐭 mouse face animal nature cheese wedge rodent -🐁 mouse animal nature rodent -🐀 rat animal mouse rodent -đŸč hamster animal nature -🐰 rabbit face animal nature pet spring magic bunny -🐇 rabbit animal nature pet magic spring -đŸżïž chipmunk animal nature rodent squirrel -🩔 hedgehog animal nature spiny -🩇 bat animal nature blind vampire -đŸ» bear animal nature wild -🐹 koala animal nature -đŸŒ panda animal nature panda -đŸŠ„ sloth animal -🩩 otter animal -🩹 skunk animal -🩘 kangaroo animal nature australia joey hop marsupial -🩡 badger animal nature honey -đŸŸ paw prints animal tracking footprints dog cat pet feet -🩃 turkey animal bird -🐔 chicken animal cluck nature bird -🐓 rooster animal nature chicken -🐣 hatching chick animal chicken egg born baby bird -đŸ€ baby chick animal chicken bird -đŸ„ front facing baby chick animal chicken baby bird -🐩 bird animal nature fly tweet spring -🐧 penguin animal nature -đŸ•Šïž dove animal bird -🩅 eagle animal nature bird -🩆 duck animal nature bird mallard -🩱 swan animal nature bird -🩉 owl animal nature bird hoot -đŸŠ© flamingo animal -🩚 peacock animal nature peahen bird -🩜 parrot animal nature bird pirate talk -🐾 frog animal nature croak toad -🐊 crocodile animal nature reptile lizard alligator -🐱 turtle animal slow nature tortoise -🩎 lizard animal nature reptile -🐍 snake animal evil nature hiss python -đŸČ dragon face animal myth nature chinese green -🐉 dragon animal myth nature chinese green -🩕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct -🩖 t rex animal nature dinosaur tyrannosaurus extinct -🐳 spouting whale animal nature sea ocean -🐋 whale animal nature sea ocean -🐬 dolphin animal nature fish sea ocean flipper fins beach -🐟 fish animal food nature -🐠 tropical fish animal swim ocean beach nemo -🐡 blowfish animal nature food sea ocean -🩈 shark animal nature fish sea ocean jaws fins beach -🐙 octopus animal creature ocean sea nature beach -🐚 spiral shell nature sea beach -🐌 snail slow animal shell -🩋 butterfly animal insect nature caterpillar -🐛 bug animal insect nature worm -🐜 ant animal insect nature bug -🐝 honeybee animal insect nature bug spring honey -🐞 lady beetle animal insect nature ladybug -🩗 cricket animal cricket chirp -đŸ•·ïž spider animal arachnid -đŸ•žïž spider web animal insect arachnid silk -🩂 scorpion animal arachnid -🩟 mosquito animal nature insect malaria -🩠 microbe amoeba bacteria germs virus -💐 bouquet flowers nature spring -🌾 cherry blossom nature plant spring flower -💼 white flower japanese spring -đŸ”ïž rosette flower decoration military -đŸŒč rose flowers valentines love spring -đŸ„€ wilted flower plant nature flower -đŸŒș hibiscus plant vegetable flowers beach -đŸŒ» sunflower nature plant fall -đŸŒŒ blossom nature flowers yellow -đŸŒ· tulip flowers plant nature summer spring -đŸŒ± seedling plant nature grass lawn spring -đŸŒČ evergreen tree plant nature -🌳 deciduous tree plant nature -🌮 palm tree plant vegetable nature summer beach mojito tropical -đŸŒ” cactus vegetable plant nature -đŸŒŸ sheaf of rice nature plant -🌿 herb vegetable plant medicine weed grass lawn -☘ shamrock vegetable plant nature irish clover -🍀 four leaf clover vegetable plant nature lucky irish -🍁 maple leaf nature plant vegetable ca fall -🍂 fallen leaf nature plant vegetable leaves -🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring -🍇 grapes fruit food wine -🍈 melon fruit nature food -🍉 watermelon fruit food picnic summer -🍊 tangerine food fruit nature orange -🍋 lemon fruit nature -🍌 banana fruit food monkey -🍍 pineapple fruit nature food -đŸ„­ mango fruit food tropical -🍎 red apple fruit mac school -🍏 green apple fruit nature -🍐 pear fruit nature food -🍑 peach fruit nature food -🍒 cherries food fruit -🍓 strawberry fruit food nature -đŸ„ kiwi fruit fruit food -🍅 tomato fruit vegetable nature food -đŸ„„ coconut fruit nature food palm -đŸ„‘ avocado fruit food -🍆 eggplant vegetable nature food aubergine -đŸ„” potato food tuber vegatable starch -đŸ„• carrot vegetable food orange -đŸŒœ ear of corn food vegetable plant -đŸŒ¶ïž hot pepper food spicy chilli chili -đŸ„’ cucumber fruit food pickle -đŸ„Ź leafy green food vegetable plant bok choy cabbage kale lettuce -đŸ„Š broccoli fruit food vegetable -🧄 garlic food spice cook -🧅 onion cook food spice -🍄 mushroom plant vegetable -đŸ„œ peanuts food nut -🌰 chestnut food squirrel -🍞 bread food wheat breakfast toast -đŸ„ croissant food bread french -đŸ„– baguette bread food bread french -đŸ„š pretzel food bread twisted -đŸ„Ż bagel food bread bakery schmear -đŸ„ž pancakes food breakfast flapjacks hotcakes -🧇 waffle food breakfast -🧀 cheese wedge food chadder -🍖 meat on bone good food drumstick -🍗 poultry leg food meat drumstick bird chicken turkey -đŸ„© cut of meat food cow meat cut chop lambchop porkchop -đŸ„“ bacon food breakfast pork pig meat -🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king -🍟 french fries chips snack fast food -🍕 pizza food party -🌭 hot dog food frankfurter -đŸ„Ș sandwich food lunch bread -🌼 taco food mexican -🌯 burrito food mexican -đŸ„™ stuffed flatbread food flatbread stuffed gyro -🧆 falafel food -đŸ„š egg food chicken breakfast -🍳 cooking food breakfast kitchen egg -đŸ„˜ shallow pan of food food cooking casserole paella -đŸČ pot of food food meat soup -đŸ„Ł bowl with spoon food breakfast cereal oatmeal porridge -đŸ„— green salad food healthy lettuce -🍿 popcorn food movie theater films snack -🧈 butter food cook -🧂 salt condiment shaker -đŸ„« canned food food soup -đŸ± bento box food japanese box -🍘 rice cracker food japanese -🍙 rice ball food japanese -🍚 cooked rice food china asian -🍛 curry rice food spicy hot indian -🍜 steaming bowl food japanese noodle chopsticks -🍝 spaghetti food italian noodle -🍠 roasted sweet potato food nature -🍱 oden food japanese -🍣 sushi food fish japanese rice -đŸ€ fried shrimp food animal appetizer summer -đŸ„ fish cake with swirl food japan sea beach narutomaki pink swirl kamaboko surimi ramen -đŸ„ź moon cake food autumn -🍡 dango food dessert sweet japanese barbecue meat -đŸ„Ÿ dumpling food empanada pierogi potsticker -đŸ„  fortune cookie food prophecy -đŸ„Ą takeout box food leftovers -🩀 crab animal crustacean -🩞 lobster animal nature bisque claws seafood -🩐 shrimp animal ocean nature seafood -🩑 squid animal nature ocean sea -đŸŠȘ oyster food -🍩 soft ice cream food hot dessert summer -🍧 shaved ice hot dessert summer -🍹 ice cream food hot dessert -đŸ© doughnut food dessert snack sweet donut -đŸȘ cookie food snack oreo chocolate sweet dessert -🎂 birthday cake food dessert cake -🍰 shortcake food dessert -🧁 cupcake food dessert bakery sweet -đŸ„§ pie food dessert pastry -đŸ« chocolate bar food snack dessert sweet -🍬 candy snack dessert sweet lolly -🍭 lollipop food snack candy sweet -🍼 custard dessert food -🍯 honey pot bees sweet kitchen -đŸŒ baby bottle food container milk -đŸ„› glass of milk beverage drink cow -☕ hot beverage beverage caffeine latte espresso coffee -đŸ” teacup without handle drink bowl breakfast green british -đŸ¶ sake wine drink drunk beverage japanese alcohol booze -đŸŸ bottle with popping cork drink wine bottle celebration -đŸ· wine glass drink beverage drunk alcohol booze -🍾 cocktail glass drink drunk alcohol beverage booze mojito -đŸč tropical drink beverage cocktail summer beach alcohol booze mojito -đŸș beer mug relax beverage drink drunk party pub summer alcohol booze -đŸ» clinking beer mugs relax beverage drink drunk party pub summer alcohol booze -đŸ„‚ clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast -đŸ„ƒ tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky glass shot -đŸ„€ cup with straw drink soda -🧃 beverage box drink -🧉 mate drink tea beverage -🧊 ice water cold -đŸ„ą chopsticks food -đŸœïž fork and knife with plate food eat meal lunch dinner restaurant -🍮 fork and knife cutlery kitchen -đŸ„„ spoon cutlery kitchen tableware -đŸ”Ș kitchen knife knife blade cutlery kitchen weapon -đŸș amphora vase jar -🌍 globe showing europe africa globe world international -🌎 globe showing americas globe world USA international -🌏 globe showing asia australia globe world east international -🌐 globe with meridians earth international world internet interweb i18n -đŸ—ș world map location direction -đŸ—Ÿ map of japan nation country japanese asia -🧭 compass magnetic navigation orienteering -đŸ”ïž snow capped mountain photo nature environment winter cold -⛰ mountain photo nature environment -🌋 volcano photo nature disaster -đŸ—» mount fuji photo mountain nature japanese -đŸ•ïž camping photo outdoors tent -đŸ–ïž beach with umbrella weather summer sunny sand mojito -đŸœïž desert photo warm saharah -đŸïž desert island photo tropical mojito -đŸžïž national park photo environment nature -đŸŸïž stadium photo place sports concert venue -đŸ›ïž classical building art culture history -đŸ—ïž building construction wip working progress -đŸ§± brick bricks -đŸ˜ïž houses buildings photo -đŸšïž derelict house abandon evict broken building -🏠 house building home -🏡 house with garden home plant nature -🏱 office building building bureau work -🏣 japanese post office building envelope communication -đŸ€ post office building email -đŸ„ hospital building health surgery doctor -🏩 bank building money sales cash business enterprise -🏹 hotel building accomodation checkin -đŸ© love hotel like affection dating -đŸȘ convenience store building shopping groceries -đŸ« school building student education learn teach -🏬 department store building shopping mall -🏭 factory building industry pollution smoke -🏯 japanese castle photo building -🏰 castle building royalty history -💒 wedding love like affection couple marriage bride groom -đŸ—Œ tokyo tower photo japanese -đŸ—œ statue of liberty american newyork -â›Ș church building religion christ -🕌 mosque islam worship minaret -🛕 hindu temple religion -🕍 synagogue judaism worship temple jewish -⛩ shinto shrine temple japan kyoto -🕋 kaaba mecca mosque islam -â›Č fountain photo summer water fresh -â›ș tent photo camping outdoors -🌁 foggy photo mountain -🌃 night with stars evening city downtown -đŸ™ïž cityscape photo night life urban -🌄 sunrise over mountains view vacation photo -🌅 sunrise morning view vacation photo -🌆 cityscape at dusk photo evening sky buildings -🌇 sunset photo good morning dawn -🌉 bridge at night photo sanfrancisco -♚ hot springs bath warm relax -🎠 carousel horse photo carnival -🎡 ferris wheel photo carnival londoneye -🎱 roller coaster carnival playground photo fun -💈 barber pole hair salon style -đŸŽȘ circus tent festival carnival party -🚂 locomotive transportation vehicle train -🚃 railway car transportation vehicle -🚄 high speed train transportation vehicle -🚅 bullet train transportation vehicle speed fast public travel -🚆 train transportation vehicle -🚇 metro transportation blue-square mrt underground tube -🚈 light rail transportation vehicle -🚉 station transportation vehicle public -🚊 tram transportation vehicle -🚝 monorail transportation vehicle -🚞 mountain railway transportation vehicle -🚋 tram car transportation vehicle carriage public travel -🚌 bus car vehicle transportation -🚍 oncoming bus vehicle transportation -🚎 trolleybus bart transportation vehicle -🚐 minibus vehicle car transportation -🚑 ambulance health 911 hospital -🚒 fire engine transportation cars vehicle -🚓 police car vehicle cars transportation law legal enforcement -🚔 oncoming police car vehicle law legal enforcement 911 -🚕 taxi uber vehicle cars transportation -🚖 oncoming taxi vehicle cars uber -🚗 automobile red transportation vehicle -🚘 oncoming automobile car vehicle transportation -🚙 sport utility vehicle transportation vehicle -🚚 delivery truck cars transportation -🚛 articulated lorry vehicle cars transportation express -🚜 tractor vehicle car farming agriculture -đŸŽïž racing car sports race fast formula f1 -đŸïž motorcycle race sports fast -đŸ›” motor scooter vehicle vespa sasha -đŸŠœ manual wheelchair accessibility -đŸŠŒ motorized wheelchair accessibility -đŸ›ș auto rickshaw move transportation -đŸšČ bicycle sports bicycle exercise hipster -🛮 kick scooter vehicle kick razor -đŸ›č skateboard board -🚏 bus stop transportation wait -đŸ›Łïž motorway road cupertino interstate highway -đŸ›€ïž railway track train transportation -đŸ›ąïž oil drum barrell -⛜ fuel pump gas station petroleum -🚹 police car light police ambulance 911 emergency alert error pinged law legal -đŸš„ horizontal traffic light transportation signal -🚩 vertical traffic light transportation driving -🛑 stop sign stop -🚧 construction wip progress caution warning -⚓ anchor ship ferry sea boat -â›” sailboat ship summer transportation water sailing -đŸ›¶ canoe boat paddle water ship -đŸš€ speedboat ship transportation vehicle summer -đŸ›łïž passenger ship yacht cruise ferry -⛎ ferry boat ship yacht -đŸ›„ïž motor boat ship -🚱 ship transportation titanic deploy -✈ airplane vehicle transportation flight fly -đŸ›©ïž small airplane flight transportation fly vehicle -đŸ›« airplane departure airport flight landing -🛬 airplane arrival airport flight boarding -đŸȘ‚ parachute fly glide -đŸ’ș seat sit airplane transport bus flight fly -🚁 helicopter transportation vehicle fly -🚟 suspension railway vehicle transportation -🚠 mountain cableway transportation vehicle ski -🚡 aerial tramway transportation vehicle ski -đŸ›°ïž satellite communication gps orbit spaceflight NASA ISS -🚀 rocket launch ship staffmode NASA outer space outer space fly -🛾 flying saucer transportation vehicle ufo -đŸ›Žïž bellhop bell service -🧳 luggage packing travel -⌛ hourglass done time clock oldschool limit exam quiz test -⏳ hourglass not done oldschool time countdown -⌚ watch time accessories -⏰ alarm clock time wake -⏱ stopwatch time deadline -âČ timer clock alarm -đŸ•°ïž mantelpiece clock time -🕛 twelve o clock time noon midnight midday late early schedule -🕧 twelve thirty time late early schedule -🕐 one o clock time late early schedule -🕜 one thirty time late early schedule -🕑 two o clock time late early schedule -🕝 two thirty time late early schedule -🕒 three o clock time late early schedule -🕞 three thirty time late early schedule -🕓 four o clock time late early schedule -🕟 four thirty time late early schedule -🕔 five o clock time late early schedule -🕠 five thirty time late early schedule -🕕 six o clock time late early schedule dawn dusk -🕡 six thirty time late early schedule -🕖 seven o clock time late early schedule -🕱 seven thirty time late early schedule -🕗 eight o clock time late early schedule -🕣 eight thirty time late early schedule -🕘 nine o clock time late early schedule -đŸ•€ nine thirty time late early schedule -🕙 ten o clock time late early schedule -đŸ•„ ten thirty time late early schedule -🕚 eleven o clock time late early schedule -🕩 eleven thirty time late early schedule -🌑 new moon nature twilight planet space night evening sleep -🌒 waxing crescent moon nature twilight planet space night evening sleep -🌓 first quarter moon nature twilight planet space night evening sleep -🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep -🌕 full moon nature yellow twilight planet space night evening sleep -🌖 waning gibbous moon nature twilight planet space night evening sleep waxing gibbous moon -🌗 last quarter moon nature twilight planet space night evening sleep -🌘 waning crescent moon nature twilight planet space night evening sleep -🌙 crescent moon night sleep sky evening magic -🌚 new moon face nature twilight planet space night evening sleep -🌛 first quarter moon face nature twilight planet space night evening sleep -🌜 last quarter moon face nature twilight planet space night evening sleep -đŸŒĄïž thermometer weather temperature hot cold -☀ sun weather nature brightness summer beach spring -🌝 full moon face nature twilight planet space night evening sleep -🌞 sun with face nature morning sky -đŸȘ ringed planet outerspace -⭐ star night yellow -🌟 glowing star night sparkle awesome good magic -🌠 shooting star night photo -🌌 milky way photo space stars -☁ cloud weather sky -⛅ sun behind cloud weather nature cloudy morning fall spring -⛈ cloud with lightning and rain weather lightning -đŸŒ€ïž sun behind small cloud weather -đŸŒ„ïž sun behind large cloud weather -đŸŒŠïž sun behind rain cloud weather -đŸŒ§ïž cloud with rain weather -đŸŒšïž cloud with snow weather -đŸŒ©ïž cloud with lightning weather thunder -đŸŒȘ tornado weather cyclone twister -đŸŒ«ïž fog weather -đŸŒŹïž wind face gust air -🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon -🌈 rainbow nature happy unicorn face photo sky spring -🌂 closed umbrella weather rain drizzle -☂ umbrella weather spring -☔ umbrella with rain drops rainy weather spring -⛱ umbrella on ground weather summer -⚡ high voltage thunder weather lightning bolt fast -❄ snowflake winter season cold weather christmas xmas -☃ snowman winter season cold weather christmas xmas frozen -⛄ snowman without snow winter season cold weather christmas xmas frozen without snow -☄ comet space -đŸ”„ fire hot cook flame -💧 droplet water drip faucet spring -🌊 water wave sea water wave nature tsunami disaster -🎃 jack o lantern halloween light pumpkin creepy fall -🎄 christmas tree festival vacation december xmas celebration -🎆 fireworks photo festival carnival congratulations -🎇 sparkler stars night shine -🧹 firecracker dynamite boom explode explosion explosive -✹ sparkles stars shine shiny cool awesome good magic -🎈 balloon party celebration birthday circus -🎉 party popper party congratulations birthday magic circus celebration tada -🎊 confetti ball festival party birthday circus -🎋 tanabata tree plant nature branch summer -🎍 pine decoration plant nature vegetable panda pine decoration -🎎 japanese dolls japanese toy kimono -🎏 carp streamer fish japanese koinobori carp banner -🎐 wind chime nature ding spring bell -🎑 moon viewing ceremony photo japan asia tsukimi -🧧 red envelope gift -🎀 ribbon decoration pink girl bowtie -🎁 wrapped gift present birthday christmas xmas -đŸŽ—ïž reminder ribbon sports cause support awareness -đŸŽŸïž admission tickets sports concert entrance -đŸŽ« ticket event concert pass -đŸŽ–ïž military medal award winning army -🏆 trophy win award contest place ftw ceremony -🏅 sports medal award winning -đŸ„‡ 1st place medal award winning first -đŸ„ˆ 2nd place medal award second -đŸ„‰ 3rd place medal award third -âšœ soccer ball sports football -⚟ baseball sports balls -đŸ„Ž softball sports balls -🏀 basketball sports balls NBA -🏐 volleyball sports balls -🏈 american football sports balls NFL -🏉 rugby football sports team -đŸŽŸ tennis sports balls green -đŸ„ flying disc sports frisbee ultimate -🎳 bowling sports fun play -🏏 cricket game sports -🏑 field hockey sports -🏒 ice hockey sports -đŸ„ lacrosse sports ball stick -🏓 ping pong sports pingpong -🏾 badminton sports -đŸ„Š boxing glove sports fighting -đŸ„‹ martial arts uniform judo karate taekwondo -đŸ„… goal net sports -⛳ flag in hole sports business flag hole summer -⛞ ice skate sports -🎣 fishing pole food hobby summer -đŸ€ż diving mask sport ocean -đŸŽœ running shirt play pageant -🎿 skis sports winter cold snow -đŸ›· sled sleigh luge toboggan -đŸ„Œ curling stone sports -🎯 direct hit game play bar target bullseye -đŸȘ€ yo yo toy -đŸȘ kite wind fly -đŸŽ± pool 8 ball pool hobby game luck magic -🔼 crystal ball disco party magic circus fortune teller -🧿 nazar amulet bead charm -🎼 video game play console PS4 controller -đŸ•č joystick game play -🎰 slot machine bet gamble vegas fruit machine luck casino -đŸŽČ game die dice random tabletop play luck -đŸ§© puzzle piece interlocking puzzle piece -🧾 teddy bear plush stuffed -♠ spade suit poker cards suits magic -♄ heart suit poker cards magic suits -♊ diamond suit poker cards magic suits -â™Łïž club suit poker cards magic suits -♟ chess pawn expendable -🃏 joker poker cards game play magic -🀄 mahjong red dragon game play chinese kanji -🎮 flower playing cards game sunset red -🎭 performing arts acting theater drama -đŸ–Œïž framed picture photography -🎹 artist palette design paint draw colors -đŸ§” thread needle sewing spool string -đŸ§¶ yarn ball crochet knit -👓 glasses fashion accessories eyesight nerdy dork geek -đŸ•¶ïž sunglasses face cool accessories -đŸ„œ goggles eyes protection safety -đŸ„Œ lab coat doctor experiment scientist chemist -đŸŠș safety vest protection -👔 necktie shirt suitup formal fashion cloth business -👕 t shirt fashion cloth casual shirt tee -👖 jeans fashion shopping -🧣 scarf neck winter clothes -đŸ§€ gloves hands winter clothes -đŸ§„ coat jacket -🧩 socks stockings clothes -👗 dress clothes fashion shopping -👘 kimono dress fashion women female japanese -đŸ„» sari dress -đŸ©± one piece swimsuit fashion -đŸ©Č briefs clothing -đŸ©ł shorts clothing -👙 bikini swimming female woman girl fashion beach summer -👚 woman s clothes fashion shopping bags female -👛 purse fashion accessories money sales shopping -👜 handbag fashion accessory accessories shopping -👝 clutch bag bag accessories shopping -đŸ›ïž shopping bags mall buy purchase -🎒 backpack student education bag backpack -👞 man s shoe fashion male -👟 running shoe shoes sports sneakers -đŸ„Ÿ hiking boot backpacking camping hiking -đŸ„ż flat shoe ballet slip-on slipper -👠 high heeled shoe fashion shoes female pumps stiletto -👡 woman s sandal shoes fashion flip flops -đŸ©° ballet shoes dance -👱 woman s boot shoes fashion -👑 crown king kod leader royalty lord -👒 woman s hat fashion accessories female lady spring -đŸŽ© top hat magic gentleman classy circus -🎓 graduation cap school college degree university graduation cap hat legal learn education -🧱 billed cap cap baseball -⛑ rescue worker s helmet construction build -📿 prayer beads dhikr religious -💄 lipstick female girl fashion woman -💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement -💎 gem stone blue ruby diamond jewelry -🔇 muted speaker sound volume silence quiet -🔈 speaker low volume sound volume silence broadcast -🔉 speaker medium volume volume speaker broadcast -🔊 speaker high volume volume noise noisy speaker broadcast -📱 loudspeaker volume sound -📣 megaphone sound speaker volume -📯 postal horn instrument music -🔔 bell sound notification christmas xmas chime -🔕 bell with slash sound volume mute quiet silent -đŸŽŒ musical score treble clef compose -đŸŽ” musical note score tone sound -đŸŽ¶ musical notes music score -đŸŽ™ïž studio microphone sing recording artist talkshow -đŸŽšïž level slider scale -đŸŽ›ïž control knobs dial -đŸŽ€ microphone sound music PA sing talkshow -🎧 headphone music score gadgets -đŸ“» radio communication music podcast program -đŸŽ· saxophone music instrument jazz blues -🎾 guitar music instrument -đŸŽč musical keyboard piano instrument compose -đŸŽș trumpet music brass -đŸŽ» violin music instrument orchestra symphony -đŸȘ• banjo music instructment -đŸ„ drum music instrument drumsticks snare -đŸ“± mobile phone technology apple gadgets dial -đŸ“Č mobile phone with arrow iphone incoming -☎ telephone technology communication dial telephone -📞 telephone receiver technology communication dial -📟 pager bbcall oldschool 90s -📠 fax machine communication technology -🔋 battery power energy sustain -🔌 electric plug charger power -đŸ’» laptop technology laptop screen display monitor -đŸ–„ïž desktop computer technology computing screen -đŸ–šïž printer paper ink -⌚ keyboard technology computer type input text -đŸ–±ïž computer mouse click -đŸ–Č trackball technology trackpad -đŸ’œ computer disk technology record data disk 90s -đŸ’Ÿ floppy disk oldschool technology save 90s 80s -💿 optical disk technology dvd disk disc 90s -📀 dvd cd disk disc -🧼 abacus calculation -đŸŽ„ movie camera film record -đŸŽžïž film frames movie -đŸ“œïž film projector video tape record movie -🎬 clapper board movie film record -đŸ“ș television technology program oldschool show television -đŸ“· camera gadgets photography -📾 camera with flash photography gadgets -đŸ“č video camera film record -đŸ“Œ videocassette record video oldschool 90s 80s -🔍 magnifying glass tilted left search zoom find detective -🔎 magnifying glass tilted right search zoom find detective -đŸ•Żïž candle fire wax -💡 light bulb light electricity idea -🔩 flashlight dark camping sight night -🏼 red paper lantern light paper halloween spooky -đŸȘ” diya lamp lighting -📔 notebook with decorative cover classroom notes record paper study -📕 closed book read library knowledge textbook learn -📖 open book book read library knowledge literature learn study -📗 green book read library knowledge study -📘 blue book read library knowledge learn study -📙 orange book read library knowledge textbook study -📚 books literature library study -📓 notebook stationery record notes paper study -📒 ledger notes paper -📃 page with curl documents office paper -📜 scroll documents ancient history paper -📄 page facing up documents office paper information -📰 newspaper press headline -đŸ—žïž rolled up newspaper press headline -📑 bookmark tabs favorite save order tidy -🔖 bookmark favorite label save -đŸ·ïž label sale tag -💰 money bag dollar payment coins sale -💮 yen banknote money sales japanese dollar currency -đŸ’” dollar banknote money sales bill currency -đŸ’¶ euro banknote money sales dollar currency -đŸ’· pound banknote british sterling money sales bills uk england currency -💾 money with wings dollar bills payment sale -💳 credit card money sales dollar bill payment shopping -đŸ§Ÿ receipt accounting expenses -đŸ’č chart increasing with yen green-square graph presentation stats -đŸ’± currency exchange money sales dollar travel -đŸ’Č heavy dollar sign money sales payment currency buck -✉ envelope letter postal inbox communication -📧 e mail communication inbox -📹 incoming envelope email inbox -đŸ“© envelope with arrow email communication -đŸ“€ outbox tray inbox email -đŸ“„ inbox tray email documents -📩 package mail gift cardboard box moving -đŸ“« closed mailbox with raised flag email inbox communication -đŸ“Ș closed mailbox with lowered flag email communication inbox -📬 open mailbox with raised flag email inbox communication -📭 open mailbox with lowered flag email inbox -📼 postbox email letter envelope -đŸ—łïž ballot box with ballot election vote -✏ pencil stationery write paper writing school study -✒ black nib pen stationery writing write -đŸ–‹ïž fountain pen stationery writing write -đŸ–Šïž pen stationery writing write -đŸ–Œïž paintbrush drawing creativity art -đŸ–ïž crayon drawing creativity -📝 memo write documents stationery pencil paper writing legal exam quiz test study compose -đŸ’Œ briefcase business documents work law legal job career -📁 file folder documents business office -📂 open file folder documents load -đŸ—‚ïž card index dividers organizing business stationery -📅 calendar calendar schedule -📆 tear off calendar schedule date planning -đŸ—’ïž spiral notepad memo stationery -đŸ—“ïž spiral calendar date schedule planning -📇 card index business stationery -📈 chart increasing graph presentation stats recovery business economics money sales good success -📉 chart decreasing graph presentation stats recession business economics money sales bad failure -📊 bar chart graph presentation stats -📋 clipboard stationery documents -📌 pushpin stationery mark here -📍 round pushpin stationery location map here -📎 paperclip documents stationery -đŸ–‡ïž linked paperclips documents stationery -📏 straight ruler stationery calculate length math school drawing architect sketch -📐 triangular ruler stationery math architect sketch -✂ scissors stationery cut -đŸ—ƒïž card file box business stationery -đŸ—„ïž file cabinet filing organizing -đŸ—‘ïž wastebasket bin trash rubbish garbage toss -🔒 locked security password padlock -🔓 unlocked privacy security -🔏 locked with pen security secret -🔐 locked with key security privacy -🔑 key lock door password -đŸ—ïž old key lock door password -🔹 hammer tools build create -đŸȘ“ axe tool chop cut -⛏ pick tools dig -⚒ hammer and pick tools build create -đŸ› ïž hammer and wrench tools build create -đŸ—Ąïž dagger weapon -⚔ crossed swords weapon -đŸ”« pistol violence weapon pistol revolver -đŸč bow and arrow sports -đŸ›Ąïž shield protection security -🔧 wrench tools diy ikea fix maintainer -đŸ”© nut and bolt handy tools fix -⚙ gear cog -đŸ—œïž clamp tool -⚖ balance scale law fairness weight -🩯 probing cane accessibility -🔗 link rings url -⛓ chains lock arrest -🧰 toolbox tools diy fix maintainer mechanic -đŸ§Č magnet attraction magnetic -⚗ alembic distilling science experiment chemistry -đŸ§Ș test tube chemistry experiment lab science -đŸ§« petri dish bacteria biology culture lab -🧬 dna biologist genetics life -🔬 microscope laboratory experiment zoomin science study -🔭 telescope stars space zoom science astronomy -📡 satellite antenna communication future radio space -💉 syringe health hospital drugs blood medicine needle doctor nurse -đŸ©ž drop of blood period hurt harm wound -💊 pill health medicine doctor pharmacy drug -đŸ©č adhesive bandage heal -đŸ©ș stethoscope health -đŸšȘ door house entry exit -đŸ›ïž bed sleep rest -đŸ›‹ïž couch and lamp read chill -đŸȘ‘ chair sit furniture -đŸšœ toilet restroom wc washroom bathroom potty -🚿 shower clean water bathroom -🛁 bathtub clean shower bathroom -đŸȘ’ razor cut -🧮 lotion bottle moisturizer sunscreen -đŸ§· safety pin diaper -đŸ§č broom cleaning sweeping witch -đŸ§ș basket laundry -đŸ§» roll of paper roll -đŸ§Œ soap bar bathing cleaning lather -đŸ§œ sponge absorbing cleaning porous -🧯 fire extinguisher quench -🛒 shopping cart trolley -🚬 cigarette kills tobacco cigarette joint smoke -⚰ coffin vampire dead die death rip graveyard cemetery casket funeral box -⚱ funeral urn dead die death rip ashes -🗿 moai rock easter island moai -🏧 atm sign money sales cash blue-square payment bank -🚼 litter in bin sign blue-square sign human info -🚰 potable water blue-square liquid restroom cleaning faucet -♿ wheelchair symbol blue-square disabled accessibility -đŸšč men s room toilet restroom wc blue-square gender male -đŸšș women s room purple-square woman female toilet loo restroom gender -đŸš» restroom blue-square toilet refresh wc gender -đŸšŒ baby symbol orange-square child -đŸšŸ water closet toilet restroom blue-square -🛂 passport control custom blue-square -🛃 customs passport border blue-square -🛄 baggage claim blue-square airport transport -🛅 left luggage blue-square travel -⚠ warning exclamation wip alert error problem issue -🚾 children crossing school warning danger sign driving yellow-diamond -⛔ no entry limit security privacy bad denied stop circle -đŸš« prohibited forbid stop limit denied disallow circle -🚳 no bicycles cyclist prohibited circle -🚭 no smoking cigarette blue-square smell smoke -🚯 no littering trash bin garbage circle -đŸš± non potable water drink faucet tap circle -đŸš· no pedestrians rules crossing walking circle -đŸ“” no mobile phones iphone mute circle -🔞 no one under eighteen 18 drink pub night minor circle -â˜ąïž radioactive nuclear danger -â˜Łïž biohazard danger -âŹ†ïž up arrow blue-square continue top direction -↗ up right arrow blue-square point direction diagonal northeast -âžĄïž right arrow blue-square next -↘ down right arrow blue-square direction diagonal southeast -âŹ‡ïž down arrow blue-square direction bottom -↙ down left arrow blue-square direction diagonal southwest -âŹ…ïž left arrow blue-square previous back -↖ up left arrow blue-square point direction diagonal northwest -↕ up down arrow blue-square direction way vertical -↔ left right arrow shape direction horizontal sideways -↩ right arrow curving left back return blue-square undo enter -â†Ș left arrow curving right blue-square return rotate direction -‎ right arrow curving up blue-square direction top -— right arrow curving down blue-square direction bottom -🔃 clockwise vertical arrows sync cycle round repeat -🔄 counterclockwise arrows button blue-square sync cycle -🔙 back arrow arrow words return -🔚 end arrow words arrow -🔛 on arrow arrow words -🔜 soon arrow arrow words -🔝 top arrow words blue-square -🛐 place of worship religion church temple prayer -⚛ atom symbol science physics chemistry -đŸ•‰ïž om hinduism buddhism sikhism jainism -âœĄïž star of david judaism -☞ wheel of dharma hinduism buddhism sikhism jainism -â˜Żïž yin yang balance -✝ latin cross christianity -☊ orthodox cross suppedaneum religion -â˜Ș star and crescent islam -â˜źïž peace symbol hippie -🕎 menorah hanukkah candles jewish -🔯 dotted six pointed star purple-square religion jewish hexagram -♈ aries sign purple-square zodiac astrology -♉ taurus purple-square sign zodiac astrology -♊ gemini sign zodiac purple-square astrology -♋ cancer sign zodiac purple-square astrology -♌ leo sign purple-square zodiac astrology -♍ virgo sign zodiac purple-square astrology -♎ libra sign purple-square zodiac astrology -♏ scorpio sign zodiac purple-square astrology scorpio -♐ sagittarius sign zodiac purple-square astrology -♑ capricorn sign zodiac purple-square astrology -♒ aquarius sign purple-square zodiac astrology -♓ pisces purple-square sign zodiac astrology -⛎ ophiuchus sign purple-square constellation astrology -🔀 shuffle tracks button blue-square shuffle music random -🔁 repeat button loop record -🔂 repeat single button blue-square loop -▶ play button blue-square right direction play -⏩ fast forward button blue-square play speed continue -⏭ next track button forward next blue-square -âŻïž play or pause button blue-square play pause -◀ reverse button blue-square left direction -âȘ fast reverse button play blue-square -âźïž last track button backward -đŸ”Œ upwards button blue-square triangle direction point forward top -⏫ fast up button blue-square direction top -đŸ”œ downwards button blue-square direction bottom -⏬ fast down button blue-square direction bottom -⏞ pause button pause blue-square -âč stop button blue-square -âș record button blue-square -⏏ eject button blue-square -🎩 cinema blue-square record film movie curtain stage theater -🔅 dim button sun afternoon warm summer -🔆 bright button sun light -đŸ“¶ antenna bars blue-square reception phone internet connection wifi bluetooth bars -📳 vibration mode orange-square phone -📮 mobile phone off mute orange-square silence quiet -♀ female sign woman women lady girl -♂ male sign man boy men -⚕ medical symbol health hospital -♟ infinity forever -♻ recycling symbol arrow environment garbage trash -⚜ fleur de lis decorative scout -đŸ”± trident emblem weapon spear -📛 name badge fire forbid -🔰 japanese symbol for beginner badge shield -⭕ hollow red circle circle round -✅ check mark button green-square ok agree vote election answer tick -☑ check box with check ok agree confirm black-square vote election yes tick -✔ check mark ok nike answer yes tick -✖ multiplication sign math calculation -❌ cross mark no delete remove cancel red -❎ cross mark button x green-square no deny -➕ plus sign math calculation addition more increase -➖ minus sign math calculation subtract less -➗ division sign divide math calculation -➰ curly loop scribble draw shape squiggle -➿ double curly loop tape cassette -ă€œïž part alternation mark graph presentation stats business economics bad -âœłïž eight spoked asterisk star sparkle green-square -✎ eight pointed star orange-square shape polygon -❇ sparkle stars green-square awesome good fireworks -‌ double exclamation mark exclamation surprise -⁉ exclamation question mark wat punctuation surprise -❓ question mark doubt confused -❔ white question mark doubts gray huh confused -❕ white exclamation mark surprise punctuation gray wow warning -❗ exclamation mark heavy exclamation mark danger surprise punctuation wow warning -ă€°ïž wavy dash draw line moustache mustache squiggle scribble -© copyright ip license circle law legal -Âźïž registered alphabet circle -â„ąïž trade mark trademark brand law legal -#ïžâƒŁ keycap symbol blue-square twitter -*ïžâƒŁ keycap star keycap -0ïžâƒŁ keycap 0 0 numbers blue-square null -1ïžâƒŁ keycap 1 blue-square numbers 1 -2ïžâƒŁ keycap 2 numbers 2 prime blue-square -3ïžâƒŁ keycap 3 3 numbers prime blue-square -4ïžâƒŁ keycap 4 4 numbers blue-square -5ïžâƒŁ keycap 5 5 numbers blue-square prime -6ïžâƒŁ keycap 6 6 numbers blue-square -7ïžâƒŁ keycap 7 7 numbers blue-square prime -8ïžâƒŁ keycap 8 8 blue-square numbers -9ïžâƒŁ keycap 9 blue-square numbers 9 -🔟 keycap 10 numbers 10 blue-square -🔠 input latin uppercase alphabet words blue-square -🔡 input latin lowercase blue-square alphabet -🔱 input numbers numbers blue-square -🔣 input symbols blue-square music note ampersand percent glyphs characters -đŸ”€ input latin letters blue-square alphabet -đŸ…°ïž a button red-square alphabet letter -🆎 ab button red-square alphabet -đŸ…±ïž b button red-square alphabet letter -🆑 cl button alphabet words red-square -🆒 cool button words blue-square -🆓 free button blue-square words -â„č information blue-square alphabet letter -🆔 id button purple-square words -Ⓜ circled m alphabet blue-circle letter -🆕 new button blue-square words start -🆖 ng button blue-square words shape icon -đŸ…Ÿïž o button alphabet red-square letter -🆗 ok button good agree yes blue-square -đŸ…żïž p button cars blue-square alphabet letter -🆘 sos button help red-square words emergency 911 -🆙 up button blue-square above high -🆚 vs button words orange-square -🈁 japanese here button blue-square here katakana japanese destination -đŸˆ‚ïž japanese service charge button japanese blue-square katakana -đŸˆ·ïž japanese monthly amount button chinese month moon japanese orange-square kanji -đŸˆ¶ japanese not free of charge button orange-square chinese have kanji -🈯 japanese reserved button chinese point green-square kanji -🉐 japanese bargain button chinese kanji obtain get circle -đŸˆč japanese discount button cut divide chinese kanji pink-square -🈚 japanese free of charge button nothing chinese kanji japanese orange-square -đŸˆČ japanese prohibited button kanji japanese chinese forbidden limit restricted red-square -🉑 japanese acceptable button ok good chinese kanji agree yes orange-circle -🈾 japanese application button chinese japanese kanji orange-square -🈮 japanese passing grade button japanese chinese join kanji red-square -🈳 japanese vacancy button kanji japanese chinese empty sky blue-square -ăŠ—ïž japanese congratulations button chinese kanji japanese red-circle -ăŠ™ïž japanese secret button privacy chinese sshh kanji red-circle -đŸˆș japanese open for business button japanese opening hours orange-square -đŸˆ” japanese no vacancy button full chinese japanese red-square kanji -🔮 red circle shape error danger -🟠 orange circle round -🟡 yellow circle round -🟱 green circle round -đŸ”” blue circle shape icon button -🟣 purple circle round -đŸŸ€ brown circle round -⚫ black circle shape button round -âšȘ white circle shape round -đŸŸ„ red square -🟧 orange square -🟹 yellow square -đŸŸ© green square -🟩 blue square -đŸŸȘ purple square -đŸŸ« brown square -⬛ black large square shape icon button -⬜ white large square shape icon stone button -◌ black medium square shape button icon -◻ white medium square shape stone icon -â—Ÿ black medium small square icon shape button -â—œ white medium small square shape stone icon button -â–Ș black small square shape icon -▫ white small square shape icon -đŸ”¶ large orange diamond shape jewel gem -đŸ”· large blue diamond shape jewel gem -🔾 small orange diamond shape jewel gem -đŸ”č small blue diamond shape jewel gem -đŸ”ș red triangle pointed up shape direction up top -đŸ”» red triangle pointed down shape direction bottom -💠 diamond with a dot jewel blue gem crystal fancy -🔘 radio button input old music circle -🔳 white square button shape input -đŸ”Č black square button shape input frame -🏁 chequered flag contest finishline race gokart -đŸš© triangular flag mark milestone place -🎌 crossed flags japanese nation country border -🏮 black flag pirate -đŸłïž white flag losing loser lost surrender give up fail -đŸłïžâ€đŸŒˆ rainbow flag flag rainbow pride gay lgbt glbt queer homosexual lesbian bisexual transgender -đŸŽâ€â˜ ïž pirate flag skull crossbones flag banner -🇩🇹 flag ascension island -đŸ‡ŠđŸ‡© flag andorra ad flag nation country banner andorra -🇩đŸ‡Ș flag united arab emirates united arab emirates flag nation country banner united arab emirates -đŸ‡ŠđŸ‡« flag afghanistan af flag nation country banner afghanistan -🇩🇬 flag antigua barbuda antigua barbuda flag nation country banner antigua barbuda -🇩🇼 flag anguilla ai flag nation country banner anguilla -đŸ‡ŠđŸ‡± flag albania al flag nation country banner albania -🇩đŸ‡Č flag armenia am flag nation country banner armenia -🇩🇮 flag angola ao flag nation country banner angola -đŸ‡ŠđŸ‡¶ flag antarctica aq flag nation country banner antarctica -đŸ‡ŠđŸ‡· flag argentina ar flag nation country banner argentina -🇩🇾 flag american samoa american ws flag nation country banner american samoa -🇩đŸ‡č flag austria at flag nation country banner austria -🇩đŸ‡ș flag australia au flag nation country banner australia -đŸ‡ŠđŸ‡Œ flag aruba aw flag nation country banner aruba -đŸ‡ŠđŸ‡œ flag aland islands Åland islands flag nation country banner aland islands -🇩🇿 flag azerbaijan az flag nation country banner azerbaijan -🇧🇩 flag bosnia herzegovina bosnia herzegovina flag nation country banner bosnia herzegovina -🇧🇧 flag barbados bb flag nation country banner barbados -đŸ‡§đŸ‡© flag bangladesh bd flag nation country banner bangladesh -🇧đŸ‡Ș flag belgium be flag nation country banner belgium -đŸ‡§đŸ‡« flag burkina faso burkina faso flag nation country banner burkina faso -🇧🇬 flag bulgaria bg flag nation country banner bulgaria -🇧🇭 flag bahrain bh flag nation country banner bahrain -🇧🇼 flag burundi bi flag nation country banner burundi -🇧🇯 flag benin bj flag nation country banner benin -đŸ‡§đŸ‡± flag st barthelemy saint barthĂ©lemy flag nation country banner st barthelemy -🇧đŸ‡Č flag bermuda bm flag nation country banner bermuda -🇧🇳 flag brunei bn darussalam flag nation country banner brunei -🇧🇮 flag bolivia bo flag nation country banner bolivia -đŸ‡§đŸ‡¶ flag caribbean netherlands bonaire flag nation country banner caribbean netherlands -đŸ‡§đŸ‡· flag brazil br flag nation country banner brazil -🇧🇾 flag bahamas bs flag nation country banner bahamas -🇧đŸ‡č flag bhutan bt flag nation country banner bhutan -đŸ‡§đŸ‡» flag bouvet island norway -đŸ‡§đŸ‡Œ flag botswana bw flag nation country banner botswana -đŸ‡§đŸ‡Ÿ flag belarus by flag nation country banner belarus -🇧🇿 flag belize bz flag nation country banner belize -🇹🇩 flag canada ca flag nation country banner canada -🇹🇹 flag cocos islands cocos keeling islands flag nation country banner cocos islands -đŸ‡šđŸ‡© flag congo kinshasa congo democratic republic flag nation country banner congo kinshasa -đŸ‡šđŸ‡« flag central african republic central african republic flag nation country banner central african republic -🇹🇬 flag congo brazzaville congo flag nation country banner congo brazzaville -🇹🇭 flag switzerland ch flag nation country banner switzerland -🇹🇼 flag cote d ivoire ivory coast flag nation country banner cote d ivoire -🇹🇰 flag cook islands cook islands flag nation country banner cook islands -đŸ‡šđŸ‡± flag chile flag nation country banner chile -🇹đŸ‡Č flag cameroon cm flag nation country banner cameroon -🇹🇳 flag china china chinese prc flag country nation banner china -🇹🇮 flag colombia co flag nation country banner colombia -đŸ‡šđŸ‡” flag clipperton island -đŸ‡šđŸ‡· flag costa rica costa rica flag nation country banner costa rica -🇹đŸ‡ș flag cuba cu flag nation country banner cuba -đŸ‡šđŸ‡» flag cape verde cabo verde flag nation country banner cape verde -đŸ‡šđŸ‡Œ flag curacao curaçao flag nation country banner curacao -đŸ‡šđŸ‡œ flag christmas island christmas island flag nation country banner christmas island -đŸ‡šđŸ‡Ÿ flag cyprus cy flag nation country banner cyprus -🇹🇿 flag czechia cz flag nation country banner czechia -đŸ‡©đŸ‡Ș flag germany german nation flag country banner germany -đŸ‡©đŸ‡Ź flag diego garcia -đŸ‡©đŸ‡Ż flag djibouti dj flag nation country banner djibouti -đŸ‡©đŸ‡° flag denmark dk flag nation country banner denmark -đŸ‡©đŸ‡Č flag dominica dm flag nation country banner dominica -đŸ‡©đŸ‡Ž flag dominican republic dominican republic flag nation country banner dominican republic -đŸ‡©đŸ‡ż flag algeria dz flag nation country banner algeria -đŸ‡Ș🇩 flag ceuta melilla -đŸ‡Ș🇹 flag ecuador ec flag nation country banner ecuador -đŸ‡ȘđŸ‡Ș flag estonia ee flag nation country banner estonia -đŸ‡Ș🇬 flag egypt eg flag nation country banner egypt -đŸ‡Ș🇭 flag western sahara western sahara flag nation country banner western sahara -đŸ‡ȘđŸ‡· flag eritrea er flag nation country banner eritrea -đŸ‡Ș🇾 flag spain spain flag nation country banner spain -đŸ‡ȘđŸ‡č flag ethiopia et flag nation country banner ethiopia -đŸ‡ȘđŸ‡ș flag european union european union flag banner -đŸ‡«đŸ‡ź flag finland fi flag nation country banner finland -đŸ‡«đŸ‡Ż flag fiji fj flag nation country banner fiji -đŸ‡«đŸ‡° flag falkland islands falkland islands malvinas flag nation country banner falkland islands -đŸ‡«đŸ‡Č flag micronesia micronesia federated states flag nation country banner micronesia -đŸ‡«đŸ‡Ž flag faroe islands faroe islands flag nation country banner faroe islands -đŸ‡«đŸ‡· flag france banner flag nation france french country france -🇬🇩 flag gabon ga flag nation country banner gabon -🇬🇧 flag united kingdom united kingdom great britain northern ireland flag nation country banner british UK english england union jack united kingdom -đŸ‡ŹđŸ‡© flag grenada gd flag nation country banner grenada -🇬đŸ‡Ș flag georgia ge flag nation country banner georgia -đŸ‡ŹđŸ‡« flag french guiana french guiana flag nation country banner french guiana -🇬🇬 flag guernsey gg flag nation country banner guernsey -🇬🇭 flag ghana gh flag nation country banner ghana -🇬🇼 flag gibraltar gi flag nation country banner gibraltar -đŸ‡ŹđŸ‡± flag greenland gl flag nation country banner greenland -🇬đŸ‡Č flag gambia gm flag nation country banner gambia -🇬🇳 flag guinea gn flag nation country banner guinea -đŸ‡ŹđŸ‡” flag guadeloupe gp flag nation country banner guadeloupe -đŸ‡ŹđŸ‡¶ flag equatorial guinea equatorial gn flag nation country banner equatorial guinea -đŸ‡ŹđŸ‡· flag greece gr flag nation country banner greece -🇬🇾 flag south georgia south sandwich islands south georgia sandwich islands flag nation country banner south georgia south sandwich islands -🇬đŸ‡č flag guatemala gt flag nation country banner guatemala -🇬đŸ‡ș flag guam gu flag nation country banner guam -đŸ‡ŹđŸ‡Œ flag guinea bissau gw bissau flag nation country banner guinea bissau -đŸ‡ŹđŸ‡Ÿ flag guyana gy flag nation country banner guyana -🇭🇰 flag hong kong sar china hong kong flag nation country banner hong kong sar china -🇭đŸ‡Č flag heard mcdonald islands -🇭🇳 flag honduras hn flag nation country banner honduras -đŸ‡­đŸ‡· flag croatia hr flag nation country banner croatia -🇭đŸ‡č flag haiti ht flag nation country banner haiti -🇭đŸ‡ș flag hungary hu flag nation country banner hungary -🇼🇹 flag canary islands canary islands flag nation country banner canary islands -đŸ‡źđŸ‡© flag indonesia flag nation country banner indonesia -🇼đŸ‡Ș flag ireland ie flag nation country banner ireland -đŸ‡źđŸ‡± flag israel il flag nation country banner israel -🇼đŸ‡Č flag isle of man isle man flag nation country banner isle of man -🇼🇳 flag india in flag nation country banner india -🇼🇮 flag british indian ocean territory british indian ocean territory flag nation country banner british indian ocean territory -đŸ‡źđŸ‡¶ flag iraq iq flag nation country banner iraq -đŸ‡źđŸ‡· flag iran iran islamic republic flag nation country banner iran -🇼🇾 flag iceland is flag nation country banner iceland -🇼đŸ‡č flag italy italy flag nation country banner italy -🇯đŸ‡Ș flag jersey je flag nation country banner jersey -🇯đŸ‡Č flag jamaica jm flag nation country banner jamaica -🇯🇮 flag jordan jo flag nation country banner jordan -đŸ‡ŻđŸ‡” flag japan japanese nation flag country banner japan -🇰đŸ‡Ș flag kenya ke flag nation country banner kenya -🇰🇬 flag kyrgyzstan kg flag nation country banner kyrgyzstan -🇰🇭 flag cambodia kh flag nation country banner cambodia -🇰🇼 flag kiribati ki flag nation country banner kiribati -🇰đŸ‡Č flag comoros km flag nation country banner comoros -🇰🇳 flag st kitts nevis saint kitts nevis flag nation country banner st kitts nevis -đŸ‡°đŸ‡” flag north korea north korea nation flag country banner north korea -đŸ‡°đŸ‡· flag south korea south korea nation flag country banner south korea -đŸ‡°đŸ‡Œ flag kuwait kw flag nation country banner kuwait -đŸ‡°đŸ‡Ÿ flag cayman islands cayman islands flag nation country banner cayman islands -🇰🇿 flag kazakhstan kz flag nation country banner kazakhstan -đŸ‡±đŸ‡Š flag laos lao democratic republic flag nation country banner laos -đŸ‡±đŸ‡§ flag lebanon lb flag nation country banner lebanon -đŸ‡±đŸ‡š flag st lucia saint lucia flag nation country banner st lucia -đŸ‡±đŸ‡ź flag liechtenstein li flag nation country banner liechtenstein -đŸ‡±đŸ‡° flag sri lanka sri lanka flag nation country banner sri lanka -đŸ‡±đŸ‡· flag liberia lr flag nation country banner liberia -đŸ‡±đŸ‡ž flag lesotho ls flag nation country banner lesotho -đŸ‡±đŸ‡č flag lithuania lt flag nation country banner lithuania -đŸ‡±đŸ‡ș flag luxembourg lu flag nation country banner luxembourg -đŸ‡±đŸ‡» flag latvia lv flag nation country banner latvia -đŸ‡±đŸ‡Ÿ flag libya ly flag nation country banner libya -đŸ‡Č🇩 flag morocco ma flag nation country banner morocco -đŸ‡Č🇹 flag monaco mc flag nation country banner monaco -đŸ‡ČđŸ‡© flag moldova moldova republic flag nation country banner moldova -đŸ‡ČđŸ‡Ș flag montenegro me flag nation country banner montenegro -đŸ‡ČđŸ‡« flag st martin -đŸ‡Č🇬 flag madagascar mg flag nation country banner madagascar -đŸ‡Č🇭 flag marshall islands marshall islands flag nation country banner marshall islands -đŸ‡Č🇰 flag north macedonia macedonia flag nation country banner north macedonia -đŸ‡ČđŸ‡± flag mali ml flag nation country banner mali -đŸ‡ČđŸ‡Č flag myanmar mm flag nation country banner myanmar -đŸ‡Č🇳 flag mongolia mn flag nation country banner mongolia -đŸ‡Č🇮 flag macao sar china macao flag nation country banner macao sar china -đŸ‡ČđŸ‡” flag northern mariana islands northern mariana islands flag nation country banner northern mariana islands -đŸ‡ČđŸ‡¶ flag martinique mq flag nation country banner martinique -đŸ‡ČđŸ‡· flag mauritania mr flag nation country banner mauritania -đŸ‡Č🇾 flag montserrat ms flag nation country banner montserrat -đŸ‡ČđŸ‡č flag malta mt flag nation country banner malta -đŸ‡ČđŸ‡ș flag mauritius mu flag nation country banner mauritius -đŸ‡ČđŸ‡» flag maldives mv flag nation country banner maldives -đŸ‡ČđŸ‡Œ flag malawi mw flag nation country banner malawi -đŸ‡ČđŸ‡œ flag mexico mx flag nation country banner mexico -đŸ‡ČđŸ‡Ÿ flag malaysia my flag nation country banner malaysia -đŸ‡Č🇿 flag mozambique mz flag nation country banner mozambique -🇳🇩 flag namibia na flag nation country banner namibia -🇳🇹 flag new caledonia new caledonia flag nation country banner new caledonia -🇳đŸ‡Ș flag niger ne flag nation country banner niger -đŸ‡łđŸ‡« flag norfolk island norfolk island flag nation country banner norfolk island -🇳🇬 flag nigeria flag nation country banner nigeria -🇳🇼 flag nicaragua ni flag nation country banner nicaragua -đŸ‡łđŸ‡± flag netherlands nl flag nation country banner netherlands -🇳🇮 flag norway no flag nation country banner norway -đŸ‡łđŸ‡” flag nepal np flag nation country banner nepal -đŸ‡łđŸ‡· flag nauru nr flag nation country banner nauru -🇳đŸ‡ș flag niue nu flag nation country banner niue -🇳🇿 flag new zealand new zealand flag nation country banner new zealand -🇮đŸ‡Č flag oman om symbol flag nation country banner oman -đŸ‡”đŸ‡Š flag panama pa flag nation country banner panama -đŸ‡”đŸ‡Ș flag peru pe flag nation country banner peru -đŸ‡”đŸ‡« flag french polynesia french polynesia flag nation country banner french polynesia -đŸ‡”đŸ‡Ź flag papua new guinea papua new guinea flag nation country banner papua new guinea -đŸ‡”đŸ‡­ flag philippines ph flag nation country banner philippines -đŸ‡”đŸ‡° flag pakistan pk flag nation country banner pakistan -đŸ‡”đŸ‡± flag poland pl flag nation country banner poland -đŸ‡”đŸ‡Č flag st pierre miquelon saint pierre miquelon flag nation country banner st pierre miquelon -đŸ‡”đŸ‡ł flag pitcairn islands pitcairn flag nation country banner pitcairn islands -đŸ‡”đŸ‡· flag puerto rico puerto rico flag nation country banner puerto rico -đŸ‡”đŸ‡ž flag palestinian territories palestine palestinian territories flag nation country banner palestinian territories -đŸ‡”đŸ‡č flag portugal pt flag nation country banner portugal -đŸ‡”đŸ‡Œ flag palau pw flag nation country banner palau -đŸ‡”đŸ‡Ÿ flag paraguay py flag nation country banner paraguay -đŸ‡¶đŸ‡Š flag qatar qa flag nation country banner qatar -đŸ‡·đŸ‡Ș flag reunion rĂ©union flag nation country banner reunion -đŸ‡·đŸ‡Ž flag romania ro flag nation country banner romania -đŸ‡·đŸ‡ž flag serbia rs flag nation country banner serbia -đŸ‡·đŸ‡ș flag russia russian federation flag nation country banner russia -đŸ‡·đŸ‡Œ flag rwanda rw flag nation country banner rwanda -🇾🇩 flag saudi arabia flag nation country banner saudi arabia -🇾🇧 flag solomon islands solomon islands flag nation country banner solomon islands -🇾🇹 flag seychelles sc flag nation country banner seychelles -đŸ‡žđŸ‡© flag sudan sd flag nation country banner sudan -🇾đŸ‡Ș flag sweden se flag nation country banner sweden -🇾🇬 flag singapore sg flag nation country banner singapore -🇾🇭 flag st helena saint helena ascension tristan cunha flag nation country banner st helena -🇾🇼 flag slovenia si flag nation country banner slovenia -🇾🇯 flag svalbard jan mayen -🇾🇰 flag slovakia sk flag nation country banner slovakia -đŸ‡žđŸ‡± flag sierra leone sierra leone flag nation country banner sierra leone -🇾đŸ‡Č flag san marino san marino flag nation country banner san marino -🇾🇳 flag senegal sn flag nation country banner senegal -🇾🇮 flag somalia so flag nation country banner somalia -đŸ‡žđŸ‡· flag suriname sr flag nation country banner suriname -🇾🇾 flag south sudan south sd flag nation country banner south sudan -🇾đŸ‡č flag sao tome principe sao tome principe flag nation country banner sao tome principe -đŸ‡žđŸ‡» flag el salvador el salvador flag nation country banner el salvador -đŸ‡žđŸ‡œ flag sint maarten sint maarten dutch flag nation country banner sint maarten -đŸ‡žđŸ‡Ÿ flag syria syrian arab republic flag nation country banner syria -🇾🇿 flag eswatini sz flag nation country banner eswatini -đŸ‡č🇩 flag tristan da cunha -đŸ‡č🇹 flag turks caicos islands turks caicos islands flag nation country banner turks caicos islands -đŸ‡čđŸ‡© flag chad td flag nation country banner chad -đŸ‡čđŸ‡« flag french southern territories french southern territories flag nation country banner french southern territories -đŸ‡č🇬 flag togo tg flag nation country banner togo -đŸ‡č🇭 flag thailand th flag nation country banner thailand -đŸ‡č🇯 flag tajikistan tj flag nation country banner tajikistan -đŸ‡č🇰 flag tokelau tk flag nation country banner tokelau -đŸ‡čđŸ‡± flag timor leste timor leste flag nation country banner timor leste -đŸ‡čđŸ‡Č flag turkmenistan flag nation country banner turkmenistan -đŸ‡č🇳 flag tunisia tn flag nation country banner tunisia -đŸ‡č🇮 flag tonga to flag nation country banner tonga -đŸ‡čđŸ‡· flag turkey turkey flag nation country banner turkey -đŸ‡čđŸ‡č flag trinidad tobago trinidad tobago flag nation country banner trinidad tobago -đŸ‡čđŸ‡» flag tuvalu flag nation country banner tuvalu -đŸ‡čđŸ‡Œ flag taiwan tw flag nation country banner taiwan -đŸ‡č🇿 flag tanzania tanzania united republic flag nation country banner tanzania -đŸ‡ș🇩 flag ukraine ua flag nation country banner ukraine -đŸ‡ș🇬 flag uganda ug flag nation country banner uganda -đŸ‡șđŸ‡Č flag u s outlying islands -đŸ‡ș🇳 flag united nations un flag banner -đŸ‡ș🇾 flag united states united states america flag nation country banner united states -đŸ‡șđŸ‡Ÿ flag uruguay uy flag nation country banner uruguay -đŸ‡ș🇿 flag uzbekistan uz flag nation country banner uzbekistan -đŸ‡»đŸ‡Š flag vatican city vatican city flag nation country banner vatican city -đŸ‡»đŸ‡š flag st vincent grenadines saint vincent grenadines flag nation country banner st vincent grenadines -đŸ‡»đŸ‡Ș flag venezuela ve bolivarian republic flag nation country banner venezuela -đŸ‡»đŸ‡Ź flag british virgin islands british virgin islands bvi flag nation country banner british virgin islands -đŸ‡»đŸ‡ź flag u s virgin islands virgin islands us flag nation country banner u s virgin islands -đŸ‡»đŸ‡ł flag vietnam viet nam flag nation country banner vietnam -đŸ‡»đŸ‡ș flag vanuatu vu flag nation country banner vanuatu -đŸ‡ŒđŸ‡« flag wallis futuna wallis futuna flag nation country banner wallis futuna -đŸ‡ŒđŸ‡ž flag samoa ws flag nation country banner samoa -đŸ‡œđŸ‡° flag kosovo xk flag nation country banner kosovo -đŸ‡ŸđŸ‡Ș flag yemen ye flag nation country banner yemen -đŸ‡ŸđŸ‡č flag mayotte yt flag nation country banner mayotte -🇿🇩 flag south africa south africa flag nation country banner south africa -🇿đŸ‡Č flag zambia zm flag nation country banner zambia -đŸ‡żđŸ‡Œ flag zimbabwe zw flag nation country banner zimbabwe -đŸŽó §ó ąó „ó źó §ó ż flag england flag english -🏮󠁧󠁱󠁳󠁣󠁮󠁿 flag scotland flag scottish -đŸŽó §ó ąó ·ó Źó łó ż flag wales flag welsh -đŸ„Č smiling face with tear sad cry pretend -đŸ„ž disguised face pretent brows glasses moustache -đŸ€Œ pinched fingers size tiny small -đŸ«€ anatomical heart health heartbeat -đŸ« lungs breathe -đŸ„· ninja ninjutsu skills japanese -đŸ€”â€â™‚ïž man in tuxedo formal fashion -đŸ€”â€â™€ïž woman in tuxedo formal fashion -đŸ‘°â€â™‚ïž man with veil wedding marriage -đŸ‘°â€â™€ïž woman with veil wedding marriage -đŸ‘©â€đŸŒ woman feeding baby birth food -đŸ‘šâ€đŸŒ man feeding baby birth food -đŸ§‘â€đŸŒ person feeding baby birth food -🧑‍🎄 mx claus christmas -đŸ«‚ people hugging care -🐈‍⬛ black cat superstition luck -🩬 bison ox -🩣 mammoth elephant tusks -đŸŠ« beaver animal rodent -đŸ»â€â„ïž polar bear animal arctic -đŸŠ€ dodo animal bird -đŸȘ¶ feather bird fly -🩭 seal animal creature sea -đŸȘČ beetle insect -đŸȘł cockroach insect pests -đŸȘ° fly insect -đŸȘ± worm animal -đŸȘŽ potted plant greenery house -đŸ« blueberries fruit -đŸ«’ olive fruit -đŸ«‘ bell pepper fruit plant -đŸ«“ flatbread flour food -đŸ«” tamale food masa -đŸ«• fondue cheese pot food -đŸ«– teapot drink hot -🧋 bubble tea taiwan boba milk tea straw -đŸȘš rock stone -đŸȘ” wood nature timber trunk -🛖 hut house structure -đŸ›» pickup truck car transportation -đŸ›Œ roller skate footwear sports -đŸȘ„ magic wand supernature power -đŸȘ… pinata mexico candy celebration -đŸȘ† nesting dolls matryoshka toy -đŸȘĄ sewing needle stitches -đŸȘą knot rope scout -đŸ©Ž thong sandal footwear summer -đŸȘ– military helmet army protection -đŸȘ— accordion music -đŸȘ˜ long drum music -đŸȘ™ coin money currency -đŸȘƒ boomerang weapon -đŸȘš carpentry saw cut chop -đŸȘ› screwdriver tools -đŸȘ hook tools -đŸȘœ ladder tools -🛗 elevator lift -đŸȘž mirror reflection -đŸȘŸ window scenery -đŸȘ  plunger toilet -đŸȘ€ mouse trap cheese -đŸȘŁ bucket water container -đŸȘ„ toothbrush hygiene dental -đŸȘŠ headstone death rip grave -đŸȘ§ placard announcement -⚧ transgender symbol lgbtq -đŸłïžâ€âš§ïž transgender flag lgbtq -đŸ˜¶â€đŸŒ«ïž face in clouds shower steam dream -😼‍💹 face exhaling relieve relief tired sigh -đŸ˜”â€đŸ’« face with spiral eyes sick ill confused nauseous nausea -â€ïžâ€đŸ”„ heart on fire passionate enthusiastic -❀‍đŸ©č mending heart broken heart bandage wounded -đŸ§”â€â™‚ïž man beard facial hair -đŸ§”â€â™€ïž woman beard facial hair -đŸ«  melting face hot heat -đŸ«ą face with open eyes and hand over mouth silence secret shock surprise -đŸ«Ł face with peeking eye scared frightening embarrassing -đŸ«Ą saluting face respect salute -đŸ«„ dotted line face invisible lonely isolation depression -đŸ«€ face with diagonal mouth skeptic confuse frustrated indifferent -đŸ„č face holding back tears touched gratitude -đŸ«± rightwards hand palm offer -đŸ«Č leftwards hand palm offer -đŸ«ł palm down hand palm drop -đŸ«Ž palm up hand lift offer demand -đŸ«° hand with index finger and thumb crossed heart love money expensive -đŸ«” index pointing at the viewer you recruit -đŸ«¶ heart hands love appreciation support -đŸ«Š biting lip flirt sexy pain worry -đŸ«… person with crown royalty power -đŸ«ƒ pregnant man baby belly -đŸ«„ pregnant person baby belly -🧌 troll mystical monster -đŸȘž coral ocean sea reef -đŸȘ· lotus flower calm meditation -đŸȘč empty nest bird -đŸȘș nest with eggs bird -đŸ«˜ beans food -đŸ«— pouring liquid cup water -đŸ«™ jar container sauce -🛝 playground slide fun park -🛞 wheel car transport -🛟 ring buoy life saver life preserver -đŸȘŹ hamsa religion protection -đŸȘ© mirror ball disco dance party -đŸȘ« low battery drained dead -đŸ©Œ crutch accessibility assist -đŸ©» x-ray skeleton medicine -đŸ«§ bubbles soap fun carbonation sparkling -đŸȘȘ identification card document -🟰 heavy equals sign math diff --git a/new-config/.config/rofi/scripts/rofi_power b/new-config/.config/rofi/scripts/rofi_power deleted file mode 100755 index 3f5658903..000000000 --- a/new-config/.config/rofi/scripts/rofi_power +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple power menu rofi script -# - Dependencies: rofi, power-profiles-daemon, swaylock -# - -## MENU PROMPT ## -menu="rofi -dmenu -i -p" - -## CURRENT WALLPAPER FOR LOCKSCREEN ## -currwall=$(tail --l 1 "$HOME/.wbg" | awk '{print $3}') - -## OPTIONS ## -option1=" Logout" -option2="ï€Ą Reboot" -option3=" Power off" -option4="ó°’Č Suspend" -option5="ï€Ł Lock" -option6=" Change power profile" -option7=" Cancel" -options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6\n$option7" - -## POWER PROFILE OPTIONS ## -pwr1="󰓅 Performance" -pwr2="ó°Ÿ… Balanced" -pwr3="󰟆 Power Saver" -pwr4=" Cancel" -pwrs="$pwr1\n$pwr2\n$pwr3\n$pwr4" - -## MAIN ACTION COMMAND ## -action=$(echo -e "$options" | $menu "  Power Options ") -case "$action" in - $option1) - pkill Hyprland;; - $option2) - systemctl reboot || loginctl reboot;; - $option3) - systemctl poweroff || loginctl poweroff;; - $option4) - swaylock -i "$currwall" & - sleep 0.1 - systemctl suspend;; - $option5) - swaylock -i "$currwall";; - $option6) - currentpwr=$(powerprofilesctl get) - if [ "$currentpwr" = "performance" ]; then - currentpwr="$pwr1" - elif [ "$currentpwr" = "balanced" ]; then - currentpwr="$pwr2" - elif [ "$currentpwr" = "power-saver" ]; then - currentpwr="$pwr3" - fi - pwraction=$(echo -e "$pwrs" | $menu "  Power Profile Menu - Currently set to: ${currentpwr} ") - case "$pwraction" in - $pwr1*) - powerprofilesctl set performance && notify-send "Power profile switched to performance";; - $pwr2*) - powerprofilesctl set balanced && notify-send "Power profile switched to balanced";; - $pwr3*) - powerprofilesctl set power-saver && notify-send "Power profile switched to power saver";; - $pwr4*) - exit 0 - esac;; - $option7) - exit 0 -esac diff --git a/new-config/.config/rofi/scripts/rofi_scrot b/new-config/.config/rofi/scripts/rofi_scrot deleted file mode 100755 index f57c257be..000000000 --- a/new-config/.config/rofi/scripts/rofi_scrot +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple screenshot menu rofi script -# - Dependencies: rofi, grim, slurp, wf-recorder -# - -# screenshot directory -scrdir="$HOME/Pictures/Screenshots" -mkdir -p "$scrdir" -cd "$scrdir" || exit 1 -filename=$(date "+%d-%m-%Y_%H:%M:%S") - -# options array -option1=" Capture the screen" -option2=" Capture region" -option3="󰕧 Record the screen" -option4="󰕩 Record region" -option5="󰕧 Record the screen and audio" -option6="Exit" -options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" - -# countdown function -countdown() { - notify-send "Screenshot" "Executing in 3 seconds" -t 1000 - sleep 1 - notify-send "Screenshot" "Executing in 2 seconds" -t 1000 - sleep 1 - notify-send "Screenshot" "Executing in 1 seconds" -t 1000 - sleep 2 -} - -# show the help output with --help or -h arguments -if [[ $1 == '--help' ]] || [[ $1 = '-h' ]] - then - echo ### rofi-screenshot - echo USAGE: rofi-screenshot [OPTION] - echo \(no option\) - echo " show the screenshot menu" - echo -s, --stop - echo " stop recording" - echo -h, --help - echo " this screen" - exit 1 -fi - -# stop recording with -s or --stop arguments -if [[ $1 = '--stop' ]] || [[ $1 = '-s' ]] - then - killall -s SIGINT wf-recorder - exit 1 -fi - -# run the selected command -choice=$(echo -e "$options" | rofi -dmenu -p " 󰄀 Screenshot " ) -case $choice in - $option1) - countdown - grim "$filename.jpg" - notify-send "Screenshot" "Screenshot saved to $scrdir" - ;; - $option2) - notify-send "Screenshot" "Select a region to capture" - grim -g "$(slurp)" "$filename.jpg" - notify-send "Screenshot" "Region saved to $scrdir" - ;; - $option3) - countdown - wf-recorder --codec=h264_vaapi -d /dev/dri/renderD128 -f "$filename.mp4" - notify-send "Screenshot" "Recording saved to $scrdir" - ;; - $option4) - notify-send "Screenshot" "Select a region to record" - wf-recorder --codec=h264_vaapi -d /dev/dri/renderD128 -g "$(slurp)" -f "$filename.mp4" - notify-send "Screenshot" "Recording saved to $scrdir" - ;; - $option5) - devices=$(pactl list sources | grep "Name" | awk '{print $2}') - chosendevice=$(echo -e "$devices" | rofi -dmenu -p " Select audio input ") - if [ "$chosendevice" ]; then - device="$chosendevice" - countdown - wf-recorder --audio="$device" --codec=h264_vaapi -d /dev/dri/renderD128 -f "$filename.mp4" - else - notify-send "Please select an audio input device" - exit 1 - fi - notify-send "Screenshot" "Recording saved to $scrdir" - ;; - $option6) - exit 0 - ;; -esac diff --git a/new-config/.config/rofi/scripts/rofi_wall b/new-config/.config/rofi/scripts/rofi_wall deleted file mode 100755 index 4bd202afa..000000000 --- a/new-config/.config/rofi/scripts/rofi_wall +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple wallpaper changer script -# - Dependencies: rofi, fd, swaybg - -## MENU PROMPT ## -menu="rofi -dmenu -i -p" - -## WALLPAPER DIRECTORY ## -walldir="$HOME/Pictures/Wallpapers" # wallpapers folder, change it to yours - -## SELECT PICTURE ## -cd "$walldir" || exit 1 -wallpaper=$(fd -p "$walldir" | $menu " 󰋩 Wallpaper Selector ") -if [ "$wallpaper" ]; then - chosenwall=$wallpaper -else - exit 0 -fi - -swww img "$chosenwall" -echo -e "#!/bin/sh\nswww img $walldir/$chosenwall" > "$HOME/.wbg" -exit 0 diff --git a/new-config/.config/rofi/scripts/rofi_wifi b/new-config/.config/rofi/scripts/rofi_wifi deleted file mode 100755 index 6c5390af9..000000000 --- a/new-config/.config/rofi/scripts/rofi_wifi +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple wifi rofi script -# - Dependencies: rofi, NetworkManager, io.elementary.capnet-assist - -## MENU PROMPT ## -menu="rofi -dmenu -i -p" - -## MAIN OPTIONS ## -option1=" Turn on WiFi" -option2=" Turn off WiFi" -option3="󱛅 Disconnect WiFi" -option4="󱛃 Connect WiFi" -option5="󱛆 Setup captive portal" -option6=" Exit" -options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" - -## GRAB WIFI INTERFACE ## -wlan=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f1 | head -1) - -## TURN OFF WIFI FUNCTION ## -turnoff() { - nmcli radio wifi off - notify-send "WiFi has been turned off" -} - -## TURN ON WIFI FUNCTION ## -turnon() { - nmcli radio wifi on - notify-send "WiFi has been turned on" -} - -## DISCONNECT WIFI FUNCTION ## -disconnect() { - nmcli device disconnect "$wlan" - sleep 1 - constate=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f3 | head -1) - if [ "$constate" = "disconnected" ]; then - notify-send "WiFi has been disconnected" - fi -} - -## CONNECT FUNCTION ## -connect() { - notify-send "Scannig networks, please wait" - sleep 1 - bssid=$(nmcli device wifi list | sed -n '1!p' | cut -b 9- | $menu " Select a Wifi Network  " | cut -d' ' -f1) -} - -## SELECT PASSWORD FUNCTION ## -password() { - pass=$(echo " " | $menu " Enter Password ï€Ł " -password) -} - -## MAIN CONNECTION COMMAND ## -action() { - nmcli device wifi connect "$bssid" password "$pass" || nmcli device wifi connect "$bssid" -} - -## CHECKING IF WIFI IS WORKING -check() { - notify-send "Checking if connection was successful" - sleep 1 - currentwfi=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f4 | head -1) - if ping -q -c 2 -W 2 google.com >/dev/null; then - notify-send "You are now connected to $currentwfi and internet is working properly" - else - notify-send "Your internet is not working :(" - fi -} - -## MAIN ACTION COMMANDS ## -cases=$(echo -e "$options" | $menu "  Wifi Settings " ) -case "$cases" in - $option1*) - turnon;; - $option2*) - turnoff;; - $option3*) - disconnect;; - $option4*) - connect; - password; - action; - check;; - $option5*) - io.elementary.capnet-assist;; - $option6*) - exit 0 -esac diff --git a/new-config/.config/rofi/themes/gruvbox-dark.rasi b/new-config/.config/rofi/themes/gruvbox-dark.rasi deleted file mode 100644 index 15ffb4d0b..000000000 --- a/new-config/.config/rofi/themes/gruvbox-dark.rasi +++ /dev/null @@ -1,16 +0,0 @@ -* { - bg-col: #1d2021; - bg-col-light: #282828; - border-col: #504945; - selected-col: #3c3836; - blue: #458588; - fg-col: #ebdbb2; - fg-col2: #ebdbb2; - grey: #928374; - width: 600; - selected: #ebdbb2; - red: #fb4934; - green: #98971a; - empty: #3c3836; - inactive: #928374; -} diff --git a/new-config/.config/starship.toml b/new-config/.config/starship.toml deleted file mode 100644 index da6c4f2a8..000000000 --- a/new-config/.config/starship.toml +++ /dev/null @@ -1,33 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom starship prompt config -## - -add_newline = false - -[line_break] -disabled = true - -[character] -error_symbol = "[](bold red) " -success_symbol = "[](bold green)" - -[directory] -truncation_length = 5 -home_symbol = " " -format = "[$path](bold italic yellow) " - -[hostname] -ssh_only = false -disabled = false -style = "italic #87A752" - -[package] -disabled = true - -[username] -show_always = true -style_user = "bold red" -format = "[$user]($style)[ in ](white)" diff --git a/new-config/.config/vifm/vifm-help.txt b/new-config/.config/vifm/vifm-help.txt deleted file mode 100644 index df216c383..000000000 --- a/new-config/.config/vifm/vifm-help.txt +++ /dev/null @@ -1,6568 +0,0 @@ -VIFM(1) General Commands Manual VIFM(1) - -NAME - vifm - vi file manager - -SYNOPSIS - vifm [OPTION]... - vifm [OPTION]... path - vifm [OPTION]... path path - -DESCRIPTION - Vifm is an ncurses based file manager with vi like keybindings. If you - use vi, vifm gives you complete keyboard control over your files - without having to learn a new set of commands. - -OPTIONS - vifm starts in the current directory unless it is given a different - directory on the command line or 'vifminfo' option includes "savedirs" - (in which case last visited directories are used as defaults). - - - Read list of files from standard input stream and compose custom - view out of them (see "Custom views" section). Current working - directory is used as a base for relative paths. - - Starts Vifm in the specified path. - - - Starts Vifm in the specified paths. - - Specifying two directories triggers split view even when vifm was in - single-view mode on finishing previous run. To suppress this behaviour - :only command can be put in the vifmrc file. - - When only one path argument is found on command-line, the left/top pane - is automatically set as the current view. - - Paths to files are also allowed in case you want vifm to start with - some archive opened. - - --select - Open parent directory of the given path and select specified - file in it. - - -f Makes vifm instead of opening files write selection to - $VIFM/vimfiles and quit. - - --choose-files |- - Sets output file to write selection into on exit instead of - opening files. "-" means standard output. Use empty value to - disable it. - - --choose-dir |- - Sets output file to write last visited directory into on exit. - "-" means standard output. Use empty value to disable it. - - --delimiter - Sets separator for list of file paths written out by vifm. - Empty value means null character. Default is new line - character. - - --on-choose - Sets command to be executed on selected files instead of opening - them. The command may use any of macros described in "Command - macros" section below. The command is executed once for whole - selection. - - --logging[=] - Log some operational details $VIFM/log. If the optional startup - log path is specified and permissions allow to open it for - writing, then logging of early initialization (before value of - $VIFM is determined) is put there. - - --server-list - List available server names and exit. - - --server-name - Name of target or this instance (sequential numbers are appended - on name conflict). - - --remote - Sends the rest of the command line to another instance of vifm, - --server-name is treated just like any other argument and should - precede --remote on the command line. When there is no server, - quits silently. There is no limit on how many arguments can be - processed. One can combine --remote with -c or - + to execute commands in already running instance of - vifm. See also "Client-Server" section below. - - --remote-expr - passes expression to vifm server and prints result. See also - "Client-Server" section below. - - -c or + - Run command-line mode on startup. Commands in such - arguments are executed in the order they appear in command line. - Commands with spaces or special symbols must be enclosed in - double or single quotes or all special symbols should be escaped - (the exact syntax strongly depends on shell). "+" argument is - equivalent to "$" and thus picks last item of of the view. - - --help, -h - Show a brief command summary and exit vifm. - - --version, -v - Show version information and quit. - - --no-configs - Skip reading vifmrc and vifminfo. - - - See "Startup" section below for the explanations on $VIFM. - -General keys - Ctrl-C or Escape - cancel most operations (see "Cancellation" section below), clear - all selected files. - - Ctrl-L clear and redraw the screen. - -Basic Movement - The basic vi key bindings are used to move through the files and pop-up - windows. - - k, gk, or Ctrl-P - move cursor up one line. - - j, gj or Ctrl-N - move cursor down one line. - - h when 'lsview' is off move up one directory (moves to parent - directory node in tree view), otherwise move left one file. - - l when 'lsview' is off move into a directory or launch a file, - otherwise move right one file. See "Selection" section below. - - gg move to the first line of the file list. - - G move to the last line in the file list. - - gh go up one directory regardless of view representation (regular, - ls-like). Also can be used to leave custom views including tree - view. - - gl or Enter - enter directory or launch a file. See "Selection" section - below. - - H move to the first file in the window. - - M move to the file in the middle of the window. - - L move to the last file in the window. - - Ctrl-F or Page Down - move forward one page. - - Ctrl-B or Page Up - move back one page. - - Ctrl-D jump back one half page. - - Ctrl-U jump forward one half page. - - n% move to the file that is n percent from the top of the list (for - example 25%). - - 0 or ^ move cursor to the first column. See 'lsview' option - description. - - $ move cursor to the last column. See 'lsview' option - description. - - Space switch file lists. - - gt switch to the next tab (wrapping around). - - {n}gt switch to the tab number {n} (wrapping around). - - gT switch to the previous tab (wrapping around). - - {n}gT switch to {n}-th previous tab. - -Movement with Count - Most movement commands also accept a count, 12j would move down 12 - files. - - [count]% - move to percent of the file list. - - [count]j - move down [count] files. - - [count]k - move up [count] files. - - [count]G or [count]gg - move to list position [count]. - - [count]h - go up [count] directories. - -Scrolling panes - zt redraw pane with file in top of list. - - zz redraw pane with file in center of list. - - zb redraw pane with file in bottom of list. - - Ctrl-E scroll pane one line down. - - Ctrl-Y scroll pane one line up. - -Pane manipulation - Second character can be entered with or without Control key. - - Ctrl-W H - move the pane to the far left. - - Ctrl-W J - move the pane to the very bottom. - - Ctrl-W K - move the pane to the very top. - - Ctrl-W L - move the pane to the far right. - - - Ctrl-W h - switch to the left pane. - - Ctrl-W j - switch to the pane below. - - Ctrl-W k - switch to the pane above. - - Ctrl-W l - switch to the right pane. - - - Ctrl-W b - switch to bottom-right window. - - Ctrl-W t - switch to top-left window. - - - Ctrl-W p - switch to previous window. - - Ctrl-W w - switch to other pane. - - - Ctrl-W o - leave only one pane. - - Ctrl-W s - split window horizontally. - - Ctrl-W v - split window vertically. - - - Ctrl-W x - exchange panes. - - Ctrl-W z - quit preview pane or view modes. - - - Ctrl-W - - decrease size of the view by count. - - Ctrl-W + - increase size of the view by count. - - Ctrl-W < - decrease size of the view by count. - - Ctrl-W > - increase size of the view by count. - - - Ctrl-W | - set current view size to count. - - Ctrl-W _ - set current view size to count. - - Ctrl-W = - make size of two views equal. - - For Ctrl-W +, Ctrl-W -, Ctrl-W <, Ctrl-W >, Ctrl-W | and Ctrl-W _ - commands count can be given before and/or after Ctrl-W. The resulting - count is a multiplication of those two. So "2 Ctrl-W 2 -" decreases - window size by 4 lines or columns. - - Ctrl-W | and Ctrl-W _ maximise current view by default. - -Marks - Marks are set the same way as they are in vi. - - You can use these characters for marks [a-z][A-Z][0-9]. - - m[a-z][A-Z][0-9] - set a mark for the file at the current cursor position. - - '[a-z][A-Z][0-9] - navigate to the file set for the mark. - - - There are also several special marks that can't be set manually: - - - ' (single quote) - previously visited directory of the view, thus - hitting '' allows switching between two last locations - - - < - the first file of the last visually selected block - - - > - the last file of the last visually selected block - -Searching - /regular expression pattern - search for files matching regular expression in forward - direction and advance cursor to next match. - - / perform forward search with top item of search pattern history. - - ?regular expression pattern - search for files matching regular expression in backward - direction and advance cursor to previous match. - - ? perform backward search with top item of search pattern history. - - Trailing slash for directories is taken into account, so /\/ searches - for directories and symbolic links to directories. At the moment // - works too, but this can change in the future, so consider escaping the - slash if not typing pattern by hand. - - Matches are automatically selected if 'hlsearch' is set. Enabling - 'incsearch' makes search interactive. 'ignorecase' and 'smartcase' - options affect case sensitivity of search queries as well as local - filter and other things detailed in the description of 'caseoptions'. - - - [count]n - go to the next file matching last search pattern. Takes last - search direction into account. - - [count]N - go to the previous file matching last search pattern. Takes - last search direction into account. - - If 'hlsearch' option is set, hitting n/N to perform search and go to - the first matching item resets current selection in normal mode. It is - not the case if search was already performed on files in the directory, - thus selection is not reset after clearing selection with escape key - and hitting n/N key again. - - Note: vifm uses extended regular expressions for / and ?. - - - [count]f[character] - search forward for file with [character] as first character in - name. Search wraps around the end of the list. - - [count]F[character] - search backward for file with [character] as first character in - name. Search wraps around the end of the list. - - [count]; - find the next match of f or F. - - [count], - find the previous match of f or F. - - Note: f, F, ; and , wrap around list beginning and end when they are - used alone and they don't wrap when they are used as selectors. - -File Filters - There are three basic file filters: - - - dot files filter (does not affect "." and ".." special directories, - whose appearance is controlled by the 'dotdirs' option), see - 'dotfiles' option; - - - permanent filter; - - - local filter (see description of the "=" normal mode command). - - Permanent filter essentially allows defining a group of files names - which are not desirable to be seen by default, like temporary or backup - files, which might be created alongside normal ones. Just like you - don't usually need to see hidden dot files (files starting with a dot). - Local filter on the other hand is for temporary immediate filtering of - file list at hand, to get rid of uninterested files in the view or to - make it possible to use % range in a :command. - - For the purposes of more deterministic editing permanent filter is - split into two parts: - - - one edited explicitly via :filter command; - - - another one which is edited implicitly via zf shortcut. - - Files are tested against both parts and a match counts if at least one - of the parts matched. - - - Each file list has its own copy of each filter. - - Filtered files are not checked in / search or :commands. - - Files and directories are filtered separately. This is done by - appending a slash to a directory name before testing whether it matches - the filter. Examples: - - - " filter directories which names end with '.files' - :filter /^.*\.files\/$/ - - " filter files which names end with '.d' - :filter {*.d} - - " filter files and directories which names end with '.o' - :filter /^.*\.o\/?$/ - - Note: vifm uses extended regular expressions. - - The basic vim folding key bindings are used for managing filters. - - - za toggle visibility of dot files. - - zo show dot files. - - zm hide dot files. - - zf add selected files to permanent filter. - - zO reset permanent filter. - - zR save and reset all filters. - - zr clear local filter. - - zM restore all filters (undoes last zR). - - zd exclude selection or current file from a custom view. Does - nothing for regular view. For tree view excluding directory - excludes that sub-tree. For compare views zd hides group of - adjacent identical files, count can be specified as 1 to exclude - just single file or selected items instead. Files excluded this - way are not counted as filtered out and can't be returned unless - view is reloaded. - - =regular expression pattern - filter out files that don't match regular expression. Whether - view is updated as regular expression is changed depends on the - value of the 'incsearch' option. This kind of filter is - automatically reset when directory is changed. - -Tree-related Keys - While some of the keys make sense outside of tree-view, they are most - useful in trees. - - [z go to first sibling of current entry. - - ]z go to last sibling of current entry. - - zj go to next directory sibling of current entry or do nothing. - - zk go to previous directory sibling of current entry or do nothing. - - zx toggle fold under the cursor or parent entry of the current file - if cursor is not on a directory. - -Other Normal Mode Keys - [count]: - enter command line mode. [count] generates range. - - q: open external editor to prompt for command-line command. See - "Command line editing" section for details. - - q/ open external editor to prompt for search pattern to be searched - in forward direction. See "Command line editing" section for - details. - - q? open external editor to prompt for search pattern to be searched - in backward direction. See "Command line editing" section for - details. - - q= open external editor to prompt for filter pattern. See "Command - line editing" section for details. Unlike other q{x} commands - this one doesn't work in Visual mode. - - [count]!! and [count]! - enter command line mode with entered ! command. [count] - modifies range. - - Ctrl-O go backwards through directory history of current view. - Nonexistent directories are automatically skipped. - - Ctrl-I if 'cpoptions' contains "t" flag, and switch active - pane just like does, otherwise it goes forward through - directory history of current view. Nonexistent directories are - automatically skipped. - - Ctrl-G show a dialog with detailed information about current file. See - "Menus and dialogs" section for controls. - - Shift-Tab - enter view mode (works only after activating view pane with - :view command). - - ga calculate directory size. Uses cached directory sizes when - possible for better performance. As a special case calculating - size of ".." entry results in calculation of size of current - directory. - - gA like ga, but force update. Ignores old values of directory - sizes. - - If file under cursor is selected, each selected item is processed, - otherwise only current file is updated. - - gf find link destination (like l with 'followlinks' off, but also - finds directories). On Windows additionally follows .lnk-files. - - gF Same as gf, but resolves final path of the chain of symbolic - links. - - gr only for MS-Windows - same as l key, but tries to run program with administrative - privileges. - - av go to visual mode into selection amending state preserving - current selection. - - gv go to visual mode restoring last selection. - - [reg]gs - when no register is specified, restore last t selection (similar - to what gv does for visual mode selection). If register is - present, then all files listed in that register and which are - visible in current view are selected. - - gu - make names of selected files lowercase. - - [count]guu and [count]gugu - make names of [count] files starting from the current one - lowercase. Without [count] only current file is affected. - - gU - make names of selected files uppercase. - - [count]gUU and [count]gUgU - make names of [count] files starting from the current one - uppercase. Without [count] only current file is affected. - - e explore file in the current pane. - - i handle file (even if it's an executable and 'runexec' option is - set). - - cw change word is used to rename a file or files. If multiple - files are selected, behaves as :rename command run without - arguments. - - cW change WORD is used to change only name of file (without - extension). - - cl change link target. - - co only for *nix - change file owner. - - cg only for *nix - change file group. - - [count]cp - change file attributes (permission on *nix and properties on - Windows). If [count] is specified, it's treated as numerical - argument for non-recursive `chmod` command (of the form - [0-7]{3,4}). See "Menus and dialogs" section for controls. - - [count]C - clone file [count] times. - - [count]dd or d[count]selector - move selected file or files to trash directory (if 'trash' - option is set, otherwise delete). See "Trash directory" section - below. - - [count]DD or D[count]selector - like dd and d, but omitting trash directory (even when - 'trash' option is set). - - Y, [count]yy or y[count]selector - yank selected files. - - p copy yanked files to the current directory or move the files to - the current directory if they were deleted with dd or :d[elete] - or if the files were yanked from trash directory. See "Trash - directory" section below. - - P move the last yanked files. The advantage of using P instead of - d followed by p is that P moves files only once. This isn't - important in case you're moving files in the same file system - where your home directory is, but using P to move files on some - other file system (or file systems, in case you want to move - files from fs1 to fs2 and your home is on fs3) can save your - time. - - al put symbolic links with absolute paths. - - rl put symbolic links with relative paths. - - t select or unselect (tag) the current file. - - u undo last change. - - Ctrl-R redo last change. - - dp in compare view of "ofboth grouppaths" kind, makes corresponding - entry of the other pane equal to the current one. The semantics - is as follows: - - nothing done for identical entries - - if file is missing in current view, its pair gets removed - - if file is missing or differs in other view, it's replaced - - file pairs are defined by matching relative paths - File removal obeys 'trash' option. When the option is enabled, - the operation can be undone/redone (although results won't be - visible automatically). - Unlike in Vim, this operation is performed on a single line - rather than a set of adjacent changes. - - do same as dp, but applies changes in the opposite direction. - - v or V enter visual mode, clears current selection. - - [count]Ctrl-A - increment first number in file name by [count] (1 by default). - - [count]Ctrl-X - decrement first number in file name by [count] (1 by default). - - ZQ same as :quit!. - - ZZ same as :quit. - - . repeat last command-line command (not normal mode command) of - this run (does nothing right after startup or :restart command). - The command doesn't depend on command-line history and can be - used with completely disabled history. - - ( go to previous group. Groups are defined by primary sorting - key. For name and iname members of each group have same first - letter, for all other sorting keys vifm uses size, uid, ... - - ) go to next group. See ( key description above. - - { speeds up navigation to closest previous entry of the opposite - type by moving to the first file backwards when cursor is on a - directory and to the first directory backwards when cursor is on - a file. This is essentially a special case of ( that is locked - on "dirs". - - } same as {, but in forward direction. - - [c go to previous mismatched entry in directory comparison view or - do nothing. - - ]c go to next mismatched entry in directory comparison view or do - nothing. - - [d go to previous directory entry or do nothing. - - ]d go to next directory entry or do nothing. - - [r same as :siblprev. - - ]r same as :siblnext. - - [R same as :siblprev!. - - ]R same as :siblnext!. - - [s go to previous selected entry or do nothing. - - ]s go to next selected entry or do nothing. - -Using Count - You can use count with commands like yy. - - [count]yy - yank count files starting from current cursor position downward. - - Or you can use count with motions passed to y, d or D. - - d[count]j - delete (count + 1) files starting from current cursor position - upward. - -Registers - vifm supports multiple registers for temporary storing list of yanked - or deleted files. - - Registers should be specified by hitting double quote key followed by a - register name. Count is specified after register name. By default - commands use unnamed register, which has double quote as its name. - - Though all commands accept registers, most of commands ignores them - (for example H or Ctrl-U). Other commands can fill register or append - new files to it. - - Presently vifm supports ", _, a-z and A-Z characters as register names. - - As mentioned above " is unnamed register and has special meaning of the - default register. Every time when you use named registers (a-z and A- - Z) unnamed register is updated to contain same list of files as the - last used register. - - _ is black hole register. It can be used for writing, but its list is - always empty. - - Registers with names from a to z and from A to Z are named ones. - Lowercase registers are cleared before adding new files, while - uppercase aren't and should be used to append new files to the existing - file list of appropriate lowercase register (A for a, B for b, ...). - - Registers can be changed on :empty command if they contain files under - trash directory (see "Trash directory" section below). - - Registers do not contain one file more than once. - - Example: - - "a2yy - - puts names of two files to register a (and to the unnamed register), - - "Ad - - removes one file and append its name to register a (and to the unnamed - register), - - p or "ap or "Ap - - inserts previously yanked and deleted files into current directory. - -Selectors - y, d, D, !, gu and gU commands accept selectors. You can combine them - with any of selectors below to quickly remove or yank several files. - - Most of selectors are like vi motions: j, k, gg, G, H, L, M, %, f, F, - ;, comma, ', ^, 0 and $. But there are some additional ones. - - a all files in current view. - - s selected files. - - S all files except selected. - - Examples: - - - dj - delete file under cursor and one below; - - - d2j - delete file under cursor and two below; - - - y6gg - yank all files from cursor position to 6th file in the list. - - When you pass a count to whole command and its selector they are - multiplied. So: - - - 2d2j - delete file under cursor and four below; - - - 2dj - delete file under cursor and two below; - - - 2y6gg - yank all files from cursor position to 12th file in the - list. - -Visual Mode - Visual mode has two generic operating submodes: - - - plain selection as it is in Vim; - - - selection editing submode. - - Both modes select files in range from cursor position at which visual - mode was entered to current cursor position (let's call it "selection - region"). Each of two borders can be adjusted by swapping them via "o" - or "O" keys and updating cursor position with regular cursor motion - keys. Obviously, once initial cursor position is altered this way, - real start position becomes unavailable. - - Plain Vim-like visual mode starts with cleared selection, which is not - restored on rejecting selection ("Escape", "Ctrl-C", "v", "V"). - Contrary to it, selection editing doesn't clear previously selected - files and restores them after reject. Accepting selection by - performing an operation on selected items (e.g. yanking them via "y") - moves cursor to the top of current selection region (not to the top - most selected file of the view). - - In turn, selection editing supports three types of editing (look at - statusbar to know which one is currently active): - - - append - amend selection by selecting elements in selection region; - - - remove - amend selection by deselecting elements in selection - region; - - - invert - amend selection by inverting selection of elements in - selection region. - - No matter how you activate selection editing it starts in "append". - One can switch type of operation (in the order given above) via "Ctrl- - G" key. - - Almost all normal mode keys work in visual mode, but instead of - accepting selectors they operate on selected items. - - Enter save selection and go back to normal mode not moving cursor. - - av leave visual mode if in amending mode (restores previous - selection), otherwise switch to amending selection mode. - - gv restore previous visual selection. - - v, V, Ctrl-C or Escape - leave visual mode if not in amending mode, otherwise switch to - normal visual selection. - - Ctrl-G switch type of amending by round robin scheme: append -> remove - -> invert. - - : enter command line mode. Selection is cleared on leaving the - mode. - - o switch active selection bound. - - O switch active selection bound. - - gu, u make names of selected files lowercase. - - gU, U make names of selected files uppercase. - - cw same as running :rename command without arguments. - -View Mode - This mode tries to imitate the less program. List of builtin shortcuts - can be found below. Shortcuts can be customized using :qmap, :qnoremap - and :qunmap command-line commands. - - Shift-Tab, Tab, q, Q, ZZ - return to normal mode. - - [count]e, [count]Ctrl-E, [count]j, [count]Ctrl-N, [count]Enter - scroll forward one line (or [count] lines). - - [count]y, [count]Ctrl-Y, [count]k, [count]Ctrl-K, [count]Ctrl-P - scroll backward one line (or [count] lines). - - [count]f, [count]Ctrl-F, [count]Ctrl-V, [count]Space - scroll forward one window (or [count] lines). - - [count]b, [count]Ctrl-B, [count]Alt-V - scroll backward one window (or [count] lines). - - [count]z - scroll forward one window (and set window to [count]). - - [count]w - scroll backward one window (and set window to [count]). - - [count]Alt-Space - scroll forward one window, but don't stop at end-of-file. - - [count]d, [count]Ctrl-D - scroll forward one half-window (and set half-window to [count]). - - [count]u, [count]Ctrl-U - scroll backward one half-window (and set half-window to - [count]). - - r, Ctrl-R, Ctrl-L - repaint screen. - - R reload view preserving scroll position. - - F toggle automatic forwarding. Roughly equivalent to periodic - file reload and scrolling to the bottom. The behaviour is - similar to `tail -F` or F key in less. - - a switch to the next viewer. Does nothing for preview constructed - via %q macro. - - A switch to the previous viewer. Does nothing for preview - constructed via %q macro. - - i toggle raw mode (ignoring of defined viewers). Does nothing for - preview constructed via %q macro. - - [count]/pattern - search forward for ([count]-th) matching line. - - [count]?pattern - search backward for ([count]-th) matching line. - - [count]n - repeat previous search (for [count]-th occurrence). - - [count]N - repeat previous search in reverse direction (for [count]-th - occurrence). - - [count]g, [count]<, [count]Alt-< - scroll to the first line of the file (or line [count]). - - [count]G, [count]>, [count]Alt-> - scroll to the last line of the file (or line [count]). - - [count]p, [count]% - scroll to the beginning of the file (or N percent into file). - - v invoke an editor to edit the current file being viewed. The - command for editing is taken from the 'vicmd' or 'vixcmd' option - value and extended with middle line number prepended by a plus - sign and name of the current file. - - All "Ctrl-W x" keys work the same was as in Normal mode. Active mode - is automatically changed on navigating among windows. When less-like - mode activated on file preview is left using one by "Ctrl-W x" keys, - its state is stored until another file is displayed using preview (it's - possible to leave the mode, hide preview pane, do something else, then - get back to the file and show preview pane again with previously stored - state in it). - -Command line Mode - These keys are available in all submodes of the command line mode: - command, search, prompt and filtering. - - Down, Up, Left, Right, Home, End and Delete are extended keys and they - are not available if vifm is compiled with --disable-extended-keys - option. - - Esc, Ctrl-C - leave command line mode, cancels input. Cancelled input is - saved into appropriate history and can be recalled later. - - Ctrl-M, Enter - execute command and leave command line mode. - - Ctrl-I, Tab - complete command or its argument. - - Shift-Tab - complete in reverse order. - - Ctrl-_ stop completion and return original input. - - Ctrl-B, Left - move cursor to the left. - - Ctrl-F, Right - move cursor to the right. - - Ctrl-A, Home - go to line beginning. - - Ctrl-E, End - go to line end. - - Alt-B go to the beginning of previous word. - - Alt-F go to the end of next word. - - Ctrl-U remove characters from cursor position till the beginning of - line. - - Ctrl-K remove characters from cursor position till the end of line. - - Ctrl-H, Backspace - remove character before the cursor. - - Ctrl-D, Delete - remove character under the cursor. - - Ctrl-W remove characters from cursor position till the beginning of - previous word. - - Alt-D remove characters from cursor position till the beginning of - next word. - - Ctrl-T swap the order of current and previous character and move cursor - forward or, if cursor past the end of line, swap the order of - two last characters in the line. - - Alt-. insert last part of previous command to current cursor position. - Each next call will insert last part of older command. - - Ctrl-G edit command-line content in external editor. See "Command line - editing" section for details. - - Ctrl-N recall more recent command-line from history. - - Ctrl-P recall older command-line from history. - - Up recall more recent command-line from history, that begins as the - current command-line. - - Down recall older command-line from history, that begins as the - current command-line. - - Ctrl-] trigger abbreviation expansion. - -Pasting special values - The shortcuts listed below insert specified values into current cursor - position. Last key of every shortcut references value that it inserts: - - c - [c]urrent file - - d - [d]irectory path - - e - [e]xtension of a file name - - r - [r]oot part of a file name - - t - [t]ail part of directory path - - - a - [a]utomatic filter - - m - [m]anual filter - - = - local filter, which is bound to "=" in normal mode - - Values related to filelist in current pane are available through Ctrl-X - prefix, while values from the other pane have doubled Ctrl-X key as - their prefix (doubled Ctrl-X is presumably easier to type than - uppercase letters; it's still easy to remap the keys to correspond to - names of similar macros). - - Ctrl-X c - name of the current file of the active pane. - - Ctrl-X d - path to the current directory of the active pane. - - Ctrl-X e - extension of the current file of the active pane. - - Ctrl-X r - name root of current file of the active pane. - - Ctrl-X t - the last component of path to the current directory of the - active pane. - - Ctrl-X Ctrl-X c - name of the current file of the inactive pane. - - Ctrl-X Ctrl-X d - path to the current directory of the inactive pane. - - Ctrl-X Ctrl-X e - extension of the current file of the inactive pane. - - Ctrl-X Ctrl-X r - name root of current file of the inactive pane. - - Ctrl-X Ctrl-X t - the last component of path to the current directory of the - inactive pane. - - - Ctrl-X a - value of implicit permanent filter (old name "automatic") of the - active pane. - - Ctrl-X m - value of explicit permanent filter (old name "manual") of the - active pane. - - Ctrl-X = - value of local filter of the active pane. - - - Ctrl-X / - last pattern from search history. - -Command line editing - vifm provides a facility to edit several kinds of data, that is usually - edited in command-line mode, in external editor (using command - specified by 'vicmd' or 'vixcmd' option). This has at least two - advantages over built-in command-line mode: - - one can use full power of Vim to edit text; - - finding and reusing history entries becomes possible. - - The facility is supported by four input submodes of the command-line: - - command; - - forward search; - - backward search; - - file rename (see description of cw and cW normal mode keys). - - Editing command-line using external editor is activated by the Ctrl-G - shortcut. It's also possible to do almost the same from Normal and - Visual modes using q:, q/ and q? commands. - - Temporary file created for the purpose of editing the line has the - following structure: - - 1. First line, which is either empty or contains text already entered - in command-line. - - 2. 2nd and all other lines with history items starting with the most - recent one. Altering this lines in any way won't change history - items stored by vifm. - - After editing application is finished the first line of the file is - taken as the result of operation, when the application returns zero - exit code. If the application returns an error (see :cquit command in - Vim), all the edits made to the file are ignored, but the initial value - of the first line is saved in appropriate history. - -More Mode - This is the mode that appears when status bar content is so big that it - doesn't fit on the screen. One can identify the mode by "-- More --" - message at the bottom. - - The following keys are handled in this mode: - - - Enter, Ctrl-J, j or Down - scroll one line down. - - Backspace, k or Up - scroll one line up. - - - d scroll one page (half of a screen) down. - - u scroll one page (half of a screen) up. - - - Space, f or PageDown - scroll down a screen. - - b or PageUp - scroll up a screen. - - - G scroll to the bottom. - - g scroll to the top. - - - q, Escape or Ctrl-C - quit the mode. - - : switch to command-line mode. - -Commands - Commands are executed with :command_name - - Commented out lines should start with the double quote symbol ("), - which may be preceded by whitespace characters intermixed with colons. - Inline comments can be added at the end of the line after double quote - symbol, only last line of a multi-line command can contain such - comment. Not all commands support inline comments as their syntax - conflicts with names of registers and fields where double quotes are - allowed. - - Most of the commands have two forms: complete and the short one. - Example: - - :noh[lsearch] - - This means the complete command is nohlsearch, and the short one is - noh. - - Most of command-line commands completely reset selection in the current - view. However, there are several exceptions: - - - `:invert s` most likely leaves some files selected; - - - :normal command (when it doesn't leave command-line mode); - - - :if and :else commands don't affect selection on successful - execution. - - '|' can be used to separate commands, so you can give multiple commands - in one line. If you want to use '|' in an argument, precede it with - '\'. - - These commands see '|' as part of their arguments even when it's - escaped: - - :[range]! - :autocmd - :cabbrev - :cmap - :cnoreabbrev - :cnoremap - :command - :dmap - :dnoremap - :filetype - :fileviewer - :filextype - :map - :mmap - :mnoremap - :nmap - :nnoremap - :noremap - :normal - :qmap - :qnoremap - :vmap - :vnoremap - :wincmd - :windo - :winrun - - To be able to use another command after one of these, wrap it with the - :execute command. An example: - - if filetype('.') == 'reg' | execute '!!echo regular file' | endif - - :[count] - - :number - move to the file number. - :12 would move to the 12th file in the list. - :0 move to the top of the list. - :$ move to the bottom of the list. - - :[count]command - The only builtin :[count]command are :[count]d[elete] and - :[count]y[ank]. - - :d3 would delete three files starting at the current file position - moving down. - - :3d would delete one file at the third line in the list. - - :command [args] - - :[range]!program - execute command via shell. Accepts macros. - - :[range]!command & - - same as above, but the command is run in the background using vifm's - means. - - Programs that write to stderr create error dialogs showing errors of - the command. - - Note the space before ampersand symbol, if you omit it, command will be - run in the background using job control of your shell. - - Accepts macros. - - :!! - - :[range]!!command - same as :!, but pauses before returning. - - :!! repeat the last command. - - :alink - - :[range]alink[!?] - create absolute symbolic links to files in directory of inactive - view. With "?" prompts for destination file names in an editor. - "!" forces overwrite. - - :[range]alink[!] path - create absolute symbolic links to files in directory specified - by the path (absolute or relative to directory of inactive - view). - - :[range]alink[!] name1 name2... - create absolute symbolic links of files in directory of other - view giving each next link a corresponding name from the - argument list. - - :apropos - - :apropos keyword... - create a menu of items returned by the apropos command. - Selecting an item in the menu opens corresponding man page. By - default the command relies on the external "apropos" utility, - which can be customized by altering value of the 'aproposprg' - option. See "Menus and dialogs" section for controls. - - :autocmd - - :au[tocmd] {event} {pat} {cmd} - register autocommand for the {event}, which can be: - - DirEnter - triggered after directory is changed - Event name is case insensitive. - - {pat} is a comma-separated list of modified globs patterns, - which can contain tilde or environment variables. All paths use - slash ('/') as directory separator. The pattern can start with - a '!', which negates it. Patterns that do not contain slashes - are matched against the last item of the path only (e.g. "dir" - in "/path/dir"). Literal comma can be entered by doubling it. - Two modifications to globs matching are as follows: - - * - never matches a slash (i.e., can signify single - directory level) - - ** - matches any character (i.e., can match path of - arbitrary depth) - - {cmd} is a :command or several of them separated with '|'. - - Examples of patterns: - - conf.d - matches conf.d directory anywhere - - *.d - matches directories ending with ".d" anywhere - - **.git - matches something.git, but not .git anywhere - - **/.git/** - matches /path/.git/objects, but not /path/.git - - **/.git/**/ - matches /path/.git/ only (because of trailing - slash) - - /etc/* - matches /etc/conf.d/, /etc/X11, but not - /etc/X11/fs - - /etc/**/*.d - matches /etc/conf.d, /etc/X11/conf.d, etc. - - /etc/**/* - matches /etc/ itself and any file below it - - /etc/**/** - matches /etc/ itself and any file below it - - :au[tocmd] [{event}] [{pat}] - list those autocommands that match given event-pattern - combination. - {event} and {pat} can be omitted to list all autocommands. To - list any autocommands for specific pattern one can use * - placeholder in place of {event}. - - :au[tocmd]! [{event}] [{pat}] - remove autocommands that match given event-pattern combination. - Syntax is the same as for listing above. - - :apropos - repeat last :apropos command. - - :bmark - - :bmark tag1 [tag2 [tag3...]] - bookmark current directory with specified tags. - - :bmark! path tag1 [tag2 [tag3...]] - same as :bmark, but allows bookmarking specific path instead of - current directory. This is for use in vifmrc and for - bookmarking files. - - Path can contain macros that expand to single path (%c, %C, %d, - %D) or those that can expand to multiple paths, but contain only - one (%f, %F, %rx). The latter is done for convenience on using - the command interactively. Complex macros that include spaces - (e.g. "%c:gs/ /_") should be escaped. - - :bmarks - - :bmarks - display all bookmarks in a menu. - - :bmarks [tag1 [tag2...]] - display menu of bookmarks that include all of the specified - tags. See "Menus and dialogs" section for controls. - - :bmgo - - :bmgo [tag1 [tag2...]] - when there are more than one match acts exactly like :bmarks, - otherwise navigates to single match immediately (and fails if - there is no match). - - :cabbrev - - :ca[bbrev] - display menu of command-line mode abbreviations. See "Menus and - dialogs" section for controls. - - :ca[bbrev] lhs-prefix - display command-line mode abbreviations which left-hand side - starts with specified prefix. - - :ca[bbrev] lhs rhs - register new or overwrites existing abbreviation for command- - line mode. rhs can contain spaces and any special sequences - accepted in rhs of mappings (see "Mappings" section below). - Abbreviations are expanded non-recursively. - - :cnoreabbrev - - :cnorea[bbrev] - display menu of command-line mode abbreviations. See "Menus and - dialogs" section for controls. - - :cnorea[bbrev] lhs-prefix - display command-line mode abbreviations which left-hand side - starts with specified prefix. - - :cnorea[bbrev] lhs rhs - same as :cabbrev, but mappings in rhs are ignored during - expansion. - - :cd - - :cd or :cd ~ or :cd $HOME - change to home directory. - - :cd - go to the last visited directory. - - :cd ~/dir - change directory to ~/dir. - - :cd /curr/dir /other/dir - change directory of the current pane to /curr/dir and directory - of the other pane to /other/dir. Relative paths are assumed to - be relative to directory of current view. Command won't fail if - one of directories is invalid. All forms of the command accept - macros. - - :cd! /dir - same as :cd /dir /dir. - - :cds - - :cds[!] pattern string - navigate to path obtained by substituting first match in current - path. Arguments can include slashes, but starting first - argument with a separator will activate below form of the - command. Specifying "!" changes directory of both panes. - - Available flags: - - - i - ignore case (the 'ignorecase' and 'smartcase' options are not - used) - - - I - don't ignore case (the 'ignorecase' and 'smartcase' options are - not used) - - :cds[!]/pattern/string/[flags] - same as above, but with :substitute-like syntax. Other - punctuation characters can be used as separators. - - :change - - :c[hange] - show a dialog to alter properties of files. - - :chmod - - :[range]chmod - display file attributes (permission on *nix and properties on - Windows) change dialog. - - :[range]chmod[!] arg... - only for *nix - change permissions for files. See `man 1 chmod` for arg format. - "!" means set permissions recursively. - - :chown - - :[range]chown - only for *nix - same as co key in normal mode. - - :[range]chown [user][:][group] - only for *nix - change owner and/or group of files. Operates on directories - recursively. - - :clone - - :[range]clone[!?] - clones files in current directory. With "?" vifm will open vi - to edit file names. "!" forces overwrite. Macros are expanded. - - :[range]clone[!] path - clones files to directory specified with the path (absolute or - relative to current directory). "!" forces overwrite. Macros - are expanded. - - :[range]clone[!] name1 name2... - clones files in current directory giving each next clone a - corresponding name from the argument list. "!" forces - overwrite. Macros are expanded. - - :colorscheme - - :colo[rscheme]? - print current color scheme name on the status bar. - - :colo[rscheme] - display a menu with a list of available color schemes. You can - choose primary color scheme here. It is used for view if no - directory specific colorscheme fits current path. It's also - used to set border color (except view titles) and colors in - menus and dialogs. See "Menus and dialogs" section for - controls. - - :colo[rscheme] color_scheme_name - change primary color scheme to color_scheme_name. In case of - errors (e.g. some colors are not supported by terminal) either - nothing is changed or color scheme is reset to builtin colors to - ensure that TUI is left in a usable state. - - :colo[rscheme] color_scheme_name directory - associate directory with the color scheme. The directory - argument can be either absolute or relative path when - :colorscheme command is executed from command line, but - mandatory should be an absolute path when the command is - executed in scripts loaded at startup (until vifm is completely - loaded). - - :colo[rscheme] color_scheme_name color_scheme_name... - loads the first color scheme in the order given that exists and - is supported by the terminal. If none matches, current one - remains unchanged. For example: - - " use a separate color scheme for panes which are inside FUSE mounts - execute 'colorscheme in-fuse' &fusehome - - :comclear - - :comc[lear] - remove all user defined commands. - - :command - - :com[mand] - display a menu of user commands. See "Menus and dialogs" - section for controls. - - :com[mand] prefix - display user defined commands that start with the prefix. - - :com[mand] name action[ &] - set or redefine a user command. - Use :com[mand]! to overwrite a previously set command of the - same name. Builtin commands can't be redefined. - User commands must start with an upper or lower case letter. - Command name can't contain special symbols except for a single - trailing '?' or '!'. Numbers are allowed provided that they - don't cause parsing ambiguity (no command name prefix that - precedes a digit can match an existing command unless it has a - digit in the same place), for example: - " good - :command mp3 command - " good - :command mp4 command - :command mp3! command - :command mp4? command - " bad - :command mp command - :command mp44 command - " good - :command mp4c command - - User commands are run in a shell by default (see below for - syntax of other options). To run a command in the background - you must mark it as a background command by adding " &" after - the command's action (e.g., `:com rm rm %f &`). - User commands of all kinds have macros expanded in them. See - "Command macros" section for more information. - - :com[mand] name /pattern - set search pattern. - - :com[mand] name =pattern - set local filter value. - - :com[mand] name filter{:filter args} - set file name filter (see :filter command description). For - example: - - " display only audio files - :command onlyaudio filter/.+.\(mp3|wav|mp3|flac|ogg|m4a|wma|ape\)$/i - " display everything except audio files - :command noaudio filter!/.+.\(mp3|wav|mp3|flac|ogg|m4a|wma|ape\)$/i - - :com[mand] name :commands - set kind of an alias for internal commands (like in a shell). - Passes range given to alias to an aliased command, so running - :%cp after - :command cp :copy %a - equals - :%copy - - :compare - - :compare [byname | bysize | bycontents | listall | listunique | - listdups | ofboth | ofone | groupids | grouppaths | skipempty]... - compare files in one or two views according to the arguments. - The default is "bycontents listall ofboth grouppaths". See - "Compare views" section below for details. Diff structure is - incompatible with alternative representations, so values of - 'lsview' and 'millerview' options are ignored. - - :copen - - :cope[n] - opens menu with contents of the last displayed menu with - navigation to files by default, if any. - - :copy - - :[range]co[py][!?][ &] - copy files to directory of other view. With "?" prompts for - destination file names in an editor. "!" forces overwrite. - - :[range]co[py][!] path[ &] - copy files to directory specified with the path (absolute or - relative to directory of other view). "!" forces overwrite. - - :[range]co[py][!] name1 name2...[ &] - copy files to directory of other view giving each next file a - corresponding name from the argument list. "!" forces - overwrite. - - :cquit - - :cq[uit][!] - same as :quit, but also aborts directory choosing via - --choose-dir (empties output file) and returns non-zero exit - code. - - :cunabbrev - - :cuna[bbrev] lhs - unregister command-line mode abbreviation by its lhs. - - :cuna[bbrev] rhs - unregister command-line mode abbreviation by its rhs, so that - abbreviation could be removed even after expansion. - - :delbmarks - - :delbmarks - remove bookmarks from current directory. - - :delbmarks tag1 [tag2 [tag3...]] - remove set of bookmarks that include all of the specified tags. - - :delbmarks! - remove all bookmarks. - - :delbmarks! path1 [path2 [path3...]] - remove bookmarks of listed paths. - - :delcommand - - :delc[ommand] user_command - remove user defined command named user_command. - - :delete - - :[range]d[elete][!][ &] - delete selected file or files. "!" means complete removal - (omitting trash). - - :[range]d[elete][!] [reg] [count][ &] - delete selected or [count] files to the reg register. "!" means - complete removal (omitting trash). - - :delmarks - - :delm[arks]! - delete all marks. - - :delm[arks] marks ... - delete specified marks, each argument is treated as a set of - marks. - - :delsession - - :delsession - delete specified session if it was stored previously. Deleting - current session doesn't detach it. - - :display - - :di[splay] - display menu with registers content. - - :di[splay] list ... - display the contents of the numbered and named registers that - are mentioned in list (for example "az to display "", "a and "z - content). - - :dirs - - :dirs display directory stack in a menu. See "Menus and dialogs" - section for controls. - - :echo - - :ec[ho] [...] - evaluate each argument as an expression and output them - separated with a space. See help on :let command for a - definition of . - - :edit - - :[range]e[dit] [file...] - open selected or passed file(s) in editor. Macros and - environment variables are expanded. - - :else - - :el[se] - execute commands until next matching :endif if all other - conditions didn't match. See also help on :if and :endif - commands. - - :elseif - - :elsei[f] {expr1} - execute commands until next matching :elseif, :else or :endif if - conditions of previous :if and :elseif branches were evaluated - to zero. See also help on :if and :endif commands. - - :empty - - :empty permanently remove files from all existing non-empty trash - directories (see "Trash directory" section below). Trash - directories which are specified via %r and/or %u also get - deleted completely. Also remove all operations from undolist - that have no sense after :empty and remove all records about - files located inside directories from all registers. Removal is - performed as background task with undetermined amount of work - and can be checked via :jobs menu. - - :endif - - :en[dif] - end conditional block. See also help on :if and :else commands. - - :execute - - :exe[cute] [...] - evaluate each argument as an expression and join results - separated by a space to get a single string which is then - executed as a command-line command. See help on :let command - for a definition of . - - :exit - - :exi[t][!] - same as :quit. - - :file - - :f[ile][ &] - display menu of programs set for the file type of the current - file. " &" forces running associated program in background. - See "Menus and dialogs" section for controls. - - :f[ile] arg[ &] - run associated command that begins with the arg skipping opening - menu. " &" forces running associated program in background. - - :filetype - - :filet[ype] pattern-list [{descr}]def_prog[ &],[{descr}]prog2[ &],... - associate given program list to each of the patterns. - Associated program (command) is used by handlers of l and Enter - keys (and also in the :file menu). If you need to insert comma - into command just double it (",,"). Space followed by an - ampersand as two last characters of a command means running of - the command in the background. Optional description can be - given to each command to ease understanding of what command will - do in the :file menu. Vifm will try the rest of the programs - for an association when the default isn't found. When program - entry doesn't contain any of vifm macros, name of current file - is appended as if program entry ended with %c macro on *nix and - %"c on Windows. On Windows path to executables containing - spaces can (and should be for correct work with such paths) be - double quoted. See "Patterns" section below for pattern - definition and "Selection" section for how selection is handled. - See also "Automatic FUSE mounts" section below. Example for zip - archives and several actions: - - filetype *.zip,*.jar,*.war,*.ear - \ {Mount with fuse-zip} - \ FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR, - \ {View contents} - \ zip -sf %c | less, - \ {Extract here} - \ tar -xf %c, - - Note that on OS X when `open` is used to call an app, vifm is - unable to check whether that app is actually available. So if - automatic skipping of programs that aren't there is desirable, - `open` should be replaced with an actual command. - - :filet[ype] filename - list (in menu mode) currently registered patterns that match - specified file name. Same as ":filextype filename". - - :filextype - - :filex[type] pattern-list [{ description }] def_program,program2,... - same as :filetype, but this command is ignored if not running in - X. In X :filextype is equal to :filetype. See "Patterns" - section below for pattern definition and "Selection" section for - how selection is handled. See also "Automatic FUSE mounts" - section below. - - For example, consider the following settings (the order might - seem strange, but it's for the demonstration purpose): - - filetype *.html,*.htm - \ {View in lynx} - \ lynx - filextype *.html,*.htm - \ {Open with dwb} - \ dwb %f %i &, - filetype *.html,*.htm - \ {View in links} - \ links - filextype *.html,*.htm - \ {Open with firefox} - \ firefox %f &, - \ {Open with uzbl} - \ uzbl-browser %f %i &, - - If you're using vifm inside a terminal emulator that is running - in graphical environment (when X is used on *nix; always on - Windows), vifm attempts to run application in this order: - - 1. lynx - 2. dwb - 3. links - 4. firefox - 5. uzbl - - If there is no graphical environment (checked by presence of - non-empty $DISPLAY or $WAYLAND_DISPLAY environment variable on - *nix; never happens on Windows), the list will look like: - - 1. lynx - 2. links - - Just as if all :filextype commands were not there. - - The purpose of such differentiation is to allow comfortable use - of vifm with same settings in desktop environment/through remote - connection (SSH)/in native console. - - Note that on OS X $DISPLAY isn't defined unless you define it, - so :filextype should be used only if you set $DISPLAY in some - way. - - :filext[ype] filename - list (in menu mode) currently registered patterns that match - specified file name. Same as ":filetype filename". - - :fileviewer - - :filev[iewer] pattern-list command1,command2,... - register specified list of commands as viewers for each of the - patterns. Viewer is a command which output is captured and - displayed in one of the panes of vifm after pressing "e" or - running :view command. When the command doesn't contain any of - vifm macros, name of current file is appended as if command - ended with %c macro. Comma escaping and missing commands - processing rules as for :filetype apply to this command. See - "Patterns" section below for pattern definition. Supports Lua - handlers. - - Example for zip archives: - - fileviewer *.zip,*.jar,*.war,*.ear zip -sf %c, echo "No zip to preview:" - - :filev[iewer] filename - list (in menu mode) currently registered patterns that match - specified filename. - - :filter - - :filter[!] {pattern} - filter files matching the pattern out of directory listings. - '!' controls state of filter inversion after updating filter - value (see also 'cpoptions' description). Filter is matched - case sensitively on *nix and case insensitively on Windows. See - "File Filters" and "Patterns" sections. - - Example: - - " filter all files ending in .o from the filelist. - :filter /.o$/ - - - :filter[!] {empty-pattern} - same as above, but use last search pattern as pattern value. - - Example: - - :filter //I - - - :filter - reset filter (set it to an empty string) and show all files. - - :filter! - same as :invert. - - :filter? - show information on local, name and auto filters. - - :find - - :[range]fin[d] pattern - display results of find command in the menu. Searches among - selected files if any. Accepts macros. By default the command - relies on the external "find" utility, which can be customized - by altering value of the 'findprg' option. - - :[range]fin[d] -opt... - same as :find above, but user defines all find arguments. - Searches among selected files if any. - - :[range]fin[d] path -opt... - same as :find above, but user defines all find arguments. - Ignores selection and range. - - :[range]fin[d] - repeat last :find command. - - :finish - - :fini[sh] - stop sourcing a script. Can only be used in a vifm script file. - This is a quick way to skip the rest of the file. - - :goto - - :go[to] - change directory if necessary and put specified path under the - cursor. The path should be existing non-root path. Macros and - environment variables are expanded. - - :grep - - :[range]gr[ep][!] pattern - will show results of grep command in the menu. Add "!" to - request inversion of search (look for lines that do not match - pattern). Searches among selected files if any and no range - given. Ignores binary files by default. By default the command - relies on the external "grep" utility, which can be customized - by altering value of the 'grepprg' option. - - :[range]gr[ep][!] -opt... - same as :grep above, but user defines all grep arguments, which - are not escaped. Searches among selected files if any. - - :[range]gr[ep][!] - repeat last :grep command. "!" of this command inverts "!" in - repeated command. - - :help - - :h[elp] - show the help file. - - :h[elp] argument - is the same as using ':h argument' in vim. Use vifm- - to get help on vifm (tab completion works). This form of the - command doesn't work when 'vimhelp' option is off. - - :hideui - - :hideui - hide interface to show previous commands' output. - - :highlight - - :hi[ghlight] - display information about all highlight groups active at the - moment. - - :hi[ghlight] clear - reset all highlighting to builtin defaults and removed all - filename-specific rules. - - :hi[ghlight] clear ( {pat1,pat2,...} | /regexp/ ) - remove specified rule. - - :hi[ghlight] ( group-name | {pat1,pat2,...} | /regexp/ ) - display information on given highlight group or file name - pattern of color scheme used in the active view. - - :hi[ghlight] ( group-name | {pat1,pat2,...} | /regexp/[iI] ) - cterm=style | ctermfg=color | ctermbg=color | gui=style | guifg=color | - guibg=color - set style (cterm, gui), foreground (ctermfg, guifg) and/or - background (ctermbg, guibg) parameters of highlight group or - file name pattern for color scheme used in the active view. - - All style values as well as color names are case insensitive. - - Available style values (some of them can be combined): - - bold - - underline - - reverse or inverse - - standout - - italic (on unsupported systems becomes reverse) - - combine - add attributes of current group to attributes of the - parent in group hierarchy (see below) instead of replacing them - - none - - Available group-name values: - - Win - color of all windows (views, dialogs, menus) and default color - for their content (e.g. regular files in views) - - AuxWin - color of auxiliary areas of windows - - OtherWin - color of inactive pane - - Border - color of vertical parts of the border - - TabLine - tab line color (for 'tabscope' set to "global") - - TabLineSel - color of the tip of selected tab (regardless of - 'tabscope') - - TopLine - top line color of the other pane - - TopLineSel - top line color of the current pane - - CmdLine - the command line/status bar color - - ErrorMsg - color of error messages in the status bar - - StatusLine - color of the line above the status bar - - JobLine - color of job line that appears above the status line - - WildMenu - color of the wild menu items - - SuggestBox - color of key suggestion box - - CurrLine - line at cursor position in active view - - OtherLine - line at cursor position in inactive view - - OddLine - color of every second entry line in a pane - - LineNr - line number column of views - - Selected - color of selected files - - Directory - color of directories - - Link - color of symbolic links in the views - - BrokenLink - color of broken symbolic links - - HardLink - color of regular files with more than one hard link - - Socket - color of sockets - - Device - color of block and character devices - - Executable - color of executable files - - Fifo - color of fifo pipes - - CmpMismatch - color of mismatched files in side-by-side comparison - by path - - User1..User9 - 9 colors which can be used via %* 'statusline' macro - - Available colors: - - -1 or default or none - default or transparent - - black and lightblack - - red and lightred - - green and lightgreen - - yellow and lightyellow - - blue and lightblue - - magenta and lightmagenta - - cyan and lightcyan - - white and lightwhite - - 0-255 - corresponding colors from 256-color palette (for ctermfg and - ctermbg) - - #rrggbb - direct ("gui", "true", 24-bit) color in hex-notation, each - of the three compontents are in the range 0x00 to 0xff (for guifg and - guibg) - - Light versions of colors are regular colors with bold attribute set - automatically in terminals that have less than 16 colors. So order of - arguments of :highlight command is important and it's better to put - "cterm" in front of others to prevent it from overwriting attributes - set by "ctermfg" or "ctermbg" arguments. - - For convenience of color scheme authors xterm-like names for 256 color - palette is also supported. The mapping is taken from - http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim - Duplicated entries were altered by adding an underscore followed by - numerical suffix. - - 0 Black 86 Aquamarine1 172 Orange3 - 1 Red 87 DarkSlateGray2 173 LightSalmon3_2 - 2 Green 88 DarkRed_2 174 LightPink3 - 3 Yellow 89 DeepPink4_2 175 Pink3 - 4 Blue 90 DarkMagenta 176 Plum3 - 5 Magenta 91 DarkMagenta_2 177 Violet - 6 Cyan 92 DarkViolet 178 Gold3_2 - 7 White 93 Purple 179 LightGoldenrod3 - 8 LightBlack 94 Orange4_2 180 Tan - 9 LightRed 95 LightPink4 181 MistyRose3 - 10 LightGreen 96 Plum4 182 Thistle3 - 11 LightYellow 97 MediumPurple3 183 Plum2 - 12 LightBlue 98 MediumPurple3_2 184 Yellow3_2 - 13 LightMagenta 99 SlateBlue1 185 Khaki3 - 14 LightCyan 100 Yellow4 186 LightGoldenrod2 - 15 LightWhite 101 Wheat4 187 LightYellow3 - 16 Grey0 102 Grey53 188 Grey84 - 17 NavyBlue 103 LightSlateGrey 189 LightSteelBlue1 - 18 DarkBlue 104 MediumPurple 190 Yellow2 - 19 Blue3 105 LightSlateBlue 191 DarkOliveGreen1 - 20 Blue3_2 106 Yellow4_2 192 - DarkOliveGreen1_2 - 21 Blue1 107 DarkOliveGreen3 193 DarkSeaGreen1_2 - 22 DarkGreen 108 DarkSeaGreen 194 Honeydew2 - 23 DeepSkyBlue4 109 LightSkyBlue3 195 LightCyan1 - 24 DeepSkyBlue4_2 110 LightSkyBlue3_2 196 Red1 - 25 DeepSkyBlue4_3 111 SkyBlue2 197 DeepPink2 - 26 DodgerBlue3 112 Chartreuse2_2 198 DeepPink1 - 27 DodgerBlue2 113 DarkOliveGreen3_2 199 DeepPink1_2 - 28 Green4 114 PaleGreen3_2 200 Magenta2_2 - 29 SpringGreen4 115 DarkSeaGreen3 201 Magenta1 - 30 Turquoise4 116 DarkSlateGray3 202 OrangeRed1 - 31 DeepSkyBlue3 117 SkyBlue1 203 IndianRed1 - 32 DeepSkyBlue3_2 118 Chartreuse1 204 IndianRed1_2 - 33 DodgerBlue1 119 LightGreen_2 205 HotPink - 34 Green3 120 LightGreen_3 206 HotPink_2 - 35 SpringGreen3 121 PaleGreen1 207 MediumOrchid1_2 - 36 DarkCyan 122 Aquamarine1_2 208 DarkOrange - 37 LightSeaGreen 123 DarkSlateGray1 209 Salmon1 - 38 DeepSkyBlue2 124 Red3 210 LightCoral - 39 DeepSkyBlue1 125 DeepPink4_3 211 PaleVioletRed1 - 40 Green3_2 126 MediumVioletRed 212 Orchid2 - 41 SpringGreen3_2 127 Magenta3 213 Orchid1 - 42 SpringGreen2 128 DarkViolet_2 214 Orange1 - 43 Cyan3 129 Purple_2 215 SandyBrown - 44 DarkTurquoise 130 DarkOrange3 216 LightSalmon1 - 45 Turquoise2 131 IndianRed 217 LightPink1 - 46 Green1 132 HotPink3 218 Pink1 - 47 SpringGreen2_2 133 MediumOrchid3 219 Plum1 - 48 SpringGreen1 134 MediumOrchid 220 Gold1 - 49 MediumSpringGreen 135 MediumPurple2 221 - LightGoldenrod2_2 - 50 Cyan2 136 DarkGoldenrod 222 - LightGoldenrod2_3 - 51 Cyan1 137 LightSalmon3 223 NavajoWhite1 - 52 DarkRed 138 RosyBrown 224 MistyRose1 - 53 DeepPink4 139 Grey63 225 Thistle1 - 54 Purple4 140 MediumPurple2_2 226 Yellow1 - 55 Purple4_2 141 MediumPurple1 227 LightGoldenrod1 - 56 Purple3 142 Gold3 228 Khaki1 - 57 BlueViolet 143 DarkKhaki 229 Wheat1 - 58 Orange4 144 NavajoWhite3 230 Cornsilk1 - 59 Grey37 145 Grey69 231 Grey100 - 60 MediumPurple4 146 LightSteelBlue3 232 Grey3 - 61 SlateBlue3 147 LightSteelBlue 233 Grey7 - 62 SlateBlue3_2 148 Yellow3 234 Grey11 - 63 RoyalBlue1 149 DarkOliveGreen3_3 235 Grey15 - 64 Chartreuse4 150 DarkSeaGreen3_2 236 Grey19 - 65 DarkSeaGreen4 151 DarkSeaGreen2 237 Grey23 - 66 PaleTurquoise4 152 LightCyan3 238 Grey27 - 67 SteelBlue 153 LightSkyBlue1 239 Grey30 - 68 SteelBlue3 154 GreenYellow 240 Grey35 - 69 CornflowerBlue 155 DarkOliveGreen2 241 Grey39 - 70 Chartreuse3 156 PaleGreen1_2 242 Grey42 - 71 DarkSeaGreen4_2 157 DarkSeaGreen2_2 243 Grey46 - 72 CadetBlue 158 DarkSeaGreen1 244 Grey50 - 73 CadetBlue_2 159 PaleTurquoise1 245 Grey54 - 74 SkyBlue3 160 Red3_2 246 Grey58 - 75 SteelBlue1 161 DeepPink3 247 Grey62 - 76 Chartreuse3_2 162 DeepPink3_2 248 Grey66 - 77 PaleGreen3 163 Magenta3_2 249 Grey70 - 78 SeaGreen3 164 Magenta3_3 250 Grey74 - 79 Aquamarine3 165 Magenta2 251 Grey78 - 80 MediumTurquoise 166 DarkOrange3_2 252 Grey82 - 81 SteelBlue1_2 167 IndianRed_2 253 Grey85 - 82 Chartreuse2 168 HotPink3_2 254 Grey89 - 83 SeaGreen2 169 HotPink2 255 Grey93 - 84 SeaGreen1 170 Orchid - 85 SeaGreen1_2 171 MediumOrchid1 - - There are two colors (foreground and background) and only one bold - attribute. Thus single bold attribute affects both colors when - "reverse" attribute is used in vifm run inside terminal emulator. At - the same time linux native console can handle boldness of foreground - and background colors independently, but for consistency with terminal - emulators this is available only implicitly by using light versions of - colors. This behaviour might be changed in the future. - - Although vifm supports 256 colors in a sense they are supported by UI - drawing library, whether you will be able to use all of them highly - depends on your terminal. To set up terminal properly, make sure that - $TERM in the environment you run vifm is set to name of 256-color - terminal (on *nixes it can also be set via X resources), e.g. - xterm-256color. One can find list of available terminal names by - listing /usr/lib/terminfo/. Number of colors supported by terminal - with current settings can be checked via "tput colors" command. - - In order to use 24-bit colors one needs a terminal that supports them, - corresponding terminfo record (probably ends in "-direct" like in - "xterm-direct") and $TERM pointing to it. When vifm detects direct - color support "cterm*" values are ignored for groups which have at - least one of "gui*" values set, otherwise they are used after - translating via a builtin palette. - - Here is the hierarchy of highlight groups, which you need to know for - using transparency: - JobLine - SuggestBox - StatusLine - WildMenu - User1..User9 - Border - CmdLine - ErrorMsg - Win - OtherWin - AuxWin - OddLine - File name specific highlights - Directory - Link - BrokenLink - HardLink - Socket - Device - Fifo - Executable - Selected - CurrLine - LineNr (in active pane) - OtherLine - LineNr (in inactive pane) - TopLine - TopLineSel - TabLineSel (for pane tabs) - User1..User9 - TabLine - TabLineSel - User1..User9 - - "none" means default terminal color for highlight groups at the first - level of the hierarchy and transparency for all others. - - Here file name specific highlights mean those configured via globs ({}) - or regular expressions (//). At most one of them is applied per file - entry, namely the first that matches file name, hence order of - :highlight commands might be important in certain cases. - - :history - - :his[tory] - display a menu with list of visited directories. See "Menus and - dialogs" section for controls. - - :his[tory] x - x can be: - d[ir] or . show directory history. - c[md] or : show command line history. - s[earch] or / show search history and search forward on l - key. - f[search] or / show search history and search forward on l - key. - b[search] or ? show search history and search backward on l - key. - i[nput] or @ show prompt history (e.g. on one file - renaming). - fi[lter] or = show filter history (see description of the "=" - normal mode command). - See "Menus and dialogs" section for controls. - - :histnext - - :histnext - same as . The main use case for this command is to work - around the common pain point of and being the same - ASCII character: one could alter the terminal emulator settings - to emit, for example, the `F1` keycode when Ctrl-I is pressed, - then `:noremap :histnext` in vifm, add "t" flag to the - 'cpoptions', and thus have both and working as - expected. - - :histprev - - :histprev - same as . - - :if - - :if {expr1} - start conditional block. Commands are executed until next - matching :elseif, :else or :endif command if {expr1} evaluates - to non-zero, otherwise they are ignored. See also help on :else - and :endif commands. - - Example: - - if $TERM == 'screen.linux' - highlight CurrLine ctermfg=lightwhite ctermbg=lightblack - elseif $TERM == 'tmux' - highlight CurrLine cterm=reverse ctermfg=black ctermbg=white - else - highlight CurrLine cterm=bold,reverse ctermfg=black ctermbg=white - endif - - :invert - - :invert [f] - invert file name filter. - - :invert? [f] - show current filter state. - - :invert s - invert selection. - - :invert o - invert sorting order of the primary sorting key. - - :invert? o - show sorting order of the primary sorting key. - - :jobs - - :jobs display menu of current backgrounded processes. See "Menus and - dialogs" section for controls. - - :let - - :let $ENV_VAR = - set an environment variable. Warning: setting environment - variable to an empty string on Windows removes it. - - :let $ENV_VAR .= - append value to environment variable. - - :let &[l:|g:]opt = - sets option value. - - :let &[l:|g:]opt .= - append value to string option. - - :let &[l:|g:]opt += - increasing option value, adding sub-values. - - :let &[l:|g:]opt -= - decreasing option value, removing sub-values. - - Where could be a single-quoted string, double-quoted string, an - environment variable, function call or a concatanation of any of them - in any order using the '.' operator. Any whitespace is ignored. - - :locate - - :locate filename - use "locate" command to create a menu of filenames. Selecting a - file from the menu will reload the current file list in vifm to - show the selected file. By default the command relies on the - external "locate" utility (it's assumed that its database is - already built), which can be customized by altering value of the - 'locateprg' option. See "Menus and dialogs" section for - controls. - - :locate - repeat last :locate command. - - :ls - - :ls lists windows of active terminal multiplexer (only when terminal - multiplexer is used). This is achieved by issuing proper - command for active terminal multiplexer, thus the list is not - handled by vifm. - - :lstrash - - :lstrash - display a menu with list of files in trash. Each element of the - list is original path of a deleted file, thus the list can - contain duplicates. See "Menus and dialogs" section for - controls. - - :mark - - :[range]ma[rk][?] x [/full/path] [filename] - Set mark x (a-zA-Z0-9) at /full/path and filename. By default - current directory is being used. If no filename was given and - /full/path is current directory then last file in [range] is - used. Using of macros is allowed. Question mark will stop - command from overwriting existing marks. - - :marks - - :marks create a pop-up menu of marks. See "Menus and dialogs" section - for controls. - - :marks list ... - display the contents of the marks that are mentioned in list. - - :media - - :media only for *nix - display media management menu. See "Menus and dialogs" section - for controls. See also 'mediaprg' option. - - :messages - - :mes[sages] - shows previously given messages (up to 50). - - :mkdir - - :[line]mkdir[!] dir ... - create directories at specified paths. The [line] can be used - to pick node in a tree-view. "!" means make parent directories - as needed. Macros are expanded. - - :move - - :[range]m[ove][!?][ &] - move files to directory of other view. With "?" prompts for - destination file names in an editor. "!" forces overwrite. - - :[range]m[ove][!] path[ &] - move files to directory specified with the path (absolute or - relative to directory of other view). "!" forces overwrite. - - :[range]m[ove][!] name1 name2...[ &] - move files to directory of other view giving each next file a - corresponding name from the argument list. "!" forces - overwrite. - - :nohlsearch - - :noh[lsearch] - clear selection in current pane. - - :normal - - :norm[al][!] commands - execute normal mode commands. If "!" is used, user defined - mappings are ignored. Unfinished last command is aborted as if - or was typed. A ":" should be completed as well. - Commands can't start with a space, so put a count of 1 (one) - before it. - - :only - - :on[ly] - switch to a one window view. - - :plugin - - :plugin load - loads all plugins. To be used in configuration file to manually - load plugins at an earlier point. The plugins can be loaded - only once, additional calls will do nothing. - - :plugin blacklist {plugin} - adds {plugin} to the list of plugins to be ignored. - - :plugin whitelist {plugin} - adds {plugin} to the list of plugins to be loaded while ignoring - all other plugins. This list should normally be empty. - - :plugins - - :plugins - open plugins menu. See "Menus and dialogs" section for - controls. - - :popd - - :popd remove pane directories from stack. - - :pushd - - :pushd[!] /curr/dir [/other/dir] - add pane directories to stack and process arguments like :cd - command. - - :pushd exchange the top two items of the directory stack. - - :put - - :[line]pu[t][!] [reg] [ &] - put files from specified register (" by default) into current - directory. The [line] can be used to pick node in a tree-view. - "!" moves files "!" moves files from their original location - instead of copying them. During this operation no confirmation - dialogs will be shown, all checks are performed beforehand. - - :pwd - - :pw[d] show the present working directory. - - :qall - - :qa[ll][!] - exit vifm (add ! to skip saving changes and checking for active - backgrounded commands). - - :quit - - :q[uit][!] - if there is more than one tab, close the current one, otherwise - exit vifm (add ! to skip saving state and checking for active - backgrounded commands). - - :redraw - - :redr[aw] - redraw the screen immediately. - - :registers - - :reg[isters] - display menu with registers content. - - :reg[isters] list ... - display the contents of the numbered and named registers that - are mentioned in list (for example "az to display "", "a and "z - content). - - :regular - - :regular - - switch to regular view leaving custom view. - :rename - - :[range]rename[!] - rename files by editing their names in an editor. "!" renames - files recursively in subdirectories. See "External Renaming" - section. - - :[range]rename name1 name2... - rename each of selected files to a corresponding name. - - :restart - - :restart - free a lot of things (histories, commands, etc.), reread - vifminfo, vifmrc and session files and run startup commands - passed in the argument list, thus losing all unsaved changes - (e.g. recent history or keys mapped after starting this - instance). Session that wasn't yet stored gets reset. - - While many things get reset, some basic UI state and current - locations are preserved, including tabs. - - :restart full - variation of :restart that makes no attempt to preserve - anything. - - :restore - - :[range]restore - restore file from trash directory, doesn't work outside one of - trash directories. See "Trash directory" section below. - - :rlink - - :[range]rlink[!?] - create relative symbolic links to files in directory of other - view. With "?" prompts for destination file names in an editor. - "!" forces overwrite. - - :[range]rlink[!] path - create relative symbolic links of files in directory specified - with the path (absolute or relative to directory of other view). - "!" forces overwrite. - - :[range]rlink[!] name1 name2... - create relative symbolic links of files in directory of other - view giving each next link a corresponding name from the - argument list. "!" forces overwrite. - - :screen - - :screen - toggle whether to use the terminal multiplexer or not. - A terminal multiplexer uses pseudo terminals to allow multiple - windows to be used in the console or in a single xterm. - Starting vifm from terminal multiplexer with appropriate support - turned on will cause vifm to open a new terminal multiplexer - window for each new file edited or program launched from vifm. - This requires screen version 3.9.9 or newer for the screen -X - argument or tmux (1.8 version or newer is recommended). - - :screen! - enable integration with terminal multiplexers. - - :screen? - display whether integration with terminal multiplexers is - enabled. - - Note: the command is called screen for historical reasons (when tmux - wasn't yet supported) and might be changed in future releases, or get - an alias. - - :select - - :[range]select - select files in the given range (current file if no range is - given). - - :select {pattern} - select files that match specified pattern. Possible {pattern} - forms are described in "Patterns" section below. Trailing slash - for directories is taken into account, so `:select! */ | invert - s` selects only files. - - :select //[iI] - same as item above, but reuses last search pattern. - - :select !{external command} - select files from the list supplied by external command. Files - are matched by full paths, relative paths are converted to - absolute ones beforehand. - - :[range]select! [{pattern}] - same as above, but resets previously selected items before - proceeding. - - :session - - :session? - print name of the current session. - - :session - detach current session without saving it. Resets v:session. - - :session name - create or load and switch to a session with the specified name. - Name can't contain slashes. Session active at the moment is - saved before the switch. Session is also automatically saved - when quiting the application in usual ways. Sets v:session. - - :set - - :se[t] display all options that differ from their default value. - - :se[t] all - display all options. - - :se[t] opt1=val1 opt2='val2' opt3="val3" ... - sets given options. For local options both values are set. - You can use following syntax: - - for all options - option, option? and option& - - for boolean options - nooption, invoption and option! - - for integer options - option=x, option+=x and option-=x - - for string options - option=x and option+=x - - for string list options - option=x, option+=x, option-=x and - option^=x - - for enumeration options - option=x, option+=x and option-=x - - for set options - option=x, option+=x, option-=x and - option^=x - - for charset options - option=x, option+=x, option-=x and - option^=x - - the meaning: - - option - turn option on (for boolean) or print its value (for - all others) - - nooption - turn option off - - invoption - invert option state - - option! - invert option state - - option? - print option value - - option& - reset option to its default value - - option=x or option:x - set option to x - - option+=x - add/append x to option - - option-=x - remove (or subtract) x from option - - option^=x - toggle x presence among values of the option - - Option name can be prepended and appended by any number of - whitespace characters. - - :setglobal - - :setg[lobal] - display all global options that differ from their default value. - - :setg[lobal] all - display all global options. - - :setg[lobal] opt1=val1 opt2='val2' opt3="val3" ... - same as :set, but changes/prints only global options or global - values of local options. Changes to the latter might be not - visible until directory is changed. - - :setlocal - - :setl[ocal] - display all local options that differ from their default value. - - :setl[ocal] all - display all local options. - - :setl[ocal] opt1=val1 opt2='val2' opt3="val3" ... - same as :set, but changes/prints only local values of local - options. - - :shell - - :sh[ell][!] - start a shell in current directory. "!" suppresses spawning - dedicated window of terminal multiplexer for a shell. To make - vifm adaptive to environment it uses $SHELL if it's defined, - otherwise 'shell' value is used. - - - :siblnext - - :[count]siblnext[!] - - change directory to [count]th next sibling directory after - current path using value of global sort option of current pane. - "!" enables wrapping. - - For example, say, you're at /boot and root listing starts like - this: - - bin/ - boot/ - dev/ - ... - - Issuing :siblnext will navigate to /dev. - - - :siblprev - - :[count]siblprev[!] - same as :siblnext, but in the opposite direction. - - :sort - - :sor[t] - display dialog with different sorting methods, where one can - select the primary sorting key. When 'viewcolumns' options is - empty and 'lsview' is off, changing primary sorting key will - also affect view look (in particular the second column of the - view will be changed). See "Menus and dialogs" section for - controls. - - :source - - :so[urce] file - read command-line commands from the file. - - :split - - :sp[lit] - switch to a two window horizontal view. - - :sp[lit]! - toggle horizontal window splitting. - - :sp[lit] path - splits the window horizontally to show both file directories. - Also changes other pane to path (absolute or relative to current - directory of active pane). - - :stop - - :st[op] - suspend vifm (same as pressing Ctrl-Z). Does nothing if this - instance isn't running in a shell. The command exists to allow - mapping to the action of Ctrl-Z. - - :substitute - - :[range]s[ubstitute]/pattern/string/[flags] - for each file in range replace a match of pattern with string. - - String can contain \0...\9 to link to capture groups (\0 - all match, - \1 - first group, etc.). - - Pattern is stored in search history. - - Available flags: - - - i - ignore case (the 'ignorecase' and 'smartcase' options are not - used) - - - I - don't ignore case (the 'ignorecase' and 'smartcase' options are - not used) - - - g - substitute all matches in each file name (each g toggles this) - - :[range]s[ubstitute]/pattern - substitute pattern with an empty string. - - :[range]s[ubstitute]//string/[flags] - use last pattern from search history. - - :[range]s[ubstitute] - repeat previous substitution command. - - :sync - - :sync [relative path] - change the other pane to the current pane directory or to some - path relative to the current directory. Using macros is - allowed. - - :sync! change the other pane to the current pane directory and - synchronize cursor position. If current pane displays custom - list of files, position before entering it is used (current one - might not make any sense). - - - :sync! [location | cursorpos | localopts | filters | filelist | tree | - all]... - change enumerated properties of the other pane to match - corresponding properties of the current pane. Arguments have - the following meanings: - - - location - current directory of the pane; - - - cursorpos - cursor position (doesn't make sense without - "location"); - - - localopts - all local options; - - - filters - all filters; - - - filelist - list of files for custom view (implies - "location"); - - - tree - tree structure for tree view (implies "location"); - - - all - all of the above. - - :tabclose - - :tabc[lose] - close current tab, unless it's the only one open at current - scope. - - :tabmove - - :tabm[ove] [N] - without the argument or with `$` as the argument, current tab - becomes the last tab. With the argument, current tab is moved - after the tab with the specified number. Argument of `0` moves - current tab to the first position. - - :tabname - - :tabname [name] - set, update or reset (when no argument is provided) name of the - current tab. - - :tabnew - - :tabnew [path] - create new tab. Accepts optional path for the new tab. Macros - and environment variables are expanded. - - :tabnext - - :tabn[ext] - switch to the next tab (wrapping around). - - :tabn[ext] {n} - go to the tab number {n}. Tab numeration starts with 1. - - :tabonly - - :tabo[nly] - close all tabs but the current one. Closes pane tabs only at - the active side. - - :tabprevious - - :tabp[revious] - switch to the previous tab (wrapping around). - - :tabp[revious] {n} - go to the {n}-th previous tab. Note that :tabnext handles its - argument differently. - - :touch - - :[line]touch file... - create files at specified paths. Aborts on errors. Doesn't - update time of existing files. The [line] can be used to pick - node in a tree-view. Macros are expanded. - - :tr - - :[range]tr/pattern/string/ - for each file in range transliterate the characters which appear - in pattern to the corresponding character in string. When - string is shorter than pattern, it's padded with its last - character. - - :trashes - - :trashes - lists all valid trash directories in a menu. Only non-empty and - writable trash directories are shown. This is exactly the list - of directories that are cleared when :empty command is executed. - - :trashes? - same as :trashes, but also displays size of each trash - directory. - - :tree - - :tree turn pane into tree view with current directory as its root. - The tree view is implemented on top of a custom view, but is - automatically kept in sync with file system state and considers - all the filters. Thus the structure corresponds to what one - would see on visiting the directories manually. As a special - case for trees built out of custom view file-system tracking - isn't performed. - - To leave tree view go up from its root or use gh at any level of - the tree. Any command that changes directory will also do, in - particular, `:cd ..`. - - Tree structure is incompatible with alternative representations, - so values of 'lsview' and 'millerview' options are ignored. - - The "depth" argument specifies nesting level on which loading of - subdirectories won't happen (they will be folded). Values start - at 1. - - :tree! toggle current view in and out of tree mode. - - :undolist - - :undol[ist] - display list of latest changes. Use "!" to see actual commands. - See "Menus and dialogs" section for controls. - - :unlet - - :unl[et][!] $ENV_VAR1 $ENV_VAR2 ... - remove environment variables. Add ! to omit displaying of - warnings about nonexistent variables. - - :unselect - - :[range]unselect - unselect files in the given range (current file if no range is - given). - - :unselect {pattern} - unselect files that match specified pattern. Possible {pattern} - forms are described in "Patterns" section below. Trailing slash - for directories is taken into account, so `:unselect */` - unselects directories. - - :unselect !{external command} - unselect files from the list supplied by external command. - Files are matched by full paths, relative paths are converted to - absolute ones beforehand. - - :unselect //[iI] - same as item above, but reuses last search pattern. - - :version - - :ve[rsion] - show menu with version information. - - :vifm - - :vifm same as :version. - - :view - - :vie[w] - toggle on and off the quick file view (preview of file's - contents). See also 'quickview' option. - - :vie[w]! - turn on quick file view if it's off. - - :volumes - - :volumes - only for MS-Windows - display menu with volume list. Hitting l (or Enter) key opens - appropriate volume in the current pane. See "Menus and dialogs" - section for controls. - - :vsplit - - :vs[plit] - switch to a two window vertical view. - - :vs[plit]! - toggle window vertical splitting. - - :vs[plit] path - split the window vertically to show both file directories. And - changes other pane to path (absolute or relative to current - directory of active pane). - - :wincmd - - :[count]winc[md] {arg} - same as running Ctrl-W [count] {arg}. - - :windo - - :windo [command...] - execute command for each pane (same as :winrun % command). - - :winrun - - :winrun type [command...] - execute command for pane(s), which is determined by type - argument: - - ^ - top-left pane - - $ - bottom-right pane - - % - all panes - - . - current pane - - , - other pane - - :write - - :w[rite] - write current state to vifminfo and session files (if a session - is active). - - :wq - - :wq[!] same as :quit, but ! disables only the check of backgrounded - commands, while state of the application is always written. - :wqall - - :wqa[ll][!] - same as :qall, but ! disables only the check of backgrounded - commands, while state of the application is always written. - - :xall - - :xa[ll][!] - same as :qall. - - :xit - - :x[it][!] - same as :quit. - - :yank - - :[range]y[ank] [reg] [count] - will yank files to the reg register. - - :map lhs rhs - - :map lhs rhs - map lhs key sequence to rhs in normal and visual modes. - - :map! lhs rhs - map lhs key sequence to rhs in command line mode. - - - :cmap :dmap :mmap :nmap :qmap - :vmap - - :cm[ap] lhs rhs - map lhs to rhs in command line mode. - - :dm[ap] lhs rhs - map lhs to rhs in dialog modes. - - :mm[ap] lhs rhs - map lhs to rhs in menu mode. - - :nm[ap] lhs rhs - map lhs to rhs in normal mode. - - :qm[ap] lhs rhs - map lhs to rhs in view mode. - - :vm[ap] lhs rhs - map lhs to rhs in visual mode. - - - :*map - - :cm[ap] - list all maps in command line mode. - - :dm[ap] - list all maps in dialog modes. - - :mm[ap] - list all maps in menu mode. - - :nm[ap] - list all maps in normal mode. - - :qm[ap] - list all maps in view mode. - - :vm[ap] - list all maps in visual mode. - - :*map beginning - - :cm[ap] beginning - list all maps in command line mode that start with the - beginning. - - :dm[ap] beginning - list all maps in dialog modes that start with the beginning. - - :mm[ap] beginning - list all maps in menu mode that start with the beginning. - - :nm[ap] beginning - list all maps in normal mode that start with the beginning. - - :qm[ap] beginning - list all maps in view mode that start with the beginning. - - :vm[ap] beginning - list all maps in visual mode that start with the beginning. - - :noremap - - :no[remap] lhs rhs - map the key sequence lhs to rhs for normal and visual modes, but - don't expand user mappings in rhs. - - :no[remap]! lhs rhs - map the key sequence lhs to rhs for command line mode, but don't - expand user mappings in rhs. - - :cnoremap :dnoremap :mnoremap :nnoremap :qnoremap - :vnoremap - - :cno[remap] lhs rhs - map the key sequence lhs to rhs for command line mode, but don't - expand user mappings in rhs. - - :dn[oremap] lhs rhs - map the key sequence lhs to rhs for dialog modes, but don't - expand user mappings in rhs. - - :mn[oremap] lhs rhs - map the key sequence lhs to rhs for menu mode, but don't expand - user mappings in rhs. - - :nn[oremap] lhs rhs - map the key sequence lhs to rhs for normal mode, but don't - expand user mappings in rhs. - - :qn[oremap] lhs rhs - map the key sequence lhs to rhs for view mode, but don't expand - user mappings in rhs. - - :vn[oremap] lhs rhs - map the key sequence lhs to rhs for visual mode, but don't - expand user mappings in rhs. - - :unmap - - :unm[ap] lhs - remove user mapping of lhs from normal and visual modes. - - :unm[ap]! lhs - remove user mapping of lhs from command line mode. - - :cunmap :dunmap :munmap :nunmap :qunmap - :vunmap - - :cu[nmap] lhs - remove user mapping of lhs from command line mode. - - :du[nmap] lhs - remove user mapping of lhs from dialog modes. - - :mu[nmap] lhs - remove user mapping of lhs from menu mode. - - :nun[map] lhs - remove user mapping of lhs from normal mode. - - :qun[map] lhs - remove user mapping of lhs from view mode. - - :vu[nmap] lhs - remove user mapping of lhs from visual mode. - -Ranges - The ranges implemented include: - 2,3 - from second to third file in the list (including it) - % - the entire directory. - . - the current position in the filelist. - $ - the end of the filelist. - 't - the mark position t. - - Examples: - - :%delete - - would delete all files in the directory. - - :2,4delete - - would delete the files in the list positions 2 through 4. - - :.,$delete - - would delete the files from the current position to the end of the - filelist. - - :3delete4 - - would delete the files in the list positions 3, 4, 5, 6. - - If a backward range is given :4,2delete - an query message is given and - user can chose what to do next. - - The builtin commands that accept a range are :d[elete] and :y[ank]. - -Command macros - The command macros may be used in user commands. - - %a User arguments. When user arguments contain macros, they are - expanded before preforming substitution of %a. - - %c %"c The current file under the cursor. - - %C %"C The current file under the cursor in the other directory. - - %f %"f All of the selected files, but see "Selection" section below. - - %F %"F All of the selected files in the other directory list, but see - "Selection" section below. - - %b %"b Same as %f %F. - - %d %"d Full path to current directory. - - %D %"D Full path to other file list directory. - - %rx %"rx - Full paths to files in the register {x}. In case of invalid - symbol in place of {x}, it's processed with the rest of the line - and default register is used. - - %m Show command output in a menu. - - %M Same as %m, but l (or Enter) key is handled like for :locate and - :find commands. - - %u Process command output as list of paths and compose custom view - out of it. - - %U Same as %u, but implies less list updates inside vifm, which is - absence of sorting at the moment. - - %Iu Same as %u, but gives up terminal before running external - command. - - %IU Same as %U, but gives up terminal before running external - command. - - %S Show command output in the status bar. - - %q Redirect command output to quick view, which is activated if - disabled. - - %s Execute command in horizontally split window of active terminal - multiplexer (ignored if not running inside one). - - %v Same as %s, but splits vertically. - - %n Forbid use of terminal multiplexer to run the command. - - %i Completely ignore command output. For background jobs this - suppresses error dialogs, while still storing errors internally - for viewing via :jobs menu. - - %Pl Pipe list of files to standard input of a command. - - %Pz Same as %Pz, but separates paths by null ('\0') character. - - %pc Marks the end of the main command and the beginning of the clear - command for graphical preview, which is invoked on closing - preview of a file. - - %pd Marks a preview command as one that directly communicates with - the terminal. Beware that this is for things like sixel which - are self-contained sequences that depend only on current cursor - position, using this with anything else is likely to mangle - terminal state. - - The following dimensions and coordinates are in characters: - - %px x coordinate of top-left corner of preview area. - - %py y coordinate of top-left corner of preview area. - - %pw width of preview area. - - %ph height of preview area. - - - Use %% if you need to put a percent sign in your command. - - Note that %i, %Iu, %IU, %m, %M, %n, %q, %s, %S, %u, %U and %v macros - are mutually exclusive. Only the last one of them on the command will - take effect. - - Note that %Pl and %Pz are mutually exclusive. Only the last one of - them on the command will take effect. - - You can use file name modifiers after %c, %C, %f, %F, %b, %d and %D - macros. Supported modifiers are: - - - :p - full path - - - :u - UNC name of path (e.g. "\\server" in - "\\server\share"), Windows only. Expands to current computer name - for not UNC paths. - - - :~ - relative to the home directory - - - :. - relative to current directory - - - :h - head of the file name - - - :t - tail of the file name - - - :r - root of the file name (without last extension) - - - :e - extension of the file name (last one) - - - :s?pat?sub? - substitute the first occurrence of pat with sub. - You can use any character for '?', but it must not occur in pat or - sub. - - - :gs?pat?sub? - like :s, but substitutes all occurrences of pat with - sub. - - See ':h filename-modifiers' in Vim's documentation for the detailed - description. - - Using %x means expand corresponding macro escaping all characters that - have special meaning. And %"x means using of double quotes and escape - only backslash and double quote characters, which is more useful on - Windows systems. - - Position and quantity (if there is any) of %m, %M, %S or %s macros in - the command is unimportant. All their occurrences are removed from the - resulting command. - - %c and %f macros are expanded to file names only, when %C and %F are - expanded to full paths. %f and %F follow this in %b too. - - :com move mv %f %D - set the :move command to move all of the files selected in the - current directory to the other directory. - - The %a macro is replaced with any arguments given to an alias command. - All arguments are considered optional. - :com lsl !!ls -l %a - set the lsl command to execute ls -l with - or without an argument. - - :lsl - will list the directory contents of the current directory. - - :lsl filename - will list only the given filename. - - The macros can also be used in directly executing commands. ":!mv %f - %D" would move the current directory selected files to the other - directory. - - Appending & to the end of a command causes it to be executed in the - background. Typically you want to run two kinds of external commands - in the background: - - - GUI applications that doesn't fork thus block vifm (:!sxiv %f &); - - - console tools that do not work with terminal (:!mv %f %D &). - - You don't want to run terminal commands, which require terminal input - or output something in background because they will mess up vifm's TUI. - Anyway, if you did run such a command, you can use Ctrl-L key to update - vifm's TUI. - - Rewriting the example command with macros given above with - backgrounding: - - %m, %M, %s, %S, %u and %U macros cannot be combined with background - mark (" &") as it doesn't make much sense. - -Command backgrounding - Copy and move operation can take a lot of time to proceed. That's why - vifm supports backgrounding of this two operations. To run :copy, - :move or :delete command in the background just add " &" at the end of - a command. - - For each background operation a new thread is created. Job - cancellation can be requested in the :jobs menu via dd shortcut. - - You can see if command is still running in the :jobs menu. - Backgrounded commands have progress instead of process id at the line - beginning. - - Background operations cannot be undone. - -Cancellation - Note that cancellation works somewhat different on Windows platform due - to different mechanism of break signal propagation. One also might - need to use Ctrl-Break shortcut instead of Ctrl-C. - - There are two types of operations that can be cancelled: - - - file system operations; - - - mounting with FUSE (but not unmounting as it can cause loss of - data); - - - calls of external applications. - - Note that vifm never terminates applications, it sends SIGINT signal - and lets the application quit normally. - - When one of set of operations is cancelled (e.g. copying of 5th file of - 10 files), further operations are cancelled too. In this case undo - history will contain only actually performed operations. - - Cancelled operations are indicated by "(cancelled)" suffix appended to - information message on statusbar. - - File system operations - - Currently the following commands can be cancelled: :alink, :chmod, - :chown, :clone, :copy, :delete, :mkdir, :move, :restore, :rlink, - :touch. File putting (on p/P key) can be cancelled as well. It's not - hard to see that these are mainly long-running operations. - - Cancelling commands when they are repeated for undo/redo operations is - allowed for convenience, but is not recommended as further undo/redo - operations might get blocked by side-effects of partially cancelled - group of operations. - - These commands can't be cancelled: :empty, :rename, :substitute, :tr. - - Mounting with FUSE - - It's not considered to be an error, so only notification on the status - bar is shown. - - External application calls - - Each of this operations can be cancelled: :apropos, :find, :grep, - :locate. - -Selection - If there is a selection, it's stashed before proceeding further unless - file under the cursor is part of that selection. This means that when - macros are expanded for :filetype or :filextype programs, `%f` and `%F` - become equivalent to `%c` and `%C` respectively if current file is not - selected. So you run selection by running one of selected files, - otherwise you're running a single file even if there are other selected - entries. - - When running a selection it must not include broken symbolic links, has - to be consistent and set of file handlers must be compatible. - Consistency means that selection contains either only directories - (including links to them) or only files, but not their mix. - - Compatibility is a more sophisticated check, but it's defined in a - natural way so that you get what you'd expect. The following - properties of selection are taken into account while checking it for - compatibility and deciding how to handle it: - - - 1. If there any files for which handler isn't defined, then all files - are opened using 'vicmd' or 'vixcmd'. - - - 2. If all handlers match the following criteria: - - backgrounded - - include `%c` and/or `%C` - - include neither `%f` nor `%F` - then each file is executed independently of the rest. - - - 3. If all handlers are equal, the common handler is executed. This - handler might ignore selection and process only file under the - cursor. - - - 4. Otherwise, an error is reported, because handlers differ and they - don't support parallel execution. - -Patterns - :highlight, :filetype, :filextype, :fileviewer commands and 'classify' - option support globs, regular expressions and mime types to match file - names or their paths. - - There are six possible ways to write a single pattern: - - 1. [!]{comma-separated-name-globs} - - 2. [!]{{comma-separated-path-globs}} - - 3. [!]/name-regular-expression/[iI] - - 4. [!]//path-regular-expression//[iI] - - 5. [!] - - 6. undecorated-pattern - - First five forms can include leading exclamation mark that negates - pattern matching. - - The last form is implicitly refers to one of others. :highlight does - not accept undecorated form, while :filetype, :filextype, :fileviewer, - :select, :unselect and 'classify' treat it as list of name globs. - - Path patterns receive absolute path of the file that includes its name - component as well. - - To combine several patterns (AND them), make sure you're using one of - the first five forms and write patterns one after another, like this: - {*.vifm} - Mind that if you make a mistake the whole string will be treated as the - sixth form. - - :filetype, :filextype and :fileviewer commands accept comma-separated - list of patterns instead of a single pattern, thus effectively handling - OR operation on them: - {*.vifm},{*.pdf} - Forms that accept comma-separated lists of patterns also process them - as lists of alternatives. - - Patterns with regular expressions - - Regular expression patterns are case insensitive by default, see - description of commands, which might override default behaviour. - - Flags of regular expressions mean the following: - - "i" makes filter case insensitive; - - "I" makes filter case sensitive. They can be repeated multiple - times, but the later one takes precedence (e.g. "iiiI" is equivalent - to "I" and "IiIi" is the same as "i"). - - There are no implicit `^` or `$`, so make sure to specify them - explicitly if the pattern should match the whole name or path. - - Patterns with globs - - "Globs" section below provides short overview of globs and some - important points that one needs to know about them. - - Patterns with mime-types - - Mime type matching is essentially globs matching applied to mime type - of a file instead of its name/path. Note: mime types aren't detected - on Windows. - - Examples - - Associate `evince` to PDF-files only inside `/home/user/downloads/` - directory (excluding its subdirectories): - - :filextype //^/home/user/downloads/[^/]*.pdf$// evince %f - - -Globs - Globs are always case insensitive as it makes sense in general case. - - `*`, `?`, `[` and `]` are treated as special symbols in the pattern. - E.g. - - :filetype * less %c - - matches all files. One can use character classes for escaping, so - - :filetype [*] less %c - - matches only one file name, the one which contains only asterisk - symbol. - - `*` means any number of any characters (possibly an empty substring), - with one exception: asterisk at the pattern beginning doesn't match dot - in the first position. E.g. - - :fileviewer *.zip,*.jar zip -sf %c - - associates using of `zip` program to preview all files with `zip` or - `jar` extensions as listing of their content, but `.file.zip` won't be - matched. - - `?` means any character at this position. E.g. - - :fileviewer ?.out file %c - - calls `file` tool for all files which have exactly one character before - their extension (e.g. a.out, b.out). - - Square brackets designate character class, which means that whole - character class matches against any of characters listed in it. For - example - - :fileviewer *.[ch] highlight -O xterm256 -s dante --syntax c %c - - makes vifm call `highlight` program to colorize source and header files - in C language for a 256-color terminal. Equal command would be - - :fileviewer *.c,*.h highlight -O xterm256 -s dante --syntax c %c - - - Inside square brackets `^` or `!` can be used for symbol class - negotiation and the `-` symbol to set a range. `^` and `!` should - appear right after the opening square bracket. For example - - :filetype *.[!d]/ inspect_dir - - associates `inspect_dir` as additional handler for all directories that - have one character extension unless it's "d" letter. And - - :filetype [0-9].jpg sxiv - - associates `sxiv` picture viewer only for JPEG-files that contain - single digit in their name. - - If you need to include literal comma, which is normally separates - multiple globs, double it. - -:set options - Local options - These are kind of options that are local to a specific view. So - you can set ascending sorting order for left pane and descending - order for right pane. - - In addition to being local to views, each such option also has - two values: - - - local to current directory (value associated with current - location); - - - global to current directory (value associated with the - pane). - - The idea is that current directory can be made a temporary - exception to regular configuration of the view, until directory - change. Use :setlocal for that. :setglobal changes view value - not affecting settings until directory change. :set applies - changes immediately to all values. - - - 'aproposprg' - type: string - default: "apropos %a" - Specifies format for an external command to be invoked by the - :apropos command. The format supports expanding of macros, - specific for a particular *prg option, and %% sequence for - inserting percent sign literally. This option should include - the %a macro to specify placement of arguments passed to the - :apropos command. If the macro is not used, it will be - implicitly added after a space to the value of this option. - - 'autochpos' - type: boolean - default: true - When disabled vifm will set cursor to the first line in the view - after :cd and :pushd commands instead of saved cursor position. - Disabling this will also make vifm clear information about - cursor position in the view history on :cd and :pushd commands - (and on startup if 'autochpos' is disabled in the vifmrc). l - key in the ":history ." and ":trashes" menus are treated like - :cd command. This option also affects marks so that navigating - to a mark doesn't restore cursor position. - - When this option is enabled, more fine grained control over - cursor position is available via 'histcursor' option. - - 'columns' 'co' - type: integer - default: terminal width on startup - Terminal width in characters. - - 'caseoptions' - type: charset - default: "" - This option gives additional control over case sensitivity by - allowing overriding default behaviour to either always be case - sensitive or always be case insensitive. Possible values form - pairs of lower and upper case letters that configure specific - aspect of behaviour: - p - always ignore case of paths during completion. - P - always match case of paths during completion. - g - always ignore case of characters for f/F/;/,. - G - always match case of characters for f/F/;/,. - - At most one item of each pair takes affect, if both or more are - present, only the last one matters. When none of pair's - elements are present, the behaviour is default (depends on - operating system for path completion and on values of - 'ignorecase' and 'smartcase' options for file navigation). - - 'cdpath' 'cd' - type: string list - default: value of $CDPATH with commas instead of colons - Specifies locations to check on changing directory with relative - path that doesn't start with "./" or "../". When non-empty, - current directory is examined after directories listed in the - option. - - This option doesn't affect completion of :cd command. - - Example: - - set cdpath=~ - - This way ":cd bin" will switch to "~/bin" even if directory - named "bin" exists in current directory, while ":cd ./bin" - command will ignore value of 'cdpath'. - - 'chaselinks' - type: boolean - default: false - When enabled path of view is always resolved to real path (with - all symbolic links expanded). - - 'classify' - type: string list - default: ":dir:/" - Specifies file name prefixes and suffixes depending on file type - or name. The format is either of: - - [{prefix}]:{filetype}:[{suffix}] - - [{prefix}]::{pattern}::[{suffix}] - Possible {pattern} forms are described in "Patterns" section - above. - - Priority rules: - - file name patterns have priority over type patterns - - file name patterns are matched in left-to-right order of - their appearance in this option - - Either {prefix} or {suffix} or both can be omitted (which is the - default for all unspecified file types), this means empty - {prefix} and/or {suffix}. {prefix} and {suffix} should consist - of at most eight characters. Elements are separated by commas. - Neither prefixes nor suffixes are part of file names, so they - don't affect commands which operate on file names in any way. - Comma (',') character can be inserted by doubling it. List of - file type names can be found in the description of filetype() - function. - - 'confirm' 'cf' - type: set - default: delete,permdelete - Defines which operations require confirmation: - - delete - moving files to trash (on d or :delete); - - permdelete - permanent deletion of files (on D or :delete! - command or on undo/redo operation). - - 'cpoptions' 'cpo' - type: charset - default: "fst" - Contains a sequence of single-character flags. Each flag - enables behaviour of older versions of vifm. Flags: - - f - when included, running :filter command results in not - inverted (matching files are filtered out) and :filter! in - inverted (matching files are left) filter, when omitted, meaning - of the exclamation mark changes to the opposite; - - s - when included, yy, dd and DD normal mode commands act on - selection, otherwise they operate on current file only; - - t - when included, (thus ) behave as and - switches active pane, otherwise and go forward in - the view history. It's possible to make both and to - work as expected by setting up the terminal to emit a custom - sequence when is pressed; see :histnext for details. - - 'cvoptions' - type: set - default: - Specifies whether entering/leaving custom views triggers events - that normally happen on entering/leaving directories: - - autocmds - trigger autocommands on entering/leaving custom - views; - - localopts - reset local options on entering/leaving custom - views; - - localfilter - reset local filter on entering/leaving custom - views. - - 'deleteprg' - type: string - default: "" - Specifies program to run on files that are permanently removed. - When empty, files are removed as usual, otherwise this command - is invoked on each file by appending its name. If the command - doesn't remove files, they will remain on the file system. - - 'dirsize' - type: enumeration - default: size - Controls how size of directories is displayed in file views. - The following values are possible: - - size - size of directory (i.e., size used to store list of - files) - - nitems - number of entries in the directory (excluding . and - ..) - - Size obtained via ga/gA overwrites this setting so seeing count - of files and occasionally size of directories is possible. - - 'dotdirs' - type: set - default: nonrootparent,treeleafsparent - Controls displaying of dot directories. The following values - are possible: - - rootparent - show "../" in root directory of file system - - nonrootparent - show "../" in non-root directories of file - system - - treeleafsparent - show "../" in empty directories of tree - view - - Note that empty directories always contain "../" entry - regardless of value of this option. "../" disappears at the - moment at least one file is created. - - 'dotfiles' - type: boolean - default: false - Whether dot files are shown in the view. Can be controlled with - z* bindings. - - 'fastrun' - type: boolean - default: false - With this option turned on you can run partially entered - commands with unambiguous beginning using :! (e.g. :!Te instead - of :!Terminal or :!Te). - - 'fillchars' 'fcs' - type: string list - default: "" - Sets characters used to fill borders. - - item default used for - vborder:c ' ' left, middle and right vertical - borders - - If value is omitted, its default value is used. Example: - - set fillchars=vborder:. - - 'findprg' - type: string - default: "find %s %a -print , -type d \( ! -readable -o ! - -executable \) -prune" - Specifies format for an external command to be invoked by the - :find command. The format supports expansion of macros specific - for this particular option and %% sequence for inserting percent - sign literally. The macros are: - - macro value/meaning - %s literal arguments of :find or - list of paths to search in - - %A empty or - literal arguments of :find - %a empty or - literal arguments of :find or - predicate followed by escaped arguments of :find - %p empty or - literal arguments of :find or - escaped arguments (parameters) of :find - - %u redirect output to custom view instead of showing a - menu - %U redirect output to unsorted custom view instead of - showing a menu - - Predicate in %a is "-name" on *nix and "-iname" on Windows. - - If both %u and %U are specified, %U is chosen. - - Some macros can be added implicitly: - - if %s isn't present, it's appended - - if neither of %a, %A and %p is present, %a is appended - - if neither of %s, %a, %A and %p is present, %s and %a are - appended in this order - - The macros slightly change their meaning depending on format of - :find's arguments: - - if the first argument points to an existing directory, %s is - assigned all arguments while %a, %A and %p are left empty - - otherwise: - - %s is assigned a dot (".") meaning current directory or - list of selected file names, if any - - %a, %A and %p are assigned literal arguments when first - argument starts with a dash ("-"), otherwise %a gets an escaped - version of the arguments with a predicate and %p contains - escaped version of the arguments - - Starting with Windows Server 2003 a `where` command is - available. One can configure vifm to use it in the following - way: - - set findprg="where /R %s %A" - - As the syntax of this command is rather limited, one can't use - :find command with selection of more than one item because the - command ignores all directory paths except for the last one. - - When using find port on Windows, another option is to setup - 'findprg' like this: - - set findprg="find %s %a" - - - 'followlinks' - type: boolean - default: true - Follow links on l or Enter. That is navigate to destination - file instead of treating the link as if it were target file. - Doesn't affects links to directories, which are always entered - (use gf key for directories). - - 'fusehome' - type: string - default: "($XDG_DATA_HOME/.local/share | $VIFM)/fuse/" - Directory to be used as a root dir for FUSE mounts. Value of - the option can contain environment variables (in form - "$envname"), which will be expanded (prepend it with a slash to - prevent expansion). The value should expand to an absolute - path. - - If you change this option, vifm won't remount anything. It - affects future mounts only. See "Automatic FUSE mounts" section - below for more information. - - 'gdefault' 'gd' - type: boolean - default: false - When on, 'g' flag is on for :substitute by default. - - 'grepprg' - type: string - default: "grep -n -H -I -r %i %a %s" - Specifies format for an external command to be invoked by the - :grep command. The format supports expanding of macros, - specific for a particular *prg option, and %% sequence for - inserting percent sign literally. This option should include - the %i macro to specify placement of "-v" string when inversion - of results is requested, %a or %A macro to specify placement of - arguments passed to the :grep command and the %s macro to - specify placement of list of files to search in. If some of the - macros are not used, they will be implicitly added after a space - to the value of the 'grepprg' option in the following order: %i, - %a, %s. Note that when neither %a nor %A are specified, it's %a - which is added implicitly. - - Optional %u or %U macro could be used (if both specified %U is - chosen) to force redirection to custom or unsorted custom view - respectively. - - See 'findprg' option for description of difference between %a - and %A. - - Example of setup to use ack (http://beyondgrep.com/) instead of - grep: - - set grepprg='ack -H -r %i %a %s' - - or The Silver Searcher - (https://github.com/ggreer/the_silver_searcher): - - set grepprg='ag --line-numbers %i %a %s' - - - - 'histcursor' - type: set - default: startup,dirmark,direnter - Defines situations when cursor should be moved according to - directory history: - - startup - on loading file lists during startup - - dirmark - after navigating to a mark that doesn't specify - file - - direnter - on opening directory from a file list - - This option has no effect when 'autochpos' is disabled. - - Note that the list is not exhaustive and there are other - situations when cursor is positioned automatically. - - 'history' 'hi' - type: integer - default: 15 - Maximum number of stored items in all histories. - - 'hlsearch' 'hls' - type: boolean - default: true - Automatically select files that are search matches. - - 'iec' type: boolean - default: false - Use KiB, MiB, ... suffixes instead of K, M, ... when printing - size in human-friendly format. - - 'ignorecase' 'ic' - type: boolean - default: false - Ignore case in search patterns (:substitute, / and ? commands), - local filter (but not the rest of filters) and other things - detailed in the description of 'caseoptions'. - - 'incsearch' 'is' - type: boolean - default: false - When this option is set, search and view update for local filter - is be performed starting from initial cursor position each time - search pattern is changed. - - 'iooptions' - type: set - default: - Controls details of file operations. The following values are - available: - - fastfilecloning - perform fast file cloning (copy-on-write), - when available - (available on Linux and btrfs file system). - - 'laststatus' 'ls' - type: boolean - default: true - Controls if status bar is visible. - - 'lines' - type: integer - default: terminal height on startup - Terminal height in lines. - - 'locateprg' - type: string - default: "locate %a" - Specifies format for an external command to be invoked by the - :locate command. The format supports expanding of macros, - specific for a particular *prg option, and %% sequence for - inserting percent sign literally. This option should include - the %a macro to specify placement of arguments passed to the - :locate command. If the macro is not used, it will be - implicitly added after a space to the value of this option. - - Optional %u or %U macro could be used (if both specified %U is - chosen) to force redirection to custom or unsorted custom view - respectively. - - 'mediaprg' - type: string - default: path to bundled script that supports udevil, udisks and - udisks2 - (using udisks2 requires python with dbus module - installed) - OS X: path points to a python script that uses diskutil - {only for *nix} - Specifies command to be used to manage media devices. Used by - :media command. - - The command can be passed the following parameters: - - list -- list media - - mount {device} -- mount a device - - unmount {path} -- unmount given mount point - - The output of `list` subcommand is parsed in search of lines - that start with one of the following prefixes: - - device= - specifies device path (e.g., "/dev/sde") - - label= - specifies optional device label (e.g., "Memory - card") - - info= - specifies arbitrary text to display next to - device (by - default "[label]" is used, if label is - provided) - - mount-point= - specifies a mount point (can be absent or - appear more than once) - - All other lines are ignored. Each `device=` starts a new - section describing a device which should include two other - possible prefixes. - - `list` subcommand is assumed to always succeed, while exit code - of `mount` and `unmount` is taken into account to determine - whether operation was performed successfully. - - 'lsoptions' - type: string list - default: "" - scope: local - - Configures ls-like view. - - item used for - transposed filling view grid by columns rather than by - lines - - - 'lsview' - type: boolean - default: false - scope: local - When this option is set, directory view will be displayed in - multiple columns with file names similar to output of `ls -x` - command. See "ls-like view" section below for format - description. This option has no effect if 'millerview' is on. - - 'milleroptions' - type: string list - default: "lsize:1,csize:1,rsize:1,rpreview:dirs" - scope: local - - Configures miller view. - - item default used for - lsize:num 0 left column - csize:num 1 center column (can't be disabled) - rsize:num 0 right column - rpreview:str dirs right column - - *size specifies ratios of columns. Each ratio is in the range - from 0 to 100 and values are adjusted to fit the limits. Zero - disables a column, but central (main) column can't be disabled. - - rpreview specifies what file-system objects should be previewed - in the right column and can take two values: dirs (only - directories) or all. Both options don't include parent - directory (".."). - - Example of two-column mode which is useful in combination with - :view command: - - set milleroptions=lsize:1,csize:2 - - - 'millerview' - type: boolean - default: false - scope: local - When this option is set, directory view will be displayed in - multiple cascading columns. Ignores 'lsview'. - - 'mintimeoutlen' - type: integer - default: 150 - The fracture of 'timeoutlen' in milliseconds that is waited - between subsequent input polls, which affects various - asynchronous operations (detecting changes made by external - applications, monitoring background jobs, redrawing UI). There - are no strict guarantees, however the higher this value is, the - less is CPU load in idle mode. - - 'number' 'nu' - type: boolean - default: false - scope: local - Print line number in front of each file name when 'lsview' - option is turned off. Use 'numberwidth' to control width of - line number. Also see 'relativenumber'. - - 'numberwidth' 'nuw' - type: integer - default: 4 - scope: local - Minimal number of characters for line number field. - - 'previewoptions' - type: string list - default: "graphicsdelay:50000" - - Tweaks how previewing is done (in quick view, miller view's - column and view mode). - - item default meaning - graphicsdelay:num 0 delay before drawing graphics - (microseconds) - hardgraphicsclear unset redraw screen to get rid of - graphics - toptreestats unset show file counts before the tree - - graphicsdelay is needed if terminal requires some timeout before - it can draw graphics (otherwise it gets lost). - - hardgraphicsclear seems to be necessary to get rid of sixel - graphics in some terminals, where it otherwise lingers. This - can cause flicker on the screen due to erasure followed by - redrawing. - - 'previewprg' - type: string - default: "" - scope: local - - External command to be used instead of preview programs - configured via :fileviewer command. - - Example: - - " always show git log in preview of files inside some repository - au DirEnter '~/git-repo/**/*' setl previewprg='git log --color -- %c 2>&1' - - 'quickview' - type: boolean - default: false - Whether quick view (:view) is currently active or not. - - 'relativenumber' 'rnu' - type: boolean - default: false - scope: local - Print relative line number in front of each file name when - 'lsview' option is turned off. Use 'numberwidth' to control - width of line number. Various combinations of 'number' and - 'relativenumber' lead to such results: - - nonumber number - - norelativenumber | first | 1 first - | second | 2 second - | third | 3 third - - relativenumber | 1 first | 1 first - | 0 second |2 second - | 1 third | 1 third - - - 'rulerformat' 'ruf' - type: string - default: "%l/%S " - Determines the content of the ruler. Its minimal width is 13 - characters and it's right aligned. Following macros are - supported: - %= - separation point between left and right aligned halves of - the line - %l - file number - %L - total number of files in view (including filtered out - ones) - %x - number of files excluded by filters - %0- - old name for %x macro - %P - percentage through file list (All, Top, xx% or Bot), - always 3 in length - %S - number of displayed files - %= - separation point between left and right align items - %% - literal percent sign - %[ - designates beginning of an optional block - %] - designates end of an optional block - - Percent sign can be followed by optional minimum field width. - Add '-' before minimum field width if you want field to be right - aligned. - - Optional blocks are ignored unless at least one macro inside of - them is expanded to a non-empty value. - - Example: - - set rulerformat='%2l-%S%[ +%x%]' - - 'runexec' - type: boolean - default: false - Run executable file on Enter, l or Right Arrow key. Behaviour - of the last two depends on the value of the 'lsview' option. - - 'scrollbind' 'scb' - type: boolean - default: false - When this option is set, vifm will try to keep difference of - scrolling positions of two windows constant. - - 'scrolloff' 'so' - type: integer - default: 0 - Minimal number of screen lines to keep above and below the - cursor. If you want cursor line to always be in the middle of - the view (except at the beginning or end of the file list), set - this option to some large value (e.g. 999). - - 'sessionoptions' 'ssop' - sessionoptions ssop - type: set - default: tui,state,tabs,savedirs,dhistory - An equivalent of 'vifminfo' for sessions, uses the same values. - When both options include the same value, data from session file - has higher priority (data from vifminfo isn't necessarily - completely discarded, instead it's merged with the state of a - session the same way state of multiple instances is merged on - exit). - - 'shell' 'sh' - type: string - default: $SHELL or "/bin/sh" or "cmd" (on MS-Windows) - Full path to the shell to use to run external commands. On *nix - a shell argument can be supplied. - - 'shellcmdflag' 'shcf' - type: string - default: "-c" or "/C" (for cmd.exe on MS-Windows) - Command-line option used to pass a command to 'shell'. It's - used in contexts where command comes from the user. - - Note that using this option to force interactive mode of the - shell is most likely a BAD IDEA. In general interactive host - and interactive child shell can't share the same terminal - session. You can't even run such a shell in background. - Consider writing a wrapper for your shell that preloads aliases - and commands without making the shell interactive and ending up - using it in a way it was not meant to be used. - - Note that this option is ignored when 'shell' is set to - PowerShell due to the internal use of `-encodedCommand`. - - 'shortmess' 'shm' - type: charset - default: "p" - Contains a sequence of single-character flags. Each flag - enables shortening of some message displayed by vifm in the TUI. - Flags: - - L - display only last directory in tab line instead of full - path. - - M - shorten titles in windows of terminal multiplexers - created by vifm down to file name instead of using full path. - - T - truncate status-bar messages in the middle if they are - too long to fit on the command line. "..." will appear in the - middle. - - p - use tilde shortening in view titles. - - - 'showtabline' 'stal' - type: enumeration - default: multiple - Specifies when tab line should be displayed. Possible values: - - never - never display tab line - - multiple - show tab line only when there are at least two - tabs - - always - display tab line always - - Alternatively 0, 1 and 2 Vim-like values are also accepted and - correspond to "never", "multiple" and "always" respectively. - - 'sizefmt' - type: string list - default: "units:iec" - Configures the way size is formatted in human-friendly way. - - item value meaning - units: iec Use 1024 byte units (K or KiB, - etc.). - See 'iec' option. - si Use 1000 byte units (KB, etc.). - precision: i > 0 How many fraction digits to - consider. - {not set} Precision of 1 for integer part - < 10, - 0 otherwise (provides old - behaviour). - space {present} Insert space before unit - symbols. - This is the default. - nospace {present} Do not insert space before unit - symbols. - - Numbers are rounded from zero. Trailing zeros are dropped. - - Example: - - set sizefmt=units:iec,precision:2,nospace - - - 'slowfs' - type: string list - default: "" - only for *nix - A list of mounter fs name beginnings (first column in /etc/mtab - or /proc/mounts) or paths prefixes for fs/directories that work - too slow for you. This option can be used to stop vifm from - making some requests to particular kinds of file systems that - can slow down file browsing. Currently this means don't check - if directory has changed, skip check if target of symbolic links - exists, assume that link target located on slow fs to be a - directory (allows entering directories and navigating to files - via gf). If you set the option to "*", it means all the systems - are considered slow (useful for cygwin, where all the checks - might render vifm very slow if there are network mounts). - - Example for autofs root /mnt/autofs: - - set slowfs+=/mnt/autofs - - 'smartcase' 'scs' - type: boolean - default: false - Overrides the ignorecase option if a pattern contains at least - one upper case character. Only used when 'ignorecase' option is - enabled. - - 'sort' type: string list - default: +name on *nix and +iname on Windows - scope: local - Sets list of sorting keys (first item is primary key, second is - secondary key, etc.): - [+-]ext - extension of files and directories - [+-]fileext - extension of files only - [+-]name - name (including extension) - [+-]iname - name (including extension, ignores case) - [+-]type - file type - (dir/reg/exe/link/char/block/sock/fifo) - [+-]dir - directory grouping (directory < file) - [+-]gid - group id (*nix only) - [+-]gname - group name (*nix only) - [+-]mode - file type derived from its mode (*nix only) - [+-]perms - permissions string (*nix only) - [+-]uid - owner id (*nix only) - [+-]uname - owner name (*nix only) - [+-]nlinks - number of hard links (*nix only) - [+-]inode - inode number (*nix only) - [+-]size - size - [+-]nitems - number of items in a directory (zero for files) - [+-]groups - groups extracted via regexps from 'sortgroups' - [+-]target - symbolic link target (empty for other file - types) - [+-]atime - time accessed (e.g., read, executed) - [+-]ctime - time changed (changes in metadata, like mode) - [+-]mtime - time modified (when file contents is changed) - - Note: look for st_atime, st_ctime and st_mtime in "man 2 stat" - for more information on time keys. - - '+' means ascending sort for this key, and '-' means descending - sort. - - "dir" key is somewhat similar in this regard but it's added - implicitly: when "dir" is not specified, sorting behaves as if - it was the first key in the list. That's why if one wants - sorting algorithm to mix directories and files, "dir" should be - appended to sorting option, for example like this: - - set sort+=dir - - or - - set sort=-size,dir - - Value of the option is checked to include dir key and default - sorting key (name on *nix, iname on Windows). Here is what - happens if one of them is missing: - - - type key is added at the beginning; - - - default key is added at the end; - - all other keys are left untouched (at most they are moved). - - This option also changes view columns according to primary - sorting key set, unless 'viewcolumns' option is not empty. - - 'sortnumbers' - type: boolean - default: false - scope: local - Natural sort of (version) numbers within text. - - 'sortgroups' - type: string - default: "" - scope: local - Sets comma-separated list of regular expressions for group type - of sorting. Double the comma to insert it literally. - - The regular expressions are used to extract substrings of file - names to serve as keys for sorting. It is essentially a way to - ignore uninteresting parts of file names during sorting by name. - - Each expression should contain at least one group or its value - will be considered to be always empty. Also, only the first - match of regular expression is processed. - - The first group divides list of files into sub-groups, each of - which is then sorted by substrings extracted using second - regular expression and so on recursively. - - Example: - set sortgroups=-(todo|done).* - this would group files with "-done" in their names and files - with "-todo" separately. On ascending sorting, group containing - "-done" would appear before the other one. - - 'sortorder' - type: enumeration - default: ascending - Sets sort order for primary key: ascending, descending. - - 'statusline' 'stl' - type: string - default: "" - Determines the content of the status line (the line right above - command-line). Empty string means use same format like in - previous versions. Following macros are supported: - - - %N - line break (increases height of the status line - accordingly), ignores %[ %] blocks - - - %t - file name (considering value of the 'classify' option) - - - %T - symbolic link target (empty for other filetypes) - - - %f - file name relative to current directory (considers - 'classify') - - - %A - file attributes (permissions on *nix or properties on - Windows) - - - %u - user name or uid (if it cannot be resolved) - - - %g - group name or gid (if it cannot be resolved) - - - %s - file size in human readable format - - - %E - size of selected files in human readable format, same as - %s when no files are selected, except that it will never show - size of ../ in visual mode, since it cannot be selected - - - %d - file modification date (uses 'timefmt' option) - - - %D - path of the other pane for single-pane layout - - - %a - amount of free space available on current FS - - - %c - size of current FS - - - %z - short tips/tricks/hints that chosen randomly after one - minute period - - - %{} - evaluate arbitrary vifm expression '', e.g. - '&sort' - - - %* - resets or applies one of User1..User9 highlight groups; - reset happens when width field is 0 or not specified, one of - groups gets picked when width field is in the range from 1 to - 9 - - - all 'rulerformat' macros - - Percent sign can be followed by optional minimum field width. - Add '-' before minimum field width if you want field to be right - aligned. - - On Windows file properties include the following flags (upper - case means flag is on): - A - archive - H - hidden - I - content isn't indexed - R - readonly - S - system - C - compressed - D - directory - E - encrypted - P - reparse point (e.g. symbolic link) - Z - sparse file - - Example without colors: - - set statusline=" %t%= %A %10u:%-7g %15s %20d %{&sort} " - - Example with colors: - - highlight User1 ctermbg=yellow - highlight User2 ctermbg=blue ctermfg=white cterm=bold - set statusline="%1* %-26t %2* %= %1* %A %2* %7u:%-7g %1* %-5s %2* %d " - - - 'suggestoptions' - type: string list - default: - Controls when, for what and how suggestions are displayed. The - following values are available: - - normal - in normal mode; - - visual - in visual mode; - - view - in view mode; - - otherpane - use other pane to display suggestions, when - available; - - delay[:num] - display suggestions after a small delay (to - do not annoy if you just want to type a fast shortcut consisting - of multiple keys), num specifies the delay in ms (500 by - default), 'timeoutlen' at most; - - keys - include shortcuts (commands and selectors); - - foldsubkeys - fold multiple keys with common prefix; - - marks - include marks; - - registers[:num] - include registers, at most num files (5 by - default). - - 'syncregs' - type: string - default: - Specifies identifier of group of instances that share registers - between each other. When several instances of vifm have this - option set to identical value, they automatically synchronize - contents of their registers on operations which use them. - - 'syscalls' - type: boolean - default: false - When disabled, vifm will rely on external applications to - perform file-system operations, otherwise system calls are used - instead (much faster and supports progress tracking). The - option should eventually be removed. Mostly *nix-like systems - are affected. - - 'tablabel' - type: string - default: "" - When non-empty, determines format of the main part of a single - tab's label. - - When empty, tab label is set to either tab name for named tabs - or to view title (usually current path) for unnamed tabs. - - The following macros can appear in the format (see below for - what a flag is): - - - %C - flag of a current tab - - - %N - number of the tab - - - %T - flag of a tree mode - - - %c - description of a custom view - - - %n - name of the tab - - - %p - path of the view (handles filename modifiers) - - - %t - title of the view (affected by 'shortmess' flags) - - - %% - literal percent sign - - - %[ - designates beginning of an optional block - - - %] - designates end of an optional block - - - %*, %0* - resets highlighting - - - %1-%9 - applies one of User1..User9 highlight groups - - In global tabs the view in bullets above refers to currently - active view of that tab. - - Flag macros are a special kind of macros that always expand to - an empty value and are ment to be used inside optional blocks to - control their visibility. - - Optional blocks are ignored unless at least one macro inside of - them is expanded to a non-empty value or is a set flag macro. - - " %[(%n)%] -- optional name of the tab - " %[ -- optional description of the view - " %[%T{tree}%] -- mark of tree mode - " %[{%c}%] -- description of custom view - " @ -- just an extra separator before the path - ' %] - " %p:t -- tail part of view's location - set tablabel=%[(%n)%]%[%[%T{tree}%]%[{%c}%]@%]%p:t - - 'tabprefix' - type: string - default: "[%N:" - Determines prefix of a tab's label. Formatting is done as for - 'tablabel' option. - - 'tabscope' - type: enumeration - default: global - Picks style of tabs, which defines what a single tab contains. - Possible values: - - global - tab describes complete UI of two views and how they - are arranged - - pane - tab is located "inside" a pane and manages it and - quick view - - 'tabstop' 'ts' - type: integer - default: value from curses library - Number of spaces that a Tab in the file counts for. - - 'tabsuffix' - type: string - default: "]" - Determines suffix of a tab's label. Formatting is done as for - 'tablabel' option. - - 'timefmt' - type: string - default: "%m/%d %H:%M" - Format of time in file list. See "man 1 date" or "man 3 - strftime" for details. - - 'timeoutlen' 'tm' - type: integer - default: 1000 - The time in milliseconds that is waited for a mapped key in case - of already typed key sequence is ambiguous. - - 'title' - type: boolean - default: true when title can be restored, false otherwise - When enabled, title of the terminal or terminal multiplexer's - window is updated according to current location. Because not - all terminals support setting title, this works only if `$TERM` - value matches one of the following conditions: - - equals "xterm" or starts with "xterm-" - - equals "rxvt" or starts with "rxvt-" - - equals "screen" or starts with "screen-" - - equals "aterm" - - equals "Eterm" - - 'trash' - type: boolean - default: true - Use trash directory. See "Trash directory" section below. - - 'trashdir' - type: string - default: on *nix: - "%r/.vifm-Trash-%u,$VIFM/Trash,%r/.vifm-Trash" - or if $VIFM/Trash doesn't exist - "%r/.vifm-Trash-%u,$XDG_DATA_HOME/vifm/Trash,%r/.vifm-Trash" - on Windows: - "%r/.vifm-Trash,$XDG_DATA_HOME/vifm/Trash" - List of trash directory path specifications, separated with - commas. Each list item either defines an absolute path to trash - directory or a path relative to a mount point root when list - element starts with "%r/". Value of the option can contain - environment variables (of form "$envname"), which will be - expanded (prepend $ with a slash to prevent expansion). - Environment variables are expanded when the option is set. - - On *nix, if element ends with "%u", the mark is replaced with - real user ID and permissions are set so that only that only - owner is able to use it. - Note that even this setup is not completely secure when combined - with "%r/" and it's overall safer to keep files in home - directory, but that implies cost of copying files between - partitions. - - When new file gets cut (deleted) vifm traverses each element of - the option in the order of their appearance and uses first trash - directory that it was able to create or that is already - writable. - - Default value tries to use trash directory per mount point and - falls back to ~/.vifm/Trash on failure. - - Will attempt to create the directory if it does not exist. See - "Trash directory" section below. - - 'tuioptions' 'to' - type: charset - default: "psv" - Each flag configures some aspect of TUI appearance. The flags - are: - p - when included: - * file list inside a pane gets additional single character - padding on left and right sides; - * quick view and view mode get single character padding. - s - when included, left and right borders (side borders, hence - "s" character) are visible. - u - use Unicode characters in the TUI (Unicode ellipsis instead - of "..."). - v - vary width of middle border to equalize view sizes. - - Each pane title contains the path of the listed directory. If - too large, the path is truncated on the left for the active pane - and on the right for the other pane. This can be modified with: - - l - truncation is always on the left. - r - truncation is always on the right. - - 'undolevels' 'ul' - type: integer - default: 100 - Maximum number of changes that can be undone. Note that here - single file operation is used as a unit, not operation, i.e. - deletion of 101 files will exceed default limit. - - 'vicmd' - type: string - default: "vim" - Command used to edit files in various contexts. Ampersand sign - at the end (regardless whether it's preceded by space or not) - means backgrounding of command. - - Background flag is ignored in certain context where vifm waits - for the editor to finish. Such contexts include any command - that spawns editor to change list of file names or a command, - with :rename being one example. `-f` is also appended to - prevent forking in such cases, so the command needs to handle - the flag. - - Additionally `+{num}` and `+'call cursor()'` arguments are used - to position cursor when location is known. - - 'viewcolumns' - type: string - default: "" - scope: local - Format string containing list of columns in the view. When this - option is empty, view columns to show are chosen automatically - using sorting keys (see 'sort') as a base. Value of this option - is ignored if 'lsview' is set. See "Column view" section below - for format description. - - An example of setting the options for both panes (note :windo - command): - - windo set viewcolumns=-{name}..,6{size},11{perms} - - 'vixcmd' - type: string - default: value of 'vicmd' - Same as 'vicmd', but takes precedence over it when running - inside a graphical environment. - - 'vifminfo' - type: set - default: bookmarks,bmarks - Controls what will be saved in the $VIFM/vifminfo file. - - bmarks - named bookmarks (see :bmark command) - bookmarks - marks, except special ones like '< and '> - tui - state of the user interface (sorting, number of - windows, quick - view state, active view) - dhistory - directory history - state - file name and dot filters and terminal - multiplexers integration - state - cs - primary color scheme - savedirs - save last visited directory - chistory - command line history - shistory - search history (/ and ? commands) - phistory - prompt history - fhistory - history of local filter (see description of the - "=" normal mode - command) - dirstack - directory stack overwrites previous stack, unless - stack of - current instance is empty - registers - registers content - tabs - global or pane tabs - options - all options that can be set with the :set command - (obsolete) - filetypes - associated programs and viewers (obsolete) - commands - user defined commands (see :command description) - (obsolete) - - 'vimhelp' - type: boolean - default: false - Use vim help format. - - 'wildmenu' 'wmnu' - type: boolean - default: false - Controls whether possible matches of completion will be shown - above the command line. - - 'wildstyle' - type: enumeration - default: bar - Picks presentation style of wild menu. Possible values: - - bar - one-line with left-to-right cursor - - popup - multi-line with top-to-bottom cursor - - 'wordchars' - type: string list - default: "1-8,14-31,33-255" (that is all non-whitespace - characters) - Specifies which characters in command-line mode should be - considered as part of a word. Value of the option is comma- - separated list of ranges. If both endpoints of a range match, - single endpoint is enough (e.g. "a" = "a-a"). Both endpoints - are inclusive. There are two accepted forms: character - representing itself or number encoding character according to - ASCII table. In case of ambiguous characters (dash, comma, - digit) use numeric form. Accepted characters are in the range - from 0 to 255. Any Unicode character with code greater than 255 - is considered to be part of a word. - - The option affects Alt-D, Alt-B and Alt-F, but not Ctrl-W. This - is intentionally to allow two use cases: - - - Moving by WORDS and deletion by words. - - Moving by words and deletion by WORDS. - - To get the latter use the following mapping: - - cnoremap - - Also used for abbreviations. - - 'wrap' type: boolean - default: true - Controls whether to wrap text in quick view. - - 'wrapscan' 'ws' - type: boolean - default: true - Searches wrap around end of the list. - -Mappings - Map arguments - - LHS of mappings can be preceded by arguments which take the form of - special sequences: - - - Postpone UI updates until RHS is completely processed. - - In case of builtin mapping causing conflict for a user-defined - mapping (e.g., `t` builtin to a partially typed `ta` user- - defined mapping), ignore the builtin mapping and wait for input - indefinitely as opposed to default behaviour of triggering the - builtin mapping after a delay defined by 'timeoutlen'. Example: - - nnoremap tw :set wrap! - nnoremap tn :set number! - nnoremap tr :set relativenumber! - - Special sequences - - Since it's not easy to enter special characters there are several - special sequences that can be used in place of them. They are: - - Enter key. - - Escape key. - - - Space key. - - Less-than character (<). - - provides a way to disable a mapping (by mapping it to ). - - Backspace key (see key conflict description below). - - - Tabulation and Shift+Tabulation keys. - - - Home/End. - - - Arrow keys. - - - PageUp/PageDown. - - - Delete key. and mean different codes, but - is more common. - - - Insert key. - - ,,...,,,,,, - Control + some key (see key conflict description below). - - only for *nix - Control + Space. - - ,,..., - ,,..., Alt + some key. - - ,,..., - ,,..., only for *nix - Alt + Ctrl + some key. - - - - Functional keys. - - - - only for MS-Windows - functional keys with Control key pressed. - - - - only for MS-Windows - functional keys with Alt key pressed. - - - - only for MS-Windows - functional keys with Shift key pressed. - - Note that due to the way terminals process their input, several - keyboard keys might be mapped to single key code, for example: - - - and ; - - - and ; - - - and ; - - - etc. - - Most of the time they are defined consistently and don't cause - surprises, but and are treated differently in different - environments (although they match each other all the time), that's why - they correspond to different keys in vifm. As a consequence, if you - map or be sure to repeat the mapping with the other one so - that it works in all environments. Alternatively, provide your mapping - in one form and add one of the following: - - " if mappings with in the LHS work - map - " if mappings with in the LHS work - map - - Whitespace - - vifm removes whitespace characters at the beginning and end of - commands. That's why you may want to use at the end of rhs in - mappings. For example: - - cmap man - - will put "man " in line when you hit the key in the command line - mode. - -Expression syntax - Supported expressions is a subset of what VimL provides. - - Expression syntax summary, from least to most significant: - - expr1 expr2 - expr2 || expr2 .. logical OR - - expr2 expr3 - expr3 && expr3 .. logical AND - - expr3 expr4 - expr4 == expr4 equal - expr4 != expr4 not equal - expr4 > expr4 greater than - expr4 >= expr4 greater than or equal - expr4 < expr4 smaller than - expr4 <= expr4 smaller than or equal - - expr4 expr5 - expr5 + expr5 .. number addition - expr5 - expr5 .. number subtraction - - expr5 expr6 - expr6 . expr6 .. string concatenation - - expr6 expr7 - - expr6 unary minus - + expr6 unary plus - ! expr6 logical NOT - - expr7 number number constant - "string" string constant, \ is special - 'string' string constant, ' is doubled - &option option value - $VAR environment variable - v:var builtin variable - function(expr1, ...) function call - (expr1) nested expression - - ".." indicates that the operations in this level can be concatenated. - - expr1 - ----- - expr2 || expr2 - - Arguments are converted to numbers before evaluation. - - Result is non-zero if at least one of arguments is non-zero. - - It's right associative and with short-circuiting, so sub-expressions - are evaluated from left to right until result of whole expression is - determined (i.e., until first non-zero) or end of the expression. - - expr2 - ----- - expr3 && expr3 - - Arguments are converted to numbers before evaluation. - - Result is non-zero only if both arguments are non-zero. - - It's right associative and with short-circuiting, so sub-expressions - are evaluated from left to right until result of whole expression is - determined (i.e., until first zero) or end of the expression. - - expr3 - ----- - expr4 {cmp} expr4 - - Compare two expr4 expressions, resulting in a 0 if it evaluates to - false or 1 if it evaluates to true. - - equal == - not equal != - greater than > - greater than or equal >= - smaller than < - smaller than or equal <= - - Examples: - - 'a' == 'a' == 1 - 'a' > 'b' == 1 - 'a' == 'b' == 0 - '2' > 'b' == 0 - 2 > 'b' == 1 - 2 > '1b' == 1 - 2 > '9b' == 0 - -1 == -'1' == 1 - 0 == '--1' == 1 - - expr4 - ----- - expr5 + expr5 .. number addition expr5 - expr5 .. number - subtraction - - Examples: - - 1 + 3 - 3 == 1 - 1 + '2' == 3 - - expr5 - ----- - expr6 . expr6 .. string concatenation - - Examples: - - 'a' . 'b' == 'ab' - 'aaa' . '' . 'c' == 'aaac' - - expr6 - ----- - - - expr6 unary minus - + expr6 unary plus - ! expr6 logical NOT - - For '-' the sign of the number is changed. - For '+' the number is unchanged. - For '!' non-zero becomes zero, zero becomes one. - - A String will be converted to a Number first. - - These operations can be repeated and mixed. Examples: - - --9 == 9 - ---9 == -9 - -+9 == 9 - !-9 == 0 - !'' == 1 - !'x' == 0 - !!9 == 1 - - expr7 - ----- - - number number constant - ----- - - Decimal number. Examples: - - 0 == 0 - 0000 == 0 - 01 == 1 - 123 == 123 - 10000 == 10000 - - string - ------ - "string" string constant - - Note that double quotes are used. - - A string constant accepts these special characters: - \b backspace - \e escape - \n newline - \r return - \t tab - \\ backslash - \" double quote - - Examples: - - "\"Hello,\tWorld!\"" - "Hi,\nthere!" - - literal-string - -------------- - 'string' string constant - - Note that single quotes are used. - - This string is taken as it is. No backslashes are removed or have a - special meaning. The only exception is that two quotes stand for one - quote. - - Examples: - - 'All\slashes\are\saved.' - 'This string contains doubled single quotes ''here''' - - option - ------ - &option option value (local one is preferred, if exists) - &g:option global option value &l:option local - option value - - Examples: - - echo 'Terminal size: '.&columns.'x'.&lines - if &columns > 100 - - Any valid option name can be used here (note that "all" in ":set all" - is a pseudo option). See ":set options" section above. - - environment variable - -------------------- - $VAR environment variable - - The String value of any environment variable. When it is not defined, - the result is an empty string. - - Examples: - - 'This is my $PATH env: ' . $PATH - 'vifmrc at ' . $MYVIFMRC . ' is used.' - - builtin variable - -------------------- - v:var builtin variable - - Information exposed by vifm for use in scripting. - - v:count - count passed to : command, 0 by default. Can be used in mappings to - passthe count to a different command. - v:count1 - same as v:count, but 1 by default. - v:jobcount - number of active jobs (as can be seen in the :jobs menu). - v:session - name of the current session or empty string. - v:servername - See below. - - function call - ------------- - function(expr1, ...) function call - - See "Functions" section below. - - Examples: - - "'" . filetype('.') . "'" - filetype('.') == 'reg' - - expression nesting - ------------------ - (expr1) nested expression - - Groups any other expression of arbitrary complexity enforcing order in - which operators are applied. - - -Functions - USAGE RESULT DESCRIPTION - - chooseopt({opt}) String Queries choose parameters passed on - startup. - executable({expr}) Integer Checks whether {expr} command - available. - expand({expr}) String Expands special keywords in {expr}. - extcached({cache}, {path}, {extcmd}) - String Caches output of {extcmd} per {cache} - and - {path} combination. - filetype({fnum} [, {resolve}]) - String Returns file type from position. - fnameescape({expr}) String Escapes {expr} for use in a :command. - getpanetype() String Returns type of current pane. - has({property}) Integer Checks whether instance has - {property}. - layoutis({type}) Integer Checks whether layout is of type - {type}. - paneisat({loc}) Integer Checks whether current pane is at - {loc}. - system({command}) String Executes shell command and returns - its output. - tabpagenr([{arg}]) Integer Returns number of current or last - tab. - term({command}) String Like system(), but for interactive - commands. - - chooseopt({opt}) - - Retrieves values of options related to file choosing. {opt} can be one - of: - files returns argument of --choose-files or empty string - dir returns argument of --choose-dir or empty string - cmd returns argument of --on-choose or empty string - delimiter returns argument of --delimiter or the default one (\n) - - executable({expr}) - - If {expr} is absolute or relative path, checks whether path destination - exists and refers to an executable, otherwise checks whether command - named {expr} is present in directories listed in $PATH. Checks for - various executable extensions on Windows. Returns boolean value - describing result of the check. - - Example: - - " use custom default viewer script if it's available and installed - " in predefined system directory, otherwise try to find it elsewhere - if executable('/usr/local/bin/defviewer') - fileview * /usr/local/bin/defviewer %c - else - if executable('defviewer') - fileview * defviewer %c - endif - endif - - expand({expr}) - - Expands environment variables and macros in {expr} just like it's done - for command-line commands. Returns a string. See "Command macros" - section above. - - Examples: - - " percent sign - :echo expand('%%') - " the last part of directory name of the other pane - :echo expand('%D:t') - " $PATH environment variable (same as `:echo $PATH`) - :echo expand('$PATH') - - extcached({cache}, {path}, {extcmd}) - - Caches value of {extcmd} external command automatically updating it as - necessary based on monitoring change date of a {path}. The cache is - invalidated when file or its meta-data is updated. A single path can - have multiple caches associated with it. - - {path} value is normalized, but symbolic links in it aren't resolved. - - Example: - - " display number and size of blocks actually used by a file or directory - set statusline+=" Uses: %{ extcached('uses', - expand('%c'), - expand('stat --format=%%bx%%B %c')) }" - - filetype({fnum} [, {resolve}]) - - The result is a string, which represents file type and is one of the - list: - exe executables - reg regular files - link symbolic links - broken broken symbolic links (appears only when resolving) - dir directories - char character devices - block block devices - fifo pipes - sock *nix domain sockets - ? unknown file type (should not normally happen) or - non-file (pseudo-entries in compare view) - - The result can also be an empty string in case of invalid argument. - - Parameter {fnum} can have following values: - - '.' to get type of file under the cursor in the active pane - - numerical value base 1 to get type of file on specified line - number - - Optional parameter {resolve} is treated as a boolean and specifies - whether symbolic links should be resolved. - - fnameescape({expr}) - - Escapes parameter to make it suitable for use as an argument of a - :command. List of escaped characters includes %, which is doubled. - - Usage example: - - " navigate to most recently modified file in current directory - execute 'goto' fnameescape(system('ls -t | head -1')) - - getpanetype() - - Retrieves string describing type of current pane. Possible return - values: - regular regular file listing of some directory - custom custom file list (%u) - very-custom very custom file list (%U) - tree tree view - - has({property}) - - Allows examining internal parameters from scripts to e.g. figure out - environment in which application is running. Returns 1 if property is - true/present, otherwise 0 is returned. Currently the following - properties are supported (anything else will yield 0): - unix runs in *nix-like environment (including Cygwin) - win runs on Windows - - Usage example: - - " skip user/group on Windows - if !has('win') - let $RIGHTS = '%10u:%-7g ' - endif - - execute 'set' 'statusline=" %t%= %A '.$RIGHTS.'%15E %20d "' - - layoutis({type}) - - Checks whether current interface layout is {type} or not, where {type} - can be: - only single-pane mode - split double-pane mode (either vertical or horizontal split) - vsplit vertical split (left and right panes) - hsplit horizontal split (top and bottom panes) - - Usage example: - - " automatically split vertically before enabling preview - :nnoremap w :if layoutis('only') | vsplit | endif | view! - - paneisat({loc}) - - Checks whether position of active pane in current layout matches one of - the following locations: - top pane reaches top border - bottom pane reaches bottom border - left pane reaches left border - right pane reaches right border - - system({command}) - - Runs the command in shell and returns its output (joined standard - output and standard error streams). All trailing newline characters - are stripped to allow easy appending to command output. Ctrl-C should - interrupt the command. - - Use this function to consume output of external commands that don't - require user interaction and term() for interactive commands that make - use of terminal and are capable of handling stream redirection. - - Usage example: - - " command to enter .git/ directory of git-repository (when ran inside one) - command! cdgit :execute 'cd' fnameescape(system('git rev-parse --git-dir')) - - tabpagenr([{arg}]) - - When called without arguments returns number of current tab page base - one. - - When called with "$" as an argument returns number of the last tab page - base one, which is the same as number of tabs. - - term({command}) - - Same as system() function, but user interface is shutdown during the - execution of the command, which makes sure that external interactive - applications won't affect the way terminal is used by vifm. - - Usage example: - - " command to change directory by picking it via fzf - command! fzfcd :execute 'cd' - fnameescape(term('find -type d | fzf 2> /dev/tty')) - -Menus and dialogs - When navigating to some path from a menu there is a difference in end - location depending on whether path has trailing slash or not. Files - normally don't have trailing slashes so "file/" won't work and one can - only navigate to a file anyway. On the other hand with directories - there are two options: navigate to a directory or inside of it. To - allow both use cases, the first one is used on paths like "dir" and the - second one for "dir/". - - Commands - - :range navigate to a menu line. - - :exi[t][!] :q[uit][!] :x[it][!] - leave menu mode. - - :noh[lsearch] - reset search match highlighting. - - :w[rite] {dest} - write all menu lines into file specified by {dest}. - - General - - j, Ctrl-N - move down. - k, Ctrl-P - move up. - Enter, l - select and exit the menu. - Ctrl-L - redraw the menu. - - Escape, Ctrl-C, ZZ, ZQ, q - quit. - - In all menus - - The following set of keys has the same meaning as in normal mode. - - Ctrl-B, Ctrl-F - Ctrl-D, Ctrl-U - Ctrl-E, Ctrl-Y - /, ? - n, N - [count]G, [count]gg - H, M, L - zb, zt, zz - - zh - scroll menu items [count] characters to the right. - zl - scroll menu items [count] characters to the left. - zH - scroll menu items half of screen width characters to the right. - zL - scroll menu items half of screen width characters to the left. - - : - enter command line mode for menus (currently only :exi[t], :q[uit], - :x[it] and :{range} are supported). - - b - interpret content of the menu as list of paths and use it to create - custom view in place of previously active pane. See "Custom views" - section below. - B - same as above, but creates unsorted view. - - v - load menu content into quickfix list of the editor (Vim compatible - by assumption) or if list doesn't have separators after file names - (colons) open each line as a file name. - - - Below is description of additional commands and reaction on selection - in some menus and dialogs. - - Apropos menu - - Selecting menu item runs man on a given topic. Menu won't be closed - automatically to allow view several pages one by one. - - Command-line mode abbreviations menu - - Type dd on an abbreviation to remove it. - - c leaves menu preserving file selection and inserts right-hand side of - selected command into command-line. - - Color scheme menu - - Selecting name of a color scheme applies it the same way as if - ":colorscheme " was executed on the command-line. - - Commands menu - - Selecting command executes it with empty arguments (%a). - - dd on a command to remove. - - Marks menu - - Selecting mark navigates to it. - - dd on a mark to remove it. - - Bookmarks menu - - Selecting a bookmark navigates to it. - - Type dd on a bookmark to remove it. - - gf and e also work to make it more convenient to bookmark files. - - Trash (:lstrash) menu - - r on a file name to restore it from trash. - - dd deletes file under the cursor. - - Trashes (:trashes) menu - - dd empties selected trash in background. - - Directory history and Trashes menus - - Selecting directory name will change directory of the current view as - if :cd command was used. - - Directory stack menu - - Selecting directory name will rotate stack to put selected directory - pair at the top of the stack. - - File (:file) menu - - Commands from vifmrc or typed in command-line are displayed above empty - line. All commands below empty line are from .desktop files. - - c leaves menu preserving file selection and inserts command after :! in - command-line mode. - - Grep, find, locate, bookmarks and user menu with navigation (%M macro) - - gf - navigate previously active view to currently selected item. - Leaves menu mode except for grep menu. Pressing Enter key has the same - effect. - - e - open selected path in the editor, stays in menu mode. - - c - leave menu preserving file selection and insert file name after :! - in command-line mode. - - User menu without navigation (%m macro) - - c leaves menu preserving file selection and inserts whole line after :! - in command-line mode. - - Grep menu - - Selecting file (via Enter or l key) opens it in editor set by 'vicmd' - at given line number. Menu won't be closed automatically to allow - viewing more than one result. - - See above for "gf" and "e" keys description. - - Command-line history menu - - Selecting an item executes it as command-line command, search query or - local filter. - - c leaves menu preserving file selection and inserts line into command- - line of appropriate kind. - - Volumes menu - - Selecting a drive navigates previously active pane to the root of that - drive. - - Fileinfo dialog - - Enter, q - close dialog - - Sort dialog - - h, Space - switch ascending/descending. - q - close dialog - - One shortcut per sorting key (see the dialog). - - Attributes (permissions or properties) dialog - - h, Space - check/uncheck. - q - close dialog - r - (*nix only) (un)set all read bits - w - (*nix only) (un)set all write bits - x - (*nix only) (un)set all execute bits - s - (*nix only) (un)set all special (SetUID, SetGID, Sticky) bits - e - (*nix only) (un)set recursion (for directories only) - - Item states: - - - * - checked flag. - - - X - means that it has different value for files in selection. - - - d (*nix only) - (only for execute flags) means u-x+X, g-x+X or o-x+X - argument for the chmod program. If you're not on OS X and want to - remove execute permission bit from all files, but preserve it for - directories, set all execute flags to 'd' and check 'Set Recursively' - flag. - - Jobs menu - - dd requests cancellation of job under cursor. The job won't be removed - from the list, but marked as being cancelled (if cancellation was - successfully requested). A message will pop up if the job has already - stopped. Note that on Windows cancelling external programs like this - might not work, because their parent shell doesn't have any windows. - - e key displays errors of selected job if any were collected. They are - displayed in a new menu, but you can get back to jobs menu by pressing - h. - - - Undolist menu - - r - reset undo position to group under the cursor. - - - Media menu - - Selecting a device either mounts (if it wasn't mounted yet) or - navigates to its first mount point. - - Selecting a mount point navigates to it. - - Selecting "not mounted" line causes mounting. - - Selecting any other line does nothing. - - r - reload the list. - - m - mount/unmount device (cursor should be positioned on lines under - device information). - - [ - put cursor on the previous device. - - ] - put cursor on the next device. - - - Plugins menu - - e - display log messages of selected plugin if any were collected. - They are displayed in a new menu, but you can get back to plugins menu - by pressing h. - - gf - navigate previously active view to the location of selected - plugin. Leaves menu mode. - - -Custom views - Definition - - Normally file views contain list of files from a single directory, but - sometimes it's useful to populate them with list of files that do not - belong to the same directory, which is what custom views are for. - - Presentation - - Custom views are still related to directory they were in before custom - list was loaded. Path to that directory (original directory) can be - seen in the title of a custom view. - - Files in same directory have to be named differently, this doesn't hold - for custom views thus seeing just file names might be rather confusing. - In order to give an idea where files come from and when possible, - relative paths to original directory of the view is displayed, - otherwise full path is used instead. - - Custom views normally don't contain any inexistent files. - - Navigation - - Custom views have some differences related to navigation in regular - views. - - gf - acts similar to gf on symbolic links and navigates to the file at - its real - location. - - h - go to closes parent node in tree view, otherwise return to the - original directory. - - gh - return to the original directory. - - Opening ".." entry also causes return to the original directory. - - History - - Custom list exists only while it's visible, once left one can't return - to it, so there is no appearances of it in any history. - - Filters - - Only local filter affects content of the view. This is intentional, - presumably if one loads list, precisely that list should be displayed - (except for inexistent paths, which are ignored). - - Search - - Although directory names are visible in listing, they are not - searchable. Only file names are taken into account (might be changed - in future, searching whole lines seems quite reasonable). - - Sorting - - Contrary to search sorting by name works on whole visible part of file - path. - - Highlight - - Whole file name is highlighted as one entity, even if there are - directory elements. - - Updates - - Reloads can occur, though they are not automatic due to files being - scattered among different places. On a reload, inexistent files are - removed and meta-data of all other files is updated. - - Once custom view forgets about the file, it won't add it back even if - it's created again. So not seeing file previously affected by an - operation, which was undone is normal. - - Operations - - All operations that add files are forbidden for custom views. For - example, moving/copying/putting files into a custom view doesn't work, - because it doesn't make much sense. - - On the other hand, operations that use files of a custom view as a - source (e.g. yanking, copying, moving file from custom view, deletion) - and operations that modify names are all allowed. - -Compare views - Kinds - - :compare can produce four different results depending on arguments: - - single compare view (ofone and either listall or listdups); - - single custom view (ofone and listunique); - - two compare views (ofboth and either listall or listdups); - - two custom views (ofboth and listunique). - - The first two display files of one file system tree. Here duplicates - are files that have at least one copy in the same tree. The other two - kinds of operation compare two trees, in which duplicates are files - that are found in both trees. - - Lists of unique files are presented in custom views because there is no - file grouping to preserve as all file ids are guaranteed to be - distinct. - - Creation - - Arguments passed to :compare form four categories each with its own - prefix and is responsible for particular property of operation. - - Which files to compare: - - ofboth - compares files of two panes against each other; - - ofone - compares files of the same directory. - - How files are compared: - - byname - by their name only; - - bysize - only by their size; - - bycontents - by data they contain (combination of size and hash of - small chunk of contents is used as first approximation, so don't worry - too much about large files). - - Which files to display: - - listall - all files; - - listunique - unique files only; - - listdups - only duplicated files. - - How results are grouped (has no effect if "ofone" specified): - - groupids - files considered identical are always adjacent in - output; - - grouppaths - file system ordering is preferred (this also enables - displaying identically named files as mismatches). - - Which files to omit: - - skipempty - ignore empty files. - - Each argument can appear multiple times, the rightmost one of the group - is considered. Arguments alter default behaviour instead of - substituting it. - - Examples - - The defaults corresponds to probably the most common use case of - comparing files in two trees with grouping by paths, so the following - are equivalent: - - :compare - :compare bycontents grouppaths - :compare bycontents listall ofboth grouppaths - - Another use case is to find duplicates in the current sub-tree: - - :compare listdups ofone - - The following command lists files that are unique to each pane: - - :compare listunique - - Look - - The view can't switch to ls-like view as it's unable to display diff- - like data. - - Comparison views have second column displaying id of the file, files - with same id are considered to be equal. The view columns - configuration is predefined. - - Behaviour - - When two views are being compared against each other the following - changes to the regular behaviour apply: - - views are scrolled synchronously (as if 'scrollbind' was set); - - views' cursors are synchronized; - - local filtering is disabled (its results wouldn't be meaningful); - - zd excludes groups of adjacent identical files, 1zd gives usual - behaviour; - - sorting is permanently disabled (ordering is fixed); - - removed files hide their counter pairs; - - exiting one of the views terminates the other immediately; - - renaming files isn't blocked, but isn't taken into account and might - require regeneration of comparison; - - entries which indicate absence of equivalent file have empty names - and can be matched as such; - - when unique files of both views are listed custom views can be - empty, this absence of unique files is stated clearly. - - One compare view has similar properties (those that are applicable for - single pane). - - Files are gathered in this way: - - recursively starting at current location of the view; - - dot files are excluded if view hides them at the moment of - comparison, file name filters are obeyed as well so you end up - comparing what you see; - - directories are not taken into account; - - symbolic links to directories are ignored. - -Startup - On startup vifm determines several variables that are used during - execution. They are determined in the order they appear below. - - On *nix systems $HOME is normally present and used as is. On Windows - systems vifm tries to find correct home directory in the following - order: - - $HOME variable; - - $USERPROFILE variable (on Windows only); - - a combination of $HOMEDRIVE and $HOMEPATH variables (on Windows - only). - - vifm tries to find correct configuration directory by checking the - following places: - - $VIFM variable; - - parent directory of the executable file (on Windows only); - - $HOME/.vifm directory; - - $APPDATA/Vifm directory (on Windows only); - - $XDG_CONFIG_HOME/vifm directory; - - $HOME/.config/vifm directory. - - vifm tries to find correct configuration file by checking the following - places: - - $MYVIFMRC variable; - - vifmrc in parent directory of the executable file (on Windows only); - - $VIFM/vifmrc file. - -Configure - See "Startup" section above for the explanations on $VIFM and - $MYVIFMRC. - - The vifmrc file contains commands that will be executed on vifm - startup. There are two such files: global and local. Global one is at - {prefix}/etc/vifm/vifmrc, see $MYVIFMRC variable description for the - search algorithm used to find local vifmrc. Global vifmrc is loaded - before the local one, so that the later one can redefine anything - configured globally. - - Use vifmrc to set settings, mappings, filetypes etc. To use multi line - commands precede each next line with a slash (whitespace before slash - is ignored, but all spaces at the end of the lines are saved). For - example: - - set - \smartcase - - equals "setsmartcase". When - - set - \ smartcase - - equals "set smartcase". - - The $VIFM/vifminfo file contains generic state of the application. You - can control what is stored in vifminfo by setting 'vifminfo' option. - Vifm always writes this file on exit unless 'vifminfo' option is empty. - Marks, bookmarks, commands, histories, filetypes, fileviewers and - registers in the file are merged with vifm configuration (which has - bigger priority). - - Generally, runtime configuration has bigger priority during merging, - but there are some exceptions: - - - directory stack stored in the file is not overwritten unless - something is changed in vifm instance that performs merge; - - - each mark or bookmark is marked with a timestamp, so that newer - value is not overwritten by older one, thus no matter from where it - comes, the newer one wins; - - - all histories are marked with timestamps on storing, this means - that last instance to quit puts its elements on top of the list; - - - tabs are merged only if both current instance and stored state - contain exactly one tab of any kind. - - The $VIFM/scripts directory can contain shell scripts. vifm modifies - its PATH environment variable to let user run those scripts without - specifying full path. All subdirectories of the $VIFM/scripts will be - added to PATH too. Script in a subdirectory overlaps script with the - same name in all its parent directories. - - The $VIFM/colors/ and {prefix}/etc/vifm/colors/ directories contain - color schemes. Available color schemes are searched in that order, so - on name conflict the one in $VIFM/colors/ wins. - - Each color scheme should have ".vifm" extension. This wasn't the case - before and for this reason the following rules apply during lookup: - - - if there is no file with .vifm extension, all regular files are - listed; - - - otherwise only files with .vifm extension are listed (with the - extension being truncated). - -Sessions - Sessions provide a way to have multiple persistent runtime - configurations. Think of them as second-level vifminfo files in - addition to the first-level one used by all sessions. In other words, - they aren't a replacement for vifminfo file that exists without - sessions, but an addition to it. One can empty 'vifminfo' option and - rely solely on sessions, but in practice one might want to share some - state among instances in different sessions or have an "out-of- - sessions" state for tasks that don't deserve a session of their own. - - This leads to a two-level structure where data in session files has - higher priority than data in vifminfo files (where this makes sense) - following the same rules that merging of vifminfo file obeys. In - addition to that, history items from session files are never ordered - before history items from vifminfo file. - - Format - - Sessions have the format of vifminfo files, they do not consist of - sequence of command-line commands and are not meant to be sourced via - :source command. - - Storage and naming - - `$VIFM/sessions/` directory serves as a storage for sessions. - Consequently names should be valid filenames. The structure of the - storage is flat meaning that there are no subdirectories, that's why - names of sessions can't contain slashes. - - Usage model - - Contrary to Vim, vifm automates basic management of sessions. You can - start, switch, stop or delete a session using builtin means. - - Current session is saved at the same time vifminfo is saved (on normal - exits or explicitly on :write command) and right before switching to - another session. To avoid saving in those cases use :session command - to detach (without saving) from a session before proceeding. - - Related topics - - Commands: :session, :delsession - Options: 'sessionoptions' - Variables: v:session - -Automatic FUSE mounts - vifm has a builtin support of automated FUSE file system mounts. It is - implemented using file associations mechanism. To enable automated - mounts, one needs to use a specially formatted program line in filetype - or filextype commands. These use special macros, which differ from - macros in commands unrelated to FUSE. Currently three formats are - supported: - - 1) FUSE_MOUNT This format should be used in case when all information - needed for mounting all files of a particular type is the same. E.g. - mounting of tar files don't require any file specific options. - - Format line: - FUSE_MOUNT|mounter %SOURCE_FILE %DESTINATION_DIR [%FOREGROUND] - - Example filetype command: - - :filetype FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR - - 2) FUSE_MOUNT2 This format allows one to use specially formatted files - to perform mounting and is useful for mounting remotes, for example - remote file systems over ftp or ssh. - - Format line: - FUSE_MOUNT2|mounter %PARAM %DESTINATION_DIR [%FOREGROUND] - - Example filetype command: - - :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR - - Example file content: - - root@127.0.0.1:/ - - 3) FUSE_MOUNT3 - - This format is equivalent to FUSE_MOUNT, but omits unmounting. It is - useful for cases, when unmounting isn't needed, like when using AVFS. - - Example :filetype command: - - :filetype *.tar,*.tar.bz2,*.tbz2,*.tgz,*.tar.gz,*.tar.xz,*.txz,*.deb - \ {Mount with avfs} - \ FUSE_MOUNT3|mount-avfs %DESTINATION_DIR %SOURCE_FILE - - Example `mount-avfs` helper script: - - #!/bin/sh - - dest=$1 - file=$2 - - rmdir "$dest" - ln -s "$HOME/.avfs$file#/" "$dest" - - All % macros are expanded by vifm at runtime and have the following - meaning: - - %SOURCE_FILE is replaced by full path to selected file; - - %DESTINATION_DIR is replaced by full path to mount directory, which - is created by vifm basing on the value of 'fusehome' option; - - %PARAM value is filled from the first line of file (whole line), - though in the future it can be changed to whole file content; - - %FOREGROUND means that you want to run mount command as a regular - command (required to be able to provide input for communication with - mounter in interactive way). - - %FOREGROUND is an optional macro. Other macros are not mandatory, but - mount commands likely won't work without them. - - %CLEAR is obsolete name of %FOREGROUND, which is still supported, but - might be removed in future. Its use is discouraged. - - Unlike macros elsewhere, these are recognized only if they appear at - the end of a command or are followed by a space. There is no way to - escape % either. These are historical limitations, which might be - addressed in the future. - - The mounted FUSE file systems will be automatically unmounted in two - cases: - - - when vifm quits (with ZZ, :q, etc. or when killed by signal); - - - when you explicitly leave mount point going up to its parent - directory (with h, Enter on "../" or ":cd ..") and other pane is - not in the same directory or its child directories. - -View look - vifm supports displaying of file list view in two different ways: - - - in a table mode, when multiple columns can be set using - 'viewcolumns' option (see "Column view" section below for details); - - - in a multicolumn list manner which looks almost like `ls -x` - command output (see "ls-like view" section below for details). - - The look is local for each view and can be chosen by changing value of - the 'lsview' boolean option. - - Depending on view look some of keys change their meaning to allow more - natural cursor moving. This concerns mainly h, j, k, l and other - similar navigation keys. - - Also some of options can be ignored if they don't affect view - displaying in selected look. For example value of 'viewcolumns' when - 'lsview' is set. - -ls-like view - When this view look is enabled by setting 'lsview' option on, vifm will - display files in multiple columns. Number of columns depends on the - length of the longest file name present in current directory of the - view. Whole file list is automatically reflowed on directory change, - terminal or view resize. - - View looks close to output of `ls -x` command, so files are listed left - to right in rows. - - In this mode file manipulation commands (e.g. d) don't work line-wise - like they do in Vim, since such operations would be uncommon for file - manipulation tasks. Thus, for example, dd will remove only current - file. - - By default the view is filled by lines, 'lsoptions' can be used to get - filling by columns. - - Note that tree-view and compare view inhibit ls-like view. - -Column view - View columns are described by a comma-separated list of column - descriptions, each of which has the following format - [ '-' | '*' ] [ fw ( [ '.' tw ] | '%' ) ] '{' type | literal '}' - '.'{0,3} - where fw stands for full width, tw stands for text width, bar is - logical or, square brackets denote optional parts and curly braces - define range of repetitions for a symbol that precedes them. - - So it basically consists of four parts: - 1. Optional alignment specifier - 2. Optional width specifier - 3. Mandatory column name - 4. Optional cropping specifier - - Alignment specifier - - It's an optional minus or asterisk sign as the first symbol of the - string. - - Specifies type of text alignment within a column. Three types are - supported: - - - left align - - set viewcolumns=-{name} - - - right align (default) - - set viewcolumns={name} - - - dynamic align - - It's like left alignment, but when the text is bigger than the - column, the alignment is made at the right (so the part of the field - is always visible). - - set viewcolumns=*{name} - - Width specifier - - It's a number followed by a percent sign, two numbers (second one - should be less than or equal to the first one) separated with a dot or - a single number. - - Specifies column width and its units. There are three size types: - - - absolute size - column width is specified in characters - - set viewcolumns=-100{name},20.15{ext} - - results in two columns with lengths of 100 and 20 and a reserved - space of five characters on the left of second column. - - - relative (percent) size - column width is specified in percents of - view width - - set viewcolumns=-80%{name},15%{ext},5%{mtime} - - results in three columns with lengths of 80/100, 15/100 and 5/100 of - view width. - - - auto size (default) - column width is automatically determined - - set viewcolumns=-{name},{ext},{mtime} - - results in three columns with length of one third of view width. - There is no size adjustment to content, since it will slow down - rendering. - - Columns of different sizing types can be freely mixed in one view. - Though sometimes some of columns can be seen partly or be completely - invisible if there is not enough space to display them. - - Column contents - - This is usually a sorting key surrounded with curly braces, e.g. - - {name},{ext},{mtime} - - {name} and {iname} types are the same and present both for consistency - with 'sort' option. - - Following types don't have corresponding sorting keys: - - - {root} - display name without extension (as a complement for - {ext}) - - - {fileroot} - display name without extension for anything except for - directories and symbolic links to directories (as a complement for - {fileext}) - - Empty curly braces ({}) are replaced with the default secondary column - for primary sort key. So after the next command view will be displayed - almost as if 'viewcolumns' is empty, but adding ellipsis for long file - names: - - set viewcolumns=-{name}..,6{}. - - The last kind of column value is a string literal. The literal is used - as a column value for every row. The syntax is "{#literal}", for - example: - - 3{#},{#|},{# | } - - This can be used to draw column separators. Mind that for convenience - literals have different defaults: truncation and automatically - determined absolute size, which is what you usually want for them. - Example: - - set viewcolumns=*{name}..,{#|},6{}. - - Cropping specifier - - It's from one to three dots after closing curly brace in column format. - - Specifies type of text truncation if it doesn't fit in the column. - Currently three types are supported: - - - truncation - text is truncated - - set viewcolumns=-{name}. - - results in truncation of names that are too long too fit in the - view. - - - adding of ellipsis - ellipsis on the left or right are added when - needed - - set viewcolumns=-{name}.. - - results in that ellipsis are added at the end of too long file - names. - - - none (default) - text can pass column boundaries - - set viewcolumns=-{name}...,{ext} - - results in that long file names can partially be written on the ext - column. - -Color schemes - The color schemes in vifm can be applied in two different ways: - - - as the primary color scheme; - - - as local to a pane color scheme. - - Both types are set using :colorscheme command, but of different forms: - - - :colorscheme color_scheme_name - for the primary color scheme; - - - :colorscheme color_scheme_name directory - for local color schemes. - - Look of different parts of the TUI (Text User Interface) is determined - in this way: - - - Border, TabLine, TabLineSel, TopLineSel, TopLine, CmdLine, - ErrorMsg, StatusLine, JobLine, SuggestBox and WildMenu are always - determined by the primary color scheme; - - - CurrLine, Selected, Directory, Link, BrokenLink, Socket, Device, - Executable, Fifo, CmpMismatch, Win, AuxWin and OtherWin are - determined by primary color scheme and a set of local color - schemes, which can be empty. - - There might be a set of local color schemes because they are structured - hierarchically according to file system structure. For example, having - the following piece of file system: - - ~ - `-- bin - | - `-- my - - Two color schemes: - - # ~/.vifm/colors/for_bin - highlight Win cterm=none ctermfg=white ctermbg=red - highlight CurrLine cterm=none ctermfg=red ctermbg=black - - # ~/.vifm/colors/for_bin_my - highlight CurrLine cterm=none ctermfg=green ctermbg=black - - And these three commands in the vifmrc file: - - colorscheme Default - colorscheme for_bin ~/bin - colorscheme for_bin_my ~/bin/my - - File list will look in the following way for each level: - - - ~/ - Default color scheme - black background - cursor with blue background - - - ~/bin/ - mix of Default and for_bin color schemes - red background - cursor with black background and red foreground - - - ~/bin/my/ - mix of Default, for_bin and for_bin_my color schemes - red background - cursor with black background and green foreground - -Trash directory - vifm has support of trash directory, which is used as temporary storage - for deleted files or files that were cut. Using trash is controlled by - the 'trash' option, and exact path to the trash can be set with - 'trashdir' option. Trash directory in vifm differs from the system- - wide one by default, because of possible incompatibilities of storing - deleted files among different file managers. But one can set - 'trashdir' to "~/.local/share/Trash" to use a "standard" trash - directory. - - There are two scenarios of using trash in vifm: - - 1. As a place for storing files that were cut by "d" and may be - inserted to some other place in file system. - - 2. As a storage of files, that are deleted but not purged yet. - - The first scenario uses deletion ("d") operations to put files to trash - and put ("p") operations to restore files from trash directory. Note - that such operations move files to and from trash directory, which can - be long term operations in case of different partitions or remote - drives mounted locally. - - The second scenario uses deletion ("d") operations for moving files to - trash directory and :empty command-line command to purge all previously - deleted files. - - Deletion and put operations depend on registers, which can point to - files in trash directory. Normally, there are no nonexistent files in - registers, but vifm doesn't keep track of modifications under trash - directory, so one shouldn't expect value of registers to be absolutely - correct if trash directory was modified not by operation that are meant - for it. But this won't lead to any issues with operations, since they - ignore nonexistent files. - -Client-Server - vifm supports remote execution of command-line mode commands, remote - changing of directories and expression evaluation. This is possible - using --remote and --remote-expr command-line arguments. - - To execute a command remotely combine --remote argument with -c - or +. For example: - - vifm --remote -c 'cd /' - vifm --remote '+cd /' - - To change directory not using command-line mode commands one can - specify paths right after --remote argument, like this: - - vifm --remote / - vifm --remote ~ - vifm --remote /usr/bin /tmp - - Evaluating expression remotely might be useful to query information - about an instance, for example its location: - - vifm --remote-expr 'expand("%d")' - - If there are several running instances, the target can be specified - with --server-name option (otherwise, the first one lexicographically - is used): - - vifm --server-name work --remote ~/work/project - - List of names of running instances can be obtained via --server-list - option. Name of the current one is available via v:servername. - - - v:servername - server name of the running vifm instance. Empty if client- - server feature is disabled. - -External Renaming - When an editor is run to edit list of file names, contents of the - temporary file has the following format: - - 1. Order of lines correspond to the order of files in a view. - - 2. Lines that start with a "#" are comments and are ignored. - - 3. Single backslash at the beginning of a line is ignored, so that a - file starting with a backslash will appear like "\#name". - - If an operation was rejected due to issues with file names, next time - you'll see the following in this order: - - 1. Last error (in comments). - - 2. Original file names (in comments). - - 3. Failed list of new names. - - Mind that Vim plugin will extract list of original names and show them - in a vertical split. - - You can cancel renaming by removing all non-comments from the buffer. - This also erases information about previous edits. - -Plugin - Plugin for using vifm in vim as a file selector. - - Commands: - - :EditVifm select a file or files to open in the current buffer. - :Vifm alias for :EditVifm. - :SplitVifm split buffer and select a file or files to open. - :VsplitVifm vertically split buffer and select a file or files to - open. - :DiffVifm select a file or files to compare to the current file - with - :vert diffsplit. - :TabVifm select a file or files to open in tabs. - - Each command accepts up to two arguments: left pane directory and right - pane directory. After arguments are checked, vifm process is spawned - in a special "file-picker" mode. To pick files just open them either - by pressing l, i or Enter keys, or by running :edit command. If no - files are selected, file under the cursor is opened, otherwise whole - selection is passed to the plugin and opened in vim. - - The plugin have only two settings. It's a string variable named - g:vifm_term to let user specify command to run GUI terminal. By - default it's equal to 'xterm -e'. And another string variable named - g:vifm_exec, which equals "vifm" by default and specifies path to - vifm's executable. To pass arguments to vifm use g:vifm_exec_args, - which is empty by default. - - To use the plugin copy the vifm.vim file to either the system wide - vim/plugin directory or into ~/.vim/plugin. - - If you would prefer not to use the plugin and it is in the system wide - plugin directory add - - let loaded_vifm=1 - - to your ~/.vimrc file. - -Reserved - The following command names are reserved and shouldn't be used for user - commands. - - g[lobal] - v[global] - -ENVIRONMENT - VIFM Points to main configuration directory (usually ~/.vifm/). - - MYVIFMRC - Points to main configuration file (usually ~/.vifm/vifmrc). - - These environment variables are valid inside vifm and also can be used - to configure it by setting some of them before running vifm. - - When $MYVIFMRC isn't set, it's made as $VIFM/vifmrc (exception for - Windows: vifmrc in the same directory as vifm.exe has higher priority - than $VIFM/vifmrc). - - See "Startup" section above for more details. - - VIFM_FUSE_FILE - On execution of external commands this variable is set to the - full path of file used to initiate FUSE mount of the closest - mount point from current pane's directory up. It's not set when - outside FUSE mount point. When vifm is used inside terminal - multiplexer, it tries to set this variable as well (it doesn't - work this way on its own). - -SEE ALSO - vifm-convert-dircolors(1), vifm-pause(1) - - Website: https://vifm.info/ - Wiki: https://wiki.vifm.info/ - - Esperanto translation of the documentation by Sebastian Cyprych: - http://cyprych.neostrada.pl/tekstoj/komputiloj/vifm-help.eo.html - -AUTHOR - Vifm was written by ksteen - And currently is developed by xaizek - -vifm 0.12 September 29, 2021 VIFM(1) diff --git a/new-config/.config/vifm/vifmrc b/new-config/.config/vifm/vifmrc deleted file mode 100644 index ca5c53ffa..000000000 --- a/new-config/.config/vifm/vifmrc +++ /dev/null @@ -1,487 +0,0 @@ -" ____ __ -" / __ \_________ _/ /_____ -" / / / / ___/ __ `/ //_/ _ \ -" / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -" /_____/_/ \__,_/_/|_|\___/ My custom vifm config - -" vim: filetype=vifm : -" My config file for the vifm terminal file manager. -" ------------------------------------------------------------------------------ - -" This is the actual command used to start vi. The default is vim. -" If you would like to use emacs or emacsclient, you can use them. -" Since emacs is a GUI app and not a terminal app like vim, append the command -" with an ampersand (&). - -set vicmd=~/.local/bin/lvim - -" This makes vifm perform file operations on its own instead of relying on -" standard utilities like `cp`. While using `cp` and alike is a more universal -" solution, it's also much slower when processing large amounts of files and -" doesn't support progress measuring. - -set syscalls - -" Trash Directory -" The default is to move files that are deleted with dd or :d to -" the trash directory. If you change this you will not be able to move -" files by deleting them and then using p to put the file in the new location. -" I recommend not changing this until you are familiar with vifm. -" This probably shouldn't be an option. - -set trash - -" This is how many directories to store in the directory history. - -set history=100 - -" Automatically resolve symbolic links on l or Enter. - -set nofollowlinks - -" With this option turned on you can run partially entered commands with -" unambiguous beginning using :! (e.g. :!Te instead of :!Terminal or :!Te). - -" set fastrun - -" Natural sort of (version) numbers within text. - -set sortnumbers - -" Maximum number of changes that can be undone. - -set undolevels=100 - -" If you installed the vim.txt help file set vimhelp. -" If would rather use a plain text help file set novimhelp. - -set novimhelp - -" If you would like to run an executable file when you -" press return on the file name set this. - -set norunexec - -" Selected color scheme -" The following line will cause issues if using vifm.vim with regular vim. -" Either use neovim or comment out the following line. -colorscheme gruvbox-dark - -" Format for displaying time in file list. For example: -" TIME_STAMP_FORMAT=%m/%d-%H:%M -" See man date or man strftime for details. - -set timefmt=%m/%d\ %H:%M - -" Show list of matches on tab completion in command-line mode - -set wildmenu - -" Display completions in a form of popup with descriptions of the matches - -set wildstyle=popup - -" Display suggestions in normal, visual and view modes for keys, marks and -" registers (at most 5 files). In other view, when available. - -set suggestoptions=normal,visual,view,otherpane,keys,marks,registers - -" Ignore case in search patterns unless it contains at least one uppercase -" letter - -set ignorecase -set smartcase - -" Don't highlight search results automatically - -set nohlsearch - -" Use increment searching (search while typing) -set incsearch - -" Try to leave some space from cursor to upper/lower border in lists - -set scrolloff=4 - -" Don't do too many requests to slow file systems - -if !has('win') - set slowfs=curlftpfs -endif - -" Set custom status line look - -set statusline=" Hint: %z%= %A %10u:%-7g %15s %20d " - -" Set line numbers to show - -" ------------------------------------------------------------------------------ - -" :mark mark /full/directory/path [filename] - -mark h ~/ - -" ------------------------------------------------------------------------------ - -" :com[mand][!] command_name action -" The following macros can be used in a command -" %a is replaced with the user arguments. -" %c the current file under the cursor. -" %C the current file under the cursor in the other directory. -" %f the current selected file, or files. -" %F the current selected file, or files in the other directory. -" %b same as %f %F. -" %d the current directory name. -" %D the other window directory name. -" %m run the command in a menu window - -command! df df -h %m 2> /dev/null -command! diff vim -d %f %F -command! zip zip -r %f.zip %f -command! run !! ./%f -command! make !!make %a -command! mkcd :mkdir %a | cd %a -command! vgrep vim "+grep %a" -command! reload :write | restart - -" ------------------------------------------------------------------------------ - -" The file type is for the default programs to be used with -" a file extension. -" :filetype pattern1,pattern2 defaultprogram,program2 -" :fileviewer pattern1,pattern2 consoleviewer -" The other programs for the file type can be accessed with the :file command -" The command macros %f, %F, %d, %F may be used in the commands. -" The %a macro is ignored. To use a % you must put %%. - -" For automated FUSE mounts, you must register an extension with :file[x]type -" in one of following formats: -" -" :filetype extensions FUSE_MOUNT|some_mount_command using %SOURCE_FILE and %DESTINATION_DIR variables -" %SOURCE_FILE and %DESTINATION_DIR are filled in by vifm at runtime. -" A sample line might look like this: -" :filetype *.zip,*.jar,*.war,*.ear FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR -" -" :filetype extensions FUSE_MOUNT2|some_mount_command using %PARAM and %DESTINATION_DIR variables -" %PARAM and %DESTINATION_DIR are filled in by vifm at runtime. -" A sample line might look like this: -" :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR -" %PARAM value is filled from the first line of file (whole line). -" Example first line for SshMount filetype: root@127.0.0.1:/ -" -" You can also add %CLEAR if you want to clear screen before running FUSE -" program. - -" Pdf -filextype *.pdf zathura %c %i &, apvlv %c, xpdf %c -fileviewer *.pdf - \ pdftotext -nopgbrk %c - - -" PostScript -filextype *.ps,*.eps,*.ps.gz - \ {View in zathura} - \ zathura %f, - \ {View in gv} - \ gv %c %i &, - -" Djvu -filextype *.djvu - \ {View in zathura} - \ zathura %f, - \ {View in apvlv} - \ apvlv %f, - -" Audio -filetype *.wav,*.mp3,*.flac,*.m4a,*.wma,*.ape,*.ac3,*.og[agx],*.spx,*.opus - \ {Play using mpv} - \ mpv %f, -fileviewer *.mp3 mp3info -fileviewer *.flac soxi - -" Video -filextype *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob, - \*.fl[icv],*.m2v,*.mov,*.webm,*.ts,*.mts,*.m4v,*.r[am],*.qt,*.divx, - \*.as[fx] - \ {View using mplayer} - \ mpv %f, -fileviewer *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob, - \*.fl[icv],*.m2v,*.mov,*.webm,*.ts,*.mts,*.m4v,*.r[am],*.qt,*.divx, - \*.as[fx] - \ ffprobe -pretty %c 2>&1 - -" Web -filextype *.html,*.htm - \ {Open with emacs} - \ emacsclient -c %c &, - \ {Open with vim} - \ vim %c &, - \ {Open with dwb} - \ dwb %f %i &, - \ {Open with firefox} - \ firefox %f &, - \ {Open with uzbl} - \ uzbl-browser %f %i &, -filetype *.html,*.htm links, lynx - -" Object -filetype *.o nm %f | less - -" Man page -filetype *.[1-8] man ./%c -fileviewer *.[1-8] man ./%c | col -b - -" Images -filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm - \ {View in imv} - \ imv %f &, -fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.xpm,*.gif - \ wezterm imgcat --width %pw --height %ph %c:p %pd - -" OpenRaster -filextype *.ora - \ {Edit in MyPaint} - \ mypaint %f, - -" Mindmap -filextype *.vym - \ {Open with VYM} - \ vym %f &, - -" MD5 -filetype *.md5 - \ {Check MD5 hash sum} - \ md5sum -c %f %S, - -" SHA1 -filetype *.sha1 - \ {Check SHA1 hash sum} - \ sha1sum -c %f %S, - -" SHA256 -filetype *.sha256 - \ {Check SHA256 hash sum} - \ sha256sum -c %f %S, - -" SHA512 -filetype *.sha512 - \ {Check SHA512 hash sum} - \ sha512sum -c %f %S, - -" GPG signature -filetype *.asc - \ {Check signature} - \ !!gpg --verify %c, - -" Torrent -filetype *.torrent ktorrent %f & -fileviewer *.torrent dumptorrent -v %c - -" FuseZipMount -filetype *.zip,*.jar,*.war,*.ear,*.oxt,*.apkg - \ {Mount with fuse-zip} - \ FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR, - \ {View contents} - \ zip -sf %c | less, - \ {Extract here} - \ tar -xf %c, -fileviewer *.zip,*.jar,*.war,*.ear,*.oxt zip -sf %c - -" ArchiveMount -filetype *.tar,*.tar.bz2,*.tbz2,*.tgz,*.tar.gz,*.tar.xz,*.txz - \ {Mount with archivemount} - \ FUSE_MOUNT|archivemount %SOURCE_FILE %DESTINATION_DIR, -fileviewer *.tgz,*.tar.gz tar -tzf %c -fileviewer *.tar.bz2,*.tbz2 tar -tjf %c -fileviewer *.tar.txz,*.txz xz --list %c -fileviewer *.tar tar -tf %c - -" Rar2FsMount and rar archives -filetype *.rar - \ {Mount with rar2fs} - \ FUSE_MOUNT|rar2fs %SOURCE_FILE %DESTINATION_DIR, -fileviewer *.rar unrar v %c - -" IsoMount -filetype *.iso - \ {Mount with fuseiso} - \ FUSE_MOUNT|fuseiso %SOURCE_FILE %DESTINATION_DIR, - -" SshMount -filetype *.ssh - \ {Mount with sshfs} - \ FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR %FOREGROUND, - -" FtpMount -filetype *.ftp - \ {Mount with curlftpfs} - \ FUSE_MOUNT2|curlftpfs -o ftp_port=-,,disable_eprt %PARAM %DESTINATION_DIR %FOREGROUND, - -" Fuse7z and 7z archives -filetype *.7z - \ {Mount with fuse-7z} - \ FUSE_MOUNT|fuse-7z %SOURCE_FILE %DESTINATION_DIR, -fileviewer *.7z 7z l %c - -" Office files -filextype *.odt,*.doc,*.docx,*.xls,*.xlsx,*.odp,*.pptx libreoffice %f & -fileviewer *.doc catdoc %c -fileviewer *.docx docx2txt.pl %f - - -" TuDu files -filetype *.tudu tudu -f %c - -" Qt projects -filextype *.pro qtcreator %f & - -" Directories -filextype */ - \ {View in thunar} - \ Thunar %f &, - -" Syntax highlighting in preview -" -" Explicitly set highlight type for some extensions -" -" 256-color terminal -" fileviewer *.[ch],*.[ch]pp highlight -O xterm256 -s dante --syntax c %c -" fileviewer Makefile,Makefile.* highlight -O xterm256 -s dante --syntax make %c -" -" 16-color terminal -" fileviewer *.c,*.h highlight -O ansi -s dante %c -" -" Or leave it for automatic detection -" -" fileviewer *[^/] pygmentize -O style=monokai -f console256 -g - -" Displaying pictures in terminal -" -" fileviewer *.jpg,*.png shellpic %c - -" Open all other files with default system programs (you can also remove all -" :file[x]type commands above to ensure they don't interfere with system-wide -" settings). By default all unknown files are opened with 'vi[x]cmd' -" uncommenting one of lines below will result in ignoring 'vi[x]cmd' option -" for unknown file types. -" For *nix: -" filetype * xdg-open -" For OS X: -" filetype * open -" For Windows: -" filetype * start, explorer - -" GETTING ICONS TO DISPLAY IN VIFM -" You need the next 14 lines! - -" file types -set classify=' :dir:/, :exe:, :reg:, :link:' -" various file names -set classify+='ïą ::../::, ::*.sh::, ::*.[hc]pp::, ::*.[hc]::,ï‡č ::/^copying|license$/::, ::.git/,,*.git/::, ::*.epub,,*.fb2,,*.djvu::, ::*.pdf::, ::*.htm,,*.html,,**.[sx]html,,*.xml::' -" archives -set classify+=' ::*.7z,,*.ace,,*.arj,,*.bz2,,*.cpio,,*.deb,,*.dz,,*.gz,,*.jar,,*.lzh,,*.lzma,,*.rar,,*.rpm,,*.rz,,*.tar,,*.taz,,*.tb2,,*.tbz,,*.tbz2,,*.tgz,,*.tlz,,*.trz,,*.txz,,*.tz,,*.tz2,,*.xz,,*.z,,*.zip,,*.zoo::' -" images -set classify+=' ::*.bmp,,*.gif,,*.jpeg,,*.jpg,,*.ico,,*.png,,*.ppm,,*.svg,,*.svgz,,*.tga,,*.tif,,*.tiff,,*.xbm,,*.xcf,,*.xpm,,*.xspf,,*.xwd::' -" audio -set classify+=' ::*.aac,,*.anx,,*.asf,,*.au,,*.axa,,*.flac,,*.m2a,,*.m4a,,*.mid,,*.midi,,*.mp3,,*.mpc,,*.oga,,*.ogg,,*.ogx,,*.ra,,*.ram,,*.rm,,*.spx,,*.wav,,*.wma,,*.ac3::' -" media -set classify+=' ::*.avi,,*.ts,,*.axv,,*.divx,,*.m2v,,*.m4p,,*.m4v,,.mka,,*.mkv,,*.mov,,*.mp4,,*.flv,,*.mp4v,,*.mpeg,,*.mpg,,*.nuv,,*.ogv,,*.pbm,,*.pgm,,*.qt,,*.vob,,*.wmv,,*.xvid::' -" office files -set classify+=' ::*.doc,,*.docx::, ::*.xls,,*.xls[mx]::, ::*.pptx,,*.ppt::' - -" ------------------------------------------------------------------------------ - -" What should be saved automatically between vifm runs -" Like in previous versions of vifm -" set vifminfo=options,filetypes,commands,bookmarks,dhistory,state,cs -" Like in vi -set vifminfo=dhistory,savedirs,chistory,state,tui,shistory, - \phistory,fhistory,dirstack,registers,bookmarks,bmarks - -" ------------------------------------------------------------------------------ - -" Examples of configuring both panels - -" Customize view columns a bit (enable ellipsis for truncated file names) -" -" set viewcolumns=-{name}..,6{}. - -" Filter-out build and temporary files -" -" filter! /^.*\.(lo|o|d|class|py[co])$|.*~$/ - -" ------------------------------------------------------------------------------ - -" Sample mappings - -"Open all images in current directory in sxiv thumbnail mode -nnoremap sx :!sxiv -t %d & - -"Open selected images in gimp -nnoremap gp :!gimp %f & - -" Start shell in current directory -nnoremap s :shell - -" Display sorting dialog -nnoremap S :sort - -" Toggle visibility of preview window -nnoremap w :view -vnoremap w :viewgv - -" Open file in the background using its default program -nnoremap gb :file &l - -" Yank current directory path into the clipboard -nnoremap yd :!echo %d | xclip %i - -" Yank current file path into the clipboard -nnoremap yf :!echo %c:p | xclip %i - -" Mappings for faster renaming -nnoremap I cw -nnoremap cc cw -nnoremap A cw - -" Open console in current directory -nnoremap ,t :!xterm & - -" Open editor to edit vifmrc and apply settings after returning to vifm -nnoremap ,c :write | edit $MYVIFMRC | restart -" Open gvim to edit vifmrc -nnoremap ,C :!gvim --remote-tab-silent $MYVIFMRC & - -" Toggle wrap setting on ,w key -nnoremap ,w :set wrap! - -" Example of standard two-panel file managers mappings -nnoremap :!less %f -nnoremap :edit -nnoremap :copy -nnoremap :move -nnoremap :mkdir -nnoremap :delete - -" ------------------------------------------------------------------------------ - -" Various customization examples - -" Use ag (the silver searcher) instead of grep -" -" set grepprg='ag --line-numbers %i %a %s' - -" Add additional place to look for executables -" -" let $PATH = $HOME.'/bin/fuse:'.$PATH - -" Block particular shortcut -" -" nnoremap - -" Export IPC name of current instance as environment variable and use it to -" communicate with the instance later. -" -" It can be used in some shell script that gets run from inside vifm, for -" example, like this: -" vifm --server-name "$VIFM_SERVER_NAME" --remote +"cd '$PWD'" -" -" let $VIFM_SERVER_NAME = v:servername diff --git a/new-config/.config/wezterm/wezterm.lua b/new-config/.config/wezterm/wezterm.lua deleted file mode 100644 index 38be7d68c..000000000 --- a/new-config/.config/wezterm/wezterm.lua +++ /dev/null @@ -1,33 +0,0 @@ -local wezterm = require 'wezterm' -local gpus = wezterm.gui.enumerate_gpus() - -return { - enable_wayland = true, - font = wezterm.font { - family = 'mononoki Nerd Font', - weight = 'Medium' - }, - color_scheme = 'Gruvbox dark, hard (base16)', - default_prog = { '/usr/bin/fish' }, - default_cursor_style = "BlinkingUnderline", - font_size = 12, - check_for_updates = false, - use_dead_keys = false, - warn_about_missing_glyphs = false, - enable_kitty_graphics = true, - animation_fps = 1, - cursor_blink_rate = 175, - hide_tab_bar_if_only_one_tab = true, - adjust_window_size_when_changing_font_size = false, - window_padding = { - left = 10, - right = 10, - top = 10, - bottom = 10, - }, - use_fancy_tab_bar = false, - exit_behavior = "Close", - window_close_confirmation = 'NeverPrompt', - tab_bar_at_bottom = false, - window_background_opacity = 0.9, -} diff --git a/new-config/.config/zathura/zathurarc b/new-config/.config/zathura/zathurarc deleted file mode 100644 index 126e180bb..000000000 --- a/new-config/.config/zathura/zathurarc +++ /dev/null @@ -1,54 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom zathura config -## - -set font "mononoki Nerd Font 9" -set default-bg "#262626" #00 -set default-fg "#ebdbb2" #01 - -set statusbar-fg "#ebdbb2" #04 -set statusbar-bg "#262626" #01 - -set inputbar-bg "#262626" #00 currently not used -set inputbar-fg "#ebdbb2" #02 - -set notification-error-bg "#262626" #08 -set notification-error-fg "#cc241d" #00 - -set notification-warning-bg "#262626" #08 -set notification-warning-fg "#d79921" #00 - -set highlight-color "#262626" #0A -set highlight-active-color "#ebdbb2" #0D - -set completion-highlight-fg "#4e4e4e" #02 -set completion-highlight-bg "#87afaf" #0C - -set completion-bg "#4e4e4e" #02 -set completion-fg "#ebdbb2" #0C - -set notification-bg "#262626" #0B -set notification-fg "#458588" #00 - -set recolor-lightcolor "#262626" #00 -set recolor-darkcolor "#ebdbb2" #06 -set recolor "false" - -# setting recolor-keep true will keep any color your pdf has. -# if it is false, it'll just be black and white -set recolor-keephue "false" - -set selection-clipboard "clipboard" - -# keybindings -map [fullscreen] a adjust_window best-fit -map [fullscreen] s adjust_window width -map [fullscreen] f follow -map [fullscreen] toggle_index -map [fullscreen] j scroll down -map [fullscreen] k scroll up -map [fullscreen] h navigate previous -map [fullscreen] l navigate next diff --git a/new-config/.icons/default/index.theme b/new-config/.icons/default/index.theme deleted file mode 100644 index 27401a6a0..000000000 --- a/new-config/.icons/default/index.theme +++ /dev/null @@ -1,5 +0,0 @@ -# This file is written by nwg-look. Do not edit. -[Icon Theme] -Name=Default -Comment=Default Cursor Theme -Inherits=Simp1e-Gruvbox-Dark diff --git a/user/.bash_logout b/user/.bash_logout deleted file mode 100644 index 60c6b07a2..000000000 --- a/user/.bash_logout +++ /dev/null @@ -1,3 +0,0 @@ -# ~/.bash_logout -clear - diff --git a/user/.bash_profile b/user/.bash_profile index 974b007d8..7902f7a48 100644 --- a/user/.bash_profile +++ b/user/.bash_profile @@ -9,16 +9,22 @@ ### STARTING XSESSION if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ] then - startx -- vt1 -keeptty &>/dev/null + sh $HOME/.winitrc logout fi ### ENVIRONMENT VARIABLES export EDITOR="lvim" # $EDITOR use lunarvim in terminal -export VISUAL="neovide --neovim-bin ./.local/bin/lvim" # $VISUAL use neovide for lunarvim in GUI -export XDG_DATA_HOME="${XDG_DATA_HOME:="$HOME/.local/share"}" -export XDG_CACHE_HOME="${XDG_CACHE_HOME:="$HOME/.cache"}" -export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:="$HOME/.config"}" + +# clean home +export XDG_DATA_HOME="$HOME/.local/share" +export XDG_CACHE_HOME="$HOME/.cache" +export XDG_CONFIG_HOME="$HOME/.config" +export W3M_DIR="$XDG_DATA_HOME/w3m" +export GTK2_RC_FILES="$HOME/.config/gtk-2.0/gtkrc-2.0" +export WGETRC="$HOME/.config/wget/wgetrc" +export INPUTRC="$HOME/.config/inputrc" +export GNUPGHOME="$HOME/.local/share/gnupg" ### BASHRC -source "$HOME"/.bashrc # Load the bashrc +source "$HOME"/.bashrc # Load the bashrc diff --git a/user/.bashrc b/user/.bashrc index deb8e6da9..ed7e16819 100644 --- a/user/.bashrc +++ b/user/.bashrc @@ -8,6 +8,11 @@ ### EXPORT ### export TERM="xterm-256color" # getting proper colors export HISTCONTROL=ignoredups:erasedups # no duplicate entries +export EDITOR="$HOME/.local/bin/lvim" +export VISUAL="wezterm start --class editor -- $HOME/.local/bin/lvim" + +### "bat" as manpager +export MANPAGER="sh -c 'col -bx | bat -l man -p'" # use bash-completion, if available [[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ @@ -17,10 +22,7 @@ export HISTCONTROL=ignoredups:erasedups # no duplicate entries [[ $- != *i* ]] && return # use neovim for vim if present. -[ -x "$(command -v lvim)" ] && alias vim="lvim" vimdiff="lvim -d" - -# use $XINITRC variable if file exists. -[ -f "$XINITRC" ] && alias startx="startx $XINITRC" +[ -x "$(command -v $HOME/.local/bin/lvim)" ] && alias vim="lvim" ### SET VI MODE ### # Comment this line out to enable default emacs-like bindings @@ -38,9 +40,6 @@ fi if [ -d "$HOME/Applications" ] ; then PATH="$HOME/Applications:$PATH" fi -if [ -d "$HOME/.config/emacs/bin" ] ; - then PATH="$HOME/.config/emacs/bin:$PATH" -fi ### CHANGE TITLE OF TERMINALS ### case ${TERM} in @@ -128,6 +127,9 @@ alias \ # bat as cat [ -x "$(command -v bat)" ] && alias cat="bat" +# pfetch as neofetch +[ -x "$(command -v pfetch)" ] && alias neofetch="pfetch" + # Changing "ls" to "exa" alias \ ls="exa -al --icons --color=always --group-directories-first" \ @@ -136,14 +138,14 @@ alias \ lt="exa -aT --icons --color=always --group-directories-first" \ l.='exa -a | grep -E "^\."' -# function to detect os and assign aliases to package managers +# pacman alias \ - pac-up="paru -Syyu" \ + pac-up="paru -Syu" \ pac-get="paru -S" \ pac-rmv="paru -Rcns" \ pac-rmv-sec="paru -R" \ pac-qry="paru -Ss" \ - pac-cln="paru -Scc" + pac-cln="paru -Scc && sudo pacman -Rns $(pacman -Qtdq)" # colorize grep output (good for log files) alias \ @@ -153,27 +155,24 @@ alias \ # git alias \ - addup="git add -u" \ - addall="git add ." \ - branch="git branch" \ - checkout="git checkout" \ - clone="git clone" \ - commit="git commit -m" \ - fetch="git fetch" \ - pull="git pull origin" \ - push="git push origin" \ - stat="git status" \ - tag="git tag" \ - newtag="git tag -a" + git-adu="git add -u" \ + git-adl="git add ." \ + git-brn="git branch" \ + git-chk="git checkout" \ + git-cln="git clone" \ + git-cmt="git commit -m" \ + git-fth="git fetch" \ + git-pll="git pull origin" \ + git-psh="git push origin" \ + git-sts="git status" \ + git-tag="git tag" \ + git-ntg="git tag -a" # adding flags alias \ df="df -h" \ free="free -m" -# newsboat -[ -x "$(command -v newsboat)" ] && alias newsboat="newsboat -u ~/.config/newsboat/urls" - # multimedia scripts alias \ fli="flix-cli" \ @@ -196,10 +195,9 @@ alias \ # file management alias \ - fm="$HOME/.config/vifm/scripts/vifmrun" \ - file="$HOME/.config/vifm/scripts/vifmrun" \ - flm="$HOME/.config/vifm/scripts/vifmrun" \ - vifm="$HOME/.config/vifm/scripts/vifmrun" \ + fm="vifm" \ + file="vifm" \ + flm="vifm" \ rm="rm -vI" \ mv="mv -iv" \ cp="cp -iv" \ diff --git a/user/.config/alacritty/alacritty.yml b/user/.config/alacritty/alacritty.yml deleted file mode 100644 index e010baa24..000000000 --- a/user/.config/alacritty/alacritty.yml +++ /dev/null @@ -1,447 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom alacritty config -## - -## Set colorschemes - -####################################### -## Alacritty colorschemes ## -####################################### -schemes: - ### Doom One ### - doom-one: &doom-one - primary: - background: '#282c34' - foreground: '#bbc2cf' - cursor: - text: CellBackground - cursor: '#528bff' - selection: - text: CellForeground - background: '#3e4451' - normal: - black: '#1c1f24' - red: '#ff6c6b' - green: '#98be65' - yellow: '#da8548' - blue: '#51afef' - magenta: '#c678dd' - cyan: '#5699af' - white: '#202328' - bright: - black: '#5b6268' - red: '#da8548' - green: '#4db5bd' - yellow: '#ecbe7b' - blue: '#3071db' # This is 2257a0 in Doom Emacs but I lightened it. - magenta: '#a9a1e1' - cyan: '#46d9ff' - white: '#dfdfdf' - - ### Tokyo Night ### - tokyo-night: &tokyo-night - # Default colors - primary: - background: '#1a1b26' - foreground: '#a9b1d6' - - # Normal colors - normal: - black: '#32344a' - red: '#f7768e' - green: '#9ece6a' - yellow: '#e0af68' - blue: '#34548a' - magenta: '#ad8ee6' - cyan: '#449dab' - white: '#9699a8' - - # Bright colors - bright: - black: '#444b6a' - red: '#ff7a93' - green: '#b9f27c' - yellow: '#ff9e64' - blue: '#7da6ff' - magenta: '#bb9af7' - cyan: '#0db9d7' - white: '#acb0d0' - - - ### Dracula ### - dracula: &dracula - primary: - background: '#282a36' - foreground: '#f8f8f2' - cursor: - text: CellBackground - cursor: CellForeground - vi_mode_cursor: - text: CellBackground - cursor: CellForeground - search: - matches: - foreground: '#44475a' - background: '#50fa7b' - focused_match: - foreground: '#44475a' - background: '#ffb86c' - bar: - background: '#282a36' - foreground: '#f8f8f2' - line_indicator: - foreground: None - background: None - selection: - text: CellForeground - background: '#44475a' - normal: - black: '#000000' - red: '#ff5555' - green: '#50fa7b' - yellow: '#f1fa8c' - blue: '#bd93f9' - magenta: '#ff79c6' - cyan: '#8be9fd' - white: '#bfbfbf' - bright: - black: '#4d4d4d' - red: '#ff6e67' - green: '#5af78e' - yellow: '#f4f99d' - blue: '#caa9fa' - magenta: '#ff92d0' - cyan: '#9aedfe' - white: '#e6e6e6' - dim: - black: '#14151b' - red: '#ff2222' - green: '#1ef956' - yellow: '#ebf85b' - blue: '#4d5b86' - magenta: '#ff46b0' - cyan: '#59dffc' - white: '#e6e6d1' - - ### Gruvbox dark ### - gruvbox-dark: &gruvbox-dark - # Default colors - primary: - # hard contrast: background = '0x1d2021' - background: '#1d2021' - # soft contrast: background = '0x32302f' - foreground: '#ebdbb2' - - # Normal colors - normal: - black: '#282828' - red: '#cc241d' - green: '#98971a' - yellow: '#d79921' - blue: '#458588' - magenta: '#b16286' - cyan: '#689d6a' - white: '#a89984' - - # Bright colors - bright: - black: '#928374' - red: '#fb4934' - green: '#b8bb26' - yellow: '#fabd2f' - blue: '#83a598' - magenta: '#d3869b' - cyan: '#8ec07c' - white: '#ebdbb2' - -### Monokai ### - monokai-pro: &monokai-pro - # Default colors - primary: - background: '#2D2A2E' - foreground: '#FCFCFA' - - # Normal colors - normal: - black: '#403E41' - red: '#FF6188' - green: '#A9DC76' - yellow: '#FFD866' - blue: '#FC9867' - magenta: '#AB9DF2' - cyan: '#78DCE8' - white: '#FCFCFA' - - # Bright colors - bright: - black: '#727072' - red: '#FF6188' - green: '#A9DC76' - yellow: '#FFD866' - blue: '#FC9867' - magenta: '#AB9DF2' - cyan: '#78DCE8' - white: '#FCFCFA' - - ### Nord ### - nord: &nord - # Default colors - primary: - background: '#2E3440' - foreground: '#D8DEE9' - - # Normal colors - normal: - black: '#3B4252' - red: '#BF616A' - green: '#A3BE8C' - yellow: '#EBCB8B' - blue: '#81A1C1' - magenta: '#B48EAD' - cyan: '#88C0D0' - white: '#E5E9F0' - - # Bright colors - bright: - black: '#4C566A' - red: '#BF616A' - green: '#A3BE8C' - yellow: '#EBCB8B' - blue: '#81A1C1' - magenta: '#B48EAD' - cyan: '#8FBCBB' - white: '#ECEFF4' - - ### Oceanic Next ### - oceanic-next: &oceanic-next - # Default colors - primary: - background: '#1b2b34' - foreground: '#d8dee9' - - # Colors the cursor will use if `custom_cursor_colors` is true - cursor: - text: '#1b2b34' - cursor: '#ffffff' - - # Normal colors - normal: - black: '#343d46' - red: '#EC5f67' - green: '#99C794' - yellow: '#FAC863' - blue: '#6699cc' - magenta: '#c594c5' - cyan: '#5fb3b3' - white: '#d8dee9' - - # Bright colors - bright: - black: '#343d46' - red: '#EC5f67' - green: '#99C794' - yellow: '#FAC863' - blue: '#6699cc' - magenta: '#c594c5' - cyan: '#5fb3b3' - white: '#d8dee9' - - ### Palenight ### - palenight: &palenight - # Default colors - primary: - background: '#292d3e' - foreground: '#d0d0d0' - - # Normal colors - normal: - black: '#292d3e' - red: '#f07178' - green: '#c3e88d' - yellow: '#ffcb6b' - blue: '#82aaff' - magenta: '#c792ea' - cyan: '#89ddff' - white: '#d0d0d0' - - # Bright colors - bright: - black: '#434758' - red: '#ff8b92' - green: '#ddffa7' - yellow: '#ffe585' - blue: '#9cc4ff' - magenta: '#e1acff' - cyan: '#a3f7ff' - white: '#ffffff' - - ### Solarized Dark ### - solarized-dark: &solarized-dark - # Default colors - primary: - background: '#002b36' # base03 - foreground: '#839496' # base0 - - # Cursor colors - cursor: - text: '#002b36' # base03 - cursor: '#839496' # base0 - - # Normal colors - normal: - black: '#073642' # base02 - red: '#dc322f' # red - green: '#859900' # green - yellow: '#b58900' # yellow - blue: '#268bd2' # blue - magenta: '#d33682' # magenta - cyan: '#2aa198' # cyan - white: '#eee8d5' # base2 - - # Bright colors - bright: - black: '#002b36' # base03 - red: '#cb4b16' # orange - green: '#586e75' # base01 - yellow: '#657b83' # base00 - blue: '#839496' # base0 - magenta: '#6c71c4' # violet - cyan: '#93a1a1' # base1 - white: '#fdf6e3' # base3 - - ### Solarized Light ### - solarized-light: &solarized-light - # Default colors - primary: - background: '#fdf6e3' # base3 - foreground: '#657b83' # base00 - - # Cursor colors - cursor: - text: '#fdf6e3' # base3 - cursor: '#657b83' # base00 - - # Normal colors - normal: - black: '#073642' # base02 - red: '#dc322f' # red - green: '#859900' # green - yellow: '#b58900' # yellow - blue: '#268bd2' # blue - magenta: '#d33682' # magenta - cyan: '#2aa198' # cyan - white: '#eee8d5' # base2 - - # Bright colors - bright: - black: '#002b36' # base03 - red: '#cb4b16' # orange - green: '#586e75' # base01 - yellow: '#657b83' # base00 - blue: '#839496' # base0 - magenta: '#6c71c4' # violet - cyan: '#93a1a1' # base1 - white: '#fdf6e3' # base3 - - ### Tomorrow Night ### - tomorrow-night: &tomorrow-night - # Default colors - primary: - background: '#1d1f21' - foreground: '#c5c8c6' - - # Colors the cursor will use if `custom_cursor_colors` is true - cursor: - text: '#1d1f21' - cursor: '#ffffff' - - # Normal colors - normal: - black: '#1d1f21' - red: '#cc6666' - green: '#b5bd68' - yellow: '#e6c547' - blue: '#81a2be' - magenta: '#b294bb' - cyan: '#70c0ba' - white: '#373b41' - - # Bright colors - bright: - black: '#666666' - red: '#ff3334' - green: '#9ec400' - yellow: '#f0c674' - blue: '#81a2be' - magenta: '#b77ee0' - cyan: '#54ced6' - white: '#282a2e' - -colors: *gruvbox-dark - -## Set environment variables -env: - TERM: xterm-256color - -## Window settigns -window: - opacity: 0.95 - padding: - x: 6 - y: 6 - dynamic_padding: false - title: Alacritty - class: - instance: Alacritty - general: Alacritty - dimensions: - columns: 160 - lines: 44 - -## Scrolling settings -scrolling: - history: 5000 - -## Font settings -font: - normal: - family: mononoki Nerd Font - style: Regular - bold: - family: mononoki Nerd Font - style: Bold - italic: - family: mononoki Nerd Font - style: Italic - bold_italic: - family: mononoki Nerd Font - style: Bold Italic - size: 8 - offset: - x: 0 - y: 1 -draw_bold_text_with_bright_colors: true - -cursor: - style: Underline - -shell: - program: /bin/fish - -key_bindings: - # (Windows, Linux, and BSD only) - - { key: V, mods: Control|Shift, action: Paste } - - { key: C, mods: Control|Shift, action: Copy } - - { key: Insert, mods: Shift, action: PasteSelection } - - { key: Key0, mods: Control, action: ResetFontSize } - - { key: Equals, mods: Control, action: IncreaseFontSize } - - { key: Plus, mods: Control, action: IncreaseFontSize } - - { key: Minus, mods: Control, action: DecreaseFontSize } - - { key: F11, mods: None, action: ToggleFullscreen } - - { key: L, mods: Control, action: ClearLogNotice } - - { key: L, mods: Control, chars: "\x0c" } - - { key: Home, mods: Shift, action: ScrollToTop, mode: ~Alt } - - { key: End, mods: Shift, action: ScrollToBottom, mode: ~Alt } diff --git a/user/.config/awesome/apps.lua b/user/.config/awesome/apps.lua deleted file mode 100644 index 5ef65103c..000000000 --- a/user/.config/awesome/apps.lua +++ /dev/null @@ -1,28 +0,0 @@ --- Apps config, see keymaps/keyboard.lua to see how this is handled in keybindings -local apps = { - terminal = "wezterm", -- Selected terminal emulator - -- Rofi settings - drunner = "rofi -show drun -show-icons", -- Desktop runner - runner = "rofi -show run", -- Normal runner - runner_power = "$HOME/.config/rofi/scripts/rofi_power", -- Power manager - runner_wifi = "$HOME/.config/rofi/scripts/rofi_wifi", -- Wifi manager - runner_scrot = "$HOME/.config/rofi/scripts/rofi_scrot", -- Screenshots manager - runner_emoji = "$HOME/.config/rofi/scripts/rofi_emoji", -- Emojis manager - runner_wall = "$HOME/.config/rofi/scripts/rofi_wall", -- Wallpapers manager - -- Other scripts - ytfzf = "wezterm start --class ytfzf -- ytfzf -flstT chafa", -- Youtube - ytfzf_music = "wezterm start --class ytfzf_music -- ytfzf -mlstT chafa", -- Youtube Music - ani_cli = "wezterm start --class ani-cli -- ani-cli", -- Anime - flix_cli = "wezterm start --class flix-cli -- flix-cli", -- Movies - tut = "wezterm start --class tut -- tut", -- Mastodon - newsboat = "wezterm start --class newsboat -- newsboat -u ~/.config/newsboat/urls", -- Newsboat - -- Selected apps - editor = "neovide --neovim-bin ./.local/bin/lvim", -- TAG 1 - file = "wezterm start --class vifm -- ./.config/vifm/scripts/vifmrun", -- TAG 2 - browser = "firefox", -- TAG 3 - chat = "revolt-desktop", -- TAG 4 - music = "wezterm start --class cmus -- cmus", -- TAG 5 - office = "libreoffice", -- TAG 8 - game = "retroarch" -- TAG 9 -} -return apps diff --git a/user/.config/awesome/autostart.lua b/user/.config/awesome/autostart.lua deleted file mode 100644 index 5249b0724..000000000 --- a/user/.config/awesome/autostart.lua +++ /dev/null @@ -1,21 +0,0 @@ -local awful = require("awful") --- Session manager -awful.util.spawn_with_shell( - "lxpolkit &" -) --- Wallpapers manager -awful.util.spawn_with_shell( - "$HOME/.fehbg &" -) --- Automatically hide the cursor -awful.util.spawn_with_shell( - "unclutter --hide-on-touch &" -) --- Compositor -awful.util.spawn_with_shell( - "picom --experimental-backends --config ~/.config/picom/picom.conf &" -) --- Power manager -awful.util.spawn_with_shell( - "xfce4-power-manager &" -) diff --git a/user/.config/awesome/helpers.lua b/user/.config/awesome/helpers.lua deleted file mode 100644 index 528c4be4f..000000000 --- a/user/.config/awesome/helpers.lua +++ /dev/null @@ -1,35 +0,0 @@ -local naughty = require("naughty") -local ruled = require("ruled") -local beautiful = require("beautiful") - --- {{{ Error handling -naughty.connect_signal( - "request::display_error", - function(message, startup) - naughty.notification { - urgency = "critical", - title = "Oops, an error happened".. ( startup and " during startup!" or "!" ), - message = message - } - end -) --- }}} - --- {{{ Signals --- No borders when rearranging only 1 non-floating or maximized client -screen.connect_signal( - "arrange", - function (s) - local max = s.selected_tag.layout.name == "max" - local only_one = #s.tiled_clients == 1 -- use tiled_clients so that other floating windows don't affect the count - -- but iterate over clients instead of tiled_clients as tiled_clients doesn't include maximized windows - for _, c in pairs(s.clients) do - if (max or only_one) and not c.floating or c.maximized then - c.border_width = 0 - else - c.border_width = beautiful.border_width - end - end - end -) --- }}} diff --git a/user/.config/awesome/keymaps/keyboard.lua b/user/.config/awesome/keymaps/keyboard.lua deleted file mode 100644 index 836b0267f..000000000 --- a/user/.config/awesome/keymaps/keyboard.lua +++ /dev/null @@ -1,723 +0,0 @@ -local awful = require("awful") -local hotkeys_popup = require("awful.hotkeys_popup"); require("awful.hotkeys_popup.keys") -local apps = require("apps") -require("awful.autofocus") - --- Modkeys. -altkey = "Mod1" -modkey = "Mod4" -conkey = "Control" -shikey = "Shift" - ---[[ Main keybinds ]]-- -awful.keyboard.append_global_keybindings( - { - -- Show the help menu - awful.key( - { modkey }, - "s", - hotkeys_popup.show_help, - { description = - "Show Help Menu", - group = - "Main keybinds" - } - ), - -- Reload awesome - awful.key( - { modkey, conkey }, - "r", - awesome.restart, - { description = - "Reload Awesome", - group = - "Main keybinds" - } - ), - -- Open a terminal - awful.key( - { modkey }, - "Return", - function () - awful.spawn(apps.terminal) - end, - { description = - "Open a terminal", - group = - "Main keybinds" - } - ), - } -) ---[[ ]]-- - ---[[ Tags related keybindings ]]-- -awful.keyboard.append_global_keybindings( - { - -- Switch to previous tag - awful.key( - { modkey }, - "Left", - awful.tag.viewprev, - { description = - "Quickly switch to previous tag", - group = - "Tag keybinds" - } - ), - -- Switch to next tag - awful.key( - { modkey }, - "Right", - awful.tag.viewnext, - { description = - "Quickly switch to next tag", - group = - "Tag keybinds" - } - ), - -- Switch back to the previous tag - awful.key( - { modkey }, - "Escape", - awful.tag.history.restore, - { description = - "Go back to previus tag (from history)", - group = - "Tag keybinds" - } - ), - -- Switch tags by numbers 1-9 - awful.key { - modifiers = { modkey }, - keygroup = "numrow", - description = "Switch tags with number keys from {1 to 9}", - group = "Tag keybinds", - on_press = function (index) - local screen = awful.screen.focused() - local tag = screen.tags[index] - if tag then - tag:view_only() - end - end, - }, - -- Toggle tags by numbers 1-9 - awful.key { - modifiers = { modkey, conkey }, - keygroup = "numrow", - description = "Quickly view contents in another tag with number keys from {1 to 9}", - group = "Tag keybinds", - on_press = function (index) - local screen = awful.screen.focused() - local tag = screen.tags[index] - if tag then - awful.tag.viewtoggle(tag) - end - end, - }, - -- Move focused window to tag by numbers 1-9 - awful.key { - modifiers = { modkey, shikey }, - keygroup = "numrow", - description = "Move focused window to another tag with number keys from {1 to 9}", - group = "Tag keybinds", - on_press = function (index) - if client.focus then - local tag = client.focus.screen.tags[index] - if tag then - client.focus:move_to_tag(tag) - end - end - end, - }, - -- Toggle focused window on tag by numbers 1-9 - awful.key { - modifiers = { modkey, conkey, shikey }, - keygroup = "numrow", - description = "View focused window on more than one tag with number keys from {1 to 9}", - group = "Tag keybinds", - on_press = function (index) - if client.focus then - local tag = client.focus.screen.tags[index] - if tag then - client.focus:toggle_tag(tag) - end - end - end, - }, - } -) ---[[ ]]-- - ---[[ Focus related keybindings ]]-- -awful.keyboard.append_global_keybindings( - { - -- Focus next window by index - awful.key( - { modkey }, - "j", - function () - awful.client.focus.byidx( 1) - end, - { description = - "Focus the next window by index", - group = - "Focus keybinds" - } - ), - -- Focus previous window by index - awful.key( - { modkey }, - "k", - function () - awful.client.focus.byidx(-1) - end, - { description = - "Focus the previous window by index", - group = - "Focus keybinds" - } - ), - -- Focus last focused window - awful.key( - { modkey }, - "Tab", - function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end, - { description = - "Focus back the previous focused window", - group = - "Focus keybinds" - } - ), - -- Focus next screen - awful.key( - { modkey, conkey }, - "j", - function () - awful.screen.focus_relative(1) - end, - { description = - "Focus the next screen", - group = - "Focus keybinds" - } - ), - -- Focus previous screen - awful.key( - { modkey, conkey }, - "k", - function () - awful.screen.focus_relative(-1) - end, - { description = - "Focus the previous screen", - group = - "Focus keybinds" - } - ), - } -) ---[[ ]]-- - ---[[ Layout keybinds ]]-- -awful.keyboard.append_global_keybindings( - { - -- Swap with next window by index - awful.key( - { modkey, shikey }, - "j", - function () - awful.client.swap.byidx(1) - end, - { description = - "Swap with next window in current layout by index", - group = - "Layout keybinds" - } - ), - -- Swap with previous window by index - awful.key( - { modkey, shikey }, - "k", - function () - awful.client.swap.byidx(-1) - end, - { description = - "Swap with previous window in current layout by index", - group = - "Layout keybinds" - } - ), - -- Increase master width - awful.key( - { modkey }, - "l", - function () - awful.tag.incmwfact(0.05) - end, - { description = - "Increase master window width size", - group = - "Layout keybinds" - } - ), - -- Decrease master width - awful.key( - { modkey }, - "h", - function () - awful.tag.incmwfact(-0.05) - end, - { description = - "Decrease master window width size", - group = - "Layout keybinds" - } - ), - -- Increase the number of master window - awful.key( - { modkey, shikey }, - "h", - function () - awful.tag.incnmaster(1, nil, true) - end, - { description = - "Increase the number of master windows", - group = - "Layout keybinds" - } - ), - -- Decrease the number of master windows - awful.key( - { modkey, shikey }, - "l", - function () - awful.tag.incnmaster(-1, nil, true) - end, - { description = - "Decrease the number of master windows", - group = - "Layout keybinds" - } - ), - -- Increase the number of columns - awful.key( - { modkey, conkey }, - "h", - function () - awful.tag.incncol(1, nil, true) - end, - { description = - "Increase the number of columns in layout", - group = - "Layout keybinds" - } - ), - -- Decrease the number of columns - awful.key( - { modkey, conkey }, - "l", - function () - awful.tag.incncol(-1, nil, true) - end, - { description = - "Decrease the number of columns in layout", - group = - "Layout keybinds" - } - ), - -- Switch to next layout - awful.key( - { modkey }, - "space", - function () - awful.layout.inc(1) - end, - { description = - "Switch to the next layout", - group = - "Layout keybinds" - } - ), - -- Switch to previous layout - awful.key( - { modkey, shikey }, - "space", - function () - awful.layout.inc(-1) - end, - { description = - "Switch to previous layout", - group = - "Layout keybinds" - } - ), - -- Select layouts directly - awful.key { - modifiers = { modkey }, - keygroup = "numpad", - description = "Select layouts directly using the numpad", - group = "layout", - on_press = function (index) - local t = awful.screen.focused().selected_tag - if t then - t.layout = t.layouts[index] or t.layout - end - end, - }, - -- Show/Hide Wibox - awful.key( - { modkey }, - "b", - function () - for s in screen do - s.mywibox.visible = not s.mywibox.visible - if s.mybottomwibox then - s.mybottomwibox.visible = not s.mybottomwibox.visible - end - end - end, - { description = - "Toggle the bar", - group = - "Layout keybinds" - } - ), - } -) ---[[ ]]-- - ---[[ Window keybinds ]]-- -client.connect_signal( - "request::default_keybindings", - function() - awful.keyboard.append_client_keybindings( - { - -- Set focused window to fullscreen - awful.key( - { modkey }, - "f", - function (c) - c.fullscreen = not c.fullscreen - c:raise() - end, - { description = - "Toggle fullscreen", - group = - "Window keybinds" - } - ), - -- Close focused window - awful.key( - { modkey }, - "q", - function (c) - c:kill() - end, - { description = - "Close focused window", - group = - "Window keybinds" } - ), - -- Toggle floating mode on focused window - awful.key( - { modkey, conkey }, - "space", - awful.client.floating.toggle, - { description = - "Toggle floating mode on focused window", - group = - "Window keybinds" - } - ), - -- Move focused window to master - awful.key( - { modkey, conkey }, - "Return", - function (c) - c:swap( - awful.client.getmaster() - ) - end, - { description = - "Move focused window to master", - group = - "Window keybinds" - } - ), - -- Move focused window to the other screen - awful.key( - { modkey }, - "o", - function (c) - c:move_to_screen() - end, - { description = - "Move focused window to the next screen", - group = - "Window keybinds" - } - ), - -- Toggle focused window to be on top - awful.key( - { modkey }, - "t", - function (c) - c.ontop = not c.ontop - end, - { description = - "Toggle keep on top for focused window", - group = - "Window keybinds" - } - ), - -- Jump to urgent window - awful.key( - { modkey }, - "u", - awful.client.urgent.jumpto, - { description = - "Quickly jump to urgent window", - group = - "Window keybinds" - } - ), - } - ) - end -) ---[[ ]]-- - ---[[ Quick keybinds ]] -awful.keyboard.append_global_keybindings( - { - -- Volume - awful.key( - { }, - "XF86AudioRaiseVolume", - function() - awful.spawn("pamixer -i 5") - end, - { description = - "Increase volume by +5%", - group = - "Quick keybinds" - } - ), - awful.key( - { }, - "XF86AudioLowerVolume", - function() - awful.spawn("pamixer -d 5") - end, - { description = - "Decrease volume by +5%", - group = - "Quick keybinds" - } - ), - awful.key( - { }, - "XF86AudioMute", - function() - awful.spawn("pamixer -t") - end, - { description = - "Mute volume", - group = - "Quick keybinds" - } - ), - awful.key( - { }, - "XF86AudioMicMute", - function() - awful.spawn("pamixer --default-source -t") - end, - { description = - "Mute microphone", - group = - "Quick keybinds" - } - ), - -- Brightness - awful.key( - { }, - "XF86MonBrightnessUp", - function () - awful.spawn("xbacklight -inc 10") - end, - { description = - "Increase brightness by +10%", - group = - "Quick keybinds" - } - ), - awful.key( - { }, - "XF86MonBrightnessDown", - function () - awful.spawn("xbacklight -dec 10") - end, - { description = - "Decrease brightness by +10%", - group = - "Quick keybinds" - } - ), - -- Display configuration - awful.key( - { }, - "XF86Display", - function () - awful.spawn("arandr") - end, - { description = - "Configure the display using arandr", - group = "Quick keybinds" - } - ), - -- Apps (Super + a followed by KEY) - awful.key( - { modkey }, - "a", - function() - local grabber - grabber = - awful.keygrabber.run( - function(_, key, event) - if event == "release" then - return - end - if key == "1" then - awful.util.spawn(apps.editor) -- TAG 1 - elseif key == "2" then - awful.util.spawn(apps.file) -- TAG 2 - elseif key == "3" then - awful.util.spawn(apps.browser) -- TAG 3 - elseif key == "4" then - awful.util.spawn(apps.chat) -- TAG 4 - elseif key == "5" then - awful.util.spawn(apps.music) -- TAG 5 - elseif key == "8" then - awful.util.spawn(apps.office) -- TAG 8 - elseif key == "9" then - awful.util.spawn(apps.game) -- TAG 9 - end - awful.keygrabber.stop(grabber) - end - ) - end, - { description = - "Launch apps with {Super + a} keychord and then numbers from {1 to 9}", - group = - "Quick keybinds" - } - ), - -- Keyboard layouts (Super + x followed by KEY) - awful.key( - { modkey }, - "x", - function() - local grabber - grabber = - awful.keygrabber.run( - function(_, key, event) - if event == "release" then - return - end - if key == "e" then - awful.util.spawn("setxkbmap es") - elseif key == "u" then - awful.util.spawn("setxkbmap us") - end - awful.keygrabber.stop(grabber) - end - ) - end, - { description = - "Change keyboard layout with {Super + x} keychord and then {e} for spanish and {u} for english", - group = - "Quick keybinds" - } - ), - -- Runners (Super + p followed by KEY) - awful.key( - { modkey }, - "p", - function() - local grabber - grabber = - awful.keygrabber.run( - function(_, key, event) - if event == "release" then - return - end - if key == "d" then - awful.util.spawn(apps.drunner) - elseif key == "r" then - awful.util.spawn(apps.runner) - elseif key == "q" then - awful.spawn.with_shell(apps.runner_power) - elseif key == "i" then - awful.spawn.with_shell(apps.runner_wifi) - elseif key == "s" then - awful.spawn.with_shell(apps.runner_scrot) - elseif key == "z" then - awful.spawn.with_shell(apps.runner_emoji) - elseif key == "w" then - awful.spawn.with_shell(apps.runner_wall) - end - awful.keygrabber.stop(grabber) - end - ) - end, - { description = - "Launch quick action menus with {Super + p} keychord and then {d, r, e, q, i, b, s, z, w}", - group = - "Quick keybinds" } - ), - -- Multimedia scripts (Super + t followed by KEY) - awful.key( - { modkey }, - "t", - function() - local grabber - grabber = - awful.keygrabber.run( - function(_, key, event) - if event == "release" then - return - end - if key == "y" then - awful.util.spawn(apps.ytfzf) - elseif key == "y" then - awful.util.spawn(apps.ytfzf_music) - elseif key == "a" then - awful.util.spawn(apps.ani_cli) - elseif key == "f" then - awful.util.spawn(apps.flix_cli) - elseif key == "t" then - awful.util.spawn(apps.tut) - elseif key == "n" then - awful.util.spawn(apps.newsboat) - end - awful.keygrabber.stop(grabber) - end - ) - end, - { description = - "Launch multimedia terminal scripts with {Super + t} and then {m, y, a, f}", - group = - "Quick keybinds" - } - ), - } -) ---[[ ]] - diff --git a/user/.config/awesome/keymaps/mouse.lua b/user/.config/awesome/keymaps/mouse.lua deleted file mode 100644 index 12631c7ea..000000000 --- a/user/.config/awesome/keymaps/mouse.lua +++ /dev/null @@ -1,52 +0,0 @@ -local awful = require("awful") --- Window related mouse bindings -client.connect_signal( - "request::default_mousebindings", - function() - awful.mouse.append_client_mousebindings( - { - awful.button( - { }, - 1, - function(c) - c:activate {context = "mouse_click"} - end - ), - awful.button( - { modkey }, - 1, - function(c) - c:activate {context = "mouse_click", action = "mouse_move"} - end - ), - awful.button( - { modkey }, - 3, - function(c) - c:activate {context = "mouse_click", action = "mouse_resize"} - end - ) - } - ) - end -) --- Mouse bindings on desktop -awful.mouse.append_global_mousebindings( - { - awful.button( - { }, - 4, - awful.tag.viewprev - ), - awful.button( - { }, - 5, - awful.tag.viewnext - ) - } -) - --- Enable sloppy focus, so that focus follows mouse. -client.connect_signal("mouse::enter", function(c) - c:emit_signal("request::activate", "mouse_enter", {raise = false}) -end) diff --git a/user/.config/awesome/modules/custom-layouts/centerwork.lua b/user/.config/awesome/modules/custom-layouts/centerwork.lua deleted file mode 100644 index 42ea6f4b2..000000000 --- a/user/.config/awesome/modules/custom-layouts/centerwork.lua +++ /dev/null @@ -1,264 +0,0 @@ -local floor = math.floor -local max = math.max -local mouse = mouse -local mousegrabber = mousegrabber -local screen = screen - -local centerwork = { - name = "centerwork", - horizontal = { name = "centerworkh" } -} - -local function arrange(p, layout) - local t = p.tag or screen[p.screen].selected_tag - local wa = p.workarea - local cls = p.clients - - if #cls == 0 then return end - - local g = {} - - -- Main column, fixed width and height - local mwfact = t.master_width_factor - local mainhei = floor(wa.height * mwfact) - local mainwid = floor(wa.width * mwfact) - local slavewid = wa.width - mainwid - local slaveLwid = floor(slavewid / 2) - local slaveRwid = slavewid - slaveLwid - local slavehei = wa.height - mainhei - local slaveThei = floor(slavehei / 2) - local slaveBhei = slavehei - slaveThei - local nbrFirstSlaves = floor(#cls / 2) - local nbrSecondSlaves = floor((#cls - 1) / 2) - - local slaveFirstDim, slaveSecondDim = 0, 0 - - if layout.name == "centerwork" then -- vertical - if nbrFirstSlaves > 0 then slaveFirstDim = floor(wa.height / nbrFirstSlaves) end - if nbrSecondSlaves > 0 then slaveSecondDim = floor(wa.height / nbrSecondSlaves) end - - g.height = wa.height - g.width = mainwid - - g.x = wa.x + slaveLwid - g.y = wa.y - else -- horizontal - if nbrFirstSlaves > 0 then slaveFirstDim = floor(wa.width / nbrFirstSlaves) end - if nbrSecondSlaves > 0 then slaveSecondDim = floor(wa.width / nbrSecondSlaves) end - - g.height = mainhei - g.width = wa.width - - g.x = wa.x - g.y = wa.y + slaveThei - end - - g.width = max(g.width, 1) - g.height = max(g.height, 1) - - p.geometries[cls[1]] = g - - -- Auxiliary clients - if #cls <= 1 then return end - for i = 2, #cls do - g = {} - local idxChecker, dimToAssign - - local rowIndex = floor(i/2) - - if layout.name == "centerwork" then - if i % 2 == 0 then -- left slave - g.x = wa.x - g.y = wa.y + (rowIndex - 1) * slaveFirstDim - g.width = slaveLwid - - idxChecker, dimToAssign = nbrFirstSlaves, slaveFirstDim - else -- right slave - g.x = wa.x + slaveLwid + mainwid - g.y = wa.y + (rowIndex - 1) * slaveSecondDim - g.width = slaveRwid - - idxChecker, dimToAssign = nbrSecondSlaves, slaveSecondDim - end - - -- if last slave in row, use remaining space for it - if rowIndex == idxChecker then - g.height = wa.y + wa.height - g.y - else - g.height = dimToAssign - end - else - if i % 2 == 0 then -- top slave - g.x = wa.x + (rowIndex - 1) * slaveFirstDim - g.y = wa.y - g.height = slaveThei - - idxChecker, dimToAssign = nbrFirstSlaves, slaveFirstDim - else -- bottom slave - g.x = wa.x + (rowIndex - 1) * slaveSecondDim - g.y = wa.y + slaveThei + mainhei - g.height = slaveBhei - - idxChecker, dimToAssign = nbrSecondSlaves, slaveSecondDim - end - - -- if last slave in row, use remaining space for it - if rowIndex == idxChecker then - g.width = wa.x + wa.width - g.x - else - g.width = dimToAssign - end - end - - g.width = max(g.width, 1) - g.height = max(g.height, 1) - - p.geometries[cls[i]] = g - end -end - -local function mouse_resize_handler(c, _, _, _, orientation) - local wa = c.screen.workarea - local mwfact = c.screen.selected_tag.master_width_factor - local g = c:geometry() - local offset = 0 - local cursor = "cross" - - local corner_coords - - if orientation == 'vertical' then - if g.height + 15 >= wa.height then - offset = g.height * .5 - cursor = "sb_h_double_arrow" - elseif g.y + g.height + 15 <= wa.y + wa.height then - offset = g.height - end - corner_coords = { x = wa.x + wa.width * (1 - mwfact) / 2, y = g.y + offset } - else - if g.width + 15 >= wa.width then - offset = g.width * .5 - cursor = "sb_v_double_arrow" - elseif g.x + g.width + 15 <= wa.x + wa.width then - offset = g.width - end - corner_coords = { y = wa.y + wa.height * (1 - mwfact) / 2, x = g.x + offset } - end - - mouse.coords(corner_coords) - - local prev_coords = {} - - mousegrabber.run(function(m) - if not c.valid then return false end - for _, v in ipairs(m.buttons) do - if v then - prev_coords = { x = m.x, y = m.y } - local new_mwfact - if orientation == 'vertical' then - new_mwfact = 1 - (m.x - wa.x) / wa.width * 2 - else - new_mwfact = 1 - (m.y - wa.y) / wa.height * 2 - end - c.screen.selected_tag.master_width_factor = math.min(math.max(new_mwfact, 0.01), 0.99) - return true - end - end - return prev_coords.x == m.x and prev_coords.y == m.y - end, cursor) -end - -function centerwork.arrange(p) - return arrange(p, centerwork) -end - -function centerwork.horizontal.arrange(p) - return arrange(p, centerwork.horizontal) -end - -function centerwork.mouse_resize_handler(c, corner, x, y) - return mouse_resize_handler(c, corner, x, y, 'vertical') -end - -function centerwork.horizontal.mouse_resize_handler(c, corner, x, y) - return mouse_resize_handler(c, corner, x, y, 'horizontal') -end - - ---[[ -Make focus.byidx and swap.byidx behave more consistently with other layouts. ---]] - -local awful = require("awful") -local gears = require("gears") -local client = client - -local function compare_position(a, b) - if a.x == b.x then - return a.y < b.y - else - return a.x < b.x - end -end - -local function clients_by_position() - local this = client.focus - if this then - local sorted = {} - for _, c in ipairs(client.focus.first_tag:clients()) do - if not c.minimized then sorted[#sorted+1] = c end - end - table.sort(sorted, compare_position) - - local idx = 0 - for i, that in ipairs(sorted) do - if this.window == that.window then - idx = i - end - end - - if idx > 0 then - return { sorted = sorted, idx = idx } - end - end - return {} -end - -local function in_centerwork() - return client.focus and client.focus.first_tag.layout.name == "centerwork" -end - -centerwork.focus = {} - - ---[[ -Drop in replacements for awful.client.focus.byidx and awful.client.swap.byidx -that behaves consistently with other layouts. ---]] - -function centerwork.focus.byidx(i) - if in_centerwork() then - local cls = clients_by_position() - if cls.idx then - local target = cls.sorted[gears.math.cycle(#cls.sorted, cls.idx + i)] - awful.client.focus.byidx(0, target) - end - else - awful.client.focus.byidx(i) - end -end - -centerwork.swap = {} - -function centerwork.swap.byidx(i) - if in_centerwork() then - local cls = clients_by_position() - if cls.idx then - local target = cls.sorted[gears.math.cycle(#cls.sorted, cls.idx + i)] - client.focus:swap(target) - end - else - awful.client.swap.byidx(i) - end -end - -return centerwork diff --git a/user/.config/awesome/rc.lua b/user/.config/awesome/rc.lua deleted file mode 100644 index 5008444a6..000000000 --- a/user/.config/awesome/rc.lua +++ /dev/null @@ -1,12 +0,0 @@ --- Imports -local beautiful = require("beautiful") -beautiful.init(string.format("%s/.config/awesome/ui/theme.lua", os.getenv("HOME"))) -- Selected theme -require("helpers") -- Some aditional code for handling -require("apps") -- Selected apps & scripts -require("ui.layouts") -- Predifined tiling layouts -require("ui.bar") -- The bar on the top -require("ui.notif") -- The notification manager -require("keymaps.keyboard") -- Keyboard shortcuts -require("keymaps.mouse") -- Mouse shortcuts -require("ui.rules") -- Window manager rules -require("autostart") -- Startup applications diff --git a/user/.config/awesome/ui/bar.lua b/user/.config/awesome/ui/bar.lua deleted file mode 100644 index 1ffb3b471..000000000 --- a/user/.config/awesome/ui/bar.lua +++ /dev/null @@ -1,224 +0,0 @@ ---- {{{ Imports -local wibox = require("wibox") -local gears = require("gears") -local awful = require("awful") -local theme = require("ui.theme") --- Textclock widget -local mytextclock = wibox.widget.textclock() -screen.connect_signal("request::desktop_decoration", function(s) --- Tag names for each screen - awful.tag( - { - "ï„Ą", -- EDITOR - "", -- FILE MANAGER - "󰖟", -- WEB BROWSER - "󰻞", -- CHAT - "ó°Čč", -- MUSIC - "", -- VIDEO - "ó°§°", -- IMAGE/EDIT TOOLS - "󰧟", -- OFFICE - "󰞶" -- GAMES - }, - s, - awful.layout.layouts[1] - ) - --- Layoutbox widget - s.mylayoutbox = { - widget = wibox.container.background, - bg = theme.bg_normal, - shape = gears.shape.circle, - awful.widget.layoutbox { - screen = s, - buttons = { - awful.button( - { }, - 1, - function () - awful.layout.inc(1) - end - ), - awful.button( - { }, - 3, - function () - awful.layout.inc(-1) - end - ), - awful.button( - { }, - 4, - function () - awful.layout.inc(-1) - end - ), - awful.button( - { }, - 5, - function () - awful.layout.inc(1) - end - ), - } - } - } - --- Taglist widget - s.mytaglist = { - widget = wibox.container.background, - bg = theme.taglist_bg, - shape = gears.shape.rounded_rect, - awful.widget.taglist { - screen = s, - filter = awful.widget.taglist.filter.all, - buttons = { - awful.button( - { }, - 1, - function(t) - t:view_only() - end - ), - awful.button( - { modkey }, - 1, - function(t) - if client.focus then - client.focus:move_to_tag(t) - end - end - ), - awful.button( - { }, - 3, - awful.tag.viewtoggle - ), - awful.button( - { modkey }, - 3, - function(t) - if client.focus then - client.focus:toggle_tag(t) - end - end - ), - awful.button( - { }, - 4, - function(t) - awful.tag.viewprev(t.screen) - end - ), - awful.button( - { }, - 5, - function(t) - awful.tag.viewnext(t.screen) - end - ), - } - } - } - --- Prepare custom widgets - -- Volume widget - s.volume = - awful.widget.watch( - ".config/awesome/ui/widgets/volume", - 1 -- Update time in seconds - ) - -- Battery widget - s.battery = - awful.widget.watch( - ".config/awesome/ui/widgets/battery", - 10 -- update time in seconds - ) - -- Wifi widget - s.wifi = - awful.widget.watch( - ".config/awesome/ui/widgets/wifi", - 10 -- Update time in seconds - ) - -- Brightness widget - s.brightness = - awful.widget.watch( - ".config/awesome/ui/widgets/brightness", - 1 -- Update time in seconds - ) - -- Keyboard layout widget - s.layout = - awful.widget.watch( - ".config/awesome/ui/widgets/layout", - 1 -- Update time in seconds - ) - --- Prepare custom widgets container - local custom_widget_container = { - -- Keyboard layout widget - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_one), - wibox.container.background(s.layout, theme.bar_bg_one), - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_one), - -- Volume widget - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_two), - wibox.container.background(s.volume, theme.bar_bg_two), - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_two), - -- Brightness widget - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_tre), - wibox.container.background(s.brightness, theme.bar_bg_tre), - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_tre), - -- Battery widget - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_for), - wibox.container.background(s.battery, theme.bar_bg_for), - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_for), - -- Wifi widget - wibox.container.background(wibox.widget.textbox(" "), theme.bar_bg_fiv), - wibox.container.background(s.wifi, theme.bar_bg_fiv), - layout = wibox.layout.fixed.horizontal, - } - --- Main right widget container with pill shape - local right_widgets = { - custom_widget_container, - widget = wibox.container.background, - shape = gears.shape.rounded_rect, - } - --- Wibar - s.mywibox = awful.wibar { - position = "top", - height = (30), - border_width = (10), - border_color = theme.bg_normal, - screen = s, - widget = { - layout = wibox.layout.stack, - { - layout = wibox.layout.align.horizontal, - { - -- [[ Left widgets ]] - layout = wibox.layout.fixed.horizontal, - -- Layoubox widget - s.mylayoutbox, - wibox.container.background(wibox.widget.textbox(" "), theme.bg_normal), - -- Taglist widget - s.mytaglist, - }, - nil, - { - -- [[ Right widgets ]] - layout = wibox.layout.fixed.horizontal, - right_widgets - }, - }, - { - -- [[ Center widgets ]] - -- Clock widget - wibox.container.background(mytextclock, theme.bar_clock, gears.shape.rounded_rect), - valign = "center", - halign = "center", - layout = wibox.container.place, - } - } - } - end -) diff --git a/user/.config/awesome/ui/icons/centerworkw.png b/user/.config/awesome/ui/icons/centerworkw.png deleted file mode 100644 index 1a97b25a979b0697565ac1e210bf1221d1514090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7>o-U3d6?5Ls-s{C2DB!lg zv&)bxD^q=vS*u1Si|(2?IXODD+VRR$eYqS1E`*7&Y!qeDu5Zda<|Ne2aZ{#yI| z;>0q3_Pm`FXRb0bjcQ1%`cP2y^IGVWUpIO~?48_i&+a{U{@v@1PVE1m{4oD(b2Ib2 zJm0a+tM5fkbPZp4v~acJ-TgYI+rG_u#mlU*SvPaxo#R(0U6HiB8J@Ls%O91F8?v(Y zAzQL8t@66_Vv5+qOi3qvpS1tt?d2kr~>5#V8NDTyt5zInyb zx9c}|pVXYH9Q1tgXP^34ZVR6m-L5pB{q^|!??2vu%=*l_BFS=rOYq#2z^GvGboFyt I=akR{077)NumAu6 diff --git a/user/.config/awesome/ui/icons/cornerne.png b/user/.config/awesome/ui/icons/cornerne.png deleted file mode 100644 index c85bd56a3ccc2cd058c1ebdaeb9d7a8fb683b644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$CC=?c6u53@F4O;1l8sq;qp~&CJY{l$4%5d)D%1Z97nixg^Lhm|^yBr!{+K z1G$Vz-tI0e{TVj{ft(6Y7sn8f<8P;2D!DgUFQ zvtokxOW{S2gWicwl|Halckd!E=67*gS`Folk<++O?22{RB0Pi7@^9K5=Q~SScPO$I zW*k+>%syR_E9zh+d2j;LhJU^DH%s06&tS8w+3n&B{iwaM>cVFjj=J9!-3W98gQu&X J%Q~loCIF4@UM2tl diff --git a/user/.config/awesome/ui/icons/cornernew.png b/user/.config/awesome/ui/icons/cornernew.png deleted file mode 100644 index c3fd98618746b81cb7940ac9088bd53cc4f18967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$CEW^7X}TZ=eu=fKP}kkY2H3g_4re#ful8J$p8xPa9+=Q%R6tFvEej-}yU$ zJjNt%cNeBK?wS-Jr_$5KF~p?6*E#@GHO2;#GlO*PXD5)2AA80v*BN>FVdQ I&MBb@04)MuU;qFB diff --git a/user/.config/awesome/ui/icons/cornernw.png b/user/.config/awesome/ui/icons/cornernw.png deleted file mode 100644 index dfe78b3da94de0befd857e47a253647df611d6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$CE$9Po%w0Vu>D;1l8sq;qp~&CJY{l$4%5d)D%1Z97nixg^Lhm|^yBr!{+K z1G$Vz-tI0e{TVj{ft-9#7sn8fbnQLB)w7Xd#)}nA z2NyIXq$s+Ym$7;z91syGd6F?p#)<32Y_*NzNi5xtkG%YAxHj%+tzmWIn679zQA9)e yPur0rV&V}qlsy^0H8^=qzR^4@q2#h41H+^LjFlfYZ!rK`&EV>}Vp2D^ r&Y6iz7^)o5Too+pxq3fu6{1-oD!M<`?yVv diff --git a/user/.config/awesome/ui/icons/cornerse.png b/user/.config/awesome/ui/icons/cornerse.png deleted file mode 100644 index 023ae79ad454e06284a5c7aa0cc429d3baf16c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$CDr#s9ob11Q8F;1l8sq;qm|l$4ar%*>uWdsZo0kN^~7DhcunX1JcG(&Z22 zF(!GtyRh_U+zbSA3O!vMLp+WrCrF4mcyMy?EHq&g=IC+oN!92*$il=S?Y7w1eI8R2 zW2^Csi9Cn-G{O~HHuQFsG;#%Ol}ywMIQB>^#9s;wQHC1ea37z{MmJ~$Pjeh+9lgQu&X%Q~loCIDN5N(cY| diff --git a/user/.config/awesome/ui/icons/cornersew.png b/user/.config/awesome/ui/icons/cornersew.png deleted file mode 100644 index f7cfa1c0db222304f9d880c023601c576fd5e040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$CDrTxM<80~F#9@Ck7R(koW1P*PI5c=6)1XU`_|X@ksUDhcunW;pQnJAVg| z$C%{p?!uJDU6TUj6neTihIkxLPLL3BIKs-ov(SW1n8U}xCtaiWAPW_56RBi3pEFojSz;MPdY~mqR<8MIA89ZJ6T-G@yGywpICQY0G diff --git a/user/.config/awesome/ui/icons/cornersw.png b/user/.config/awesome/ui/icons/cornersw.png deleted file mode 100644 index c1453c9fd005d78c90ca4021c97ff7a6be40bfcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e&H|6fVxatW5N34Jm|X!BWH0gb zb!ETLD$6gx!IgE>3@F4O;1l8sq;qm|l$4ar%*>uWdsZo0kN^~7DhcunX1JcG(&Z22 zF(!GtyRh_U+zbSA3OrpLLp+YZof62!pvd8}+gUvz|H5DX?E$(y78m@lZ2G!SMNXn` z#wGO=wPwJ~P-p(1|6&#G~0 yWvlHWgEfhFxWnGPd*aVpcSJ#_j!p61Tbp%GYjv0{uI~Wa&EVC;4o;^Fa;`B725K~EzUogWn`(It9 zKpta~x4R2d8h1?!kW=XC;uzx5`F6@dP6kCDmbVAPaukmI%NDX}<&FGMykf;?E~5z# z+FCZS8rFB{FXdXfca{EDuAR=OX0!YYRQRx-t@M^E$9@=QD@S+`Ag zYY6j?(BU~Ob<8&L={-L=tq;mFVdQ&MBb@01#$Z AEC2ui diff --git a/user/.config/awesome/ui/icons/dwindle.png b/user/.config/awesome/ui/icons/dwindle.png deleted file mode 100644 index 9902d22d9fe71e7fcb27ebb4dc6060e5d1bf6b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD?t0G|+7 zAgu@n%F4=0xPhwB%yOVoo{}KHUeVH?;Y4|>V5y~}6KPNpN c8ax1cTu7JkOv%?(R3)DDQp8<e zr8>M=riXfO(0aibc>LhKqv39jF9KOzSf+@t`_dqo$-IIgz3RXRwQF8)RVFd%r?5_5 g_~)d@LxTrEj|=HCo+mdKI;Vst02Qcz*8l(j diff --git a/user/.config/awesome/ui/icons/fairh.png b/user/.config/awesome/ui/icons/fairh.png deleted file mode 100644 index d41deead1ee2490ce0ada3a48c16a9a898535222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zAg!#dtb_r6|GT*ZD92tBE-?C@snutH7kHZHl8kyAs)w*6C^|qtdZeq+OWAn zLFSO=!E;PaMH&arNrf7$O3=_!nDHi5QO5nv8b>C#;_oY(0$C3ml`}K&>)WzVFDqRJ PG>5^{)z4*}Q$iB}b|yz_ diff --git a/user/.config/awesome/ui/icons/fairhw.png b/user/.config/awesome/ui/icons/fairhw.png deleted file mode 100644 index bb50e3ae13ecba910f0777618649b856f6408328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(82l#?!?y#N&8!f`rI{H8MO+8#Xs6 z$Q;rW0G|+7 zAg!#dtb_r6|GT*ZD92tBE-?C@snutH7kHZww^AIAs)w*6C^|qtdU`CGT7lD z(5DjAbda^FD5c?`Y^Z}jD~qzXsOJ&EW^0cF8M9=3Coj${3OSfD>j*PL%Qsv0xNA?< Qfd(;ny85}Sb4q9e0A;#IW&i*H diff --git a/user/.config/awesome/ui/icons/fairvw.png b/user/.config/awesome/ui/icons/fairvw.png deleted file mode 100644 index 4f4ed52219e33c9189a536b712b3cc82f277ff4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(82l*3-o?#N&8!f`rI{H8PA%20I)C z`c#6N4ze~Cr8FFr4R!EmWl{DP^*kcjZ0&I%W0s8X#j+S3j3^P6`0G|+7 zAgv4rO4z{SwStR5c9aD91vAKcdU`R)Q0)K! diff --git a/user/.config/awesome/ui/icons/floatingw.png b/user/.config/awesome/ui/icons/floatingw.png deleted file mode 100644 index 481589427960286e42e6c5c4e764e1222dccf10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>`0G|+7 zApP{|)8{bo3>BQ=6(|JRQ4-`A%pmLO<-P6E<0mbTVp4&Ek)AG&As)w*6C^|qB&&%9 z^ekB*G`lI&gDWkGbupKlXph!{UZx7Zql*)y6j_a5E@cR3WC~B{^K}%O#1zwz#M;v$ w(vhU0AdtG4t8Ge?*Pl@7Yg=ZTSZL)joT}LD)L)->8fXcFr>mdKI;Vst0H7CS?*IS* diff --git a/user/.config/awesome/ui/icons/fullscreen.png b/user/.config/awesome/ui/icons/fullscreen.png deleted file mode 100644 index d02f6fc339a93c92f0b238c89d1889d3da811381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 866 zcmV-o1D*VdP)lCcZQz;03CZsP%%N zFX}ho(MS2V;Ipwe=t2SiW42_n*)BVCrtNG!Cpjs-@=h`8S5d z%Md=Q#!;|cmtq6+mxXXC-tud^uJdYRzA^w$-t+D>*XoMjA6K`yDRNfws0E7+}LSGu)9``0l z;J0V+rtRX5B}n+C$XEzLh<`DZ6q!LuQYi4LB@leY8%vV%rpbBs-p1W0v_uR6a>!|N zry;UK##IyAXydgIdd?^SPD17fJ;A*V+r+zidK3VTLWbC=AhawkTwNCL-*u~ zK?r|z#k+c%6aY<;rjDxjSO^;AxNil%>2*A}=N*O={mgyGrjM@##Ux^OQ}&y@BE$gH s0Q~odrs@+4VP7P5^T9|qHa6M*0ydFz%Ff(hL;wH)07*qoM6N<$f+5&_C;$Ke diff --git a/user/.config/awesome/ui/icons/fullscreenw.png b/user/.config/awesome/ui/icons/fullscreenw.png deleted file mode 100644 index 5c35bfa8afe6c4f091f3895d92c50f845df52483..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 zcmV-n1D^beP)DEINg2jB%EarEGlDCI7^0NIKDE~nlw6Yw>-q|E}IwOrD#hdl~f3bJRyW_bzF)=YQ%_^13 zn{v5agdfb97ocr@BminSgW?D7L;-Lx%Ps)o0)Wly$Lsa_*?c~KahMm2#l>2!c9$IY z+$Q?yGXm~YAA|m=@33=IYCA(F92Hli(KyEj&}=r(j}X5;Veye6v|6nTYydRB4r@!7q6%bM ziB0J3K(Vs{U?8~^^3c>vKz6qa{}dD>B~CU5!OIC2uS3`fi1P{?07lZQzT+F}gh|Wu z_i;OX)ni5ae9guza9un0IicbMAz&7`!3N+s&drpF{|^EFO(jCN*Z?q)+{V51B_-l@ z2;Xrv+_5nT{($eL@Y$ar{FDU|0U!VbfB+Bx0zd!=00AHX1b_e#00O`WfR|#yo{dG( zxA@#np?Fs<08*GlI2*N+{);34=?eP>qa3T7+)$MVAfdsx= zf_IWG-dce~P>DRp9nPEjzSaW}p5D0C0^<2aR9h+t24(4p$lIzs9OEa0kCaYCww2?vM9cdB~x)0G|+7 zAg!jRrlO*v3L8SBlE>)0G|+7 zApQ99<0ns^Jbn7~ISf3*2JDrd=>S#pmIV0)Gf2zGdU|2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4b=pctzcxp`j&fO&(QQ6C>GkF+rq|wF-V;qT%Xi;A z$@3&v@g)BwpSCrIQb4eiVFT|2<^wSivl%mXGn`@ZtGl>NkD>UaFC!DPM{YNN!_42^ zcAYPb%o=ib#;5J;V@(LSP#$i=AZTmx<-RcIfiwEYW*kuz_nz@HQ0l-9iOZinJcJqi zgBap$)#tlQcrnZnxOiKO_kfGBBWnNy7&Rm?9%HzdJ?Fyo_qv-*7-rwzzRDx4hN0#) z=TZiNi=UPD@-iOiQ@$&5z@UCLH|v4Er#rG5-t@n3W-M@wkW`32%q@9f+I7CuY%fG> z?pIl{9c{FIQwqT6hGjm?|P5AJ5mZE_ElZT^0G>fMaK zgKa8K&o3@J?C=Q%(yQ$6qayO?wu2_WHwohM8h6A`XlY)WrHDX0xeW!iHnJ zpRSvtI^n0^zE$bPrFN5E?e^Pus(o^4e$z_l|0}-)F9^O+uHKbAVdnXm?24q%3`$nI ztL`0}#4(rQ#zmh1#zRaU|CX=Z7SN(;od2?aA~48*{$RCRx%I-Xea|lg2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4jwZ_m&7OIeW7A=9_Z| z?y;Kvo_O{gkEcKe5G-k$xt(zjv%v9VlVmmVXx4b(9RRfI-|p5hWY-EmNS1|NFDHTv2xuUD9G9Q z;v^?STAk+RA0|u<8@c@t$Q;N%YIxlzfKkK&j1ELKNH%O|6aNyqt;>YdKyad;>`5=l zhE0E2f*H=Q{&J12L4l)b(OgwwhQ}qL>D&%Y1u^CacKP+0GPnw8F)yjEFk@Eno$9=p z;f&3h9rvsnSQ77ZFc`-_kI7ecD9Yc>u&XqaPgjqFHcVj6un2)oY18 z|L@-X`b;9nQ>o-#t`^UONBg@Mu5>+mAvO5vhb<3_esDXi;T2>JV1S@(M!SC&QTzt0 ze%&pSmG?E>%KC__Ti)U;-;FCFcMJGy)#IC7M4q0F|Gs>4?|h~+cTQ&{f32}(JKy!~ zL(Dm5zseVH?;Y4|YH4ETUc-UaS>tnUB<;@-y)(9=rh^uTT#p6zJ jsU5!5EUpyKW5K}Csin)9_P(eI=nMu=S3j3^P6(R3)DDQp8<g zO?Ko2F&7FIRtmq^D<|;WLXNe9=@j>ydK<0@v1S2W3J)9XcYUlDw!GP+!WyAv8gZ5F oq~0iD6%>FVdQ&MBb@07`m(0ssI2 diff --git a/user/.config/awesome/ui/icons/tile.png b/user/.config/awesome/ui/icons/tile.png deleted file mode 100644 index 3ede21e8cf98ce00b16ced05213f7436c8dc6664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zAg!#dtb_r6|GT*ZD92tBE-?C@snutH7kHZ0iG_7As)w*6C^|qtdZeq+OWAn zLFSO=!E;PaMH&arNrf61aB;Xz(`tFxaVE*Zm`{4aY9^V?Ni6w&%i1rRSk6*&7hRyG k5V11RyHg{x=l~mdKI;Vst0FISWYybcN diff --git a/user/.config/awesome/ui/icons/tilebottom.png b/user/.config/awesome/ui/icons/tilebottom.png deleted file mode 100644 index 6f8c2570ae64d88453f888fadb1e6e20b4b7e531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zAg!#dtb_r6|GT*ZD92tBE-?C@snutH7kHZ{+=$5As)w*6C^|qtdUXYVAAF| zzIFl2ngufa5}^+9tSrjjqT88{ADpNlm}$ge&HeDK&>Nj44TsK2g*y0yW#|3du+i=E glNC)DO*%OlY~*!5=bHM@0UFKV>FVdQ&MBb@0B_1oUH||9 diff --git a/user/.config/awesome/ui/icons/tilebottomw.png b/user/.config/awesome/ui/icons/tilebottomw.png deleted file mode 100644 index a1de7b29fc3476f41d29ed09b6c87a6880aeb785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(82l-_yl0#N&8!f`rI{H8ScPOxhgB z*DhdLvp|MlBGe(Cl||WGbUV}WgA)}5GmSW`xgVYtdZV+X;m|p$PzQgo?7V*)Ho9GY gvZCptNhc?Rjl9n1TvPu!K%*HvUHx3vIVCg!0M2k+^#A|> diff --git a/user/.config/awesome/ui/icons/tileleft.png b/user/.config/awesome/ui/icons/tileleft.png deleted file mode 100644 index 31d6870477a706d765b66ebb3ac2f76ba2bbd0ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zAg!#dtb_r6|GT*ZD92tBE-?C@snutH7kHZfu1goAs)w*6C^|qtdZeq+OWAn zLFSO=!E;PaMH&arNrgK2v))+5;o7Lx^0woQQ(yz{g=ofYQ#@vwyI($>F-yjG@?tIz l&&e87rM8)LCh)Q`Fl5cw`Mk`lcR$c@22WQ%mvv4FO#m>2QJMe% diff --git a/user/.config/awesome/ui/icons/tileleftw.png b/user/.config/awesome/ui/icons/tileleftw.png deleted file mode 100644 index cf14c25e6dfcea21b1ce34e1a8e26da6d865f895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AaB z<<~)&(Me-=1yE43#5JNMI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD>W0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(80v(9^{+#N&8!f`rI{H8MO+8#Xs6 z$Q;r)HajO1YR}`BGVKD#z diff --git a/user/.config/awesome/ui/icons/tiletop.png b/user/.config/awesome/ui/icons/tiletop.png deleted file mode 100644 index f3a1e9d35e628b0ce88ad1ecd4ef71e0e0fd987a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5046 zcmeHLX;f3!77kcJC@2L{E1=gDiwc=zTQGm%^%(9%*W3W&Bi zR7I#Fj)?H$1d0?pLeaBVb^))fYGV`;~FSaOytLXx-P}T=wV!RPyjz?WxLbEj@-vApUO|qR5kBD)Beo0p}zUTodZKp z-!A&eMJV4?`dg7t)v?IHeX|$r583v3R$9({^TmD6-?{BCe?YTcwJRU~1RBJ-r8$|y zXNoGAmkw#3^o{5$j@c)>=ep+JxqaVh#*x93B~1r=Kl_dMl_O=KXUU3)pUOH1ds0(l zFZ*X%gdYF%==8hci>ewU#cq#GMr`|>yFV{-T3EzBbBSo*COZD^(a`s|3>OfYOTNR_ zv@f$?5U|12f!nYLb;4;kqH4B#PtV{UkYb(C+K69P4P|CDqXVLAm+~YJ1E^>^V{USP zoW*BLZ~f6?$=@}9?E-So0@l?z-2v7No5HWQ6`#6tT$5^DYMRa!&0FW}*OIKIx&G;4 zA)QL1iq5sqbKX=rC1~?e`%Lf{QnXhTSV!D99FsE&Jl%g^?@V%)*w- zdcHVap~HXg?)kNKd5;?#W*(QfYHu8kX*9h#HF)-%-Sh!BZ9cOByU^O}xi|aCN&QCQ z-Qs&u%e&sU?hRbtm{kD(B1nMR@^OKmU z%=34$*8i}*4;r*BkLgc$@LEo`!e{KPe3q3~ z^Ol#lV?qAR^+#%7EXziszVm8+9szp}cSsWeoL5b#mXNi4%$w$E> zS7XAXH*|6veQNb-{y{c{hjOfEBJcU0TA7{U{OJ1HA@iteJ~<=GA*Op@pv7G2y%{6s z)s^Qpc3m4nsb=S@**C6JZCa*ow7>prX<~kx#Sb5wl|I>0Et-1FOHc-%d;HF=v(`~j z?l3x|;(L?fgI2A(*MAcn_VvTGLB{Ygt6NELO(s!DoY+LWGPEd=rltDGY)9R2me5$uOBp^4DRBbmCG=$WtSgaYOk5V-(Ko~ONVUQpeQ>cwz zKzIG!RpoBs$UnNN}geTzhh=%#OQk4Xga*ZD) zC@Q0IWH1S3qY@I#mZBs!Q_3PS7z~&NqYM^P#+XDUP-<~RDM1ZXfSim09=aH2%OqkJ z31uK`63k>sNQhX!(2xT%{4IRB|5C5E5kYoER2@?IcBTgpc4TAf?jjTq=u8=ZNT3 zE*0j|sIF9CnS@tKFObz%@D~i9?jJDCizzsB!T(70TYk}WX*Z)l}%a_L~R0)0sC4s}zv{PSB0S7HJ@$x`EA)io9xZNaK zVgf7{>Yz1Ra5}qZxJ`T)9nb-zIW7?ToA;PG*}gU7+ihFJfvHiz_YvvZ9<}JL(?e!% zxjnx*#GyIfCcMetajTiRUZ3l|AUiquM#RouX1>j*?z!iB^M1@I{rQHVR4`q2$h omHI{3A04<$W0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(80vz|+Ms#N&8!f`rI{H8MO+8#Xs6 z$Q;rW0G|+7 zApIN$o*{vQ7k^g)<=9Jt{DK)gy}TbieiCiIW(80vz|+Ms#N&8!f`rI{H8MO+8#Xs6 z$Q;r&1)" in - "Full") status="󱊣" ;; - "Discharging") status="󱊹" ;; - "Charging") status="󱊄" ;; - "Not charging") status="󱊄" ;; - "Unknown") status="󰂎" ;; - *) exit 1 ;; - esac - capacity="$(cat "$battery/capacity" 2>&1)" - # Will make a warn variable if discharging and low - [ "$status" = "󰂎" ] && [ "$capacity" -le 100 ] && warn="" - # Prints the info - printf "%s%s%d%%%s" "$status" "$warn " "$capacity" "$pwr"; unset warn -done && printf "\\n" diff --git a/user/.config/awesome/ui/widgets/brightness b/user/.config/awesome/ui/widgets/brightness deleted file mode 100755 index 64ad5d95f..000000000 --- a/user/.config/awesome/ui/widgets/brightness +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -brt=$(xbacklight -get) -if [ "$brt" = "100.000000" ]; then - icon="󰃠" -elif [ "$brt" \> "50%.*" ]; then - icon="󰃟" -elif [ "$brt" \< "49%.*" ]; then - icon="󰃞" -fi -echo "$icon ${brt%.*}%" diff --git a/user/.config/awesome/ui/widgets/layout b/user/.config/awesome/ui/widgets/layout deleted file mode 100755 index 09af16d43..000000000 --- a/user/.config/awesome/ui/widgets/layout +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -layout=$(setxkbmap -query | grep -oP 'layout:\s*\K\w+'); -echo "ó°„» $layout" | tr '[:lower:]' '[:upper:]'; diff --git a/user/.config/awesome/ui/widgets/volume b/user/.config/awesome/ui/widgets/volume deleted file mode 100755 index f4ae852c7..000000000 --- a/user/.config/awesome/ui/widgets/volume +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# Prints the current volume or 🔇 if muted. -[ "$(pamixer --get-mute)" = true ] && echo "󰕿x" && exit -vol="$(pamixer --get-volume)" -if [ "$vol" -gt "50" ]; then - icon="ó°•Ÿ" -elif [ "$vol" -gt "10" ]; then - icon="󰖀" -elif [ "$vol" -gt "0" ]; then - icon="󰕿" -else - echo "󰕿x" && exit -fi -echo -e "$icon $vol%" diff --git a/user/.config/awesome/ui/widgets/wifi b/user/.config/awesome/ui/widgets/wifi deleted file mode 100755 index 2051dae01..000000000 --- a/user/.config/awesome/ui/widgets/wifi +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -constate=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f3 | head -1) -currentwfi=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f4 | head -1) - -if [ "$constate" = "disconnected" ]; then - echo "󰀟 " -elif [ "$constate" = "connected" ]; then - echo "󰀄 $currentwfi" -else - echo "󰀟 " -fi diff --git a/user/.config/btop/btop.conf b/user/.config/btop/btop.conf index a13cdc93d..cf427fc49 100644 --- a/user/.config/btop/btop.conf +++ b/user/.config/btop/btop.conf @@ -209,4 +209,4 @@ selected_battery = "Auto" #* Set loglevel for "~/.config/btop/btop.log" levels are: "ERROR" "WARNING" "INFO" "DEBUG". #* The level set includes all lower levels, i.e. "DEBUG" will show all logging info. -log_level = "WARNING" \ No newline at end of file +log_level = "WARNING" diff --git a/user/.config/dunst/dunstrc b/user/.config/dunst/dunstrc index c4daec285..3cbe6d6f8 100644 --- a/user/.config/dunst/dunstrc +++ b/user/.config/dunst/dunstrc @@ -163,7 +163,7 @@ dmenu = /usr/bin/dmenu -p dunst: # Browser for opening urls in context menu. - browser = /usr/bin/qutebrowser + browser = /usr/bin/firefox # Always run rule-defined scripts, even if the notification is suppressed always_run_script = true @@ -356,3 +356,4 @@ # set_stack_tag = "volume" # # vim: ft=cfg + diff --git a/user/.config/fish/config.fish b/user/.config/fish/config.fish index 8dc49e000..979162e9a 100644 --- a/user/.config/fish/config.fish +++ b/user/.config/fish/config.fish @@ -12,10 +12,10 @@ set -e fish_user_paths set -U fish_user_paths $HOME/.bin $HOME/.local/bin $HOME/.config/emacs/bin $HOME/Applications /var/lib/flatpak/exports/bin/ $fish_user_paths ### EXPORT ### -set fish_greeting # Supresses fish's intro message -set TERM "xterm-256color" # Sets the terminal type -set EDITOR "lvim" # $EDITOR use lvim in terminal -set VISUAL "neovide --neovim-bin ./.local/bin/lvim" # $VISUAL use neovide for lvim in GUI mode +set fish_greeting # Supresses fish's intro message +set TERM "xterm-256color" # Sets the terminal type +set EDITOR "$HOME/.local/bin/lvim" +set VISUAL "wezterm start --class editor -- $HOME/.local/bin/lvim" ### SET BAT AS MANPAGER set -x MANPAGER "sh -c 'col -bx | bat -l man -p'" @@ -125,9 +125,8 @@ alias .3='cd ../../..' alias .4='cd ../../../..' alias .5='cd ../../../../..' -# vim and emacs -alias vim='lvim' -alias vimdiff='lvim -d' +# neovim as vim +alias vim="$HOME/.local/bin/lvim" # newsboat alias newsboat='newsboat -u ~/.config/newsboat/urls' @@ -135,6 +134,9 @@ alias newsboat='newsboat -u ~/.config/newsboat/urls' # bat as cat alias cat='bat' +# pfetch as neofetch +alias neofetch='pfetch' + # Changing "ls" to "exa" alias ls='exa -al --color=always --group-directories-first' # my preferred listing alias la='exa -a --color=always --group-directories-first' # all files and dirs @@ -142,16 +144,13 @@ alias ll='exa -l --color=always --group-directories-first' # long format alias lt='exa -aT --color=always --group-directories-first' # tree listing alias l.='exa -a | egrep "^\."' -# pacman and yay -alias pac-up='paru' # update the system -alias pac-get='paru -S' # install a program -alias pac-rmv='paru -Rcns' # remove a program -alias pac-rmv-sec='paru -R' # remove a program (secure way) -alias pac-qry='paru -Ss' # search for a program -alias pac-cln='paru -Scc && paru -Rns (pacman -Qtdq)' # clean cache & remove orphaned packages - -# neofetch is f***** slow -alias neofetch="pfetch" +# package management +alias pac-up='paru -Syu' +alias pac-get='paru -S' +alias pac-rmv='paru -Rcns' +alias pac-rmv-sec='paru -R' +alias pac-qry='paru -Ss' +alias pac-cln='paru -Scc && paru -Rns (pacman -Qtdq)' # Colorize grep output (good for log files) alias grep='grep --color=auto' @@ -159,15 +158,14 @@ alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' # file management +alias fm="vifm" +alias file="vifm" +alias flm="vifm" alias cp='cp -iv' alias mv='mv -iv' alias rm='rm -vI' alias mkd='mkdir -pv' alias mkdir='mkdir -pv' -alias fm='./.config/vifm/scripts/vifmrun' -alias vifm='./.config/vifm/scripts/vifmrun' -alias file='./.config/vifm/scripts/vifmrun' -alias flm='./.config/vifm/scripts/vifmrun' # audio alias mx='pulsemixer' diff --git a/new-config/.config/git/config b/user/.config/git/config similarity index 100% rename from new-config/.config/git/config rename to user/.config/git/config diff --git a/user/.config/gtk-2.0/gtkfilechooser.ini b/user/.config/gtk-2.0/gtkfilechooser.ini index 3de31bfd5..65fa2a6e5 100644 --- a/user/.config/gtk-2.0/gtkfilechooser.ini +++ b/user/.config/gtk-2.0/gtkfilechooser.ini @@ -4,8 +4,8 @@ ShowHidden=false ShowSizeColumn=true GeometryX=0 GeometryY=0 -GeometryWidth=780 -GeometryHeight=585 +GeometryWidth=772 +GeometryHeight=560 SortColumn=name SortOrder=ascending StartupMode=recent diff --git a/new-config/.config/gtk-2.0/gtkrc-2.0 b/user/.config/gtk-2.0/gtkrc-2.0 similarity index 100% rename from new-config/.config/gtk-2.0/gtkrc-2.0 rename to user/.config/gtk-2.0/gtkrc-2.0 diff --git a/user/.config/gtk-3.0/settings.ini b/user/.config/gtk-3.0/settings.ini index 756e8ceb2..7b4e43bc1 100644 --- a/user/.config/gtk-3.0/settings.ini +++ b/user/.config/gtk-3.0/settings.ini @@ -1,15 +1,17 @@ [Settings] gtk-theme-name=gruvbox-dark-gtk gtk-icon-theme-name=gruvbox-dark-icons-gtk -gtk-font-name=mononoki Nerd Font 10 +gtk-font-name=Cantarell 10 gtk-cursor-theme-name=Simp1e-Gruvbox-Dark -gtk-cursor-theme-size=0 +gtk-cursor-theme-size=24 gtk-toolbar-style=GTK_TOOLBAR_BOTH gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR gtk-button-images=1 gtk-menu-images=1 gtk-enable-event-sounds=1 -gtk-enable-input-feedback-sounds=1 +gtk-enable-input-feedback-sounds=0 gtk-xft-antialias=1 gtk-xft-hinting=1 -gtk-xft-hintstyle=hintfull +gtk-xft-hintstyle=hintslight +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1 diff --git a/user/.config/hilbish/init.lua b/user/.config/hilbish/init.lua deleted file mode 100644 index 0a5cc79d5..000000000 --- a/user/.config/hilbish/init.lua +++ /dev/null @@ -1,118 +0,0 @@ --- Default Hilbish config -local hilbish = require 'hilbish' -local lunacolors = require 'lunacolors' -local bait = require 'bait' -local ansikit = require 'ansikit' - -local function doPrompt(fail) - hilbish.prompt( - lunacolors.format( - '{yellow}%u {white}in {red}%h {white}in {italic}{blue}%d ' .. (fail and '{red}' or '{green}') .. ' ' - ) - ) -end - -doPrompt() - -bait.catch('command.exit', function(code) - doPrompt(code ~= 0) -end) - - -bait.catch( - 'hilbish.vimMode', - function(mode) - if mode ~= 'insert' then - ansikit.cursorStyle(ansikit.blockCursor) - else - ansikit.cursorStyle(ansikit.lineCursor) - end -end -) - -local aliases = { - cat = "bat", - vim = "lvim", - ls = 'exa -al --icons --color=always --group-directories-first', - la = 'exa -a --icons --color=always --group-directories-first', - ll = 'exa -l --icons --color=always --group-directories-first', - lt = 'exa -aT --icons --color=always --group-directories-first', - pkupd = 'paru -Syyu', - pkget = 'paru -S', - pkrmv = 'paru -Rcns', - pksrc = 'paru -Ss', - pkcln = 'paru -Scc', - tree = 'ls --tree', - grep = 'grep --color=auto', - egrep = 'egrep --color=auto', - fgrep = 'fgrep --color=auto', - neofetch = 'pfetch', - addup = 'git add -u', - addall = 'git add .', - branch = 'git branch', - checkout = 'git checkout', - clone = 'git clone', - commit = 'git commit -m', - fetch = 'git fetch', - pull = 'git pull origin', - push = 'git push origin', - stat = 'git status', - tag = 'git tag', - newtag = 'git tag -a', - df = 'df -h', - free = 'free -m', - newsboat = 'newsboat -u ~/.config/newsboat/urls', - fli = 'flix-cli', - ani = 'ani-cli', - aniq = 'ani-cli -q', - mx = 'pulsemixer', - amx = 'alsamixer', - mk = 'cmus', - ms = 'cmus', - music = 'cmus', - po = 'systemctl poweroff', - sp = 'systemctl suspend', - rb = 'systemctl reboot', - fm ='$HOME/.config/vifm/scripts/vifmrun', - file ='$HOME/.config/vifm/scripts/vifmrun', - flm = '$HOME/.config/vifm/scripts/vifmrun', - vifm = '$HOME/.config/vifm/scripts/vifmrun', - rm = 'rm -vI', - mv = 'mv -iv', - cp = 'cp -iv', - mkd = 'mkdir -pv', - psa = 'ps auxf', - psgrep = 'ps aux | grep -v grep | grep -i -e VSZ -e', - psmem = 'ps auxf | sort -nr -k 4', - pscpu = 'ps auxf | sort -nr -k 3', - yta_aac = 'yt-dlp --extract-audio --audio-format aac', - yta_best = 'yt-dlp --extract-audio --audio-format best', - yta_flac = 'yt-dlp --extract-audio --audio-format flac', - yta_m4a = 'yt-dlp --extract-audio --audio-format m4a', - yta_mp3 = 'yt-dlp --extract-audio --audio-format mp3', - yta_opus = 'yt-dlp --extract-audio --audio-format opus', - yta_vorbis = 'yt-dlp --extract-audio --audio-format vorbis', - yta_wav = 'yt-dlp --extract-audio --audio-format wav', - ytv_best = 'yt-dlp -f bestvideo+bestaudio', - yt = 'ytfzf -ftsl', - ytm = 'ytfzf -mts', - netstats = 'nmcli dev', - wfi = 'nmtui-connect', - wfi_scan = 'nmcli dev wifi rescan && nmcli dev wifi list', - wfi_edit = 'nmtui-edit', - wfi_on = 'nmcli radio wifi on', - wfi_off = 'nmcli radio wifi off', - blt = 'bluetoothct', -} - -local function load_table (table) - for cmd, new_cmd in pairs(table) do - hilbish.alias(cmd, new_cmd) - end -end - -local function load_aliases () - load_table(aliases) -end - -load_aliases() diff --git a/new-config/.config/hypr/hyprland.conf b/user/.config/hypr/hyprland.conf similarity index 99% rename from new-config/.config/hypr/hyprland.conf rename to user/.config/hypr/hyprland.conf index fcfdb6ee5..1ba75fe34 100644 --- a/new-config/.config/hypr/hyprland.conf +++ b/user/.config/hypr/hyprland.conf @@ -50,10 +50,10 @@ input { # GENERAL general { - gaps_in = 4 - gaps_out = 6 - border_size = 3 - col.active_border = rgb(cc241d) rgb(d79921) 45deg + gaps_in = 2 + gaps_out = 4 + border_size = 2 + col.active_border = rgb(cc241d) #rgb(d79921) 45deg col.inactive_border = rgb(504945) layout = master } @@ -84,7 +84,7 @@ animations { # window movement animation = windowsMove,1, 3,default,popin animation = border, 1, 2, linear - animation = borderangle, 1, 25, linear, loop + #animation = borderangle, 1, 25, linear, loop animation = fade, 1, 7, default animation = workspaces, 1, 4, default, slide } diff --git a/user/.config/lvim/config.lua b/user/.config/lvim/config.lua index b8219466b..99e347642 100644 --- a/user/.config/lvim/config.lua +++ b/user/.config/lvim/config.lua @@ -1,186 +1,75 @@ ---[[ -lvim is the global options object - -Linters should be -filled in as strings with either -a global executable or a path to -an executable -]] --- THESE ARE EXAMPLE CONFIGS FEEL FREE TO CHANGE TO WHATEVER YOU WANT +-- nvim options +vim.opt.shiftwidth = 2 +vim.opt.tabstop = 2 +vim.opt.relativenumber = true +vim.cmd('autocmd FileType markdown setlocal nospell') +vim.opt.wrap = true -- wrap lines +vim.opt.spell = false +vim.o.shell = '/usr/bin/bash' -- general -vim.opt.guifont = { "mononoki Nerd Font", ":h7" } -lvim.log.level = "warn" -lvim.format_on_save.enabled = false +lvim.use_icons = false +lvim.log.level = "info" +lvim.format_on_save = { + enabled = true, + pattern = "*.lua", + timeout = 1000, +} + +-- change theme settings lvim.colorscheme = "gruvbox" -lvim.transparent_window = false --- to disable icons and use a minimalist setup, uncomment the following --- lvim.use_icons = false - --- keymappings [view all the defaults by pressing Lk] -lvim.leader = "space" --- add your own keymapping -lvim.keys.normal_mode[""] = ":w" --- lvim.keys.normal_mode[""] = ":BufferLineCycleNext" --- lvim.keys.normal_mode[""] = ":BufferLineCyclePrev" --- unmap a default keymapping --- vim.keymap.del("n", "") --- override a default keymapping --- lvim.keys.normal_mode[""] = ":q" -- or vim.keymap.set("n", "", ":q" ) - --- Change Telescope navigation to use j and k for navigation and n and p for history in both input and normal mode. --- we use protected-mode (pcall) just in case the plugin wasn't loaded yet. --- local _, actions = pcall(require, "telescope.actions") --- lvim.builtin.telescope.defaults.mappings = { --- -- for input mode --- i = { --- [""] = actions.move_selection_next, --- [""] = actions.move_selection_previous, --- [""] = actions.cycle_history_next, --- [""] = actions.cycle_history_prev, --- }, --- -- for normal mode --- n = { --- [""] = actions.move_selection_next, --- [""] = actions.move_selection_previous, --- }, --- } - --- Change theme settings --- lvim.builtin.theme.options.dim_inactive = true --- lvim.builtin.theme.options.style = "storm" - --- Use which-key to add extra bindings with the leader-key prefix --- lvim.builtin.which_key.mappings["P"] = { "Telescope projects", "Projects" } --- lvim.builtin.which_key.mappings["t"] = { --- name = "+Trouble", --- r = { "Trouble lsp_references", "References" }, --- f = { "Trouble lsp_definitions", "Definitions" }, --- d = { "Trouble document_diagnostics", "Diagnostics" }, --- q = { "Trouble quickfix", "QuickFix" }, --- l = { "Trouble loclist", "LocationList" }, --- w = { "Trouble workspace_diagnostics", "Workspace Diagnostics" }, --- } - --- TODO: User Config for predefined plugins --- After changing plugin config exit and reopen LunarVim, Run :PackerInstall :PackerCompile +lvim.transparent_window = true lvim.builtin.alpha.active = true lvim.builtin.alpha.mode = "dashboard" lvim.builtin.terminal.active = true lvim.builtin.nvimtree.setup.view.side = "left" lvim.builtin.nvimtree.setup.renderer.icons.show.git = false --- if you don't want all the parsers change this to a table of the ones you want -lvim.builtin.treesitter.ensure_installed = { - "bash", - "c", - "javascript", - "json", - "lua", - "python", - "typescript", - "tsx", - "css", - "rust", - "java", - "yaml", - "toml", -} +-- automatically install missing parsers when entering buffer +lvim.builtin.treesitter.auto_install = true -lvim.builtin.treesitter.ignore_install = { "haskell" } -lvim.builtin.treesitter.highlight.enable = true - --- generic LSP settings - --- -- make sure server will always be installed even if the server is in skipped_servers list --- lvim.lsp.installer.setup.ensure_installed = { --- "sumneko_lua", --- "jsonls", --- } --- -- change UI setting of `LspInstallInfo` --- -- see --- lvim.lsp.installer.setup.ui.check_outdated_servers_on_open = false --- lvim.lsp.installer.setup.ui.border = "rounded" --- lvim.lsp.installer.setup.ui.keymaps = { --- uninstall_server = "d", --- toggle_server_expand = "o", --- } - --- ---@usage disable automatic installation of servers --- lvim.lsp.installer.setup.automatic_installation = false - --- ---configure a server manually. !!Requires `:LvimCacheReset` to take effect!! --- ---see the full default list `:lua print(vim.inspect(lvim.lsp.automatic_configuration.skipped_servers))` --- vim.list_extend(lvim.lsp.automatic_configuration.skipped_servers, { "pyright" }) --- local opts = {} -- check the lspconfig documentation for a list of all possible options --- require("lvim.lsp.manager").setup("pyright", opts) - --- ---remove a server from the skipped list, e.g. eslint, or emmet_ls. !!Requires `:LvimCacheReset` to take effect!! --- ---`:LvimInfo` lists which server(s) are skipped for the current filetype --- lvim.lsp.automatic_configuration.skipped_servers = vim.tbl_filter(function(server) --- return server ~= "emmet_ls" --- end, lvim.lsp.automatic_configuration.skipped_servers) - --- -- you can set a custom on_attach function that will be used for all the language servers --- -- See --- lvim.lsp.on_attach_callback = function(client, bufnr) --- local function buf_set_option(...) --- vim.api.nvim_buf_set_option(bufnr, ...) --- end --- --Enable completion triggered by --- buf_set_option("omnifunc", "v:lua.vim.lsp.omnifunc") --- end - --- -- set a formatter, this will override the language server formatting capabilities (if it exists) --- local formatters = require "lvim.lsp.null-ls.formatters" --- formatters.setup { --- { command = "black", filetypes = { "python" } }, --- { command = "isort", filetypes = { "python" } }, --- { --- -- each formatter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration --- command = "prettier", --- ---@usage arguments to pass to the formatter --- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}` --- extra_args = { "--print-with", "100" }, --- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports. --- filetypes = { "typescript", "typescriptreact" }, --- }, --- } - --- -- set additional linters --- local linters = require "lvim.lsp.null-ls.linters" --- linters.setup { --- { command = "flake8", filetypes = { "python" } }, --- { --- -- each linter accepts a list of options identical to https://github.com/jose-elias-alvarez/null-ls.nvim/blob/main/doc/BUILTINS.md#Configuration --- command = "shellcheck", --- ---@usage arguments to pass to the formatter --- -- these cannot contain whitespaces, options such as `--line-width 80` become either `{'--line-width', '80'}` or `{'--line-width=80'}` --- extra_args = { "--severity", "warning" }, --- }, --- { --- command = "codespell", --- ---@usage specify which filetypes to enable. By default a providers will attach to all the filetypes it supports. --- filetypes = { "javascript", "python" }, --- }, --- } - --- Additional Plugins +-- additional Plugins lvim.plugins = { - {"lunarvim/colorschemes"}, - {"ellisonleao/gruvbox.nvim"}, + { "lunarvim/colorschemes" }, + { "ellisonleao/gruvbox.nvim" }, + { "puremourning/vimspector" }, + { "OmniSharp/omnisharp-vim" }, + { "SirVer/ultisnips" }, + { "CRAG666/code_runner.nvim" }, } --- Autocommands (https://neovim.io/doc/user/autocmd.html) --- vim.api.nvim_create_autocmd("BufEnter", { --- pattern = { "*.json", "*.jsonc" }, --- -- enable wrap mode for json files only --- command = "setlocal wrap", --- }) --- vim.api.nvim_create_autocmd("FileType", { --- pattern = "zsh", --- callback = function() --- -- let treesitter use bash highlight for zsh files as well --- require("nvim-treesitter.highlight").attach(0, "bash") --- end, --- }) +-- vimspector options +vim.g.vimspector_enable_mappings = 'HUMAN' +vim.g.vimspector_enable_mappings_for_mode = { + [''] = { 'n', 'v' }, +} + +-- code runner options +require('code_runner').setup({ + filetype = { + java = { + "cd $dir &&", + "javac $fileName &&", + "java $fileNameWithoutExt" + }, + python = "python3 -u", + typescript = "deno run", + rust = { + "cd $dir &&", + "rustc $fileName &&", + "$dir/$fileNameWithoutExt" + }, + cs = function(...) + local root_dir = require("lspconfig").util.root_pattern "*.csproj" (vim.loop.cwd()) + return "cd " .. root_dir .. " && dotnet run$end" + end, + }, +}) + +vim.keymap.set('n', 'r', ':RunCode', { noremap = true, silent = false }) +vim.keymap.set('n', 'rf', ':RunFile', { noremap = true, silent = false }) +vim.keymap.set('n', 'rft', ':RunFile tab', { noremap = true, silent = false }) +vim.keymap.set('n', 'rp', ':RunProject', { noremap = true, silent = false }) +vim.keymap.set('n', 'rc', ':RunClose', { noremap = true, silent = false }) +vim.keymap.set('n', 'crf', ':CRFiletype', { noremap = true, silent = false }) +vim.keymap.set('n', 'crp', ':CRProjects', { noremap = true, silent = false }) diff --git a/user/.config/lvim/plugin/packer_compiled.lua b/user/.config/lvim/plugin/packer_compiled.lua deleted file mode 100644 index a96e96f5d..000000000 --- a/user/.config/lvim/plugin/packer_compiled.lua +++ /dev/null @@ -1,445 +0,0 @@ --- Automatically generated packer.nvim plugin loader code - -if vim.api.nvim_call_function('has', {'nvim-0.5'}) ~= 1 then - vim.api.nvim_command('echohl WarningMsg | echom "Invalid Neovim version for packer.nvim! | echohl None"') - return -end - -vim.api.nvim_command('packadd packer.nvim') - -local no_errors, error_msg = pcall(function() - -_G._packer = _G._packer or {} -_G._packer.inside_compile = true - -local time -local profile_info -local should_profile = false -if should_profile then - local hrtime = vim.loop.hrtime - profile_info = {} - time = function(chunk, start) - if start then - profile_info[chunk] = hrtime() - else - profile_info[chunk] = (hrtime() - profile_info[chunk]) / 1e6 - end - end -else - time = function(chunk, start) end -end - -local function save_profiles(threshold) - local sorted_times = {} - for chunk_name, time_taken in pairs(profile_info) do - sorted_times[#sorted_times + 1] = {chunk_name, time_taken} - end - table.sort(sorted_times, function(a, b) return a[2] > b[2] end) - local results = {} - for i, elem in ipairs(sorted_times) do - if not threshold or threshold and elem[2] > threshold then - results[i] = elem[1] .. ' took ' .. elem[2] .. 'ms' - end - end - if threshold then - table.insert(results, '(Only showing plugins that took longer than ' .. threshold .. ' ms ' .. 'to load)') - end - - _G._packer.profile_output = results -end - -time([[Luarocks path setup]], true) -local package_path_str = "/home/drk/.cache/lvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?.lua;/home/drk/.cache/lvim/packer_hererocks/2.1.0-beta3/share/lua/5.1/?/init.lua;/home/drk/.cache/lvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?.lua;/home/drk/.cache/lvim/packer_hererocks/2.1.0-beta3/lib/luarocks/rocks-5.1/?/init.lua" -local install_cpath_pattern = "/home/drk/.cache/lvim/packer_hererocks/2.1.0-beta3/lib/lua/5.1/?.so" -if not string.find(package.path, package_path_str, 1, true) then - package.path = package.path .. ';' .. package_path_str -end - -if not string.find(package.cpath, install_cpath_pattern, 1, true) then - package.cpath = package.cpath .. ';' .. install_cpath_pattern -end - -time([[Luarocks path setup]], false) -time([[try_loadstring definition]], true) -local function try_loadstring(s, component, name) - local success, result = pcall(loadstring(s), name, _G.packer_plugins[name]) - if not success then - vim.schedule(function() - vim.api.nvim_notify('packer.nvim: Error running ' .. component .. ' for ' .. name .. ': ' .. result, vim.log.levels.ERROR, {}) - end) - end - return result -end - -time([[try_loadstring definition]], false) -time([[Defining packer_plugins]], true) -_G.packer_plugins = { - ["Comment.nvim"] = { - config = { "\27LJ\2\n?\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\22lvim.core.comment\frequire\0" }, - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/Comment.nvim", - url = "https://github.com/numToStr/Comment.nvim" - }, - LuaSnip = { - config = { "\27LJ\2\nń\3\0\0\v\0\23\00166\0\0\0'\2\1\0B\0\2\0024\1\0\0006\2\2\0009\2\3\0029\2\4\0029\2\5\0029\2\6\2\15\0\2\0X\3\f€\21\2\1\0\22\2\0\0029\3\a\0006\5\b\0B\5\1\2'\6\t\0'\a\n\0'\b\v\0'\t\f\0'\n\r\0B\3\a\2<\3\2\0019\2\a\0006\4\14\0B\4\1\2'\5\15\0B\2\3\0029\3\16\0\18\5\2\0B\3\2\2\15\0\3\0X\4\3€\21\3\1\0\22\3\0\3<\2\3\0016\3\0\0'\5\17\0B\3\2\0029\3\18\3B\3\1\0016\3\0\0'\5\19\0B\3\2\0029\3\18\0035\5\20\0=\1\21\5B\3\2\0016\3\0\0'\5\22\0B\3\2\0029\3\18\3B\3\1\1K\0\1\0\"luasnip.loaders.from_snipmate\npaths\1\0\0 luasnip.loaders.from_vscode\14lazy_load\29luasnip.loaders.from_lua\17is_directory\rsnippets\19get_config_dir\22friendly-snippets\nstart\vpacker\tpack\tsite\20get_runtime_dir\15join_paths\22friendly_snippets\fsources\fluasnip\fbuiltin\tlvim\15lvim.utils\frequire\2\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/LuaSnip", - url = "https://github.com/L3MON4D3/LuaSnip" - }, - ["alpha-nvim"] = { - config = { "\27LJ\2\n=\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\20lvim.core.alpha\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/alpha-nvim", - url = "https://github.com/goolord/alpha-nvim" - }, - ["bufferline.nvim"] = { - config = { "\27LJ\2\nB\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\25lvim.core.bufferline\frequire\0" }, - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/bufferline.nvim", - url = "https://github.com/akinsho/bufferline.nvim" - }, - ["cmp-buffer"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/cmp-buffer", - url = "https://github.com/hrsh7th/cmp-buffer" - }, - ["cmp-nvim-lsp"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/cmp-nvim-lsp", - url = "https://github.com/hrsh7th/cmp-nvim-lsp" - }, - ["cmp-path"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/cmp-path", - url = "https://github.com/hrsh7th/cmp-path" - }, - cmp_luasnip = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/cmp_luasnip", - url = "https://github.com/saadparwaiz1/cmp_luasnip" - }, - colorschemes = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/colorschemes", - url = "https://github.com/lunarvim/colorschemes" - }, - ["friendly-snippets"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/friendly-snippets", - url = "https://github.com/rafamadriz/friendly-snippets" - }, - ["gitsigns.nvim"] = { - config = { "\27LJ\2\n@\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\23lvim.core.gitsigns\frequire\0" }, - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/gitsigns.nvim", - url = "https://github.com/lewis6991/gitsigns.nvim" - }, - ["gruvbox.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/gruvbox.nvim", - url = "https://github.com/ellisonleao/gruvbox.nvim" - }, - ["indent-blankline.nvim"] = { - config = { "\27LJ\2\nC\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\26lvim.core.indentlines\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/indent-blankline.nvim", - url = "https://github.com/lukas-reineke/indent-blankline.nvim" - }, - ["lir.nvim"] = { - config = { "\27LJ\2\n;\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\18lvim.core.lir\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/lir.nvim", - url = "https://github.com/christianchiarulli/lir.nvim" - }, - ["lualine.nvim"] = { - config = { "\27LJ\2\n?\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\22lvim.core.lualine\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/lualine.nvim", - url = "https://github.com/nvim-lualine/lualine.nvim" - }, - ["lunar.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/lunar.nvim", - url = "https://github.com/lunarvim/lunar.nvim" - }, - ["mason-lspconfig.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/mason-lspconfig.nvim", - url = "https://github.com/williamboman/mason-lspconfig.nvim" - }, - ["mason.nvim"] = { - config = { "\27LJ\2\n=\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\20lvim.core.mason\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/mason.nvim", - url = "https://github.com/williamboman/mason.nvim" - }, - ["neodev.nvim"] = { - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/neodev.nvim", - url = "https://github.com/folke/neodev.nvim" - }, - ["nlsp-settings.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nlsp-settings.nvim", - url = "https://github.com/tamago324/nlsp-settings.nvim" - }, - ["null-ls.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/null-ls.nvim", - url = "https://github.com/jose-elias-alvarez/null-ls.nvim" - }, - ["nvim-autopairs"] = { - config = { "\27LJ\2\nA\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\24lvim.core.autopairs\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-autopairs", - url = "https://github.com/windwp/nvim-autopairs" - }, - ["nvim-cmp"] = { - config = { "\27LJ\2\n`\0\0\3\0\6\0\v6\0\0\0009\0\1\0009\0\2\0\15\0\0\0X\1\5€6\0\3\0'\2\4\0B\0\2\0029\0\5\0B\0\1\1K\0\1\0\nsetup\18lvim.core.cmp\frequire\bcmp\fbuiltin\tlvim\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-cmp", - url = "https://github.com/hrsh7th/nvim-cmp" - }, - ["nvim-dap"] = { - config = { "\27LJ\2\n;\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\18lvim.core.dap\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-dap", - url = "https://github.com/mfussenegger/nvim-dap" - }, - ["nvim-dap-ui"] = { - config = { "\27LJ\2\n>\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\rsetup_ui\18lvim.core.dap\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-dap-ui", - url = "https://github.com/rcarriga/nvim-dap-ui" - }, - ["nvim-lspconfig"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-lspconfig", - url = "https://github.com/neovim/nvim-lspconfig" - }, - ["nvim-navic"] = { - config = { "\27LJ\2\nC\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\26lvim.core.breadcrumbs\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-navic", - url = "https://github.com/SmiteshP/nvim-navic" - }, - ["nvim-tree.lua"] = { - config = { "\27LJ\2\n@\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\23lvim.core.nvimtree\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-tree.lua", - url = "https://github.com/kyazdani42/nvim-tree.lua" - }, - ["nvim-treesitter"] = { - config = { "\27LJ\2\nB\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\25lvim.core.treesitter\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-treesitter", - url = "https://github.com/nvim-treesitter/nvim-treesitter" - }, - ["nvim-ts-context-commentstring"] = { - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/nvim-ts-context-commentstring", - url = "https://github.com/JoosepAlviste/nvim-ts-context-commentstring" - }, - ["nvim-web-devicons"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/nvim-web-devicons", - url = "https://github.com/kyazdani42/nvim-web-devicons" - }, - ["packer.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/packer.nvim", - url = "https://github.com/wbthomason/packer.nvim" - }, - ["plenary.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/plenary.nvim", - url = "https://github.com/nvim-lua/plenary.nvim" - }, - ["popup.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/popup.nvim", - url = "https://github.com/nvim-lua/popup.nvim" - }, - ["project.nvim"] = { - config = { "\27LJ\2\n?\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\22lvim.core.project\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/project.nvim", - url = "https://github.com/ahmedkhalf/project.nvim" - }, - ["schemastore.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/schemastore.nvim", - url = "https://github.com/b0o/schemastore.nvim" - }, - ["structlog.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/structlog.nvim", - url = "https://github.com/Tastyep/structlog.nvim" - }, - ["telescope-fzf-native.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/telescope-fzf-native.nvim", - url = "https://github.com/nvim-telescope/telescope-fzf-native.nvim" - }, - ["telescope.nvim"] = { - config = { "\27LJ\2\nA\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\24lvim.core.telescope\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/telescope.nvim", - url = "https://github.com/nvim-telescope/telescope.nvim" - }, - ["toggleterm.nvim"] = { - config = { "\27LJ\2\n@\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\23lvim.core.terminal\frequire\0" }, - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/toggleterm.nvim", - url = "https://github.com/akinsho/toggleterm.nvim" - }, - ["tokyonight.nvim"] = { - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/tokyonight.nvim", - url = "https://github.com/folke/tokyonight.nvim" - }, - ["vim-illuminate"] = { - config = { "\27LJ\2\nB\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\25lvim.core.illuminate\frequire\0" }, - loaded = true, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/start/vim-illuminate", - url = "https://github.com/RRethy/vim-illuminate" - }, - ["which-key.nvim"] = { - config = { "\27LJ\2\nA\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\24lvim.core.which-key\frequire\0" }, - loaded = false, - needs_bufread = false, - only_cond = false, - path = "/home/drk/.local/share/lunarvim/site/pack/packer/opt/which-key.nvim", - url = "https://github.com/folke/which-key.nvim" - } -} - -time([[Defining packer_plugins]], false) -local module_lazy_loads = { - ["^neodev"] = "neodev.nvim" -} -local lazy_load_called = {['packer.load'] = true} -local function lazy_load_module(module_name) - local to_load = {} - if lazy_load_called[module_name] then return nil end - lazy_load_called[module_name] = true - for module_pat, plugin_name in pairs(module_lazy_loads) do - if not _G.packer_plugins[plugin_name].loaded and string.match(module_name, module_pat) then - to_load[#to_load + 1] = plugin_name - end - end - - if #to_load > 0 then - require('packer.load')(to_load, {module = module_name}, _G.packer_plugins) - local loaded_mod = package.loaded[module_name] - if loaded_mod then - return function(modname) return loaded_mod end - end - end -end - -if not vim.g.packer_custom_loader_enabled then - table.insert(package.loaders, 1, lazy_load_module) - vim.g.packer_custom_loader_enabled = true -end - --- Config for: vim-illuminate -time([[Config for vim-illuminate]], true) -try_loadstring("\27LJ\2\nB\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\25lvim.core.illuminate\frequire\0", "config", "vim-illuminate") -time([[Config for vim-illuminate]], false) --- Config for: nvim-tree.lua -time([[Config for nvim-tree.lua]], true) -try_loadstring("\27LJ\2\n@\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\23lvim.core.nvimtree\frequire\0", "config", "nvim-tree.lua") -time([[Config for nvim-tree.lua]], false) --- Config for: nvim-navic -time([[Config for nvim-navic]], true) -try_loadstring("\27LJ\2\nC\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\26lvim.core.breadcrumbs\frequire\0", "config", "nvim-navic") -time([[Config for nvim-navic]], false) --- Config for: nvim-cmp -time([[Config for nvim-cmp]], true) -try_loadstring("\27LJ\2\n`\0\0\3\0\6\0\v6\0\0\0009\0\1\0009\0\2\0\15\0\0\0X\1\5€6\0\3\0'\2\4\0B\0\2\0029\0\5\0B\0\1\1K\0\1\0\nsetup\18lvim.core.cmp\frequire\bcmp\fbuiltin\tlvim\0", "config", "nvim-cmp") -time([[Config for nvim-cmp]], false) --- Config for: nvim-autopairs -time([[Config for nvim-autopairs]], true) -try_loadstring("\27LJ\2\nA\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\24lvim.core.autopairs\frequire\0", "config", "nvim-autopairs") -time([[Config for nvim-autopairs]], false) --- Config for: nvim-treesitter -time([[Config for nvim-treesitter]], true) -try_loadstring("\27LJ\2\nB\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\25lvim.core.treesitter\frequire\0", "config", "nvim-treesitter") -time([[Config for nvim-treesitter]], false) --- Config for: alpha-nvim -time([[Config for alpha-nvim]], true) -try_loadstring("\27LJ\2\n=\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\20lvim.core.alpha\frequire\0", "config", "alpha-nvim") -time([[Config for alpha-nvim]], false) --- Config for: lir.nvim -time([[Config for lir.nvim]], true) -try_loadstring("\27LJ\2\n;\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\18lvim.core.lir\frequire\0", "config", "lir.nvim") -time([[Config for lir.nvim]], false) --- Config for: lualine.nvim -time([[Config for lualine.nvim]], true) -try_loadstring("\27LJ\2\n?\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\22lvim.core.lualine\frequire\0", "config", "lualine.nvim") -time([[Config for lualine.nvim]], false) --- Config for: telescope.nvim -time([[Config for telescope.nvim]], true) -try_loadstring("\27LJ\2\nA\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\24lvim.core.telescope\frequire\0", "config", "telescope.nvim") -time([[Config for telescope.nvim]], false) --- Config for: nvim-dap-ui -time([[Config for nvim-dap-ui]], true) -try_loadstring("\27LJ\2\n>\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\rsetup_ui\18lvim.core.dap\frequire\0", "config", "nvim-dap-ui") -time([[Config for nvim-dap-ui]], false) --- Config for: nvim-dap -time([[Config for nvim-dap]], true) -try_loadstring("\27LJ\2\n;\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\18lvim.core.dap\frequire\0", "config", "nvim-dap") -time([[Config for nvim-dap]], false) --- Config for: project.nvim -time([[Config for project.nvim]], true) -try_loadstring("\27LJ\2\n?\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\22lvim.core.project\frequire\0", "config", "project.nvim") -time([[Config for project.nvim]], false) --- Config for: indent-blankline.nvim -time([[Config for indent-blankline.nvim]], true) -try_loadstring("\27LJ\2\nC\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\26lvim.core.indentlines\frequire\0", "config", "indent-blankline.nvim") -time([[Config for indent-blankline.nvim]], false) --- Config for: LuaSnip -time([[Config for LuaSnip]], true) -try_loadstring("\27LJ\2\nń\3\0\0\v\0\23\00166\0\0\0'\2\1\0B\0\2\0024\1\0\0006\2\2\0009\2\3\0029\2\4\0029\2\5\0029\2\6\2\15\0\2\0X\3\f€\21\2\1\0\22\2\0\0029\3\a\0006\5\b\0B\5\1\2'\6\t\0'\a\n\0'\b\v\0'\t\f\0'\n\r\0B\3\a\2<\3\2\0019\2\a\0006\4\14\0B\4\1\2'\5\15\0B\2\3\0029\3\16\0\18\5\2\0B\3\2\2\15\0\3\0X\4\3€\21\3\1\0\22\3\0\3<\2\3\0016\3\0\0'\5\17\0B\3\2\0029\3\18\3B\3\1\0016\3\0\0'\5\19\0B\3\2\0029\3\18\0035\5\20\0=\1\21\5B\3\2\0016\3\0\0'\5\22\0B\3\2\0029\3\18\3B\3\1\1K\0\1\0\"luasnip.loaders.from_snipmate\npaths\1\0\0 luasnip.loaders.from_vscode\14lazy_load\29luasnip.loaders.from_lua\17is_directory\rsnippets\19get_config_dir\22friendly-snippets\nstart\vpacker\tpack\tsite\20get_runtime_dir\15join_paths\22friendly_snippets\fsources\fluasnip\fbuiltin\tlvim\15lvim.utils\frequire\2\0", "config", "LuaSnip") -time([[Config for LuaSnip]], false) --- Config for: mason.nvim -time([[Config for mason.nvim]], true) -try_loadstring("\27LJ\2\n=\0\0\3\0\3\0\0066\0\0\0'\2\1\0B\0\2\0029\0\2\0B\0\1\1K\0\1\0\nsetup\20lvim.core.mason\frequire\0", "config", "mason.nvim") -time([[Config for mason.nvim]], false) -vim.cmd [[augroup packer_load_aucmds]] -vim.cmd [[au!]] - -- Event lazy-loads -time([[Defining lazy-load event autocommands]], true) -vim.cmd [[au BufRead * ++once lua require("packer.load")({'gitsigns.nvim', 'Comment.nvim'}, { event = "BufRead *" }, _G.packer_plugins)]] -vim.cmd [[au BufReadPost * ++once lua require("packer.load")({'nvim-ts-context-commentstring'}, { event = "BufReadPost *" }, _G.packer_plugins)]] -vim.cmd [[au BufWinEnter * ++once lua require("packer.load")({'which-key.nvim', 'toggleterm.nvim', 'bufferline.nvim'}, { event = "BufWinEnter *" }, _G.packer_plugins)]] -time([[Defining lazy-load event autocommands]], false) -vim.cmd("augroup END") - -_G._packer.inside_compile = false -if _G._packer.needs_bufread == true then - vim.cmd("doautocmd BufRead") -end -_G._packer.needs_bufread = false - -if should_profile then save_profiles() end - -end) - -if not no_errors then - error_msg = error_msg:gsub('"', '\\"') - vim.api.nvim_command('echohl ErrorMsg | echom "Error in packer_compiled: '..error_msg..'" | echom "Please check your config for correctness" | echohl None') -end diff --git a/user/.config/musikcube/hotkeys.json b/user/.config/musikcube/hotkeys.json deleted file mode 100644 index 914c527c6..000000000 --- a/user/.config/musikcube/hotkeys.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "browse_category_filter": "^F", - "browse_playlists_delete": "KEY_DC", - "browse_playlists_new": "M-n", - "browse_playlists_rename": "M-r", - "browse_playlists_save": "M-s", - "context_menu": "M-enter", - "hotkeys_backup": "M-b", - "hotkeys_reset_to_default": "M-r", - "key_down": "j", - "key_end": "KEY_END", - "key_home": "KEY_HOME", - "key_left": "h", - "key_page_down": "KEY_NPAGE", - "key_page_up": "KEY_PPAGE", - "key_right": "l", - "key_up": "k", - "lyrics_retry": "r", - "metadata_rescan": "^R", - "navigate_console": "`", - "navigate_hotkeys": "?", - "navigate_jump_to_playing": "x", - "navigate_library": "a", - "navigate_library_album_artists": "4", - "navigate_library_browse": "b", - "navigate_library_browse_albums": "2", - "navigate_library_browse_artists": "1", - "navigate_library_browse_directories": "d", - "navigate_library_browse_genres": "3", - "navigate_library_choose_category": "6", - "navigate_library_filter": "f", - "navigate_library_play_queue": "n", - "navigate_library_playlists": "5", - "navigate_library_tracks": "t", - "navigate_lyrics": "^L", - "navigate_settings": "s", - "play_queue_clear": "X", - "play_queue_delete": "KEY_DC", - "play_queue_hot_swap": "M-a", - "play_queue_move_down": "M-down", - "play_queue_move_up": "M-up", - "play_queue_playlist_delete": "M-x", - "play_queue_playlist_load": "M-l", - "play_queue_playlist_rename": "M-r", - "play_queue_playlist_save": "M-s", - "playback_next": "M-l", - "playback_previous": "M-j", - "playback_seek_back": "u", - "playback_seek_back_proportional": "y", - "playback_seek_forward": "o", - "playback_seek_forward_proportional": "p", - "playback_stop": "^X", - "playback_toggle_mute": "m", - "playback_toggle_pause": "^P", - "playback_toggle_repeat": ".", - "playback_toggle_shuffle": ",", - "playback_volume_down": "M-k", - "playback_volume_up": "M-i", - "search_input_toggle_match_type": "M-m", - "show_equalizer": "^E", - "toggle_visualizer": "v", - "track_list_change_sort_order": "M-s", - "track_list_next_group": "]", - "track_list_play_from_top": "M-P", - "track_list_previous_group": "[", - "track_list_rate_track": "r", - "view_refresh": "KEY_F(5)" -} \ No newline at end of file diff --git a/user/.config/neofetch/config.conf b/user/.config/neofetch/config.conf deleted file mode 100644 index 6048c9630..000000000 --- a/user/.config/neofetch/config.conf +++ /dev/null @@ -1,779 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom neofetch config -## - -print_info() { - prin " " - info "$(color 1) OS " distro - info "$(color 2) VER" kernel - info "$(color 3) UP " uptime - info "$(color 4)ïŁ– PKG" packages - info "$(color 5) DE " de - info "$(color 6) CPU" cpu - info "$(color 7) GPU" gpu - info "$(color 8)ïĄš MEM" memory - prin "$(color 1) $(color 2) $(color 3) $(color 4) $(color 5) $(color 6) $(color 7) $(color 8)" -} -#### TITLE -# Hide/Show Fully qualified domain name. -# Default: 'off' -# Values: 'on', 'off' -# Flag: --title_fqdn -title_fqdn="off" - - -#### KERNEL -# Shorten the output of the kernel function. -# Default: 'on' -# Values: 'on', 'off' -# Flag: --kernel_shorthand -# Supports: Everything except *BSDs (except PacBSD and PC-BSD) -# Example: -# on: '4.8.9-1-ARCH' -# off: 'Linux 4.8.9-1-ARCH' -kernel_shorthand="on" - - -#### DISTRO -# Shorten the output of the distro function -# Default: 'off' -# Values: 'on', 'tiny', 'off' -# Flag: --distro_shorthand -# Supports: Everything except Windows and Haiku -distro_shorthand="off" - -# Show/Hide OS Architecture. -# Show 'x86_64', 'x86' and etc in 'Distro:' output. -# Default: 'on' -# Values: 'on', 'off' -# Flag: --os_arch -# Example: -# on: 'Arch Linux x86_64' -# off: 'Arch Linux' -os_arch="on" - - -#### UPTIME -# Shorten the output of the uptime function -# Default: 'on' -# Values: 'on', 'tiny', 'off' -# Flag: --uptime_shorthand -# Example: -# on: '2 days, 10 hours, 3 mins' -# tiny: '2d 10h 3m' -# off: '2 days, 10 hours, 3 minutes' -uptime_shorthand="on" - - -#### MEMORY -# Show memory pecentage in output. -# Default: 'off' -# Values: 'on', 'off' -# Flag: --memory_percent -# Example: -# on: '1801MiB / 7881MiB (22%)' -# off: '1801MiB / 7881MiB' -memory_percent="off" - -# Change memory output unit. -# Default: 'mib' -# Values: 'kib', 'mib', 'gib' -# Flag: --memory_unit -# Example: -# kib '1020928KiB / 7117824KiB' -# mib '1042MiB / 6951MiB' -# gib: ' 0.98GiB / 6.79GiB' -memory_unit="mib" - - -#### PACKAGES -# Show/Hide Package Manager names. -# Default: 'tiny' -# Values: 'on', 'tiny' 'off' -# Flag: --package_managers -# Example: -# on: '998 (pacman), 8 (flatpak), 4 (snap)' -# tiny: '908 (pacman, flatpak, snap)' -# off: '908' -package_managers="on" - - -#### SHELL -# Show the path to $SHELL -# Default: 'off' -# Values: 'on', 'off' -# Flag: --shell_path -# Example: -# on: '/bin/bash' -# off: 'bash' -shell_path="off" - -# Show $SHELL version -# Default: 'on' -# Values: 'on', 'off' -# Flag: --shell_version -# Example: -# on: 'bash 4.4.5' -# off: 'bash' -shell_version="on" - - -#### CPU -# CPU speed type -# Default: 'bios_limit' -# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. -# Flag: --speed_type -# Supports: Linux with 'cpufreq' -# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. -speed_type="bios_limit" - -# CPU speed shorthand -# Default: 'off' -# Values: 'on', 'off'. -# Flag: --speed_shorthand -# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz -# -# Example: -# on: 'i7-6500U (4) @ 3.1GHz' -# off: 'i7-6500U (4) @ 3.100GHz' -speed_shorthand="off" - -# Enable/Disable CPU brand in output. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --cpu_brand -# -# Example: -# on: 'Intel i7-6500U' -# off: 'i7-6500U (4)' -cpu_brand="on" - -# CPU Speed -# Hide/Show CPU speed. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --cpu_speed -# -# Example: -# on: 'Intel i7-6500U (4) @ 3.1GHz' -# off: 'Intel i7-6500U (4)' -cpu_speed="on" - -# CPU Cores -# Display CPU cores in output -# -# Default: 'logical' -# Values: 'logical', 'physical', 'off' -# Flag: --cpu_cores -# Support: 'physical' doesn't work on BSD. -# -# Example: -# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) -# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) -# off: 'Intel i7-6500U @ 3.1GHz' -cpu_cores="logical" - -# CPU Temperature -# Hide/Show CPU temperature. -# Note the temperature is added to the regular CPU function. -# -# Default: 'off' -# Values: 'C', 'F', 'off' -# Flag: --cpu_temp -# Supports: Linux, BSD -# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable -# coretemp kernel module. This only supports newer Intel processors. -# -# Example: -# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' -# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' -# off: 'Intel i7-6500U (4) @ 3.1GHz' -cpu_temp="off" - - -# GPU - - -# Enable/Disable GPU Brand -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gpu_brand -# -# Example: -# on: 'AMD HD 7950' -# off: 'HD 7950' -gpu_brand="on" - -# Which GPU to display -# -# Default: 'all' -# Values: 'all', 'dedicated', 'integrated' -# Flag: --gpu_type -# Supports: Linux -# -# Example: -# all: -# GPU1: AMD HD 7950 -# GPU2: Intel Integrated Graphics -# -# dedicated: -# GPU1: AMD HD 7950 -# -# integrated: -# GPU1: Intel Integrated Graphics -gpu_type="all" - - -# Resolution - - -# Display refresh rate next to each monitor -# Default: 'off' -# Values: 'on', 'off' -# Flag: --refresh_rate -# Supports: Doesn't work on Windows. -# -# Example: -# on: '1920x1080 @ 60Hz' -# off: '1920x1080' -refresh_rate="off" - - -# Gtk Theme / Icons / Font - - -# Shorten output of GTK Theme / Icons / Font -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --gtk_shorthand -# -# Example: -# on: 'Numix, Adwaita' -# off: 'Numix [GTK2], Adwaita [GTK3]' -gtk_shorthand="off" - - -# Enable/Disable gtk2 Theme / Icons / Font -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gtk2 -# -# Example: -# on: 'Numix [GTK2], Adwaita [GTK3]' -# off: 'Adwaita [GTK3]' -gtk2="on" - -# Enable/Disable gtk3 Theme / Icons / Font -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --gtk3 -# -# Example: -# on: 'Numix [GTK2], Adwaita [GTK3]' -# off: 'Numix [GTK2]' -gtk3="on" - - -# IP Address - - -# Website to ping for the public IP -# -# Default: 'http://ident.me' -# Values: 'url' -# Flag: --ip_host -public_ip_host="http://ident.me" - -# Public IP timeout. -# -# Default: '2' -# Values: 'int' -# Flag: --ip_timeout -public_ip_timeout=2 - - -# Desktop Environment - - -# Show Desktop Environment version -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --de_version -de_version="on" - - -# Disk - - -# Which disks to display. -# The values can be any /dev/sdXX, mount point or directory. -# NOTE: By default we only show the disk info for '/'. -# -# Default: '/' -# Values: '/', '/dev/sdXX', '/path/to/drive'. -# Flag: --disk_show -# -# Example: -# disk_show=('/' '/dev/sdb1'): -# 'Disk (/): 74G / 118G (66%)' -# 'Disk (/mnt/Videos): 823G / 893G (93%)' -# -# disk_show=('/'): -# 'Disk (/): 74G / 118G (66%)' -# -disk_show=('/') - -# Disk subtitle. -# What to append to the Disk subtitle. -# -# Default: 'mount' -# Values: 'mount', 'name', 'dir', 'none' -# Flag: --disk_subtitle -# -# Example: -# name: 'Disk (/dev/sda1): 74G / 118G (66%)' -# 'Disk (/dev/sdb2): 74G / 118G (66%)' -# -# mount: 'Disk (/): 74G / 118G (66%)' -# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' -# 'Disk (/mnt/Videos): 74G / 118G (66%)' -# -# dir: 'Disk (/): 74G / 118G (66%)' -# 'Disk (Local Disk): 74G / 118G (66%)' -# 'Disk (Videos): 74G / 118G (66%)' -# -# none: 'Disk: 74G / 118G (66%)' -# 'Disk: 74G / 118G (66%)' -# 'Disk: 74G / 118G (66%)' -disk_subtitle="mount" - -# Disk percent. -# Show/Hide disk percent. -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --disk_percent -# -# Example: -# on: 'Disk (/): 74G / 118G (66%)' -# off: 'Disk (/): 74G / 118G' -disk_percent="on" - - -# Song - - -# Manually specify a music player. -# -# Default: 'auto' -# Values: 'auto', 'player-name' -# Flag: --music_player -# -# Available values for 'player-name': -# -# amarok -# audacious -# banshee -# bluemindo -# clementine -# cmus -# deadbeef -# deepin-music -# dragon -# elisa -# exaile -# gnome-music -# gmusicbrowser -# gogglesmm -# guayadeque -# io.elementary.music -# iTunes -# juk -# lollypop -# mocp -# mopidy -# mpd -# muine -# netease-cloud-music -# olivia -# playerctl -# pogo -# pragha -# qmmp -# quodlibet -# rhythmbox -# sayonara -# smplayer -# spotify -# strawberry -# tauonmb -# tomahawk -# vlc -# xmms2d -# xnoise -# yarock -music_player="mpd" - -# Format to display song information. -# -# Default: '%artist% - %album% - %title%' -# Values: '%artist%', '%album%', '%title%' -# Flag: --song_format -# -# Example: -# default: 'Song: Jet - Get Born - Sgt Major' -song_format="%artist% - %album% - %title%" - -# Print the Artist, Album and Title on separate lines -# -# Default: 'off' -# Values: 'on', 'off' -# Flag: --song_shorthand -# -# Example: -# on: 'Artist: The Fratellis' -# 'Album: Costello Music' -# 'Song: Chelsea Dagger' -# -# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' -song_shorthand="off" - -# 'mpc' arguments (specify a host, password etc). -# -# Default: '' -# Example: mpc_args=(-h HOST -P PASSWORD) -mpc_args=() - - -# Text Colors - - -# Text Colors -# -# Default: 'distro' -# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' -# Flag: --colors -# -# Each number represents a different part of the text in -# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' -# -# Example: -# colors=(distro) - Text is colored based on Distro colors. -# colors=(4 6 1 8 8 6) - Text is colored in the order above. -colors=(distro) - - -# Text Options - - -# Toggle bold text -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --bold -bold="on" - -# Enable/Disable Underline -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --underline -underline_enabled="on" - -# Underline character -# -# Default: '-' -# Values: 'string' -# Flag: --underline_char -underline_char="-" - - -# Info Separator -# Replace the default separator with the specified string. -# -# Default: ':' -# Flag: --separator -# -# Example: -# separator="->": 'Shell-> bash' -# separator=" =": 'WM = dwm' -separator=":" - - -# Color Blocks - - -# Color block range -# The range of colors to print. -# -# Default: '0', '15' -# Values: 'num' -# Flag: --block_range -# -# Example: -# -# Display colors 0-7 in the blocks. (8 colors) -# neofetch --block_range 0 7 -# -# Display colors 0-15 in the blocks. (16 colors) -# neofetch --block_range 0 15 -block_range=(0 15) - -# Toggle color blocks -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --color_blocks -color_blocks="on" - -# Color block width in spaces -# -# Default: '3' -# Values: 'num' -# Flag: --block_width -block_width=3 - -# Color block height in lines -# -# Default: '1' -# Values: 'num' -# Flag: --block_height -block_height=1 - -# Color Alignment -# -# Default: 'auto' -# Values: 'auto', 'num' -# Flag: --col_offset -# -# Number specifies how far from the left side of the terminal (in spaces) to -# begin printing the columns, in case you want to e.g. center them under your -# text. -# Example: -# col_offset="auto" - Default behavior of neofetch -# col_offset=7 - Leave 7 spaces then print the colors -col_offset="auto" - -# Progress Bars - - -# Bar characters -# -# Default: '-', '=' -# Values: 'string', 'string' -# Flag: --bar_char -# -# Example: -# neofetch --bar_char 'elapsed' 'total' -# neofetch --bar_char '-' '=' -bar_char_elapsed="-" -bar_char_total="=" - -# Toggle Bar border -# -# Default: 'on' -# Values: 'on', 'off' -# Flag: --bar_border -bar_border="on" - -# Progress bar length in spaces -# Number of chars long to make the progress bars. -# -# Default: '15' -# Values: 'num' -# Flag: --bar_length -bar_length=15 - -# Progress bar colors -# When set to distro, uses your distro's logo colors. -# -# Default: 'distro', 'distro' -# Values: 'distro', 'num' -# Flag: --bar_colors -# -# Example: -# neofetch --bar_colors 3 4 -# neofetch --bar_colors distro 5 -bar_color_elapsed="distro" -bar_color_total="distro" - - -# Info display -# Display a bar with the info. -# -# Default: 'off' -# Values: 'bar', 'infobar', 'barinfo', 'off' -# Flags: --cpu_display -# --memory_display -# --battery_display -# --disk_display -# -# Example: -# bar: '[---=======]' -# infobar: 'info [---=======]' -# barinfo: '[---=======] info' -# off: 'info' -cpu_display="off" -memory_display="off" -battery_display="off" -disk_display="off" - - -# Backend Settings - - -# Image backend. -# -# Default: 'ascii' -# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off', -# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty' -# Flag: --backend -image_backend="ascii" - -# Image Source -# -# Which image or ascii file to display. -# -# Default: 'auto' -# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' -# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' -# Flag: --source -# -# NOTE: 'auto' will pick the best image source for whatever image backend is used. -# In ascii mode, distro ascii art will be used and in an image mode, your -# wallpaper will be used. -image_source="auto" - - -#### ASCII OPTIONS -# Ascii distro -# Which distro's ascii art to display. -# Default: 'auto' -# Values: 'auto', 'distro_name' -# Flag: --ascii_distro -# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS", -# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs, -# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, -# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD, -# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, -# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, -# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin, -# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary, -# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, -# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, -# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, -# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, -# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite, -# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, -# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib, -# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner, -# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba, -# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD, -# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint, -# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, -# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, -# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, -# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, -# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, -# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, -# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, -# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin, -# and IRIX have ascii logos -# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. -# Use '{distro name}_old' to use the old logos. -# NOTE: Ubuntu has flavor variants. -# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, -# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. -# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, -# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, -# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, -# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, -# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, -# postmarketOS, and Void have a smaller logo variant. -# Use '{distro name}_small' to use the small variants. -ascii_distro="arch_small" - -# Ascii Colors -# Default: 'distro' -# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' -# Flag: --ascii_colors -# Example: -# ascii_colors=(distro) - Ascii is colored based on Distro colors. -# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. -ascii_colors=(distro) - -# Bold ascii logo -# Whether or not to bold the ascii logo. -# Default: 'on' -# Values: 'on', 'off' -# Flag: --ascii_bold -ascii_bold="on" - -#### IMAGE OPTIONS -# Image loop -# Setting this to on will make neofetch redraw the image constantly until -# Ctrl+C is pressed. This fixes display issues in some terminal emulators. -# Default: 'off' -# Values: 'on', 'off' -# Flag: --loop -image_loop="off" - -# Thumbnail directory -# Default: '~/.cache/thumbnails/neofetch' -# Values: 'dir' -thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" - -# Crop mode -# Default: 'normal' -# Values: 'normal', 'fit', 'fill' -# Flag: --crop_mode -# See this wiki page to learn about the fit and fill options. -# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F -crop_mode="normal" - -# Crop offset -# Note: Only affects 'normal' crop mode. -# Default: 'center' -# Values: 'northwest', 'north', 'northeast', 'west', 'center' -# 'east', 'southwest', 'south', 'southeast' -# Flag: --crop_offset -crop_offset="center" - -# Image size -# The image is half the terminal width by default. -# Default: 'auto' -# Values: 'auto', '00px', '00%', 'none' -# Flags: --image_size -# --size -image_size="auto" - -# Gap between image and text -# Default: '3' -# Values: 'num', '-num' -# Flag: --gap -gap=3 - -# Image offsets -# Only works with the w3m backend. -# Default: '0' -# Values: 'px' -# Flags: --xoffset -# --yoffset -yoffset=0 -xoffset=0 - -# Image background color -# Only works with the w3m backend. -# Default: '' -# Values: 'color', 'blue' -# Flag: --bg_color diff --git a/user/.config/newsboat/config b/user/.config/newsboat/config index 4886a962a..9246557ae 100644 --- a/user/.config/newsboat/config +++ b/user/.config/newsboat/config @@ -48,3 +48,4 @@ highlight article ":.*\\(image\\)$" blue default highlight article ":.*\\(embedded flash\\)$" magenta default browser w3m +macro v set browser "mpv %u" ; open-in-browser ; set browser "elinks %u" diff --git a/user/.config/newsboat/urls b/user/.config/newsboat/urls index 8efda449c..c66f25428 100644 --- a/user/.config/newsboat/urls +++ b/user/.config/newsboat/urls @@ -1,42 +1,99 @@ http://static.fsf.org/fsforg/rss/news.xml "~FSF News" http://static.fsf.org/fsforg/rss/blogs.xml "~FSF Blogs" +https://fsfe.org/news/news.en.rss "~FSFE News" https://dot.kde.org/rss.xml "~KDE Dot News" https://planet.kde.org/global/atom.xml "~Planet KDE" https://pointieststick.com/feed/ "~This Week on KDE" https://www.kdeblog.com/rss "~KDE Blog" https://thisweek.gnome.org/index.xml "~This Week on GNOME" https://www.omgubuntu.co.uk/feed "~OMG Ubuntu!" +https://www.omglinux.com/feed "~OMG!Linux" https://blog.thunderbird.net/feed/ "~The Thunderbird Blog" https://thelinuxexp.com/feed.xml "~The Linux Experiment" -https://techhut.tv/feed/ "~Techhut Media" +https://techhut.tv/feed/ "~TechHut Media" https://itsfoss.com/rss/ "~Its FOSS!" https://thelinuxcast.org/feed/feed.xml "~The Linux Cast" https://9to5linux.com/feed/atom "~9to5Linux" https://blog.elementary.io/feed.xml "~elementary OS Blog" https://blog.zorin.com/index.xml "~Zorin OS Blog" http://blog.linuxmint.com/?feed=rss2 "~Linux Mint Blog" -https://lukesmith.xyz/rss.xml "~Luke Smith" -https://notrelated.xyz/rss "~Not Related" -https://landchad.net/rss.xml "~Landchad" -https://based.cooking/rss.xml "~Based Cooking" -https://artixlinux.org/feed.php "~Artix Linux" -https://www.archlinux.org/feeds/news/ "~Arch Linux" -https://switchedtolinux.com/tutorials?format=feed&type=rss "~Switched to Linux - Tutorials" -https://switchedtolinux.com/tin-foil-hat-time?format=feed&type=rss "~Switched to Linux - Tin Foil Hat Time" -https://switchedtolinux.com/news?format=feed&type=rss "~Switched to Linux - Weekly News Roundup" -https://switchedtolinux.com/linux/distros?format=feed&type=rss "~Switched to Linux - Distros" -https://switchedtolinux.com/linux/software/?format=feed&type=rss "~Switched to Linux - Software" -https://switchedtolinux.com/linux/desktop-environments/?format=feed&type=rss "~Switched to Linux - Desktop Environments" https://www.gamingonlinux.com/article_rss.php "~Gaming on linux" https://hackaday.com/blog/feed/ "~Hackaday" https://opensource.com/feed "~Opensource" https://linux.softpedia.com/backend.xml "~Softpedia Linux" -https://www.zdnet.com/topic/linux/rss.xml "~Zdnet Linux" https://www.phoronix.com/rss.php "~Phoronix" https://www.computerworld.com/index.rss "~Computerworld" https://www.networkworld.com/category/linux/index.rss "~Networkworld Linux" https://betanews.com/feed "~Betanews Linux" http://lxer.com/module/newswire/headlines.rss "~Lxer" -https://distrowatch.com/news/dwd.xml "~Distrowatch" -https://odysee.com/$/rss/@blenderdumbass:f "~Blender Dumbass" https://theevilskeleton.gitlab.io/feed.xml "~TheEvilSkeleton" +https://tutanota.com/blog/feed.xml "~Tutanota Blogs" +https://vanillaos.org/feed.xml "~Vanilla OS" +https://techcrunch.com/feed/ "~TechCrunch" +http://www.techradar.com/rss "~TechRadar" +https://www.zdnet.com/news/rss.xml "~ZDNET - News" +https://c3po.website/rss/ "~Blog de C3PO" +http://yro.slashdot.org/yro.rss "~Slashdot: Your Rights Online" +https://freedom-to-tinker.com/feed/rss/ "~Freedom to Tinker" +https://act.eff.org/action.atom "~EFF - Action Center" +https://www.eff.org/rss/updates.xml "~EFF - Updates" +https://victorhckinthefreeworld.com/feed/ "~Victorhck in the free world" +https://invidious.sethforprivacy.com/feed/channel/UCHnyfMqiRRG1u-2MsSQLbXA "~YT - Veritasium" +https://invidious.sethforprivacy.com/feed/channel/UCtMVHI3AJD4Qk4hcbZnI9ZQ "~YT - SomeOrdinaryGamers" +https://invidious.sethforprivacy.com/feed/channel/UCl2mFZoRqjw_ELax4Yisf6w "~YT - Louis Rossmann" +https://invidious.sethforprivacy.com/feed/channel/UChI0q9a-ZcbZh7dAu_-J-hg "~YT - Upper Echelon" +https://invidious.sethforprivacy.com/feed/channel/UCj8orMezFWVcoN-4S545Wtw "~YT - Max Derrat" +https://invidious.sethforprivacy.com/feed/channel/UCkmMACUKpQeIxN9D9ARli1Q "~YT - Shadiversity" +https://invidious.sethforprivacy.com/feed/channel/UCNYW2vfGrUE6R5mIJYzkRyQ "~YT - DrossRotzank" +https://invidious.sethforprivacy.com/feed/channel/UC36xmz34q02JYaZYKrMwXng "~YT - Nate Gentile" +https://invidious.sethforprivacy.com/feed/channel/UCg6gPGh8HU2U01vaFCAsvmQ "~YT - Chris Titus Tech" +https://invidious.sethforprivacy.com/feed/channel/UCVls1GmFKf6WlTraIb_IaJg "~YT - DistroTube" +https://invidious.sethforprivacy.com/feed/channel/UCxQKHvKbmSzGMvUrVtJYnUA "~YT - Learn Linux TV" +https://invidious.sethforprivacy.com/feed/channel/UC5UAwBUum7CPN5buc-_N1Fw "~YT - The Linux Experiment" +https://invidious.sethforprivacy.com/feed/channel/UCylGUf9BvQooEFjgdNudoQg "~YT - The Linux Cast" +https://invidious.sethforprivacy.com/feed/channel/UCoryWpk4QVYKFCJul9KBdyw "~YT - Switched to Linux" +https://invidious.sethforprivacy.com/feed/channel/UCgkyQiY_Q5AlrygIXGWO2Zw "~YT - Tux Traveler" +https://invidious.sethforprivacy.com/feed/channel/UCxkw-TfCK1t1VKxfHwPzD6w "~YT - Our Walk in Christ" +https://invidious.sethforprivacy.com/feed/channel/UCld68syR8Wi-GY_n4CaoJGA "~YT - Brodie Robertson" +https://invidious.sethforprivacy.com/feed/channel/UCjSEJkpGbcZhvo0lr-44X_w "~YT - TechHut" +https://invidious.sethforprivacy.com/feed/channel/UC2eYFnH61tmytImy1mTYvhA "~YT - Luke Smith" +https://invidious.sethforprivacy.com/feed/channel/UC7YOGHUfC1Tb6E4pudI9STA "~YT - Mental Outlaw" +https://invidious.sethforprivacy.com/feed/channel/UC3jSNmKWYA04R47fDcc1ImA "~YT - InfinitelyGalactic" +https://invidious.sethforprivacy.com/feed/channel/UCONH73CdRXUjlh3-DdLGCPw "~YT - Nicco Loves Linux" +https://invidious.sethforprivacy.com/feed/channel/UC1s1OsWNYDFgbROPV-q5arg "~YT - Michael Horn" +https://invidious.sethforprivacy.com/feed/channel/UCOSSzBN8e3JHOxvltQbf_mQ "~YT - Jack Keifer" +https://invidious.sethforprivacy.com/feed/channel/UC05XpvbHZUQOfA6xk4dlmcw "~YT - DJ Ware" +https://invidious.sethforprivacy.com/feed/channel/UCAiiOTio8Yu69c3XnR7nQBQ "~YT - System Crafters" +https://invidious.sethforprivacy.com/feed/channel/UCAYKj_peyESIMDp5LtHlH2A "~YT - unfa" +https://invidious.sethforprivacy.com/feed/channel/UCmw-QGOHbHA5cDAvwwqUTKQ "~YT - Zaney" +https://invidious.sethforprivacy.com/feed/channel/UCNvl_86ygZXRuXjxbONI5jA "~YT - 10leej" +https://invidious.sethforprivacy.com/feed/channel/UC3yaWWA9FF9OBog5U9ml68A "~YT - SavvyNik" +https://invidious.sethforprivacy.com/feed/channel/UCS97tchJDq17Qms3cux8wcA "~YT - chris@machine" +https://invidious.sethforprivacy.com/feed/channel/UCl8XUDjAOLc7GNKcDp9Nepg "~YT - Locos por Linux" +https://invidious.sethforprivacy.com/feed/channel/UClVi5MQZ6T0InZYT7oFs6wg "~YT - Mumbling Hugo" +https://invidious.sethforprivacy.com/feed/channel/UCmyGZ0689ODyReHw3rsKLtQ "~YT - Michael Tunnell" +https://invidious.sethforprivacy.com/feed/channel/UCv1Kcz-CuGM6mxzL3B1_Eiw "~YT - Gardiner Bryant" +https://invidious.sethforprivacy.com/feed/channel/UCcf2Mr1qNoX51XXDUd3Rquw "~YT - ByteSeb" +https://invidious.sethforprivacy.com/feed/channel/UCCIHOP7e271SIumQgyl6XBQ "~YT - OldTechBloke" +https://invidious.sethforprivacy.com/feed/channel/UCIFzjAer2W9gTWVECZgtDzg "~YT - GaryH Tech" +https://invidious.sethforprivacy.com/feed/channel/UCMiyV_Ib77XLpzHPQH_q0qQ "~YT - Veronica Explains" +https://invidious.sethforprivacy.com/feed/channel/UCsnGwSIHyoYN0kiINAGUKxg "~YT - Wolfgang's Channel" +https://invidious.sethforprivacy.com/feed/channel/UCnIfca4LPFVn8-FjpPVc1ow "~YT - Fedora Project" +https://invidious.sethforprivacy.com/feed/channel/UCH5DsMZAgdx5Fkk9wwMNwCA "~YT - The New Oil" +https://invidious.sethforprivacy.com/feed/channel/UCs6KfncB4OV6Vug4o_bzijg "~YT - Techlore" +https://invidious.sethforprivacy.com/feed/channel/UCYVU6rModlGxvJbszCclGGw "~YT - Rob Braxman Tech" +https://invidious.sethforprivacy.com/feed/channel/UCSuHzQ3GrHSzoBbwrIq3LLA "~YT - Naomi Brockwell: NBTV" +https://invidious.sethforprivacy.com/feed/channel/UCvFGf8HZGZWFzpcDCqb3Lhw "~YT - All Things Secured" +https://invidious.sethforprivacy.com/feed/channel/UCvjgXvBlbQiydffZU7m1_aw "~YT - The Coding Train" +https://invidious.sethforprivacy.com/feed/channel/UC9-y-6csu5WGm29I7JiwpnA "~YT - Computerphile" +https://invidious.sethforprivacy.com/feed/channel/UCbiGcwDWZjz05njNPrJU7jA "~YT - ExplainingComputers" +https://invidious.sethforprivacy.com/feed/channel/UCy0tKL1T7wFoYcxCe0xjN6Q "~YT - Technology Connections" +https://invidious.sethforprivacy.com/feed/channel/UC8uT9cgJorJPWu7ITLGo9Ww "~YT - The 8-Bit Guy" +https://invidious.sethforprivacy.com/feed/channel/UCoL8olX-259lS1N6QPyP4IQ "~YT - Action Retro" +https://invidious.sethforprivacy.com/feed/channel/UCW-HHEyt67RhZ6q21n4p2zQ "~YT - Mac84" +https://invidious.sethforprivacy.com/feed/channel/UChT0QzAGfz_pUIbQnePV6KQ "~YT - Pendleton 115" +https://invidious.sethforprivacy.com/feed/channel/UC-ErgHYY0_Yjhjz2MN1E1lg "~YT - RETRO Hardware" +https://invidious.sethforprivacy.com/feed/channel/UCjgS6Uyg8ok4Jd_lH_MUKgg "~YT - Claus Kellerman" +https://invidious.sethforprivacy.com/feed/channel/UC0W_BIuwk8D0Bv4THbVZZOQ "~YT - Surveillance Report" +https://invidious.sethforprivacy.com/feed/channel/UCBq5p-xOla8xhnrbhu8AIAg "~YT - Tech Over Tea" + diff --git a/user/.config/picom/picom.conf b/user/.config/picom/picom.conf deleted file mode 100644 index 93031661e..000000000 --- a/user/.config/picom/picom.conf +++ /dev/null @@ -1,87 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom picom config - -## Animations -animations = true -# `auto`, `none`, `fly-in`, `zoom`, `slide-down`, `slide-up`, `slide-left`, `slide-right` `slide-in`, `slide-out` -animation-for-transient-window = "zoom" -animation-for-open-window = "zoom" -animation-for-unmap-window = "zoom" -animation-for-menu-window = "zoom" -animation-for-workspace-switch-out = "zoom" -animation-for-workspace-switch-in = "zoom" -animation-stiffness = 300; -animation-dampening = 16; -animation-window-mass = 1; -animation-clamping = true; -animation-delta = 16; -#animation-force-steps = true; - - -## Shadows -shadow = false; -#shadow-radius = 8; -#shadow-opacity = .90 -#shadow-offset-x = -10; -#shadow-offset-y = -10; -# shadow-red = 0 -# shadow-green = 0 -# shadow-blue = 0 -# shadow-color = "#000000" -#shadow-exclude = [ -# "name = 'Notification'", -# "class_g = 'Conky'", -# "class_g ?= 'Notify-osd'", -# "class_g = 'Cairo-clock'", -# "_GTK_FRAME_EXTENTS@:c" -#]; - -## Fading -fading = false; -#fade-in-step = 0.05; -#fade-out-step = 0.05; -#fade-delta = 8 -#fade-exclude = [] -#no-fading-openclose = false -#no-fading-destroyed-argb = false - -## Transparency and opacity -inactive-opacity = 1.00; -frame-opacity = 1.0; -inactive-opacity-override = false; -focus-exclude = [ "class_g = 'Cairo-clock'" ]; -# opaity-rule = [] - -## General Settings -backend = "xrender"; -vsync = true; -dbe = false; -detect-client-opacity = true; -refresh-rate = 60; -detect-transient = true; -glx-no-stencil = true; -use-damage = true; -unredir-if-possible = false; -#unredir-if-possible-exclude = [ -# "class_g = 'looking-glass-client' && !focused" -#]; -glx-use-copysubbuffer-mesa = true; - -wintypes: -{ - normal = { fade = true; full-shadow = true; }; - tooltip = { fade = true; }; - menu = { fade = true; }; - popup_menu = { fade = true; }; - dropdown_menu = { fade = true; }; - utility = { fade = true; }; - dialog = { fade = true; }; - notify = { fade = true; }; - unknown = { fade = true; }; - # notification = { shadow = true; }; - # dock = { shadow = false; }; -}; - diff --git a/user/.config/qt5ct/qt5ct.conf b/user/.config/qt5ct/qt5ct.conf index 25ebe2528..08368ab5c 100644 --- a/user/.config/qt5ct/qt5ct.conf +++ b/user/.config/qt5ct/qt5ct.conf @@ -1,13 +1,12 @@ [Appearance] color_scheme_path=/usr/share/qt5ct/colors/airy.conf custom_palette=false -icon_theme=Papirus-Dark standard_dialogs=gtk2 style=gtk2 [Fonts] -fixed=@Variant(\0\0\0@\0\0\0$\0m\0o\0n\0o\0n\0o\0k\0i\0 \0N\0\x65\0r\0\x64\0 \0\x46\0o\0n\0t@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0K\x10) -general=@Variant(\0\0\0@\0\0\0$\0m\0o\0n\0o\0n\0o\0k\0i\0 \0N\0\x65\0r\0\x64\0 \0\x46\0o\0n\0t@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0K\x10) +fixed="Mononoki Nerd Font,10,-1,5,50,0,0,0,0,0,Regular" +general="Cantarell,10,-1,5,50,0,0,0,0,0,Regular" [Interface] activate_item_on_single_click=1 @@ -25,7 +24,7 @@ underline_shortcut=1 wheel_scroll_lines=3 [SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3\xc0\0\0\0\x32\0\0\a\x7f\0\0\x4\x37\0\0\x3\xc1\0\0\0\x33\0\0\a~\0\0\x4\x36\0\0\0\0\0\0\0\0\a\x80\0\0\x3\xc1\0\0\0\x33\0\0\a~\0\0\x4\x36) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2\x84\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc) [Troubleshooting] force_raster_widgets=1 diff --git a/user/.config/qt6ct/qt6ct.conf b/user/.config/qt6ct/qt6ct.conf index aa88b4acf..6f85a8818 100644 --- a/user/.config/qt6ct/qt6ct.conf +++ b/user/.config/qt6ct/qt6ct.conf @@ -1,12 +1,13 @@ [Appearance] color_scheme_path=/usr/share/qt6ct/colors/airy.conf custom_palette=false +icon_theme=gruvbox-dark-icons-gtk standard_dialogs=gtk2 style=qt6gtk2 [Fonts] -fixed="mononoki Nerd Font,10,-1,5,700,0,0,0,0,0,0,0,0,0,0,1,Bold" -general="mononoki Nerd Font,10,-1,5,700,0,0,0,0,0,0,0,0,0,0,1,Bold" +fixed="Mononoki Nerd Font,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" +general="Cantarell,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1,Regular" [Interface] activate_item_on_single_click=1 @@ -24,7 +25,7 @@ underline_shortcut=1 wheel_scroll_lines=3 [SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x32\0\0\a\x7f\0\0\x4\x37\0\0\0\0\0\0\0\x32\0\0\a\x7f\0\0\x4\x37\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\x32\0\0\a\x7f\0\0\x4\x37) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc\0\0\0\0\0\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\am\0\0\x3\xfc) [Troubleshooting] force_raster_widgets=1 diff --git a/user/.config/qutebrowser/bookmarks/urls b/user/.config/qutebrowser/bookmarks/urls deleted file mode 100644 index aa55874c3..000000000 --- a/user/.config/qutebrowser/bookmarks/urls +++ /dev/null @@ -1,14 +0,0 @@ -https://mail.google.com/ gmail -https://mail.tutanota.com/ tutanota -https://next.tuxcloud.top/ nextcloud -https://cloud.linode.com/ linode -https://odysee.com/ odysee -https://youtube.com/ youtube -https://fosstodon.org/ mastodon -https://gitlab.com/ gitlab -https://app.element.io/ element -https://web.whatsapp.com/ whatsapp -https://outlook.office.com/ intec-correo -https://lms.intec.edu.do/ intec-aula-virtual -https://procesos.intec.edu.do/ intec-procesos -https://dev.azure.com/INTEC-IDS323L-01-2022-04-Equipo-2/ intec-azure diff --git a/user/.config/qutebrowser/config.py b/user/.config/qutebrowser/config.py deleted file mode 100644 index 90660e8bd..000000000 --- a/user/.config/qutebrowser/config.py +++ /dev/null @@ -1,251 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom qutebrowser config -## - -# Autogenerated config.py -# -# NOTE: config.py is intended for advanced users who are comfortable -# with manually migrating the config file on qutebrowser upgrades. If -# you prefer, you can also configure qutebrowser using the -# :set/:bind/:config-* commands without having to write a config.py -# file. -# -# Documentation: -# qute://help/configuring.html -# qute://help/settings.html - -# Uncomment this to still load settings configured via autoconfig.yml -# config.load_autoconfig() -# Or uncomment this line to load settings from config.py -config.load_autoconfig(False) - -# Aliases for commands. The keys of the given dictionary are the -# aliases, while the values are the commands they map to. -# Type: Dict -c.aliases = {'q': 'quit', 'w': 'session-save', 'wq': 'quit --save'} - -# Setting dark mode -#config.set("colors.webpage.darkmode.enabled", True) - - -# Which cookies to accept. With QtWebEngine, this setting also controls -# other features with tracking capabilities similar to those of cookies; -# including IndexedDB, DOM storage, filesystem API, service workers, and -# AppCache. Note that with QtWebKit, only `all` and `never` are -# supported as per-domain values. Setting `no-3rdparty` or `no- -# unknown-3rdparty` per-domain on QtWebKit will have the same effect as -# `all`. -# Type: String -# Valid values: -# - all: Accept all cookies. -# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail. -# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty. -# - never: Don't accept cookies at all. -config.set('content.cookies.accept', 'all', 'chrome-devtools://*') - -# Which cookies to accept. With QtWebEngine, this setting also controls -# other features with tracking capabilities similar to those of cookies; -# including IndexedDB, DOM storage, filesystem API, service workers, and -# AppCache. Note that with QtWebKit, only `all` and `never` are -# supported as per-domain values. Setting `no-3rdparty` or `no- -# unknown-3rdparty` per-domain on QtWebKit will have the same effect as -# `all`. -# Type: String -# Valid values: -# - all: Accept all cookies. -# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail. -# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty. -# - never: Don't accept cookies at all. -config.set('content.cookies.accept', 'all', 'devtools://*') - -# User agent to send. The following placeholders are defined: * -# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`: -# The underlying WebKit version (set to a fixed value with -# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for -# QtWebEngine. * `{qt_version}`: The underlying Qt version. * -# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for -# QtWebEngine. * `{upstream_browser_version}`: The corresponding -# Safari/Chrome version. * `{qutebrowser_version}`: The currently -# running qutebrowser version. The default value is equal to the -# unchanged user agent of QtWebKit/QtWebEngine. Note that the value -# read from JavaScript is always the global value. With QtWebEngine -# between 5.12 and 5.14 (inclusive), changing the value exposed to -# JavaScript requires a restart. -# Type: FormatString -config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/{webkit_version} (KHTML, like Gecko) {upstream_browser_key}/{upstream_browser_version} Safari/{webkit_version}', 'https://web.whatsapp.com/') - -# User agent to send. The following placeholders are defined: * -# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`: -# The underlying WebKit version (set to a fixed value with -# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for -# QtWebEngine. * `{qt_version}`: The underlying Qt version. * -# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for -# QtWebEngine. * `{upstream_browser_version}`: The corresponding -# Safari/Chrome version. * `{qutebrowser_version}`: The currently -# running qutebrowser version. The default value is equal to the -# unchanged user agent of QtWebKit/QtWebEngine. Note that the value -# read from JavaScript is always the global value. With QtWebEngine -# between 5.12 and 5.14 (inclusive), changing the value exposed to -# JavaScript requires a restart. -# Type: FormatString -config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko/20100101 Firefox/71.0', 'https://accounts.google.com/*') - -# User agent to send. The following placeholders are defined: * -# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`: -# The underlying WebKit version (set to a fixed value with -# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for -# QtWebEngine. * `{qt_version}`: The underlying Qt version. * -# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for -# QtWebEngine. * `{upstream_browser_version}`: The corresponding -# Safari/Chrome version. * `{qutebrowser_version}`: The currently -# running qutebrowser version. The default value is equal to the -# unchanged user agent of QtWebKit/QtWebEngine. Note that the value -# read from JavaScript is always the global value. With QtWebEngine -# between 5.12 and 5.14 (inclusive), changing the value exposed to -# JavaScript requires a restart. -# Type: FormatString -config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99 Safari/537.36', 'https://*.slack.com/*') - -# User agent to send. The following placeholders are defined: * -# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`: -# The underlying WebKit version (set to a fixed value with -# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for -# QtWebEngine. * `{qt_version}`: The underlying Qt version. * -# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for -# QtWebEngine. * `{upstream_browser_version}`: The corresponding -# Safari/Chrome version. * `{qutebrowser_version}`: The currently -# running qutebrowser version. The default value is equal to the -# unchanged user agent of QtWebKit/QtWebEngine. Note that the value -# read from JavaScript is always the global value. With QtWebEngine -# between 5.12 and 5.14 (inclusive), changing the value exposed to -# JavaScript requires a restart. -# Type: FormatString -config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko/20100101 Firefox/71.0', 'https://docs.google.com/*') - -# User agent to send. The following placeholders are defined: * -# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`: -# The underlying WebKit version (set to a fixed value with -# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for -# QtWebEngine. * `{qt_version}`: The underlying Qt version. * -# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for -# QtWebEngine. * `{upstream_browser_version}`: The corresponding -# Safari/Chrome version. * `{qutebrowser_version}`: The currently -# running qutebrowser version. The default value is equal to the -# unchanged user agent of QtWebKit/QtWebEngine. Note that the value -# read from JavaScript is always the global value. With QtWebEngine -# between 5.12 and 5.14 (inclusive), changing the value exposed to -# JavaScript requires a restart. -# Type: FormatString -config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:71.0) Gecko/20100101 Firefox/71.0', 'https://drive.google.com/*') - -# Load images automatically in web pages. -# Type: Bool -config.set('content.images', True, 'chrome-devtools://*') - -# Load images automatically in web pages. -# Type: Bool -config.set('content.images', True, 'devtools://*') - -# Enable JavaScript. -# Type: Bool -config.set('content.javascript.enabled', True, 'chrome-devtools://*') - -# Enable JavaScript. -# Type: Bool -config.set('content.javascript.enabled', True, 'devtools://*') - -# Enable JavaScript. -# Type: Bool -config.set('content.javascript.enabled', True, 'chrome://*/*') - -# Enable JavaScript. -# Type: Bool -config.set('content.javascript.enabled', True, 'qute://*/*') - -# Type: BoolAsk -# Valid values: -# - true -# - false -# - ask -# config.set('content.notifications.enabled', True, 'https://www.youtube.com') - -# Directory to save downloads to. If unset, a sensible OS-specific -# default is used. -# Type: Directory -c.downloads.location.directory = '~/downloads' - -# When to show the tab bar. -# Type: String -# Valid values: -# - always: Always show the tab bar. -# - never: Always hide the tab bar. -# - multiple: Hide the tab bar if only one tab is open. -# - switching: Show the tab bar when switching tabs. -c.tabs.show = 'always' - -# Setting default page for when opening new tabs or new windows with -# commands like :open -t and :open -w . -c.url.default_page = 'https://start.duckduckgo.com' -c.url.start_pages = 'https://start.duckduckgo.com' - -# Search engines which can be used via the address bar. Maps a search -# engine name (such as `DEFAULT`, or `ddg`) to a URL with a `{}` -# placeholder. The placeholder will be replaced by the search term, use -# `{{` and `}}` for literal `{`/`}` braces. The following further -# placeholds are defined to configure how special characters in the -# search terms are replaced by safe characters (called 'quoting'): * -# `{}` and `{semiquoted}` quote everything except slashes; this is the -# most sensible choice for almost all search engines (for the search -# term `slash/and&` this placeholder expands to `slash/and%26amp`). -# * `{quoted}` quotes all characters (for `slash/and&` this -# placeholder expands to `slash%2Fand%26amp`). * `{unquoted}` quotes -# nothing (for `slash/and&` this placeholder expands to -# `slash/and&`). The search engine named `DEFAULT` is used when -# `url.auto_search` is turned on and something else than a URL was -# entered to be opened. Other search engines can be used by prepending -# the search engine name to the search term, e.g. `:open google -# qutebrowser`. -# Type: Dict -c.url.searchengines = {'DEFAULT': 'https://duckduckgo.com/?q={}', 'aw': 'https://wiki.archlinux.org/?search={}', 'ub': 'https://www.urbandictionary.com/define.php?term={}', 'wiki': 'https://en.wikipedia.org/wiki/{}'} - -# Default font families to use. Whenever "default_family" is used in a -# font setting, it's replaced with the fonts listed here. If set to an -# empty value, a system-specific monospace default is used. -# Type: List of Font, or Font -c.fonts.default_family = '"mononoki Nerd Font"' - -# Default font size to use. Whenever "default_size" is used in a font -# setting, it's replaced with the size listed here. Valid values are -# either a float value with a "pt" suffix, or an integer value with a -# "px" suffix. -# Type: String -c.fonts.default_size = '10pt' - -# Font used in the completion widget. -# Type: Font -c.fonts.completion.entry = '10pt "mononoki Nerd Font"' - -# Font used for the debugging console. -# Type: Font -c.fonts.debug_console = '10pt "mononoki Nerd Font"' - -# Font used for prompts. -# Type: Font -c.fonts.prompts = 'default_size sans-serif' - -# Font used in the statusbar. -# Type: Font -c.fonts.statusbar = '10pt "mononoki Nerd Font"' - -config.source('gruvbox.py') - -# Bindings for normal mode -config.bind('M', 'hint links spawn mpv {hint-url}') -config.bind('Z', 'hint links spawn st -e youtube-dl {hint-url}') -config.bind('t', 'set-cmd-text -s :open -t') -config.bind('xb', 'config-cycle statusbar.show always never') -config.bind('xt', 'config-cycle tabs.show always never') -config.bind('xx', 'config-cycle statusbar.show always never;; config-cycle tabs.show always never') diff --git a/user/.config/qutebrowser/gruvbox.py b/user/.config/qutebrowser/gruvbox.py deleted file mode 100644 index e2704fcd5..000000000 --- a/user/.config/qutebrowser/gruvbox.py +++ /dev/null @@ -1,332 +0,0 @@ -# gruvbox dark hard qutebrowser theme by Florian Bruhin -# -# Originally based on: -# base16-qutebrowser (https://github.com/theova/base16-qutebrowser) -# Base16 qutebrowser template by theova and Daniel Mulford -# Gruvbox dark, hard scheme by Dawid Kurek (dawikur@gmail.com), morhetz (https://github.com/morhetz/gruvbox) - -bg0_hard = "#1d2021" -bg0_soft = '#32302f' -bg0_normal = '#282828' - -bg0 = bg0_normal -bg1 = "#3c3836" -bg2 = "#504945" -bg3 = "#665c54" -bg4 = "#7c6f64" - -fg0 = "#fbf1c7" -fg1 = "#ebdbb2" -fg2 = "#d5c4a1" -fg3 = "#bdae93" -fg4 = "#a89984" - -bright_red = "#fb4934" -bright_green = "#b8bb26" -bright_yellow = "#fabd2f" -bright_blue = "#83a598" -bright_purple = "#d3869b" -bright_aqua = "#8ec07c" -bright_gray = "#928374" -bright_orange = "#fe8019" - -dark_red = "#cc241d" -dark_green = "#98971a" -dark_yellow = "#d79921" -dark_blue = "#458588" -dark_purple = "#b16286" -dark_aqua = "#689d6a" -dark_gray = "#a89984" -dark_orange = "#d65d0e" - -### Completion - -# Text color of the completion widget. May be a single color to use for -# all columns or a list of three colors, one for each column. -c.colors.completion.fg = [fg1, bright_aqua, bright_yellow] - -# Background color of the completion widget for odd rows. -c.colors.completion.odd.bg = bg0 - -# Background color of the completion widget for even rows. -c.colors.completion.even.bg = c.colors.completion.odd.bg - -# Foreground color of completion widget category headers. -c.colors.completion.category.fg = bright_blue - -# Background color of the completion widget category headers. -c.colors.completion.category.bg = bg1 - -# Top border color of the completion widget category headers. -c.colors.completion.category.border.top = c.colors.completion.category.bg - -# Bottom border color of the completion widget category headers. -c.colors.completion.category.border.bottom = c.colors.completion.category.bg - -# Foreground color of the selected completion item. -c.colors.completion.item.selected.fg = fg0 - -# Background color of the selected completion item. -c.colors.completion.item.selected.bg = bg4 - -# Top border color of the selected completion item. -c.colors.completion.item.selected.border.top = bg2 - -# Bottom border color of the selected completion item. -c.colors.completion.item.selected.border.bottom = c.colors.completion.item.selected.border.top - -# Foreground color of the matched text in the selected completion item. -c.colors.completion.item.selected.match.fg = bright_orange - -# Foreground color of the matched text in the completion. -c.colors.completion.match.fg = c.colors.completion.item.selected.match.fg - -# Color of the scrollbar handle in the completion view. -c.colors.completion.scrollbar.fg = c.colors.completion.item.selected.fg - -# Color of the scrollbar in the completion view. -c.colors.completion.scrollbar.bg = c.colors.completion.category.bg - -### Context menu - -# Background color of disabled items in the context menu. -c.colors.contextmenu.disabled.bg = bg3 - -# Foreground color of disabled items in the context menu. -c.colors.contextmenu.disabled.fg = fg3 - -# Background color of the context menu. If set to null, the Qt default is used. -c.colors.contextmenu.menu.bg = bg0 - -# Foreground color of the context menu. If set to null, the Qt default is used. -c.colors.contextmenu.menu.fg = fg2 - -# Background color of the context menu’s selected item. If set to null, the Qt default is used. -c.colors.contextmenu.selected.bg = bg2 - -#Foreground color of the context menu’s selected item. If set to null, the Qt default is used. -c.colors.contextmenu.selected.fg = c.colors.contextmenu.menu.fg - -### Downloads - -# Background color for the download bar. -c.colors.downloads.bar.bg = bg0 - -# Color gradient start for download text. -c.colors.downloads.start.fg = bg0 - -# Color gradient start for download backgrounds. -c.colors.downloads.start.bg = bright_blue - -# Color gradient end for download text. -c.colors.downloads.stop.fg = c.colors.downloads.start.fg - -# Color gradient stop for download backgrounds. -c.colors.downloads.stop.bg = bright_aqua - -# Foreground color for downloads with errors. -c.colors.downloads.error.fg = bright_red - -### Hints - -# Font color for hints. -c.colors.hints.fg = bg0 - -# Background color for hints. -c.colors.hints.bg = 'rgba(250, 191, 47, 200)' # bright_yellow - -# Font color for the matched part of hints. -c.colors.hints.match.fg = bg4 - -### Keyhint widget - -# Text color for the keyhint widget. -c.colors.keyhint.fg = fg4 - -# Highlight color for keys to complete the current keychain. -c.colors.keyhint.suffix.fg = fg0 - -# Background color of the keyhint widget. -c.colors.keyhint.bg = bg0 - -### Messages - -# Foreground color of an error message. -c.colors.messages.error.fg = bg0 - -# Background color of an error message. -c.colors.messages.error.bg = bright_red - -# Border color of an error message. -c.colors.messages.error.border = c.colors.messages.error.bg - -# Foreground color of a warning message. -c.colors.messages.warning.fg = bg0 - -# Background color of a warning message. -c.colors.messages.warning.bg = bright_purple - -# Border color of a warning message. -c.colors.messages.warning.border = c.colors.messages.warning.bg - -# Foreground color of an info message. -c.colors.messages.info.fg = fg2 - -# Background color of an info message. -c.colors.messages.info.bg = bg0 - -# Border color of an info message. -c.colors.messages.info.border = c.colors.messages.info.bg - -### Prompts - -# Foreground color for prompts. -c.colors.prompts.fg = fg2 - -# Border used around UI elements in prompts. -c.colors.prompts.border = f'1px solid {bg1}' - -# Background color for prompts. -c.colors.prompts.bg = bg3 - -# Background color for the selected item in filename prompts. -c.colors.prompts.selected.bg = bg2 - -### Statusbar - -# Foreground color of the statusbar. -c.colors.statusbar.normal.fg = fg2 - -# Background color of the statusbar. -c.colors.statusbar.normal.bg = bg0 - -# Foreground color of the statusbar in insert mode. -c.colors.statusbar.insert.fg = bg0 - -# Background color of the statusbar in insert mode. -c.colors.statusbar.insert.bg = dark_aqua - -# Foreground color of the statusbar in passthrough mode. -c.colors.statusbar.passthrough.fg = bg0 - -# Background color of the statusbar in passthrough mode. -c.colors.statusbar.passthrough.bg = dark_blue - -# Foreground color of the statusbar in private browsing mode. -c.colors.statusbar.private.fg = bright_purple - -# Background color of the statusbar in private browsing mode. -c.colors.statusbar.private.bg = bg0 - -# Foreground color of the statusbar in command mode. -c.colors.statusbar.command.fg = fg3 - -# Background color of the statusbar in command mode. -c.colors.statusbar.command.bg = bg1 - -# Foreground color of the statusbar in private browsing + command mode. -c.colors.statusbar.command.private.fg = c.colors.statusbar.private.fg - -# Background color of the statusbar in private browsing + command mode. -c.colors.statusbar.command.private.bg = c.colors.statusbar.command.bg - -# Foreground color of the statusbar in caret mode. -c.colors.statusbar.caret.fg = bg0 - -# Background color of the statusbar in caret mode. -c.colors.statusbar.caret.bg = dark_purple - -# Foreground color of the statusbar in caret mode with a selection. -c.colors.statusbar.caret.selection.fg = c.colors.statusbar.caret.fg - -# Background color of the statusbar in caret mode with a selection. -c.colors.statusbar.caret.selection.bg = bright_purple - -# Background color of the progress bar. -c.colors.statusbar.progress.bg = bright_blue - -# Default foreground color of the URL in the statusbar. -c.colors.statusbar.url.fg = fg4 - -# Foreground color of the URL in the statusbar on error. -c.colors.statusbar.url.error.fg = dark_red - -# Foreground color of the URL in the statusbar for hovered links. -c.colors.statusbar.url.hover.fg = bright_orange - -# Foreground color of the URL in the statusbar on successful load -# (http). -c.colors.statusbar.url.success.http.fg = bright_red - -# Foreground color of the URL in the statusbar on successful load -# (https). -c.colors.statusbar.url.success.https.fg = fg0 - -# Foreground color of the URL in the statusbar when there's a warning. -c.colors.statusbar.url.warn.fg = bright_purple - -### tabs - -# Background color of the tab bar. -c.colors.tabs.bar.bg = bg0 - -# Color gradient start for the tab indicator. -c.colors.tabs.indicator.start = bright_blue - -# Color gradient end for the tab indicator. -c.colors.tabs.indicator.stop = bright_aqua - -# Color for the tab indicator on errors. -c.colors.tabs.indicator.error = bright_red - -# Foreground color of unselected odd tabs. -c.colors.tabs.odd.fg = fg2 - -# Background color of unselected odd tabs. -c.colors.tabs.odd.bg = bg2 - -# Foreground color of unselected even tabs. -c.colors.tabs.even.fg = c.colors.tabs.odd.fg - -# Background color of unselected even tabs. -c.colors.tabs.even.bg = bg3 - -# Foreground color of selected odd tabs. -c.colors.tabs.selected.odd.fg = fg2 - -# Background color of selected odd tabs. -c.colors.tabs.selected.odd.bg = bg0 - -# Foreground color of selected even tabs. -c.colors.tabs.selected.even.fg = c.colors.tabs.selected.odd.fg - -# Background color of selected even tabs. -c.colors.tabs.selected.even.bg = bg0 - -# Background color of pinned unselected even tabs. -c.colors.tabs.pinned.even.bg = bright_green - -# Foreground color of pinned unselected even tabs. -c.colors.tabs.pinned.even.fg = bg2 - -# Background color of pinned unselected odd tabs. -c.colors.tabs.pinned.odd.bg = bright_green - -# Foreground color of pinned unselected odd tabs. -c.colors.tabs.pinned.odd.fg = c.colors.tabs.pinned.even.fg - -# Background color of pinned selected even tabs. -c.colors.tabs.pinned.selected.even.bg = bg0 - -# Foreground color of pinned selected even tabs. -c.colors.tabs.pinned.selected.even.fg = c.colors.tabs.selected.odd.fg - -# Background color of pinned selected odd tabs. -c.colors.tabs.pinned.selected.odd.bg = c.colors.tabs.pinned.selected.even.bg - -# Foreground color of pinned selected odd tabs. -c.colors.tabs.pinned.selected.odd.fg = c.colors.tabs.selected.odd.fg - -# Background color for webpages if unset (or empty to use the theme's -# color). -c.colors.webpage.bg = bg4 diff --git a/user/.config/rofi/config.rasi b/user/.config/rofi/config.rasi index e9635bfeb..a4a28cbc8 100644 --- a/user/.config/rofi/config.rasi +++ b/user/.config/rofi/config.rasi @@ -3,14 +3,15 @@ configuration{ lines: 10; font: "mononoki Nerd Font 14"; show-icons: true; + icon-theme: "gruvbox-dark-icons-gtk"; terminal: "alacritty"; drun-display-format: "{icon} {name}"; location: 0; disable-history: false; hide-scrollbar: true; - display-drun: "  Apps "; + display-drun: " 󰀻 Apps "; display-run: " ï„” Run "; - display-window: " ï©Ż Window "; + display-window: " 󰖯 Window "; display-Network: " 󰀚 Network "; sidebar-mode: true; dpi: 100; diff --git a/new-config/.config/rofi/scripts/rofi_blue b/user/.config/rofi/scripts/rofi_blue similarity index 100% rename from new-config/.config/rofi/scripts/rofi_blue rename to user/.config/rofi/scripts/rofi_blue diff --git a/user/.config/rofi/scripts/rofi_emoji b/user/.config/rofi/scripts/rofi_emoji index ed12a2899..e90268c05 100755 --- a/user/.config/rofi/scripts/rofi_emoji +++ b/user/.config/rofi/scripts/rofi_emoji @@ -1,1839 +1,1859 @@ #!/bin/bash -# This files comes from: -# https://github.com/porras/dmenu-emoji -# -# If this file includes emojis below "__DATA__" it is generated. -# This file was generated: 2022-04-21 12:38:03+00:00 - -set -e - -case "$1" in - "list") - data=$(sed '0,/^__DATA__$/d' "$0") - echo "$data" - ;; - "copy") - input=$(tee) - if [ ! -z "$input" ]; then - emoji=${input: -1} - echo -n "$emoji" | xclip -selection c - command -v notify-send > /dev/null && notify-send "$emoji copied!" - fi - ;; - "") - bash $0 list | rofi -dmenu -p 'Emoji: ' | bash $0 copy - ;; -esac - +wtype 0 +if [ $? -eq 0 ] +then + sed '1,/^### DATA ###$/d' $0 | rofi -dmenu -i -p " 󰙃 Select Emoji " | cut -d ' ' -f 1 | tr -d '\n' | wtype - +else + sed '1,/^### DATA ###$/d' $0 | rofi -dmenu -i -p " 󰙃 Select Emoji " | cut -d ' ' -f 1 | tr -d '\n' | wl-copy +fi exit - -__DATA__ -grinning face 😀 -grinning face with big eyes 😃 -grinning face with smiling eyes 😄 -beaming face with smiling eyes 😁 -grinning squinting face 😆 -grinning face with sweat 😅 -rolling on the floor laughing đŸ€Ł -face with tears of joy 😂 -slightly smiling face 🙂 -upside-down face 🙃 -winking face 😉 -smiling face with smiling eyes 😊 -smiling face with halo 😇 -smiling face with hearts đŸ„° -smiling face with heart-eyes 😍 -star-struck đŸ€© -face blowing a kiss 😘 -kissing face 😗 -smiling face â˜ș -kissing face with closed eyes 😚 -kissing face with smiling eyes 😙 -smiling face with tear đŸ„Č -face savoring food 😋 -face with tongue 😛 -winking face with tongue 😜 -zany face đŸ€Ș -squinting face with tongue 😝 -money-mouth face đŸ€‘ -hugging face đŸ€— -face with hand over mouth đŸ€­ -shushing face đŸ€« -thinking face đŸ€” -zipper-mouth face đŸ€ -face with raised eyebrow đŸ€š -neutral face 😐 -expressionless face 😑 -face without mouth đŸ˜¶ -smirking face 😏 -unamused face 😒 -face with rolling eyes 🙄 -grimacing face 😬 -face exhaling 😼‍ -lying face đŸ€„ -relieved face 😌 -pensive face 😔 -sleepy face đŸ˜Ș -drooling face đŸ€€ -sleeping face 😮 -face with medical mask đŸ˜· -face with thermometer đŸ€’ -face with head-bandage đŸ€• -nauseated face đŸ€ą -face vomiting đŸ€ź -sneezing face đŸ€§ -hot face đŸ„” -cold face đŸ„¶ -woozy face đŸ„Ž -knocked-out face đŸ˜” -exploding head đŸ€Ż -cowboy hat face đŸ€  -partying face đŸ„ł -disguised face đŸ„ž -smiling face with sunglasses 😎 -nerd face đŸ€“ -face with monocle 🧐 -confused face 😕 -worried face 😟 -slightly frowning face 🙁 -face with open mouth 😼 -hushed face 😯 -astonished face đŸ˜Č -flushed face 😳 -pleading face đŸ„ș -frowning face with open mouth 😩 -anguished face 😧 -fearful face 😹 -anxious face with sweat 😰 -sad but relieved face đŸ˜„ -crying face 😱 -loudly crying face 😭 -face screaming in fear đŸ˜± -confounded face 😖 -persevering face 😣 -disappointed face 😞 -downcast face with sweat 😓 -weary face đŸ˜© -tired face đŸ˜« -yawning face đŸ„± -face with steam from nose đŸ˜€ -pouting face 😡 -angry face 😠 -face with symbols on mouth đŸ€Ź -smiling face with horns 😈 -angry face with horns 👿 -skull 💀 -skull and crossbones ☠ -pile of poo đŸ’© -clown face đŸ€Ą -ogre đŸ‘č -goblin đŸ‘ș -ghost đŸ‘» -alien đŸ‘œ -alien monster đŸ‘Ÿ -robot đŸ€– -grinning cat đŸ˜ș -grinning cat with smiling eyes 😾 -cat with tears of joy đŸ˜č -smiling cat with heart-eyes đŸ˜» -cat with wry smile đŸ˜Œ -kissing cat đŸ˜œ -weary cat 🙀 -crying cat 😿 -pouting cat đŸ˜Ÿ -see-no-evil monkey 🙈 -hear-no-evil monkey 🙉 -speak-no-evil monkey 🙊 -kiss mark 💋 -love letter 💌 -heart with arrow 💘 -heart with ribbon 💝 -sparkling heart 💖 -growing heart 💗 -beating heart 💓 -revolving hearts 💞 -two hearts 💕 -heart decoration 💟 -heart exclamation âŁïž -broken heart 💔 -heart on fire â€ïžâ€đŸ”„ -mending heart ❀‍đŸ©č -red heart ❀ -orange heart 🧡 -yellow heart 💛 -green heart 💚 -blue heart 💙 -purple heart 💜 -brown heart đŸ€Ž -black heart đŸ–€ -white heart đŸ€ -hundred points 💯 -anger symbol 💱 -collision đŸ’„ -dizzy đŸ’« -sweat droplets 💩 -dashing away 💹 -hole đŸ•łïž -bomb 💣 -speech balloon 💬 -eye in speech bubble đŸ‘ïžâ€đŸ—šïž -left speech bubble đŸ—šïž -right anger bubble đŸ—Żïž -thought balloon 💭 -zzz đŸ’€ -waving hand 👋 -raised back of hand đŸ€š -hand with fingers splayed đŸ–ïž -raised hand ✋ -vulcan salute 🖖 -OK hand 👌 -pinched fingers đŸ€Œ -pinching hand đŸ€ -victory hand ✌ -crossed fingers đŸ€ž -love-you gesture đŸ€Ÿ -sign of the horns đŸ€˜ -call me hand đŸ€™ -backhand index pointing left 👈 -backhand index pointing right 👉 -backhand index pointing up 👆 -middle finger 🖕 -backhand index pointing down 👇 -index pointing up ☝ -thumbs up 👍 -thumbs down 👎 -raised fist ✊ -oncoming fist 👊 -left-facing fist đŸ€› -right-facing fist đŸ€œ -clapping hands 👏 -raising hands 🙌 -open hands 👐 -palms up together đŸ€Č -handshake đŸ€ -folded hands 🙏 -writing hand ✍ -nail polish 💅 -selfie đŸ€ł -flexed biceps đŸ’Ș -mechanical arm đŸŠŸ -mechanical leg 🩿 -leg đŸŠ” -foot đŸŠ¶ -ear 👂 -ear with hearing aid đŸŠ» -nose 👃 -brain 🧠 -anatomical heart đŸ«€ -lungs đŸ« -tooth đŸŠ· -bone 🩮 -eyes 👀 -eye đŸ‘ïž -tongue 👅 -mouth 👄 -baby đŸ‘¶ -child 🧒 -boy 👩 -girl 👧 -person 🧑 -person: blond hair đŸ‘± -man 👹 -person: beard 🧔 -man: beard đŸ§”â€â™‚ïž -woman: beard đŸ§”â€â™€ïž -man: red hair 👹‍🩰 -man: curly hair đŸ‘šâ€đŸŠ± -man: white hair 👹‍🩳 -man: bald 👹‍đŸŠČ -woman đŸ‘© -woman: red hair đŸ‘©â€đŸŠ° -person: red hair 🧑‍🩰 -woman: curly hair đŸ‘©â€đŸŠ± -person: curly hair đŸ§‘â€đŸŠ± -woman: white hair đŸ‘©â€đŸŠł -person: white hair 🧑‍🩳 -woman: bald đŸ‘©â€đŸŠČ -person: bald 🧑‍đŸŠČ -woman: blond hair đŸ‘±â€â™€ïž -man: blond hair đŸ‘±â€â™‚ïž -older person 🧓 -old man 👮 -old woman đŸ‘” -person frowning 🙍 -man frowning đŸ™â€â™‚ïž -woman frowning đŸ™â€â™€ïž -person pouting 🙎 -man pouting đŸ™Žâ€â™‚ïž -woman pouting đŸ™Žâ€â™€ïž -person gesturing NO 🙅 -man gesturing NO đŸ™…â€â™‚ïž -woman gesturing NO đŸ™…â€â™€ïž -person gesturing OK 🙆 -man gesturing OK đŸ™†â€â™‚ïž -woman gesturing OK đŸ™†â€â™€ïž -person tipping hand 💁 -man tipping hand đŸ’â€â™‚ïž -woman tipping hand đŸ’â€â™€ïž -person raising hand 🙋 -man raising hand đŸ™‹â€â™‚ïž -woman raising hand đŸ™‹â€â™€ïž -deaf person 🧏 -deaf man đŸ§â€â™‚ïž -deaf woman đŸ§â€â™€ïž -person bowing 🙇 -man bowing đŸ™‡â€â™‚ïž -woman bowing đŸ™‡â€â™€ïž -person facepalming đŸ€Š -man facepalming đŸ€Šâ€â™‚ïž -woman facepalming đŸ€Šâ€â™€ïž -person shrugging đŸ€· -man shrugging đŸ€·â€â™‚ïž -woman shrugging đŸ€·â€â™€ïž -health worker đŸ§‘â€âš•ïž -man health worker đŸ‘šâ€âš•ïž -woman health worker đŸ‘©â€âš•ïž -student 🧑‍🎓 -man student 👹‍🎓 -woman student đŸ‘©â€đŸŽ“ -teacher đŸ§‘â€đŸ« -man teacher đŸ‘šâ€đŸ« -woman teacher đŸ‘©â€đŸ« -judge đŸ§‘â€âš–ïž -man judge đŸ‘šâ€âš–ïž -woman judge đŸ‘©â€âš–ïž -farmer đŸ§‘â€đŸŒŸ -man farmer đŸ‘šâ€đŸŒŸ -woman farmer đŸ‘©â€đŸŒŸ -cook 🧑‍🍳 -man cook 👹‍🍳 -woman cook đŸ‘©â€đŸł -mechanic 🧑‍🔧 -man mechanic 👹‍🔧 -woman mechanic đŸ‘©â€đŸ”§ -factory worker 🧑‍🏭 -man factory worker 👹‍🏭 -woman factory worker đŸ‘©â€đŸ­ -office worker đŸ§‘â€đŸ’Œ -man office worker đŸ‘šâ€đŸ’Œ -woman office worker đŸ‘©â€đŸ’Œ -scientist 🧑‍🔬 -man scientist 👹‍🔬 -woman scientist đŸ‘©â€đŸ”Ź -technologist đŸ§‘â€đŸ’» -man technologist đŸ‘šâ€đŸ’» -woman technologist đŸ‘©â€đŸ’» -singer đŸ§‘â€đŸŽ€ -man singer đŸ‘šâ€đŸŽ€ -woman singer đŸ‘©â€đŸŽ€ -artist 🧑‍🎹 -man artist 👹‍🎹 -woman artist đŸ‘©â€đŸŽš -pilot đŸ§‘â€âœˆïž -man pilot đŸ‘šâ€âœˆïž -woman pilot đŸ‘©â€âœˆïž -astronaut 🧑‍🚀 -man astronaut 👹‍🚀 -woman astronaut đŸ‘©â€đŸš€ -firefighter 🧑‍🚒 -man firefighter 👹‍🚒 -woman firefighter đŸ‘©â€đŸš’ -police officer 👼 -man police officer đŸ‘źâ€â™‚ïž -woman police officer đŸ‘źâ€â™€ïž -detective đŸ•”ïž -man detective đŸ•”ïžâ€â™‚ïž -woman detective đŸ•”ïžâ€â™€ïž -guard 💂 -man guard đŸ’‚â€â™‚ïž -woman guard đŸ’‚â€â™€ïž -ninja đŸ„· -construction worker đŸ‘· -man construction worker đŸ‘·â€â™‚ïž -woman construction worker đŸ‘·â€â™€ïž -prince đŸ€Ž -princess 👾 -person wearing turban 👳 -man wearing turban đŸ‘łâ€â™‚ïž -woman wearing turban đŸ‘łâ€â™€ïž -person with skullcap đŸ‘Č -woman with headscarf 🧕 -person in tuxedo đŸ€” -man in tuxedo đŸ€”â€â™‚ïž -woman in tuxedo đŸ€”â€â™€ïž -person with veil 👰 -man with veil đŸ‘°â€â™‚ïž -woman with veil đŸ‘°â€â™€ïž -pregnant woman đŸ€° -breast-feeding đŸ€± -woman feeding baby đŸ‘©â€đŸŒ -man feeding baby đŸ‘šâ€đŸŒ -person feeding baby đŸ§‘â€đŸŒ -baby angel đŸ‘Œ -Santa Claus 🎅 -Mrs. Claus đŸ€¶ -mx claus 🧑‍🎄 -superhero 🩾 -man superhero đŸŠžâ€â™‚ïž -woman superhero đŸŠžâ€â™€ïž -supervillain đŸŠč -man supervillain đŸŠč‍♂ -woman supervillain đŸŠč‍♀ -mage 🧙 -man mage đŸ§™â€â™‚ïž -woman mage đŸ§™â€â™€ïž -fairy 🧚 -man fairy đŸ§šâ€â™‚ïž -woman fairy đŸ§šâ€â™€ïž -vampire 🧛 -man vampire đŸ§›â€â™‚ïž -woman vampire đŸ§›â€â™€ïž -merperson 🧜 -merman đŸ§œâ€â™‚ïž -mermaid đŸ§œâ€â™€ïž -elf 🧝 -man elf đŸ§â€â™‚ïž -woman elf đŸ§â€â™€ïž -genie 🧞 -man genie đŸ§žâ€â™‚ïž -woman genie đŸ§žâ€â™€ïž -zombie 🧟 -man zombie đŸ§Ÿâ€â™‚ïž -woman zombie đŸ§Ÿâ€â™€ïž -person getting massage 💆 -man getting massage đŸ’†â€â™‚ïž -woman getting massage đŸ’†â€â™€ïž -person getting haircut 💇 -man getting haircut đŸ’‡â€â™‚ïž -woman getting haircut đŸ’‡â€â™€ïž -person walking đŸš¶ -man walking đŸš¶â€â™‚ïž -woman walking đŸš¶â€â™€ïž -person standing 🧍 -man standing đŸ§â€â™‚ïž -woman standing đŸ§â€â™€ïž -person kneeling 🧎 -man kneeling đŸ§Žâ€â™‚ïž -woman kneeling đŸ§Žâ€â™€ïž -person with white cane 🧑‍🩯 -man with white cane 👹‍🩯 -woman with white cane đŸ‘©â€đŸŠŻ -person in motorized wheelchair đŸ§‘â€đŸŠŒ -man in motorized wheelchair đŸ‘šâ€đŸŠŒ -woman in motorized wheelchair đŸ‘©â€đŸŠŒ -person in manual wheelchair đŸ§‘â€đŸŠœ -man in manual wheelchair đŸ‘šâ€đŸŠœ -woman in manual wheelchair đŸ‘©â€đŸŠœ -person running 🏃 -man running đŸƒâ€â™‚ïž -woman running đŸƒâ€â™€ïž -woman dancing 💃 -man dancing đŸ•ș -person in suit levitating đŸ•Žïž -people with bunny ears 👯 -men with bunny ears đŸ‘Żâ€â™‚ïž -women with bunny ears đŸ‘Żâ€â™€ïž -person in steamy room 🧖 -man in steamy room đŸ§–â€â™‚ïž -woman in steamy room đŸ§–â€â™€ïž -person climbing 🧗 -man climbing đŸ§—â€â™‚ïž -woman climbing đŸ§—â€â™€ïž -person fencing đŸ€ș -horse racing 🏇 -skier ⛷ -snowboarder 🏂 -person golfing đŸŒïž -man golfing đŸŒïžâ€â™‚ïž -woman golfing đŸŒïžâ€â™€ïž -person surfing 🏄 -man surfing đŸ„â€â™‚ïž -woman surfing đŸ„â€â™€ïž -person rowing boat 🚣 -man rowing boat đŸšŁâ€â™‚ïž -woman rowing boat đŸšŁâ€â™€ïž -person swimming 🏊 -man swimming đŸŠâ€â™‚ïž -woman swimming đŸŠâ€â™€ïž -person bouncing ball â›č -man bouncing ball â›č‍♂ -woman bouncing ball â›č‍♀ -person lifting weights đŸ‹ïž -man lifting weights đŸ‹ïžâ€â™‚ïž -woman lifting weights đŸ‹ïžâ€â™€ïž -person biking 🚮 -man biking đŸšŽâ€â™‚ïž -woman biking đŸšŽâ€â™€ïž -person mountain biking đŸš” -man mountain biking đŸš”â€â™‚ïž -woman mountain biking đŸš”â€â™€ïž -person cartwheeling đŸ€ž -man cartwheeling đŸ€žâ€â™‚ïž -woman cartwheeling đŸ€žâ€â™€ïž -people wrestling đŸ€Œ -men wrestling đŸ€Œâ€â™‚ïž -women wrestling đŸ€Œâ€â™€ïž -person playing water polo đŸ€œ -man playing water polo đŸ€œâ€â™‚ïž -woman playing water polo đŸ€œâ€â™€ïž -person playing handball đŸ€Ÿ -man playing handball đŸ€Ÿâ€â™‚ïž -woman playing handball đŸ€Ÿâ€â™€ïž -person juggling đŸ€č -man juggling đŸ€č‍♂ -woman juggling đŸ€č‍♀ -person in lotus position 🧘 -man in lotus position đŸ§˜â€â™‚ïž -woman in lotus position đŸ§˜â€â™€ïž -person taking bath 🛀 -person in bed 🛌 -people holding hands đŸ§‘â€đŸ€â€đŸ§‘ -women holding hands 👭 -woman and man holding hands đŸ‘« -men holding hands 👬 -kiss 💏 -kiss: woman n đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘š -kiss: man n đŸ‘šâ€â€ïžâ€đŸ’‹â€đŸ‘š -kiss: woman n đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘© -couple with heart 💑 -couple with heart: woman man đŸ‘©â€â€ïžâ€đŸ‘š -couple with heart: man man đŸ‘šâ€â€ïžâ€đŸ‘š -couple with heart: woman man đŸ‘©â€â€ïžâ€đŸ‘© -family đŸ‘Ș -family: man wo boy đŸ‘šâ€đŸ‘©â€đŸ‘Š -family: man wom girl đŸ‘šâ€đŸ‘©â€đŸ‘§ -family: man woman girl boy đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘Š -family: man woman boy boy đŸ‘šâ€đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: man woman girl girl đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘§ -family: man boy 👹‍👹‍👩 -family: man m girl 👹‍👹‍👧 -family: man man girl boy 👹‍👹‍👧‍👩 -family: man man boy boy 👹‍👹‍👩‍👩 -family: man man girl girl 👹‍👹‍👧‍👧 -family: woman wo boy đŸ‘©â€đŸ‘©â€đŸ‘Š -family: woman wom girl đŸ‘©â€đŸ‘©â€đŸ‘§ -family: woman woman girl boy đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘Š -family: woman woman boy boy đŸ‘©â€đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: woman woman girl girl đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘§ -family: man boy 👹‍👩 -family: man boy 👹‍👩‍👩 -family: man girl 👹‍👧 -family: man g boy 👹‍👧‍👩 -family: man gi girl 👹‍👧‍👧 -family: woman boy đŸ‘©â€đŸ‘Š -family: woman boy đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: woman girl đŸ‘©â€đŸ‘§ -family: woman g boy đŸ‘©â€đŸ‘§â€đŸ‘Š -family: woman gi girl đŸ‘©â€đŸ‘§â€đŸ‘§ -speaking head đŸ—Łïž -bust in silhouette đŸ‘€ -busts in silhouette đŸ‘„ -people hugging đŸ«‚ -footprints 👣 -monkey face đŸ” -monkey 🐒 -gorilla 🩍 -orangutan 🩧 -dog face đŸ¶ -dog 🐕 -guide dog 🩼 -service dog 🐕‍đŸŠș -poodle đŸ© -wolf đŸș -fox 🩊 -raccoon 🩝 -cat face đŸ± -cat 🐈 -black cat 🐈‍⬛ -lion 🩁 -tiger face 🐯 -tiger 🐅 -leopard 🐆 -horse face 🐮 -horse 🐎 -unicorn 🩄 -zebra 🩓 -deer 🩌 -bison 🩬 -cow face 🐼 -ox 🐂 -water buffalo 🐃 -cow 🐄 -pig face đŸ· -pig 🐖 -boar 🐗 -pig nose đŸœ -ram 🐏 -ewe 🐑 -goat 🐐 -camel đŸȘ -two-hump camel đŸ« -llama 🩙 -giraffe 🩒 -elephant 🐘 -mammoth 🩣 -rhinoceros 🩏 -hippopotamus 🩛 -mouse face 🐭 -mouse 🐁 -rat 🐀 -hamster đŸč -rabbit face 🐰 -rabbit 🐇 -chipmunk đŸżïž -beaver đŸŠ« -hedgehog 🩔 -bat 🩇 -bear đŸ» -polar bear đŸ»â€â„ïž -koala 🐹 -panda đŸŒ -sloth đŸŠ„ -otter 🩩 -skunk 🩹 -kangaroo 🩘 -badger 🩡 -paw prints đŸŸ -turkey 🩃 -chicken 🐔 -rooster 🐓 -hatching chick 🐣 -baby chick đŸ€ -front-facing baby chick đŸ„ -bird 🐩 -penguin 🐧 -dove đŸ•Šïž -eagle 🩅 -duck 🩆 -swan 🩱 -owl 🩉 -dodo đŸŠ€ -feather đŸȘ¶ -flamingo đŸŠ© -peacock 🩚 -parrot 🩜 -frog 🐾 -crocodile 🐊 -turtle 🐱 -lizard 🩎 -snake 🐍 -dragon face đŸČ -dragon 🐉 -sauropod 🩕 -T-Rex 🩖 -spouting whale 🐳 -whale 🐋 -dolphin 🐬 -seal 🩭 -fish 🐟 -tropical fish 🐠 -blowfish 🐡 -shark 🩈 -octopus 🐙 -spiral shell 🐚 -snail 🐌 -butterfly 🩋 -bug 🐛 -ant 🐜 -honeybee 🐝 -beetle đŸȘČ -lady beetle 🐞 -cricket 🩗 -cockroach đŸȘł -spider đŸ•·ïž -spider web đŸ•žïž -scorpion 🩂 -mosquito 🩟 -fly đŸȘ° -worm đŸȘ± -microbe 🩠 -bouquet 💐 -cherry blossom 🌾 -white flower 💼 -rosette đŸ”ïž -rose đŸŒč -wilted flower đŸ„€ -hibiscus đŸŒș -sunflower đŸŒ» -blossom đŸŒŒ -tulip đŸŒ· -seedling đŸŒ± -potted plant đŸȘŽ -evergreen tree đŸŒČ -deciduous tree 🌳 -palm tree 🌮 -cactus đŸŒ” -sheaf of rice đŸŒŸ -herb 🌿 -shamrock ☘ -four leaf clover 🍀 -maple leaf 🍁 -fallen leaf 🍂 -leaf fluttering in wind 🍃 -grapes 🍇 -melon 🍈 -watermelon 🍉 -tangerine 🍊 -lemon 🍋 -banana 🍌 -pineapple 🍍 -mango đŸ„­ -red apple 🍎 -green apple 🍏 -pear 🍐 -peach 🍑 -cherries 🍒 -strawberry 🍓 -blueberries đŸ« -kiwi fruit đŸ„ -tomato 🍅 -olive đŸ«’ -coconut đŸ„„ -avocado đŸ„‘ -eggplant 🍆 -potato đŸ„” -carrot đŸ„• -ear of corn đŸŒœ -hot pepper đŸŒ¶ïž -bell pepper đŸ«‘ -cucumber đŸ„’ -leafy green đŸ„Ź -broccoli đŸ„Š -garlic 🧄 -onion 🧅 -mushroom 🍄 -peanuts đŸ„œ -chestnut 🌰 -bread 🍞 -croissant đŸ„ -baguette bread đŸ„– -flatbread đŸ«“ -pretzel đŸ„š -bagel đŸ„Ż -pancakes đŸ„ž -waffle 🧇 -cheese wedge 🧀 -meat on bone 🍖 -poultry leg 🍗 -cut of meat đŸ„© -bacon đŸ„“ -hamburger 🍔 -french fries 🍟 -pizza 🍕 -hot dog 🌭 -sandwich đŸ„Ș -taco 🌼 -burrito 🌯 -tamale đŸ«” -stuffed flatbread đŸ„™ -falafel 🧆 -egg đŸ„š -cooking 🍳 -shallow pan of food đŸ„˜ -pot of food đŸČ -fondue đŸ«• -bowl with spoon đŸ„Ł -green salad đŸ„— -popcorn 🍿 -butter 🧈 -salt 🧂 -canned food đŸ„« -bento box đŸ± -rice cracker 🍘 -rice ball 🍙 -cooked rice 🍚 -curry rice 🍛 -steaming bowl 🍜 -spaghetti 🍝 -roasted sweet potato 🍠 -oden 🍱 -sushi 🍣 -fried shrimp đŸ€ -fish cake with swirl đŸ„ -moon cake đŸ„ź -dango 🍡 -dumpling đŸ„Ÿ -fortune cookie đŸ„  -takeout box đŸ„Ą -crab 🩀 -lobster 🩞 -shrimp 🩐 -squid 🩑 -oyster đŸŠȘ -soft ice cream 🍩 -shaved ice 🍧 -ice cream 🍹 -doughnut đŸ© -cookie đŸȘ -birthday cake 🎂 -shortcake 🍰 -cupcake 🧁 -pie đŸ„§ -chocolate bar đŸ« -candy 🍬 -lollipop 🍭 -custard 🍼 -honey pot 🍯 -baby bottle đŸŒ -glass of milk đŸ„› -hot beverage ☕ -teapot đŸ«– -teacup without handle đŸ” -sake đŸ¶ -bottle with popping cork đŸŸ -wine glass đŸ· -cocktail glass 🍾 -tropical drink đŸč -beer mug đŸș -clinking beer mugs đŸ» -clinking glasses đŸ„‚ -tumbler glass đŸ„ƒ -cup with straw đŸ„€ -bubble tea 🧋 -beverage box 🧃 -mate 🧉 -ice 🧊 -chopsticks đŸ„ą -fork and knife with plate đŸœïž -fork and knife 🍮 -spoon đŸ„„ -kitchen knife đŸ”Ș -amphora đŸș -globe showing Europe-Africa 🌍 -globe showing Americas 🌎 -globe showing Asia-Australia 🌏 -globe with meridians 🌐 -world map đŸ—ș -map of Japan đŸ—Ÿ -compass 🧭 -snow-capped mountain đŸ”ïž -mountain ⛰ -volcano 🌋 -mount fuji đŸ—» -camping đŸ•ïž -beach with umbrella đŸ–ïž -desert đŸœïž -desert island đŸïž -national park đŸžïž -stadium đŸŸïž -classical building đŸ›ïž -building construction đŸ—ïž -brick đŸ§± -rock đŸȘš -wood đŸȘ” -hut 🛖 -houses đŸ˜ïž -derelict house đŸšïž -house 🏠 -house with garden 🏡 -office building 🏱 -Japanese post office 🏣 -post office đŸ€ -hospital đŸ„ -bank 🏩 -hotel 🏹 -love hotel đŸ© -convenience store đŸȘ -school đŸ« -department store 🏬 -factory 🏭 -Japanese castle 🏯 -castle 🏰 -wedding 💒 -Tokyo tower đŸ—Œ -Statue of Liberty đŸ—œ -church â›Ș -mosque 🕌 -hindu temple 🛕 -synagogue 🕍 -shinto shrine ⛩ -kaaba 🕋 -fountain â›Č -tent â›ș -foggy 🌁 -night with stars 🌃 -cityscape đŸ™ïž -sunrise over mountains 🌄 -sunrise 🌅 -cityscape at dusk 🌆 -sunset 🌇 -bridge at night 🌉 -hot springs ♚ -carousel horse 🎠 -ferris wheel 🎡 -roller coaster 🎱 -barber pole 💈 -circus tent đŸŽȘ -locomotive 🚂 -railway car 🚃 -high-speed train 🚄 -bullet train 🚅 -train 🚆 -metro 🚇 -light rail 🚈 -station 🚉 -tram 🚊 -monorail 🚝 -mountain railway 🚞 -tram car 🚋 -bus 🚌 -oncoming bus 🚍 -trolleybus 🚎 -minibus 🚐 -ambulance 🚑 -fire engine 🚒 -police car 🚓 -oncoming police car 🚔 -taxi 🚕 -oncoming taxi 🚖 -automobile 🚗 -oncoming automobile 🚘 -sport utility vehicle 🚙 -pickup truck đŸ›» -delivery truck 🚚 -articulated lorry 🚛 -tractor 🚜 -racing car đŸŽïž -motorcycle đŸïž -motor scooter đŸ›” -manual wheelchair đŸŠœ -motorized wheelchair đŸŠŒ -auto rickshaw đŸ›ș -bicycle đŸšČ -kick scooter 🛮 -skateboard đŸ›č -roller skate đŸ›Œ -bus stop 🚏 -motorway đŸ›Łïž -railway track đŸ›€ïž -oil drum đŸ›ąïž -fuel pump ⛜ -police car light 🚹 -horizontal traffic light đŸš„ -vertical traffic light 🚩 -stop sign 🛑 -construction 🚧 -anchor ⚓ -sailboat â›” -canoe đŸ›¶ -speedboat đŸš€ -passenger ship đŸ›łïž -ferry ⛎ -motor boat đŸ›„ïž -ship 🚱 -airplane ✈ -small airplane đŸ›©ïž -airplane departure đŸ›« -airplane arrival 🛬 -parachute đŸȘ‚ -seat đŸ’ș -helicopter 🚁 -suspension railway 🚟 -mountain cableway 🚠 -aerial tramway 🚡 -satellite đŸ›°ïž -rocket 🚀 -flying saucer 🛾 -bellhop bell đŸ›Žïž -luggage 🧳 -hourglass done ⌛ -hourglass not done ⏳ -watch ⌚ -alarm clock ⏰ -stopwatch ⏱ -timer clock âČ -mantelpiece clock đŸ•°ïž -twelve o’clock 🕛 -twelve-thirty 🕧 -one o’clock 🕐 -one-thirty 🕜 -two o’clock 🕑 -two-thirty 🕝 -three o’clock 🕒 -three-thirty 🕞 -four o’clock 🕓 -four-thirty 🕟 -five o’clock 🕔 -five-thirty 🕠 -six o’clock 🕕 -six-thirty 🕡 -seven o’clock 🕖 -seven-thirty 🕱 -eight o’clock 🕗 -eight-thirty 🕣 -nine o’clock 🕘 -nine-thirty đŸ•€ -ten o’clock 🕙 -ten-thirty đŸ•„ -eleven o’clock 🕚 -eleven-thirty 🕩 -new moon 🌑 -waxing crescent moon 🌒 -first quarter moon 🌓 -waxing gibbous moon 🌔 -full moon 🌕 -waning gibbous moon 🌖 -last quarter moon 🌗 -waning crescent moon 🌘 -crescent moon 🌙 -new moon face 🌚 -first quarter moon face 🌛 -last quarter moon face 🌜 -thermometer đŸŒĄïž -sun ☀ -full moon face 🌝 -sun with face 🌞 -ringed planet đŸȘ -star ⭐ -glowing star 🌟 -shooting star 🌠 -milky way 🌌 -cloud ☁ -sun behind cloud ⛅ -cloud with lightning and rain ⛈ -sun behind small cloud đŸŒ€ïž -sun behind large cloud đŸŒ„ïž -sun behind rain cloud đŸŒŠïž -cloud with rain đŸŒ§ïž -cloud with snow đŸŒšïž -cloud with lightning đŸŒ©ïž -tornado đŸŒȘ -fog đŸŒ«ïž -wind face đŸŒŹïž -cyclone 🌀 -rainbow 🌈 -closed umbrella 🌂 -umbrella ☂ -umbrella with rain drops ☔ -umbrella on ground ⛱ -high voltage ⚡ -snowflake ❄ -snowman ☃ -snowman without snow ⛄ -comet ☄ -fire đŸ”„ -droplet 💧 -water wave 🌊 -jack-o-lantern 🎃 -Christmas tree 🎄 -fireworks 🎆 -sparkler 🎇 -firecracker 🧹 -sparkles ✹ -balloon 🎈 -party popper 🎉 -confetti ball 🎊 -tanabata tree 🎋 -pine decoration 🎍 -Japanese dolls 🎎 -carp streamer 🎏 -wind chime 🎐 -moon viewing ceremony 🎑 -red envelope 🧧 -ribbon 🎀 -wrapped gift 🎁 -reminder ribbon đŸŽ—ïž -admission tickets đŸŽŸïž -ticket đŸŽ« -military medal đŸŽ–ïž -trophy 🏆 -sports medal 🏅 -1st place medal đŸ„‡ -2nd place medal đŸ„ˆ -3rd place medal đŸ„‰ -soccer ball âšœ -baseball ⚟ -softball đŸ„Ž -basketball 🏀 -volleyball 🏐 -american football 🏈 -rugby football 🏉 -tennis đŸŽŸ -flying disc đŸ„ -bowling 🎳 -cricket game 🏏 -field hockey 🏑 -ice hockey 🏒 -lacrosse đŸ„ -ping pong 🏓 -badminton 🏾 -boxing glove đŸ„Š -martial arts uniform đŸ„‹ -goal net đŸ„… -flag in hole ⛳ -ice skate ⛞ -fishing pole 🎣 -diving mask đŸ€ż -running shirt đŸŽœ -skis 🎿 -sled đŸ›· -curling stone đŸ„Œ -bullseye 🎯 -yo-yo đŸȘ€ -kite đŸȘ -pool 8 ball đŸŽ± -crystal ball 🔼 -magic wand đŸȘ„ -nazar amulet 🧿 -video game 🎼 -joystick đŸ•č -slot machine 🎰 -game die đŸŽČ -puzzle piece đŸ§© -teddy bear 🧾 -piñata đŸȘ… -nesting dolls đŸȘ† -spade suit ♠ -heart suit ♄ -diamond suit ♊ -club suit â™Łïž -chess pawn ♟ -joker 🃏 -mahjong red dragon 🀄 -flower playing cards 🎮 -performing arts 🎭 -framed picture đŸ–Œïž -artist palette 🎹 -thread đŸ§” -sewing needle đŸȘĄ -yarn đŸ§¶ -knot đŸȘą -glasses 👓 -sunglasses đŸ•¶ïž -goggles đŸ„œ -lab coat đŸ„Œ -safety vest đŸŠș -necktie 👔 -t-shirt 👕 -jeans 👖 -scarf 🧣 -gloves đŸ§€ -coat đŸ§„ -socks 🧩 -dress 👗 -kimono 👘 -sari đŸ„» -one-piece swimsuit đŸ©± -briefs đŸ©Č -shorts đŸ©ł -bikini 👙 -woman’s clothes 👚 -purse 👛 -handbag 👜 -clutch bag 👝 -shopping bags đŸ›ïž -backpack 🎒 -thong sandal đŸ©Ž -man’s shoe 👞 -running shoe 👟 -hiking boot đŸ„Ÿ -flat shoe đŸ„ż -high-heeled shoe 👠 -woman’s sandal 👡 -ballet shoes đŸ©° -woman’s boot 👱 -crown 👑 -woman’s hat 👒 -top hat đŸŽ© -graduation cap 🎓 -billed cap 🧱 -military helmet đŸȘ– -rescue worker’s helmet ⛑ -prayer beads 📿 -lipstick 💄 -ring 💍 -gem stone 💎 -muted speaker 🔇 -speaker low volume 🔈 -speaker medium volume 🔉 -speaker high volume 🔊 -loudspeaker 📱 -megaphone 📣 -postal horn 📯 -bell 🔔 -bell with slash 🔕 -musical score đŸŽŒ -musical note đŸŽ” -musical notes đŸŽ¶ -studio microphone đŸŽ™ïž -level slider đŸŽšïž -control knobs đŸŽ›ïž -microphone đŸŽ€ -headphone 🎧 -radio đŸ“» -saxophone đŸŽ· -accordion đŸȘ— -guitar 🎾 -musical keyboard đŸŽč -trumpet đŸŽș -violin đŸŽ» -banjo đŸȘ• -drum đŸ„ -long drum đŸȘ˜ -mobile phone đŸ“± -mobile phone with arrow đŸ“Č -telephone ☎ -telephone receiver 📞 -pager 📟 -fax machine 📠 -battery 🔋 -electric plug 🔌 -laptop đŸ’» -desktop computer đŸ–„ïž -printer đŸ–šïž -keyboard ⌚ -computer mouse đŸ–±ïž -trackball đŸ–Č -computer disk đŸ’œ -floppy disk đŸ’Ÿ -optical disk 💿 -dvd 📀 -abacus 🧼 -movie camera đŸŽ„ -film frames đŸŽžïž -film projector đŸ“œïž -clapper board 🎬 -television đŸ“ș -camera đŸ“· -camera with flash 📾 -video camera đŸ“č -videocassette đŸ“Œ -magnifying glass tilted left 🔍 -magnifying glass tilted right 🔎 -candle đŸ•Żïž -light bulb 💡 -flashlight 🔩 -red paper lantern 🏼 -diya lamp đŸȘ” -notebook with decorative cover 📔 -closed book 📕 -open book 📖 -green book 📗 -blue book 📘 -orange book 📙 -books 📚 -notebook 📓 -ledger 📒 -page with curl 📃 -scroll 📜 -page facing up 📄 -newspaper 📰 -rolled-up newspaper đŸ—žïž -bookmark tabs 📑 -bookmark 🔖 -label đŸ·ïž -money bag 💰 -coin đŸȘ™ -yen banknote 💮 -dollar banknote đŸ’” -euro banknote đŸ’¶ -pound banknote đŸ’· -money with wings 💾 -credit card 💳 -receipt đŸ§Ÿ -chart increasing with yen đŸ’č -envelope ✉ -e-mail 📧 -incoming envelope 📹 -envelope with arrow đŸ“© -outbox tray đŸ“€ -inbox tray đŸ“„ -package 📩 -closed mailbox with raised flag đŸ“« -closed mailbox with lowered flag đŸ“Ș -open mailbox with raised flag 📬 -open mailbox with lowered flag 📭 -postbox 📼 -ballot box with ballot đŸ—łïž -pencil ✏ -black nib ✒ -fountain pen đŸ–‹ïž -pen đŸ–Šïž -paintbrush đŸ–Œïž -crayon đŸ–ïž -memo 📝 -briefcase đŸ’Œ -file folder 📁 -open file folder 📂 -card index dividers đŸ—‚ïž -calendar 📅 -tear-off calendar 📆 -spiral notepad đŸ—’ïž -spiral calendar đŸ—“ïž -card index 📇 -chart increasing 📈 -chart decreasing 📉 -bar chart 📊 -clipboard 📋 -pushpin 📌 -round pushpin 📍 -paperclip 📎 -linked paperclips đŸ–‡ïž -straight ruler 📏 -triangular ruler 📐 -scissors ✂ -card file box đŸ—ƒïž -file cabinet đŸ—„ïž -wastebasket đŸ—‘ïž -locked 🔒 -unlocked 🔓 -locked with pen 🔏 -locked with key 🔐 -key 🔑 -old key đŸ—ïž -hammer 🔹 -axe đŸȘ“ -pick ⛏ -hammer and pick ⚒ -hammer and wrench đŸ› ïž -dagger đŸ—Ąïž -crossed swords ⚔ -water pistol đŸ”« -boomerang đŸȘƒ -bow and arrow đŸč -shield đŸ›Ąïž -carpentry saw đŸȘš -wrench 🔧 -screwdriver đŸȘ› -nut and bolt đŸ”© -gear ⚙ -clamp đŸ—œïž -balance scale ⚖ -white cane 🩯 -link 🔗 -chains ⛓ -hook đŸȘ -toolbox 🧰 -magnet đŸ§Č -ladder đŸȘœ -alembic ⚗ -test tube đŸ§Ș -petri dish đŸ§« -dna 🧬 -microscope 🔬 -telescope 🔭 -satellite antenna 📡 -syringe 💉 -drop of blood đŸ©ž -pill 💊 -adhesive bandage đŸ©č -stethoscope đŸ©ș -door đŸšȘ -elevator 🛗 -mirror đŸȘž -window đŸȘŸ -bed đŸ›ïž -couch and lamp đŸ›‹ïž -chair đŸȘ‘ -toilet đŸšœ -plunger đŸȘ  -shower 🚿 -bathtub 🛁 -mouse trap đŸȘ€ -razor đŸȘ’ -lotion bottle 🧮 -safety pin đŸ§· -broom đŸ§č -basket đŸ§ș -roll of paper đŸ§» -bucket đŸȘŁ -soap đŸ§Œ -toothbrush đŸȘ„ -sponge đŸ§œ -fire extinguisher 🧯 -shopping cart 🛒 -cigarette 🚬 -coffin ⚰ -headstone đŸȘŠ -funeral urn ⚱ -moai 🗿 -placard đŸȘ§ -ATM sign 🏧 -litter in bin sign 🚼 -potable water 🚰 -wheelchair symbol ♿ -men’s room đŸšč -women’s room đŸšș -restroom đŸš» -baby symbol đŸšŒ -water closet đŸšŸ -passport control 🛂 -customs 🛃 -baggage claim 🛄 -left luggage 🛅 -warning ⚠ -children crossing 🚾 -no entry ⛔ -prohibited đŸš« -no bicycles 🚳 -no smoking 🚭 -no littering 🚯 -non-potable water đŸš± -no pedestrians đŸš· -no mobile phones đŸ“” -no one under eighteen 🔞 -radioactive â˜ąïž -biohazard â˜Łïž -up arrow âŹ†ïž -up-right arrow ↗ -right arrow âžĄïž -down-right arrow ↘ -down arrow âŹ‡ïž -down-left arrow ↙ -left arrow âŹ…ïž -up-left arrow ↖ -up-down arrow ↕ -left-right arrow ↔ -right arrow curving left ↩ -left arrow curving right â†Ș -right arrow curving up ‎ -right arrow curving down — -clockwise vertical arrows 🔃 -counterclockwise arrows button 🔄 -BACK arrow 🔙 -END arrow 🔚 -ON! arrow 🔛 -SOON arrow 🔜 -TOP arrow 🔝 -place of worship 🛐 -atom symbol ⚛ -om đŸ•‰ïž -star of David âœĄïž -wheel of dharma ☞ -yin yang â˜Żïž -latin cross ✝ -orthodox cross ☊ -star and crescent â˜Ș -peace symbol â˜źïž -menorah 🕎 -dotted six-pointed star 🔯 -Aries ♈ -Taurus ♉ -Gemini ♊ -Cancer ♋ -Leo ♌ -Virgo ♍ -Libra ♎ -Scorpio ♏ -Sagittarius ♐ -Capricorn ♑ -Aquarius ♒ -Pisces ♓ -Ophiuchus ⛎ -shuffle tracks button 🔀 -repeat button 🔁 -repeat single button 🔂 -play button ▶ -fast-forward button ⏩ -next track button ⏭ -play or pause button âŻïž -reverse button ◀ -fast reverse button âȘ -last track button âźïž -upwards button đŸ”Œ -fast up button ⏫ -downwards button đŸ”œ -fast down button ⏬ -pause button ⏞ -stop button âč -record button âș -eject button ⏏ -cinema 🎩 -dim button 🔅 -bright button 🔆 -antenna bars đŸ“¶ -vibration mode 📳 -mobile phone off 📮 -female sign ♀ -male sign ♂ -transgender symbol ⚧ -multiply ✖ -plus ➕ -minus ➖ -divide ➗ -infinity ♟ -double exclamation mark ‌ -exclamation question mark ⁉ -red question mark ❓ -white question mark ❔ -white exclamation mark ❕ -red exclamation mark ❗ -wavy dash ă€°ïž -currency exchange đŸ’± -heavy dollar sign đŸ’Č -medical symbol ⚕ -recycling symbol ♻ -fleur-de-lis ⚜ -trident emblem đŸ”± -name badge 📛 -Japanese symbol for beginner 🔰 -hollow red circle ⭕ -check mark button ✅ -check box with check ☑ -check mark ✔ -cross mark ❌ -cross mark button ❎ -curly loop ➰ -double curly loop ➿ -part alternation mark ă€œïž -eight-spoked asterisk âœłïž -eight-pointed star ✎ -sparkle ❇ -copyright © -registered Âźïž -trade mark â„ąïž -keycap: # #ïžâƒŁ -keycap: * *ïžâƒŁ -keycap: 0 0ïžâƒŁ -keycap: 1 1ïžâƒŁ -keycap: 2 2ïžâƒŁ -keycap: 3 3ïžâƒŁ -keycap: 4 4ïžâƒŁ -keycap: 5 5ïžâƒŁ -keycap: 6 6ïžâƒŁ -keycap: 7 7ïžâƒŁ -keycap: 8 8ïžâƒŁ -keycap: 9 9ïžâƒŁ -keycap: 10 🔟 -input latin uppercase 🔠 -input latin lowercase 🔡 -input numbers 🔱 -input symbols 🔣 -input latin letters đŸ”€ -A button (blood type) đŸ…°ïž -AB button (blood type) 🆎 -B button (blood type) đŸ…±ïž -CL button 🆑 -COOL button 🆒 -FREE button 🆓 -information â„č -ID button 🆔 -circled M Ⓜ -NEW button 🆕 -NG button 🆖 -O button (blood type) đŸ…Ÿïž -OK button 🆗 -P button đŸ…żïž -SOS button 🆘 -UP! button 🆙 -VS button 🆚 -Japanese “here” button 🈁 -Japanese “service charge” button đŸˆ‚ïž -Japanese “monthly amount” button đŸˆ·ïž -Japanese “not free of charge” butto đŸˆ¶ -Japanese “reserved” button 🈯 -Japanese “bargain” button 🉐 -Japanese “discount” button đŸˆč -Japanese “free of charge” button 🈚 -Japanese “prohibited” button đŸˆČ -Japanese “acceptable” button 🉑 -Japanese “application” button 🈾 -Japanese “passing grade” button 🈮 -Japanese “vacancy” button 🈳 -Japanese “congratulations” button ăŠ—ïž -Japanese “secret” button ăŠ™ïž -Japanese “open for business” button đŸˆș -Japanese “no vacancy” button đŸˆ” -red circle 🔮 -orange circle 🟠 -yellow circle 🟡 -green circle 🟱 -blue circle đŸ”” -purple circle 🟣 -brown circle đŸŸ€ -black circle ⚫ -white circle âšȘ -red square đŸŸ„ -orange square 🟧 -yellow square 🟹 -green square đŸŸ© -blue square 🟩 -purple square đŸŸȘ -brown square đŸŸ« -black large square ⬛ -white large square ⬜ -black medium square ◌ -white medium square ◻ -black medium-small square â—Ÿ -white medium-small square â—œ -black small square â–Ș -white small square ▫ -large orange diamond đŸ”¶ -large blue diamond đŸ”· -small orange diamond 🔾 -small blue diamond đŸ”č -red triangle pointed up đŸ”ș -red triangle pointed down đŸ”» -diamond with a dot 💠 -radio button 🔘 -white square button 🔳 -black square button đŸ”Č -chequered flag 🏁 -triangular flag đŸš© -crossed flags 🎌 -black flag 🏮 -white flag đŸłïž -rainbow flag đŸłïžâ€đŸŒˆ -transgender flag đŸłïžâ€âš§ïž -pirate flag đŸŽâ€â˜ ïž -flag: Ascension Island 🇩🇹 -flag: Andorra đŸ‡ŠđŸ‡© -flag: United Arab Emirates 🇩đŸ‡Ș -flag: Afghanistan đŸ‡ŠđŸ‡« -flag: Antigua & Barbuda 🇩🇬 -flag: Anguilla 🇩🇼 -flag: Albania đŸ‡ŠđŸ‡± -flag: Armenia 🇩đŸ‡Č -flag: Angola 🇩🇮 -flag: Antarctica đŸ‡ŠđŸ‡¶ -flag: Argentina đŸ‡ŠđŸ‡· -flag: American Samoa 🇩🇾 -flag: Austria 🇩đŸ‡č -flag: Australia 🇩đŸ‡ș -flag: Aruba đŸ‡ŠđŸ‡Œ -flag: Åland Islands đŸ‡ŠđŸ‡œ -flag: Azerbaijan 🇩🇿 -flag: Bosnia & Herzegovina 🇧🇩 -flag: Barbados 🇧🇧 -flag: Bangladesh đŸ‡§đŸ‡© -flag: Belgium 🇧đŸ‡Ș -flag: Burkina Faso đŸ‡§đŸ‡« -flag: Bulgaria 🇧🇬 -flag: Bahrain 🇧🇭 -flag: Burundi 🇧🇼 -flag: Benin 🇧🇯 -flag: St. BarthĂ©lemy đŸ‡§đŸ‡± -flag: Bermuda 🇧đŸ‡Č -flag: Brunei 🇧🇳 -flag: Bolivia 🇧🇮 -flag: Caribbean Netherlands đŸ‡§đŸ‡¶ -flag: Brazil đŸ‡§đŸ‡· -flag: Bahamas 🇧🇾 -flag: Bhutan 🇧đŸ‡č -flag: Bouvet Island đŸ‡§đŸ‡» -flag: Botswana đŸ‡§đŸ‡Œ -flag: Belarus đŸ‡§đŸ‡Ÿ -flag: Belize 🇧🇿 -flag: Canada 🇹🇩 -flag: Cocos (Keeling) Islands 🇹🇹 -flag: Congo - Kinshasa đŸ‡šđŸ‡© -flag: Central African Republic đŸ‡šđŸ‡« -flag: Congo - Brazzaville 🇹🇬 -flag: Switzerland 🇹🇭 -flag: CĂŽte d’Ivoire 🇹🇼 -flag: Cook Islands 🇹🇰 -flag: Chile đŸ‡šđŸ‡± -flag: Cameroon 🇹đŸ‡Č -flag: China 🇹🇳 -flag: Colombia 🇹🇮 -flag: Clipperton Island đŸ‡šđŸ‡” -flag: Costa Rica đŸ‡šđŸ‡· -flag: Cuba 🇹đŸ‡ș -flag: Cape Verde đŸ‡šđŸ‡» -flag: Curaçao đŸ‡šđŸ‡Œ -flag: Christmas Island đŸ‡šđŸ‡œ -flag: Cyprus đŸ‡šđŸ‡Ÿ -flag: Czechia 🇹🇿 -flag: Germany đŸ‡©đŸ‡Ș -flag: Diego Garcia đŸ‡©đŸ‡Ź -flag: Djibouti đŸ‡©đŸ‡Ż -flag: Denmark đŸ‡©đŸ‡° -flag: Dominica đŸ‡©đŸ‡Č -flag: Dominican Republic đŸ‡©đŸ‡Ž -flag: Algeria đŸ‡©đŸ‡ż -flag: Ceuta & Melilla đŸ‡Ș🇩 -flag: Ecuador đŸ‡Ș🇹 -flag: Estonia đŸ‡ȘđŸ‡Ș -flag: Egypt đŸ‡Ș🇬 -flag: Western Sahara đŸ‡Ș🇭 -flag: Eritrea đŸ‡ȘđŸ‡· -flag: Spain đŸ‡Ș🇾 -flag: Ethiopia đŸ‡ȘđŸ‡č -flag: European Union đŸ‡ȘđŸ‡ș -flag: Finland đŸ‡«đŸ‡ź -flag: Fiji đŸ‡«đŸ‡Ż -flag: Falkland Islands đŸ‡«đŸ‡° -flag: Micronesia đŸ‡«đŸ‡Č -flag: Faroe Islands đŸ‡«đŸ‡Ž -flag: France đŸ‡«đŸ‡· -flag: Gabon 🇬🇩 -flag: United Kingdom 🇬🇧 -flag: Grenada đŸ‡ŹđŸ‡© -flag: Georgia 🇬đŸ‡Ș -flag: French Guiana đŸ‡ŹđŸ‡« -flag: Guernsey 🇬🇬 -flag: Ghana 🇬🇭 -flag: Gibraltar 🇬🇼 -flag: Greenland đŸ‡ŹđŸ‡± -flag: Gambia 🇬đŸ‡Č -flag: Guinea 🇬🇳 -flag: Guadeloupe đŸ‡ŹđŸ‡” -flag: Equatorial Guinea đŸ‡ŹđŸ‡¶ -flag: Greece đŸ‡ŹđŸ‡· -flag: South Georgia & South Sandwiclands 🇬🇾 -flag: Guatemala 🇬đŸ‡č -flag: Guam 🇬đŸ‡ș -flag: Guinea-Bissau đŸ‡ŹđŸ‡Œ -flag: Guyana đŸ‡ŹđŸ‡Ÿ -flag: Hong Kong SAR China 🇭🇰 -flag: Heard & McDonald Islands 🇭đŸ‡Č -flag: Honduras 🇭🇳 -flag: Croatia đŸ‡­đŸ‡· -flag: Haiti 🇭đŸ‡č -flag: Hungary 🇭đŸ‡ș -flag: Canary Islands 🇼🇹 -flag: Indonesia đŸ‡źđŸ‡© -flag: Ireland 🇼đŸ‡Ș -flag: Israel đŸ‡źđŸ‡± -flag: Isle of Man 🇼đŸ‡Č -flag: India 🇼🇳 -flag: British Indian Ocean Territor 🇼🇮 -flag: Iraq đŸ‡źđŸ‡¶ -flag: Iran đŸ‡źđŸ‡· -flag: Iceland 🇼🇾 -flag: Italy 🇼đŸ‡č -flag: Jersey 🇯đŸ‡Ș -flag: Jamaica 🇯đŸ‡Č -flag: Jordan 🇯🇮 -flag: Japan đŸ‡ŻđŸ‡” -flag: Kenya 🇰đŸ‡Ș -flag: Kyrgyzstan 🇰🇬 -flag: Cambodia 🇰🇭 -flag: Kiribati 🇰🇼 -flag: Comoros 🇰đŸ‡Č -flag: St. Kitts & Nevis 🇰🇳 -flag: North Korea đŸ‡°đŸ‡” -flag: South Korea đŸ‡°đŸ‡· -flag: Kuwait đŸ‡°đŸ‡Œ -flag: Cayman Islands đŸ‡°đŸ‡Ÿ -flag: Kazakhstan 🇰🇿 -flag: Laos đŸ‡±đŸ‡Š -flag: Lebanon đŸ‡±đŸ‡§ -flag: St. Lucia đŸ‡±đŸ‡š -flag: Liechtenstein đŸ‡±đŸ‡ź -flag: Sri Lanka đŸ‡±đŸ‡° -flag: Liberia đŸ‡±đŸ‡· -flag: Lesotho đŸ‡±đŸ‡ž -flag: Lithuania đŸ‡±đŸ‡č -flag: Luxembourg đŸ‡±đŸ‡ș -flag: Latvia đŸ‡±đŸ‡» -flag: Libya đŸ‡±đŸ‡Ÿ -flag: Morocco đŸ‡Č🇩 -flag: Monaco đŸ‡Č🇹 -flag: Moldova đŸ‡ČđŸ‡© -flag: Montenegro đŸ‡ČđŸ‡Ș -flag: St. Martin đŸ‡ČđŸ‡« -flag: Madagascar đŸ‡Č🇬 -flag: Marshall Islands đŸ‡Č🇭 -flag: North Macedonia đŸ‡Č🇰 -flag: Mali đŸ‡ČđŸ‡± -flag: Myanmar (Burma) đŸ‡ČđŸ‡Č -flag: Mongolia đŸ‡Č🇳 -flag: Macao SAR China đŸ‡Č🇮 -flag: Northern Mariana Islands đŸ‡ČđŸ‡” -flag: Martinique đŸ‡ČđŸ‡¶ -flag: Mauritania đŸ‡ČđŸ‡· -flag: Montserrat đŸ‡Č🇾 -flag: Malta đŸ‡ČđŸ‡č -flag: Mauritius đŸ‡ČđŸ‡ș -flag: Maldives đŸ‡ČđŸ‡» -flag: Malawi đŸ‡ČđŸ‡Œ -flag: Mexico đŸ‡ČđŸ‡œ -flag: Malaysia đŸ‡ČđŸ‡Ÿ -flag: Mozambique đŸ‡Č🇿 -flag: Namibia 🇳🇩 -flag: New Caledonia 🇳🇹 -flag: Niger 🇳đŸ‡Ș -flag: Norfolk Island đŸ‡łđŸ‡« -flag: Nigeria 🇳🇬 -flag: Nicaragua 🇳🇼 -flag: Netherlands đŸ‡łđŸ‡± -flag: Norway 🇳🇮 -flag: Nepal đŸ‡łđŸ‡” -flag: Nauru đŸ‡łđŸ‡· -flag: Niue 🇳đŸ‡ș -flag: New Zealand 🇳🇿 -flag: Oman 🇮đŸ‡Č -flag: Panama đŸ‡”đŸ‡Š -flag: Peru đŸ‡”đŸ‡Ș -flag: French Polynesia đŸ‡”đŸ‡« -flag: Papua New Guinea đŸ‡”đŸ‡Ź -flag: Philippines đŸ‡”đŸ‡­ -flag: Pakistan đŸ‡”đŸ‡° -flag: Poland đŸ‡”đŸ‡± -flag: St. Pierre & Miquelon đŸ‡”đŸ‡Č -flag: Pitcairn Islands đŸ‡”đŸ‡ł -flag: Puerto Rico đŸ‡”đŸ‡· -flag: Palestinian Territories đŸ‡”đŸ‡ž -flag: Portugal đŸ‡”đŸ‡č -flag: Palau đŸ‡”đŸ‡Œ -flag: Paraguay đŸ‡”đŸ‡Ÿ -flag: Qatar đŸ‡¶đŸ‡Š -flag: RĂ©union đŸ‡·đŸ‡Ș -flag: Romania đŸ‡·đŸ‡Ž -flag: Serbia đŸ‡·đŸ‡ž -flag: Russia đŸ‡·đŸ‡ș -flag: Rwanda đŸ‡·đŸ‡Œ -flag: Saudi Arabia 🇾🇩 -flag: Solomon Islands 🇾🇧 -flag: Seychelles 🇾🇹 -flag: Sudan đŸ‡žđŸ‡© -flag: Sweden 🇾đŸ‡Ș -flag: Singapore 🇾🇬 -flag: St. Helena 🇾🇭 -flag: Slovenia 🇾🇼 -flag: Svalbard & Jan Mayen 🇾🇯 -flag: Slovakia 🇾🇰 -flag: Sierra Leone đŸ‡žđŸ‡± -flag: San Marino 🇾đŸ‡Č -flag: Senegal 🇾🇳 -flag: Somalia 🇾🇮 -flag: Suriname đŸ‡žđŸ‡· -flag: South Sudan 🇾🇾 -flag: SĂŁo TomĂ© & PrĂ­ncipe 🇾đŸ‡č -flag: El Salvador đŸ‡žđŸ‡» -flag: Sint Maarten đŸ‡žđŸ‡œ -flag: Syria đŸ‡žđŸ‡Ÿ -flag: Eswatini 🇾🇿 -flag: Tristan da Cunha đŸ‡č🇩 -flag: Turks & Caicos Islands đŸ‡č🇹 -flag: Chad đŸ‡čđŸ‡© -flag: French Southern Territories đŸ‡čđŸ‡« -flag: Togo đŸ‡č🇬 -flag: Thailand đŸ‡č🇭 -flag: Tajikistan đŸ‡č🇯 -flag: Tokelau đŸ‡č🇰 -flag: Timor-Leste đŸ‡čđŸ‡± -flag: Turkmenistan đŸ‡čđŸ‡Č -flag: Tunisia đŸ‡č🇳 -flag: Tonga đŸ‡č🇮 -flag: Turkey đŸ‡čđŸ‡· -flag: Trinidad & Tobago đŸ‡čđŸ‡č -flag: Tuvalu đŸ‡čđŸ‡» -flag: Taiwan đŸ‡čđŸ‡Œ -flag: Tanzania đŸ‡č🇿 -flag: Ukraine đŸ‡ș🇩 -flag: Uganda đŸ‡ș🇬 -flag: U.S. Outlying Islands đŸ‡șđŸ‡Č -flag: United Nations đŸ‡ș🇳 -flag: United States đŸ‡ș🇾 -flag: Uruguay đŸ‡șđŸ‡Ÿ -flag: Uzbekistan đŸ‡ș🇿 -flag: Vatican City đŸ‡»đŸ‡Š -flag: St. Vincent & Grenadines đŸ‡»đŸ‡š -flag: Venezuela đŸ‡»đŸ‡Ș -flag: British Virgin Islands đŸ‡»đŸ‡Ź -flag: U.S. Virgin Islands đŸ‡»đŸ‡ź -flag: Vietnam đŸ‡»đŸ‡ł -flag: Vanuatu đŸ‡»đŸ‡ș -flag: Wallis & Futuna đŸ‡ŒđŸ‡« -flag: Samoa đŸ‡ŒđŸ‡ž -flag: Kosovo đŸ‡œđŸ‡° -flag: Yemen đŸ‡ŸđŸ‡Ș -flag: Mayotte đŸ‡ŸđŸ‡č -flag: South Africa 🇿🇩 -flag: Zambia 🇿đŸ‡Č -flag: Zimbabwe đŸ‡żđŸ‡Œ -flag: England đŸŽó §ó ąó „ó źó §ó ż -flag: Scotland 🏮󠁧󠁱󠁳󠁣󠁮󠁿 -flag: Wales đŸŽó §ó ąó ·ó Źó łó ż +### DATA ### +😀 grinning face face smile happy joy :D grin +😃 grinning face with big eyes face happy joy haha :D :) smile funny +😄 grinning face with smiling eyes face happy joy funny haha laugh like :D :) smile +😁 beaming face with smiling eyes face happy smile joy kawaii +😆 grinning squinting face happy joy lol satisfied haha face glad XD laugh +😅 grinning face with sweat face hot happy laugh sweat smile relief +đŸ€Ł rolling on the floor laughing face rolling floor laughing lol haha rofl +😂 face with tears of joy face cry tears weep happy happytears haha +🙂 slightly smiling face face smile +🙃 upside down face face flipped silly smile +😉 winking face face happy mischievous secret ;) smile eye +😊 smiling face with smiling eyes face smile happy flushed crush embarrassed shy joy +😇 smiling face with halo face angel heaven halo +đŸ„° smiling face with hearts face love like affection valentines infatuation crush hearts adore +😍 smiling face with heart eyes face love like affection valentines infatuation crush heart +đŸ€© star struck face smile starry eyes grinning +😘 face blowing a kiss face love like affection valentines infatuation kiss +😗 kissing face love like face 3 valentines infatuation kiss +â˜ș smiling face face blush massage happiness +😚 kissing face with closed eyes face love like affection valentines infatuation kiss +😙 kissing face with smiling eyes face affection valentines infatuation kiss +😋 face savoring food happy joy tongue smile face silly yummy nom delicious savouring +😛 face with tongue face prank childish playful mischievous smile tongue +😜 winking face with tongue face prank childish playful mischievous smile wink tongue +đŸ€Ș zany face face goofy crazy +😝 squinting face with tongue face prank playful mischievous smile tongue +đŸ€‘ money mouth face face rich dollar money +đŸ€— hugging face face smile hug +đŸ€­ face with hand over mouth face whoops shock surprise +đŸ€« shushing face face quiet shhh +đŸ€” thinking face face hmmm think consider +đŸ€ zipper mouth face face sealed zipper secret +đŸ€š face with raised eyebrow face distrust scepticism disapproval disbelief surprise +😐 neutral face indifference meh :| neutral +😑 expressionless face face indifferent - - meh deadpan +đŸ˜¶ face without mouth face hellokitty +😏 smirking face face smile mean prank smug sarcasm +😒 unamused face indifference bored straight face serious sarcasm unimpressed skeptical dubious side eye +🙄 face with rolling eyes face eyeroll frustrated +😬 grimacing face face grimace teeth +đŸ€„ lying face face lie pinocchio +😌 relieved face face relaxed phew massage happiness +😔 pensive face face sad depressed upset +đŸ˜Ș sleepy face face tired rest nap +đŸ€€ drooling face face +😮 sleeping face face tired sleepy night zzz +đŸ˜· face with medical mask face sick ill disease +đŸ€’ face with thermometer sick temperature thermometer cold fever +đŸ€• face with head bandage injured clumsy bandage hurt +đŸ€ą nauseated face face vomit gross green sick throw up ill +đŸ€ź face vomiting face sick +đŸ€§ sneezing face face gesundheit sneeze sick allergy +đŸ„” hot face face feverish heat red sweating +đŸ„¶ cold face face blue freezing frozen frostbite icicles +đŸ„Ž woozy face face dizzy intoxicated tipsy wavy +đŸ˜” dizzy face spent unconscious xox dizzy +đŸ€Ż exploding head face shocked mind blown +đŸ€  cowboy hat face face cowgirl hat +đŸ„ł partying face face celebration woohoo +😎 smiling face with sunglasses face cool smile summer beach sunglass +đŸ€“ nerd face face nerdy geek dork +🧐 face with monocle face stuffy wealthy +😕 confused face face indifference huh weird hmmm :/ +😟 worried face face concern nervous :( +🙁 slightly frowning face face frowning disappointed sad upset +â˜č frowning face face sad upset frown +😼 face with open mouth face surprise impressed wow whoa :O +😯 hushed face face woo shh +đŸ˜Č astonished face face xox surprised poisoned +😳 flushed face face blush shy flattered +đŸ„ș pleading face face begging mercy +😩 frowning face with open mouth face aw what +😧 anguished face face stunned nervous +😹 fearful face face scared terrified nervous oops huh +😰 anxious face with sweat face nervous sweat +đŸ˜„ sad but relieved face face phew sweat nervous +😱 crying face face tears sad depressed upset :'( +😭 loudly crying face face cry tears sad upset depressed +đŸ˜± face screaming in fear face munch scared omg +😖 confounded face face confused sick unwell oops :S +😣 persevering face face sick no upset oops +😞 disappointed face face sad upset depressed :( +😓 downcast face with sweat face hot sad tired exercise +đŸ˜© weary face face tired sleepy sad frustrated upset +đŸ˜« tired face sick whine upset frustrated +đŸ„± yawning face tired sleepy +đŸ˜€ face with steam from nose face gas phew proud pride +😡 pouting face angry mad hate despise +😠 angry face mad face annoyed frustrated +đŸ€Ź face with symbols on mouth face swearing cursing cussing profanity expletive +😈 smiling face with horns devil horns +👿 angry face with horns devil angry horns +💀 skull dead skeleton creepy death +☠ skull and crossbones poison danger deadly scary death pirate evil +đŸ’© pile of poo hankey shitface fail turd shit +đŸ€Ą clown face face +đŸ‘č ogre monster red mask halloween scary creepy devil demon japanese ogre +đŸ‘ș goblin red evil mask monster scary creepy japanese goblin +đŸ‘» ghost halloween spooky scary +đŸ‘œ alien UFO paul weird outer space +đŸ‘Ÿ alien monster game arcade play +đŸ€– robot computer machine bot +đŸ˜ș grinning cat animal cats happy smile +😾 grinning cat with smiling eyes animal cats smile +đŸ˜č cat with tears of joy animal cats haha happy tears +đŸ˜» smiling cat with heart eyes animal love like affection cats valentines heart +đŸ˜Œ cat with wry smile animal cats smirk +đŸ˜œ kissing cat animal cats kiss +🙀 weary cat animal cats munch scared scream +😿 crying cat animal tears weep sad cats upset cry +đŸ˜Ÿ pouting cat animal cats +🙈 see no evil monkey monkey animal nature haha +🙉 hear no evil monkey animal monkey nature +🙊 speak no evil monkey monkey animal nature omg +💋 kiss mark face lips love like affection valentines +💌 love letter email like affection envelope valentines +💘 heart with arrow love like heart affection valentines +💝 heart with ribbon love valentines +💖 sparkling heart love like affection valentines +💗 growing heart like love affection valentines pink +💓 beating heart love like affection valentines pink heart +💞 revolving hearts love like affection valentines +💕 two hearts love like affection valentines heart +💟 heart decoration purple-square love like +âŁïž heart exclamation decoration love +💔 broken heart sad sorry break heart heartbreak +❀ red heart love like valentines +🧡 orange heart love like affection valentines +💛 yellow heart love like affection valentines +💚 green heart love like affection valentines +💙 blue heart love like affection valentines +💜 purple heart love like affection valentines +đŸ€Ž brown heart coffee +đŸ–€ black heart evil +đŸ€ white heart pure +💯 hundred points score perfect numbers century exam quiz test pass hundred +💱 anger symbol angry mad +đŸ’„ collision bomb explode explosion collision blown +đŸ’« dizzy star sparkle shoot magic +💩 sweat droplets water drip oops +💹 dashing away wind air fast shoo fart smoke puff +đŸ•łïž hole embarrassing +💣 bomb boom explode explosion terrorism +💬 speech balloon bubble words message talk chatting +đŸ‘ïžâ€đŸ—šïž eye in speech bubble info +đŸ—šïž left speech bubble words message talk chatting +đŸ—Żïž right anger bubble caption speech thinking mad +💭 thought balloon bubble cloud speech thinking dream +đŸ’€ zzz sleepy tired dream +👋 waving hand hands gesture goodbye solong farewell hello hi palm +đŸ€š raised back of hand fingers raised backhand +đŸ–ïž hand with fingers splayed hand fingers palm +✋ raised hand fingers stop highfive palm ban +🖖 vulcan salute hand fingers spock star trek +👌 ok hand fingers limbs perfect ok okay +đŸ€ pinching hand tiny small size +✌ victory hand fingers ohyeah hand peace victory two +đŸ€ž crossed fingers good lucky +đŸ€Ÿ love you gesture hand fingers gesture +đŸ€˜ sign of the horns hand fingers evil eye sign of horns rock on +đŸ€™ call me hand hands gesture shaka +👈 backhand index pointing left direction fingers hand left +👉 backhand index pointing right fingers hand direction right +👆 backhand index pointing up fingers hand direction up +🖕 middle finger hand fingers rude middle flipping +👇 backhand index pointing down fingers hand direction down +☝ index pointing up hand fingers direction up +👍 thumbs up thumbsup yes awesome good agree accept cool hand like +1 +👎 thumbs down thumbsdown no dislike hand -1 +✊ raised fist fingers hand grasp +👊 oncoming fist angry violence fist hit attack hand +đŸ€› left facing fist hand fistbump +đŸ€œ right facing fist hand fistbump +👏 clapping hands hands praise applause congrats yay +🙌 raising hands gesture hooray yea celebration hands +👐 open hands fingers butterfly hands open +đŸ€Č palms up together hands gesture cupped prayer +đŸ€ handshake agreement shake +🙏 folded hands please hope wish namaste highfive pray +✍ writing hand lower left ballpoint pen stationery write compose +💅 nail polish beauty manicure finger fashion nail +đŸ€ł selfie camera phone +đŸ’Ș flexed biceps arm flex hand summer strong biceps +đŸŠŸ mechanical arm accessibility +🩿 mechanical leg accessibility +đŸŠ” leg kick limb +đŸŠ¶ foot kick stomp +👂 ear face hear sound listen +đŸŠ» ear with hearing aid accessibility +👃 nose smell sniff +🧠 brain smart intelligent +đŸŠ· tooth teeth dentist +🩮 bone skeleton +👀 eyes look watch stalk peek see +đŸ‘ïž eye face look see watch stare +👅 tongue mouth playful +👄 mouth mouth kiss +đŸ‘¶ baby child boy girl toddler +🧒 child gender-neutral young +👩 boy man male guy teenager +👧 girl female woman teenager +🧑 person gender-neutral person +đŸ‘± person blond hair hairstyle +👹 man mustache father dad guy classy sir moustache +🧔 man beard person bewhiskered +👹‍🩰 man red hair hairstyle +đŸ‘šâ€đŸŠ± man curly hair hairstyle +👹‍🩳 man white hair old elder +👹‍đŸŠČ man bald hairless +đŸ‘© woman female girls lady +đŸ‘©â€đŸŠ° woman red hair hairstyle +🧑‍🩰 person red hair hairstyle +đŸ‘©â€đŸŠ± woman curly hair hairstyle +đŸ§‘â€đŸŠ± person curly hair hairstyle +đŸ‘©â€đŸŠł woman white hair old elder +🧑‍🩳 person white hair elder old +đŸ‘©â€đŸŠČ woman bald hairless +🧑‍đŸŠČ person bald hairless +đŸ‘±â€â™€ïž woman blond hair woman female girl blonde person +đŸ‘±â€â™‚ïž man blond hair man male boy blonde guy person +🧓 older person human elder senior gender-neutral +👮 old man human male men old elder senior +đŸ‘” old woman human female women lady old elder senior +🙍 person frowning worried +đŸ™â€â™‚ïž man frowning male boy man sad depressed discouraged unhappy +đŸ™â€â™€ïž woman frowning female girl woman sad depressed discouraged unhappy +🙎 person pouting upset +đŸ™Žâ€â™‚ïž man pouting male boy man +đŸ™Žâ€â™€ïž woman pouting female girl woman +🙅 person gesturing no decline +đŸ™…â€â™‚ïž man gesturing no male boy man nope +đŸ™…â€â™€ïž woman gesturing no female girl woman nope +🙆 person gesturing ok agree +đŸ™†â€â™‚ïž man gesturing ok men boy male blue human man +đŸ™†â€â™€ïž woman gesturing ok women girl female pink human woman +💁 person tipping hand information +đŸ’â€â™‚ïž man tipping hand male boy man human information +đŸ’â€â™€ïž woman tipping hand female girl woman human information +🙋 person raising hand question +đŸ™‹â€â™‚ïž man raising hand male boy man +đŸ™‹â€â™€ïž woman raising hand female girl woman +🧏 deaf person accessibility +đŸ§â€â™‚ïž deaf man accessibility +đŸ§â€â™€ïž deaf woman accessibility +🙇 person bowing respectiful +đŸ™‡â€â™‚ïž man bowing man male boy +đŸ™‡â€â™€ïž woman bowing woman female girl +đŸ€Š person facepalming disappointed +đŸ€Šâ€â™‚ïž man facepalming man male boy disbelief +đŸ€Šâ€â™€ïž woman facepalming woman female girl disbelief +đŸ€· person shrugging regardless +đŸ€·â€â™‚ïž man shrugging man male boy confused indifferent doubt +đŸ€·â€â™€ïž woman shrugging woman female girl confused indifferent doubt +đŸ§‘â€âš•ïž health worker hospital +đŸ‘šâ€âš•ïž man health worker doctor nurse therapist healthcare man human +đŸ‘©â€âš•ïž woman health worker doctor nurse therapist healthcare woman human +🧑‍🎓 student learn +👹‍🎓 man student graduate man human +đŸ‘©â€đŸŽ“ woman student graduate woman human +đŸ§‘â€đŸ« teacher professor +đŸ‘šâ€đŸ« man teacher instructor professor man human +đŸ‘©â€đŸ« woman teacher instructor professor woman human +đŸ§‘â€âš–ïž judge law +đŸ‘šâ€âš–ïž man judge justice court man human +đŸ‘©â€âš–ïž woman judge justice court woman human +đŸ§‘â€đŸŒŸ farmer crops +đŸ‘šâ€đŸŒŸ man farmer rancher gardener man human +đŸ‘©â€đŸŒŸ woman farmer rancher gardener woman human +🧑‍🍳 cook food kitchen culinary +👹‍🍳 man cook chef man human +đŸ‘©â€đŸł woman cook chef woman human +🧑‍🔧 mechanic worker technician +👹‍🔧 man mechanic plumber man human wrench +đŸ‘©â€đŸ”§ woman mechanic plumber woman human wrench +🧑‍🏭 factory worker labor +👹‍🏭 man factory worker assembly industrial man human +đŸ‘©â€đŸ­ woman factory worker assembly industrial woman human +đŸ§‘â€đŸ’Œ office worker business +đŸ‘šâ€đŸ’Œ man office worker business manager man human +đŸ‘©â€đŸ’Œ woman office worker business manager woman human +🧑‍🔬 scientist chemistry +👹‍🔬 man scientist biologist chemist engineer physicist man human +đŸ‘©â€đŸ”Ź woman scientist biologist chemist engineer physicist woman human +đŸ§‘â€đŸ’» technologist computer +đŸ‘šâ€đŸ’» man technologist coder developer engineer programmer software man human laptop computer +đŸ‘©â€đŸ’» woman technologist coder developer engineer programmer software woman human laptop computer +đŸ§‘â€đŸŽ€ singer song artist performer +đŸ‘šâ€đŸŽ€ man singer rockstar entertainer man human +đŸ‘©â€đŸŽ€ woman singer rockstar entertainer woman human +🧑‍🎹 artist painting draw creativity +👹‍🎹 man artist painter man human +đŸ‘©â€đŸŽš woman artist painter woman human +đŸ§‘â€âœˆïž pilot fly plane airplane +đŸ‘šâ€âœˆïž man pilot aviator plane man human +đŸ‘©â€âœˆïž woman pilot aviator plane woman human +🧑‍🚀 astronaut outerspace +👹‍🚀 man astronaut space rocket man human +đŸ‘©â€đŸš€ woman astronaut space rocket woman human +🧑‍🚒 firefighter fire +👹‍🚒 man firefighter fireman man human +đŸ‘©â€đŸš’ woman firefighter fireman woman human +👼 police officer cop +đŸ‘źâ€â™‚ïž man police officer man police law legal enforcement arrest 911 +đŸ‘źâ€â™€ïž woman police officer woman police law legal enforcement arrest 911 female +đŸ•”ïž detective human spy detective +đŸ•”ïžâ€â™‚ïž man detective crime +đŸ•”ïžâ€â™€ïž woman detective human spy detective female woman +💂 guard protect +đŸ’‚â€â™‚ïž man guard uk gb british male guy royal +đŸ’‚â€â™€ïž woman guard uk gb british female royal woman +đŸ‘· construction worker labor build +đŸ‘·â€â™‚ïž man construction worker male human wip guy build construction worker labor +đŸ‘·â€â™€ïž woman construction worker female human wip build construction worker labor woman +đŸ€Ž prince boy man male crown royal king +👾 princess girl woman female blond crown royal queen +👳 person wearing turban headdress +đŸ‘łâ€â™‚ïž man wearing turban male indian hinduism arabs +đŸ‘łâ€â™€ïž woman wearing turban female indian hinduism arabs woman +đŸ‘Č man with skullcap male boy chinese +🧕 woman with headscarf female hijab mantilla tichel +đŸ€” man in tuxedo couple marriage wedding groom +👰 bride with veil couple marriage wedding woman bride +đŸ€° pregnant woman baby +đŸ€± breast feeding nursing baby +đŸ‘Œ baby angel heaven wings halo +🎅 santa claus festival man male xmas father christmas +đŸ€¶ mrs claus woman female xmas mother christmas +🩾 superhero marvel +đŸŠžâ€â™‚ïž man superhero man male good hero superpowers +đŸŠžâ€â™€ïž woman superhero woman female good heroine superpowers +đŸŠč supervillain marvel +đŸŠč‍♂ man supervillain man male evil bad criminal hero superpowers +đŸŠč‍♀ woman supervillain woman female evil bad criminal heroine superpowers +🧙 mage magic +đŸ§™â€â™‚ïž man mage man male mage sorcerer +đŸ§™â€â™€ïž woman mage woman female mage witch +🧚 fairy wings magical +đŸ§šâ€â™‚ïž man fairy man male +đŸ§šâ€â™€ïž woman fairy woman female +🧛 vampire blood twilight +đŸ§›â€â™‚ïž man vampire man male dracula +đŸ§›â€â™€ïž woman vampire woman female +🧜 merperson sea +đŸ§œâ€â™‚ïž merman man male triton +đŸ§œâ€â™€ïž mermaid woman female merwoman ariel +🧝 elf magical +đŸ§â€â™‚ïž man elf man male +đŸ§â€â™€ïž woman elf woman female +🧞 genie magical wishes +đŸ§žâ€â™‚ïž man genie man male +đŸ§žâ€â™€ïž woman genie woman female +🧟 zombie dead +đŸ§Ÿâ€â™‚ïž man zombie man male dracula undead walking dead +đŸ§Ÿâ€â™€ïž woman zombie woman female undead walking dead +💆 person getting massage relax +đŸ’†â€â™‚ïž man getting massage male boy man head +đŸ’†â€â™€ïž woman getting massage female girl woman head +💇 person getting haircut hairstyle +đŸ’‡â€â™‚ïž man getting haircut male boy man +đŸ’‡â€â™€ïž woman getting haircut female girl woman +đŸš¶ person walking move +đŸš¶â€â™‚ïž man walking human feet steps +đŸš¶â€â™€ïž woman walking human feet steps woman female +🧍 person standing still +đŸ§â€â™‚ïž man standing still +đŸ§â€â™€ïž woman standing still +🧎 person kneeling pray respectful +đŸ§Žâ€â™‚ïž man kneeling pray respectful +đŸ§Žâ€â™€ïž woman kneeling respectful pray +🧑‍🩯 person with probing cane blind +👹‍🩯 man with probing cane blind +đŸ‘©â€đŸŠŻ woman with probing cane blind +đŸ§‘â€đŸŠŒ person in motorized wheelchair disability accessibility +đŸ‘šâ€đŸŠŒ man in motorized wheelchair disability accessibility +đŸ‘©â€đŸŠŒ woman in motorized wheelchair disability accessibility +đŸ§‘â€đŸŠœ person in manual wheelchair disability accessibility +đŸ‘šâ€đŸŠœ man in manual wheelchair disability accessibility +đŸ‘©â€đŸŠœ woman in manual wheelchair disability accessibility +🏃 person running move +đŸƒâ€â™‚ïž man running man walking exercise race running +đŸƒâ€â™€ïž woman running woman walking exercise race running female +💃 woman dancing female girl woman fun +đŸ•ș man dancing male boy fun dancer +đŸ•Žïž man in suit levitating suit business levitate hover jump +👯 people with bunny ears perform costume +đŸ‘Żâ€â™‚ïž men with bunny ears male bunny men boys +đŸ‘Żâ€â™€ïž women with bunny ears female bunny women girls +🧖 person in steamy room relax spa +đŸ§–â€â™‚ïž man in steamy room male man spa steamroom sauna +đŸ§–â€â™€ïž woman in steamy room female woman spa steamroom sauna +🧗 person climbing sport +đŸ§—â€â™‚ïž man climbing sports hobby man male rock +đŸ§—â€â™€ïž woman climbing sports hobby woman female rock +đŸ€ș person fencing sports fencing sword +🏇 horse racing animal betting competition gambling luck +⛷ skier sports winter snow +🏂 snowboarder sports winter +đŸŒïž person golfing sports business +đŸŒïžâ€â™‚ïž man golfing sport +đŸŒïžâ€â™€ïž woman golfing sports business woman female +🏄 person surfing sport sea +đŸ„â€â™‚ïž man surfing sports ocean sea summer beach +đŸ„â€â™€ïž woman surfing sports ocean sea summer beach woman female +🚣 person rowing boat sport move +đŸšŁâ€â™‚ïž man rowing boat sports hobby water ship +đŸšŁâ€â™€ïž woman rowing boat sports hobby water ship woman female +🏊 person swimming sport pool +đŸŠâ€â™‚ïž man swimming sports exercise human athlete water summer +đŸŠâ€â™€ïž woman swimming sports exercise human athlete water summer woman female +â›č person bouncing ball sports human +â›č‍♂ man bouncing ball sport +â›č‍♀ woman bouncing ball sports human woman female +đŸ‹ïž person lifting weights sports training exercise +đŸ‹ïžâ€â™‚ïž man lifting weights sport +đŸ‹ïžâ€â™€ïž woman lifting weights sports training exercise woman female +🚮 person biking sport move +đŸšŽâ€â™‚ïž man biking sports bike exercise hipster +đŸšŽâ€â™€ïž woman biking sports bike exercise hipster woman female +đŸš” person mountain biking sport move +đŸš”â€â™‚ïž man mountain biking transportation sports human race bike +đŸš”â€â™€ïž woman mountain biking transportation sports human race bike woman female +đŸ€ž person cartwheeling sport gymnastic +đŸ€žâ€â™‚ïž man cartwheeling gymnastics +đŸ€žâ€â™€ïž woman cartwheeling gymnastics +đŸ€Œ people wrestling sport +đŸ€Œâ€â™‚ïž men wrestling sports wrestlers +đŸ€Œâ€â™€ïž women wrestling sports wrestlers +đŸ€œ person playing water polo sport +đŸ€œâ€â™‚ïž man playing water polo sports pool +đŸ€œâ€â™€ïž woman playing water polo sports pool +đŸ€Ÿ person playing handball sport +đŸ€Ÿâ€â™‚ïž man playing handball sports +đŸ€Ÿâ€â™€ïž woman playing handball sports +đŸ€č person juggling performance balance +đŸ€č‍♂ man juggling juggle balance skill multitask +đŸ€č‍♀ woman juggling juggle balance skill multitask +🧘 person in lotus position meditate +đŸ§˜â€â™‚ïž man in lotus position man male meditation yoga serenity zen mindfulness +đŸ§˜â€â™€ïž woman in lotus position woman female meditation yoga serenity zen mindfulness +🛀 person taking bath clean shower bathroom +🛌 person in bed bed rest +đŸ§‘â€đŸ€â€đŸ§‘ people holding hands friendship +👭 women holding hands pair friendship couple love like female people human +đŸ‘« woman and man holding hands pair people human love date dating like affection valentines marriage +👬 men holding hands pair couple love like bromance friendship people human +💏 kiss pair valentines love like dating marriage +đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘š kiss woman man love +đŸ‘šâ€â€ïžâ€đŸ’‹â€đŸ‘š kiss man man pair valentines love like dating marriage +đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘© kiss woman woman pair valentines love like dating marriage +💑 couple with heart pair love like affection human dating valentines marriage +đŸ‘©â€â€ïžâ€đŸ‘š couple with heart woman man love +đŸ‘šâ€â€ïžâ€đŸ‘š couple with heart man man pair love like affection human dating valentines marriage +đŸ‘©â€â€ïžâ€đŸ‘© couple with heart woman woman pair love like affection human dating valentines marriage +đŸ‘Ș family home parents child mom dad father mother people human +đŸ‘šâ€đŸ‘©â€đŸ‘Š family man woman boy love +đŸ‘šâ€đŸ‘©â€đŸ‘§ family man woman girl home parents people human child +đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘Š family man woman girl boy home parents people human children +đŸ‘šâ€đŸ‘©â€đŸ‘Šâ€đŸ‘Š family man woman boy boy home parents people human children +đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘§ family man woman girl girl home parents people human children +👹‍👹‍👩 family man man boy home parents people human children +👹‍👹‍👧 family man man girl home parents people human children +👹‍👹‍👧‍👩 family man man girl boy home parents people human children +👹‍👹‍👩‍👩 family man man boy boy home parents people human children +👹‍👹‍👧‍👧 family man man girl girl home parents people human children +đŸ‘©â€đŸ‘©â€đŸ‘Š family woman woman boy home parents people human children +đŸ‘©â€đŸ‘©â€đŸ‘§ family woman woman girl home parents people human children +đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘Š family woman woman girl boy home parents people human children +đŸ‘©â€đŸ‘©â€đŸ‘Šâ€đŸ‘Š family woman woman boy boy home parents people human children +đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘§ family woman woman girl girl home parents people human children +👹‍👩 family man boy home parent people human child +👹‍👩‍👩 family man boy boy home parent people human children +👹‍👧 family man girl home parent people human child +👹‍👧‍👩 family man girl boy home parent people human children +👹‍👧‍👧 family man girl girl home parent people human children +đŸ‘©â€đŸ‘Š family woman boy home parent people human child +đŸ‘©â€đŸ‘Šâ€đŸ‘Š family woman boy boy home parent people human children +đŸ‘©â€đŸ‘§ family woman girl home parent people human child +đŸ‘©â€đŸ‘§â€đŸ‘Š family woman girl boy home parent people human children +đŸ‘©â€đŸ‘§â€đŸ‘§ family woman girl girl home parent people human children +đŸ—Łïž speaking head user person human sing say talk +đŸ‘€ bust in silhouette user person human +đŸ‘„ busts in silhouette user person human group team +👣 footprints feet tracking walking beach +đŸ” monkey face animal nature circus +🐒 monkey animal nature banana circus +🩍 gorilla animal nature circus +🩧 orangutan animal +đŸ¶ dog face animal friend nature woof puppy pet faithful +🐕 dog animal nature friend doge pet faithful +🩼 guide dog animal blind +🐕‍đŸŠș service dog blind animal +đŸ© poodle dog animal 101 nature pet +đŸș wolf animal nature wild +🩊 fox animal nature face +🩝 raccoon animal nature +đŸ± cat face animal meow nature pet kitten +🐈 cat animal meow pet cats +🩁 lion animal nature +🐯 tiger face animal cat danger wild nature roar +🐅 tiger animal nature roar +🐆 leopard animal nature +🐮 horse face animal brown nature +🐎 horse animal gamble luck +🩄 unicorn animal nature mystical +🩓 zebra animal nature stripes safari +🩌 deer animal nature horns venison +🐼 cow face beef ox animal nature moo milk +🐂 ox animal cow beef +🐃 water buffalo animal nature ox cow +🐄 cow beef ox animal nature moo milk +đŸ· pig face animal oink nature +🐖 pig animal nature +🐗 boar animal nature +đŸœ pig nose animal oink +🐏 ram animal sheep nature +🐑 ewe animal nature wool shipit +🐐 goat animal nature +đŸȘ camel animal hot desert hump +đŸ« two hump camel animal nature hot desert hump +🩙 llama animal nature alpaca +🩒 giraffe animal nature spots safari +🐘 elephant animal nature nose th circus +🩏 rhinoceros animal nature horn +🩛 hippopotamus animal nature +🐭 mouse face animal nature cheese wedge rodent +🐁 mouse animal nature rodent +🐀 rat animal mouse rodent +đŸč hamster animal nature +🐰 rabbit face animal nature pet spring magic bunny +🐇 rabbit animal nature pet magic spring +đŸżïž chipmunk animal nature rodent squirrel +🩔 hedgehog animal nature spiny +🩇 bat animal nature blind vampire +đŸ» bear animal nature wild +🐹 koala animal nature +đŸŒ panda animal nature panda +đŸŠ„ sloth animal +🩩 otter animal +🩹 skunk animal +🩘 kangaroo animal nature australia joey hop marsupial +🩡 badger animal nature honey +đŸŸ paw prints animal tracking footprints dog cat pet feet +🩃 turkey animal bird +🐔 chicken animal cluck nature bird +🐓 rooster animal nature chicken +🐣 hatching chick animal chicken egg born baby bird +đŸ€ baby chick animal chicken bird +đŸ„ front facing baby chick animal chicken baby bird +🐩 bird animal nature fly tweet spring +🐧 penguin animal nature +đŸ•Šïž dove animal bird +🩅 eagle animal nature bird +🩆 duck animal nature bird mallard +🩱 swan animal nature bird +🩉 owl animal nature bird hoot +đŸŠ© flamingo animal +🩚 peacock animal nature peahen bird +🩜 parrot animal nature bird pirate talk +🐾 frog animal nature croak toad +🐊 crocodile animal nature reptile lizard alligator +🐱 turtle animal slow nature tortoise +🩎 lizard animal nature reptile +🐍 snake animal evil nature hiss python +đŸČ dragon face animal myth nature chinese green +🐉 dragon animal myth nature chinese green +🩕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct +🩖 t rex animal nature dinosaur tyrannosaurus extinct +🐳 spouting whale animal nature sea ocean +🐋 whale animal nature sea ocean +🐬 dolphin animal nature fish sea ocean flipper fins beach +🐟 fish animal food nature +🐠 tropical fish animal swim ocean beach nemo +🐡 blowfish animal nature food sea ocean +🩈 shark animal nature fish sea ocean jaws fins beach +🐙 octopus animal creature ocean sea nature beach +🐚 spiral shell nature sea beach +🐌 snail slow animal shell +🩋 butterfly animal insect nature caterpillar +🐛 bug animal insect nature worm +🐜 ant animal insect nature bug +🐝 honeybee animal insect nature bug spring honey +🐞 lady beetle animal insect nature ladybug +🩗 cricket animal cricket chirp +đŸ•·ïž spider animal arachnid +đŸ•žïž spider web animal insect arachnid silk +🩂 scorpion animal arachnid +🩟 mosquito animal nature insect malaria +🩠 microbe amoeba bacteria germs virus +💐 bouquet flowers nature spring +🌾 cherry blossom nature plant spring flower +💼 white flower japanese spring +đŸ”ïž rosette flower decoration military +đŸŒč rose flowers valentines love spring +đŸ„€ wilted flower plant nature flower +đŸŒș hibiscus plant vegetable flowers beach +đŸŒ» sunflower nature plant fall +đŸŒŒ blossom nature flowers yellow +đŸŒ· tulip flowers plant nature summer spring +đŸŒ± seedling plant nature grass lawn spring +đŸŒČ evergreen tree plant nature +🌳 deciduous tree plant nature +🌮 palm tree plant vegetable nature summer beach mojito tropical +đŸŒ” cactus vegetable plant nature +đŸŒŸ sheaf of rice nature plant +🌿 herb vegetable plant medicine weed grass lawn +☘ shamrock vegetable plant nature irish clover +🍀 four leaf clover vegetable plant nature lucky irish +🍁 maple leaf nature plant vegetable ca fall +🍂 fallen leaf nature plant vegetable leaves +🍃 leaf fluttering in wind nature plant tree vegetable grass lawn spring +🍇 grapes fruit food wine +🍈 melon fruit nature food +🍉 watermelon fruit food picnic summer +🍊 tangerine food fruit nature orange +🍋 lemon fruit nature +🍌 banana fruit food monkey +🍍 pineapple fruit nature food +đŸ„­ mango fruit food tropical +🍎 red apple fruit mac school +🍏 green apple fruit nature +🍐 pear fruit nature food +🍑 peach fruit nature food +🍒 cherries food fruit +🍓 strawberry fruit food nature +đŸ„ kiwi fruit fruit food +🍅 tomato fruit vegetable nature food +đŸ„„ coconut fruit nature food palm +đŸ„‘ avocado fruit food +🍆 eggplant vegetable nature food aubergine +đŸ„” potato food tuber vegatable starch +đŸ„• carrot vegetable food orange +đŸŒœ ear of corn food vegetable plant +đŸŒ¶ïž hot pepper food spicy chilli chili +đŸ„’ cucumber fruit food pickle +đŸ„Ź leafy green food vegetable plant bok choy cabbage kale lettuce +đŸ„Š broccoli fruit food vegetable +🧄 garlic food spice cook +🧅 onion cook food spice +🍄 mushroom plant vegetable +đŸ„œ peanuts food nut +🌰 chestnut food squirrel +🍞 bread food wheat breakfast toast +đŸ„ croissant food bread french +đŸ„– baguette bread food bread french +đŸ„š pretzel food bread twisted +đŸ„Ż bagel food bread bakery schmear +đŸ„ž pancakes food breakfast flapjacks hotcakes +🧇 waffle food breakfast +🧀 cheese wedge food chadder +🍖 meat on bone good food drumstick +🍗 poultry leg food meat drumstick bird chicken turkey +đŸ„© cut of meat food cow meat cut chop lambchop porkchop +đŸ„“ bacon food breakfast pork pig meat +🍔 hamburger meat fast food beef cheeseburger mcdonalds burger king +🍟 french fries chips snack fast food +🍕 pizza food party +🌭 hot dog food frankfurter +đŸ„Ș sandwich food lunch bread +🌼 taco food mexican +🌯 burrito food mexican +đŸ„™ stuffed flatbread food flatbread stuffed gyro +🧆 falafel food +đŸ„š egg food chicken breakfast +🍳 cooking food breakfast kitchen egg +đŸ„˜ shallow pan of food food cooking casserole paella +đŸČ pot of food food meat soup +đŸ„Ł bowl with spoon food breakfast cereal oatmeal porridge +đŸ„— green salad food healthy lettuce +🍿 popcorn food movie theater films snack +🧈 butter food cook +🧂 salt condiment shaker +đŸ„« canned food food soup +đŸ± bento box food japanese box +🍘 rice cracker food japanese +🍙 rice ball food japanese +🍚 cooked rice food china asian +🍛 curry rice food spicy hot indian +🍜 steaming bowl food japanese noodle chopsticks +🍝 spaghetti food italian noodle +🍠 roasted sweet potato food nature +🍱 oden food japanese +🍣 sushi food fish japanese rice +đŸ€ fried shrimp food animal appetizer summer +đŸ„ fish cake with swirl food japan sea beach narutomaki pink swirl kamaboko surimi ramen +đŸ„ź moon cake food autumn +🍡 dango food dessert sweet japanese barbecue meat +đŸ„Ÿ dumpling food empanada pierogi potsticker +đŸ„  fortune cookie food prophecy +đŸ„Ą takeout box food leftovers +🩀 crab animal crustacean +🩞 lobster animal nature bisque claws seafood +🩐 shrimp animal ocean nature seafood +🩑 squid animal nature ocean sea +đŸŠȘ oyster food +🍩 soft ice cream food hot dessert summer +🍧 shaved ice hot dessert summer +🍹 ice cream food hot dessert +đŸ© doughnut food dessert snack sweet donut +đŸȘ cookie food snack oreo chocolate sweet dessert +🎂 birthday cake food dessert cake +🍰 shortcake food dessert +🧁 cupcake food dessert bakery sweet +đŸ„§ pie food dessert pastry +đŸ« chocolate bar food snack dessert sweet +🍬 candy snack dessert sweet lolly +🍭 lollipop food snack candy sweet +🍼 custard dessert food +🍯 honey pot bees sweet kitchen +đŸŒ baby bottle food container milk +đŸ„› glass of milk beverage drink cow +☕ hot beverage beverage caffeine latte espresso coffee +đŸ” teacup without handle drink bowl breakfast green british +đŸ¶ sake wine drink drunk beverage japanese alcohol booze +đŸŸ bottle with popping cork drink wine bottle celebration +đŸ· wine glass drink beverage drunk alcohol booze +🍾 cocktail glass drink drunk alcohol beverage booze mojito +đŸč tropical drink beverage cocktail summer beach alcohol booze mojito +đŸș beer mug relax beverage drink drunk party pub summer alcohol booze +đŸ» clinking beer mugs relax beverage drink drunk party pub summer alcohol booze +đŸ„‚ clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast +đŸ„ƒ tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky glass shot +đŸ„€ cup with straw drink soda +🧃 beverage box drink +🧉 mate drink tea beverage +🧊 ice water cold +đŸ„ą chopsticks food +đŸœïž fork and knife with plate food eat meal lunch dinner restaurant +🍮 fork and knife cutlery kitchen +đŸ„„ spoon cutlery kitchen tableware +đŸ”Ș kitchen knife knife blade cutlery kitchen weapon +đŸș amphora vase jar +🌍 globe showing europe africa globe world international +🌎 globe showing americas globe world USA international +🌏 globe showing asia australia globe world east international +🌐 globe with meridians earth international world internet interweb i18n +đŸ—ș world map location direction +đŸ—Ÿ map of japan nation country japanese asia +🧭 compass magnetic navigation orienteering +đŸ”ïž snow capped mountain photo nature environment winter cold +⛰ mountain photo nature environment +🌋 volcano photo nature disaster +đŸ—» mount fuji photo mountain nature japanese +đŸ•ïž camping photo outdoors tent +đŸ–ïž beach with umbrella weather summer sunny sand mojito +đŸœïž desert photo warm saharah +đŸïž desert island photo tropical mojito +đŸžïž national park photo environment nature +đŸŸïž stadium photo place sports concert venue +đŸ›ïž classical building art culture history +đŸ—ïž building construction wip working progress +đŸ§± brick bricks +đŸ˜ïž houses buildings photo +đŸšïž derelict house abandon evict broken building +🏠 house building home +🏡 house with garden home plant nature +🏱 office building building bureau work +🏣 japanese post office building envelope communication +đŸ€ post office building email +đŸ„ hospital building health surgery doctor +🏩 bank building money sales cash business enterprise +🏹 hotel building accomodation checkin +đŸ© love hotel like affection dating +đŸȘ convenience store building shopping groceries +đŸ« school building student education learn teach +🏬 department store building shopping mall +🏭 factory building industry pollution smoke +🏯 japanese castle photo building +🏰 castle building royalty history +💒 wedding love like affection couple marriage bride groom +đŸ—Œ tokyo tower photo japanese +đŸ—œ statue of liberty american newyork +â›Ș church building religion christ +🕌 mosque islam worship minaret +🛕 hindu temple religion +🕍 synagogue judaism worship temple jewish +⛩ shinto shrine temple japan kyoto +🕋 kaaba mecca mosque islam +â›Č fountain photo summer water fresh +â›ș tent photo camping outdoors +🌁 foggy photo mountain +🌃 night with stars evening city downtown +đŸ™ïž cityscape photo night life urban +🌄 sunrise over mountains view vacation photo +🌅 sunrise morning view vacation photo +🌆 cityscape at dusk photo evening sky buildings +🌇 sunset photo good morning dawn +🌉 bridge at night photo sanfrancisco +♚ hot springs bath warm relax +🎠 carousel horse photo carnival +🎡 ferris wheel photo carnival londoneye +🎱 roller coaster carnival playground photo fun +💈 barber pole hair salon style +đŸŽȘ circus tent festival carnival party +🚂 locomotive transportation vehicle train +🚃 railway car transportation vehicle +🚄 high speed train transportation vehicle +🚅 bullet train transportation vehicle speed fast public travel +🚆 train transportation vehicle +🚇 metro transportation blue-square mrt underground tube +🚈 light rail transportation vehicle +🚉 station transportation vehicle public +🚊 tram transportation vehicle +🚝 monorail transportation vehicle +🚞 mountain railway transportation vehicle +🚋 tram car transportation vehicle carriage public travel +🚌 bus car vehicle transportation +🚍 oncoming bus vehicle transportation +🚎 trolleybus bart transportation vehicle +🚐 minibus vehicle car transportation +🚑 ambulance health 911 hospital +🚒 fire engine transportation cars vehicle +🚓 police car vehicle cars transportation law legal enforcement +🚔 oncoming police car vehicle law legal enforcement 911 +🚕 taxi uber vehicle cars transportation +🚖 oncoming taxi vehicle cars uber +🚗 automobile red transportation vehicle +🚘 oncoming automobile car vehicle transportation +🚙 sport utility vehicle transportation vehicle +🚚 delivery truck cars transportation +🚛 articulated lorry vehicle cars transportation express +🚜 tractor vehicle car farming agriculture +đŸŽïž racing car sports race fast formula f1 +đŸïž motorcycle race sports fast +đŸ›” motor scooter vehicle vespa sasha +đŸŠœ manual wheelchair accessibility +đŸŠŒ motorized wheelchair accessibility +đŸ›ș auto rickshaw move transportation +đŸšČ bicycle sports bicycle exercise hipster +🛮 kick scooter vehicle kick razor +đŸ›č skateboard board +🚏 bus stop transportation wait +đŸ›Łïž motorway road cupertino interstate highway +đŸ›€ïž railway track train transportation +đŸ›ąïž oil drum barrell +⛜ fuel pump gas station petroleum +🚹 police car light police ambulance 911 emergency alert error pinged law legal +đŸš„ horizontal traffic light transportation signal +🚩 vertical traffic light transportation driving +🛑 stop sign stop +🚧 construction wip progress caution warning +⚓ anchor ship ferry sea boat +â›” sailboat ship summer transportation water sailing +đŸ›¶ canoe boat paddle water ship +đŸš€ speedboat ship transportation vehicle summer +đŸ›łïž passenger ship yacht cruise ferry +⛎ ferry boat ship yacht +đŸ›„ïž motor boat ship +🚱 ship transportation titanic deploy +✈ airplane vehicle transportation flight fly +đŸ›©ïž small airplane flight transportation fly vehicle +đŸ›« airplane departure airport flight landing +🛬 airplane arrival airport flight boarding +đŸȘ‚ parachute fly glide +đŸ’ș seat sit airplane transport bus flight fly +🚁 helicopter transportation vehicle fly +🚟 suspension railway vehicle transportation +🚠 mountain cableway transportation vehicle ski +🚡 aerial tramway transportation vehicle ski +đŸ›°ïž satellite communication gps orbit spaceflight NASA ISS +🚀 rocket launch ship staffmode NASA outer space outer space fly +🛾 flying saucer transportation vehicle ufo +đŸ›Žïž bellhop bell service +🧳 luggage packing travel +⌛ hourglass done time clock oldschool limit exam quiz test +⏳ hourglass not done oldschool time countdown +⌚ watch time accessories +⏰ alarm clock time wake +⏱ stopwatch time deadline +âČ timer clock alarm +đŸ•°ïž mantelpiece clock time +🕛 twelve o clock time noon midnight midday late early schedule +🕧 twelve thirty time late early schedule +🕐 one o clock time late early schedule +🕜 one thirty time late early schedule +🕑 two o clock time late early schedule +🕝 two thirty time late early schedule +🕒 three o clock time late early schedule +🕞 three thirty time late early schedule +🕓 four o clock time late early schedule +🕟 four thirty time late early schedule +🕔 five o clock time late early schedule +🕠 five thirty time late early schedule +🕕 six o clock time late early schedule dawn dusk +🕡 six thirty time late early schedule +🕖 seven o clock time late early schedule +🕱 seven thirty time late early schedule +🕗 eight o clock time late early schedule +🕣 eight thirty time late early schedule +🕘 nine o clock time late early schedule +đŸ•€ nine thirty time late early schedule +🕙 ten o clock time late early schedule +đŸ•„ ten thirty time late early schedule +🕚 eleven o clock time late early schedule +🕩 eleven thirty time late early schedule +🌑 new moon nature twilight planet space night evening sleep +🌒 waxing crescent moon nature twilight planet space night evening sleep +🌓 first quarter moon nature twilight planet space night evening sleep +🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep +🌕 full moon nature yellow twilight planet space night evening sleep +🌖 waning gibbous moon nature twilight planet space night evening sleep waxing gibbous moon +🌗 last quarter moon nature twilight planet space night evening sleep +🌘 waning crescent moon nature twilight planet space night evening sleep +🌙 crescent moon night sleep sky evening magic +🌚 new moon face nature twilight planet space night evening sleep +🌛 first quarter moon face nature twilight planet space night evening sleep +🌜 last quarter moon face nature twilight planet space night evening sleep +đŸŒĄïž thermometer weather temperature hot cold +☀ sun weather nature brightness summer beach spring +🌝 full moon face nature twilight planet space night evening sleep +🌞 sun with face nature morning sky +đŸȘ ringed planet outerspace +⭐ star night yellow +🌟 glowing star night sparkle awesome good magic +🌠 shooting star night photo +🌌 milky way photo space stars +☁ cloud weather sky +⛅ sun behind cloud weather nature cloudy morning fall spring +⛈ cloud with lightning and rain weather lightning +đŸŒ€ïž sun behind small cloud weather +đŸŒ„ïž sun behind large cloud weather +đŸŒŠïž sun behind rain cloud weather +đŸŒ§ïž cloud with rain weather +đŸŒšïž cloud with snow weather +đŸŒ©ïž cloud with lightning weather thunder +đŸŒȘ tornado weather cyclone twister +đŸŒ«ïž fog weather +đŸŒŹïž wind face gust air +🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon +🌈 rainbow nature happy unicorn face photo sky spring +🌂 closed umbrella weather rain drizzle +☂ umbrella weather spring +☔ umbrella with rain drops rainy weather spring +⛱ umbrella on ground weather summer +⚡ high voltage thunder weather lightning bolt fast +❄ snowflake winter season cold weather christmas xmas +☃ snowman winter season cold weather christmas xmas frozen +⛄ snowman without snow winter season cold weather christmas xmas frozen without snow +☄ comet space +đŸ”„ fire hot cook flame +💧 droplet water drip faucet spring +🌊 water wave sea water wave nature tsunami disaster +🎃 jack o lantern halloween light pumpkin creepy fall +🎄 christmas tree festival vacation december xmas celebration +🎆 fireworks photo festival carnival congratulations +🎇 sparkler stars night shine +🧹 firecracker dynamite boom explode explosion explosive +✹ sparkles stars shine shiny cool awesome good magic +🎈 balloon party celebration birthday circus +🎉 party popper party congratulations birthday magic circus celebration tada +🎊 confetti ball festival party birthday circus +🎋 tanabata tree plant nature branch summer +🎍 pine decoration plant nature vegetable panda pine decoration +🎎 japanese dolls japanese toy kimono +🎏 carp streamer fish japanese koinobori carp banner +🎐 wind chime nature ding spring bell +🎑 moon viewing ceremony photo japan asia tsukimi +🧧 red envelope gift +🎀 ribbon decoration pink girl bowtie +🎁 wrapped gift present birthday christmas xmas +đŸŽ—ïž reminder ribbon sports cause support awareness +đŸŽŸïž admission tickets sports concert entrance +đŸŽ« ticket event concert pass +đŸŽ–ïž military medal award winning army +🏆 trophy win award contest place ftw ceremony +🏅 sports medal award winning +đŸ„‡ 1st place medal award winning first +đŸ„ˆ 2nd place medal award second +đŸ„‰ 3rd place medal award third +âšœ soccer ball sports football +⚟ baseball sports balls +đŸ„Ž softball sports balls +🏀 basketball sports balls NBA +🏐 volleyball sports balls +🏈 american football sports balls NFL +🏉 rugby football sports team +đŸŽŸ tennis sports balls green +đŸ„ flying disc sports frisbee ultimate +🎳 bowling sports fun play +🏏 cricket game sports +🏑 field hockey sports +🏒 ice hockey sports +đŸ„ lacrosse sports ball stick +🏓 ping pong sports pingpong +🏾 badminton sports +đŸ„Š boxing glove sports fighting +đŸ„‹ martial arts uniform judo karate taekwondo +đŸ„… goal net sports +⛳ flag in hole sports business flag hole summer +⛞ ice skate sports +🎣 fishing pole food hobby summer +đŸ€ż diving mask sport ocean +đŸŽœ running shirt play pageant +🎿 skis sports winter cold snow +đŸ›· sled sleigh luge toboggan +đŸ„Œ curling stone sports +🎯 direct hit game play bar target bullseye +đŸȘ€ yo yo toy +đŸȘ kite wind fly +đŸŽ± pool 8 ball pool hobby game luck magic +🔼 crystal ball disco party magic circus fortune teller +🧿 nazar amulet bead charm +🎼 video game play console PS4 controller +đŸ•č joystick game play +🎰 slot machine bet gamble vegas fruit machine luck casino +đŸŽČ game die dice random tabletop play luck +đŸ§© puzzle piece interlocking puzzle piece +🧾 teddy bear plush stuffed +♠ spade suit poker cards suits magic +♄ heart suit poker cards magic suits +♊ diamond suit poker cards magic suits +â™Łïž club suit poker cards magic suits +♟ chess pawn expendable +🃏 joker poker cards game play magic +🀄 mahjong red dragon game play chinese kanji +🎮 flower playing cards game sunset red +🎭 performing arts acting theater drama +đŸ–Œïž framed picture photography +🎹 artist palette design paint draw colors +đŸ§” thread needle sewing spool string +đŸ§¶ yarn ball crochet knit +👓 glasses fashion accessories eyesight nerdy dork geek +đŸ•¶ïž sunglasses face cool accessories +đŸ„œ goggles eyes protection safety +đŸ„Œ lab coat doctor experiment scientist chemist +đŸŠș safety vest protection +👔 necktie shirt suitup formal fashion cloth business +👕 t shirt fashion cloth casual shirt tee +👖 jeans fashion shopping +🧣 scarf neck winter clothes +đŸ§€ gloves hands winter clothes +đŸ§„ coat jacket +🧩 socks stockings clothes +👗 dress clothes fashion shopping +👘 kimono dress fashion women female japanese +đŸ„» sari dress +đŸ©± one piece swimsuit fashion +đŸ©Č briefs clothing +đŸ©ł shorts clothing +👙 bikini swimming female woman girl fashion beach summer +👚 woman s clothes fashion shopping bags female +👛 purse fashion accessories money sales shopping +👜 handbag fashion accessory accessories shopping +👝 clutch bag bag accessories shopping +đŸ›ïž shopping bags mall buy purchase +🎒 backpack student education bag backpack +👞 man s shoe fashion male +👟 running shoe shoes sports sneakers +đŸ„Ÿ hiking boot backpacking camping hiking +đŸ„ż flat shoe ballet slip-on slipper +👠 high heeled shoe fashion shoes female pumps stiletto +👡 woman s sandal shoes fashion flip flops +đŸ©° ballet shoes dance +👱 woman s boot shoes fashion +👑 crown king kod leader royalty lord +👒 woman s hat fashion accessories female lady spring +đŸŽ© top hat magic gentleman classy circus +🎓 graduation cap school college degree university graduation cap hat legal learn education +🧱 billed cap cap baseball +⛑ rescue worker s helmet construction build +📿 prayer beads dhikr religious +💄 lipstick female girl fashion woman +💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement +💎 gem stone blue ruby diamond jewelry +🔇 muted speaker sound volume silence quiet +🔈 speaker low volume sound volume silence broadcast +🔉 speaker medium volume volume speaker broadcast +🔊 speaker high volume volume noise noisy speaker broadcast +📱 loudspeaker volume sound +📣 megaphone sound speaker volume +📯 postal horn instrument music +🔔 bell sound notification christmas xmas chime +🔕 bell with slash sound volume mute quiet silent +đŸŽŒ musical score treble clef compose +đŸŽ” musical note score tone sound +đŸŽ¶ musical notes music score +đŸŽ™ïž studio microphone sing recording artist talkshow +đŸŽšïž level slider scale +đŸŽ›ïž control knobs dial +đŸŽ€ microphone sound music PA sing talkshow +🎧 headphone music score gadgets +đŸ“» radio communication music podcast program +đŸŽ· saxophone music instrument jazz blues +🎾 guitar music instrument +đŸŽč musical keyboard piano instrument compose +đŸŽș trumpet music brass +đŸŽ» violin music instrument orchestra symphony +đŸȘ• banjo music instructment +đŸ„ drum music instrument drumsticks snare +đŸ“± mobile phone technology apple gadgets dial +đŸ“Č mobile phone with arrow iphone incoming +☎ telephone technology communication dial telephone +📞 telephone receiver technology communication dial +📟 pager bbcall oldschool 90s +📠 fax machine communication technology +🔋 battery power energy sustain +🔌 electric plug charger power +đŸ’» laptop technology laptop screen display monitor +đŸ–„ïž desktop computer technology computing screen +đŸ–šïž printer paper ink +⌚ keyboard technology computer type input text +đŸ–±ïž computer mouse click +đŸ–Č trackball technology trackpad +đŸ’œ computer disk technology record data disk 90s +đŸ’Ÿ floppy disk oldschool technology save 90s 80s +💿 optical disk technology dvd disk disc 90s +📀 dvd cd disk disc +🧼 abacus calculation +đŸŽ„ movie camera film record +đŸŽžïž film frames movie +đŸ“œïž film projector video tape record movie +🎬 clapper board movie film record +đŸ“ș television technology program oldschool show television +đŸ“· camera gadgets photography +📾 camera with flash photography gadgets +đŸ“č video camera film record +đŸ“Œ videocassette record video oldschool 90s 80s +🔍 magnifying glass tilted left search zoom find detective +🔎 magnifying glass tilted right search zoom find detective +đŸ•Żïž candle fire wax +💡 light bulb light electricity idea +🔩 flashlight dark camping sight night +🏼 red paper lantern light paper halloween spooky +đŸȘ” diya lamp lighting +📔 notebook with decorative cover classroom notes record paper study +📕 closed book read library knowledge textbook learn +📖 open book book read library knowledge literature learn study +📗 green book read library knowledge study +📘 blue book read library knowledge learn study +📙 orange book read library knowledge textbook study +📚 books literature library study +📓 notebook stationery record notes paper study +📒 ledger notes paper +📃 page with curl documents office paper +📜 scroll documents ancient history paper +📄 page facing up documents office paper information +📰 newspaper press headline +đŸ—žïž rolled up newspaper press headline +📑 bookmark tabs favorite save order tidy +🔖 bookmark favorite label save +đŸ·ïž label sale tag +💰 money bag dollar payment coins sale +💮 yen banknote money sales japanese dollar currency +đŸ’” dollar banknote money sales bill currency +đŸ’¶ euro banknote money sales dollar currency +đŸ’· pound banknote british sterling money sales bills uk england currency +💾 money with wings dollar bills payment sale +💳 credit card money sales dollar bill payment shopping +đŸ§Ÿ receipt accounting expenses +đŸ’č chart increasing with yen green-square graph presentation stats +đŸ’± currency exchange money sales dollar travel +đŸ’Č heavy dollar sign money sales payment currency buck +✉ envelope letter postal inbox communication +📧 e mail communication inbox +📹 incoming envelope email inbox +đŸ“© envelope with arrow email communication +đŸ“€ outbox tray inbox email +đŸ“„ inbox tray email documents +📩 package mail gift cardboard box moving +đŸ“« closed mailbox with raised flag email inbox communication +đŸ“Ș closed mailbox with lowered flag email communication inbox +📬 open mailbox with raised flag email inbox communication +📭 open mailbox with lowered flag email inbox +📼 postbox email letter envelope +đŸ—łïž ballot box with ballot election vote +✏ pencil stationery write paper writing school study +✒ black nib pen stationery writing write +đŸ–‹ïž fountain pen stationery writing write +đŸ–Šïž pen stationery writing write +đŸ–Œïž paintbrush drawing creativity art +đŸ–ïž crayon drawing creativity +📝 memo write documents stationery pencil paper writing legal exam quiz test study compose +đŸ’Œ briefcase business documents work law legal job career +📁 file folder documents business office +📂 open file folder documents load +đŸ—‚ïž card index dividers organizing business stationery +📅 calendar calendar schedule +📆 tear off calendar schedule date planning +đŸ—’ïž spiral notepad memo stationery +đŸ—“ïž spiral calendar date schedule planning +📇 card index business stationery +📈 chart increasing graph presentation stats recovery business economics money sales good success +📉 chart decreasing graph presentation stats recession business economics money sales bad failure +📊 bar chart graph presentation stats +📋 clipboard stationery documents +📌 pushpin stationery mark here +📍 round pushpin stationery location map here +📎 paperclip documents stationery +đŸ–‡ïž linked paperclips documents stationery +📏 straight ruler stationery calculate length math school drawing architect sketch +📐 triangular ruler stationery math architect sketch +✂ scissors stationery cut +đŸ—ƒïž card file box business stationery +đŸ—„ïž file cabinet filing organizing +đŸ—‘ïž wastebasket bin trash rubbish garbage toss +🔒 locked security password padlock +🔓 unlocked privacy security +🔏 locked with pen security secret +🔐 locked with key security privacy +🔑 key lock door password +đŸ—ïž old key lock door password +🔹 hammer tools build create +đŸȘ“ axe tool chop cut +⛏ pick tools dig +⚒ hammer and pick tools build create +đŸ› ïž hammer and wrench tools build create +đŸ—Ąïž dagger weapon +⚔ crossed swords weapon +đŸ”« pistol violence weapon pistol revolver +đŸč bow and arrow sports +đŸ›Ąïž shield protection security +🔧 wrench tools diy ikea fix maintainer +đŸ”© nut and bolt handy tools fix +⚙ gear cog +đŸ—œïž clamp tool +⚖ balance scale law fairness weight +🩯 probing cane accessibility +🔗 link rings url +⛓ chains lock arrest +🧰 toolbox tools diy fix maintainer mechanic +đŸ§Č magnet attraction magnetic +⚗ alembic distilling science experiment chemistry +đŸ§Ș test tube chemistry experiment lab science +đŸ§« petri dish bacteria biology culture lab +🧬 dna biologist genetics life +🔬 microscope laboratory experiment zoomin science study +🔭 telescope stars space zoom science astronomy +📡 satellite antenna communication future radio space +💉 syringe health hospital drugs blood medicine needle doctor nurse +đŸ©ž drop of blood period hurt harm wound +💊 pill health medicine doctor pharmacy drug +đŸ©č adhesive bandage heal +đŸ©ș stethoscope health +đŸšȘ door house entry exit +đŸ›ïž bed sleep rest +đŸ›‹ïž couch and lamp read chill +đŸȘ‘ chair sit furniture +đŸšœ toilet restroom wc washroom bathroom potty +🚿 shower clean water bathroom +🛁 bathtub clean shower bathroom +đŸȘ’ razor cut +🧮 lotion bottle moisturizer sunscreen +đŸ§· safety pin diaper +đŸ§č broom cleaning sweeping witch +đŸ§ș basket laundry +đŸ§» roll of paper roll +đŸ§Œ soap bar bathing cleaning lather +đŸ§œ sponge absorbing cleaning porous +🧯 fire extinguisher quench +🛒 shopping cart trolley +🚬 cigarette kills tobacco cigarette joint smoke +⚰ coffin vampire dead die death rip graveyard cemetery casket funeral box +⚱ funeral urn dead die death rip ashes +🗿 moai rock easter island moai +🏧 atm sign money sales cash blue-square payment bank +🚼 litter in bin sign blue-square sign human info +🚰 potable water blue-square liquid restroom cleaning faucet +♿ wheelchair symbol blue-square disabled accessibility +đŸšč men s room toilet restroom wc blue-square gender male +đŸšș women s room purple-square woman female toilet loo restroom gender +đŸš» restroom blue-square toilet refresh wc gender +đŸšŒ baby symbol orange-square child +đŸšŸ water closet toilet restroom blue-square +🛂 passport control custom blue-square +🛃 customs passport border blue-square +🛄 baggage claim blue-square airport transport +🛅 left luggage blue-square travel +⚠ warning exclamation wip alert error problem issue +🚾 children crossing school warning danger sign driving yellow-diamond +⛔ no entry limit security privacy bad denied stop circle +đŸš« prohibited forbid stop limit denied disallow circle +🚳 no bicycles cyclist prohibited circle +🚭 no smoking cigarette blue-square smell smoke +🚯 no littering trash bin garbage circle +đŸš± non potable water drink faucet tap circle +đŸš· no pedestrians rules crossing walking circle +đŸ“” no mobile phones iphone mute circle +🔞 no one under eighteen 18 drink pub night minor circle +â˜ąïž radioactive nuclear danger +â˜Łïž biohazard danger +âŹ†ïž up arrow blue-square continue top direction +↗ up right arrow blue-square point direction diagonal northeast +âžĄïž right arrow blue-square next +↘ down right arrow blue-square direction diagonal southeast +âŹ‡ïž down arrow blue-square direction bottom +↙ down left arrow blue-square direction diagonal southwest +âŹ…ïž left arrow blue-square previous back +↖ up left arrow blue-square point direction diagonal northwest +↕ up down arrow blue-square direction way vertical +↔ left right arrow shape direction horizontal sideways +↩ right arrow curving left back return blue-square undo enter +â†Ș left arrow curving right blue-square return rotate direction +‎ right arrow curving up blue-square direction top +— right arrow curving down blue-square direction bottom +🔃 clockwise vertical arrows sync cycle round repeat +🔄 counterclockwise arrows button blue-square sync cycle +🔙 back arrow arrow words return +🔚 end arrow words arrow +🔛 on arrow arrow words +🔜 soon arrow arrow words +🔝 top arrow words blue-square +🛐 place of worship religion church temple prayer +⚛ atom symbol science physics chemistry +đŸ•‰ïž om hinduism buddhism sikhism jainism +âœĄïž star of david judaism +☞ wheel of dharma hinduism buddhism sikhism jainism +â˜Żïž yin yang balance +✝ latin cross christianity +☊ orthodox cross suppedaneum religion +â˜Ș star and crescent islam +â˜źïž peace symbol hippie +🕎 menorah hanukkah candles jewish +🔯 dotted six pointed star purple-square religion jewish hexagram +♈ aries sign purple-square zodiac astrology +♉ taurus purple-square sign zodiac astrology +♊ gemini sign zodiac purple-square astrology +♋ cancer sign zodiac purple-square astrology +♌ leo sign purple-square zodiac astrology +♍ virgo sign zodiac purple-square astrology +♎ libra sign purple-square zodiac astrology +♏ scorpio sign zodiac purple-square astrology scorpio +♐ sagittarius sign zodiac purple-square astrology +♑ capricorn sign zodiac purple-square astrology +♒ aquarius sign purple-square zodiac astrology +♓ pisces purple-square sign zodiac astrology +⛎ ophiuchus sign purple-square constellation astrology +🔀 shuffle tracks button blue-square shuffle music random +🔁 repeat button loop record +🔂 repeat single button blue-square loop +▶ play button blue-square right direction play +⏩ fast forward button blue-square play speed continue +⏭ next track button forward next blue-square +âŻïž play or pause button blue-square play pause +◀ reverse button blue-square left direction +âȘ fast reverse button play blue-square +âźïž last track button backward +đŸ”Œ upwards button blue-square triangle direction point forward top +⏫ fast up button blue-square direction top +đŸ”œ downwards button blue-square direction bottom +⏬ fast down button blue-square direction bottom +⏞ pause button pause blue-square +âč stop button blue-square +âș record button blue-square +⏏ eject button blue-square +🎩 cinema blue-square record film movie curtain stage theater +🔅 dim button sun afternoon warm summer +🔆 bright button sun light +đŸ“¶ antenna bars blue-square reception phone internet connection wifi bluetooth bars +📳 vibration mode orange-square phone +📮 mobile phone off mute orange-square silence quiet +♀ female sign woman women lady girl +♂ male sign man boy men +⚕ medical symbol health hospital +♟ infinity forever +♻ recycling symbol arrow environment garbage trash +⚜ fleur de lis decorative scout +đŸ”± trident emblem weapon spear +📛 name badge fire forbid +🔰 japanese symbol for beginner badge shield +⭕ hollow red circle circle round +✅ check mark button green-square ok agree vote election answer tick +☑ check box with check ok agree confirm black-square vote election yes tick +✔ check mark ok nike answer yes tick +✖ multiplication sign math calculation +❌ cross mark no delete remove cancel red +❎ cross mark button x green-square no deny +➕ plus sign math calculation addition more increase +➖ minus sign math calculation subtract less +➗ division sign divide math calculation +➰ curly loop scribble draw shape squiggle +➿ double curly loop tape cassette +ă€œïž part alternation mark graph presentation stats business economics bad +âœłïž eight spoked asterisk star sparkle green-square +✎ eight pointed star orange-square shape polygon +❇ sparkle stars green-square awesome good fireworks +‌ double exclamation mark exclamation surprise +⁉ exclamation question mark wat punctuation surprise +❓ question mark doubt confused +❔ white question mark doubts gray huh confused +❕ white exclamation mark surprise punctuation gray wow warning +❗ exclamation mark heavy exclamation mark danger surprise punctuation wow warning +ă€°ïž wavy dash draw line moustache mustache squiggle scribble +© copyright ip license circle law legal +Âźïž registered alphabet circle +â„ąïž trade mark trademark brand law legal +#ïžâƒŁ keycap symbol blue-square twitter +*ïžâƒŁ keycap star keycap +0ïžâƒŁ keycap 0 0 numbers blue-square null +1ïžâƒŁ keycap 1 blue-square numbers 1 +2ïžâƒŁ keycap 2 numbers 2 prime blue-square +3ïžâƒŁ keycap 3 3 numbers prime blue-square +4ïžâƒŁ keycap 4 4 numbers blue-square +5ïžâƒŁ keycap 5 5 numbers blue-square prime +6ïžâƒŁ keycap 6 6 numbers blue-square +7ïžâƒŁ keycap 7 7 numbers blue-square prime +8ïžâƒŁ keycap 8 8 blue-square numbers +9ïžâƒŁ keycap 9 blue-square numbers 9 +🔟 keycap 10 numbers 10 blue-square +🔠 input latin uppercase alphabet words blue-square +🔡 input latin lowercase blue-square alphabet +🔱 input numbers numbers blue-square +🔣 input symbols blue-square music note ampersand percent glyphs characters +đŸ”€ input latin letters blue-square alphabet +đŸ…°ïž a button red-square alphabet letter +🆎 ab button red-square alphabet +đŸ…±ïž b button red-square alphabet letter +🆑 cl button alphabet words red-square +🆒 cool button words blue-square +🆓 free button blue-square words +â„č information blue-square alphabet letter +🆔 id button purple-square words +Ⓜ circled m alphabet blue-circle letter +🆕 new button blue-square words start +🆖 ng button blue-square words shape icon +đŸ…Ÿïž o button alphabet red-square letter +🆗 ok button good agree yes blue-square +đŸ…żïž p button cars blue-square alphabet letter +🆘 sos button help red-square words emergency 911 +🆙 up button blue-square above high +🆚 vs button words orange-square +🈁 japanese here button blue-square here katakana japanese destination +đŸˆ‚ïž japanese service charge button japanese blue-square katakana +đŸˆ·ïž japanese monthly amount button chinese month moon japanese orange-square kanji +đŸˆ¶ japanese not free of charge button orange-square chinese have kanji +🈯 japanese reserved button chinese point green-square kanji +🉐 japanese bargain button chinese kanji obtain get circle +đŸˆč japanese discount button cut divide chinese kanji pink-square +🈚 japanese free of charge button nothing chinese kanji japanese orange-square +đŸˆČ japanese prohibited button kanji japanese chinese forbidden limit restricted red-square +🉑 japanese acceptable button ok good chinese kanji agree yes orange-circle +🈾 japanese application button chinese japanese kanji orange-square +🈮 japanese passing grade button japanese chinese join kanji red-square +🈳 japanese vacancy button kanji japanese chinese empty sky blue-square +ăŠ—ïž japanese congratulations button chinese kanji japanese red-circle +ăŠ™ïž japanese secret button privacy chinese sshh kanji red-circle +đŸˆș japanese open for business button japanese opening hours orange-square +đŸˆ” japanese no vacancy button full chinese japanese red-square kanji +🔮 red circle shape error danger +🟠 orange circle round +🟡 yellow circle round +🟱 green circle round +đŸ”” blue circle shape icon button +🟣 purple circle round +đŸŸ€ brown circle round +⚫ black circle shape button round +âšȘ white circle shape round +đŸŸ„ red square +🟧 orange square +🟹 yellow square +đŸŸ© green square +🟩 blue square +đŸŸȘ purple square +đŸŸ« brown square +⬛ black large square shape icon button +⬜ white large square shape icon stone button +◌ black medium square shape button icon +◻ white medium square shape stone icon +â—Ÿ black medium small square icon shape button +â—œ white medium small square shape stone icon button +â–Ș black small square shape icon +▫ white small square shape icon +đŸ”¶ large orange diamond shape jewel gem +đŸ”· large blue diamond shape jewel gem +🔾 small orange diamond shape jewel gem +đŸ”č small blue diamond shape jewel gem +đŸ”ș red triangle pointed up shape direction up top +đŸ”» red triangle pointed down shape direction bottom +💠 diamond with a dot jewel blue gem crystal fancy +🔘 radio button input old music circle +🔳 white square button shape input +đŸ”Č black square button shape input frame +🏁 chequered flag contest finishline race gokart +đŸš© triangular flag mark milestone place +🎌 crossed flags japanese nation country border +🏮 black flag pirate +đŸłïž white flag losing loser lost surrender give up fail +đŸłïžâ€đŸŒˆ rainbow flag flag rainbow pride gay lgbt glbt queer homosexual lesbian bisexual transgender +đŸŽâ€â˜ ïž pirate flag skull crossbones flag banner +🇩🇹 flag ascension island +đŸ‡ŠđŸ‡© flag andorra ad flag nation country banner andorra +🇩đŸ‡Ș flag united arab emirates united arab emirates flag nation country banner united arab emirates +đŸ‡ŠđŸ‡« flag afghanistan af flag nation country banner afghanistan +🇩🇬 flag antigua barbuda antigua barbuda flag nation country banner antigua barbuda +🇩🇼 flag anguilla ai flag nation country banner anguilla +đŸ‡ŠđŸ‡± flag albania al flag nation country banner albania +🇩đŸ‡Č flag armenia am flag nation country banner armenia +🇩🇮 flag angola ao flag nation country banner angola +đŸ‡ŠđŸ‡¶ flag antarctica aq flag nation country banner antarctica +đŸ‡ŠđŸ‡· flag argentina ar flag nation country banner argentina +🇩🇾 flag american samoa american ws flag nation country banner american samoa +🇩đŸ‡č flag austria at flag nation country banner austria +🇩đŸ‡ș flag australia au flag nation country banner australia +đŸ‡ŠđŸ‡Œ flag aruba aw flag nation country banner aruba +đŸ‡ŠđŸ‡œ flag aland islands Åland islands flag nation country banner aland islands +🇩🇿 flag azerbaijan az flag nation country banner azerbaijan +🇧🇩 flag bosnia herzegovina bosnia herzegovina flag nation country banner bosnia herzegovina +🇧🇧 flag barbados bb flag nation country banner barbados +đŸ‡§đŸ‡© flag bangladesh bd flag nation country banner bangladesh +🇧đŸ‡Ș flag belgium be flag nation country banner belgium +đŸ‡§đŸ‡« flag burkina faso burkina faso flag nation country banner burkina faso +🇧🇬 flag bulgaria bg flag nation country banner bulgaria +🇧🇭 flag bahrain bh flag nation country banner bahrain +🇧🇼 flag burundi bi flag nation country banner burundi +🇧🇯 flag benin bj flag nation country banner benin +đŸ‡§đŸ‡± flag st barthelemy saint barthĂ©lemy flag nation country banner st barthelemy +🇧đŸ‡Č flag bermuda bm flag nation country banner bermuda +🇧🇳 flag brunei bn darussalam flag nation country banner brunei +🇧🇮 flag bolivia bo flag nation country banner bolivia +đŸ‡§đŸ‡¶ flag caribbean netherlands bonaire flag nation country banner caribbean netherlands +đŸ‡§đŸ‡· flag brazil br flag nation country banner brazil +🇧🇾 flag bahamas bs flag nation country banner bahamas +🇧đŸ‡č flag bhutan bt flag nation country banner bhutan +đŸ‡§đŸ‡» flag bouvet island norway +đŸ‡§đŸ‡Œ flag botswana bw flag nation country banner botswana +đŸ‡§đŸ‡Ÿ flag belarus by flag nation country banner belarus +🇧🇿 flag belize bz flag nation country banner belize +🇹🇩 flag canada ca flag nation country banner canada +🇹🇹 flag cocos islands cocos keeling islands flag nation country banner cocos islands +đŸ‡šđŸ‡© flag congo kinshasa congo democratic republic flag nation country banner congo kinshasa +đŸ‡šđŸ‡« flag central african republic central african republic flag nation country banner central african republic +🇹🇬 flag congo brazzaville congo flag nation country banner congo brazzaville +🇹🇭 flag switzerland ch flag nation country banner switzerland +🇹🇼 flag cote d ivoire ivory coast flag nation country banner cote d ivoire +🇹🇰 flag cook islands cook islands flag nation country banner cook islands +đŸ‡šđŸ‡± flag chile flag nation country banner chile +🇹đŸ‡Č flag cameroon cm flag nation country banner cameroon +🇹🇳 flag china china chinese prc flag country nation banner china +🇹🇮 flag colombia co flag nation country banner colombia +đŸ‡šđŸ‡” flag clipperton island +đŸ‡šđŸ‡· flag costa rica costa rica flag nation country banner costa rica +🇹đŸ‡ș flag cuba cu flag nation country banner cuba +đŸ‡šđŸ‡» flag cape verde cabo verde flag nation country banner cape verde +đŸ‡šđŸ‡Œ flag curacao curaçao flag nation country banner curacao +đŸ‡šđŸ‡œ flag christmas island christmas island flag nation country banner christmas island +đŸ‡šđŸ‡Ÿ flag cyprus cy flag nation country banner cyprus +🇹🇿 flag czechia cz flag nation country banner czechia +đŸ‡©đŸ‡Ș flag germany german nation flag country banner germany +đŸ‡©đŸ‡Ź flag diego garcia +đŸ‡©đŸ‡Ż flag djibouti dj flag nation country banner djibouti +đŸ‡©đŸ‡° flag denmark dk flag nation country banner denmark +đŸ‡©đŸ‡Č flag dominica dm flag nation country banner dominica +đŸ‡©đŸ‡Ž flag dominican republic dominican republic flag nation country banner dominican republic +đŸ‡©đŸ‡ż flag algeria dz flag nation country banner algeria +đŸ‡Ș🇩 flag ceuta melilla +đŸ‡Ș🇹 flag ecuador ec flag nation country banner ecuador +đŸ‡ȘđŸ‡Ș flag estonia ee flag nation country banner estonia +đŸ‡Ș🇬 flag egypt eg flag nation country banner egypt +đŸ‡Ș🇭 flag western sahara western sahara flag nation country banner western sahara +đŸ‡ȘđŸ‡· flag eritrea er flag nation country banner eritrea +đŸ‡Ș🇾 flag spain spain flag nation country banner spain +đŸ‡ȘđŸ‡č flag ethiopia et flag nation country banner ethiopia +đŸ‡ȘđŸ‡ș flag european union european union flag banner +đŸ‡«đŸ‡ź flag finland fi flag nation country banner finland +đŸ‡«đŸ‡Ż flag fiji fj flag nation country banner fiji +đŸ‡«đŸ‡° flag falkland islands falkland islands malvinas flag nation country banner falkland islands +đŸ‡«đŸ‡Č flag micronesia micronesia federated states flag nation country banner micronesia +đŸ‡«đŸ‡Ž flag faroe islands faroe islands flag nation country banner faroe islands +đŸ‡«đŸ‡· flag france banner flag nation france french country france +🇬🇩 flag gabon ga flag nation country banner gabon +🇬🇧 flag united kingdom united kingdom great britain northern ireland flag nation country banner british UK english england union jack united kingdom +đŸ‡ŹđŸ‡© flag grenada gd flag nation country banner grenada +🇬đŸ‡Ș flag georgia ge flag nation country banner georgia +đŸ‡ŹđŸ‡« flag french guiana french guiana flag nation country banner french guiana +🇬🇬 flag guernsey gg flag nation country banner guernsey +🇬🇭 flag ghana gh flag nation country banner ghana +🇬🇼 flag gibraltar gi flag nation country banner gibraltar +đŸ‡ŹđŸ‡± flag greenland gl flag nation country banner greenland +🇬đŸ‡Č flag gambia gm flag nation country banner gambia +🇬🇳 flag guinea gn flag nation country banner guinea +đŸ‡ŹđŸ‡” flag guadeloupe gp flag nation country banner guadeloupe +đŸ‡ŹđŸ‡¶ flag equatorial guinea equatorial gn flag nation country banner equatorial guinea +đŸ‡ŹđŸ‡· flag greece gr flag nation country banner greece +🇬🇾 flag south georgia south sandwich islands south georgia sandwich islands flag nation country banner south georgia south sandwich islands +🇬đŸ‡č flag guatemala gt flag nation country banner guatemala +🇬đŸ‡ș flag guam gu flag nation country banner guam +đŸ‡ŹđŸ‡Œ flag guinea bissau gw bissau flag nation country banner guinea bissau +đŸ‡ŹđŸ‡Ÿ flag guyana gy flag nation country banner guyana +🇭🇰 flag hong kong sar china hong kong flag nation country banner hong kong sar china +🇭đŸ‡Č flag heard mcdonald islands +🇭🇳 flag honduras hn flag nation country banner honduras +đŸ‡­đŸ‡· flag croatia hr flag nation country banner croatia +🇭đŸ‡č flag haiti ht flag nation country banner haiti +🇭đŸ‡ș flag hungary hu flag nation country banner hungary +🇼🇹 flag canary islands canary islands flag nation country banner canary islands +đŸ‡źđŸ‡© flag indonesia flag nation country banner indonesia +🇼đŸ‡Ș flag ireland ie flag nation country banner ireland +đŸ‡źđŸ‡± flag israel il flag nation country banner israel +🇼đŸ‡Č flag isle of man isle man flag nation country banner isle of man +🇼🇳 flag india in flag nation country banner india +🇼🇮 flag british indian ocean territory british indian ocean territory flag nation country banner british indian ocean territory +đŸ‡źđŸ‡¶ flag iraq iq flag nation country banner iraq +đŸ‡źđŸ‡· flag iran iran islamic republic flag nation country banner iran +🇼🇾 flag iceland is flag nation country banner iceland +🇼đŸ‡č flag italy italy flag nation country banner italy +🇯đŸ‡Ș flag jersey je flag nation country banner jersey +🇯đŸ‡Č flag jamaica jm flag nation country banner jamaica +🇯🇮 flag jordan jo flag nation country banner jordan +đŸ‡ŻđŸ‡” flag japan japanese nation flag country banner japan +🇰đŸ‡Ș flag kenya ke flag nation country banner kenya +🇰🇬 flag kyrgyzstan kg flag nation country banner kyrgyzstan +🇰🇭 flag cambodia kh flag nation country banner cambodia +🇰🇼 flag kiribati ki flag nation country banner kiribati +🇰đŸ‡Č flag comoros km flag nation country banner comoros +🇰🇳 flag st kitts nevis saint kitts nevis flag nation country banner st kitts nevis +đŸ‡°đŸ‡” flag north korea north korea nation flag country banner north korea +đŸ‡°đŸ‡· flag south korea south korea nation flag country banner south korea +đŸ‡°đŸ‡Œ flag kuwait kw flag nation country banner kuwait +đŸ‡°đŸ‡Ÿ flag cayman islands cayman islands flag nation country banner cayman islands +🇰🇿 flag kazakhstan kz flag nation country banner kazakhstan +đŸ‡±đŸ‡Š flag laos lao democratic republic flag nation country banner laos +đŸ‡±đŸ‡§ flag lebanon lb flag nation country banner lebanon +đŸ‡±đŸ‡š flag st lucia saint lucia flag nation country banner st lucia +đŸ‡±đŸ‡ź flag liechtenstein li flag nation country banner liechtenstein +đŸ‡±đŸ‡° flag sri lanka sri lanka flag nation country banner sri lanka +đŸ‡±đŸ‡· flag liberia lr flag nation country banner liberia +đŸ‡±đŸ‡ž flag lesotho ls flag nation country banner lesotho +đŸ‡±đŸ‡č flag lithuania lt flag nation country banner lithuania +đŸ‡±đŸ‡ș flag luxembourg lu flag nation country banner luxembourg +đŸ‡±đŸ‡» flag latvia lv flag nation country banner latvia +đŸ‡±đŸ‡Ÿ flag libya ly flag nation country banner libya +đŸ‡Č🇩 flag morocco ma flag nation country banner morocco +đŸ‡Č🇹 flag monaco mc flag nation country banner monaco +đŸ‡ČđŸ‡© flag moldova moldova republic flag nation country banner moldova +đŸ‡ČđŸ‡Ș flag montenegro me flag nation country banner montenegro +đŸ‡ČđŸ‡« flag st martin +đŸ‡Č🇬 flag madagascar mg flag nation country banner madagascar +đŸ‡Č🇭 flag marshall islands marshall islands flag nation country banner marshall islands +đŸ‡Č🇰 flag north macedonia macedonia flag nation country banner north macedonia +đŸ‡ČđŸ‡± flag mali ml flag nation country banner mali +đŸ‡ČđŸ‡Č flag myanmar mm flag nation country banner myanmar +đŸ‡Č🇳 flag mongolia mn flag nation country banner mongolia +đŸ‡Č🇮 flag macao sar china macao flag nation country banner macao sar china +đŸ‡ČđŸ‡” flag northern mariana islands northern mariana islands flag nation country banner northern mariana islands +đŸ‡ČđŸ‡¶ flag martinique mq flag nation country banner martinique +đŸ‡ČđŸ‡· flag mauritania mr flag nation country banner mauritania +đŸ‡Č🇾 flag montserrat ms flag nation country banner montserrat +đŸ‡ČđŸ‡č flag malta mt flag nation country banner malta +đŸ‡ČđŸ‡ș flag mauritius mu flag nation country banner mauritius +đŸ‡ČđŸ‡» flag maldives mv flag nation country banner maldives +đŸ‡ČđŸ‡Œ flag malawi mw flag nation country banner malawi +đŸ‡ČđŸ‡œ flag mexico mx flag nation country banner mexico +đŸ‡ČđŸ‡Ÿ flag malaysia my flag nation country banner malaysia +đŸ‡Č🇿 flag mozambique mz flag nation country banner mozambique +🇳🇩 flag namibia na flag nation country banner namibia +🇳🇹 flag new caledonia new caledonia flag nation country banner new caledonia +🇳đŸ‡Ș flag niger ne flag nation country banner niger +đŸ‡łđŸ‡« flag norfolk island norfolk island flag nation country banner norfolk island +🇳🇬 flag nigeria flag nation country banner nigeria +🇳🇼 flag nicaragua ni flag nation country banner nicaragua +đŸ‡łđŸ‡± flag netherlands nl flag nation country banner netherlands +🇳🇮 flag norway no flag nation country banner norway +đŸ‡łđŸ‡” flag nepal np flag nation country banner nepal +đŸ‡łđŸ‡· flag nauru nr flag nation country banner nauru +🇳đŸ‡ș flag niue nu flag nation country banner niue +🇳🇿 flag new zealand new zealand flag nation country banner new zealand +🇮đŸ‡Č flag oman om symbol flag nation country banner oman +đŸ‡”đŸ‡Š flag panama pa flag nation country banner panama +đŸ‡”đŸ‡Ș flag peru pe flag nation country banner peru +đŸ‡”đŸ‡« flag french polynesia french polynesia flag nation country banner french polynesia +đŸ‡”đŸ‡Ź flag papua new guinea papua new guinea flag nation country banner papua new guinea +đŸ‡”đŸ‡­ flag philippines ph flag nation country banner philippines +đŸ‡”đŸ‡° flag pakistan pk flag nation country banner pakistan +đŸ‡”đŸ‡± flag poland pl flag nation country banner poland +đŸ‡”đŸ‡Č flag st pierre miquelon saint pierre miquelon flag nation country banner st pierre miquelon +đŸ‡”đŸ‡ł flag pitcairn islands pitcairn flag nation country banner pitcairn islands +đŸ‡”đŸ‡· flag puerto rico puerto rico flag nation country banner puerto rico +đŸ‡”đŸ‡ž flag palestinian territories palestine palestinian territories flag nation country banner palestinian territories +đŸ‡”đŸ‡č flag portugal pt flag nation country banner portugal +đŸ‡”đŸ‡Œ flag palau pw flag nation country banner palau +đŸ‡”đŸ‡Ÿ flag paraguay py flag nation country banner paraguay +đŸ‡¶đŸ‡Š flag qatar qa flag nation country banner qatar +đŸ‡·đŸ‡Ș flag reunion rĂ©union flag nation country banner reunion +đŸ‡·đŸ‡Ž flag romania ro flag nation country banner romania +đŸ‡·đŸ‡ž flag serbia rs flag nation country banner serbia +đŸ‡·đŸ‡ș flag russia russian federation flag nation country banner russia +đŸ‡·đŸ‡Œ flag rwanda rw flag nation country banner rwanda +🇾🇩 flag saudi arabia flag nation country banner saudi arabia +🇾🇧 flag solomon islands solomon islands flag nation country banner solomon islands +🇾🇹 flag seychelles sc flag nation country banner seychelles +đŸ‡žđŸ‡© flag sudan sd flag nation country banner sudan +🇾đŸ‡Ș flag sweden se flag nation country banner sweden +🇾🇬 flag singapore sg flag nation country banner singapore +🇾🇭 flag st helena saint helena ascension tristan cunha flag nation country banner st helena +🇾🇼 flag slovenia si flag nation country banner slovenia +🇾🇯 flag svalbard jan mayen +🇾🇰 flag slovakia sk flag nation country banner slovakia +đŸ‡žđŸ‡± flag sierra leone sierra leone flag nation country banner sierra leone +🇾đŸ‡Č flag san marino san marino flag nation country banner san marino +🇾🇳 flag senegal sn flag nation country banner senegal +🇾🇮 flag somalia so flag nation country banner somalia +đŸ‡žđŸ‡· flag suriname sr flag nation country banner suriname +🇾🇾 flag south sudan south sd flag nation country banner south sudan +🇾đŸ‡č flag sao tome principe sao tome principe flag nation country banner sao tome principe +đŸ‡žđŸ‡» flag el salvador el salvador flag nation country banner el salvador +đŸ‡žđŸ‡œ flag sint maarten sint maarten dutch flag nation country banner sint maarten +đŸ‡žđŸ‡Ÿ flag syria syrian arab republic flag nation country banner syria +🇾🇿 flag eswatini sz flag nation country banner eswatini +đŸ‡č🇩 flag tristan da cunha +đŸ‡č🇹 flag turks caicos islands turks caicos islands flag nation country banner turks caicos islands +đŸ‡čđŸ‡© flag chad td flag nation country banner chad +đŸ‡čđŸ‡« flag french southern territories french southern territories flag nation country banner french southern territories +đŸ‡č🇬 flag togo tg flag nation country banner togo +đŸ‡č🇭 flag thailand th flag nation country banner thailand +đŸ‡č🇯 flag tajikistan tj flag nation country banner tajikistan +đŸ‡č🇰 flag tokelau tk flag nation country banner tokelau +đŸ‡čđŸ‡± flag timor leste timor leste flag nation country banner timor leste +đŸ‡čđŸ‡Č flag turkmenistan flag nation country banner turkmenistan +đŸ‡č🇳 flag tunisia tn flag nation country banner tunisia +đŸ‡č🇮 flag tonga to flag nation country banner tonga +đŸ‡čđŸ‡· flag turkey turkey flag nation country banner turkey +đŸ‡čđŸ‡č flag trinidad tobago trinidad tobago flag nation country banner trinidad tobago +đŸ‡čđŸ‡» flag tuvalu flag nation country banner tuvalu +đŸ‡čđŸ‡Œ flag taiwan tw flag nation country banner taiwan +đŸ‡č🇿 flag tanzania tanzania united republic flag nation country banner tanzania +đŸ‡ș🇩 flag ukraine ua flag nation country banner ukraine +đŸ‡ș🇬 flag uganda ug flag nation country banner uganda +đŸ‡șđŸ‡Č flag u s outlying islands +đŸ‡ș🇳 flag united nations un flag banner +đŸ‡ș🇾 flag united states united states america flag nation country banner united states +đŸ‡șđŸ‡Ÿ flag uruguay uy flag nation country banner uruguay +đŸ‡ș🇿 flag uzbekistan uz flag nation country banner uzbekistan +đŸ‡»đŸ‡Š flag vatican city vatican city flag nation country banner vatican city +đŸ‡»đŸ‡š flag st vincent grenadines saint vincent grenadines flag nation country banner st vincent grenadines +đŸ‡»đŸ‡Ș flag venezuela ve bolivarian republic flag nation country banner venezuela +đŸ‡»đŸ‡Ź flag british virgin islands british virgin islands bvi flag nation country banner british virgin islands +đŸ‡»đŸ‡ź flag u s virgin islands virgin islands us flag nation country banner u s virgin islands +đŸ‡»đŸ‡ł flag vietnam viet nam flag nation country banner vietnam +đŸ‡»đŸ‡ș flag vanuatu vu flag nation country banner vanuatu +đŸ‡ŒđŸ‡« flag wallis futuna wallis futuna flag nation country banner wallis futuna +đŸ‡ŒđŸ‡ž flag samoa ws flag nation country banner samoa +đŸ‡œđŸ‡° flag kosovo xk flag nation country banner kosovo +đŸ‡ŸđŸ‡Ș flag yemen ye flag nation country banner yemen +đŸ‡ŸđŸ‡č flag mayotte yt flag nation country banner mayotte +🇿🇩 flag south africa south africa flag nation country banner south africa +🇿đŸ‡Č flag zambia zm flag nation country banner zambia +đŸ‡żđŸ‡Œ flag zimbabwe zw flag nation country banner zimbabwe +đŸŽó §ó ąó „ó źó §ó ż flag england flag english +🏮󠁧󠁱󠁳󠁣󠁮󠁿 flag scotland flag scottish +đŸŽó §ó ąó ·ó Źó łó ż flag wales flag welsh +đŸ„Č smiling face with tear sad cry pretend +đŸ„ž disguised face pretent brows glasses moustache +đŸ€Œ pinched fingers size tiny small +đŸ«€ anatomical heart health heartbeat +đŸ« lungs breathe +đŸ„· ninja ninjutsu skills japanese +đŸ€”â€â™‚ïž man in tuxedo formal fashion +đŸ€”â€â™€ïž woman in tuxedo formal fashion +đŸ‘°â€â™‚ïž man with veil wedding marriage +đŸ‘°â€â™€ïž woman with veil wedding marriage +đŸ‘©â€đŸŒ woman feeding baby birth food +đŸ‘šâ€đŸŒ man feeding baby birth food +đŸ§‘â€đŸŒ person feeding baby birth food +🧑‍🎄 mx claus christmas +đŸ«‚ people hugging care +🐈‍⬛ black cat superstition luck +🩬 bison ox +🩣 mammoth elephant tusks +đŸŠ« beaver animal rodent +đŸ»â€â„ïž polar bear animal arctic +đŸŠ€ dodo animal bird +đŸȘ¶ feather bird fly +🩭 seal animal creature sea +đŸȘČ beetle insect +đŸȘł cockroach insect pests +đŸȘ° fly insect +đŸȘ± worm animal +đŸȘŽ potted plant greenery house +đŸ« blueberries fruit +đŸ«’ olive fruit +đŸ«‘ bell pepper fruit plant +đŸ«“ flatbread flour food +đŸ«” tamale food masa +đŸ«• fondue cheese pot food +đŸ«– teapot drink hot +🧋 bubble tea taiwan boba milk tea straw +đŸȘš rock stone +đŸȘ” wood nature timber trunk +🛖 hut house structure +đŸ›» pickup truck car transportation +đŸ›Œ roller skate footwear sports +đŸȘ„ magic wand supernature power +đŸȘ… pinata mexico candy celebration +đŸȘ† nesting dolls matryoshka toy +đŸȘĄ sewing needle stitches +đŸȘą knot rope scout +đŸ©Ž thong sandal footwear summer +đŸȘ– military helmet army protection +đŸȘ— accordion music +đŸȘ˜ long drum music +đŸȘ™ coin money currency +đŸȘƒ boomerang weapon +đŸȘš carpentry saw cut chop +đŸȘ› screwdriver tools +đŸȘ hook tools +đŸȘœ ladder tools +🛗 elevator lift +đŸȘž mirror reflection +đŸȘŸ window scenery +đŸȘ  plunger toilet +đŸȘ€ mouse trap cheese +đŸȘŁ bucket water container +đŸȘ„ toothbrush hygiene dental +đŸȘŠ headstone death rip grave +đŸȘ§ placard announcement +⚧ transgender symbol lgbtq +đŸłïžâ€âš§ïž transgender flag lgbtq +đŸ˜¶â€đŸŒ«ïž face in clouds shower steam dream +😼‍💹 face exhaling relieve relief tired sigh +đŸ˜”â€đŸ’« face with spiral eyes sick ill confused nauseous nausea +â€ïžâ€đŸ”„ heart on fire passionate enthusiastic +❀‍đŸ©č mending heart broken heart bandage wounded +đŸ§”â€â™‚ïž man beard facial hair +đŸ§”â€â™€ïž woman beard facial hair +đŸ«  melting face hot heat +đŸ«ą face with open eyes and hand over mouth silence secret shock surprise +đŸ«Ł face with peeking eye scared frightening embarrassing +đŸ«Ą saluting face respect salute +đŸ«„ dotted line face invisible lonely isolation depression +đŸ«€ face with diagonal mouth skeptic confuse frustrated indifferent +đŸ„č face holding back tears touched gratitude +đŸ«± rightwards hand palm offer +đŸ«Č leftwards hand palm offer +đŸ«ł palm down hand palm drop +đŸ«Ž palm up hand lift offer demand +đŸ«° hand with index finger and thumb crossed heart love money expensive +đŸ«” index pointing at the viewer you recruit +đŸ«¶ heart hands love appreciation support +đŸ«Š biting lip flirt sexy pain worry +đŸ«… person with crown royalty power +đŸ«ƒ pregnant man baby belly +đŸ«„ pregnant person baby belly +🧌 troll mystical monster +đŸȘž coral ocean sea reef +đŸȘ· lotus flower calm meditation +đŸȘč empty nest bird +đŸȘș nest with eggs bird +đŸ«˜ beans food +đŸ«— pouring liquid cup water +đŸ«™ jar container sauce +🛝 playground slide fun park +🛞 wheel car transport +🛟 ring buoy life saver life preserver +đŸȘŹ hamsa religion protection +đŸȘ© mirror ball disco dance party +đŸȘ« low battery drained dead +đŸ©Œ crutch accessibility assist +đŸ©» x-ray skeleton medicine +đŸ«§ bubbles soap fun carbonation sparkling +đŸȘȘ identification card document +🟰 heavy equals sign math diff --git a/new-config/.config/rofi/scripts/rofi_mount b/user/.config/rofi/scripts/rofi_mount similarity index 100% rename from new-config/.config/rofi/scripts/rofi_mount rename to user/.config/rofi/scripts/rofi_mount diff --git a/user/.config/rofi/scripts/rofi_power b/user/.config/rofi/scripts/rofi_power index dccea2e66..3f5658903 100755 --- a/user/.config/rofi/scripts/rofi_power +++ b/user/.config/rofi/scripts/rofi_power @@ -2,52 +2,57 @@ # ***This script was made by Clay Gomera (Drake)*** # - Description: A simple power menu rofi script -# - Dependencies: rofi, power-profiles-daemon +# - Dependencies: rofi, power-profiles-daemon, swaylock +# + +## MENU PROMPT ## +menu="rofi -dmenu -i -p" + +## CURRENT WALLPAPER FOR LOCKSCREEN ## +currwall=$(tail --l 1 "$HOME/.wbg" | awk '{print $3}') ## OPTIONS ## -option1=" Logout" -option2=" Reboot" +option1=" Logout" +option2="ï€Ą Reboot" option3=" Power off" -option4=" Suspend" -option5="ï„Ÿ Lock" -option6="ïŁ Change power profile" +option4="ó°’Č Suspend" +option5="ï€Ł Lock" +option6=" Change power profile" option7=" Cancel" - -## OPTIONS ARRAY ## options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6\n$option7" ## POWER PROFILE OPTIONS ## -pwr1=" Performance" -pwr2=" Balanced" -pwr3=" Power Saver" +pwr1="󰓅 Performance" +pwr2="ó°Ÿ… Balanced" +pwr3="󰟆 Power Saver" pwr4=" Cancel" - -## POWER PROFILES ARRAY ## pwrs="$pwr1\n$pwr2\n$pwr3\n$pwr4" ## MAIN ACTION COMMAND ## -action=$(echo -e "$options" | rofi -dmenu -i -p "  Power Options ") +action=$(echo -e "$options" | $menu "  Power Options ") case "$action" in - $option1*) - pkill X;; - $option2*) + $option1) + pkill Hyprland;; + $option2) systemctl reboot || loginctl reboot;; - $option3*) + $option3) systemctl poweroff || loginctl poweroff;; - $option4*) - betterlockscreen --suspend;; - $option5*) - betterlockscreen -l;; - $option6*) + $option4) + swaylock -i "$currwall" & + sleep 0.1 + systemctl suspend;; + $option5) + swaylock -i "$currwall";; + $option6) currentpwr=$(powerprofilesctl get) if [ "$currentpwr" = "performance" ]; then - currentpwr=" Performance" - elif [ "$currentpwr" = "power-saver" ]; then - currentpwr=" Power Saver" + currentpwr="$pwr1" elif [ "$currentpwr" = "balanced" ]; then - currentpwr=" Balanced" + currentpwr="$pwr2" + elif [ "$currentpwr" = "power-saver" ]; then + currentpwr="$pwr3" fi - pwraction=$(echo -e "$pwrs" | rofi -dmenu -i -p " ïŁ Power Profile Menu - Currently set to: ${currentpwr} ") + pwraction=$(echo -e "$pwrs" | $menu "  Power Profile Menu - Currently set to: ${currentpwr} ") case "$pwraction" in $pwr1*) powerprofilesctl set performance && notify-send "Power profile switched to performance";; @@ -58,7 +63,6 @@ case "$action" in $pwr4*) exit 0 esac;; - $option7*) + $option7) exit 0 esac - diff --git a/user/.config/rofi/scripts/rofi_scrot b/user/.config/rofi/scripts/rofi_scrot index 6641b74c1..f57c257be 100755 --- a/user/.config/rofi/scripts/rofi_scrot +++ b/user/.config/rofi/scripts/rofi_scrot @@ -1,63 +1,93 @@ #!/usr/bin/env bash # ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple screenshot dmenu script -# - Dependencies: scrot, dmenu, notify-send +# - Description: A simple screenshot menu rofi script +# - Dependencies: rofi, grim, slurp, wf-recorder +# -## CREATING SCREENSHOT FOLDER ## -mkdir -p "$HOME/Pictures/Screenshots" -cd "$HOME/Pictures/Screenshots" || exit 0 +# screenshot directory +scrdir="$HOME/Pictures/Screenshots" +mkdir -p "$scrdir" +cd "$scrdir" || exit 1 +filename=$(date "+%d-%m-%Y_%H:%M:%S") -## CHOICES ## -cho1=" Entire screen" -cho2=" Entire screen with delay" -cho3=" Focused window" -cho4=" Select area" -chos="$cho1\n$cho2\n$cho3\n$cho4" +# options array +option1=" Capture the screen" +option2=" Capture region" +option3="󰕧 Record the screen" +option4="󰕩 Record region" +option5="󰕧 Record the screen and audio" +option6="Exit" +options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" -## DELAY OPTIONS ## -del1=" 3 sec delay" -del2=" 5 sec delay" -del3=" 10 sec delay" -dels="$del1\n$del2\n$del3" - -## DELAY FUNCTION ## -delays() { - del=$(echo -e "$dels" | rofi -dmenu -i -p "  Select Delay "); - case $del in - "$del1") - scrot -d 3 && notify-send "Screenshot saved";; - "$del2") - scrot -d 5 && notify-send "Screenshot saved";; - "$del3") - scrot -d 10 && notify-send "Screenshot saved" - esac +# countdown function +countdown() { + notify-send "Screenshot" "Executing in 3 seconds" -t 1000 + sleep 1 + notify-send "Screenshot" "Executing in 2 seconds" -t 1000 + sleep 1 + notify-send "Screenshot" "Executing in 1 seconds" -t 1000 + sleep 2 } -## ENTIRE SCREEN FUNCTION ## -screen() { - scrot && notify-send "Screenshot saved" -} +# show the help output with --help or -h arguments +if [[ $1 == '--help' ]] || [[ $1 = '-h' ]] + then + echo ### rofi-screenshot + echo USAGE: rofi-screenshot [OPTION] + echo \(no option\) + echo " show the screenshot menu" + echo -s, --stop + echo " stop recording" + echo -h, --help + echo " this screen" + exit 1 +fi -## FOCUSED WINDOW FUNCTION -window() { - scrot -u -b && notify-send "Screenshot saved." -} +# stop recording with -s or --stop arguments +if [[ $1 = '--stop' ]] || [[ $1 = '-s' ]] + then + killall -s SIGINT wf-recorder + exit 1 +fi -## SELECTED AREA FUNCTION ## -area() { - scrot -s && notify-send "Screenshot saved." -} - -## MAIN ACTION ## -choice=$(echo -e "$chos" | rofi -dmenu -i -p "  Sreenshot Menu ") +# run the selected command +choice=$(echo -e "$options" | rofi -dmenu -p " 󰄀 Screenshot " ) case $choice in - "$cho1") - screen;; - "$cho2") - delays;; - "$cho3") - window;; - "$cho4") - area + $option1) + countdown + grim "$filename.jpg" + notify-send "Screenshot" "Screenshot saved to $scrdir" + ;; + $option2) + notify-send "Screenshot" "Select a region to capture" + grim -g "$(slurp)" "$filename.jpg" + notify-send "Screenshot" "Region saved to $scrdir" + ;; + $option3) + countdown + wf-recorder --codec=h264_vaapi -d /dev/dri/renderD128 -f "$filename.mp4" + notify-send "Screenshot" "Recording saved to $scrdir" + ;; + $option4) + notify-send "Screenshot" "Select a region to record" + wf-recorder --codec=h264_vaapi -d /dev/dri/renderD128 -g "$(slurp)" -f "$filename.mp4" + notify-send "Screenshot" "Recording saved to $scrdir" + ;; + $option5) + devices=$(pactl list sources | grep "Name" | awk '{print $2}') + chosendevice=$(echo -e "$devices" | rofi -dmenu -p " Select audio input ") + if [ "$chosendevice" ]; then + device="$chosendevice" + countdown + wf-recorder --audio="$device" --codec=h264_vaapi -d /dev/dri/renderD128 -f "$filename.mp4" + else + notify-send "Please select an audio input device" + exit 1 + fi + notify-send "Screenshot" "Recording saved to $scrdir" + ;; + $option6) + exit 0 + ;; esac diff --git a/user/.config/rofi/scripts/rofi_wall b/user/.config/rofi/scripts/rofi_wall index db3e3dc06..4bd202afa 100755 --- a/user/.config/rofi/scripts/rofi_wall +++ b/user/.config/rofi/scripts/rofi_wall @@ -2,43 +2,23 @@ # ***This script was made by Clay Gomera (Drake)*** # - Description: A simple wallpaper changer script -# - Dependencies: rofi, fd, feh +# - Dependencies: rofi, fd, swaybg -## MAIN VARIABLES AND COMMANDS ## -walldir="Pictures/Wallpapers" # wallpapers folder, change it to yours, make sure that it ends with a / -cd "$walldir" || exit +## MENU PROMPT ## +menu="rofi -dmenu -i -p" -## SELECT PICTURE FUNCTION ## -selectpic() { - wallpaper=$(fd -p "$walldir" | rofi -dmenu -i -p "Select a wallpaper:") - if [ "$wallpaper" ]; then - chosenwall=$wallpaper - else - exit 0 - fi -} -selectpic +## WALLPAPER DIRECTORY ## +walldir="$HOME/Pictures/Wallpapers" # wallpapers folder, change it to yours -## WALLPAPER SETTING OPTIONS ## -option1="Fill" -option2="Center" -option3="Tile" -option4="Max" -option5="Scale" -options="$option1\n$option2\n$option3\n$option4\n$option5" +## SELECT PICTURE ## +cd "$walldir" || exit 1 +wallpaper=$(fd -p "$walldir" | $menu " 󰋩 Wallpaper Selector ") +if [ "$wallpaper" ]; then + chosenwall=$wallpaper +else + exit 0 +fi -## MAIN ACTION ## -action=$(echo -e "$options" | rofi -dmenu -i -p "Chose the format:") -case "$action" in - $option1*) - feh --bg-fill "$chosenwall";; - $option2*) - feh --bg-center "$chosenwall";; - $option3*) - feh --bg-tile "$chosenwall";; - $option4*) - feh --bg-max "$chosenwall";; - $option5*) - feh --bg-scale "$chosenwall";; -esac +swww img "$chosenwall" +echo -e "#!/bin/sh\nswww img $walldir/$chosenwall" > "$HOME/.wbg" exit 0 diff --git a/user/.config/rofi/scripts/rofi_wifi b/user/.config/rofi/scripts/rofi_wifi index 3f6a3cfde..92eb351c7 100755 --- a/user/.config/rofi/scripts/rofi_wifi +++ b/user/.config/rofi/scripts/rofi_wifi @@ -2,21 +2,23 @@ # ***This script was made by Clay Gomera (Drake)*** # - Description: A simple wifi rofi script -# - Dependencies: rofi, NetworkManager +# - Dependencies: rofi, NetworkManager, io.elementary.capnet-assist -## ROFI VARIABLES ## -ROFI="rofi -dmenu -i -p" +## MENU PROMPT ## +menu="rofi -dmenu -i -p" ## MAIN OPTIONS ## option1=" Turn on WiFi" option2=" Turn off WiFi" -option3="ïȘ© Disconnect WiFi" -option4="ïȘš Connect WiFi" -option5=" Setup captive portal" -option6=" Cancel" +option3="󱛅 Disconnect WiFi" +option4="󱛃 Connect WiFi" +option5="󱛆 Setup captive portal" +option6=" Exit" options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" +## GRAB WIFI INTERFACE ## wlan=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f1 | head -1) + ## TURN OFF WIFI FUNCTION ## turnoff() { nmcli radio wifi off @@ -43,18 +45,18 @@ disconnect() { connect() { notify-send "Scannig networks, please wait" sleep 1 - bssid=$(nmcli device wifi list | sed -n '1!p' | cut -b 9- | $ROFI "Select Wifi  :" | cut -d' ' -f1) - } + bssid=$(nmcli device wifi list | sed -n '1!p' | cut -b 9- | $menu " Select a Wifi Network  " | cut -d' ' -f1) +} ## SELECT PASSWORD FUNCTION ## password() { - pass=$(echo " " | $ROFI "Enter Password  :") - } + pass=$(echo " " | $menu " Enter Password ï€Ł " -password) +} ## MAIN CONNECTION COMMAND ## action() { nmcli device wifi connect "$bssid" password "$pass" || nmcli device wifi connect "$bssid" - } +} ## CHECKING IF WIFI IS WORKING check() { @@ -69,21 +71,29 @@ check() { } ## MAIN ACTION COMMANDS ## -cases=$(echo -e "$options" | $ROFI "  Wifi Settings " ) -case "$cases" in - $option1*) - turnon;; - $option2*) - turnoff;; - $option3*) - disconnect;; - $option4*) - connect; - password; - action; - check;; - $option5*) - io.elementary.capnet-assist;; - $option6*) - exit 0 -esac +cases=$(echo -e "$options" | $menu "  Wifi Settings " ) +if [ -n "$cases" ]; then + case "$cases" in + $option1) + turnon;; + $option2) + turnoff;; + $option3) + disconnect;; + $option4) + connect; + if [ -n "$bssid" ]; then + password; + action; + check; + else + exit 0; + fi;; + $option5) + io.elementary.capnet-assist;; + $option6) + exit 0; + esac +else + exit 0; +fi diff --git a/user/.config/suckless/dmenu/Makefile b/user/.config/suckless/dmenu/Makefile deleted file mode 100644 index a03a95c30..000000000 --- a/user/.config/suckless/dmenu/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: options dmenu stest - -options: - @echo dmenu build options: - @echo "CFLAGS = $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - @echo "CC = $(CC)" - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz - -dist: clean - mkdir -p dmenu-$(VERSION) - cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run - chmod 755 $(DESTDIR)$(PREFIX)/bin/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all options clean dist install uninstall diff --git a/user/.config/suckless/dmenu/arg.h b/user/.config/suckless/dmenu/arg.h deleted file mode 100644 index e94e02bba..000000000 --- a/user/.config/suckless/dmenu/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/user/.config/suckless/dmenu/config.def.h b/user/.config/suckless/dmenu/config.def.h deleted file mode 100644 index 46c398db0..000000000 --- a/user/.config/suckless/dmenu/config.def.h +++ /dev/null @@ -1,27 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "mononoki Nerd Font Mono:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#ebdbb2", "#1d2021" }, - [SchemeSel] = { "#ebdbb2", "#cc241d" }, - [SchemeSelHighlight] = { "#fbf1c7", "#282828" }, - [SchemeNormHighlight] = { "#fbf1c7", "#282828" }, - [SchemeOut] = { "#ebdbb2", "#8ec07c" }, - [SchemeOutHighlight] = { "#fabd2f", "#83a598" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/user/.config/suckless/dmenu/config.mk b/user/.config/suckless/dmenu/config.mk deleted file mode 100644 index fd6ff0560..000000000 --- a/user/.config/suckless/dmenu/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# dmenu version -VERSION = 5.2 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/user/.config/suckless/dmenu/dmenu.1 b/user/.config/suckless/dmenu/dmenu.1 deleted file mode 100644 index 762f7071c..000000000 --- a/user/.config/suckless/dmenu/dmenu.1 +++ /dev/null @@ -1,197 +0,0 @@ -.TH DMENU 1 dmenu\-VERSION -.SH NAME -dmenu \- dynamic menu -.SH SYNOPSIS -.B dmenu -.RB [ \-bfivP ] -.RB [ \-l -.IR lines ] -.RB [ \-m -.IR monitor ] -.RB [ \-p -.IR prompt ] -.RB [ \-fn -.IR font ] -.RB [ \-nb -.IR color ] -.RB [ \-nf -.IR color ] -.RB [ \-sb -.IR color ] -.RB [ \-sf -.IR color ] -.RB [ \-w -.IR windowid ] -.P -.BR dmenu_run " ..." -.SH DESCRIPTION -.B dmenu -is a dynamic menu for X, which reads a list of newline\-separated items from -stdin. When the user selects an item and presses Return, their choice is printed -to stdout and dmenu terminates. Entering text will narrow the items to those -matching the tokens in the input. -.P -.B dmenu_run -is a script used by -.IR dwm (1) -which lists programs in the user's $PATH and runs the result in their $SHELL. -.SH OPTIONS -.TP -.B \-b -dmenu appears at the bottom of the screen. -.TP -.B \-f -dmenu grabs the keyboard before reading stdin if not reading from a tty. This -is faster, but will lock up X until stdin reaches end\-of\-file. -.TP -.B \-i -dmenu matches menu items case insensitively. -.TP -.B \-P -dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. -.TP -.BI \-l " lines" -dmenu lists items vertically, with the given number of lines. -.TP -.BI \-m " monitor" -dmenu is displayed on the monitor number supplied. Monitor numbers are starting -from 0. -.TP -.BI \-p " prompt" -defines the prompt to be displayed to the left of the input field. -.TP -.BI \-fn " font" -defines the font or font set used. -.TP -.BI \-nb " color" -defines the normal background color. -.IR #RGB , -.IR #RRGGBB , -and X color names are supported. -.TP -.BI \-nf " color" -defines the normal foreground color. -.TP -.BI \-sb " color" -defines the selected background color. -.TP -.BI \-sf " color" -defines the selected foreground color. -.TP -.B \-v -prints version information to stdout, then exits. -.TP -.BI \-w " windowid" -embed into windowid. -.SH USAGE -dmenu is completely controlled by the keyboard. Items are selected using the -arrow keys, page up, page down, home, and end. -.TP -.B Tab -Copy the selected item to the input field. -.TP -.B Return -Confirm selection. Prints the selected item to stdout and exits, returning -success. -.TP -.B Ctrl-Return -Confirm selection. Prints the selected item to stdout and continues. -.TP -.B Shift\-Return -Confirm input. Prints the input text to stdout and exits, returning success. -.TP -.B Escape -Exit without selecting an item, returning failure. -.TP -.B Ctrl-Left -Move cursor to the start of the current word -.TP -.B Ctrl-Right -Move cursor to the end of the current word -.TP -.B C\-a -Home -.TP -.B C\-b -Left -.TP -.B C\-c -Escape -.TP -.B C\-d -Delete -.TP -.B C\-e -End -.TP -.B C\-f -Right -.TP -.B C\-g -Escape -.TP -.B C\-h -Backspace -.TP -.B C\-i -Tab -.TP -.B C\-j -Return -.TP -.B C\-J -Shift-Return -.TP -.B C\-k -Delete line right -.TP -.B C\-m -Return -.TP -.B C\-M -Shift-Return -.TP -.B C\-n -Down -.TP -.B C\-p -Up -.TP -.B C\-u -Delete line left -.TP -.B C\-w -Delete word left -.TP -.B C\-y -Paste from primary X selection -.TP -.B C\-Y -Paste from X clipboard -.TP -.B M\-b -Move cursor to the start of the current word -.TP -.B M\-f -Move cursor to the end of the current word -.TP -.B M\-g -Home -.TP -.B M\-G -End -.TP -.B M\-h -Up -.TP -.B M\-j -Page down -.TP -.B M\-k -Page up -.TP -.B M\-l -Down -.SH SEE ALSO -.IR dwm (1), -.IR stest (1) diff --git a/user/.config/suckless/dmenu/dmenu.c b/user/.config/suckless/dmenu/dmenu.c deleted file mode 100644 index 2332a9106..000000000 --- a/user/.config/suckless/dmenu/dmenu.c +++ /dev/null @@ -1,1073 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeOutHighlight, SchemeLast }; /* color schemes */ -struct item { - char *text; - struct item *left, *right; - int out; - double distance; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw, passwd = 0; -static int lrpad; /* sum of left and right padding */ -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static Drw *drw; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - -static unsigned int -textw_clamp(const char *str, unsigned int n) -{ - unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; - return MIN(w, n); -} - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - for (i = 0; items && items[i].text; ++i) - free(items[i].text); - free(items); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *h, const char *n) -{ - size_t i; - - if (!n[0]) - return (char *)h; - - for (; *h; ++h) { - for (i = 0; n[i] && tolower((unsigned char)n[i]) == - tolower((unsigned char)h[i]); ++i) - ; - if (n[i] == '\0') - return (char *)h; - } - return NULL; -} - -static void -drawhighlights(struct item *item, int x, int y, int maxw) -{ - char restorechar, tokens[sizeof text], *highlight, *token; - int indentx, highlightlen; - - drw_setscheme(drw, scheme[item == sel ? SchemeSelHighlight : item->out ? SchemeOutHighlight : SchemeNormHighlight]); - strcpy(tokens, text); - for (token = strtok(tokens, " "); token; token = strtok(NULL, " ")) { - highlight = fstrstr(item->text, token); - while (highlight) { - // Move item str end, calc width for highlight indent, & restore - highlightlen = highlight - item->text; - restorechar = *highlight; - item->text[highlightlen] = '\0'; - indentx = TEXTW(item->text); - item->text[highlightlen] = restorechar; - - // Move highlight str end, draw highlight, & restore - restorechar = highlight[strlen(token)]; - highlight[strlen(token)] = '\0'; - if (indentx - (lrpad / 2) - 1 < maxw) - drw_text( - drw, - x + indentx - (lrpad / 2) - 1, - y, - MIN(maxw - indentx, TEXTW(highlight) - lrpad), - bh, 0, highlight, 0 - ); - highlight[strlen(token)] = restorechar; - - if (strlen(highlight) - strlen(token) < strlen(token)) break; - highlight = fstrstr(highlight + strlen(token), token); - } - } -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - int r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); - drawhighlights(item, x, y, w); - return r; -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - char *censort; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - if (passwd) { - censort = ecalloc(1, sizeof(text)); - memset(censort, '.', strlen(text)); - drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); - free(censort); - } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw vertical list */ - for (item = curr; item != next; item = item->right) - drawitem(item, x, y += bh, mw - x); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -int -compare_distance(const void *a, const void *b) -{ - struct item *da = *(struct item **) a; - struct item *db = *(struct item **) b; - - if (!db) - return 1; - if (!da) - return -1; - - return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1; -} - -void -fuzzymatch(void) -{ - /* bang - we have so much memory */ - struct item *it; - struct item **fuzzymatches = NULL; - char c; - int number_of_matches = 0, i, pidx, sidx, eidx; - int text_len = strlen(text), itext_len; - - matches = matchend = NULL; - - /* walk through all items */ - for (it = items; it && it->text; it++) { - if (text_len) { - itext_len = strlen(it->text); - pidx = 0; /* pointer */ - sidx = eidx = -1; /* start of match, end of match */ - /* walk through item text */ - for (i = 0; i < itext_len && (c = it->text[i]); i++) { - /* fuzzy match pattern */ - if (!fstrncmp(&text[pidx], &c, 1)) { - if(sidx == -1) - sidx = i; - pidx++; - if (pidx == text_len) { - eidx = i; - break; - } - } - } - /* build list of matches */ - if (eidx != -1) { - /* compute distance */ - /* add penalty if match starts late (log(sidx+2)) - * add penalty for long a match without many matching characters */ - it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len); - /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */ - appenditem(it, &matches, &matchend); - number_of_matches++; - } - } else { - appenditem(it, &matches, &matchend); - } - } - - if (number_of_matches) { - /* initialize array with matches */ - if (!(fuzzymatches = realloc(fuzzymatches, number_of_matches * sizeof(struct item*)))) - die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item*)); - for (i = 0, it = matches; it && i < number_of_matches; i++, it = it->right) { - fuzzymatches[i] = it; - } - /* sort matches according to distance */ - qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance); - /* rebuild list of matches */ - matches = matchend = NULL; - for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it && \ - it->text; i++, it = fuzzymatches[i]) { - appenditem(it, &matches, &matchend); - } - free(fuzzymatches); - } - curr = sel = matches; - calcoffsets(); -} - -static void -match(void) -{ - if (fuzzy) { - fuzzymatch(); - return; - } - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %zu bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[32]; - int len; - KeySym ksym; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: - goto insert; - case XLookupKeySym: - case XLookupBoth: - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - case XK_KP_Left: - movewordedge(-1); - goto draw; - case XK_Right: - case XK_KP_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl((unsigned char)*buf)) - insert(buf, len); - break; - case XK_Delete: - case XK_KP_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - case XK_KP_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - case XK_KP_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - case XK_KP_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - case XK_KP_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - case XK_KP_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - case XK_KP_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - case XK_KP_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - case XK_KP_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - cursor = strnlen(sel->text, sizeof text - 1); - memcpy(text, sel->text, cursor); - text[cursor] = '\0'; - match(); - break; - } - -draw: - drawmenu(); -} - -static void -buttonpress(XEvent *e) -{ - struct item *item; - XButtonPressedEvent *ev = &e->xbutton; - int x = 0, y = 0, h = bh, w; - - if (ev->window != win) - return; - - /* right-click: exit */ - if (ev->button == Button3) - exit(1); - - if (prompt && *prompt) - x += promptw; - - /* input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - - /* left-click on input: clear input, - * NOTE: if there is no left-arrow the space for < is reserved so - * add that to the input width */ - if (ev->button == Button1 && - ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + - ((!prev || !curr->left) ? TEXTW("<") : 0)) || - (lines > 0 && ev->y >= y && ev->y <= y + h))) { - insert(NULL, -cursor); - drawmenu(); - return; - } - /* middle-mouse click: paste selection */ - if (ev->button == Button2) { - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - drawmenu(); - return; - } - /* scroll up */ - if (ev->button == Button4 && prev) { - sel = curr = prev; - calcoffsets(); - drawmenu(); - return; - } - /* scroll down */ - if (ev->button == Button5 && next) { - sel = curr = next; - calcoffsets(); - drawmenu(); - return; - } - if (ev->button != Button1) - return; - if (ev->state & ~ControlMask) - return; - if (lines > 0) { - /* vertical list: (ctrl)left-click on item */ - w = mw - x; - for (item = curr; item != next; item = item->right) { - y += h; - if (ev->y >= y && ev->y <= (y + h)) { - puts(item->text); - if (!(ev->state & ControlMask)) - exit(0); - sel = item; - if (sel) { - sel->out = 1; - drawmenu(); - } - return; - } - } - } else if (matches) { - /* left-click on left arrow */ - x += inputw; - w = TEXTW("<"); - if (prev && curr->left) { - if (ev->x >= x && ev->x <= x + w) { - sel = curr = prev; - calcoffsets(); - drawmenu(); - return; - } - } - /* horizontal list: (ctrl)left-click on item */ - for (item = curr; item != next; item = item->right) { - x += w; - w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); - if (ev->x >= x && ev->x <= x + w) { - puts(item->text); - if (!(ev->state & ControlMask)) - exit(0); - sel = item; - if (sel) { - sel->out = 1; - drawmenu(); - } - return; - } - } - /* left-click on right arrow */ - w = TEXTW(">"); - x = mw - w; - if (next && ev->x >= x && ev->x <= x + w) { - sel = curr = next; - calcoffsets(); - drawmenu(); - return; - } - } -} - -static void -motionevent(XButtonEvent *ev) -{ - struct item *it; - int xy, ev_xy; - - if (ev->window != win || matches == 0) - return; - - xy = lines > 0 ? bh : inputw + promptw + TEXTW("<"); - ev_xy = lines > 0 ? ev->y : ev->x; - for (it = curr; it && it != next; it = it->right) { - int wh = lines > 0 ? bh : textw_clamp(it->text, mw - xy - TEXTW(">")); - if (ev_xy >= xy && ev_xy < (xy + wh)) { - sel = it; - calcoffsets(); - drawmenu(); - break; - } - xy += wh; - } -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -readstdin(void) -{ - char *line = NULL; - size_t i, junk, size = 0; - ssize_t len; - if(passwd){ - inputw = lines = 0; - return; - } - - /* read each line from stdin and add it to the item list */ - for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) { - if (i + 1 >= size / sizeof *items) - if (!(items = realloc(items, (size += BUFSIZ)))) - die("cannot realloc %zu bytes:", size); - if (line[len - 1] == '\n') - line[len - 1] = '\0'; - items[i].text = line; - items[i].out = 0; - } - if (items) - items[i].text = NULL; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case ButtonPress: - buttonpress(&ev); - break; - case MotionNotify: - motionevent(&ev.xbutton); - break; - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i]) != 0) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = mw / 3; /* input width: ~33% of monitor width */ - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | - ButtonPressMask | PointerMotionMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - die("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-F")) /* grabs keyboard before reading stdin */ - fuzzy = 0; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } else if (!strcmp(argv[i], "-P")) /* is the input a password */ - passwd = 1; - else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ - lines = atoi(argv[++i]); - else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - drw = drw_create(dpy, screen, root, wa.width, wa.height); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/user/.config/suckless/dmenu/dmenu_path b/user/.config/suckless/dmenu/dmenu_path deleted file mode 100755 index 3a7cda792..000000000 --- a/user/.config/suckless/dmenu/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/user/.config/suckless/dmenu/dmenu_run b/user/.config/suckless/dmenu/dmenu_run deleted file mode 100755 index 834ede54f..000000000 --- a/user/.config/suckless/dmenu/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/user/.config/suckless/dmenu/drw.c b/user/.config/suckless/dmenu/drw.c deleted file mode 100644 index a58a2b489..000000000 --- a/user/.config/suckless/dmenu/drw.c +++ /dev/null @@ -1,450 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int i, ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - enum { nomatches_len = 64 }; - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; - static unsigned int ellipsis_width = 0; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - for (i = 0; i < nomatches_len; ++i) { - /* avoid calling XftFontMatch if we know we won't find a match */ - if (utf8codepoint == nomatches.codepoint[i]) - goto no_match; - } - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/user/.config/suckless/dmenu/drw.h b/user/.config/suckless/dmenu/drw.h deleted file mode 100644 index fd7631b2b..000000000 --- a/user/.config/suckless/dmenu/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/user/.config/suckless/dmenu/patches/dmenu-fuzzymatch-4.9.diff b/user/.config/suckless/dmenu/patches/dmenu-fuzzymatch-4.9.diff deleted file mode 100644 index 9fd206d8b..000000000 --- a/user/.config/suckless/dmenu/patches/dmenu-fuzzymatch-4.9.diff +++ /dev/null @@ -1,163 +0,0 @@ -From 94353eb52055927d9079f3d9e33da1c954abf386 Mon Sep 17 00:00:00 2001 -From: aleks -Date: Wed, 26 Jun 2019 13:25:10 +0200 -Subject: [PATCH] Add support for fuzzy-matching - ---- - config.def.h | 1 + - config.mk | 2 +- - dmenu.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 91 insertions(+), 1 deletion(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..51612b9 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -2,6 +2,7 @@ - /* Default settings; can be overriden by command line. */ - - static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -+static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ - /* -fn option overrides fonts[0]; default X11 font or font set */ - static const char *fonts[] = { - "monospace:size=10" -diff --git a/config.mk b/config.mk -index 0929b4a..d14309a 100644 ---- a/config.mk -+++ b/config.mk -@@ -20,7 +20,7 @@ FREETYPEINC = /usr/include/freetype2 - - # includes and libs - INCS = -I$(X11INC) -I$(FREETYPEINC) --LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -+LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm - - # flags - CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -diff --git a/dmenu.c b/dmenu.c -index 6b8f51b..96ddc98 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -1,6 +1,7 @@ - /* See LICENSE file for copyright and license details. */ - #include - #include -+#include - #include - #include - #include -@@ -32,6 +33,7 @@ struct item { - char *text; - struct item *left, *right; - int out; -+ double distance; - }; - - static char text[BUFSIZ] = ""; -@@ -210,9 +212,94 @@ grabkeyboard(void) - die("cannot grab keyboard"); - } - -+int -+compare_distance(const void *a, const void *b) -+{ -+ struct item *da = *(struct item **) a; -+ struct item *db = *(struct item **) b; -+ -+ if (!db) -+ return 1; -+ if (!da) -+ return -1; -+ -+ return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1; -+} -+ -+void -+fuzzymatch(void) -+{ -+ /* bang - we have so much memory */ -+ struct item *it; -+ struct item **fuzzymatches = NULL; -+ char c; -+ int number_of_matches = 0, i, pidx, sidx, eidx; -+ int text_len = strlen(text), itext_len; -+ -+ matches = matchend = NULL; -+ -+ /* walk through all items */ -+ for (it = items; it && it->text; it++) { -+ if (text_len) { -+ itext_len = strlen(it->text); -+ pidx = 0; /* pointer */ -+ sidx = eidx = -1; /* start of match, end of match */ -+ /* walk through item text */ -+ for (i = 0; i < itext_len && (c = it->text[i]); i++) { -+ /* fuzzy match pattern */ -+ if (!fstrncmp(&text[pidx], &c, 1)) { -+ if(sidx == -1) -+ sidx = i; -+ pidx++; -+ if (pidx == text_len) { -+ eidx = i; -+ break; -+ } -+ } -+ } -+ /* build list of matches */ -+ if (eidx != -1) { -+ /* compute distance */ -+ /* add penalty if match starts late (log(sidx+2)) -+ * add penalty for long a match without many matching characters */ -+ it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len); -+ /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */ -+ appenditem(it, &matches, &matchend); -+ number_of_matches++; -+ } -+ } else { -+ appenditem(it, &matches, &matchend); -+ } -+ } -+ -+ if (number_of_matches) { -+ /* initialize array with matches */ -+ if (!(fuzzymatches = realloc(fuzzymatches, number_of_matches * sizeof(struct item*)))) -+ die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item*)); -+ for (i = 0, it = matches; it && i < number_of_matches; i++, it = it->right) { -+ fuzzymatches[i] = it; -+ } -+ /* sort matches according to distance */ -+ qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance); -+ /* rebuild list of matches */ -+ matches = matchend = NULL; -+ for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it && \ -+ it->text; i++, it = fuzzymatches[i]) { -+ appenditem(it, &matches, &matchend); -+ } -+ free(fuzzymatches); -+ } -+ curr = sel = matches; -+ calcoffsets(); -+} -+ - static void - match(void) - { -+ if (fuzzy) { -+ fuzzymatch(); -+ return; -+ } - static char **tokv = NULL; - static int tokn = 0; - -@@ -702,6 +789,8 @@ main(int argc, char *argv[]) - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; -+ else if (!strcmp(argv[i], "-F")) /* grabs keyboard before reading stdin */ -+ fuzzy = 0; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; --- -2.22.0 - diff --git a/user/.config/suckless/dmenu/patches/dmenu-highlight-20201211-fcdc159.diff b/user/.config/suckless/dmenu/patches/dmenu-highlight-20201211-fcdc159.diff deleted file mode 100644 index c3ac5c12d..000000000 --- a/user/.config/suckless/dmenu/patches/dmenu-highlight-20201211-fcdc159.diff +++ /dev/null @@ -1,97 +0,0 @@ -From fcdc1593ed418166f20b7e691a49b1e6eefc116e Mon Sep 17 00:00:00 2001 -From: Nathaniel Evan -Date: Fri, 11 Dec 2020 11:08:12 +0700 -Subject: [PATCH] Highlight matched text in a different color scheme - ---- - config.def.h | 3 +++ - dmenu.c | 44 +++++++++++++++++++++++++++++++++++++++++--- - 2 files changed, 44 insertions(+), 3 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1edb647..79be73a 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -11,7 +11,10 @@ static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, -+ [SchemeSelHighlight] = { "#ffc978", "#005577" }, -+ [SchemeNormHighlight] = { "#ffc978", "#222222" }, - [SchemeOut] = { "#000000", "#00ffff" }, -+ [SchemeOutHighlight] = { "#ffc978", "#00ffff" }, - }; - /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ - static unsigned int lines = 0; -diff --git a/dmenu.c b/dmenu.c -index 65f25ce..cce1ad1 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -26,8 +26,7 @@ - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - - /* enums */ --enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ -- -+enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeOutHighlight, SchemeLast }; /* color schemes */ - struct item { - char *text; - struct item *left, *right; -@@ -113,6 +112,43 @@ cistrstr(const char *s, const char *sub) - return NULL; - } - -+static void -+drawhighlights(struct item *item, int x, int y, int maxw) -+{ -+ char restorechar, tokens[sizeof text], *highlight, *token; -+ int indentx, highlightlen; -+ -+ drw_setscheme(drw, scheme[item == sel ? SchemeSelHighlight : item->out ? SchemeOutHighlight : SchemeNormHighlight]); -+ strcpy(tokens, text); -+ for (token = strtok(tokens, " "); token; token = strtok(NULL, " ")) { -+ highlight = fstrstr(item->text, token); -+ while (highlight) { -+ // Move item str end, calc width for highlight indent, & restore -+ highlightlen = highlight - item->text; -+ restorechar = *highlight; -+ item->text[highlightlen] = '\0'; -+ indentx = TEXTW(item->text); -+ item->text[highlightlen] = restorechar; -+ -+ // Move highlight str end, draw highlight, & restore -+ restorechar = highlight[strlen(token)]; -+ highlight[strlen(token)] = '\0'; -+ if (indentx - (lrpad / 2) - 1 < maxw) -+ drw_text( -+ drw, -+ x + indentx - (lrpad / 2) - 1, -+ y, -+ MIN(maxw - indentx, TEXTW(highlight) - lrpad), -+ bh, 0, highlight, 0 -+ ); -+ highlight[strlen(token)] = restorechar; -+ -+ if (strlen(highlight) - strlen(token) < strlen(token)) break; -+ highlight = fstrstr(highlight + strlen(token), token); -+ } -+ } -+} -+ - static int - drawitem(struct item *item, int x, int y, int w) - { -@@ -123,7 +159,9 @@ drawitem(struct item *item, int x, int y, int w) - else - drw_setscheme(drw, scheme[SchemeNorm]); - -- return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -+ int r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -+ drawhighlights(item, x, y, w); -+ return r; - } - - static void --- -2.29.2 - diff --git a/user/.config/suckless/dmenu/patches/dmenu-mousesupport-5.2.diff b/user/.config/suckless/dmenu/patches/dmenu-mousesupport-5.2.diff deleted file mode 100644 index eaacea423..000000000 --- a/user/.config/suckless/dmenu/patches/dmenu-mousesupport-5.2.diff +++ /dev/null @@ -1,144 +0,0 @@ -diff --git a/dmenu.c b/dmenu.c -index 7cf253b..d276a94 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -528,6 +528,119 @@ draw: - drawmenu(); - } - -+static void -+buttonpress(XEvent *e) -+{ -+ struct item *item; -+ XButtonPressedEvent *ev = &e->xbutton; -+ int x = 0, y = 0, h = bh, w; -+ -+ if (ev->window != win) -+ return; -+ -+ /* right-click: exit */ -+ if (ev->button == Button3) -+ exit(1); -+ -+ if (prompt && *prompt) -+ x += promptw; -+ -+ /* input field */ -+ w = (lines > 0 || !matches) ? mw - x : inputw; -+ -+ /* left-click on input: clear input, -+ * NOTE: if there is no left-arrow the space for < is reserved so -+ * add that to the input width */ -+ if (ev->button == Button1 && -+ ((lines <= 0 && ev->x >= 0 && ev->x <= x + w + -+ ((!prev || !curr->left) ? TEXTW("<") : 0)) || -+ (lines > 0 && ev->y >= y && ev->y <= y + h))) { -+ insert(NULL, -cursor); -+ drawmenu(); -+ return; -+ } -+ /* middle-mouse click: paste selection */ -+ if (ev->button == Button2) { -+ XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, -+ utf8, utf8, win, CurrentTime); -+ drawmenu(); -+ return; -+ } -+ /* scroll up */ -+ if (ev->button == Button4 && prev) { -+ sel = curr = prev; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ /* scroll down */ -+ if (ev->button == Button5 && next) { -+ sel = curr = next; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ if (ev->button != Button1) -+ return; -+ if (ev->state & ~ControlMask) -+ return; -+ if (lines > 0) { -+ /* vertical list: (ctrl)left-click on item */ -+ w = mw - x; -+ for (item = curr; item != next; item = item->right) { -+ y += h; -+ if (ev->y >= y && ev->y <= (y + h)) { -+ puts(item->text); -+ if (!(ev->state & ControlMask)) -+ exit(0); -+ sel = item; -+ if (sel) { -+ sel->out = 1; -+ drawmenu(); -+ } -+ return; -+ } -+ } -+ } else if (matches) { -+ /* left-click on left arrow */ -+ x += inputw; -+ w = TEXTW("<"); -+ if (prev && curr->left) { -+ if (ev->x >= x && ev->x <= x + w) { -+ sel = curr = prev; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ } -+ /* horizontal list: (ctrl)left-click on item */ -+ for (item = curr; item != next; item = item->right) { -+ x += w; -+ w = MIN(TEXTW(item->text), mw - x - TEXTW(">")); -+ if (ev->x >= x && ev->x <= x + w) { -+ puts(item->text); -+ if (!(ev->state & ControlMask)) -+ exit(0); -+ sel = item; -+ if (sel) { -+ sel->out = 1; -+ drawmenu(); -+ } -+ return; -+ } -+ } -+ /* left-click on right arrow */ -+ w = TEXTW(">"); -+ x = mw - w; -+ if (next && ev->x >= x && ev->x <= x + w) { -+ sel = curr = next; -+ calcoffsets(); -+ drawmenu(); -+ return; -+ } -+ } -+} -+ - static void - paste(void) - { -@@ -582,6 +695,9 @@ run(void) - break; - cleanup(); - exit(1); -+ case ButtonPress: -+ buttonpress(&ev); -+ break; - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); -@@ -679,7 +795,8 @@ setup(void) - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -- swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; -+ swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | -+ ButtonPressMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); diff --git a/user/.config/suckless/dmenu/patches/dmenu-mousesupport-motion-5.2.diff b/user/.config/suckless/dmenu/patches/dmenu-mousesupport-motion-5.2.diff deleted file mode 100644 index 414201c56..000000000 --- a/user/.config/suckless/dmenu/patches/dmenu-mousesupport-motion-5.2.diff +++ /dev/null @@ -1,53 +0,0 @@ -diff --git a/dmenu.c b/dmenu.c -index 48d4980..7677401 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -641,6 +641,29 @@ buttonpress(XEvent *e) - } - } - -+static void -+motionevent(XButtonEvent *ev) -+{ -+ struct item *it; -+ int xy, ev_xy; -+ -+ if (ev->window != win || matches == 0) -+ return; -+ -+ xy = lines > 0 ? bh : inputw + promptw + TEXTW("<"); -+ ev_xy = lines > 0 ? ev->y : ev->x; -+ for (it = curr; it && it != next; it = it->right) { -+ int wh = lines > 0 ? bh : textw_clamp(it->text, mw - xy - TEXTW(">")); -+ if (ev_xy >= xy && ev_xy < (xy + wh)) { -+ sel = it; -+ calcoffsets(); -+ drawmenu(); -+ break; -+ } -+ xy += wh; -+ } -+} -+ - static void - paste(void) - { -@@ -702,6 +725,9 @@ run(void) - case ButtonPress: - buttonpress(&ev); - break; -+ case MotionNotify: -+ motionevent(&ev.xbutton); -+ break; - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); -@@ -800,7 +826,7 @@ setup(void) - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask | -- ButtonPressMask; -+ ButtonPressMask | PointerMotionMask; - win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); diff --git a/user/.config/suckless/dmenu/patches/dmenu-password-5.0.diff b/user/.config/suckless/dmenu/patches/dmenu-password-5.0.diff deleted file mode 100644 index 7a187b98e..000000000 --- a/user/.config/suckless/dmenu/patches/dmenu-password-5.0.diff +++ /dev/null @@ -1,103 +0,0 @@ -From c4de1032bd4c247bc20b6ab92a10a8d778966679 Mon Sep 17 00:00:00 2001 -From: Mehrad Mahmoudian -Date: Tue, 4 May 2021 12:05:09 +0300 -Subject: [PATCH] patched with password patch - ---- - dmenu.1 | 5 ++++- - dmenu.c | 21 +++++++++++++++++---- - 2 files changed, 21 insertions(+), 5 deletions(-) - -diff --git a/dmenu.1 b/dmenu.1 -index 323f93c..762f707 100644 ---- a/dmenu.1 -+++ b/dmenu.1 -@@ -3,7 +3,7 @@ - dmenu \- dynamic menu - .SH SYNOPSIS - .B dmenu --.RB [ \-bfiv ] -+.RB [ \-bfivP ] - .RB [ \-l - .IR lines ] - .RB [ \-m -@@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file. - .B \-i - dmenu matches menu items case insensitively. - .TP -+.B \-P -+dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. -+.TP - .BI \-l " lines" - dmenu lists items vertically, with the given number of lines. - .TP -diff --git a/dmenu.c b/dmenu.c -index 65f25ce..ad8f63b 100644 ---- a/dmenu.c -+++ b/dmenu.c -@@ -37,7 +37,7 @@ struct item { - static char text[BUFSIZ] = ""; - static char *embed; - static int bh, mw, mh; --static int inputw = 0, promptw; -+static int inputw = 0, promptw, passwd = 0; - static int lrpad; /* sum of left and right padding */ - static size_t cursor; - static struct item *items = NULL; -@@ -132,6 +132,7 @@ drawmenu(void) - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; -+ char *censort; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); -@@ -143,7 +144,12 @@ drawmenu(void) - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); -+ if (passwd) { -+ censort = ecalloc(1, sizeof(text)); -+ memset(censort, '.', strlen(text)); -+ drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); -+ free(censort); -+ } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { -@@ -524,6 +530,11 @@ readstdin(void) - char buf[sizeof text], *p; - size_t i, imax = 0, size = 0; - unsigned int tmpmax = 0; -+ if(passwd){ -+ inputw = lines = 0; -+ return; -+ } -+ - - /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { -@@ -689,7 +700,7 @@ setup(void) - static void - usage(void) - { -- fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" -+ fputs("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); - exit(1); - } -@@ -712,7 +723,9 @@ main(int argc, char *argv[]) - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; -- } else if (i + 1 == argc) -+ } else if (!strcmp(argv[i], "-P")) /* is the input a password */ -+ passwd = 1; -+ else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ --- -2.31.1 - diff --git a/user/.config/suckless/dmenu/scripts/dmenu_blue b/user/.config/suckless/dmenu/scripts/dmenu_blue deleted file mode 100755 index 5b6459605..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_blue +++ /dev/null @@ -1,317 +0,0 @@ -#!/usr/bin/env bash -# _ _ _ _ _ _ -# __| |_ __ ___ ___ _ __ _ _ | |__ | |_ _ ___| |_ ___ ___ | |_ | |__ -# / _` | '_ ` _ \ / _ \ '_ \| | | |_____| '_ \| | | | |/ _ \ __/ _ \ / _ \| __|| '_ \ -# | (_| | | | | | | __/ | | | |_| |_____| |_) | | |_| | __/ || (_) | (_) | |_ | | | | -# \__,_|_| |_| |_|\___|_| |_|\__,_| |_.__/|_|\__,_|\___|\__\___/ \___/ \__||_| |_| -# -# Author: Nick Clyde (clydedroid) -# dmenu support by: Layerex -# -# A script that generates a dmenu menu that uses bluetoothctl to -# connect to bluetooth devices and display status info. -# -# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu) -# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl) -# -# Depends on: -# Arch repositories: dmenu, bluez-utils (contains bluetoothctl) - -# Constants -divider="---------" -goback="Back" - -# Checks if bluetooth controller is powered on -power_on() { - if bluetoothctl show | grep -F -q "Powered: yes"; then - return 0 - else - return 1 - fi -} - -# Toggles power state -toggle_power() { - if power_on; then - bluetoothctl power off - show_menu - else - if rfkill list bluetooth | grep -F -q 'blocked: yes'; then - rfkill unblock bluetooth && sleep 3 - fi - bluetoothctl power on - show_menu - fi -} - -# Checks if controller is scanning for new devices -scan_on() { - if bluetoothctl show | grep -F -q "Discovering: yes"; then - echo "Scan: on" - return 0 - else - echo "Scan: off" - return 1 - fi -} - -# Toggles scanning state -toggle_scan() { - if scan_on; then - kill "$(pgrep -F -f "bluetoothctl scan on")" - bluetoothctl scan off - show_menu - else - bluetoothctl scan on & - echo "Scanning..." - sleep 5 - show_menu - fi -} - -# Checks if controller is able to pair to devices -pairable_on() { - if bluetoothctl show | grep -F -q "Pairable: yes"; then - echo "Pairable: on" - return 0 - else - echo "Pairable: off" - return 1 - fi -} - -# Toggles pairable state -toggle_pairable() { - if pairable_on; then - bluetoothctl pairable off - show_menu - else - bluetoothctl pairable on - show_menu - fi -} - -# Checks if controller is discoverable by other devices -discoverable_on() { - if bluetoothctl show | grep -F -q "Discoverable: yes"; then - echo "Discoverable: on" - return 0 - else - echo "Discoverable: off" - return 1 - fi -} - -# Toggles discoverable state -toggle_discoverable() { - if discoverable_on; then - bluetoothctl discoverable off - show_menu - else - bluetoothctl discoverable on - show_menu - fi -} - -# Checks if a device is connected -device_connected() { - device_info=$(bluetoothctl info "$1") - if echo "$device_info" | grep -F -q "Connected: yes"; then - return 0 - else - return 1 - fi -} - -# Toggles device connection -toggle_connection() { - if device_connected "$1"; then - bluetoothctl disconnect "$1" - # device_menu "$device" - else - bluetoothctl connect "$1" - # device_menu "$device" - fi -} - -# Checks if a device is paired -device_paired() { - device_info=$(bluetoothctl info "$1") - if echo "$device_info" | grep -F -q "Paired: yes"; then - echo "Paired: yes" - return 0 - else - echo "Paired: no" - return 1 - fi -} - -# Toggles device paired state -toggle_paired() { - if device_paired "$1"; then - bluetoothctl remove "$1" - device_menu "$device" - else - bluetoothctl pair "$1" - device_menu "$device" - fi -} - -# Checks if a device is trusted -device_trusted() { - device_info=$(bluetoothctl info "$1") - if echo "$device_info" | grep -F -q "Trusted: yes"; then - echo "Trusted: yes" - return 0 - else - echo "Trusted: no" - return 1 - fi -} - -# Toggles device connection -toggle_trust() { - if device_trusted "$1"; then - bluetoothctl untrust "$1" - device_menu "$device" - else - bluetoothctl trust "$1" - device_menu "$device" - fi -} - -# Prints a short string with the current bluetooth status -# Useful for status bars like polybar, etc. -print_status() { - if power_on; then - printf '' - - mapfile -t paired_devices < <(bluetoothctl paired-devices | grep -F Device | cut -d ' ' -f 2) - counter=0 - - for device in "${paired_devices[@]}"; do - if device_connected "$device"; then - device_alias="$(bluetoothctl info "$device" | grep -F "Alias" | cut -d ' ' -f 2-)" - - if [ $counter -gt 0 ]; then - printf ", %s" "$device_alias" - else - printf " %s" "$device_alias" - fi - - ((counter++)) - fi - done - printf "\n" - else - echo "" - fi -} - -# A submenu for a specific device that allows connecting, pairing, and trusting -device_menu() { - device=$1 - - # Get device name and mac address - device_name="$(echo "$device" | cut -d ' ' -f 3-)" - mac="$(echo "$device" | cut -d ' ' -f 2)" - - # Build options - if device_connected "$mac"; then - connected="Connected: yes" - else - connected="Connected: no" - fi - paired=$(device_paired "$mac") - trusted=$(device_trusted "$mac") - options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit" - - # Open dmenu menu, read chosen option - chosen="$(echo -e "$options" | run_dmenu "$device_name")" - - # Match chosen option to command - case $chosen in - "" | "$divider") - echo "No option chosen." - ;; - "$connected") - toggle_connection "$mac" - ;; - "$paired") - toggle_paired "$mac" - ;; - "$trusted") - toggle_trust "$mac" - ;; - "$goback") - show_menu - ;; - esac -} - -# Opens a dmenu menu with current bluetooth status and options to connect -show_menu() { - # Get menu options - if power_on; then - power="Power: on" - - # Human-readable names of devices, one per line - # If scan is off, will only list paired devices - devices=$(bluetoothctl devices | grep -F Device | cut -d ' ' -f 3-) - - # Get controller flags - scan=$(scan_on) - pairable=$(pairable_on) - discoverable=$(discoverable_on) - - # Options passed to dmenu - options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit" - else - power="Power: off" - options="$power\nExit" - fi - - # Open dmenu menu, read chosen option - chosen="$(echo -e "$options" | run_dmenu "Bluetooth")" - - # Match chosen option to command - case $chosen in - "" | "$divider") - echo "No option chosen." - ;; - "$power") - toggle_power - ;; - "$scan") - toggle_scan - ;; - "$discoverable") - toggle_discoverable - ;; - "$pairable") - toggle_pairable - ;; - *) - device=$(bluetoothctl devices | grep -F "$chosen") - # Open a submenu if a device is selected - if [[ $device ]]; then device_menu "$device"; fi - ;; - esac -} - -original_args=("$@") - -# dmenu command to pipe into. Extra arguments to dmenu-bluetooth are passed through to dmenu. This -# allows the user to set fonts, sizes, colours, etc. -run_dmenu() { - dmenu "${original_args[@]}" -b -l 5 -i -p "$1" -} - -case "$1" in - --status) - print_status - ;; - *) - show_menu - ;; -esac diff --git a/user/.config/suckless/dmenu/scripts/dmenu_drun b/user/.config/suckless/dmenu/scripts/dmenu_drun deleted file mode 100755 index 49d256429..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_drun +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple desktop dmenu script -# - Dependencies: dmenu, j4-dmenu-desktop - -prompt="-p launch:" -colors="-nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7" -font="-fn 'mononoki Nerd Font-10'" - -DMENU="dmenu -i -l 10 $font $colors $prompt" -j4-dmenu-desktop --dmenu "$DMENU" --no-generic diff --git a/user/.config/suckless/dmenu/scripts/dmenu_edit b/user/.config/suckless/dmenu/scripts/dmenu_edit deleted file mode 100755 index 80c270cc9..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_edit +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple script for file editing in dmenu -# - Dependencies: dmenu (Everything else can be changed) - -# Show list of options -EDITOR="emacsclient -c -a emacs" -cd "$HOME" || exit 0 -file=1 -while [ "$file" ]; do - file=$(fd -LHpd 1 | dmenu -i -l 10 -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "file to edit: $(basename "$(pwd)")") - if [ -e "$file" ]; then - owd=$(pwd) - if [ -d "$file" ]; then - cd "$file" || exit 0 - else [ -f "$file" ] - if [ "$file" ]; then - $EDITOR "$owd/$file" & - exit 0 - else - exit 0 - fi - fi - fi -done diff --git a/user/.config/suckless/dmenu/scripts/dmenu_emoji b/user/.config/suckless/dmenu/scripts/dmenu_emoji deleted file mode 100755 index b494cde55..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_emoji +++ /dev/null @@ -1,1839 +0,0 @@ -#!/bin/bash -# This files comes from: -# https://github.com/porras/dmenu-emoji -# -# If this file includes emojis below "__DATA__" it is generated. -# This file was generated: 2022-04-21 12:38:03+00:00 - -set -e - -case "$1" in - "list") - data=$(sed '0,/^__DATA__$/d' "$0") - echo "$data" - ;; - "copy") - input=$(tee) - if [ ! -z "$input" ]; then - emoji=${input: -1} - echo -n "$emoji" | xclip -selection c - command -v notify-send > /dev/null && notify-send "$emoji copied!" - fi - ;; - "") - bash $0 list | dmenu -b -i -l 10 -p 'Emoji: ' | bash $0 copy - ;; -esac - -exit - -__DATA__ -grinning face 😀 -grinning face with big eyes 😃 -grinning face with smiling eyes 😄 -beaming face with smiling eyes 😁 -grinning squinting face 😆 -grinning face with sweat 😅 -rolling on the floor laughing đŸ€Ł -face with tears of joy 😂 -slightly smiling face 🙂 -upside-down face 🙃 -winking face 😉 -smiling face with smiling eyes 😊 -smiling face with halo 😇 -smiling face with hearts đŸ„° -smiling face with heart-eyes 😍 -star-struck đŸ€© -face blowing a kiss 😘 -kissing face 😗 -smiling face â˜ș -kissing face with closed eyes 😚 -kissing face with smiling eyes 😙 -smiling face with tear đŸ„Č -face savoring food 😋 -face with tongue 😛 -winking face with tongue 😜 -zany face đŸ€Ș -squinting face with tongue 😝 -money-mouth face đŸ€‘ -hugging face đŸ€— -face with hand over mouth đŸ€­ -shushing face đŸ€« -thinking face đŸ€” -zipper-mouth face đŸ€ -face with raised eyebrow đŸ€š -neutral face 😐 -expressionless face 😑 -face without mouth đŸ˜¶ -smirking face 😏 -unamused face 😒 -face with rolling eyes 🙄 -grimacing face 😬 -face exhaling 😼‍ -lying face đŸ€„ -relieved face 😌 -pensive face 😔 -sleepy face đŸ˜Ș -drooling face đŸ€€ -sleeping face 😮 -face with medical mask đŸ˜· -face with thermometer đŸ€’ -face with head-bandage đŸ€• -nauseated face đŸ€ą -face vomiting đŸ€ź -sneezing face đŸ€§ -hot face đŸ„” -cold face đŸ„¶ -woozy face đŸ„Ž -knocked-out face đŸ˜” -exploding head đŸ€Ż -cowboy hat face đŸ€  -partying face đŸ„ł -disguised face đŸ„ž -smiling face with sunglasses 😎 -nerd face đŸ€“ -face with monocle 🧐 -confused face 😕 -worried face 😟 -slightly frowning face 🙁 -face with open mouth 😼 -hushed face 😯 -astonished face đŸ˜Č -flushed face 😳 -pleading face đŸ„ș -frowning face with open mouth 😩 -anguished face 😧 -fearful face 😹 -anxious face with sweat 😰 -sad but relieved face đŸ˜„ -crying face 😱 -loudly crying face 😭 -face screaming in fear đŸ˜± -confounded face 😖 -persevering face 😣 -disappointed face 😞 -downcast face with sweat 😓 -weary face đŸ˜© -tired face đŸ˜« -yawning face đŸ„± -face with steam from nose đŸ˜€ -pouting face 😡 -angry face 😠 -face with symbols on mouth đŸ€Ź -smiling face with horns 😈 -angry face with horns 👿 -skull 💀 -skull and crossbones ☠ -pile of poo đŸ’© -clown face đŸ€Ą -ogre đŸ‘č -goblin đŸ‘ș -ghost đŸ‘» -alien đŸ‘œ -alien monster đŸ‘Ÿ -robot đŸ€– -grinning cat đŸ˜ș -grinning cat with smiling eyes 😾 -cat with tears of joy đŸ˜č -smiling cat with heart-eyes đŸ˜» -cat with wry smile đŸ˜Œ -kissing cat đŸ˜œ -weary cat 🙀 -crying cat 😿 -pouting cat đŸ˜Ÿ -see-no-evil monkey 🙈 -hear-no-evil monkey 🙉 -speak-no-evil monkey 🙊 -kiss mark 💋 -love letter 💌 -heart with arrow 💘 -heart with ribbon 💝 -sparkling heart 💖 -growing heart 💗 -beating heart 💓 -revolving hearts 💞 -two hearts 💕 -heart decoration 💟 -heart exclamation âŁïž -broken heart 💔 -heart on fire â€ïžâ€đŸ”„ -mending heart ❀‍đŸ©č -red heart ❀ -orange heart 🧡 -yellow heart 💛 -green heart 💚 -blue heart 💙 -purple heart 💜 -brown heart đŸ€Ž -black heart đŸ–€ -white heart đŸ€ -hundred points 💯 -anger symbol 💱 -collision đŸ’„ -dizzy đŸ’« -sweat droplets 💩 -dashing away 💹 -hole đŸ•łïž -bomb 💣 -speech balloon 💬 -eye in speech bubble đŸ‘ïžâ€đŸ—šïž -left speech bubble đŸ—šïž -right anger bubble đŸ—Żïž -thought balloon 💭 -zzz đŸ’€ -waving hand 👋 -raised back of hand đŸ€š -hand with fingers splayed đŸ–ïž -raised hand ✋ -vulcan salute 🖖 -OK hand 👌 -pinched fingers đŸ€Œ -pinching hand đŸ€ -victory hand ✌ -crossed fingers đŸ€ž -love-you gesture đŸ€Ÿ -sign of the horns đŸ€˜ -call me hand đŸ€™ -backhand index pointing left 👈 -backhand index pointing right 👉 -backhand index pointing up 👆 -middle finger 🖕 -backhand index pointing down 👇 -index pointing up ☝ -thumbs up 👍 -thumbs down 👎 -raised fist ✊ -oncoming fist 👊 -left-facing fist đŸ€› -right-facing fist đŸ€œ -clapping hands 👏 -raising hands 🙌 -open hands 👐 -palms up together đŸ€Č -handshake đŸ€ -folded hands 🙏 -writing hand ✍ -nail polish 💅 -selfie đŸ€ł -flexed biceps đŸ’Ș -mechanical arm đŸŠŸ -mechanical leg 🩿 -leg đŸŠ” -foot đŸŠ¶ -ear 👂 -ear with hearing aid đŸŠ» -nose 👃 -brain 🧠 -anatomical heart đŸ«€ -lungs đŸ« -tooth đŸŠ· -bone 🩮 -eyes 👀 -eye đŸ‘ïž -tongue 👅 -mouth 👄 -baby đŸ‘¶ -child 🧒 -boy 👩 -girl 👧 -person 🧑 -person: blond hair đŸ‘± -man 👹 -person: beard 🧔 -man: beard đŸ§”â€â™‚ïž -woman: beard đŸ§”â€â™€ïž -man: red hair 👹‍🩰 -man: curly hair đŸ‘šâ€đŸŠ± -man: white hair 👹‍🩳 -man: bald 👹‍đŸŠČ -woman đŸ‘© -woman: red hair đŸ‘©â€đŸŠ° -person: red hair 🧑‍🩰 -woman: curly hair đŸ‘©â€đŸŠ± -person: curly hair đŸ§‘â€đŸŠ± -woman: white hair đŸ‘©â€đŸŠł -person: white hair 🧑‍🩳 -woman: bald đŸ‘©â€đŸŠČ -person: bald 🧑‍đŸŠČ -woman: blond hair đŸ‘±â€â™€ïž -man: blond hair đŸ‘±â€â™‚ïž -older person 🧓 -old man 👮 -old woman đŸ‘” -person frowning 🙍 -man frowning đŸ™â€â™‚ïž -woman frowning đŸ™â€â™€ïž -person pouting 🙎 -man pouting đŸ™Žâ€â™‚ïž -woman pouting đŸ™Žâ€â™€ïž -person gesturing NO 🙅 -man gesturing NO đŸ™…â€â™‚ïž -woman gesturing NO đŸ™…â€â™€ïž -person gesturing OK 🙆 -man gesturing OK đŸ™†â€â™‚ïž -woman gesturing OK đŸ™†â€â™€ïž -person tipping hand 💁 -man tipping hand đŸ’â€â™‚ïž -woman tipping hand đŸ’â€â™€ïž -person raising hand 🙋 -man raising hand đŸ™‹â€â™‚ïž -woman raising hand đŸ™‹â€â™€ïž -deaf person 🧏 -deaf man đŸ§â€â™‚ïž -deaf woman đŸ§â€â™€ïž -person bowing 🙇 -man bowing đŸ™‡â€â™‚ïž -woman bowing đŸ™‡â€â™€ïž -person facepalming đŸ€Š -man facepalming đŸ€Šâ€â™‚ïž -woman facepalming đŸ€Šâ€â™€ïž -person shrugging đŸ€· -man shrugging đŸ€·â€â™‚ïž -woman shrugging đŸ€·â€â™€ïž -health worker đŸ§‘â€âš•ïž -man health worker đŸ‘šâ€âš•ïž -woman health worker đŸ‘©â€âš•ïž -student 🧑‍🎓 -man student 👹‍🎓 -woman student đŸ‘©â€đŸŽ“ -teacher đŸ§‘â€đŸ« -man teacher đŸ‘šâ€đŸ« -woman teacher đŸ‘©â€đŸ« -judge đŸ§‘â€âš–ïž -man judge đŸ‘šâ€âš–ïž -woman judge đŸ‘©â€âš–ïž -farmer đŸ§‘â€đŸŒŸ -man farmer đŸ‘šâ€đŸŒŸ -woman farmer đŸ‘©â€đŸŒŸ -cook 🧑‍🍳 -man cook 👹‍🍳 -woman cook đŸ‘©â€đŸł -mechanic 🧑‍🔧 -man mechanic 👹‍🔧 -woman mechanic đŸ‘©â€đŸ”§ -factory worker 🧑‍🏭 -man factory worker 👹‍🏭 -woman factory worker đŸ‘©â€đŸ­ -office worker đŸ§‘â€đŸ’Œ -man office worker đŸ‘šâ€đŸ’Œ -woman office worker đŸ‘©â€đŸ’Œ -scientist 🧑‍🔬 -man scientist 👹‍🔬 -woman scientist đŸ‘©â€đŸ”Ź -technologist đŸ§‘â€đŸ’» -man technologist đŸ‘šâ€đŸ’» -woman technologist đŸ‘©â€đŸ’» -singer đŸ§‘â€đŸŽ€ -man singer đŸ‘šâ€đŸŽ€ -woman singer đŸ‘©â€đŸŽ€ -artist 🧑‍🎹 -man artist 👹‍🎹 -woman artist đŸ‘©â€đŸŽš -pilot đŸ§‘â€âœˆïž -man pilot đŸ‘šâ€âœˆïž -woman pilot đŸ‘©â€âœˆïž -astronaut 🧑‍🚀 -man astronaut 👹‍🚀 -woman astronaut đŸ‘©â€đŸš€ -firefighter 🧑‍🚒 -man firefighter 👹‍🚒 -woman firefighter đŸ‘©â€đŸš’ -police officer 👼 -man police officer đŸ‘źâ€â™‚ïž -woman police officer đŸ‘źâ€â™€ïž -detective đŸ•”ïž -man detective đŸ•”ïžâ€â™‚ïž -woman detective đŸ•”ïžâ€â™€ïž -guard 💂 -man guard đŸ’‚â€â™‚ïž -woman guard đŸ’‚â€â™€ïž -ninja đŸ„· -construction worker đŸ‘· -man construction worker đŸ‘·â€â™‚ïž -woman construction worker đŸ‘·â€â™€ïž -prince đŸ€Ž -princess 👾 -person wearing turban 👳 -man wearing turban đŸ‘łâ€â™‚ïž -woman wearing turban đŸ‘łâ€â™€ïž -person with skullcap đŸ‘Č -woman with headscarf 🧕 -person in tuxedo đŸ€” -man in tuxedo đŸ€”â€â™‚ïž -woman in tuxedo đŸ€”â€â™€ïž -person with veil 👰 -man with veil đŸ‘°â€â™‚ïž -woman with veil đŸ‘°â€â™€ïž -pregnant woman đŸ€° -breast-feeding đŸ€± -woman feeding baby đŸ‘©â€đŸŒ -man feeding baby đŸ‘šâ€đŸŒ -person feeding baby đŸ§‘â€đŸŒ -baby angel đŸ‘Œ -Santa Claus 🎅 -Mrs. Claus đŸ€¶ -mx claus 🧑‍🎄 -superhero 🩾 -man superhero đŸŠžâ€â™‚ïž -woman superhero đŸŠžâ€â™€ïž -supervillain đŸŠč -man supervillain đŸŠč‍♂ -woman supervillain đŸŠč‍♀ -mage 🧙 -man mage đŸ§™â€â™‚ïž -woman mage đŸ§™â€â™€ïž -fairy 🧚 -man fairy đŸ§šâ€â™‚ïž -woman fairy đŸ§šâ€â™€ïž -vampire 🧛 -man vampire đŸ§›â€â™‚ïž -woman vampire đŸ§›â€â™€ïž -merperson 🧜 -merman đŸ§œâ€â™‚ïž -mermaid đŸ§œâ€â™€ïž -elf 🧝 -man elf đŸ§â€â™‚ïž -woman elf đŸ§â€â™€ïž -genie 🧞 -man genie đŸ§žâ€â™‚ïž -woman genie đŸ§žâ€â™€ïž -zombie 🧟 -man zombie đŸ§Ÿâ€â™‚ïž -woman zombie đŸ§Ÿâ€â™€ïž -person getting massage 💆 -man getting massage đŸ’†â€â™‚ïž -woman getting massage đŸ’†â€â™€ïž -person getting haircut 💇 -man getting haircut đŸ’‡â€â™‚ïž -woman getting haircut đŸ’‡â€â™€ïž -person walking đŸš¶ -man walking đŸš¶â€â™‚ïž -woman walking đŸš¶â€â™€ïž -person standing 🧍 -man standing đŸ§â€â™‚ïž -woman standing đŸ§â€â™€ïž -person kneeling 🧎 -man kneeling đŸ§Žâ€â™‚ïž -woman kneeling đŸ§Žâ€â™€ïž -person with white cane 🧑‍🩯 -man with white cane 👹‍🩯 -woman with white cane đŸ‘©â€đŸŠŻ -person in motorized wheelchair đŸ§‘â€đŸŠŒ -man in motorized wheelchair đŸ‘šâ€đŸŠŒ -woman in motorized wheelchair đŸ‘©â€đŸŠŒ -person in manual wheelchair đŸ§‘â€đŸŠœ -man in manual wheelchair đŸ‘šâ€đŸŠœ -woman in manual wheelchair đŸ‘©â€đŸŠœ -person running 🏃 -man running đŸƒâ€â™‚ïž -woman running đŸƒâ€â™€ïž -woman dancing 💃 -man dancing đŸ•ș -person in suit levitating đŸ•Žïž -people with bunny ears 👯 -men with bunny ears đŸ‘Żâ€â™‚ïž -women with bunny ears đŸ‘Żâ€â™€ïž -person in steamy room 🧖 -man in steamy room đŸ§–â€â™‚ïž -woman in steamy room đŸ§–â€â™€ïž -person climbing 🧗 -man climbing đŸ§—â€â™‚ïž -woman climbing đŸ§—â€â™€ïž -person fencing đŸ€ș -horse racing 🏇 -skier ⛷ -snowboarder 🏂 -person golfing đŸŒïž -man golfing đŸŒïžâ€â™‚ïž -woman golfing đŸŒïžâ€â™€ïž -person surfing 🏄 -man surfing đŸ„â€â™‚ïž -woman surfing đŸ„â€â™€ïž -person rowing boat 🚣 -man rowing boat đŸšŁâ€â™‚ïž -woman rowing boat đŸšŁâ€â™€ïž -person swimming 🏊 -man swimming đŸŠâ€â™‚ïž -woman swimming đŸŠâ€â™€ïž -person bouncing ball â›č -man bouncing ball â›č‍♂ -woman bouncing ball â›č‍♀ -person lifting weights đŸ‹ïž -man lifting weights đŸ‹ïžâ€â™‚ïž -woman lifting weights đŸ‹ïžâ€â™€ïž -person biking 🚮 -man biking đŸšŽâ€â™‚ïž -woman biking đŸšŽâ€â™€ïž -person mountain biking đŸš” -man mountain biking đŸš”â€â™‚ïž -woman mountain biking đŸš”â€â™€ïž -person cartwheeling đŸ€ž -man cartwheeling đŸ€žâ€â™‚ïž -woman cartwheeling đŸ€žâ€â™€ïž -people wrestling đŸ€Œ -men wrestling đŸ€Œâ€â™‚ïž -women wrestling đŸ€Œâ€â™€ïž -person playing water polo đŸ€œ -man playing water polo đŸ€œâ€â™‚ïž -woman playing water polo đŸ€œâ€â™€ïž -person playing handball đŸ€Ÿ -man playing handball đŸ€Ÿâ€â™‚ïž -woman playing handball đŸ€Ÿâ€â™€ïž -person juggling đŸ€č -man juggling đŸ€č‍♂ -woman juggling đŸ€č‍♀ -person in lotus position 🧘 -man in lotus position đŸ§˜â€â™‚ïž -woman in lotus position đŸ§˜â€â™€ïž -person taking bath 🛀 -person in bed 🛌 -people holding hands đŸ§‘â€đŸ€â€đŸ§‘ -women holding hands 👭 -woman and man holding hands đŸ‘« -men holding hands 👬 -kiss 💏 -kiss: woman man đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘š -kiss: man man đŸ‘šâ€â€ïžâ€đŸ’‹â€đŸ‘š -kiss: woman woman đŸ‘©â€â€ïžâ€đŸ’‹â€đŸ‘© -couple with heart 💑 -couple with heart: woman man đŸ‘©â€â€ïžâ€đŸ‘š -couple with heart: man man đŸ‘šâ€â€ïžâ€đŸ‘š -couple with heart: woman woman đŸ‘©â€â€ïžâ€đŸ‘© -family đŸ‘Ș -family: man woman boy đŸ‘šâ€đŸ‘©â€đŸ‘Š -family: man woman girl đŸ‘šâ€đŸ‘©â€đŸ‘§ -family: man woman girl boy đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘Š -family: man woman boy boy đŸ‘šâ€đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: man woman girl girl đŸ‘šâ€đŸ‘©â€đŸ‘§â€đŸ‘§ -family: man man boy 👹‍👹‍👩 -family: man man girl 👹‍👹‍👧 -family: man man girl boy 👹‍👹‍👧‍👩 -family: man man boy boy 👹‍👹‍👩‍👩 -family: man man girl girl 👹‍👹‍👧‍👧 -family: woman woman boy đŸ‘©â€đŸ‘©â€đŸ‘Š -family: woman woman girl đŸ‘©â€đŸ‘©â€đŸ‘§ -family: woman woman girl boy đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘Š -family: woman woman boy boy đŸ‘©â€đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: woman woman girl girl đŸ‘©â€đŸ‘©â€đŸ‘§â€đŸ‘§ -family: man boy 👹‍👩 -family: man boy boy 👹‍👩‍👩 -family: man girl 👹‍👧 -family: man girl boy 👹‍👧‍👩 -family: man girl girl 👹‍👧‍👧 -family: woman boy đŸ‘©â€đŸ‘Š -family: woman boy boy đŸ‘©â€đŸ‘Šâ€đŸ‘Š -family: woman girl đŸ‘©â€đŸ‘§ -family: woman girl boy đŸ‘©â€đŸ‘§â€đŸ‘Š -family: woman girl girl đŸ‘©â€đŸ‘§â€đŸ‘§ -speaking head đŸ—Łïž -bust in silhouette đŸ‘€ -busts in silhouette đŸ‘„ -people hugging đŸ«‚ -footprints 👣 -monkey face đŸ” -monkey 🐒 -gorilla 🩍 -orangutan 🩧 -dog face đŸ¶ -dog 🐕 -guide dog 🩼 -service dog 🐕‍đŸŠș -poodle đŸ© -wolf đŸș -fox 🩊 -raccoon 🩝 -cat face đŸ± -cat 🐈 -black cat 🐈‍⬛ -lion 🩁 -tiger face 🐯 -tiger 🐅 -leopard 🐆 -horse face 🐮 -horse 🐎 -unicorn 🩄 -zebra 🩓 -deer 🩌 -bison 🩬 -cow face 🐼 -ox 🐂 -water buffalo 🐃 -cow 🐄 -pig face đŸ· -pig 🐖 -boar 🐗 -pig nose đŸœ -ram 🐏 -ewe 🐑 -goat 🐐 -camel đŸȘ -two-hump camel đŸ« -llama 🩙 -giraffe 🩒 -elephant 🐘 -mammoth 🩣 -rhinoceros 🩏 -hippopotamus 🩛 -mouse face 🐭 -mouse 🐁 -rat 🐀 -hamster đŸč -rabbit face 🐰 -rabbit 🐇 -chipmunk đŸżïž -beaver đŸŠ« -hedgehog 🩔 -bat 🩇 -bear đŸ» -polar bear đŸ»â€â„ïž -koala 🐹 -panda đŸŒ -sloth đŸŠ„ -otter 🩩 -skunk 🩹 -kangaroo 🩘 -badger 🩡 -paw prints đŸŸ -turkey 🩃 -chicken 🐔 -rooster 🐓 -hatching chick 🐣 -baby chick đŸ€ -front-facing baby chick đŸ„ -bird 🐩 -penguin 🐧 -dove đŸ•Šïž -eagle 🩅 -duck 🩆 -swan 🩱 -owl 🩉 -dodo đŸŠ€ -feather đŸȘ¶ -flamingo đŸŠ© -peacock 🩚 -parrot 🩜 -frog 🐾 -crocodile 🐊 -turtle 🐱 -lizard 🩎 -snake 🐍 -dragon face đŸČ -dragon 🐉 -sauropod 🩕 -T-Rex 🩖 -spouting whale 🐳 -whale 🐋 -dolphin 🐬 -seal 🩭 -fish 🐟 -tropical fish 🐠 -blowfish 🐡 -shark 🩈 -octopus 🐙 -spiral shell 🐚 -snail 🐌 -butterfly 🩋 -bug 🐛 -ant 🐜 -honeybee 🐝 -beetle đŸȘČ -lady beetle 🐞 -cricket 🩗 -cockroach đŸȘł -spider đŸ•·ïž -spider web đŸ•žïž -scorpion 🩂 -mosquito 🩟 -fly đŸȘ° -worm đŸȘ± -microbe 🩠 -bouquet 💐 -cherry blossom 🌾 -white flower 💼 -rosette đŸ”ïž -rose đŸŒč -wilted flower đŸ„€ -hibiscus đŸŒș -sunflower đŸŒ» -blossom đŸŒŒ -tulip đŸŒ· -seedling đŸŒ± -potted plant đŸȘŽ -evergreen tree đŸŒČ -deciduous tree 🌳 -palm tree 🌮 -cactus đŸŒ” -sheaf of rice đŸŒŸ -herb 🌿 -shamrock ☘ -four leaf clover 🍀 -maple leaf 🍁 -fallen leaf 🍂 -leaf fluttering in wind 🍃 -grapes 🍇 -melon 🍈 -watermelon 🍉 -tangerine 🍊 -lemon 🍋 -banana 🍌 -pineapple 🍍 -mango đŸ„­ -red apple 🍎 -green apple 🍏 -pear 🍐 -peach 🍑 -cherries 🍒 -strawberry 🍓 -blueberries đŸ« -kiwi fruit đŸ„ -tomato 🍅 -olive đŸ«’ -coconut đŸ„„ -avocado đŸ„‘ -eggplant 🍆 -potato đŸ„” -carrot đŸ„• -ear of corn đŸŒœ -hot pepper đŸŒ¶ïž -bell pepper đŸ«‘ -cucumber đŸ„’ -leafy green đŸ„Ź -broccoli đŸ„Š -garlic 🧄 -onion 🧅 -mushroom 🍄 -peanuts đŸ„œ -chestnut 🌰 -bread 🍞 -croissant đŸ„ -baguette bread đŸ„– -flatbread đŸ«“ -pretzel đŸ„š -bagel đŸ„Ż -pancakes đŸ„ž -waffle 🧇 -cheese wedge 🧀 -meat on bone 🍖 -poultry leg 🍗 -cut of meat đŸ„© -bacon đŸ„“ -hamburger 🍔 -french fries 🍟 -pizza 🍕 -hot dog 🌭 -sandwich đŸ„Ș -taco 🌼 -burrito 🌯 -tamale đŸ«” -stuffed flatbread đŸ„™ -falafel 🧆 -egg đŸ„š -cooking 🍳 -shallow pan of food đŸ„˜ -pot of food đŸČ -fondue đŸ«• -bowl with spoon đŸ„Ł -green salad đŸ„— -popcorn 🍿 -butter 🧈 -salt 🧂 -canned food đŸ„« -bento box đŸ± -rice cracker 🍘 -rice ball 🍙 -cooked rice 🍚 -curry rice 🍛 -steaming bowl 🍜 -spaghetti 🍝 -roasted sweet potato 🍠 -oden 🍱 -sushi 🍣 -fried shrimp đŸ€ -fish cake with swirl đŸ„ -moon cake đŸ„ź -dango 🍡 -dumpling đŸ„Ÿ -fortune cookie đŸ„  -takeout box đŸ„Ą -crab 🩀 -lobster 🩞 -shrimp 🩐 -squid 🩑 -oyster đŸŠȘ -soft ice cream 🍩 -shaved ice 🍧 -ice cream 🍹 -doughnut đŸ© -cookie đŸȘ -birthday cake 🎂 -shortcake 🍰 -cupcake 🧁 -pie đŸ„§ -chocolate bar đŸ« -candy 🍬 -lollipop 🍭 -custard 🍼 -honey pot 🍯 -baby bottle đŸŒ -glass of milk đŸ„› -hot beverage ☕ -teapot đŸ«– -teacup without handle đŸ” -sake đŸ¶ -bottle with popping cork đŸŸ -wine glass đŸ· -cocktail glass 🍾 -tropical drink đŸč -beer mug đŸș -clinking beer mugs đŸ» -clinking glasses đŸ„‚ -tumbler glass đŸ„ƒ -cup with straw đŸ„€ -bubble tea 🧋 -beverage box 🧃 -mate 🧉 -ice 🧊 -chopsticks đŸ„ą -fork and knife with plate đŸœïž -fork and knife 🍮 -spoon đŸ„„ -kitchen knife đŸ”Ș -amphora đŸș -globe showing Europe-Africa 🌍 -globe showing Americas 🌎 -globe showing Asia-Australia 🌏 -globe with meridians 🌐 -world map đŸ—ș -map of Japan đŸ—Ÿ -compass 🧭 -snow-capped mountain đŸ”ïž -mountain ⛰ -volcano 🌋 -mount fuji đŸ—» -camping đŸ•ïž -beach with umbrella đŸ–ïž -desert đŸœïž -desert island đŸïž -national park đŸžïž -stadium đŸŸïž -classical building đŸ›ïž -building construction đŸ—ïž -brick đŸ§± -rock đŸȘš -wood đŸȘ” -hut 🛖 -houses đŸ˜ïž -derelict house đŸšïž -house 🏠 -house with garden 🏡 -office building 🏱 -Japanese post office 🏣 -post office đŸ€ -hospital đŸ„ -bank 🏩 -hotel 🏹 -love hotel đŸ© -convenience store đŸȘ -school đŸ« -department store 🏬 -factory 🏭 -Japanese castle 🏯 -castle 🏰 -wedding 💒 -Tokyo tower đŸ—Œ -Statue of Liberty đŸ—œ -church â›Ș -mosque 🕌 -hindu temple 🛕 -synagogue 🕍 -shinto shrine ⛩ -kaaba 🕋 -fountain â›Č -tent â›ș -foggy 🌁 -night with stars 🌃 -cityscape đŸ™ïž -sunrise over mountains 🌄 -sunrise 🌅 -cityscape at dusk 🌆 -sunset 🌇 -bridge at night 🌉 -hot springs ♚ -carousel horse 🎠 -ferris wheel 🎡 -roller coaster 🎱 -barber pole 💈 -circus tent đŸŽȘ -locomotive 🚂 -railway car 🚃 -high-speed train 🚄 -bullet train 🚅 -train 🚆 -metro 🚇 -light rail 🚈 -station 🚉 -tram 🚊 -monorail 🚝 -mountain railway 🚞 -tram car 🚋 -bus 🚌 -oncoming bus 🚍 -trolleybus 🚎 -minibus 🚐 -ambulance 🚑 -fire engine 🚒 -police car 🚓 -oncoming police car 🚔 -taxi 🚕 -oncoming taxi 🚖 -automobile 🚗 -oncoming automobile 🚘 -sport utility vehicle 🚙 -pickup truck đŸ›» -delivery truck 🚚 -articulated lorry 🚛 -tractor 🚜 -racing car đŸŽïž -motorcycle đŸïž -motor scooter đŸ›” -manual wheelchair đŸŠœ -motorized wheelchair đŸŠŒ -auto rickshaw đŸ›ș -bicycle đŸšČ -kick scooter 🛮 -skateboard đŸ›č -roller skate đŸ›Œ -bus stop 🚏 -motorway đŸ›Łïž -railway track đŸ›€ïž -oil drum đŸ›ąïž -fuel pump ⛜ -police car light 🚹 -horizontal traffic light đŸš„ -vertical traffic light 🚩 -stop sign 🛑 -construction 🚧 -anchor ⚓ -sailboat â›” -canoe đŸ›¶ -speedboat đŸš€ -passenger ship đŸ›łïž -ferry ⛎ -motor boat đŸ›„ïž -ship 🚱 -airplane ✈ -small airplane đŸ›©ïž -airplane departure đŸ›« -airplane arrival 🛬 -parachute đŸȘ‚ -seat đŸ’ș -helicopter 🚁 -suspension railway 🚟 -mountain cableway 🚠 -aerial tramway 🚡 -satellite đŸ›°ïž -rocket 🚀 -flying saucer 🛾 -bellhop bell đŸ›Žïž -luggage 🧳 -hourglass done ⌛ -hourglass not done ⏳ -watch ⌚ -alarm clock ⏰ -stopwatch ⏱ -timer clock âČ -mantelpiece clock đŸ•°ïž -twelve o’clock 🕛 -twelve-thirty 🕧 -one o’clock 🕐 -one-thirty 🕜 -two o’clock 🕑 -two-thirty 🕝 -three o’clock 🕒 -three-thirty 🕞 -four o’clock 🕓 -four-thirty 🕟 -five o’clock 🕔 -five-thirty 🕠 -six o’clock 🕕 -six-thirty 🕡 -seven o’clock 🕖 -seven-thirty 🕱 -eight o’clock 🕗 -eight-thirty 🕣 -nine o’clock 🕘 -nine-thirty đŸ•€ -ten o’clock 🕙 -ten-thirty đŸ•„ -eleven o’clock 🕚 -eleven-thirty 🕩 -new moon 🌑 -waxing crescent moon 🌒 -first quarter moon 🌓 -waxing gibbous moon 🌔 -full moon 🌕 -waning gibbous moon 🌖 -last quarter moon 🌗 -waning crescent moon 🌘 -crescent moon 🌙 -new moon face 🌚 -first quarter moon face 🌛 -last quarter moon face 🌜 -thermometer đŸŒĄïž -sun ☀ -full moon face 🌝 -sun with face 🌞 -ringed planet đŸȘ -star ⭐ -glowing star 🌟 -shooting star 🌠 -milky way 🌌 -cloud ☁ -sun behind cloud ⛅ -cloud with lightning and rain ⛈ -sun behind small cloud đŸŒ€ïž -sun behind large cloud đŸŒ„ïž -sun behind rain cloud đŸŒŠïž -cloud with rain đŸŒ§ïž -cloud with snow đŸŒšïž -cloud with lightning đŸŒ©ïž -tornado đŸŒȘ -fog đŸŒ«ïž -wind face đŸŒŹïž -cyclone 🌀 -rainbow 🌈 -closed umbrella 🌂 -umbrella ☂ -umbrella with rain drops ☔ -umbrella on ground ⛱ -high voltage ⚡ -snowflake ❄ -snowman ☃ -snowman without snow ⛄ -comet ☄ -fire đŸ”„ -droplet 💧 -water wave 🌊 -jack-o-lantern 🎃 -Christmas tree 🎄 -fireworks 🎆 -sparkler 🎇 -firecracker 🧹 -sparkles ✹ -balloon 🎈 -party popper 🎉 -confetti ball 🎊 -tanabata tree 🎋 -pine decoration 🎍 -Japanese dolls 🎎 -carp streamer 🎏 -wind chime 🎐 -moon viewing ceremony 🎑 -red envelope 🧧 -ribbon 🎀 -wrapped gift 🎁 -reminder ribbon đŸŽ—ïž -admission tickets đŸŽŸïž -ticket đŸŽ« -military medal đŸŽ–ïž -trophy 🏆 -sports medal 🏅 -1st place medal đŸ„‡ -2nd place medal đŸ„ˆ -3rd place medal đŸ„‰ -soccer ball âšœ -baseball ⚟ -softball đŸ„Ž -basketball 🏀 -volleyball 🏐 -american football 🏈 -rugby football 🏉 -tennis đŸŽŸ -flying disc đŸ„ -bowling 🎳 -cricket game 🏏 -field hockey 🏑 -ice hockey 🏒 -lacrosse đŸ„ -ping pong 🏓 -badminton 🏾 -boxing glove đŸ„Š -martial arts uniform đŸ„‹ -goal net đŸ„… -flag in hole ⛳ -ice skate ⛞ -fishing pole 🎣 -diving mask đŸ€ż -running shirt đŸŽœ -skis 🎿 -sled đŸ›· -curling stone đŸ„Œ -bullseye 🎯 -yo-yo đŸȘ€ -kite đŸȘ -pool 8 ball đŸŽ± -crystal ball 🔼 -magic wand đŸȘ„ -nazar amulet 🧿 -video game 🎼 -joystick đŸ•č -slot machine 🎰 -game die đŸŽČ -puzzle piece đŸ§© -teddy bear 🧾 -piñata đŸȘ… -nesting dolls đŸȘ† -spade suit ♠ -heart suit ♄ -diamond suit ♊ -club suit â™Łïž -chess pawn ♟ -joker 🃏 -mahjong red dragon 🀄 -flower playing cards 🎮 -performing arts 🎭 -framed picture đŸ–Œïž -artist palette 🎹 -thread đŸ§” -sewing needle đŸȘĄ -yarn đŸ§¶ -knot đŸȘą -glasses 👓 -sunglasses đŸ•¶ïž -goggles đŸ„œ -lab coat đŸ„Œ -safety vest đŸŠș -necktie 👔 -t-shirt 👕 -jeans 👖 -scarf 🧣 -gloves đŸ§€ -coat đŸ§„ -socks 🧩 -dress 👗 -kimono 👘 -sari đŸ„» -one-piece swimsuit đŸ©± -briefs đŸ©Č -shorts đŸ©ł -bikini 👙 -woman’s clothes 👚 -purse 👛 -handbag 👜 -clutch bag 👝 -shopping bags đŸ›ïž -backpack 🎒 -thong sandal đŸ©Ž -man’s shoe 👞 -running shoe 👟 -hiking boot đŸ„Ÿ -flat shoe đŸ„ż -high-heeled shoe 👠 -woman’s sandal 👡 -ballet shoes đŸ©° -woman’s boot 👱 -crown 👑 -woman’s hat 👒 -top hat đŸŽ© -graduation cap 🎓 -billed cap 🧱 -military helmet đŸȘ– -rescue worker’s helmet ⛑ -prayer beads 📿 -lipstick 💄 -ring 💍 -gem stone 💎 -muted speaker 🔇 -speaker low volume 🔈 -speaker medium volume 🔉 -speaker high volume 🔊 -loudspeaker 📱 -megaphone 📣 -postal horn 📯 -bell 🔔 -bell with slash 🔕 -musical score đŸŽŒ -musical note đŸŽ” -musical notes đŸŽ¶ -studio microphone đŸŽ™ïž -level slider đŸŽšïž -control knobs đŸŽ›ïž -microphone đŸŽ€ -headphone 🎧 -radio đŸ“» -saxophone đŸŽ· -accordion đŸȘ— -guitar 🎾 -musical keyboard đŸŽč -trumpet đŸŽș -violin đŸŽ» -banjo đŸȘ• -drum đŸ„ -long drum đŸȘ˜ -mobile phone đŸ“± -mobile phone with arrow đŸ“Č -telephone ☎ -telephone receiver 📞 -pager 📟 -fax machine 📠 -battery 🔋 -electric plug 🔌 -laptop đŸ’» -desktop computer đŸ–„ïž -printer đŸ–šïž -keyboard ⌚ -computer mouse đŸ–±ïž -trackball đŸ–Č -computer disk đŸ’œ -floppy disk đŸ’Ÿ -optical disk 💿 -dvd 📀 -abacus 🧼 -movie camera đŸŽ„ -film frames đŸŽžïž -film projector đŸ“œïž -clapper board 🎬 -television đŸ“ș -camera đŸ“· -camera with flash 📾 -video camera đŸ“č -videocassette đŸ“Œ -magnifying glass tilted left 🔍 -magnifying glass tilted right 🔎 -candle đŸ•Żïž -light bulb 💡 -flashlight 🔩 -red paper lantern 🏼 -diya lamp đŸȘ” -notebook with decorative cover 📔 -closed book 📕 -open book 📖 -green book 📗 -blue book 📘 -orange book 📙 -books 📚 -notebook 📓 -ledger 📒 -page with curl 📃 -scroll 📜 -page facing up 📄 -newspaper 📰 -rolled-up newspaper đŸ—žïž -bookmark tabs 📑 -bookmark 🔖 -label đŸ·ïž -money bag 💰 -coin đŸȘ™ -yen banknote 💮 -dollar banknote đŸ’” -euro banknote đŸ’¶ -pound banknote đŸ’· -money with wings 💾 -credit card 💳 -receipt đŸ§Ÿ -chart increasing with yen đŸ’č -envelope ✉ -e-mail 📧 -incoming envelope 📹 -envelope with arrow đŸ“© -outbox tray đŸ“€ -inbox tray đŸ“„ -package 📩 -closed mailbox with raised flag đŸ“« -closed mailbox with lowered flag đŸ“Ș -open mailbox with raised flag 📬 -open mailbox with lowered flag 📭 -postbox 📼 -ballot box with ballot đŸ—łïž -pencil ✏ -black nib ✒ -fountain pen đŸ–‹ïž -pen đŸ–Šïž -paintbrush đŸ–Œïž -crayon đŸ–ïž -memo 📝 -briefcase đŸ’Œ -file folder 📁 -open file folder 📂 -card index dividers đŸ—‚ïž -calendar 📅 -tear-off calendar 📆 -spiral notepad đŸ—’ïž -spiral calendar đŸ—“ïž -card index 📇 -chart increasing 📈 -chart decreasing 📉 -bar chart 📊 -clipboard 📋 -pushpin 📌 -round pushpin 📍 -paperclip 📎 -linked paperclips đŸ–‡ïž -straight ruler 📏 -triangular ruler 📐 -scissors ✂ -card file box đŸ—ƒïž -file cabinet đŸ—„ïž -wastebasket đŸ—‘ïž -locked 🔒 -unlocked 🔓 -locked with pen 🔏 -locked with key 🔐 -key 🔑 -old key đŸ—ïž -hammer 🔹 -axe đŸȘ“ -pick ⛏ -hammer and pick ⚒ -hammer and wrench đŸ› ïž -dagger đŸ—Ąïž -crossed swords ⚔ -water pistol đŸ”« -boomerang đŸȘƒ -bow and arrow đŸč -shield đŸ›Ąïž -carpentry saw đŸȘš -wrench 🔧 -screwdriver đŸȘ› -nut and bolt đŸ”© -gear ⚙ -clamp đŸ—œïž -balance scale ⚖ -white cane 🩯 -link 🔗 -chains ⛓ -hook đŸȘ -toolbox 🧰 -magnet đŸ§Č -ladder đŸȘœ -alembic ⚗ -test tube đŸ§Ș -petri dish đŸ§« -dna 🧬 -microscope 🔬 -telescope 🔭 -satellite antenna 📡 -syringe 💉 -drop of blood đŸ©ž -pill 💊 -adhesive bandage đŸ©č -stethoscope đŸ©ș -door đŸšȘ -elevator 🛗 -mirror đŸȘž -window đŸȘŸ -bed đŸ›ïž -couch and lamp đŸ›‹ïž -chair đŸȘ‘ -toilet đŸšœ -plunger đŸȘ  -shower 🚿 -bathtub 🛁 -mouse trap đŸȘ€ -razor đŸȘ’ -lotion bottle 🧮 -safety pin đŸ§· -broom đŸ§č -basket đŸ§ș -roll of paper đŸ§» -bucket đŸȘŁ -soap đŸ§Œ -toothbrush đŸȘ„ -sponge đŸ§œ -fire extinguisher 🧯 -shopping cart 🛒 -cigarette 🚬 -coffin ⚰ -headstone đŸȘŠ -funeral urn ⚱ -moai 🗿 -placard đŸȘ§ -ATM sign 🏧 -litter in bin sign 🚼 -potable water 🚰 -wheelchair symbol ♿ -men’s room đŸšč -women’s room đŸšș -restroom đŸš» -baby symbol đŸšŒ -water closet đŸšŸ -passport control 🛂 -customs 🛃 -baggage claim 🛄 -left luggage 🛅 -warning ⚠ -children crossing 🚾 -no entry ⛔ -prohibited đŸš« -no bicycles 🚳 -no smoking 🚭 -no littering 🚯 -non-potable water đŸš± -no pedestrians đŸš· -no mobile phones đŸ“” -no one under eighteen 🔞 -radioactive â˜ąïž -biohazard â˜Łïž -up arrow âŹ†ïž -up-right arrow ↗ -right arrow âžĄïž -down-right arrow ↘ -down arrow âŹ‡ïž -down-left arrow ↙ -left arrow âŹ…ïž -up-left arrow ↖ -up-down arrow ↕ -left-right arrow ↔ -right arrow curving left ↩ -left arrow curving right â†Ș -right arrow curving up ‎ -right arrow curving down — -clockwise vertical arrows 🔃 -counterclockwise arrows button 🔄 -BACK arrow 🔙 -END arrow 🔚 -ON! arrow 🔛 -SOON arrow 🔜 -TOP arrow 🔝 -place of worship 🛐 -atom symbol ⚛ -om đŸ•‰ïž -star of David âœĄïž -wheel of dharma ☞ -yin yang â˜Żïž -latin cross ✝ -orthodox cross ☊ -star and crescent â˜Ș -peace symbol â˜źïž -menorah 🕎 -dotted six-pointed star 🔯 -Aries ♈ -Taurus ♉ -Gemini ♊ -Cancer ♋ -Leo ♌ -Virgo ♍ -Libra ♎ -Scorpio ♏ -Sagittarius ♐ -Capricorn ♑ -Aquarius ♒ -Pisces ♓ -Ophiuchus ⛎ -shuffle tracks button 🔀 -repeat button 🔁 -repeat single button 🔂 -play button ▶ -fast-forward button ⏩ -next track button ⏭ -play or pause button âŻïž -reverse button ◀ -fast reverse button âȘ -last track button âźïž -upwards button đŸ”Œ -fast up button ⏫ -downwards button đŸ”œ -fast down button ⏬ -pause button ⏞ -stop button âč -record button âș -eject button ⏏ -cinema 🎩 -dim button 🔅 -bright button 🔆 -antenna bars đŸ“¶ -vibration mode 📳 -mobile phone off 📮 -female sign ♀ -male sign ♂ -transgender symbol ⚧ -multiply ✖ -plus ➕ -minus ➖ -divide ➗ -infinity ♟ -double exclamation mark ‌ -exclamation question mark ⁉ -red question mark ❓ -white question mark ❔ -white exclamation mark ❕ -red exclamation mark ❗ -wavy dash ă€°ïž -currency exchange đŸ’± -heavy dollar sign đŸ’Č -medical symbol ⚕ -recycling symbol ♻ -fleur-de-lis ⚜ -trident emblem đŸ”± -name badge 📛 -Japanese symbol for beginner 🔰 -hollow red circle ⭕ -check mark button ✅ -check box with check ☑ -check mark ✔ -cross mark ❌ -cross mark button ❎ -curly loop ➰ -double curly loop ➿ -part alternation mark ă€œïž -eight-spoked asterisk âœłïž -eight-pointed star ✎ -sparkle ❇ -copyright © -registered Âźïž -trade mark â„ąïž -keycap: # #ïžâƒŁ -keycap: * *ïžâƒŁ -keycap: 0 0ïžâƒŁ -keycap: 1 1ïžâƒŁ -keycap: 2 2ïžâƒŁ -keycap: 3 3ïžâƒŁ -keycap: 4 4ïžâƒŁ -keycap: 5 5ïžâƒŁ -keycap: 6 6ïžâƒŁ -keycap: 7 7ïžâƒŁ -keycap: 8 8ïžâƒŁ -keycap: 9 9ïžâƒŁ -keycap: 10 🔟 -input latin uppercase 🔠 -input latin lowercase 🔡 -input numbers 🔱 -input symbols 🔣 -input latin letters đŸ”€ -A button (blood type) đŸ…°ïž -AB button (blood type) 🆎 -B button (blood type) đŸ…±ïž -CL button 🆑 -COOL button 🆒 -FREE button 🆓 -information â„č -ID button 🆔 -circled M Ⓜ -NEW button 🆕 -NG button 🆖 -O button (blood type) đŸ…Ÿïž -OK button 🆗 -P button đŸ…żïž -SOS button 🆘 -UP! button 🆙 -VS button 🆚 -Japanese “here” button 🈁 -Japanese “service charge” button đŸˆ‚ïž -Japanese “monthly amount” button đŸˆ·ïž -Japanese “not free of charge” button đŸˆ¶ -Japanese “reserved” button 🈯 -Japanese “bargain” button 🉐 -Japanese “discount” button đŸˆč -Japanese “free of charge” button 🈚 -Japanese “prohibited” button đŸˆČ -Japanese “acceptable” button 🉑 -Japanese “application” button 🈾 -Japanese “passing grade” button 🈮 -Japanese “vacancy” button 🈳 -Japanese “congratulations” button ăŠ—ïž -Japanese “secret” button ăŠ™ïž -Japanese “open for business” button đŸˆș -Japanese “no vacancy” button đŸˆ” -red circle 🔮 -orange circle 🟠 -yellow circle 🟡 -green circle 🟱 -blue circle đŸ”” -purple circle 🟣 -brown circle đŸŸ€ -black circle ⚫ -white circle âšȘ -red square đŸŸ„ -orange square 🟧 -yellow square 🟹 -green square đŸŸ© -blue square 🟩 -purple square đŸŸȘ -brown square đŸŸ« -black large square ⬛ -white large square ⬜ -black medium square ◌ -white medium square ◻ -black medium-small square â—Ÿ -white medium-small square â—œ -black small square â–Ș -white small square ▫ -large orange diamond đŸ”¶ -large blue diamond đŸ”· -small orange diamond 🔾 -small blue diamond đŸ”č -red triangle pointed up đŸ”ș -red triangle pointed down đŸ”» -diamond with a dot 💠 -radio button 🔘 -white square button 🔳 -black square button đŸ”Č -chequered flag 🏁 -triangular flag đŸš© -crossed flags 🎌 -black flag 🏮 -white flag đŸłïž -rainbow flag đŸłïžâ€đŸŒˆ -transgender flag đŸłïžâ€âš§ïž -pirate flag đŸŽâ€â˜ ïž -flag: Ascension Island 🇩🇹 -flag: Andorra đŸ‡ŠđŸ‡© -flag: United Arab Emirates 🇩đŸ‡Ș -flag: Afghanistan đŸ‡ŠđŸ‡« -flag: Antigua & Barbuda 🇩🇬 -flag: Anguilla 🇩🇼 -flag: Albania đŸ‡ŠđŸ‡± -flag: Armenia 🇩đŸ‡Č -flag: Angola 🇩🇮 -flag: Antarctica đŸ‡ŠđŸ‡¶ -flag: Argentina đŸ‡ŠđŸ‡· -flag: American Samoa 🇩🇾 -flag: Austria 🇩đŸ‡č -flag: Australia 🇩đŸ‡ș -flag: Aruba đŸ‡ŠđŸ‡Œ -flag: Åland Islands đŸ‡ŠđŸ‡œ -flag: Azerbaijan 🇩🇿 -flag: Bosnia & Herzegovina 🇧🇩 -flag: Barbados 🇧🇧 -flag: Bangladesh đŸ‡§đŸ‡© -flag: Belgium 🇧đŸ‡Ș -flag: Burkina Faso đŸ‡§đŸ‡« -flag: Bulgaria 🇧🇬 -flag: Bahrain 🇧🇭 -flag: Burundi 🇧🇼 -flag: Benin 🇧🇯 -flag: St. BarthĂ©lemy đŸ‡§đŸ‡± -flag: Bermuda 🇧đŸ‡Č -flag: Brunei 🇧🇳 -flag: Bolivia 🇧🇮 -flag: Caribbean Netherlands đŸ‡§đŸ‡¶ -flag: Brazil đŸ‡§đŸ‡· -flag: Bahamas 🇧🇾 -flag: Bhutan 🇧đŸ‡č -flag: Bouvet Island đŸ‡§đŸ‡» -flag: Botswana đŸ‡§đŸ‡Œ -flag: Belarus đŸ‡§đŸ‡Ÿ -flag: Belize 🇧🇿 -flag: Canada 🇹🇩 -flag: Cocos (Keeling) Islands 🇹🇹 -flag: Congo - Kinshasa đŸ‡šđŸ‡© -flag: Central African Republic đŸ‡šđŸ‡« -flag: Congo - Brazzaville 🇹🇬 -flag: Switzerland 🇹🇭 -flag: CĂŽte d’Ivoire 🇹🇼 -flag: Cook Islands 🇹🇰 -flag: Chile đŸ‡šđŸ‡± -flag: Cameroon 🇹đŸ‡Č -flag: China 🇹🇳 -flag: Colombia 🇹🇮 -flag: Clipperton Island đŸ‡šđŸ‡” -flag: Costa Rica đŸ‡šđŸ‡· -flag: Cuba 🇹đŸ‡ș -flag: Cape Verde đŸ‡šđŸ‡» -flag: Curaçao đŸ‡šđŸ‡Œ -flag: Christmas Island đŸ‡šđŸ‡œ -flag: Cyprus đŸ‡šđŸ‡Ÿ -flag: Czechia 🇹🇿 -flag: Germany đŸ‡©đŸ‡Ș -flag: Diego Garcia đŸ‡©đŸ‡Ź -flag: Djibouti đŸ‡©đŸ‡Ż -flag: Denmark đŸ‡©đŸ‡° -flag: Dominica đŸ‡©đŸ‡Č -flag: Dominican Republic đŸ‡©đŸ‡Ž -flag: Algeria đŸ‡©đŸ‡ż -flag: Ceuta & Melilla đŸ‡Ș🇩 -flag: Ecuador đŸ‡Ș🇹 -flag: Estonia đŸ‡ȘđŸ‡Ș -flag: Egypt đŸ‡Ș🇬 -flag: Western Sahara đŸ‡Ș🇭 -flag: Eritrea đŸ‡ȘđŸ‡· -flag: Spain đŸ‡Ș🇾 -flag: Ethiopia đŸ‡ȘđŸ‡č -flag: European Union đŸ‡ȘđŸ‡ș -flag: Finland đŸ‡«đŸ‡ź -flag: Fiji đŸ‡«đŸ‡Ż -flag: Falkland Islands đŸ‡«đŸ‡° -flag: Micronesia đŸ‡«đŸ‡Č -flag: Faroe Islands đŸ‡«đŸ‡Ž -flag: France đŸ‡«đŸ‡· -flag: Gabon 🇬🇩 -flag: United Kingdom 🇬🇧 -flag: Grenada đŸ‡ŹđŸ‡© -flag: Georgia 🇬đŸ‡Ș -flag: French Guiana đŸ‡ŹđŸ‡« -flag: Guernsey 🇬🇬 -flag: Ghana 🇬🇭 -flag: Gibraltar 🇬🇼 -flag: Greenland đŸ‡ŹđŸ‡± -flag: Gambia 🇬đŸ‡Č -flag: Guinea 🇬🇳 -flag: Guadeloupe đŸ‡ŹđŸ‡” -flag: Equatorial Guinea đŸ‡ŹđŸ‡¶ -flag: Greece đŸ‡ŹđŸ‡· -flag: South Georgia & South Sandwich Islands 🇬🇾 -flag: Guatemala 🇬đŸ‡č -flag: Guam 🇬đŸ‡ș -flag: Guinea-Bissau đŸ‡ŹđŸ‡Œ -flag: Guyana đŸ‡ŹđŸ‡Ÿ -flag: Hong Kong SAR China 🇭🇰 -flag: Heard & McDonald Islands 🇭đŸ‡Č -flag: Honduras 🇭🇳 -flag: Croatia đŸ‡­đŸ‡· -flag: Haiti 🇭đŸ‡č -flag: Hungary 🇭đŸ‡ș -flag: Canary Islands 🇼🇹 -flag: Indonesia đŸ‡źđŸ‡© -flag: Ireland 🇼đŸ‡Ș -flag: Israel đŸ‡źđŸ‡± -flag: Isle of Man 🇼đŸ‡Č -flag: India 🇼🇳 -flag: British Indian Ocean Territory 🇼🇮 -flag: Iraq đŸ‡źđŸ‡¶ -flag: Iran đŸ‡źđŸ‡· -flag: Iceland 🇼🇾 -flag: Italy 🇼đŸ‡č -flag: Jersey 🇯đŸ‡Ș -flag: Jamaica 🇯đŸ‡Č -flag: Jordan 🇯🇮 -flag: Japan đŸ‡ŻđŸ‡” -flag: Kenya 🇰đŸ‡Ș -flag: Kyrgyzstan 🇰🇬 -flag: Cambodia 🇰🇭 -flag: Kiribati 🇰🇼 -flag: Comoros 🇰đŸ‡Č -flag: St. Kitts & Nevis 🇰🇳 -flag: North Korea đŸ‡°đŸ‡” -flag: South Korea đŸ‡°đŸ‡· -flag: Kuwait đŸ‡°đŸ‡Œ -flag: Cayman Islands đŸ‡°đŸ‡Ÿ -flag: Kazakhstan 🇰🇿 -flag: Laos đŸ‡±đŸ‡Š -flag: Lebanon đŸ‡±đŸ‡§ -flag: St. Lucia đŸ‡±đŸ‡š -flag: Liechtenstein đŸ‡±đŸ‡ź -flag: Sri Lanka đŸ‡±đŸ‡° -flag: Liberia đŸ‡±đŸ‡· -flag: Lesotho đŸ‡±đŸ‡ž -flag: Lithuania đŸ‡±đŸ‡č -flag: Luxembourg đŸ‡±đŸ‡ș -flag: Latvia đŸ‡±đŸ‡» -flag: Libya đŸ‡±đŸ‡Ÿ -flag: Morocco đŸ‡Č🇩 -flag: Monaco đŸ‡Č🇹 -flag: Moldova đŸ‡ČđŸ‡© -flag: Montenegro đŸ‡ČđŸ‡Ș -flag: St. Martin đŸ‡ČđŸ‡« -flag: Madagascar đŸ‡Č🇬 -flag: Marshall Islands đŸ‡Č🇭 -flag: North Macedonia đŸ‡Č🇰 -flag: Mali đŸ‡ČđŸ‡± -flag: Myanmar (Burma) đŸ‡ČđŸ‡Č -flag: Mongolia đŸ‡Č🇳 -flag: Macao SAR China đŸ‡Č🇮 -flag: Northern Mariana Islands đŸ‡ČđŸ‡” -flag: Martinique đŸ‡ČđŸ‡¶ -flag: Mauritania đŸ‡ČđŸ‡· -flag: Montserrat đŸ‡Č🇾 -flag: Malta đŸ‡ČđŸ‡č -flag: Mauritius đŸ‡ČđŸ‡ș -flag: Maldives đŸ‡ČđŸ‡» -flag: Malawi đŸ‡ČđŸ‡Œ -flag: Mexico đŸ‡ČđŸ‡œ -flag: Malaysia đŸ‡ČđŸ‡Ÿ -flag: Mozambique đŸ‡Č🇿 -flag: Namibia 🇳🇩 -flag: New Caledonia 🇳🇹 -flag: Niger 🇳đŸ‡Ș -flag: Norfolk Island đŸ‡łđŸ‡« -flag: Nigeria 🇳🇬 -flag: Nicaragua 🇳🇼 -flag: Netherlands đŸ‡łđŸ‡± -flag: Norway 🇳🇮 -flag: Nepal đŸ‡łđŸ‡” -flag: Nauru đŸ‡łđŸ‡· -flag: Niue 🇳đŸ‡ș -flag: New Zealand 🇳🇿 -flag: Oman 🇮đŸ‡Č -flag: Panama đŸ‡”đŸ‡Š -flag: Peru đŸ‡”đŸ‡Ș -flag: French Polynesia đŸ‡”đŸ‡« -flag: Papua New Guinea đŸ‡”đŸ‡Ź -flag: Philippines đŸ‡”đŸ‡­ -flag: Pakistan đŸ‡”đŸ‡° -flag: Poland đŸ‡”đŸ‡± -flag: St. Pierre & Miquelon đŸ‡”đŸ‡Č -flag: Pitcairn Islands đŸ‡”đŸ‡ł -flag: Puerto Rico đŸ‡”đŸ‡· -flag: Palestinian Territories đŸ‡”đŸ‡ž -flag: Portugal đŸ‡”đŸ‡č -flag: Palau đŸ‡”đŸ‡Œ -flag: Paraguay đŸ‡”đŸ‡Ÿ -flag: Qatar đŸ‡¶đŸ‡Š -flag: RĂ©union đŸ‡·đŸ‡Ș -flag: Romania đŸ‡·đŸ‡Ž -flag: Serbia đŸ‡·đŸ‡ž -flag: Russia đŸ‡·đŸ‡ș -flag: Rwanda đŸ‡·đŸ‡Œ -flag: Saudi Arabia 🇾🇩 -flag: Solomon Islands 🇾🇧 -flag: Seychelles 🇾🇹 -flag: Sudan đŸ‡žđŸ‡© -flag: Sweden 🇾đŸ‡Ș -flag: Singapore 🇾🇬 -flag: St. Helena 🇾🇭 -flag: Slovenia 🇾🇼 -flag: Svalbard & Jan Mayen 🇾🇯 -flag: Slovakia 🇾🇰 -flag: Sierra Leone đŸ‡žđŸ‡± -flag: San Marino 🇾đŸ‡Č -flag: Senegal 🇾🇳 -flag: Somalia 🇾🇮 -flag: Suriname đŸ‡žđŸ‡· -flag: South Sudan 🇾🇾 -flag: SĂŁo TomĂ© & PrĂ­ncipe 🇾đŸ‡č -flag: El Salvador đŸ‡žđŸ‡» -flag: Sint Maarten đŸ‡žđŸ‡œ -flag: Syria đŸ‡žđŸ‡Ÿ -flag: Eswatini 🇾🇿 -flag: Tristan da Cunha đŸ‡č🇩 -flag: Turks & Caicos Islands đŸ‡č🇹 -flag: Chad đŸ‡čđŸ‡© -flag: French Southern Territories đŸ‡čđŸ‡« -flag: Togo đŸ‡č🇬 -flag: Thailand đŸ‡č🇭 -flag: Tajikistan đŸ‡č🇯 -flag: Tokelau đŸ‡č🇰 -flag: Timor-Leste đŸ‡čđŸ‡± -flag: Turkmenistan đŸ‡čđŸ‡Č -flag: Tunisia đŸ‡č🇳 -flag: Tonga đŸ‡č🇮 -flag: Turkey đŸ‡čđŸ‡· -flag: Trinidad & Tobago đŸ‡čđŸ‡č -flag: Tuvalu đŸ‡čđŸ‡» -flag: Taiwan đŸ‡čđŸ‡Œ -flag: Tanzania đŸ‡č🇿 -flag: Ukraine đŸ‡ș🇩 -flag: Uganda đŸ‡ș🇬 -flag: U.S. Outlying Islands đŸ‡șđŸ‡Č -flag: United Nations đŸ‡ș🇳 -flag: United States đŸ‡ș🇾 -flag: Uruguay đŸ‡șđŸ‡Ÿ -flag: Uzbekistan đŸ‡ș🇿 -flag: Vatican City đŸ‡»đŸ‡Š -flag: St. Vincent & Grenadines đŸ‡»đŸ‡š -flag: Venezuela đŸ‡»đŸ‡Ș -flag: British Virgin Islands đŸ‡»đŸ‡Ź -flag: U.S. Virgin Islands đŸ‡»đŸ‡ź -flag: Vietnam đŸ‡»đŸ‡ł -flag: Vanuatu đŸ‡»đŸ‡ș -flag: Wallis & Futuna đŸ‡ŒđŸ‡« -flag: Samoa đŸ‡ŒđŸ‡ž -flag: Kosovo đŸ‡œđŸ‡° -flag: Yemen đŸ‡ŸđŸ‡Ș -flag: Mayotte đŸ‡ŸđŸ‡č -flag: South Africa 🇿🇩 -flag: Zambia 🇿đŸ‡Č -flag: Zimbabwe đŸ‡żđŸ‡Œ -flag: England đŸŽó §ó ąó „ó źó §ó ż -flag: Scotland 🏮󠁧󠁱󠁳󠁣󠁮󠁿 -flag: Wales đŸŽó §ó ąó ·ó Źó łó ż diff --git a/user/.config/suckless/dmenu/scripts/dmenu_power b/user/.config/suckless/dmenu/scripts/dmenu_power deleted file mode 100755 index 0568ca612..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_power +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple power menu dmenu script -# - Dependencies: dmenu, power-profiles-daemon - -## OPTIONS ## -option1="logout" -option2="reboot" -option3="power off" -option4="suspend" -option5="lock" -option6="change power profile" -option7="cancel" - -## OPTIONS ARRAY ## -options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6\n$option7" - -## POWER PROFILE OPTIONS ## -pwr1="performance" -pwr2="balanced" -pwr3="powersaver" -pwr4="cancel" - -## POWER PROFILES ARRAY ## -pwrs="$pwr1\n$pwr2\n$pwr3\n$pwr4" - -## MAIN ACTION COMMAND ## -action=$(echo -e "$options" | dmenu -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "power options:") -case "$action" in - $option1*) - pkill X;; - $option2*) - systemctl reboot;; - $option3*) - systemctl poweroff;; - $option4*) - slock systemctl suspend;; - $option5*) - slock;; - $option6*) - currentpwr=$(powerprofilesctl get) - pwraction=$(echo -e "$pwrs" | dmenu -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "current profile is: ${currentpwr} | select profile:") - case "$pwraction" in - $pwr1*) - powerprofilesctl set performance && notify-send "power profile switched to performance";; - $pwr2*) - powerprofilesctl set balanced && notify-send "power profile switched to balanced";; - $pwr3*) - powerprofilesctl set power-saver && notify-send "power profile switched to power saver";; - $pwr4*) - exit 0 - esac;; - $option7*) - exit 0 -esac diff --git a/user/.config/suckless/dmenu/scripts/dmenu_scrot b/user/.config/suckless/dmenu/scripts/dmenu_scrot deleted file mode 100755 index dd2c837e9..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_scrot +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple screenshot dmenu script -# - Dependencies: scrot, dmenu, notify-send - -## CREATING SCREENSHOT FOLDER ## -mkdir -p "$HOME/Pictures/Screenshots" -cd "$HOME/Pictures/Screenshots" || exit 0 - -## CHOICES ## -cho1="entire screen" -cho2="entire screen with delay" -cho3="focused window" -cho4="select area" -chos="$cho1\n$cho2\n$cho3\n$cho4" - -## DELAY OPTIONS ## -del1="3 sec delay" -del2="5 sec delay" -del3="10 sec delay" -dels="$del1\n$del2\n$del3" - -## DELAY FUNCTION ## -delays() { - del=$(echo -e "$dels" | dmenu -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "Select: "); - case $del in - $del1) - scrot -d 3 && notify-send "screenshot saved";; - $del2) - scrot -d 5 && notify-send "screenshot saved";; - $del3) - scrot -d 10 && notify-send "screenshot saved" - esac -} - -## ENTIRE SCREEN FUNCTION ## -screen() { - scrot && notify-send "screenshot saved" -} - -## FOCUSED WINDOW FUNCTION -window() { - scrot -u -b && notify-send "screenshot saved." -} - -## SELECTED AREA FUNCTION ## -area() { - scrot -s && notify-send "screenshot saved." -} - -## MAIN ACTION ## -choice=$(echo -e "$chos" | dmenu -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "Select: ") -case $choice in - $cho1*) - screen;; - $cho2*) - delays;; - $cho3*) - window;; - $cho4*) - area -esac diff --git a/user/.config/suckless/dmenu/scripts/dmenu_wall b/user/.config/suckless/dmenu/scripts/dmenu_wall deleted file mode 100755 index b9d76de31..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_wall +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple wallpaper changer script -# - Dependencies: dmenu, fd, feh - -## MAIN VARIABLES AND COMMANDS ## -walldir="Pictures/Wallpapers/" # wallpapers folder, change it to yours, make sure that it ends with a / -cd "$walldir" || exit - -## SELECT PICTURE FUNCTION ## -selectpic() { - wallpaper=$(fd -p "$walldir" | dmenu -i -l 10 -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "select a wallpaper:") - if [ "$wallpaper" ]; then - chosenwall=$wallpaper - else - exit 0 - fi -} -selectpic - -## WALLPAPER SETTING OPTIONS ## -option1="fill" -option2="center" -option3="tile" -option4="max" -option5="scale" -options="$option1\n$option2\n$option3\n$option4\n$option5" - -## MAIN ACTION ## -action=$(echo -e "$options" | dmenu -i -l 5 -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "chose the format:") -case "$action" in - $option1*) - feh --bg-fill "$chosenwall";; - $option2*) - feh --bg-center "$chosenwall";; - $option3*) - feh --bg-tile "$chosenwall";; - $option4*) - feh --bg-max "$chosenwall";; - $option5*) - feh --bg-scale "$chosenwall";; -esac -exit 0 diff --git a/user/.config/suckless/dmenu/scripts/dmenu_wifi b/user/.config/suckless/dmenu/scripts/dmenu_wifi deleted file mode 100755 index 86d6db8d1..000000000 --- a/user/.config/suckless/dmenu/scripts/dmenu_wifi +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bash - -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple wifi dmenu script -# - Dependencies: dmenu, NetworkManager - -## MAIN OPTIONS ## -option1="turn on wifi" -option2="turn off wifi" -option3="disconnect wifi" -option4="connect wifi" -option5="setup captive portal" -option6="exit" -options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" - -wlan=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f1 | head -1) -## TURN OFF WIFI FUNCTION ## -turnoff() { - nmcli radio wifi off - notify-send "WiFi has been turned off" -} - -## TURN ON WIFI FUNCTION ## -turnon() { - nmcli radio wifi on - notify-send "WiFi has been turned on" -} - -## DISCONNECT WIFI FUNCTION ## -disconnect() { - nmcli device disconnect "$wlan" - sleep 1 - constate=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f3 | head -1) - if [ "$constate" = "disconnected" ]; then - notify-send "WiFi has been disconnected" - fi -} - -## CONNECT FUNCTION ## -connect() { - notify-send "Scannig networks, please wait" - sleep 1 - bssid=$(nmcli device wifi list | sed -n '1!p' | cut -b 9- | dmenu -i -l 10 -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "select wifi:" | cut -d' ' -f1) - } - -## SELECT PASSWORD FUNCTION ## -password() { - pass=$(echo " " | dmenu -P -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "enter password:") - } - -## MAIN CONNECTION COMMAND ## -action() { - nmcli device wifi connect "$bssid" password "$pass" || nmcli device wifi connect "$bssid" - } - -## CHECKING IF WIFI IS WORKING -check() { - notify-send "Checking if connection was successful" - sleep 1 - currentwfi=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f4 | head -1) - if ping -q -c 2 -W 2 google.com >/dev/null; then - notify-send "You are now connected to $currentwfi and internet is working properly" - else - notify-send "Your internet is not working :(" - fi -} - -## MAIN ACTION COMMANDS ## -cases=$(echo -e "$options" | dmenu -i -fn "mononoki Nerd Font-10" -nb \#1d2021 -nf \#fbf1c7 -sb \#cc241d -sf \#fbf1c7 -p "wifi options:" ) -case "$cases" in - $option1*) - turnon;; - $option2*) - turnoff;; - $option3*) - disconnect;; - $option4*) - connect; - password; - action; - check;; - $option5*) - io.elementary.capnet-assist;; - $option6*) - exit 0 -esac diff --git a/user/.config/suckless/dmenu/stest.1 b/user/.config/suckless/dmenu/stest.1 deleted file mode 100644 index 2667d8aa7..000000000 --- a/user/.config/suckless/dmenu/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/user/.config/suckless/dmenu/stest.c b/user/.config/suckless/dmenu/stest.c deleted file mode 100644 index e27d3a5e5..000000000 --- a/user/.config/suckless/dmenu/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/user/.config/suckless/dmenu/util.c b/user/.config/suckless/dmenu/util.c deleted file mode 100644 index 96b82c980..000000000 --- a/user/.config/suckless/dmenu/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/user/.config/suckless/dmenu/util.h b/user/.config/suckless/dmenu/util.h deleted file mode 100644 index f633b5173..000000000 --- a/user/.config/suckless/dmenu/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/user/.config/suckless/dwm/Makefile b/user/.config/suckless/dwm/Makefile deleted file mode 100644 index 77bcbc02c..000000000 --- a/user/.config/suckless/dwm/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# dwm - dynamic window manager -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dwm.c util.c -OBJ = ${SRC:.c=.o} - -all: options dwm - -options: - @echo dwm build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - ${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk - -config.h: - cp config.def.h $@ - -dwm: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz - -dist: clean - mkdir -p dwm-${VERSION} - cp -R LICENSE Makefile README config.def.h config.mk\ - dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} - tar -cf dwm-${VERSION}.tar dwm-${VERSION} - gzip dwm-${VERSION}.tar - rm -rf dwm-${VERSION} - -install: all - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f dwm ${DESTDIR}${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/dwm - mkdir -p ${DESTDIR}${MANPREFIX}/man1 - sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 - chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/dwm\ - ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -.PHONY: all options clean dist install uninstall diff --git a/user/.config/suckless/dwm/autostart b/user/.config/suckless/dwm/autostart deleted file mode 100755 index 42e519ffe..000000000 --- a/user/.config/suckless/dwm/autostart +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -## ____ __ ## -## / __ \_________ _/ /_____ ## -## / / / / ___/ __ `/ //_/ _ \ ## -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) ## -## /_____/_/ \__,_/_/|_|\___/ My custom dwm build ## - -lxpolkit & -dwmblocks & -sh "$HOME"/.fehbg & -unclutter --hide-on-touch & -picom --no-fading-openclose --config "$HOME/.config/picom/picom.conf" & diff --git a/user/.config/suckless/dwm/config.def.h b/user/.config/suckless/dwm/config.def.h deleted file mode 100644 index 5346272b3..000000000 --- a/user/.config/suckless/dwm/config.def.h +++ /dev/null @@ -1,297 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const int horizpadbar = 2; /* horizontal padding for statusbar */ -static const int vertpadbar = 1; /* vertical padding for statusbar */ -static const char *fonts[] = {"mononoki Nerd Font Mono:size=10"}; -static const char dmenufont[] = "mononoki Nerd Font Mono:size=10"; -static const char col_gray1[] = "#1d2021"; -static const char col_gray2[] = "#32302f"; -static const char col_gray3[] = "#d5c4a1"; -static const char col_gray4[] = "#fbf1c7"; -static const char col_cyan[] = "#cc241d"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -// SCRATCHPADS -typedef struct { - const char *name; - const void *cmd; -} Sp; -const char *spcmd1[] = {"alacritty", "-t", "sptrm", "--class", "sptrm,sptrm", NULL }; -const char *spcmd2[] = {"alacritty", "-t", "sptop", "--class", "sptop,sptop", "-e", "btop", NULL }; -const char *spcmd3[] = {"alacritty", "-t", "spfli", "--class", "spfli,spfli", "-e", "flix-cli", NULL }; -const char *spcmd4[] = {"alacritty", "-t", "spani", "--class", "spani,spani", "-e", "ani-cli", NULL }; -const char *spcmd5[] = {"alacritty", "-t", "spytf", "--class", "spytf,spytf", "-e", "ytfzf", "-flst", NULL }; -const char *spcmd6[] = {"alacritty", "-t", "spamx", "--class", "spamx,spamx", "-e", "alsamixer", NULL }; -const char *spcmd7[] = {"alacritty", "-t", "sppmx", "--class", "sppmx,sppmx", "-e", "pulsemixer", NULL }; -const char *spcmd8[] = {"alacritty", "-t", "spmsc", "--class", "spmsc,spmsc", "-e", "cmus", NULL }; -const char *spcmd9[] = {"alacritty", "-t", "spflm", "--class", "spflm,spflm", "-e", "./.config/vifm/scripts/vifmrun", NULL }; -const char *spcmd10[] = {"alacritty", "-t", "sptot", "--class", "sptot,sptot", "-e", "tut", NULL }; -const char *spcmd11[] = {"alacritty", "-t", "spytm", "--class", "spytm,spytm", "-e", "ytfzf", "-mlst", NULL }; -const char *spcmd12[] = {"alacritty", "-t", "sprss", "--class", "sprss,sprss", "-e", "newsboat", "-u", "~/.config/newsboat/urls", NULL }; -static Sp scratchpads[] = { - /* name cmd */ - {"sptrm", spcmd1}, - {"sptop", spcmd2}, - {"spfli", spcmd3}, - {"spani", spcmd4}, - {"spytf", spcmd5}, - {"spamx", spcmd6}, - {"sppmx", spcmd7}, - {"spmsc", spcmd8}, - {"spflm", spcmd9}, - {"sptot", spcmd10}, - {"spytm", spcmd11}, - {"sprss", spcmd12}, -}; - -/* tagging */ -static const char *tags[] = { - "cde", // EDITOR - "tst", // FILE MANAGER - "web", // WEB BROWSER - "aud", // CHAT - "tls", // MUSIC - "vid", // VIDEO - "gfx", // IMAGE/EDIT TOOLS - "off", // OFFICE - "gme" // GAMES -}; - -// RULES -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - // class instance title tags mask isfloating monitor - // no workspace - { "Galculator", NULL, NULL, 0, 1, -1 }, - // code tag - { "Emacs", NULL, NULL, 1, 0, -1 }, - { "Godot", NULL, NULL, 1, 0, -1 }, - { "neovim", NULL, NULL, 1, 0, -1 }, - { "neovide", NULL, NULL, 1, 0, -1 }, - // test tag - { "Virt-manager", NULL, NULL, 1, 0, -1 }, - // web tag - { "LibreWolf", NULL, NULL, 1 << 2, 0, -1 }, - { "firefox", NULL, NULL, 1 << 2, 0, -1 }, - { "qutebrowser", NULL, NULL, 1 << 2, 0, -1 }, - { "Chromium", NULL, NULL, 1 << 2, 0, -1 }, - { "Brave-browser", NULL, NULL, 1 << 2, 0, -1 }, - { "Bitwarden", NULL, NULL, 1 << 2, 0, -1 }, - // audio tag - { "Audacity", NULL, NULL, 1 << 3, 0, -1 }, - { "Ardour", NULL, NULL, 1 << 3, 0, -1 }, - { "Carla2", NULL, NULL, 1 << 3, 0, -1 }, - { "Carla2-Control", NULL, NULL, 1 << 3, 0, -1 }, - // audio tools tag - { "QjackCtl", NULL, NULL, 1 << 4, 1, -1 }, - { "lsp-plugins", NULL, NULL, 1 << 4, 1, -1 }, - { "qpwgraph", NULL, NULL, 1 << 4, 0, -1 }, - { "Cadence", NULL, NULL, 1 << 4, 0, -1 }, - // video tag - { "kdenlive", NULL, NULL, 1 << 5, 0, -1 }, - { "Pitivi", NULL, NULL, 1 << 5, 0, -1 }, - { "Blender", NULL, NULL, 1 << 5, 0, -1 }, - { "Natron", NULL, NULL, 1 << 5, 0, -1 }, - { "SimpleScreenRecorder", NULL, NULL, 1 << 5, 0, -1 }, - { "Ghb", NULL, NULL, 1 << 5, 0, -1 }, - { "obs", NULL, NULL, 1 << 5, 0, -1 }, - // graphics/extra tools tag - { "Gimp-2.10", NULL, NULL, 1 << 6, 0, -1 }, - { "krita", NULL, NULL, 1 << 6, 0, -1 }, - { "Inkscape", NULL, NULL, 1 << 6, 0, -1 }, - { "Xournalpp", NULL, NULL, 1 << 6, 0, -1 }, - // office tag - { "DesktopEditors", NULL, NULL, 1 << 7, 0, -1 }, - { "Soffice", "soffice", NULL, 1 << 7, 0, -1 }, - { "libreoffice-startcenter", NULL, NULL, 1 << 7, 0, -1 }, - { "Joplin", NULL, NULL, 1 << 7, 0, -1 }, - // games tag - { "retroarch", NULL, NULL, 1 << 8, 0, -1 }, - { "steam", NULL, NULL, 1 << 8, 0, -1 }, - // scratchpads - { NULL, "sptrm", NULL, SPTAG(0), 1, -1 }, - { NULL, "sptop", NULL, SPTAG(1), 1, -1 }, - { NULL, "spfli", NULL, SPTAG(2), 1, -1 }, - { NULL, "spani", NULL, SPTAG(3), 1, -1 }, - { NULL, "spytf", NULL, SPTAG(4), 1, -1 }, - { NULL, "spamx", NULL, SPTAG(5), 1, -1 }, - { NULL, "sppmx", NULL, SPTAG(6), 1, -1 }, - { NULL, "spmsc", NULL, SPTAG(7), 1, -1 }, - { NULL, "spflm", NULL, SPTAG(8), 1, -1 }, - { NULL, "sptot", NULL, SPTAG(9), 1, -1 }, - { NULL, "spytm", NULL, SPTAG(10), 1, -1 }, - { NULL, "sprss", NULL, SPTAG(11), 1, -1 }, -}; - -// layout(s) -static const float mfact = 0.5; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - -#include "tcl.c" -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, - { "|||", tcl }, -}; - -//key definitions -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -// helper for spawning shell commands in the pre dwm-5.0 fashion -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -// dmenu -static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -// terminal -static const char *termcmd[] = { "alacritty", NULL }; - -#include "movestack.c" - -static const Key keys[] = { - /* modifier key function argument */ - // text editor - { MODKEY, XK_e, spawn, SHCMD("emacsclient -c -a 'emacs'")}, - // web browser - { MODKEY, XK_w, spawn, SHCMD("librewolf")}, - // set keyboard layout to es - { MODKEY|ControlMask, XK_e, spawn, SHCMD("setxkbmap -layout es")}, - // set keyboard layout to us - { MODKEY|ControlMask, XK_u, spawn, SHCMD("setxkbmap -layout us")}, - // increase volume - { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("pamixer -i 5")}, - // decrease volume - { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("pamixer -d 5")}, - // mute volume - { 0, XF86XK_AudioMute, spawn, SHCMD("pamixer -t")}, - // mute microphone - { 0, XF86XK_AudioMicMute, spawn, SHCMD("pamixer --default-source -t")}, - // increase brightness - { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("xbacklight -inc 10")}, - // decrease brightness - { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("xbacklight -dec 10")}, - // decrease brightness - { 0, XF86XK_Display, spawn, SHCMD("arandr")}, - // launcher - { MODKEY|ControlMask, XK_p, spawn, {.v = dmenucmd } }, - // desktop launcher - { MODKEY, XK_p, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_drun") }, - // wifi config - { MODKEY|Mod1Mask, XK_i, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_wifi") }, - // screenshots - { MODKEY|Mod1Mask, XK_s, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_scrot") }, - // screenshots - { MODKEY|Mod1Mask, XK_w, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_wall") }, - // edit - { MODKEY|Mod1Mask, XK_e, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_edit") }, - // terminal - { MODKEY, XK_Return, spawn, {.v = termcmd } }, - // toogle the bar - { MODKEY, XK_b, togglebar, {0} }, - // window focusing - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - // increase and decrease master clients count - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - // increase and decrease master client size - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - // move windows on stack - { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, - // switch master window - { MODKEY|ControlMask, XK_Return, zoom, {0} }, - // switch to latest tag - { MODKEY, XK_Tab, view, {0} }, - // close focused client - { MODKEY, XK_q, killclient, {0} }, - // switch to tiling layout - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - // switch to floating layout - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - // switch to monocle layout - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - // switch to three-column layout - { MODKEY, XK_c, setlayout, {.v = &layouts[3]} }, - // switch to latest layout - { MODKEY, XK_space, setlayout, {0} }, - // toggle floating mode on focused window - { MODKEY|ControlMask, XK_space, togglefloating, {0} }, - // view all opened clients on current tag - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - // focus next or previous screen - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - // move focused client to next or previous screen - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - // scratchpads - { MODKEY|ShiftMask, XK_Return, togglescratch, {.ui = 0 } }, - { MODKEY|ShiftMask, XK_b, togglescratch, {.ui = 1 } }, - { MODKEY|ShiftMask, XK_f, togglescratch, {.ui = 2 } }, - { MODKEY|ShiftMask, XK_a, togglescratch, {.ui = 3 } }, - { MODKEY|ShiftMask, XK_y, togglescratch, {.ui = 4 } }, - { MODKEY|ShiftMask, XK_o, togglescratch, {.ui = 5 } }, - { MODKEY|ShiftMask, XK_p, togglescratch, {.ui = 6 } }, - { MODKEY|ShiftMask, XK_m, togglescratch, {.ui = 7 } }, - { MODKEY|ShiftMask, XK_v, togglescratch, {.ui = 8 } }, - { MODKEY|ShiftMask, XK_t, togglescratch, {.ui = 9 } }, - { MODKEY|ShiftMask, XK_n, togglescratch, {.ui = 10 } }, - { MODKEY|ShiftMask, XK_r, togglescratch, {.ui = 11 } }, - // tag bindings - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - // logout - //{ MODKEY|ShiftMask, XK_q, quit, {0} }, - { MODKEY|ShiftMask, XK_q, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_power")}, - // restart dwm - { MODKEY|ControlMask, XK_r, quit, {1} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -// mouse bindings -static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/user/.config/suckless/dwm/config.mk b/user/.config/suckless/dwm/config.mk deleted file mode 100644 index ef8acf76b..000000000 --- a/user/.config/suckless/dwm/config.mk +++ /dev/null @@ -1,39 +0,0 @@ -# dwm version -VERSION = 6.4 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = ${X11INC}/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/user/.config/suckless/dwm/dependencies.txt b/user/.config/suckless/dwm/dependencies.txt deleted file mode 100644 index 23a3f5248..000000000 --- a/user/.config/suckless/dwm/dependencies.txt +++ /dev/null @@ -1,24 +0,0 @@ -# core dependencies -xorg-server -libx11 -libxft -libxinerama - -# extra dependencies -xbacklight # brightness control -pamixer # volume control -arandr # display config -alacritty # terminal -dmenu # run launcher -dwmblocks # status bar scripts -slock # lockscreen -herbe # notifications -neovim & neovide # text editor - -# scratchpads -ani-cli # watch anime -flix-cli # watch movies -ytfzf # watch/listen to youtube -vifm # file manager -gomuks # matrix client -toot # tui mastodon client diff --git a/user/.config/suckless/dwm/drw.c b/user/.config/suckless/dwm/drw.c deleted file mode 100644 index 16e386292..000000000 --- a/user/.config/suckless/dwm/drw.c +++ /dev/null @@ -1,451 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); - dest->pixel |= 0xff << 24; -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int i, ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - enum { nomatches_len = 64 }; - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; - static unsigned int ellipsis_width = 0; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - for (i = 0; i < nomatches_len; ++i) { - /* avoid calling XftFontMatch if we know we won't find a match */ - if (utf8codepoint == nomatches.codepoint[i]) - goto no_match; - } - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/user/.config/suckless/dwm/drw.h b/user/.config/suckless/dwm/drw.h deleted file mode 100644 index 64714316b..000000000 --- a/user/.config/suckless/dwm/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/user/.config/suckless/dwm/dwm.1 b/user/.config/suckless/dwm/dwm.1 deleted file mode 100644 index 0f3a6bab4..000000000 --- a/user/.config/suckless/dwm/dwm.1 +++ /dev/null @@ -1,209 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. It manages windows in tiled, monocle -and floating layouts. Either layout can be applied dynamically, optimising the -environment for the application in use and the task performed. -.P -In tiled layouts windows are managed in a master and stacking area. The master -area on the left contains one window by default, and the stacking area on the -right contains all other windows. The number of master area windows can be -adjusted from zero to an arbitrary number. In monocle layout all windows are -maximised to the screen size. In floating layout windows can be resized and -moved freely. Dialog windows are always managed floating, regardless of the -layout applied. -.P -Windows are grouped by tags. Each window can be tagged with one or multiple -tags. Selecting certain tags displays all windows with these tags. -.P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. -.P -dwm draws a small border around windows to indicate the focus state. -.P -On start, dwm can start additional programs that may be specified in two special -shell scripts (see the FILES section below), autostart_blocking.sh and -autostart.sh. The former is executed first and dwm will wait for its -termination before starting. The latter is executed in the background before -dwm enters its handler loop. -.P -Either of these files may be omitted. -.SH OPTIONS -.TP -.B \-v -prints version information to stderr, then exits. -.SH USAGE -.SS Status bar -.TP -.B X root window name -is read and displayed in the status text area. It can be set with the -.BR xsetroot (1) -command. -.TP -.B Button1 -click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. -.TP -.B Button3 -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Mod1\-Button1 -click on a tag label applies that tag to the focused window. -.TP -.B Mod1\-Button3 -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Mod1\-Shift\-Return -Start -.BR st(1). -.TP -.B Mod1\-p -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Mod1\-, -Focus previous screen, if any. -.TP -.B Mod1\-. -Focus next screen, if any. -.TP -.B Mod1\-Shift\-, -Send focused window to previous screen, if any. -.TP -.B Mod1\-Shift\-. -Send focused window to next screen, if any. -.TP -.B Mod1\-b -Toggles bar on and off. -.TP -.B Mod1\-t -Sets tiled layout. -.TP -.B Mod1\-f -Sets floating layout. -.TP -.B Mod1\-m -Sets monocle layout. -.TP -.B Mod1\-space -Toggles between current and previous layout. -.TP -.B Mod1\-j -Focus next window. -.TP -.B Mod1\-k -Focus previous window. -.TP -.B Mod1\-i -Increase number of windows in master area. -.TP -.B Mod1\-d -Decrease number of windows in master area. -.TP -.B Mod1\-l -Increase master area size. -.TP -.B Mod1\-h -Decrease master area size. -.TP -.B Mod1\-Return -Zooms/cycles focused window to/from master area (tiled layouts only). -.TP -.B Mod1\-Shift\-c -Close focused window. -.TP -.B Mod1\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Mod1\-Tab -Toggles to the previously selected tags. -.TP -.B Mod1\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Mod1\-Shift\-0 -Apply all tags to focused window. -.TP -.B Mod1\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Mod1\-[1..n] -View all windows with nth tag. -.TP -.B Mod1\-0 -View all windows with any tag. -.TP -.B Mod1\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Mod1\-Shift\-q -Quit dwm. -.TP -.B Mod1\-Control\-Shift\-q -Restart dwm. -.SS Mouse commands -.TP -.B Mod1\-Button1 -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Mod1\-Button2 -Toggles focused window between floating and tiled state. -.TP -.B Mod1\-Button3 -Resize focused window while dragging. Tiled windows will be toggled to the floating state. -.SH FILES -The files containing programs to be started along with dwm are searched for in -the following directories: -.IP "1. $XDG_DATA_HOME/dwm" -.IP "2. $HOME/.local/share/dwm" -.IP "3. $HOME/.dwm" -.P -The first existing directory is scanned for any of the autostart files below. -.TP 15 -autostart.sh -This file is started as a shell background process before dwm enters its handler -loop. -.TP 15 -autostart_blocking.sh -This file is started before any autostart.sh; dwm waits for its termination. -.SH CUSTOMIZATION -dwm is customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH SIGNALS -.TP -.B SIGHUP - 1 -Restart the dwm process. -.TP -.B SIGTERM - 15 -Cleanly terminate the dwm process. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.SH ISSUES -Java applications which use the XToolkit/XAWT backend may draw grey windows -only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early -JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds -are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the -environment variable -.BR AWT_TOOLKIT=MToolkit -(to use the older Motif backend instead) or running -.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D -or -.B wmname LG3D -(to pretend that a non-reparenting window manager is running that the -XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable -.BR _JAVA_AWT_WM_NONREPARENTING=1 . -.SH BUGS -Send all bug reports with a patch to hackers@suckless.org. diff --git a/user/.config/suckless/dwm/dwm.c b/user/.config/suckless/dwm/dwm.c deleted file mode 100644 index 813311ecf..000000000 --- a/user/.config/suckless/dwm/dwm.c +++ /dev/null @@ -1,2330 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) -#define TAGMASK ((1 << NUMTAGS) - 1) -#define SPTAG(i) ((1 << LENGTH(tags)) << (i)) -#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags)) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -typedef struct Pertag Pertag; -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; - Pertag *pertag; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachbottom(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *c); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void runAutostart(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void sigchld(int unused); -static void sighup(int unused); -static void sigterm(int unused); -static void spawn(const Arg *arg); -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 togglescratch(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static void warp(const Client *c); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int restart = 0; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -struct Pertag { - unsigned int curtag, prevtag; /* current and previous tag */ - int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ - float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ - unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ - const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ - int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -}; - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - if ((r->tags & SPTAGMASK) && r->isfloating) { - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : (c->mon->tagset[c->mon->seltags] & ~SPTAGMASK); -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - if (!c->hintsvalid) - updatesizehints(c); - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachbottom(Client *c) -{ - Client **tc; - c->next = NULL; - for (tc = &c->mon->clients; *tc; tc = &(*tc)->next); - *tc = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - m->pertag = ecalloc(1, sizeof(Pertag)); - m->pertag->curtag = m->pertag->prevtag = 1; - - for (i = 0; i <= LENGTH(tags); 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; - - m->pertag->showbars[i] = m->showbar; - } - - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - if (!m->showbar) - return; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext); - drw_text(drw, m->ww - tw, 0, tw, bh, lrpad / 2, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); - warp(selmon->sel); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) { - strncpy(text, (char *)name.value, size - 1); - } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - KeyCode code; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < LENGTH(keys); i++) - if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, - True, GrabModeAsync, GrabModeAsync); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attachbottom(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - c->hintsvalid = 0; - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - if(arg->i) restart = 1; - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2]) - warp(m->sel); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -runAutostart(void) { - system("$HOME/.config/suckless/dwm/autostart"); -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attachbottom(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - if (arg && 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, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - - /* clean up any zombies immediately */ - sigchld(0); - - signal(SIGHUP, sighup); - signal(SIGTERM, sigterm); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h + horizpadbar; - bh = drw->fonts->h + vertpadbar; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - if ((c->tags & SPTAGMASK) && c->isfloating) { - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("can't install SIGCHLD handler:"); - while (0 < waitpid(-1, NULL, WNOHANG)); -} - -void -sighup(int unused) -{ - Arg a = {.i = 1}; - quit(&a); -} - -void -sigterm(int unused) -{ - Arg a = {.i = 0}; - quit(&a); -} - -void -spawn(const Arg *arg) -{ - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -togglescratch(const Arg *arg) -{ - Client *c; - unsigned int found = 0; - unsigned int scratchtag = SPTAG(arg->ui); - Arg sparg = {.v = scratchpads[arg->ui].cmd}; - - for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); - if (found) { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } - if (ISVISIBLE(c)) { - focus(c); - restack(selmon); - } - } else { - selmon->tagset[selmon->seltags] |= scratchtag; - spawn(&sparg); - } -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - int i; - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - - if (newtagset == ~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]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attachbottom(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - int i; - unsigned int tmptag; - - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - selmon->pertag->prevtag = selmon->pertag->curtag; - - if (arg->ui == ~0) - 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]; - - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - - focus(NULL); - arrange(selmon); -} - -void -warp(const Client *c) -{ - int x, y; - - if (!c) { - XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2); - return; - } - - if (!getrootptr(&x, &y) || - (x > c->x - c->bw && - y > c->y - c->bw && - x < c->x + c->w + c->bw*2 && - y < c->y + c->h + c->bw*2) || - (y > c->mon->by && y < c->mon->by + bh) || - (c->mon->topbar && !y)) - return; - - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - runAutostart(); - run(); - if(restart) execvp(argv[0], argv); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/user/.config/suckless/dwm/dwm.png b/user/.config/suckless/dwm/dwm.png deleted file mode 100644 index b1f9ba7e5f4cc7350ee2392ebcea5fcbe00fb49b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^2Y@($g9*gC@m3f}u_bxCyDx`7I;J! zGca%iWx0hJ8D`Cq01C2~c>21sUt<^MF=V?Ztt9{yk}YwKC~?lu%}vcKVQ?-=O)N=G zQ7F$W$xsN%NL6t6^bL5QqM8R(c+=CxF{I+w+q;fj4F)_6j>`Z3pZ>_($QEQ&92OXP z%lpEKGwG8$G-U1H{@Y%;mx-mNK|p|siBVAj$Z~Mt-~h6K0!}~{PyozQ07(f5fTdVi zm=-zT`NweeJ#%S&{fequZGmkDDC*%x$$Sa*fAP=$`nJkhx1Y~k<8b2;Hq)FOdV=P$ q&oWzoxz_&nv&n0)xBzV8k*jsxheTIy&cCY600f?{elF{r5}E*x)opSB diff --git a/user/.config/suckless/dwm/movestack.c b/user/.config/suckless/dwm/movestack.c deleted file mode 100644 index 520f4ae39..000000000 --- a/user/.config/suckless/dwm/movestack.c +++ /dev/null @@ -1,48 +0,0 @@ -void -movestack(const Arg *arg) { - Client *c = NULL, *p = NULL, *pc = NULL, *i; - - if(arg->i > 0) { - /* find the client after selmon->sel */ - for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); - if(!c) - for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); - - } - else { - /* find the client before selmon->sel */ - for(i = selmon->clients; i != selmon->sel; i = i->next) - if(ISVISIBLE(i) && !i->isfloating) - c = i; - if(!c) - for(; i; i = i->next) - if(ISVISIBLE(i) && !i->isfloating) - c = i; - } - /* find the client before selmon->sel and c */ - for(i = selmon->clients; i && (!p || !pc); i = i->next) { - if(i->next == selmon->sel) - p = i; - if(i->next == c) - pc = i; - } - - /* swap c and selmon->sel selmon->clients in the selmon->clients list */ - if(c && c != selmon->sel) { - Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next; - selmon->sel->next = c->next==selmon->sel?c:c->next; - c->next = temp; - - if(p && p != c) - p->next = c; - if(pc && pc != selmon->sel) - pc->next = selmon->sel; - - if(selmon->sel == selmon->clients) - selmon->clients = c; - else if(c == selmon->clients) - selmon->clients = selmon->sel; - - arrange(selmon); - } -} \ No newline at end of file diff --git a/user/.config/suckless/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff b/user/.config/suckless/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff deleted file mode 100644 index 03ea9ef2a..000000000 --- a/user/.config/suckless/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff +++ /dev/null @@ -1,12 +0,0 @@ -diff -up dwm/dwm.c dwmmod/dwm.c ---- dwm/dwm.c 2020-06-25 00:21:30.383692180 -0300 -+++ dwmmod/dwm.c 2020-06-25 00:20:35.643692330 -0300 -@@ -1057,6 +1057,8 @@ manage(Window w, XWindowAttributes *wa) - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); -+ c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; -+ c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) diff --git a/user/.config/suckless/dwm/patches/dwm-attachbottom-6.3.diff b/user/.config/suckless/dwm/patches/dwm-attachbottom-6.3.diff deleted file mode 100644 index c3955f9b1..000000000 --- a/user/.config/suckless/dwm/patches/dwm-attachbottom-6.3.diff +++ /dev/null @@ -1,54 +0,0 @@ -diff -up dwm-6.3/dwm.c dwm-6.3-attachbottom/dwm.c ---- dwm-6.3/dwm.c 2022-01-07 12:42:18.000000000 +0100 -+++ dwm-6.3-attachbottom/dwm.c 2022-08-17 22:14:41.813809073 +0200 -@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int - static void arrange(Monitor *m); - static void arrangemon(Monitor *m); - static void attach(Client *c); -+static void attachbottom(Client *c); - static void attachstack(Client *c); - static void buttonpress(XEvent *e); - static void checkotherwm(void); -@@ -408,6 +409,15 @@ attach(Client *c) - } - - void -+attachbottom(Client *c) -+{ -+ Client **tc; -+ c->next = NULL; -+ for (tc = &c->mon->clients; *tc; tc = &(*tc)->next); -+ *tc = c; -+} -+ -+void - attachstack(Client *c) - { - c->snext = c->mon->stack; -@@ -1066,7 +1076,7 @@ manage(Window w, XWindowAttributes *wa) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); -- attach(c); -+ attachbottom(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -@@ -1421,7 +1431,7 @@ sendmon(Client *c, Monitor *m) - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ -- attach(c); -+ attachbottom(c); - attachstack(c); - focus(NULL); - arrange(NULL); -@@ -1903,7 +1913,7 @@ updategeom(void) - m->clients = c->next; - detachstack(c); - c->mon = mons; -- attach(c); -+ attachbottom(c); - attachstack(c); - } - if (m == selmon) diff --git a/user/.config/suckless/dwm/patches/dwm-autostart-20161205-bb3bd6f.diff b/user/.config/suckless/dwm/patches/dwm-autostart-20161205-bb3bd6f.diff deleted file mode 100644 index 6f11eaf28..000000000 --- a/user/.config/suckless/dwm/patches/dwm-autostart-20161205-bb3bd6f.diff +++ /dev/null @@ -1,39 +0,0 @@ -commit 5918623c5bd7fda155bf9dc3d33890c4ae1722d0 -Author: Simon Bremer -Date: Thu Dec 22 17:31:07 2016 +0100 - - Applied and fixed autostart patch for previous version; - -diff --git a/dwm.c b/dwm.c -index d27cb67..066ed71 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -194,6 +194,7 @@ static void resizeclient(Client *c, int x, int y, int w, int h); - static void resizemouse(const Arg *arg); - static void restack(Monitor *m); - static void run(void); -+static void runAutostart(void); - static void scan(void); - static int sendevent(Client *c, Atom proto); - static void sendmon(Client *c, Monitor *m); -@@ -1386,6 +1387,12 @@ run(void) - } - - void -+runAutostart(void) { -+ system("cd ~/.dwm; ./autostart_blocking.sh"); -+ system("cd ~/.dwm; ./autostart.sh &"); -+} -+ -+void - scan(void) - { - unsigned int i, num; -@@ -2145,6 +2152,7 @@ main(int argc, char *argv[]) - checkotherwm(); - setup(); - scan(); -+ runAutostart(); - run(); - cleanup(); - XCloseDisplay(dpy); diff --git a/user/.config/suckless/dwm/patches/dwm-movestack-20211115-a786211.diff b/user/.config/suckless/dwm/patches/dwm-movestack-20211115-a786211.diff deleted file mode 100644 index 134abb88b..000000000 --- a/user/.config/suckless/dwm/patches/dwm-movestack-20211115-a786211.diff +++ /dev/null @@ -1,95 +0,0 @@ -From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001 -From: BrunoCooper17 -Date: Mon, 15 Nov 2021 14:04:53 -0600 -Subject: [PATCH] MoveStack patch - -This plugin allows you to move clients around in the stack and swap them -with the master. It emulates the behavior off mod+shift+j and mod+shift+k -in Xmonad. movestack(+1) will swap the client with the current focus with -the next client. movestack(-1) will swap the client with the current focus -with the previous client. ---- - config.def.h | 3 +++ - movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 51 insertions(+) - create mode 100644 movestack.c - -diff --git a/config.def.h b/config.def.h -index a2ac963..33efa5b 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; - static const char *termcmd[] = { "st", NULL }; - -+#include "movestack.c" - static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, -@@ -71,6 +72,8 @@ static Key keys[] = { - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, -+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, -diff --git a/movestack.c b/movestack.c -new file mode 100644 -index 0000000..520f4ae ---- /dev/null -+++ b/movestack.c -@@ -0,0 +1,48 @@ -+void -+movestack(const Arg *arg) { -+ Client *c = NULL, *p = NULL, *pc = NULL, *i; -+ -+ if(arg->i > 0) { -+ /* find the client after selmon->sel */ -+ for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); -+ if(!c) -+ for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); -+ -+ } -+ else { -+ /* find the client before selmon->sel */ -+ for(i = selmon->clients; i != selmon->sel; i = i->next) -+ if(ISVISIBLE(i) && !i->isfloating) -+ c = i; -+ if(!c) -+ for(; i; i = i->next) -+ if(ISVISIBLE(i) && !i->isfloating) -+ c = i; -+ } -+ /* find the client before selmon->sel and c */ -+ for(i = selmon->clients; i && (!p || !pc); i = i->next) { -+ if(i->next == selmon->sel) -+ p = i; -+ if(i->next == c) -+ pc = i; -+ } -+ -+ /* swap c and selmon->sel selmon->clients in the selmon->clients list */ -+ if(c && c != selmon->sel) { -+ Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next; -+ selmon->sel->next = c->next==selmon->sel?c:c->next; -+ c->next = temp; -+ -+ if(p && p != c) -+ p->next = c; -+ if(pc && pc != selmon->sel) -+ pc->next = selmon->sel; -+ -+ if(selmon->sel == selmon->clients) -+ selmon->clients = c; -+ else if(c == selmon->clients) -+ selmon->clients = selmon->sel; -+ -+ arrange(selmon); -+ } -+} -\ No newline at end of file --- -2.33.1 - diff --git a/user/.config/suckless/dwm/patches/dwm-pertag-20200914-61bb8b2.diff b/user/.config/suckless/dwm/patches/dwm-pertag-20200914-61bb8b2.diff deleted file mode 100644 index c8d7fbcb3..000000000 --- a/user/.config/suckless/dwm/patches/dwm-pertag-20200914-61bb8b2.diff +++ /dev/null @@ -1,177 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index 664c527..ac8e4ec 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -111,6 +111,7 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+typedef struct Pertag Pertag; - struct Monitor { - char ltsymbol[16]; - float mfact; -@@ -130,6 +131,7 @@ struct Monitor { - Monitor *next; - Window barwin; - const Layout *lt[2]; -+ Pertag *pertag; - }; - - typedef struct { -@@ -272,6 +274,15 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ -+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ -+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ -+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ -+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -+}; -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -632,6 +643,7 @@ Monitor * - createmon(void) - { - Monitor *m; -+ unsigned int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; -@@ -642,6 +654,20 @@ createmon(void) - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -+ m->pertag = ecalloc(1, sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ -+ for (i = 0; i <= LENGTH(tags); 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; -+ -+ m->pertag->showbars[i] = m->showbar; -+ } -+ - return m; - } - -@@ -967,7 +993,7 @@ grabkeys(void) - void - incnmaster(const Arg *arg) - { -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -1502,9 +1528,9 @@ void - setlayout(const Arg *arg) - { - 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, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); -@@ -1523,7 +1549,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -1702,7 +1728,7 @@ tile(Monitor *m) - void - togglebar(const Arg *arg) - { -- selmon->showbar = !selmon->showbar; -+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -@@ -1741,9 +1767,33 @@ void - toggleview(const Arg *arg) - { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); -+ int i; - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; -+ -+ if (newtagset == ~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]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } -@@ -2038,11 +2088,37 @@ updatewmhints(Client *c) - void - view(const Arg *arg) - { -+ int i; -+ unsigned int tmptag; -+ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if (arg->ui & TAGMASK) { - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ -+ if (arg->ui == ~0) -+ 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]; -+ -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); -+ - focus(NULL); - arrange(selmon); - } diff --git a/user/.config/suckless/dwm/patches/dwm-restartsig-20180523-6.2.diff b/user/.config/suckless/dwm/patches/dwm-restartsig-20180523-6.2.diff deleted file mode 100644 index f1f86808e..000000000 --- a/user/.config/suckless/dwm/patches/dwm-restartsig-20180523-6.2.diff +++ /dev/null @@ -1,139 +0,0 @@ -From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001 -From: Christopher Drelich -Date: Wed, 23 May 2018 22:50:38 -0400 -Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM - handlers. - -Modified quit() to restart if it receives arg .i = 1 -MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that. - -Signal handlers were handled for SIGHUP and SIGTERM. -If dwm receives these signals it calls quit() with -arg .i = to 1 or 0, respectively. - -To restart dwm: -MOD+CTRL+SHIFT+Q -or -kill -HUP dwmpid - -To quit dwm cleanly: -MOD+SHIFT+Q -or -kill -TERM dwmpid ---- - config.def.h | 1 + - dwm.1 | 10 ++++++++++ - dwm.c | 22 ++++++++++++++++++++++ - 3 files changed, 33 insertions(+) - -diff --git a/config.def.h b/config.def.h -index a9ac303..e559429 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -94,6 +94,7 @@ static Key keys[] = { - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -+ { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, - }; - - /* button definitions */ -diff --git a/dwm.1 b/dwm.1 -index 13b3729..36a331c 100644 ---- a/dwm.1 -+++ b/dwm.1 -@@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view. - .TP - .B Mod1\-Shift\-q - Quit dwm. -+.TP -+.B Mod1\-Control\-Shift\-q -+Restart dwm. - .SS Mouse commands - .TP - .B Mod1\-Button1 -@@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float - .SH CUSTOMIZATION - dwm is customized by creating a custom config.h and (re)compiling the source - code. This keeps it fast, secure and simple. -+.SH SIGNALS -+.TP -+.B SIGHUP - 1 -+Restart the dwm process. -+.TP -+.B SIGTERM - 15 -+Cleanly terminate the dwm process. - .SH SEE ALSO - .BR dmenu (1), - .BR st (1) -diff --git a/dwm.c b/dwm.c -index bb95e26..286eecd 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -205,6 +205,8 @@ static void setup(void); - static void seturgent(Client *c, int urg); - static void showhide(Client *c); - static void sigchld(int unused); -+static void sighup(int unused); -+static void sigterm(int unused); - static void spawn(const Arg *arg); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); -@@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { - [UnmapNotify] = unmapnotify - }; - static Atom wmatom[WMLast], netatom[NetLast]; -+static int restart = 0; - static int running = 1; - static Cur *cursor[CurLast]; - static Clr **scheme; -@@ -1248,6 +1251,7 @@ propertynotify(XEvent *e) - void - quit(const Arg *arg) - { -+ if(arg->i) restart = 1; - running = 0; - } - -@@ -1536,6 +1540,9 @@ setup(void) - /* clean up any zombies immediately */ - sigchld(0); - -+ signal(SIGHUP, sighup); -+ signal(SIGTERM, sigterm); -+ - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); -@@ -1637,6 +1644,20 @@ sigchld(int unused) - } - - void -+sighup(int unused) -+{ -+ Arg a = {.i = 1}; -+ quit(&a); -+} -+ -+void -+sigterm(int unused) -+{ -+ Arg a = {.i = 0}; -+ quit(&a); -+} -+ -+void - spawn(const Arg *arg) - { - if (arg->v == dmenucmd) -@@ -2139,6 +2160,7 @@ main(int argc, char *argv[]) - setup(); - scan(); - run(); -+ if(restart) execvp(argv[0], argv); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; --- -2.7.4 - diff --git a/user/.config/suckless/dwm/patches/dwm-scratchpads-20200414-728d397b.diff b/user/.config/suckless/dwm/patches/dwm-scratchpads-20200414-728d397b.diff deleted file mode 100644 index d3e90c01a..000000000 --- a/user/.config/suckless/dwm/patches/dwm-scratchpads-20200414-728d397b.diff +++ /dev/null @@ -1,199 +0,0 @@ -From 728d397b21982af88737277fd9d6939a7b558786 Mon Sep 17 00:00:00 2001 -From: Christian Tenllado -Date: Tue, 14 Apr 2020 23:31:15 +0200 -Subject: [PATCH] Multiple scratchpads - -This patch enables multiple scratchpads, each with one asigned window. -This enables the same scratchpad workflow that you have in i3. - -Scratchpads are implemented as special tags, whose mask does not -apply to new spawned windows. To assign a window to a scratchpad you -have to set up a rule, as you do with regular tags. - -Windows tagged with scratchpad tags can be set floating or not in the -rules array. Most users would probably want them floating (i3 style), -but having them tiled does also perfectly work and might fit better the -DWM approach. In case they are set floating, the patch moves them to the -center of the screen whenever they are shown. The patch can easily be -modified to make this last feature configurable in the rules array (see -the center patch). - -The togglescratch function, borrowed from the previous scratchpad patch -and slightly modified, can be used to spawn a registered scratchpad -process or toggle its view. This function looks for a window tagged with -the selected scratchpad tag. If it is found its view is toggled. If it is -not found the corresponding registered command is spawned. The -config.def.h shows three examples of its use to spawn a terminal in the -first scratchpad tag, a second terminal running ranger on the second -scratchpad tag and the keepassxc application to manage passwords on a -third scratchpad tag. - -If you prefer to spawn your scratchpad applications from the startup -script, you might opt for binding keys to toggleview instead, as -scratchpads are just special tags (you may even extend the TAGKEYS macro -to generalize the key bindings). ---- - config.def.h | 28 ++++++++++++++++++++++++---- - dwm.c | 43 +++++++++++++++++++++++++++++++++++++++++-- - 2 files changed, 65 insertions(+), 6 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 1c0b587..06265e1 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -18,17 +18,33 @@ static const char *colors[][3] = { - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, - }; - -+typedef struct { -+ const char *name; -+ const void *cmd; -+} Sp; -+const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL }; -+const char *spcmd2[] = {"st", "-n", "spfm", "-g", "144x41", "-e", "ranger", NULL }; -+const char *spcmd3[] = {"keepassxc", NULL }; -+static Sp scratchpads[] = { -+ /* name cmd */ -+ {"spterm", spcmd1}, -+ {"spranger", spcmd2}, -+ {"keepassxc", spcmd3}, -+}; -+ - /* tagging */ - static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; -- - static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ -- { "Gimp", NULL, NULL, 0, 1, -1 }, -- { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -+ { "Gimp", NULL, NULL, 0, 1, -1 }, -+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -+ { NULL, "spterm", NULL, SPTAG(0), 1, -1 }, -+ { NULL, "spfm", NULL, SPTAG(1), 1, -1 }, -+ { NULL, "keepassxc", NULL, SPTAG(2), 0, -1 }, - }; - - /* layout(s) */ -@@ -59,6 +75,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; - static const char *termcmd[] = { "st", NULL }; - -+ - static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, -@@ -84,6 +101,9 @@ static Key keys[] = { - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY, XK_y, togglescratch, {.ui = 0 } }, -+ { MODKEY, XK_u, togglescratch, {.ui = 1 } }, -+ { MODKEY, XK_x, togglescratch, {.ui = 2 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -@@ -106,7 +126,7 @@ static Button buttons[] = { - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -- { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -+ { ClkClientWin, MODKEY, Button1, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, -diff --git a/dwm.c b/dwm.c -index 4465af1..646aa1a 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -54,7 +54,10 @@ - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) - #define WIDTH(X) ((X)->w + 2 * (X)->bw) - #define HEIGHT(X) ((X)->h + 2 * (X)->bw) --#define TAGMASK ((1 << LENGTH(tags)) - 1) -+#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) -+#define TAGMASK ((1 << NUMTAGS) - 1) -+#define SPTAG(i) ((1 << LENGTH(tags)) << (i)) -+#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags)) - #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - - /* enums */ -@@ -211,6 +214,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *); - static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); -+static void togglescratch(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unfocus(Client *c, int setfocus); -@@ -299,6 +303,11 @@ applyrules(Client *c) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; -+ if ((r->tags & SPTAGMASK) && r->isfloating) { -+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -+ } -+ - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; -@@ -308,7 +317,7 @@ applyrules(Client *c) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); -- c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -+ c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : (c->mon->tagset[c->mon->seltags] & ~SPTAGMASK); - } - - int -@@ -1616,6 +1625,10 @@ showhide(Client *c) - if (!c) - return; - if (ISVISIBLE(c)) { -+ if ((c->tags & SPTAGMASK) && c->isfloating) { -+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -+ } - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) -@@ -1719,6 +1732,32 @@ togglefloating(const Arg *arg) - arrange(selmon); - } - -+void -+togglescratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ unsigned int scratchtag = SPTAG(arg->ui); -+ Arg sparg = {.v = scratchpads[arg->ui].cmd}; -+ -+ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); -+ if (found) { -+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; -+ if (newtagset) { -+ selmon->tagset[selmon->seltags] = newtagset; -+ focus(NULL); -+ arrange(selmon); -+ } -+ if (ISVISIBLE(c)) { -+ focus(c); -+ restack(selmon); -+ } -+ } else { -+ selmon->tagset[selmon->seltags] |= scratchtag; -+ spawn(&sparg); -+ } -+} -+ - void - toggletag(const Arg *arg) - { --- -2.20.1 - diff --git a/user/.config/suckless/dwm/patches/dwm-statuspadding-6.3.diff b/user/.config/suckless/dwm/patches/dwm-statuspadding-6.3.diff deleted file mode 100644 index fa6780f6f..000000000 --- a/user/.config/suckless/dwm/patches/dwm-statuspadding-6.3.diff +++ /dev/null @@ -1,62 +0,0 @@ -From d6dd69c26f4272f87672ae54f69dc0d48650d34b Mon Sep 17 00:00:00 2001 -From: taep96 <64481039+taep96@users.noreply.github.com> -Date: Mon, 7 Feb 2022 19:09:45 +0100 -Subject: [PATCH] Fixed | Replaces magic numbers in statusbar with configurable - variables. - -horizpadbar for horizontal statusbar padding -vertpadbar for vertical statusbar padding - -StatusText now has both left and right padding, -as well as the vertical padding that all of the statusbar shares. - -Other than the addition of left padding to StatusText, appearance -of the statusbar is identical to pre-patch when using the defaults -in config.def.h ---- - config.def.h | 2 ++ - dwm.c | 8 ++++---- - 2 files changed, 6 insertions(+), 4 deletions(-) - -diff --git a/config.def.h b/config.def.h -index a2ac963..6cb845c 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -+static const int horizpadbar = 2; /* horizontal padding for statusbar */ -+static const int vertpadbar = 0; /* vertical padding for statusbar */ - static const char *fonts[] = { "monospace:size=10" }; - static const char dmenufont[] = "monospace:size=10"; - static const char col_gray1[] = "#222222"; -diff --git a/dwm.c b/dwm.c -index a96f33c..a1b8c95 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -708,8 +708,8 @@ drawbar(Monitor *m) - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); -- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ -- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); -+ tw = TEXTW(stext); -+ drw_text(drw, m->ww - tw, 0, tw, bh, lrpad / 2, stext, 0); - } - - for (c = m->clients; c; c = c->next) { -@@ -1548,8 +1548,8 @@ setup(void) - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); -- lrpad = drw->fonts->h; -- bh = drw->fonts->h + 2; -+ lrpad = drw->fonts->h + horizpadbar; -+ bh = drw->fonts->h + vertpadbar; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); --- -2.35.1 - diff --git a/user/.config/suckless/dwm/patches/dwm-warp-6.2.diff b/user/.config/suckless/dwm/patches/dwm-warp-6.2.diff deleted file mode 100644 index 813c41d6d..000000000 --- a/user/.config/suckless/dwm/patches/dwm-warp-6.2.diff +++ /dev/null @@ -1,58 +0,0 @@ -diff --git a/dwm.c b/dwm.c -index 4465af1..bf74f60 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -227,6 +227,7 @@ static void updatetitle(Client *c); - static void updatewindowtype(Client *c); - static void updatewmhints(Client *c); - static void view(const Arg *arg); -+static void warp(const Client *c); - static Client *wintoclient(Window w); - static Monitor *wintomon(Window w); - static int xerror(Display *dpy, XErrorEvent *ee); -@@ -827,6 +828,7 @@ focusmon(const Arg *arg) - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -+ warp(selmon->sel); - } - - void -@@ -1367,6 +1369,8 @@ restack(Monitor *m) - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -+ if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2]) -+ warp(m->sel); - } - - void -@@ -2044,6 +2048,28 @@ view(const Arg *arg) - arrange(selmon); - } - -+void -+warp(const Client *c) -+{ -+ int x, y; -+ -+ if (!c) { -+ XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2); -+ return; -+ } -+ -+ if (!getrootptr(&x, &y) || -+ (x > c->x - c->bw && -+ y > c->y - c->bw && -+ x < c->x + c->w + c->bw*2 && -+ y < c->y + c->h + c->bw*2) || -+ (y > c->mon->by && y < c->mon->by + bh) || -+ (c->mon->topbar && !y)) -+ return; -+ -+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2); -+} -+ - Client * - wintoclient(Window w) - { diff --git a/user/.config/suckless/dwm/tcl.c b/user/.config/suckless/dwm/tcl.c deleted file mode 100644 index 4c94914f7..000000000 --- a/user/.config/suckless/dwm/tcl.c +++ /dev/null @@ -1,74 +0,0 @@ -void -tcl(Monitor * m) -{ - int x, y, h, w, mw, sw, bdw; - unsigned int i, n; - Client * c; - - for (n = 0, c = nexttiled(m->clients); c; - c = nexttiled(c->next), n++); - - if (n == 0) - return; - - c = nexttiled(m->clients); - - mw = m->mfact * m->ww; - sw = (m->ww - mw) / 2; - bdw = (2 * c->bw); - resize(c, - n < 3 ? m->wx : m->wx + sw, - m->wy, - n == 1 ? m->ww - bdw : mw - bdw, - m->wh - bdw, - False); - - if (--n == 0) - return; - - w = (m->ww - mw) / ((n > 1) + 1); - c = nexttiled(c->next); - - if (n > 1) - { - x = m->wx + ((n > 1) ? mw + sw : mw); - y = m->wy; - h = m->wh / (n / 2); - - if (h < bh) - h = m->wh; - - for (i = 0; c && i < n / 2; c = nexttiled(c->next), i++) - { - resize(c, - x, - y, - w - bdw, - (i + 1 == n / 2) ? m->wy + m->wh - y - bdw : h - bdw, - False); - - if (h != m->wh) - y = c->y + HEIGHT(c); - } - } - - x = (n + 1 / 2) == 1 ? mw : m->wx; - y = m->wy; - h = m->wh / ((n + 1) / 2); - - if (h < bh) - h = m->wh; - - for (i = 0; c; c = nexttiled(c->next), i++) - { - resize(c, - x, - y, - (i + 1 == (n + 1) / 2) ? w - bdw : w - bdw, - (i + 1 == (n + 1) / 2) ? m->wy + m->wh - y - bdw : h - bdw, - False); - - if (h != m->wh) - y = c->y + HEIGHT(c); - } -} diff --git a/user/.config/suckless/dwm/transient.c b/user/.config/suckless/dwm/transient.c deleted file mode 100644 index 040adb5b3..000000000 --- a/user/.config/suckless/dwm/transient.c +++ /dev/null @@ -1,42 +0,0 @@ -/* cc transient.c -o transient -lX11 */ - -#include -#include -#include -#include - -int main(void) { - Display *d; - Window r, f, t = None; - XSizeHints h; - XEvent e; - - d = XOpenDisplay(NULL); - if (!d) - exit(1); - r = DefaultRootWindow(d); - - f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0); - h.min_width = h.max_width = h.min_height = h.max_height = 400; - h.flags = PMinSize | PMaxSize; - XSetWMNormalHints(d, f, &h); - XStoreName(d, f, "floating"); - XMapWindow(d, f); - - XSelectInput(d, f, ExposureMask); - while (1) { - XNextEvent(d, &e); - - if (t == None) { - sleep(5); - t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0); - XSetTransientForHint(d, t, f); - XStoreName(d, t, "transient"); - XMapWindow(d, t); - XSelectInput(d, t, ExposureMask); - } - } - - XCloseDisplay(d); - exit(0); -} diff --git a/user/.config/suckless/dwm/util.c b/user/.config/suckless/dwm/util.c deleted file mode 100644 index 96b82c980..000000000 --- a/user/.config/suckless/dwm/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/user/.config/suckless/dwm/util.h b/user/.config/suckless/dwm/util.h deleted file mode 100644 index f633b5173..000000000 --- a/user/.config/suckless/dwm/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/user/.config/suckless/dwmblocks/Makefile b/user/.config/suckless/dwmblocks/Makefile deleted file mode 100644 index c9911b0eb..000000000 --- a/user/.config/suckless/dwmblocks/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -PREFIX ?= /usr/local -CC ?= cc - -output: dwmblocks.c blocks.def.h blocks.h - ${CC} `pkg-config --cflags x11 --libs x11` dwmblocks.c -o dwmblocks -blocks.h: - cp -v blocks.def.h $@ -clean: - rm -fv *.o *.gch dwmblocks -install: output - mkdir -pv $(DESTDIR)$(PREFIX)/bin - install -m 0755 dwmblocks $(DESTDIR)$(PREFIX)/bin/dwmblocks -uninstall: - rm -fv $(DESTDIR)$(PREFIX)/bin/dwmblocks diff --git a/user/.config/suckless/dwmblocks/blocks.def.h b/user/.config/suckless/dwmblocks/blocks.def.h deleted file mode 100644 index aac6a3007..000000000 --- a/user/.config/suckless/dwmblocks/blocks.def.h +++ /dev/null @@ -1,22 +0,0 @@ -//Modify this file to change what commands output to your statusbar, and recompile using the make command. -static const Block blocks[] = { - /*Command*/ /*Update Interval*/ /*Update Signal*/ -// {"", "$HOME/.config/suckless/dwmblocks/block_cpu", 1, 1}, - -// {"", "$HOME/.config/suckless/dwmblocks/block_memory", 1, 1}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_layout", 1, 0}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_battery", 1, 0}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_brightness", 1, 0}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_volume", 1, 0}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_clock", 1, 0}, - - {"", "$HOME/.config/suckless/dwmblocks/scripts/block_wifi", 1, 0}, -}; - -//sets delimeter between status commands. NULL character ('\0') means no delimeter. -static char delim = '|'; diff --git a/user/.config/suckless/dwmblocks/dwmblocks.c b/user/.config/suckless/dwmblocks/dwmblocks.c deleted file mode 100644 index 88bdfb0b0..000000000 --- a/user/.config/suckless/dwmblocks/dwmblocks.c +++ /dev/null @@ -1,175 +0,0 @@ -#include -#include -#include -#include -#include -#include -#define LENGTH(X) (sizeof(X) / sizeof (X[0])) -#define CMDLENGTH 50 - -typedef struct { - char* icon; - char* command; - unsigned int interval; - unsigned int signal; -} Block; -void sighandler(int num); -void replace(char *str, char old, char new); -void getcmds(int time); -#ifndef __OpenBSD__ -void getsigcmds(int signal); -void setupsignals(); -void sighandler(int signum); -#endif -int getstatus(char *str, char *last); -void setroot(); -void statusloop(); -void termhandler(int signum); - - -#include "blocks.h" - -static Display *dpy; -static int screen; -static Window root; -static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0}; -static char statusstr[2][256]; -static int statusContinue = 1; -static void (*writestatus) () = setroot; - -void replace(char *str, char old, char new) -{ - int N = strlen(str); - for(int i = 0; i < N; i++) - if(str[i] == old) - str[i] = new; -} - -//opens process *cmd and stores output in *output -void getcmd(const Block *block, char *output) -{ - strcpy(output, block->icon); - char *cmd = block->command; - FILE *cmdf = popen(cmd,"r"); - if (!cmdf) - return; - char c; - int i = strlen(block->icon); - fgets(output+i, CMDLENGTH-i, cmdf); - i = strlen(output); - if (delim != '\0' && --i) - output[i++] = delim; - output[i++] = '\0'; - pclose(cmdf); -} - -void getcmds(int time) -{ - const Block* current; - for(int i = 0; i < LENGTH(blocks); i++) - { - current = blocks + i; - if ((current->interval != 0 && time % current->interval == 0) || time == -1) - getcmd(current,statusbar[i]); - } -} - -#ifndef __OpenBSD__ -void getsigcmds(int signal) -{ - const Block *current; - for (int i = 0; i < LENGTH(blocks); i++) - { - current = blocks + i; - if (current->signal == signal) - getcmd(current,statusbar[i]); - } -} - -void setupsignals() -{ - for(int i = 0; i < LENGTH(blocks); i++) - { - if (blocks[i].signal > 0) - signal(SIGRTMIN+blocks[i].signal, sighandler); - } - -} -#endif - -int getstatus(char *str, char *last) -{ - strcpy(last, str); - str[0] = '\0'; - for(int i = 0; i < LENGTH(blocks); i++) - strcat(str, statusbar[i]); - str[strlen(str)-1] = '\0'; - return strcmp(str, last);//0 if they are the same -} - -void setroot() -{ - if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed. - return; - Display *d = XOpenDisplay(NULL); - if (d) { - dpy = d; - } - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - XStoreName(dpy, root, statusstr[0]); - XCloseDisplay(dpy); -} - -void pstdout() -{ - if (!getstatus(statusstr[0], statusstr[1]))//Only write out if text has changed. - return; - printf("%s\n",statusstr[0]); - fflush(stdout); -} - - -void statusloop() -{ -#ifndef __OpenBSD__ - setupsignals(); -#endif - int i = 0; - getcmds(-1); - while(statusContinue) - { - getcmds(i); - writestatus(); - sleep(1.0); - i++; - } -} - -#ifndef __OpenBSD__ -void sighandler(int signum) -{ - getsigcmds(signum-SIGRTMIN); - writestatus(); -} -#endif - -void termhandler(int signum) -{ - statusContinue = 0; - exit(0); -} - -int main(int argc, char** argv) -{ - for(int i = 0; i < argc; i++) - { - if (!strcmp("-d",argv[i])) - delim = argv[++i][0]; - else if(!strcmp("-p",argv[i])) - writestatus = pstdout; - } - signal(SIGTERM, termhandler); - signal(SIGINT, termhandler); - statusloop(); -} diff --git a/user/.config/suckless/dwmblocks/scripts/block_battery b/user/.config/suckless/dwmblocks/scripts/block_battery deleted file mode 100755 index d0c53e5f3..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_battery +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -# Loop through all attached batteries and format the info -currntpwr=$(powerprofilesctl get) -if [ "${currntpwr}" = "performance" ]; then - pwr="perf" -elif [ "${currntpwr}" = "balanced" ]; then - pwr="balc" -elif [ "${currntpwr}" = "power-saver" ]; then - pwr="pwrs" -fi -battery="/sys/class/power_supply/BAT0" -capacity=$(cat "$battery"/capacity) -echo -e " bat: $capacity% - $pwr " diff --git a/user/.config/suckless/dwmblocks/scripts/block_brightness b/user/.config/suckless/dwmblocks/scripts/block_brightness deleted file mode 100755 index 35404cf8c..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_brightness +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -brt=$(xbacklight -get) -echo " bri: ${brt%.*}% " diff --git a/user/.config/suckless/dwmblocks/scripts/block_clock b/user/.config/suckless/dwmblocks/scripts/block_clock deleted file mode 100755 index a5d15126c..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_clock +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -date="$(date +%d/%m/%Y)" -clock="$(date +%R:%S)" -echo " dte: $date - $clock " diff --git a/user/.config/suckless/dwmblocks/scripts/block_cpu b/user/.config/suckless/dwmblocks/scripts/block_cpu deleted file mode 100755 index 3815c72ad..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_cpu +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -usage=$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}') -echo -e "CPU: [${usage%.*}%] " diff --git a/user/.config/suckless/dwmblocks/scripts/block_layout b/user/.config/suckless/dwmblocks/scripts/block_layout deleted file mode 100755 index fa722e116..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_layout +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -layout=$(setxkbmap -query | grep -oP 'layout:\s*\K\w+') -echo "key: $layout " diff --git a/user/.config/suckless/dwmblocks/scripts/block_memory b/user/.config/suckless/dwmblocks/scripts/block_memory deleted file mode 100755 index 9c899f6d8..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_memory +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -mem="$(free -h | awk '/^Mem:/ {print $3 "/" $2}')" -echo -e " RAM: [$mem] " diff --git a/user/.config/suckless/dwmblocks/scripts/block_volume b/user/.config/suckless/dwmblocks/scripts/block_volume deleted file mode 100755 index 8dc11d50d..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_volume +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# Prints the current volume or 🔇 if muted. -[ $(pamixer --get-mute) = true ] && echo " vol: mut " && exit -vol="$(pamixer --get-volume)" -echo " vol: $vol% " diff --git a/user/.config/suckless/dwmblocks/scripts/block_wifi b/user/.config/suckless/dwmblocks/scripts/block_wifi deleted file mode 100755 index c4328b459..000000000 --- a/user/.config/suckless/dwmblocks/scripts/block_wifi +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -constate=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f3 | head -1) -currentwfi=$(nmcli dev | grep wifi | sed 's/ \{2,\}/|/g' | cut -d '|' -f4 | head -1) - -if [ "$constate" = "disconnected" ]; then - echo " wfi: disc" -elif [ "$constate" = "connected" ]; then - echo " wfi: $currentwfi" -else - echo " wfi: disc" -fi diff --git a/user/.config/suckless/herbe/.gitignore b/user/.config/suckless/herbe/.gitignore deleted file mode 100644 index fba990b27..000000000 --- a/user/.config/suckless/herbe/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -herbe -config.h -.ccls-cache diff --git a/user/.config/suckless/herbe/LICENSE b/user/.config/suckless/herbe/LICENSE deleted file mode 100644 index 7b85eda1b..000000000 --- a/user/.config/suckless/herbe/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 Samuel DudĂ­k - -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/user/.config/suckless/herbe/Makefile b/user/.config/suckless/herbe/Makefile deleted file mode 100644 index 473523054..000000000 --- a/user/.config/suckless/herbe/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -CFLAGS = -Wall -Wextra -pedantic -lX11 -lXft -I/usr/include/freetype2 -pthread - -PREFIX ?= /usr/local -CC ?= cc - -all: herbe - -config.h: config.def.h - cp config.def.h config.h - -herbe: herbe.c config.h - $(CC) herbe.c $(CFLAGS) -o herbe - -install: herbe - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f herbe ${DESTDIR}${PREFIX}/bin - cp -f notify-send ${DESTDIR}${PREFIX}/bin - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/herbe - -clean: - rm -f herbe - -.PHONY: all install uninstall clean diff --git a/user/.config/suckless/herbe/README.md b/user/.config/suckless/herbe/README.md deleted file mode 100644 index 25eb20c8c..000000000 --- a/user/.config/suckless/herbe/README.md +++ /dev/null @@ -1,139 +0,0 @@ -# đŸŒ± herbe -> Daemon-less notifications without D-Bus. Minimal and lightweight. - -

- -

- -## Features -* Under 200 lines of code -* Doesn't run in the background, just displays the notification and exits -* No external dependencies except Xlib and Xft -* Configurable through `config.h` or Xresources ([using this patch](https://github.com/dudik/herbe/pull/11)) -* [Actions support](#actions) -* Extensible through [patches](https://github.com/dudik/herbe/pulls?q=is%3Aopen+is%3Apr+label%3Apatch) - -## Table of contents - -* [Usage](#usage) - * [Patches](#patches) - * [Dismiss a notification](#dismiss-a-notification) - * [Actions](#actions) - * [Newlines](#newlines) - * [Multiple notifications](#multiple-notifications) - * [Notifications don't show up](#notifications-dont-show-up) -* [Installation](#installation) - * [Packages](#packages) - * [Dependencies](#dependencies) - * [Build](#build) -* [Configuration](#configuration) -* [Contribute](#contribute) - -## Usage - -### Patches -[List of available patches](https://github.com/dudik/herbe/pulls?q=is%3Aopen+is%3Apr+label%3Apatch) - -To create a new patch you'll have to open a pull request with your changes. Append `.diff` to the pull request URL to get a downloadable diff file. Don't forget to prefix the title with `patch:` and to apply the `patch` label to it. For inspiration, look at [my Xresources patch](https://github.com/dudik/herbe/pull/11). Thank you. - -_Note: This patching method was heavily inspired by [dylan's sowm](https://github.com/dylanaraps/sowm)._ - -### Dismiss a notification -A notification can be dismissed either by clicking on it with `DISMISS_BUTTON` (set in config.h, defaults to left mouse button) or sending a `SIGUSR1` signal to it: -```shell -$ pkill -SIGUSR1 herbe -``` -Dismissed notifications return exit code 2. - -### Actions -Action is a piece of shell code that runs when a notification gets accepted. Accepting a notification is the same as dismissing it, but you have to use either `ACTION_BUTTON` (defaults to right mouse button) or the `SIGUSR2` signal. -An accepted notification always returns exit code 0. To specify an action: -```shell -$ herbe "Notification body" && echo "This is an action" -``` -Where everything after `&&` is the action and will get executed after the notification gets accepted. - -### Newlines -Every command line argument gets printed on a separate line by default e.g.: -```shell -$ herbe "First line" "Second line" "Third line" ... -``` -You can also use `\n` e.g. in `bash`: -```shell -$ herbe $'First line\nSecond line\nThird line' -``` -But by default `herbe` prints `\n` literally: -```shell -$ herbe "First line\nStill the first line" -``` -Output of other programs will get printed correctly, just make sure to escape it (so you don't end up with every word on a separate line): -```shell -$ herbe "$(ps axch -o cmd:15,%cpu --sort=-%cpu | head)" -``` - -### Multiple notifications -Notifications are put in a queue and shown one after another in order of creation (first in, first out). They don't overlap and each one is shown for its entire duration. - -### Notifications don't show up -Most likely a running notification got terminated forcefully (SIGKILL or any uncaught signal) which caused the semaphore not getting unlocked. First, kill any `herbe` instance that is stuck: -```shell -$ pkill -SIGKILL herbe -``` -Then just call `herbe` without any arguments: -```shell -$ herbe -``` -Notifications should now show up as expected. - -Don't ever send any signals to `herbe` except these: -```shell -# same as pkill -SIGTERM herbe, terminates every running herbe process -$ pkill herbe - -$ pkill -SIGUSR1 herbe -$ pkill -SIGUSR2 herbe -``` -And you should be fine. That's all you really need to interact with `herbe`. - -## Installation -### Packages -[![Packaging status](https://repology.org/badge/vertical-allrepos/herbe.svg)](https://repology.org/project/herbe/versions) - -[OpenBSD patch](https://github.com/dudik/herbe/pull/4) - -[FreeBSD patch](https://github.com/dudik/herbe/pull/16) - -[Wayland port](https://github.com/muevoid/Wayherb) by [muevoid](https://github.com/muevoid) - -**Only the [herbe-git AUR package](https://aur.archlinux.org/packages/herbe-git/) is maintained by me.** - -### Dependencies -* X11 (Xlib) -* Xft - -The names of packages are different depending on which distribution you use. -For example, if you use [Void Linux](https://voidlinux.org/) you will have to install these dependencies: -```shell -sudo xbps-install base-devel libX11-devel libXft-devel -``` - -### Build -```shell -git clone https://github.com/dudik/herbe -cd herbe -sudo make install -``` -`make install` requires root privileges because it copies the resulting binary to `/usr/local/bin`. This makes `herbe` accessible globally. - -You can also use `make clean` to remove the binary from the build folder, `sudo make uninstall` to remove the binary from `/usr/local/bin` or just `make` to build the binary locally. - -## Configuration -herbe is configured at compile-time by editing `config.h`. Every option should be self-explanatory. There is no `height` option because height is determined by font size and text padding. - -[Xresources patch](https://github.com/dudik/herbe/pull/11) - -## Contribute -If you want to report a bug or you have a feature request, feel free to [open an issue](https://github.com/dudik/herbe/issues). - -## Projects with herbe integration -- [qutebrowser](https://qutebrowser.org/) supports showing web notifications via herbe, via the `content.notifications.presenter` setting. diff --git a/user/.config/suckless/herbe/config.def.h b/user/.config/suckless/herbe/config.def.h deleted file mode 100644 index 94932d4fe..000000000 --- a/user/.config/suckless/herbe/config.def.h +++ /dev/null @@ -1,19 +0,0 @@ -static const char *background_color = "#1d2021"; -static const char *border_color = "#cc241d"; -static const char *font_color = "#fbf1c7"; -static const char *font_pattern = "mononoki Nerd Font Mono:size=10"; -static const unsigned line_spacing = 5; -static const unsigned int padding = 15; - -static const unsigned int width = 450; -static const unsigned int border_size = 2; -static const unsigned int pos_x = 30; -static const unsigned int pos_y = 60; - -enum corners { TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; -enum corners corner = TOP_RIGHT; - -static const unsigned int duration = 5; /* in seconds */ - -#define DISMISS_BUTTON Button1 -#define ACTION_BUTTON Button3 diff --git a/user/.config/suckless/herbe/herbe.c b/user/.config/suckless/herbe/herbe.c deleted file mode 100644 index 8bfdbc172..000000000 --- a/user/.config/suckless/herbe/herbe.c +++ /dev/null @@ -1,233 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "config.h" - -#define EXIT_ACTION 0 -#define EXIT_FAIL 1 -#define EXIT_DISMISS 2 - -Display *display; -Window window; -int exit_code = EXIT_DISMISS; - -static void die(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - vfprintf(stderr, format, ap); - fprintf(stderr, "\n"); - va_end(ap); - exit(EXIT_FAIL); -} - -int get_max_len(char *string, XftFont *font, int max_text_width) -{ - int eol = strlen(string); - XGlyphInfo info; - XftTextExtentsUtf8(display, font, (FcChar8 *)string, eol, &info); - - if (info.width > max_text_width) - { - eol = max_text_width / font->max_advance_width; - info.width = 0; - - while (info.width < max_text_width) - { - eol++; - XftTextExtentsUtf8(display, font, (FcChar8 *)string, eol, &info); - } - - eol--; - } - - for (int i = 0; i < eol; i++) - if (string[i] == '\n') - { - string[i] = ' '; - return ++i; - } - - if (info.width <= max_text_width) - return eol; - - int temp = eol; - - while (string[eol] != ' ' && eol) - --eol; - - if (eol == 0) - return temp; - else - return ++eol; -} - -void expire(int sig) -{ - XEvent event; - event.type = ButtonPress; - event.xbutton.button = (sig == SIGUSR2) ? (ACTION_BUTTON) : (DISMISS_BUTTON); - XSendEvent(display, window, 0, 0, &event); - XFlush(display); -} - -void read_y_offset(unsigned int **offset, int *id) { - int shm_id = shmget(8432, sizeof(unsigned int), IPC_CREAT | 0660); - if (shm_id == -1) die("shmget failed"); - - *offset = (unsigned int *)shmat(shm_id, 0, 0); - if (*offset == (unsigned int *)-1) die("shmat failed\n"); - *id = shm_id; -} - -void free_y_offset(int id) { - shmctl(id, IPC_RMID, NULL); -} - -int main(int argc, char *argv[]) -{ - if (argc == 1) - die("Usage: %s body", argv[0]); - - struct sigaction act_expire, act_ignore; - - act_expire.sa_handler = expire; - act_expire.sa_flags = SA_RESTART; - sigemptyset(&act_expire.sa_mask); - - act_ignore.sa_handler = SIG_IGN; - act_ignore.sa_flags = 0; - sigemptyset(&act_ignore.sa_mask); - - sigaction(SIGALRM, &act_expire, 0); - sigaction(SIGTERM, &act_expire, 0); - sigaction(SIGINT, &act_expire, 0); - - sigaction(SIGUSR1, &act_ignore, 0); - sigaction(SIGUSR2, &act_ignore, 0); - - if (!(display = XOpenDisplay(0))) - die("Cannot open display"); - - int screen = DefaultScreen(display); - Visual *visual = DefaultVisual(display, screen); - Colormap colormap = DefaultColormap(display, screen); - - int screen_width = DisplayWidth(display, screen); - int screen_height = DisplayHeight(display, screen); - - XSetWindowAttributes attributes; - attributes.override_redirect = True; - XftColor color; - XftColorAllocName(display, visual, colormap, background_color, &color); - attributes.background_pixel = color.pixel; - XftColorAllocName(display, visual, colormap, border_color, &color); - attributes.border_pixel = color.pixel; - - int num_of_lines = 0; - int max_text_width = width - 2 * padding; - int lines_size = 5; - char **lines = malloc(lines_size * sizeof(char *)); - if (!lines) - die("malloc failed"); - - XftFont *font = XftFontOpenName(display, screen, font_pattern); - - for (int i = 1; i < argc; i++) - { - for (unsigned int eol = get_max_len(argv[i], font, max_text_width); eol; argv[i] += eol, num_of_lines++, eol = get_max_len(argv[i], font, max_text_width)) - { - if (lines_size <= num_of_lines) - { - lines = realloc(lines, (lines_size += 5) * sizeof(char *)); - if (!lines) - die("realloc failed"); - } - - lines[num_of_lines] = malloc((eol + 1) * sizeof(char)); - if (!lines[num_of_lines]) - die("malloc failed"); - - strncpy(lines[num_of_lines], argv[i], eol); - lines[num_of_lines][eol] = '\0'; - } - } - - int y_offset_id; - unsigned int *y_offset; - read_y_offset(&y_offset, &y_offset_id); - - unsigned int text_height = font->ascent - font->descent; - unsigned int height = (num_of_lines - 1) * line_spacing + num_of_lines * text_height + 2 * padding; - unsigned int x = pos_x; - unsigned int y = pos_y + *y_offset; - - unsigned int used_y_offset = (*y_offset) += height + padding; - - if (corner == TOP_RIGHT || corner == BOTTOM_RIGHT) - x = screen_width - width - border_size * 2 - x; - - if (corner == BOTTOM_LEFT || corner == BOTTOM_RIGHT) - y = screen_height - height - border_size * 2 - y; - - window = XCreateWindow(display, RootWindow(display, screen), x, y, width, height, border_size, DefaultDepth(display, screen), - CopyFromParent, visual, CWOverrideRedirect | CWBackPixel | CWBorderPixel, &attributes); - - XftDraw *draw = XftDrawCreate(display, window, visual, colormap); - XftColorAllocName(display, visual, colormap, font_color, &color); - - XSelectInput(display, window, ExposureMask | ButtonPress); - XMapWindow(display, window); - - sigaction(SIGUSR1, &act_expire, 0); - sigaction(SIGUSR2, &act_expire, 0); - - if (duration != 0) - alarm(duration); - - for (;;) - { - XEvent event; - XNextEvent(display, &event); - - if (event.type == Expose) - { - XClearWindow(display, window); - for (int i = 0; i < num_of_lines; i++) - XftDrawStringUtf8(draw, &color, font, padding, line_spacing * i + text_height * (i + 1) + padding, - (FcChar8 *)lines[i], strlen(lines[i])); - } - else if (event.type == ButtonPress) - { - if (event.xbutton.button == DISMISS_BUTTON) - break; - else if (event.xbutton.button == ACTION_BUTTON) - { - exit_code = EXIT_ACTION; - break; - } - } - } - - - for (int i = 0; i < num_of_lines; i++) - free(lines[i]); - - if (used_y_offset == *y_offset) free_y_offset(y_offset_id); - free(lines); - XftDrawDestroy(draw); - XftColorFree(display, visual, colormap, &color); - XftFontClose(display, font); - XCloseDisplay(display); - - return exit_code; -} diff --git a/user/.config/suckless/herbe/notify-send b/user/.config/suckless/herbe/notify-send deleted file mode 100755 index 3a3872b6d..000000000 --- a/user/.config/suckless/herbe/notify-send +++ /dev/null @@ -1,81 +0,0 @@ -#!/bin/sh -# Shell script to redirect notify-send calls to herbe. The purpose is to ignore -# options passed to notify-send. -# -# Option parser generated by getoptions -# URL: https://github.com/ko1nksm/getoptions -# LICENSE: Creative Commons Zero v1.0 Universal - -usage() { - printf '%s\n' "${0##*/}: notify-send replacement for herbe" "accepts but ignores all notify-send options." -} - -REST='' -parse() { - OPTIND=$(($#+1)) - while [ $# -gt 0 ] && OPTARG=; do - case $1 in - --?*=*) OPTARG=$1; shift - eval 'set -- "${OPTARG%%\=*}" "${OPTARG#*\=}"' ${1+'"$@"'} - ;; - -[utich]?*) OPTARG=$1; shift - eval 'set -- "${OPTARG%"${OPTARG#??}"}" "${OPTARG#??}"' ${1+'"$@"'} - ;; - -[!-]?*) OPTARG=$1; shift - eval 'set -- "${OPTARG%"${OPTARG#??}"}" "-${OPTARG#??}"' ${1+'"$@"'} - OPTARG= ;; - esac - case $1 in - -u | --urgency) - [ $# -le 1 ] && set -- "$1" required && break - OPTARG=$2 - _=$OPTARG - shift ;; - -t | --expire-time) - [ $# -le 1 ] && set -- "$1" required && break - OPTARG=$2 - _=$OPTARG - shift ;; - -i | --icon) - [ $# -le 1 ] && set -- "$1" required && break - OPTARG=$2 - _=$OPTARG - shift ;; - -c | --category) - [ $# -le 1 ] && set -- "$1" required && break - OPTARG=$2 - _=$OPTARG - shift ;; - -h | --hint) - [ $# -le 1 ] && set -- "$1" required && break - OPTARG=$2 - _=$OPTARG - shift ;; - -? | --help) - usage - exit 0 ;; - --) shift - while [ $# -gt 0 ]; do - REST="${REST} \"\${$(($OPTIND-$#))}\"" - shift - done - break ;; - [-]?*) set -- "$1" unknown && break ;; - *) REST="${REST} \"\${$(($OPTIND-$#))}\"" - esac - shift - done - [ $# -eq 0 ] && return 0 - case $2 in - unknown) echo "unrecognized option '$1'" ;; - noarg) echo "option '$1' doesn't allow an argument" ;; - required) echo "option '$1' requires an argument" ;; - pattern) echo "option '$1' does not match the pattern ($3)" ;; - *) echo "option '$1' validation error: $2" - esac >&2 - exit 1 -} - -parse "$@" -eval set -- "$REST" -herbe "$@" & diff --git a/user/.config/suckless/herbe/patches/19.diff b/user/.config/suckless/herbe/patches/19.diff deleted file mode 100644 index 2ece3fbd7..000000000 --- a/user/.config/suckless/herbe/patches/19.diff +++ /dev/null @@ -1,100 +0,0 @@ -diff --git a/herbe.c b/herbe.c -index 51d3990..8bfdbc1 100644 ---- a/herbe.c -+++ b/herbe.c -@@ -7,7 +7,8 @@ - #include - #include - #include --#include -+#include -+#include - - #include "config.h" - -@@ -79,13 +80,23 @@ void expire(int sig) - XFlush(display); - } - -+void read_y_offset(unsigned int **offset, int *id) { -+ int shm_id = shmget(8432, sizeof(unsigned int), IPC_CREAT | 0660); -+ if (shm_id == -1) die("shmget failed"); -+ -+ *offset = (unsigned int *)shmat(shm_id, 0, 0); -+ if (*offset == (unsigned int *)-1) die("shmat failed\n"); -+ *id = shm_id; -+} -+ -+void free_y_offset(int id) { -+ shmctl(id, IPC_RMID, NULL); -+} -+ - int main(int argc, char *argv[]) - { - if (argc == 1) -- { -- sem_unlink("/herbe"); -- die("Usage: %s body", argv[0]); -- } -+ die("Usage: %s body", argv[0]); - - struct sigaction act_expire, act_ignore; - -@@ -151,16 +162,22 @@ int main(int argc, char *argv[]) - } - } - -- unsigned int x = pos_x; -- unsigned int y = pos_y; -+ int y_offset_id; -+ unsigned int *y_offset; -+ read_y_offset(&y_offset, &y_offset_id); -+ - unsigned int text_height = font->ascent - font->descent; - unsigned int height = (num_of_lines - 1) * line_spacing + num_of_lines * text_height + 2 * padding; -+ unsigned int x = pos_x; -+ unsigned int y = pos_y + *y_offset; -+ -+ unsigned int used_y_offset = (*y_offset) += height + padding; - - if (corner == TOP_RIGHT || corner == BOTTOM_RIGHT) -- x = screen_width - width - border_size * 2 - pos_x; -+ x = screen_width - width - border_size * 2 - x; - - if (corner == BOTTOM_LEFT || corner == BOTTOM_RIGHT) -- y = screen_height - height - border_size * 2 - pos_y; -+ y = screen_height - height - border_size * 2 - y; - - window = XCreateWindow(display, RootWindow(display, screen), x, y, width, height, border_size, DefaultDepth(display, screen), - CopyFromParent, visual, CWOverrideRedirect | CWBackPixel | CWBorderPixel, &attributes); -@@ -171,9 +188,6 @@ int main(int argc, char *argv[]) - XSelectInput(display, window, ExposureMask | ButtonPress); - XMapWindow(display, window); - -- sem_t *mutex = sem_open("/herbe", O_CREAT, 0644, 1); -- sem_wait(mutex); -- - sigaction(SIGUSR1, &act_expire, 0); - sigaction(SIGUSR2, &act_expire, 0); - -@@ -204,12 +218,11 @@ int main(int argc, char *argv[]) - } - } - -- sem_post(mutex); -- sem_close(mutex); - - for (int i = 0; i < num_of_lines; i++) - free(lines[i]); - -+ if (used_y_offset == *y_offset) free_y_offset(y_offset_id); - free(lines); - XftDrawDestroy(draw); - XftColorFree(display, visual, colormap, &color); -@@ -217,4 +230,4 @@ int main(int argc, char *argv[]) - XCloseDisplay(display); - - return exit_code; --} -\ No newline at end of file -+} diff --git a/user/.config/suckless/slock/Makefile b/user/.config/suckless/slock/Makefile deleted file mode 100644 index b20fd4ee6..000000000 --- a/user/.config/suckless/slock/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -# slock - simple screen locker -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = slock.c ${COMPATSRC} -OBJ = ${SRC:.c=.o} - -all: options slock - -options: - @echo slock build options: - @echo "CFLAGS = ${CFLAGS}" - @echo "LDFLAGS = ${LDFLAGS}" - @echo "CC = ${CC}" - -.c.o: - @echo CC $< - @${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk arg.h util.h - -config.h: - @echo creating $@ from config.def.h - @cp config.def.h $@ - -slock: ${OBJ} - @echo CC -o $@ - @${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - @echo cleaning - @rm -f slock ${OBJ} slock-${VERSION}.tar.gz - -dist: clean - @echo creating dist tarball - @mkdir -p slock-${VERSION} - @cp -R LICENSE Makefile README slock.1 config.mk \ - ${SRC} config.def.h arg.h util.h slock-${VERSION} - @tar -cf slock-${VERSION}.tar slock-${VERSION} - @gzip slock-${VERSION}.tar - @rm -rf slock-${VERSION} - -install: all - @echo installing executable file to ${DESTDIR}${PREFIX}/bin - @mkdir -p ${DESTDIR}${PREFIX}/bin - @cp -f slock ${DESTDIR}${PREFIX}/bin - @chmod 755 ${DESTDIR}${PREFIX}/bin/slock - @chmod u+s ${DESTDIR}${PREFIX}/bin/slock - @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 - @mkdir -p ${DESTDIR}${MANPREFIX}/man1 - @sed "s/VERSION/${VERSION}/g" ${DESTDIR}${MANPREFIX}/man1/slock.1 - @chmod 644 ${DESTDIR}${MANPREFIX}/man1/slock.1 - -uninstall: - @echo removing executable file from ${DESTDIR}${PREFIX}/bin - @rm -f ${DESTDIR}${PREFIX}/bin/slock - @echo removing manual page from ${DESTDIR}${MANPREFIX}/man1 - @rm -f ${DESTDIR}${MANPREFIX}/man1/slock.1 - -.PHONY: all options clean dist install uninstall diff --git a/user/.config/suckless/slock/arg.h b/user/.config/suckless/slock/arg.h deleted file mode 100644 index 0b23c53a9..000000000 --- a/user/.config/suckless/slock/arg.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -/* Handles obsolete -NUM syntax */ -#define ARGNUM case '0':\ - case '1':\ - case '2':\ - case '3':\ - case '4':\ - case '5':\ - case '6':\ - case '7':\ - case '8':\ - case '9' - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define ARGNUMF() (brk_ = 1, estrtonum(argv[0], 0, INT_MAX)) - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define LNGARG() &argv[0][0] - -#endif diff --git a/user/.config/suckless/slock/config.def.h b/user/.config/suckless/slock/config.def.h deleted file mode 100644 index 85e35d9fd..000000000 --- a/user/.config/suckless/slock/config.def.h +++ /dev/null @@ -1,28 +0,0 @@ -/* user and group to drop privileges to */ -static const char *user = "drk"; -static const char *group = "drk"; - -static const char *colorname[NUMCOLS] = { - [INIT] = "#1d2021", /* after initialization */ - [INPUT] = "#076678", /* during input */ - [FAILED] = "#cc241d", /* wrong password */ - [PAM] = "#32302f", /* waiting for PAM */ -}; - -/* treat a cleared input like a wrong password (color) */ -static const int failonclear = 1; - -/* default message */ -static const char * message = "This device is locked\neven if you manage to unlock it\nyou wont know how to use it"; - -/* text color */ -static const char * text_color = "#d4c4a1"; - -/* text size (must be a valid size) */ -static const char * font_name = "mtx"; - -/* Background image path, should be available to the user above */ -static const char* background_image = ".config/suckless/slock/lockscreen.jpg"; - -/* PAM service that's used for authentication */ -static const char* pam_service = "system-local-login"; diff --git a/user/.config/suckless/slock/config.mk b/user/.config/suckless/slock/config.mk deleted file mode 100644 index 050bc5c71..000000000 --- a/user/.config/suckless/slock/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# slock version -VERSION = 1.5 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# includes and libs -INCS = -I. -I/usr/include -I${X11INC} -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2 -lXinerama -lpam - -# flags -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} -LDFLAGS = -s ${LIBS} -COMPATSRC = explicit_bzero.c - -# On OpenBSD and Darwin remove -lcrypt from LIBS -#LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 -lXext -lXrandr -# On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS -# On NetBSD add -D_NETBSD_SOURCE to CPPFLAGS -#CPPFLAGS = -DVERSION=\"${VERSION}\" -D_BSD_SOURCE -D_NETBSD_SOURCE -# On OpenBSD set COMPATSRC to empty -#COMPATSRC = - -# compiler and linker -CC = cc diff --git a/user/.config/suckless/slock/explicit_bzero.c b/user/.config/suckless/slock/explicit_bzero.c deleted file mode 100644 index 3e33ca85b..000000000 --- a/user/.config/suckless/slock/explicit_bzero.c +++ /dev/null @@ -1,19 +0,0 @@ -/* $OpenBSD: explicit_bzero.c,v 1.3 2014/06/21 02:34:26 matthew Exp $ */ -/* - * Public domain. - * Written by Matthew Dempsky. - */ - -#include - -__attribute__((weak)) void -__explicit_bzero_hook(void *buf, size_t len) -{ -} - -void -explicit_bzero(void *buf, size_t len) -{ - memset(buf, 0, len); - __explicit_bzero_hook(buf, len); -} diff --git a/user/.config/suckless/slock/lockscreen.jpg b/user/.config/suckless/slock/lockscreen.jpg deleted file mode 100644 index 7d2f10e5fcf067c32f1e3ead3ffb8e5fdb3d8f75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275735 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

xF7xn8x<&}f8I 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 diff --git a/user/.config/suckless/slock/patchs/slock-background-image-20220318-1c5a538.diff b/user/.config/suckless/slock/patchs/slock-background-image-20220318-1c5a538.diff deleted file mode 100644 index 2d4caf453..000000000 --- a/user/.config/suckless/slock/patchs/slock-background-image-20220318-1c5a538.diff +++ /dev/null @@ -1,149 +0,0 @@ -From 1c5a5383a1cf3351fe9c80a21cfbc98c5ec4355d Mon Sep 17 00:00:00 2001 -From: Yan Doroshenko -Date: Fri, 18 Mar 2022 12:28:13 +0100 -Subject: [PATCH] Provide a way to set a background image - ---- - config.def.h | 5 ++++- - config.mk | 2 +- - slock.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- - 3 files changed, 52 insertions(+), 5 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9855e21..eb88b3d 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -1,6 +1,6 @@ - /* user and group to drop privileges to */ - static const char *user = "nobody"; --static const char *group = "nogroup"; -+static const char *group = "nobody"; - - static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ -@@ -10,3 +10,6 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* Background image path, should be available to the user above */ -+static const char* background_image = ""; -diff --git a/config.mk b/config.mk -index 74429ae..987819e 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2 - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.c b/slock.c -index 5ae738c..345a279 100644 ---- a/slock.c -+++ b/slock.c -@@ -18,6 +18,7 @@ - #include - #include - #include -+#include - - #include "arg.h" - #include "util.h" -@@ -35,6 +36,7 @@ struct lock { - int screen; - Window root, win; - Pixmap pmap; -+ Pixmap bgmap; - unsigned long colors[NUMCOLS]; - }; - -@@ -46,6 +48,8 @@ struct xrandr { - - #include "config.h" - -+Imlib_Image image; -+ - static void - die(const char *errstr, ...) - { -@@ -190,9 +194,10 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); - if (running && oldc != color) { - for (screen = 0; screen < nscreens; screen++) { -- XSetWindowBackground(dpy, -- locks[screen]->win, -- locks[screen]->colors[color]); -+ if (locks[screen]->bgmap) -+ XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); -+ else -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); - XClearWindow(dpy, locks[screen]->win); - } - oldc = color; -@@ -235,6 +240,17 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - lock->screen = screen; - lock->root = RootWindow(dpy, lock->screen); - -+ if(image) -+ { -+ lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); -+ imlib_context_set_display(dpy); -+ imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); -+ imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); -+ imlib_context_set_drawable(lock->bgmap); -+ imlib_render_image_on_drawable(0, 0); -+ imlib_free_image(); -+ } -+ - for (i = 0; i < NUMCOLS; i++) { - XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), - colorname[i], &color, &dummy); -@@ -251,6 +267,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - CopyFromParent, - DefaultVisual(dpy, lock->screen), - CWOverrideRedirect | CWBackPixel, &wa); -+ if(lock->bgmap) -+ XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); - lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); - invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, - &color, &color, 0, 0); -@@ -355,6 +373,32 @@ main(int argc, char **argv) { - if (setuid(duid) < 0) - die("slock: setuid: %s\n", strerror(errno)); - -+ /* Load picture */ -+ Imlib_Image buffer = imlib_load_image(background_image); -+ imlib_context_set_image(buffer); -+ int background_image_width = imlib_image_get_width(); -+ int background_image_height = imlib_image_get_height(); -+ -+ /* Create an image to be rendered */ -+ Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); -+ image = imlib_create_image(scr->width, scr->height); -+ imlib_context_set_image(image); -+ -+ /* Fill the image for every X monitor */ -+ XRRMonitorInfo *monitors; -+ int number_of_monitors; -+ monitors = XRRGetMonitors(dpy, RootWindow(dpy, XScreenNumberOfScreen(scr)), True, &number_of_monitors); -+ -+ int i; -+ for (i = 0; i < number_of_monitors; i++) { -+ imlib_blend_image_onto_image(buffer, 0, 0, 0, background_image_width, background_image_height, monitors[i].x, monitors[i].y, monitors[i].width, monitors[i].height); -+ } -+ -+ /* Clean up */ -+ imlib_context_set_image(buffer); -+ imlib_free_image(); -+ imlib_context_set_image(image); -+ - /* check for Xrandr support */ - rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); - --- -2.35.1 - diff --git a/user/.config/suckless/slock/patchs/slock-colormessage-20200210-35633d4.diff b/user/.config/suckless/slock/patchs/slock-colormessage-20200210-35633d4.diff deleted file mode 100644 index 0ef08474a..000000000 --- a/user/.config/suckless/slock/patchs/slock-colormessage-20200210-35633d4.diff +++ /dev/null @@ -1,284 +0,0 @@ -From 53ba5a8d3608ca9c9c406b12c51c2bfdfb3e01d3 Mon Sep 17 00:00:00 2001 -From: Guy Shefy -Date: Wed, 10 Feb 2021 00:17:46 +0200 -Subject: [PATCH] Add a message command with 24 bit color support - ---- - config.def.h | 9 +++ - config.mk | 2 +- - slock.1 | 7 +++ - slock.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++-- - 4 files changed, 167 insertions(+), 5 deletions(-) - -diff --git a/config.def.h b/config.def.h -index 9855e21..c2a0ab2 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -10,3 +10,12 @@ static const char *colorname[NUMCOLS] = { - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* default message */ -+static const char * message = "Suckless: Software that sucks less."; -+ -+/* text color */ -+static const char * text_color = "#ffffff"; -+ -+/* text size (must be a valid size) */ -+static const char * font_name = "6x10"; -diff --git a/config.mk b/config.mk -index 74429ae..c4ccf66 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lXinerama - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.1 b/slock.1 -index 82cdcd6..946165f 100644 ---- a/slock.1 -+++ b/slock.1 -@@ -6,6 +6,8 @@ - .Sh SYNOPSIS - .Nm - .Op Fl v -+.Op Fl f -+.Op Fl m Ar message - .Op Ar cmd Op Ar arg ... - .Sh DESCRIPTION - .Nm -@@ -16,6 +18,11 @@ is executed after the screen has been locked. - .Bl -tag -width Ds - .It Fl v - Print version information to stdout and exit. -+.It Fl f -+List all valid X fonts and exit. -+.It Fl m Ar message -+Overrides default slock lock message. -+.TP - .El - .Sh SECURITY CONSIDERATIONS - To make sure a locked screen can not be bypassed by switching VTs -diff --git a/slock.c b/slock.c -index 5ae738c..b8b7fe4 100644 ---- a/slock.c -+++ b/slock.c -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -24,6 +25,9 @@ - - char *argv0; - -+/* global count to prevent repeated error messages */ -+int count_error = 0; -+ - enum { - INIT, - INPUT, -@@ -83,6 +87,132 @@ dontkillme(void) - } - #endif - -+static int -+readescapedint(const char *str, int *i) { -+ int n = 0; -+ if (str[*i]) -+ ++*i; -+ while(str[*i] && str[*i] != ';' && str[*i] != 'm') { -+ n = 10 * n + str[*i] - '0'; -+ ++*i; -+ } -+ return n; -+} -+ -+static void -+writemessage(Display *dpy, Window win, int screen) -+{ -+ int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len; -+ XGCValues gr_values; -+ XFontStruct *fontinfo; -+ XColor color, dummy; -+ XineramaScreenInfo *xsi; -+ GC gc; -+ fontinfo = XLoadQueryFont(dpy, font_name); -+ -+ if (fontinfo == NULL) { -+ if (count_error == 0) { -+ fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); -+ fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); -+ count_error++; -+ } -+ return; -+ } -+ -+ tab_size = 8 * XTextWidth(fontinfo, " ", 1); -+ -+ XAllocNamedColor(dpy, DefaultColormap(dpy, screen), -+ text_color, &color, &dummy); -+ -+ gr_values.font = fontinfo->fid; -+ gr_values.foreground = color.pixel; -+ gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); -+ -+ /* To prevent "Uninitialized" warnings. */ -+ xsi = NULL; -+ -+ /* -+ * Start formatting and drawing text -+ */ -+ -+ len = strlen(message); -+ -+ /* Max max line length (cut at '\n') */ -+ line_len = curr_line_len = 0; -+ k = 0; -+ for (i = 0; i < len; i++) { -+ if (message[i] == '\n') { -+ curr_line_len = 0; -+ k++; -+ } else if (message[i] == 0x1b) { -+ while (i < len && message[i] != 'm') { -+ i++; -+ } -+ if (i == len) -+ die("slock: unclosed escape sequence\n"); -+ } else { -+ curr_line_len += XTextWidth(fontinfo, message + i, 1); -+ if (curr_line_len > line_len) -+ line_len = curr_line_len; -+ } -+ } -+ /* If there is only one line */ -+ if (line_len == 0) -+ line_len = len; -+ -+ if (XineramaIsActive(dpy)) { -+ xsi = XineramaQueryScreens(dpy, &i); -+ s_width = xsi[0].width; -+ s_height = xsi[0].height; -+ } else { -+ s_width = DisplayWidth(dpy, screen); -+ s_height = DisplayHeight(dpy, screen); -+ } -+ height = s_height*3/7 - (k*20)/3; -+ width = (s_width - line_len)/2; -+ -+ line_len = 0; -+ /* print the text while parsing 24 bit color ANSI escape codes*/ -+ for (i = k = 0; i < len; i++) { -+ switch (message[i]) { -+ case '\n': -+ line_len = 0; -+ while (message[i + 1] == '\t') { -+ line_len += tab_size; -+ i++; -+ } -+ k++; -+ break; -+ case 0x1b: -+ i++; -+ if (message[i] == '[') { -+ escaped_int = readescapedint(message, &i); -+ if (escaped_int == 39) -+ continue; -+ if (escaped_int != 38) -+ die("slock: unknown escape sequence%d\n", escaped_int); -+ if (readescapedint(message, &i) != 2) -+ die("slock: only 24 bit color supported\n"); -+ r = readescapedint(message, &i) & 0xff; -+ g = readescapedint(message, &i) & 0xff; -+ b = readescapedint(message, &i) & 0xff; -+ XSetForeground(dpy, gc, r << 16 | g << 8 | b); -+ } else -+ die("slock: unknown escape sequence\n"); -+ break; -+ default: -+ XDrawString(dpy, win, gc, width + line_len, height + 20 * k, message + i, 1); -+ line_len += XTextWidth(fontinfo, message + i, 1); -+ } -+ } -+ -+ /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ -+ if (XineramaIsActive(dpy) && xsi != NULL) -+ XFree(xsi); -+} -+ -+ -+ - static const char * - gethash(void) - { -@@ -194,6 +324,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - locks[screen]->win, - locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); -+ writemessage(dpy, locks[screen]->win, screen); - } - oldc = color; - } -@@ -300,7 +431,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) - static void - usage(void) - { -- die("usage: slock [-v] [cmd [arg ...]]\n"); -+ die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); - } - - int -@@ -313,12 +444,25 @@ main(int argc, char **argv) { - gid_t dgid; - const char *hash; - Display *dpy; -- int s, nlocks, nscreens; -+ int i, s, nlocks, nscreens; -+ int count_fonts; -+ char **font_names; - - ARGBEGIN { - case 'v': - fprintf(stderr, "slock-"VERSION"\n"); - return 0; -+ case 'm': -+ message = EARGF(usage()); -+ break; -+ case 'f': -+ if (!(dpy = XOpenDisplay(NULL))) -+ die("slock: cannot open display\n"); -+ font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts); -+ for (i=0; iwin, s); - nlocks++; -- else -+ } else { - break; -+ } - } - XSync(dpy, 0); - --- -2.30.0 - diff --git a/user/.config/suckless/slock/patchs/slock-pam_auth-20190207-35633d4.diff b/user/.config/suckless/slock/patchs/slock-pam_auth-20190207-35633d4.diff deleted file mode 100644 index 136f4b57a..000000000 --- a/user/.config/suckless/slock/patchs/slock-pam_auth-20190207-35633d4.diff +++ /dev/null @@ -1,154 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index 9855e21..19e7f62 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -6,7 +6,11 @@ static const char *colorname[NUMCOLS] = { - [INIT] = "black", /* after initialization */ - [INPUT] = "#005577", /* during input */ - [FAILED] = "#CC3333", /* wrong password */ -+ [PAM] = "#9400D3", /* waiting for PAM */ - }; - - /* treat a cleared input like a wrong password (color) */ - static const int failonclear = 1; -+ -+/* PAM service that's used for authentication */ -+static const char* pam_service = "login"; -diff --git a/config.mk b/config.mk -index 74429ae..6e82074 100644 ---- a/config.mk -+++ b/config.mk -@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib - - # includes and libs - INCS = -I. -I/usr/include -I${X11INC} --LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lpam - - # flags - CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H -diff --git a/slock.c b/slock.c -index 5ae738c..3a8da42 100644 ---- a/slock.c -+++ b/slock.c -@@ -18,16 +18,22 @@ - #include - #include - #include -+#include -+#include - - #include "arg.h" - #include "util.h" - - char *argv0; -+static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -+struct pam_conv pamc = {pam_conv, NULL}; -+char passwd[256]; - - enum { - INIT, - INPUT, - FAILED, -+ PAM, - NUMCOLS - }; - -@@ -57,6 +63,31 @@ die(const char *errstr, ...) - exit(1); - } - -+static int -+pam_conv(int num_msg, const struct pam_message **msg, -+ struct pam_response **resp, void *appdata_ptr) -+{ -+ int retval = PAM_CONV_ERR; -+ for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && -+ strncmp(msg[i]->msg, "Password: ", 10) == 0) { -+ struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); -+ if (!resp_msg) -+ die("malloc failed\n"); -+ char *password = malloc(strlen(passwd) + 1); -+ if (!password) -+ die("malloc failed\n"); -+ memset(password, 0, strlen(passwd) + 1); -+ strcpy(password, passwd); -+ resp_msg->resp_retcode = 0; -+ resp_msg->resp = password; -+ resp[i] = resp_msg; -+ retval = PAM_SUCCESS; -+ } -+ } -+ return retval; -+} -+ - #ifdef __linux__ - #include - #include -@@ -121,6 +152,8 @@ gethash(void) - } - #endif /* HAVE_SHADOW_H */ - -+ /* pam, store user name */ -+ hash = pw->pw_name; - return hash; - } - -@@ -129,11 +162,12 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash) - { - XRRScreenChangeNotifyEvent *rre; -- char buf[32], passwd[256], *inputhash; -- int num, screen, running, failure, oldc; -+ char buf[32]; -+ int num, screen, running, failure, oldc, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; -+ pam_handle_t *pamh; - - len = 0; - running = 1; -@@ -160,10 +194,26 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - case XK_Return: - passwd[len] = '\0'; - errno = 0; -- if (!(inputhash = crypt(passwd, hash))) -- fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); -+ retval = pam_start(pam_service, hash, &pamc, &pamh); -+ color = PAM; -+ for (screen = 0; screen < nscreens; screen++) { -+ XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); -+ XClearWindow(dpy, locks[screen]->win); -+ XRaiseWindow(dpy, locks[screen]->win); -+ } -+ XSync(dpy, False); -+ -+ if (retval == PAM_SUCCESS) -+ retval = pam_authenticate(pamh, 0); -+ if (retval == PAM_SUCCESS) -+ retval = pam_acct_mgmt(pamh, 0); -+ -+ running = 1; -+ if (retval == PAM_SUCCESS) -+ running = 0; - else -- running = !!strcmp(inputhash, hash); -+ fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); -+ pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; -@@ -339,10 +389,9 @@ main(int argc, char **argv) { - dontkillme(); - #endif - -+ /* the contents of hash are used to transport the current user name */ - hash = gethash(); - errno = 0; -- if (!crypt("", hash)) -- die("slock: crypt: %s\n", strerror(errno)); - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); diff --git a/user/.config/suckless/slock/slock.1 b/user/.config/suckless/slock/slock.1 deleted file mode 100644 index 946165fa0..000000000 --- a/user/.config/suckless/slock/slock.1 +++ /dev/null @@ -1,46 +0,0 @@ -.Dd 2016-08-23 -.Dt SLOCK 1 -.Sh NAME -.Nm slock -.Nd simple X screen locker -.Sh SYNOPSIS -.Nm -.Op Fl v -.Op Fl f -.Op Fl m Ar message -.Op Ar cmd Op Ar arg ... -.Sh DESCRIPTION -.Nm -is a simple X screen locker. If provided, -.Ar cmd Op Ar arg ... -is executed after the screen has been locked. -.Sh OPTIONS -.Bl -tag -width Ds -.It Fl v -Print version information to stdout and exit. -.It Fl f -List all valid X fonts and exit. -.It Fl m Ar message -Overrides default slock lock message. -.TP -.El -.Sh SECURITY CONSIDERATIONS -To make sure a locked screen can not be bypassed by switching VTs -or killing the X server with Ctrl+Alt+Backspace, it is recommended -to disable both in -.Xr xorg.conf 5 -for maximum security: -.Bd -literal -offset left -Section "ServerFlags" - Option "DontVTSwitch" "True" - Option "DontZap" "True" -EndSection -.Ed -.Sh EXAMPLES -$ -.Nm -/usr/sbin/s2ram -.Sh CUSTOMIZATION -.Nm -can be customized by creating a custom config.h from config.def.h and -(re)compiling the source code. This keeps it fast, secure and simple. diff --git a/user/.config/suckless/slock/slock.c b/user/.config/suckless/slock/slock.c deleted file mode 100644 index ab6040b43..000000000 --- a/user/.config/suckless/slock/slock.c +++ /dev/null @@ -1,635 +0,0 @@ -/* See LICENSE file for license details. */ -#define _XOPEN_SOURCE 500 -#if HAVE_SHADOW_H -#include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "arg.h" -#include "util.h" - -char *argv0; - -static int pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); -struct pam_conv pamc = {pam_conv, NULL}; -char passwd[256]; - -/* global count to prevent repeated error messages */ -int count_error = 0; - -enum { - INIT, - INPUT, - FAILED, - PAM, - NUMCOLS -}; - -struct lock { - int screen; - Window root, win; - Pixmap pmap; - Pixmap bgmap; - unsigned long colors[NUMCOLS]; -}; - -struct xrandr { - int active; - int evbase; - int errbase; -}; - -#include "config.h" - -Imlib_Image image; - -static void -die(const char *errstr, ...) -{ - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(1); -} - -static int -pam_conv(int num_msg, const struct pam_message **msg, - struct pam_response **resp, void *appdata_ptr) -{ - int retval = PAM_CONV_ERR; - for(int i=0; imsg_style == PAM_PROMPT_ECHO_OFF && - strncmp(msg[i]->msg, "Password: ", 10) == 0) { - struct pam_response *resp_msg = malloc(sizeof(struct pam_response)); - if (!resp_msg) - die("malloc failed\n"); - char *password = malloc(strlen(passwd) + 1); - if (!password) - die("malloc failed\n"); - memset(password, 0, strlen(passwd) + 1); - strcpy(password, passwd); - resp_msg->resp_retcode = 0; - resp_msg->resp = password; - resp[i] = resp_msg; - retval = PAM_SUCCESS; - } - } - return retval; -} - -#ifdef __linux__ -#include -#include - -static void -dontkillme(void) -{ - FILE *f; - const char oomfile[] = "/proc/self/oom_score_adj"; - - if (!(f = fopen(oomfile, "w"))) { - if (errno == ENOENT) - return; - die("slock: fopen %s: %s\n", oomfile, strerror(errno)); - } - fprintf(f, "%d", OOM_SCORE_ADJ_MIN); - if (fclose(f)) { - if (errno == EACCES) - die("slock: unable to disable OOM killer. " - "Make sure to suid or sgid slock.\n"); - else - die("slock: fclose %s: %s\n", oomfile, strerror(errno)); - } -} -#endif - -static int -readescapedint(const char *str, int *i) { - int n = 0; - if (str[*i]) - ++*i; - while(str[*i] && str[*i] != ';' && str[*i] != 'm') { - n = 10 * n + str[*i] - '0'; - ++*i; - } - return n; -} - -static void -writemessage(Display *dpy, Window win, int screen) -{ - int len, line_len, width, height, s_width, s_height, i, k, tab_size, r, g, b, escaped_int, curr_line_len; - XGCValues gr_values; - XFontStruct *fontinfo; - XColor color, dummy; - XineramaScreenInfo *xsi; - GC gc; - fontinfo = XLoadQueryFont(dpy, font_name); - - if (fontinfo == NULL) { - if (count_error == 0) { - fprintf(stderr, "slock: Unable to load font \"%s\"\n", font_name); - fprintf(stderr, "slock: Try listing fonts with 'slock -f'\n"); - count_error++; - } - return; - } - - tab_size = 8 * XTextWidth(fontinfo, " ", 1); - - XAllocNamedColor(dpy, DefaultColormap(dpy, screen), - text_color, &color, &dummy); - - gr_values.font = fontinfo->fid; - gr_values.foreground = color.pixel; - gc=XCreateGC(dpy,win,GCFont+GCForeground, &gr_values); - - /* To prevent "Uninitialized" warnings. */ - xsi = NULL; - - /* - * Start formatting and drawing text - */ - - len = strlen(message); - - /* Max max line length (cut at '\n') */ - line_len = curr_line_len = 0; - k = 0; - for (i = 0; i < len; i++) { - if (message[i] == '\n') { - curr_line_len = 0; - k++; - } else if (message[i] == 0x1b) { - while (i < len && message[i] != 'm') { - i++; - } - if (i == len) - die("slock: unclosed escape sequence\n"); - } else { - curr_line_len += XTextWidth(fontinfo, message + i, 1); - if (curr_line_len > line_len) - line_len = curr_line_len; - } - } - /* If there is only one line */ - if (line_len == 0) - line_len = len; - - if (XineramaIsActive(dpy)) { - xsi = XineramaQueryScreens(dpy, &i); - s_width = xsi[0].width; - s_height = xsi[0].height; - } else { - s_width = DisplayWidth(dpy, screen); - s_height = DisplayHeight(dpy, screen); - } - height = s_height*3/7 - (k*20)/3; - width = (s_width - line_len)/2; - - line_len = 0; - /* print the text while parsing 24 bit color ANSI escape codes*/ - for (i = k = 0; i < len; i++) { - switch (message[i]) { - case '\n': - line_len = 0; - while (message[i + 1] == '\t') { - line_len += tab_size; - i++; - } - k++; - break; - case 0x1b: - i++; - if (message[i] == '[') { - escaped_int = readescapedint(message, &i); - if (escaped_int == 39) - continue; - if (escaped_int != 38) - die("slock: unknown escape sequence%d\n", escaped_int); - if (readescapedint(message, &i) != 2) - die("slock: only 24 bit color supported\n"); - r = readescapedint(message, &i) & 0xff; - g = readescapedint(message, &i) & 0xff; - b = readescapedint(message, &i) & 0xff; - XSetForeground(dpy, gc, r << 16 | g << 8 | b); - } else - die("slock: unknown escape sequence\n"); - break; - default: - XDrawString(dpy, win, gc, width + line_len, height + 20 * k, message + i, 1); - line_len += XTextWidth(fontinfo, message + i, 1); - } - } - - /* xsi should not be NULL anyway if Xinerama is active, but to be safe */ - if (XineramaIsActive(dpy) && xsi != NULL) - XFree(xsi); -} - - - -static const char * -gethash(void) -{ - const char *hash; - struct passwd *pw; - - /* Check if the current user has a password entry */ - errno = 0; - if (!(pw = getpwuid(getuid()))) { - if (errno) - die("slock: getpwuid: %s\n", strerror(errno)); - else - die("slock: cannot retrieve password entry\n"); - } - hash = pw->pw_passwd; - -#if HAVE_SHADOW_H - if (!strcmp(hash, "x")) { - struct spwd *sp; - if (!(sp = getspnam(pw->pw_name))) - die("slock: getspnam: cannot retrieve shadow entry. " - "Make sure to suid or sgid slock.\n"); - hash = sp->sp_pwdp; - } -#else - if (!strcmp(hash, "*")) { -#ifdef __OpenBSD__ - if (!(pw = getpwuid_shadow(getuid()))) - die("slock: getpwnam_shadow: cannot retrieve shadow entry. " - "Make sure to suid or sgid slock.\n"); - hash = pw->pw_passwd; -#else - die("slock: getpwuid: cannot retrieve shadow entry. " - "Make sure to suid or sgid slock.\n"); -#endif /* __OpenBSD__ */ - } -#endif /* HAVE_SHADOW_H */ - - /* pam, store user name */ - hash = pw->pw_name; - return hash; -} - -static void -readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, - const char *hash) -{ - XRRScreenChangeNotifyEvent *rre; - char buf[32]; - int num, screen, running, failure, oldc, retval; - unsigned int len, color; - KeySym ksym; - XEvent ev; - pam_handle_t *pamh; - - len = 0; - running = 1; - failure = 0; - oldc = INIT; - - while (running && !XNextEvent(dpy, &ev)) { - if (ev.type == KeyPress) { - explicit_bzero(&buf, sizeof(buf)); - num = XLookupString(&ev.xkey, buf, sizeof(buf), &ksym, 0); - if (IsKeypadKey(ksym)) { - if (ksym == XK_KP_Enter) - ksym = XK_Return; - else if (ksym >= XK_KP_0 && ksym <= XK_KP_9) - ksym = (ksym - XK_KP_0) + XK_0; - } - if (IsFunctionKey(ksym) || - IsKeypadKey(ksym) || - IsMiscFunctionKey(ksym) || - IsPFKey(ksym) || - IsPrivateKeypadKey(ksym)) - continue; - switch (ksym) { - case XK_Return: - passwd[len] = '\0'; - errno = 0; - retval = pam_start(pam_service, hash, &pamc, &pamh); - color = PAM; - for (screen = 0; screen < nscreens; screen++) { - XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); - XClearWindow(dpy, locks[screen]->win); - XRaiseWindow(dpy, locks[screen]->win); - } - XSync(dpy, False); - - if (retval == PAM_SUCCESS) - retval = pam_authenticate(pamh, 0); - if (retval == PAM_SUCCESS) - retval = pam_acct_mgmt(pamh, 0); - - running = 1; - if (retval == PAM_SUCCESS) - running = 0; - else - fprintf(stderr, "slock: %s\n", pam_strerror(pamh, retval)); - pam_end(pamh, retval); - if (running) { - XBell(dpy, 100); - failure = 1; - } - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - break; - case XK_Escape: - explicit_bzero(&passwd, sizeof(passwd)); - len = 0; - break; - case XK_BackSpace: - if (len) - passwd[--len] = '\0'; - break; - default: - if (num && !iscntrl((int)buf[0]) && - (len + num < sizeof(passwd))) { - memcpy(passwd + len, buf, num); - len += num; - } - break; - } - color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); - if (running && oldc != color) { - for (screen = 0; screen < nscreens; screen++) { - if (locks[screen]->bgmap) - XSetWindowBackgroundPixmap(dpy, locks[screen]->win, locks[screen]->bgmap); - else - XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]); - XClearWindow(dpy, locks[screen]->win); - writemessage(dpy, locks[screen]->win, screen); - } - oldc = color; - } - } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { - rre = (XRRScreenChangeNotifyEvent*)&ev; - for (screen = 0; screen < nscreens; screen++) { - if (locks[screen]->win == rre->window) { - if (rre->rotation == RR_Rotate_90 || - rre->rotation == RR_Rotate_270) - XResizeWindow(dpy, locks[screen]->win, - rre->height, rre->width); - else - XResizeWindow(dpy, locks[screen]->win, - rre->width, rre->height); - XClearWindow(dpy, locks[screen]->win); - break; - } - } - } else { - for (screen = 0; screen < nscreens; screen++) - XRaiseWindow(dpy, locks[screen]->win); - } - } -} - -static struct lock * -lockscreen(Display *dpy, struct xrandr *rr, int screen) -{ - char curs[] = {0, 0, 0, 0, 0, 0, 0, 0}; - int i, ptgrab, kbgrab; - struct lock *lock; - XColor color, dummy; - XSetWindowAttributes wa; - Cursor invisible; - - if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock)))) - return NULL; - - lock->screen = screen; - lock->root = RootWindow(dpy, lock->screen); - - if(image) - { - lock->bgmap = XCreatePixmap(dpy, lock->root, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen), DefaultDepth(dpy, lock->screen)); - imlib_context_set_display(dpy); - imlib_context_set_visual(DefaultVisual(dpy, lock->screen)); - imlib_context_set_colormap(DefaultColormap(dpy, lock->screen)); - imlib_context_set_drawable(lock->bgmap); - imlib_render_image_on_drawable(0, 0); - imlib_free_image(); - } - - for (i = 0; i < NUMCOLS; i++) { - XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), - colorname[i], &color, &dummy); - lock->colors[i] = color.pixel; - } - - /* init */ - wa.override_redirect = 1; - wa.background_pixel = lock->colors[INIT]; - lock->win = XCreateWindow(dpy, lock->root, 0, 0, - DisplayWidth(dpy, lock->screen), - DisplayHeight(dpy, lock->screen), - 0, DefaultDepth(dpy, lock->screen), - CopyFromParent, - DefaultVisual(dpy, lock->screen), - CWOverrideRedirect | CWBackPixel, &wa); - if(lock->bgmap) - XSetWindowBackgroundPixmap(dpy, lock->win, lock->bgmap); - lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8); - invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, - &color, &color, 0, 0); - XDefineCursor(dpy, lock->win, invisible); - - /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ - for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { - if (ptgrab != GrabSuccess) { - ptgrab = XGrabPointer(dpy, lock->root, False, - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask, GrabModeAsync, - GrabModeAsync, None, invisible, CurrentTime); - } - if (kbgrab != GrabSuccess) { - kbgrab = XGrabKeyboard(dpy, lock->root, True, - GrabModeAsync, GrabModeAsync, CurrentTime); - } - - /* input is grabbed: we can lock the screen */ - if (ptgrab == GrabSuccess && kbgrab == GrabSuccess) { - XMapRaised(dpy, lock->win); - if (rr->active) - XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask); - - XSelectInput(dpy, lock->root, SubstructureNotifyMask); - return lock; - } - - /* retry on AlreadyGrabbed but fail on other errors */ - if ((ptgrab != AlreadyGrabbed && ptgrab != GrabSuccess) || - (kbgrab != AlreadyGrabbed && kbgrab != GrabSuccess)) - break; - - usleep(100000); - } - - /* we couldn't grab all input: fail out */ - if (ptgrab != GrabSuccess) - fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", - screen); - if (kbgrab != GrabSuccess) - fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", - screen); - return NULL; -} - -static void -usage(void) -{ - die("usage: slock [-v] [-f] [-m message] [cmd [arg ...]]\n"); -} - -int -main(int argc, char **argv) { - struct xrandr rr; - struct lock **locks; - struct passwd *pwd; - struct group *grp; - uid_t duid; - gid_t dgid; - const char *hash; - Display *dpy; - int i, s, nlocks, nscreens; - int count_fonts; - char **font_names; - - ARGBEGIN { - case 'v': - fprintf(stderr, "slock-"VERSION"\n"); - return 0; - case 'm': - message = EARGF(usage()); - break; - case 'f': - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); - font_names = XListFonts(dpy, "*", 10000 /* list 10000 fonts*/, &count_fonts); - for (i=0; ipw_uid; - errno = 0; - if (!(grp = getgrnam(group))) - die("slock: getgrnam %s: %s\n", group, - errno ? strerror(errno) : "group entry not found"); - dgid = grp->gr_gid; - -#ifdef __linux__ - dontkillme(); -#endif - - /* the contents of hash are used to transport the current user name */ - hash = gethash(); - errno = 0; - - if (!(dpy = XOpenDisplay(NULL))) - die("slock: cannot open display\n"); - - /* drop privileges */ - if (setgroups(0, NULL) < 0) - die("slock: setgroups: %s\n", strerror(errno)); - if (setgid(dgid) < 0) - die("slock: setgid: %s\n", strerror(errno)); - if (setuid(duid) < 0) - die("slock: setuid: %s\n", strerror(errno)); - - /* Load picture */ - Imlib_Image buffer = imlib_load_image(background_image); - imlib_context_set_image(buffer); - int background_image_width = imlib_image_get_width(); - int background_image_height = imlib_image_get_height(); - - /* Create an image to be rendered */ - Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy)); - image = imlib_create_image(scr->width, scr->height); - imlib_context_set_image(image); - - /* Fill the image for every X monitor */ - XRRMonitorInfo *monitors; - int number_of_monitors; - monitors = XRRGetMonitors(dpy, RootWindow(dpy, XScreenNumberOfScreen(scr)), True, &number_of_monitors); - - int e; - for (e = 0; e < number_of_monitors; e++) { - imlib_blend_image_onto_image(buffer, 0, 0, 0, background_image_width, background_image_height, monitors[e].x, monitors[e].y, monitors[e].width, monitors[e].height); - } - - /* Clean up */ - imlib_context_set_image(buffer); - imlib_free_image(); - imlib_context_set_image(image); - - /* check for Xrandr support */ - rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); - - /* get number of screens in display "dpy" and blank them */ - nscreens = ScreenCount(dpy); - if (!(locks = calloc(nscreens, sizeof(struct lock *)))) - die("slock: out of memory\n"); - for (nlocks = 0, s = 0; s < nscreens; s++) { - if ((locks[s] = lockscreen(dpy, &rr, s)) != NULL) { - writemessage(dpy, locks[s]->win, s); - nlocks++; - } else { - break; - } - } - XSync(dpy, 0); - - /* did we manage to lock everything? */ - if (nlocks != nscreens) - return 1; - - /* run post-lock command */ - if (argc > 0) { - switch (fork()) { - case -1: - die("slock: fork failed: %s\n", strerror(errno)); - case 0: - if (close(ConnectionNumber(dpy)) < 0) - die("slock: close: %s\n", strerror(errno)); - execvp(argv[0], argv); - fprintf(stderr, "slock: execvp %s: %s\n", argv[0], strerror(errno)); - _exit(1); - } - } - - /* everything is now blank. Wait for the correct password */ - readpw(dpy, &rr, locks, nscreens, hash); - - return 0; -} diff --git a/user/.config/suckless/slock/util.h b/user/.config/suckless/slock/util.h deleted file mode 100644 index 6f748b890..000000000 --- a/user/.config/suckless/slock/util.h +++ /dev/null @@ -1,2 +0,0 @@ -#undef explicit_bzero -void explicit_bzero(void *, size_t); diff --git a/user/.config/user-dirs.dirs b/user/.config/user-dirs.dirs deleted file mode 100644 index 46a4d7e73..000000000 --- a/user/.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/temporal" -XDG_DOWNLOAD_DIR="$HOME/downloads" -XDG_TEMPLATES_DIR="$HOME/documents/templates" -XDG_PUBLICSHARE_DIR="$HOME/public" -XDG_DOCUMENTS_DIR="$HOME/documents" -XDG_MUSIC_DIR="$HOME/music" -XDG_PICTURES_DIR="$HOME/pictures" -XDG_VIDEOS_DIR="$HOME/videos" diff --git a/user/.config/vifm/colors/Default.vifm b/user/.config/vifm/colors/Default.vifm deleted file mode 100644 index 1647f96c3..000000000 --- a/user/.config/vifm/colors/Default.vifm +++ /dev/null @@ -1,87 +0,0 @@ -" You can edit this file by hand. -" The " character at the beginning of a line comments out the line. -" Blank lines are ignored. - -" The Default color scheme is used for any directory that does not have -" a specified scheme and for parts of user interface like menus. A -" color scheme set for a base directory will also -" be used for the sub directories. - -" The standard ncurses colors are: -" Default = -1 = None, can be used for transparency or default color -" Black = 0 -" Red = 1 -" Green = 2 -" Yellow = 3 -" Blue = 4 -" Magenta = 5 -" Cyan = 6 -" White = 7 - -" Light versions of colors are also available (they set bold -" attribute in terminals with less than 16 colors): -" LightBlack -" LightRed -" LightGreen -" LightYellow -" LightBlue -" LightMagenta -" LightCyan -" LightWhite - -" Available attributes (some of them can be combined): -" bold -" underline -" reverse or inverse -" standout -" italic (on unsupported systems becomes reverse) -" combine -" none - -" Vifm supports 256 colors you can use color numbers 0-255 -" (requires properly set up terminal: set your TERM environment variable -" (directly or using resources) to some color terminal name (e.g. -" xterm-256color) from /usr/lib/terminfo/; you can check current number -" of colors in your terminal with tput colors command) - -" highlight group cterm=attrs ctermfg=foreground_color ctermbg=background_color - -highlight clear - -highlight Win cterm=none ctermfg=white ctermbg=black -highlight Directory cterm=bold ctermfg=cyan ctermbg=default -highlight Link cterm=bold ctermfg=yellow ctermbg=default -highlight BrokenLink cterm=bold ctermfg=red ctermbg=default -highlight HardLink cterm=none ctermfg=yellow ctermbg=default -highlight Socket cterm=bold ctermfg=magenta ctermbg=default -highlight Device cterm=bold ctermfg=red ctermbg=default -highlight Fifo cterm=bold ctermfg=cyan ctermbg=default -highlight Executable cterm=bold ctermfg=green ctermbg=default -highlight Selected cterm=bold ctermfg=magenta ctermbg=default -highlight CurrLine cterm=bold,reverse ctermfg=default ctermbg=default -highlight TopLine cterm=none ctermfg=black ctermbg=white -highlight TopLineSel cterm=bold ctermfg=black ctermbg=default -highlight StatusLine cterm=bold ctermfg=black ctermbg=white -highlight WildMenu cterm=underline,reverse ctermfg=white ctermbg=black -highlight CmdLine cterm=none ctermfg=white ctermbg=black -highlight ErrorMsg cterm=none ctermfg=red ctermbg=black -highlight Border cterm=none ctermfg=black ctermbg=white -highlight OtherLine ctermfg=default ctermbg=default -highlight JobLine cterm=bold,reverse ctermfg=black ctermbg=white -highlight SuggestBox cterm=bold ctermfg=default ctermbg=default -highlight CmpMismatch cterm=bold ctermfg=white ctermbg=red -highlight AuxWin ctermfg=default ctermbg=default -highlight TabLine cterm=none ctermfg=white ctermbg=black -highlight TabLineSel cterm=bold,reverse ctermfg=default ctermbg=default -highlight User1 ctermfg=default ctermbg=default -highlight User2 ctermfg=default ctermbg=default -highlight User3 ctermfg=default ctermbg=default -highlight User4 ctermfg=default ctermbg=default -highlight User5 ctermfg=default ctermbg=default -highlight User6 ctermfg=default ctermbg=default -highlight User7 ctermfg=default ctermbg=default -highlight User8 ctermfg=default ctermbg=default -highlight User9 ctermfg=default ctermbg=default -highlight OtherWin ctermfg=default ctermbg=default -highlight LineNr ctermfg=default ctermbg=default -highlight OddLine ctermfg=default ctermbg=default diff --git a/new-config/.config/vifm/colors/gruvbox-dark.vifm b/user/.config/vifm/colors/gruvbox-dark.vifm similarity index 100% rename from new-config/.config/vifm/colors/gruvbox-dark.vifm rename to user/.config/vifm/colors/gruvbox-dark.vifm diff --git a/user/.config/vifm/scripts/README b/user/.config/vifm/scripts/README deleted file mode 100644 index 769495228..000000000 --- a/user/.config/vifm/scripts/README +++ /dev/null @@ -1,6 +0,0 @@ -This directory is dedicated for user-supplied scripts/executables. -vifm modifies its PATH environment variable to let user run those -scripts without specifying full path. All subdirectories are added -as well. File in a subdirectory overrules file with the same name -in parent directories. Restart might be needed to recognize files -in newly created or renamed subdirectories. \ No newline at end of file diff --git a/user/.config/vifm/scripts/vifmimg b/user/.config/vifm/scripts/vifmimg deleted file mode 100755 index e5d8763a0..000000000 --- a/user/.config/vifm/scripts/vifmimg +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env bash -readonly ID_PREVIEW="preview" - -#AUTO_REMOVE="yes" -# By enabling this option the script will remove the preview file after it is drawn -# and by doing so the preview will always be up-to-date with the file. -# This however, requires more CPU and therefore affects the overall performance. - -if [ -e "$FIFO_UEBERZUG" ]; then - if [[ "$1" == "draw" ]]; then - declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" - [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ - [path]="${PWD}/$6") \ - > "$FIFO_UEBERZUG" - - elif [[ "$1" == "videopreview" ]]; then - echo -e "Loading preview..\nFile: $6" - [[ ! -d "/tmp${PWD}/$6/" ]] && mkdir -p "/tmp${PWD}/$6/" - [[ ! -f "/tmp${PWD}/$6.png" ]] && ffmpegthumbnailer -i "${PWD}/$6" -o "/tmp${PWD}/$6.png" -s 0 -q 10 - declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" - [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ - [path]="/tmp${PWD}/$6.png") \ - > "$FIFO_UEBERZUG" - - elif [[ "$1" == "gifpreview" ]]; then - echo -e "Loading preview..\nFile: $6" - [[ ! -d "/tmp${PWD}/$6/" ]] && mkdir -p "/tmp${PWD}/$6/" && convert -coalesce "${PWD}/$6" "/tmp${PWD}/$6/$6.png" - for frame in $(ls -1 /tmp${PWD}/$6/$6*.png | sort -V); do - declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" - [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ - [path]="$frame") \ - > "$FIFO_UEBERZUG" - # Sleep between frames to make the animation smooth. - sleep .07 - done - - elif [[ "$1" == "pdfpreview" ]]; then - echo -e "Loading preview..\nFile: $6" - [[ ! -d "/tmp${PWD}/$6/" ]] && mkdir -p "/tmp${PWD}/$6/" - [[ ! -f "/tmp${PWD}/$6.png" ]] && pdftoppm -png -singlefile "$6" "/tmp${PWD}/$6" - declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" - [x]="$2" [y]="$3" [width]="$4" [height]="$5" \ - [path]="/tmp${PWD}/$6.png") \ - > "$FIFO_UEBERZUG" - - elif [[ "$1" == "clear" ]]; then - declare -p -A cmd=([action]=remove [identifier]="$ID_PREVIEW") \ - > "$FIFO_UEBERZUG" - [[ ! -z $AUTO_REMOVE ]] && [[ -f "/tmp${PWD}/$6.png" ]] && rm -f "/tmp${PWD}/$6.png" - [[ ! -z $AUTO_REMOVE ]] && [[ -d "/tmp${PWD}/$6/" ]] && rm -rf "/tmp${PWD}/$6/" - - fi -fi diff --git a/user/.config/vifm/scripts/vifmrun b/user/.config/vifm/scripts/vifmrun deleted file mode 100755 index 9eda32a99..000000000 --- a/user/.config/vifm/scripts/vifmrun +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash -export FIFO_UEBERZUG="/tmp/vifm-ueberzug-${PPID}" - -function cleanup { - rm "$FIFO_UEBERZUG" 2>/dev/null - pkill -P $$ 2>/dev/null -} - -rm "$FIFO_UEBERZUG" 2>/dev/null -mkfifo "$FIFO_UEBERZUG" -trap cleanup EXIT -tail --follow "$FIFO_UEBERZUG" | ueberzug layer --silent --parser bash & - -vifm -cleanup diff --git a/user/.config/vifm/vifmrc b/user/.config/vifm/vifmrc index e7f5c4686..ca5c53ffa 100644 --- a/user/.config/vifm/vifmrc +++ b/user/.config/vifm/vifmrc @@ -13,7 +13,7 @@ " Since emacs is a GUI app and not a terminal app like vim, append the command " with an ampersand (&). -set vicmd=nvim +set vicmd=~/.local/bin/lvim " This makes vifm perform file operations on its own instead of relying on " standard utilities like `cp`. While using `cp` and alike is a more universal @@ -65,7 +65,7 @@ set norunexec " Selected color scheme " The following line will cause issues if using vifm.vim with regular vim. " Either use neovim or comment out the following line. -colorscheme distrotube +colorscheme gruvbox-dark " Format for displaying time in file list. For example: " TIME_STAMP_FORMAT=%m/%d-%H:%M @@ -175,10 +175,7 @@ command! reload :write | restart " Pdf filextype *.pdf zathura %c %i &, apvlv %c, xpdf %c fileviewer *.pdf - \ vifmimg pdfpreview %px %py %pw %ph %c - \ %pc - \ vifmimg clear - " \ pdftotext -nopgbrk %c - + \ pdftotext -nopgbrk %c - " PostScript filextype *.ps,*.eps,*.ps.gz @@ -210,10 +207,7 @@ filextype *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob, fileviewer *.avi,*.mp4,*.wmv,*.dat,*.3gp,*.ogv,*.mkv,*.mpg,*.mpeg,*.vob, \*.fl[icv],*.m2v,*.mov,*.webm,*.ts,*.mts,*.m4v,*.r[am],*.qt,*.divx, \*.as[fx] - \ vifmimg videopreview %px %py %pw %ph %c - \ %pc - \ vifmimg clear - " \ ffprobe -pretty %c 2>&1 + \ ffprobe -pretty %c 2>&1 " Web filextype *.html,*.htm @@ -238,23 +232,11 @@ fileviewer *.[1-8] man ./%c | col -b " Images filextype *.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm - \ {View in sxiv} - \ sxiv -ia %f &, \ {View in imv} - \ imv -b 1D2330 -d %d &, - \ {View in feh} - \ feh %d &, - \ {View in cacaview} - \ cacaview %c &, -fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.xpm - \ vifmimg draw %px %py %pw %ph %c - \ %pc - \ vifmimg clear -fileviewer *.gif - \ vifmimg gifpreview %px %py %pw %ph %c - \ %pc - \ vifmimg clear - + \ imv %f &, +fileviewer *.bmp,*.jpg,*.jpeg,*.png,*.xpm,*.gif + \ wezterm imgcat --width %pw --height %ph %c:p %pd + " OpenRaster filextype *.ora \ {Edit in MyPaint} diff --git a/new-config/.config/waybar/config b/user/.config/waybar/config similarity index 100% rename from new-config/.config/waybar/config rename to user/.config/waybar/config diff --git a/new-config/.config/waybar/power-profiles b/user/.config/waybar/power-profiles similarity index 100% rename from new-config/.config/waybar/power-profiles rename to user/.config/waybar/power-profiles diff --git a/new-config/.config/waybar/style.css b/user/.config/waybar/style.css similarity index 100% rename from new-config/.config/waybar/style.css rename to user/.config/waybar/style.css diff --git a/user/.config/wezterm/wezterm.lua b/user/.config/wezterm/wezterm.lua index 07af3923b..38be7d68c 100644 --- a/user/.config/wezterm/wezterm.lua +++ b/user/.config/wezterm/wezterm.lua @@ -2,6 +2,7 @@ local wezterm = require 'wezterm' local gpus = wezterm.gui.enumerate_gpus() return { + enable_wayland = true, font = wezterm.font { family = 'mononoki Nerd Font', weight = 'Medium' @@ -9,7 +10,7 @@ return { color_scheme = 'Gruvbox dark, hard (base16)', default_prog = { '/usr/bin/fish' }, default_cursor_style = "BlinkingUnderline", - font_size = 13.5, + font_size = 12, check_for_updates = false, use_dead_keys = false, warn_about_missing_glyphs = false, @@ -28,5 +29,5 @@ return { exit_behavior = "Close", window_close_confirmation = 'NeverPrompt', tab_bar_at_bottom = false, - window_background_opacity = 0.96, + window_background_opacity = 0.9, } diff --git a/new-config/.config/xsettingsd/xsettingsd.conf b/user/.config/xsettingsd/xsettingsd.conf similarity index 100% rename from new-config/.config/xsettingsd/xsettingsd.conf rename to user/.config/xsettingsd/xsettingsd.conf diff --git a/user/.config/zathura/zathurarc b/user/.config/zathura/zathurarc index 86a9afb9c..126e180bb 100644 --- a/user/.config/zathura/zathurarc +++ b/user/.config/zathura/zathurarc @@ -35,7 +35,7 @@ set notification-fg "#458588" #00 set recolor-lightcolor "#262626" #00 set recolor-darkcolor "#ebdbb2" #06 -set recolor "true" +set recolor "false" # setting recolor-keep true will keep any color your pdf has. # if it is false, it'll just be black and white diff --git a/user/.gitconfig b/user/.gitconfig deleted file mode 100644 index f7effc496..000000000 --- a/user/.gitconfig +++ /dev/null @@ -1,4 +0,0 @@ -[user] - mail = misterclay@tutanota.com - name = Clay Gomera - email = misterclay@tutanota.com diff --git a/user/.gtkrc-2.0 b/user/.gtkrc-2.0 deleted file mode 100644 index bdeefb832..000000000 --- a/user/.gtkrc-2.0 +++ /dev/null @@ -1,14 +0,0 @@ -gtk-theme-name="gruvbox-dark-gtk" -gtk-icon-theme-name="gruvbox-dark-icons-gtk" -gtk-font-name="mononoki Nerd Font 10" -gtk-cursor-theme-name="Simp1e-Gruvbox-Dark" -gtk-cursor-theme-size=0 -gtk-toolbar-style=GTK_TOOLBAR_BOTH -gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR -gtk-button-images=1 -gtk-menu-images=1 -gtk-enable-event-sounds=1 -gtk-enable-input-feedback-sounds=1 -gtk-xft-antialias=1 -gtk-xft-hinting=1 -gtk-xft-hintstyle="hintfull" diff --git a/user/.icons/default/index.theme b/user/.icons/default/index.theme index 817baa4cb..27401a6a0 100644 --- a/user/.icons/default/index.theme +++ b/user/.icons/default/index.theme @@ -1,4 +1,4 @@ -# This file is written by LXAppearance. Do not edit. +# This file is written by nwg-look. Do not edit. [Icon Theme] Name=Default Comment=Default Cursor Theme diff --git a/user/.moc/config b/user/.moc/config deleted file mode 100644 index c0d841f97..000000000 --- a/user/.moc/config +++ /dev/null @@ -1,697 +0,0 @@ -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom moc config -## - -# This is a configuration file for the MOC player. It should be named -# 'config' and placed in the ~/.moc directory. As this file can specify -# commands which invoke other applications, MOC will refuse to start if it -# is not owned by either root or the current user, or if it is writable by -# anyone other than its owner. All options are given with their default -# values, and therefore commented. - -# Comments begin with '#'. -# You can use quotes and escape ('\') in parameters. -# -# You can have variable values substituted by enclosing the variable name -# as "${...}". (This only applies to the portion of the option following -# the '='.) Variables are substituted first from the environment then, -# if not found, from the configuration options. (Note that the value of -# a configuration option substituted is that which it has at the time the -# substitution variable is encountered.) If there is a naming conflict -# between an environment and configuration variable, you may be able to -# resolve it by using lowercase as the environment variable matches are -# case-sensitive whereas the configuration variables are not. -# -# You can also use the form "${...:-...}" where the value in the second -# position will be substituted if the variable name given in the first -# position is unset or null. -# -# So, for example: -# -# MusicDir = /music/${USER:-public} -# Fastdir1 = ${MusicDir}/mp3/rock -# Fastdir2 = ${MusicDir}/mp3/electronic -# Fastdir3 = ${MusicDir}/mp3/rap -# Fastdir4 = ${MusicDir}/mp3/etc -# -# Variable names are limited to those accepted by the BASH shell; that -# is, those comprising the upper- and lowercase ASCII characters, digits -# and the underscore. -# -# If you need to use the "${" sequence for any other purpose, write "$${" -# and it will be replaced by "${" and not treated as a substitution. -# -# Some options take lists of strings as their values. The strings are -# separated by colons. Additional strings can be appended to the list -# using "+=" in place of a plain "=" to assign the value. For an example, -# see the XTerms option. -# -# You can override any configuration option when you run MOC using the -# '-O' command line option: -# -# mocp -O AutoNext=no -O messagelingertime=1 -O XTerms+=xxt:xwt -# -# This command line option can be repeated as many times as needed and -# the configuration option name is not case sensitive. (Note that MOC -# does not perform variable substitution on the value of such overridden -# configuration options.) Most option values are set before the -# configuration file is processed (which allows the new values to be -# picked up by substitutions), however list-valued options are overridden -# afterwards (which gives the choice of whether the configured values are -# replaced or added to). - -# Remember that the client and server are separate processes and the -# server will retain the configuration values formed from the environment -# within which it was originally started. - -# Show file titles (title, author, album) instead of file names? -ReadTags = yes - -# In which directory do you store your music files? If you specify it -# you will be able to jump straight to this directory with the '-m' -# parameter or the 'm' command. This can also point to a playlist. -# -# Example: MusicDir = "/home/joe/music" -# -MusicDir = "~/Music" - -# Start in the music directory by default? If set to 'no', start -# in the current directory by default. A single directory on -# the command line takes precedence. -StartInMusicDir = yes - -# How to sort? FileName is the option's only value for now. -#Sort = FileName - -# Show errors in the streams (for example, broken frames in MP3 files)? -#ShowStreamErrors = no - -# Ignore CRC errors in MP3 files? Most players do that, so the default -# value is 'yes'. -#MP3IgnoreCRCErrors = yes - -# Set playback toggles. -#Repeat = no -#Shuffle = no -#AutoNext = yes - -# Default FormatString: -# -# %n - Track number -# %a - Artist -# %A - Album -# %t - Title -# %(X:TRUE:FALSE) - Ternary expression: if X exists, do TRUE, -# otherwise FALSE. The escape character must -# be doubled (i.e., '\\'). (See zshmisc -# documentation for more information.) -# -#FormatString = "%(n:%n :)%(a:%a - :)%(t:%t:)%(A: \(%A\):)" - -# Input and output buffer sizes (in kilobytes). -#InputBuffer = 512 # Minimum value is 32KB -#OutputBuffer = 512 # Minimum value is 128KB - -# How much to fill the input buffer before playing (in kilobytes)? -# This can't be greater than the value of InputBuffer. While this has -# a positive effect for network streams, it also causes the broadcast -# audio to be delayed. -#Prebuffering = 64 - -# Use this HTTP proxy server for internet streams. If not set, the -# environment variables http_proxy and ALL_PROXY will be used if present. -# -# Format: HTTPProxy = PROXY_NAME:PORT -# -#HTTPProxy = - -# Sound driver - OSS, ALSA, JACK, SNDIO (on OpenBSD) or null (only for -# debugging). You can enter more than one driver as a colon-separated -# list. The first working driver will be used. -#SoundDriver = JACK:ALSA:OSS - -# Jack output settings. -#JackClientName = "moc" -#JackStartServer = no -#JackOutLeft = "system:playback_1" -#JackOutRight = "system:playback_2" - -# OSS output settings. -#OSSDevice = /dev/dsp -#OSSMixerDevice = /dev/mixer -#OSSMixerChannel1 = pcm # 'pcm', 'master' or 'speaker' -#OSSMixerChannel2 = master # 'pcm', 'master' or 'speaker' - -# ALSA output settings. If you need to dump the audio produced by MOC -# to a file for diagnostic purposes, the following setting of 'ALSADevice' -# should do that: -# -# ALSADevice=tee:hw,'/tmp/out.wav',wav -# -#ALSADevice = default -#ALSAMixer1 = PCM -#ALSAMixer2 = Master - -# Under some circumstances on 32-bit systems, audio played continously -# for long periods of time may begin to stutter. Setting this option to -# 'yes' will force MOC to avoid ALSA's dmix resampling and prevent this -# stutter. But it also has other implications: -# -# - You may experience unacceptably high CPU load. -# - ALSA's resampler plug-ins will not be used. -# - The resampling may be of lower quality than ALSA would provide. -# - You may need to try different "ResampleMethod" option settings. -# - The "ForceSampleRate" option may be ineffective. -# - If libsamplerate is not configured, many audios may be unplayable. -# -#ALSAStutterDefeat = no - -# Save software mixer state? -# If enabled, a file 'softmixer' will be created in '~/.moc/' storing the -# mixersetting set when the server is shut down. -# Note that there is a "hidden" 'Amplification' setting in that file. -# Amplification (0-200) is used to scale the mixer setting (0-100). This -# results in a higher signal amplitude but may also produce clipping. -#Softmixer_SaveState = yes - -# Save equalizer state? -# If enabled, a file 'equalizer' will be created in '~/.moc/' storing the -# equalizer settings when the server is shut down. -# Note that there is a "hidden" 'Mixin' setting in that file. -# Mixin (0.0-1.0) is used to determine how much of the original signal is -# used after equalizing. 0 means to only use the equalized sound, while 1 -# effectively disabled the mixer. The default is 0.25. -#Equalizer_SaveState = yes - -# Show files with dot at the beginning? -ShowHiddenFiles = no - -# Hide file name extensions? -HideFileExtension = yes - -# Show file format in menu? -ShowFormat = yes - -# Show file time in menu? Possible values: 'yes', 'no' and 'IfAvailable' -# (meaning show the time only when it is already known, which often works -# faster). -ShowTime = yes - -# Show time played as a percentage in the time progress bar. -#ShowTimePercent = no - -# Values of the TERM environment variable which are deemed to be managed by -# screen(1). If you are setting a specific terminal using screen(1)'s -# '-T ' option, then you will need to add 'screen.' to this list. -# Note that this is only a partial test; the value of the WINDOW environment -# variable must also be a number (which screen(1) sets). -#ScreenTerms = screen:screen-w:vt100 - -# Values of the TERM environment variable which are deemed to be xterms. If -# you are using MOC within screen(1) under an xterm, then add screen(1)'s -# TERM setting here as well to cause MOC to update the xterm's title. -#XTerms = xterm -#XTerms += xterm-colour:xterm-color -#XTerms += xterm-256colour:xterm-256color -#XTerms += rxvt:rxvt-unicode -#XTerms += rxvt-unicode-256colour:rxvt-unicode-256color -#XTerms += eterm - -# Theme file to use. This can be absolute path or relative to -# /usr/share/moc/themes/ (depends on installation prefix) or -# ~/.moc/themes/ . -# -# Example: Theme = laras_theme -# -Theme = transparent-background - -# The theme used when running on an xterm. -# -# Example: XTermTheme = transparent-background -# -#XTermTheme = - -# Should MOC try to autoload the default lyrics file for an audio? (The -# default lyrics file is a text file with the same file name as the audio -# file name with any trailing "extension" removed.) -#AutoLoadLyrics = yes - -# MOC directory (where pid file, socket and state files are stored). -# You can use ~ at the beginning. -#MOCDir = ~/.moc - -# Use mmap() to read files. mmap() is much slower on NFS. -#UseMMap = no - -# Use MIME to identify audio files. This can make for slower loading -# of playlists but is more accurate than using "extensions". -#UseMimeMagic = no - -# Assume this encoding for ID3 version 1/1.1 tags (MP3 files). Unlike -# ID3v2, UTF-8 is not used here and MOC can't guess how tags are encoded. -# Another solution is using librcc (see the next option). This option is -# ignored if UseRCC is set to 'yes'. -#ID3v1TagsEncoding = WINDOWS-1250 - -# Use librcc to fix ID3 version 1/1.1 tags encoding. -#UseRCC = yes - -# Use librcc to filenames and directory names encoding. -#UseRCCForFilesystem = yes - -# When this option is set the player assumes that if the encoding of -# ID3v2 is set to ISO-8859-1 then the ID3v1TagsEncoding is actually -# that and applies appropriate conversion. -#EnforceTagsEncoding = no - -# Enable the conversion of filenames from the local encoding to UTF-8. -#FileNamesIconv = no - -# Enable the conversion of the xterm title from UTF-8 to the local encoding. -#NonUTFXterm = no - -# Should MOC precache files to assist gapless playback? -#Precache = yes - -# Remember the playlist after exit? -SavePlaylist = yes - -# When using more than one client (interface) at a time, do they share -# the playlist? -SyncPlaylist = yes - -# Choose a keymap file (relative to '~/.moc/' or using an absolute path). -# An annotated example keymap file is included ('keymap.example'). -# -# Example: Keymap = my_keymap -# -#Keymap = - -# Use ASCII rather than graphic characters for drawing lines. This -# helps on some terminals. -#ASCIILines = no - -# FastDirs, these allow you to jump directly to a directory, the key -# bindings are in the keymap file. -# -# Examples: Fastdir1 = /mp3/rock -# Fastdir2 = /mp3/electronic -# Fastdir3 = /mp3/rap -# Fastdir4 = /mp3/etc -# -#Fastdir1 = -#Fastdir2 = -#Fastdir3 = -#Fastdir4 = -#Fastdir5 = -#Fastdir6 = -#Fastdir7 = -#Fastdir8 = -#Fastdir9 = -#Fastdir10 = - -# How fast to seek (in number of seconds per keystroke). The first -# option is for normal seek and the second for silent seek. -#SeekTime = 1 -#SilentSeekTime = 5 - -# PreferredDecoders allows you to specify which decoder should be used -# for any given audio format. It is a colon-separated list in which -# each entry is of the general form 'code(decoders)', where 'code' -# identifies the audio format and 'decoders' is a comma-separated list -# of decoders in order of preference. -# -# The audio format identifier may be either a filename extension or a -# MIME media type. If the latter, the format is 'type/subtype' (e.g., -# 'audio/flac'). Because different systems may give different MIME -# media types, any 'x-' prefix of the subtype is ignored both here and -# in the actual file MIME type (so all combinations of 'audio/flac' and -# 'audio/x-flac' match each other). -# -# For Internet streams the matching is done on MIME media type and on -# actual content. For files the matches are made on MIME media type -# (if the 'UseMimeMagic' option is set) and on filename extension. The -# MIME media type of a file is not determined until the first entry for -# MIME is encountered in the list. -# -# The matching is done in the order of appearance in the list with any -# entries added from the command line being matched before those listed -# here. Therefore, if you place all filename extension entries before -# all MIME entries you will speed up MOC's processing of directories -# (which could be significant for remote file systems). -# -# The decoder list may be empty, in which case no decoders will be used -# for files (and files with that audio format ignored) while Internet -# streams will be assessed on the actual content. Any decoder position -# may contain an asterisk, in which case any decoder not otherwise listed -# which can handle the audio format will be used. It is not an error to -# list the same decoder twice, but neither does it make sense to do so. -# -# If you have a mix of audio and non-audio files in your directories, you -# may wish to include entries at top of the list which ignore non-audio -# files by extension. -# -# In summary, the PreferredDecoders option provides fine control over the -# type of matching which is performed (filename extension, MIME media -# type and streamed media content) and which decoder(s) (if any) are used -# based on the option's list entries and their ordering. -# -# Examples: aac(aac,ffmpeg) first try FAAD2 for AACs then FFmpeg -# mp3() ignore MP3 files -# wav(*,sndfile) use sndfile for WAV as a last resort -# ogg(vorbis,*):flac(flac,*) try Xiph decoders first -# ogg():audio/ogg() ignore OGG files, and -# force Internet selection by content -# gz():html() ignore some non-audio files -# -# Any unspecified audio formats default to trying all decoders. -# Any unknown (or misspelt) drivers are ignored. -# All names are case insensitive. -# The default setting reflects the historical situation modified by -# the experience of users. -# -#PreferredDecoders = aac(aac,ffmpeg):m4a(ffmpeg) -#PreferredDecoders += mpc(musepack,*,ffmpeg):mpc8(musepack,*,ffmpeg) -#PreferredDecoders += sid(sidplay2):mus(sidplay2) -#PreferredDecoders += wav(sndfile,*,ffmpeg) -#PreferredDecoders += wv(wavpack,*,ffmpeg) -#PreferredDecoders += audio/aac(aac):audio/aacp(aac):audio/m4a(ffmpeg) -#PreferredDecoders += audio/wav(sndfile,*) - -# The following PreferredDecoders attempt to handle the ambiguity surrounding -# container types such as OGG for files. The first two entries will force -# a local file to the correct decoder (assuming the .ogg file contains Vorbis -# audio), while the MIME media types will cause Internet audio streams to -# be assessed on content (which may be either Vorbis or Speex). -# -#PreferredDecoders += ogg(vorbis,ffmpeg):oga(vorbis,ffmpeg):ogv(ffmpeg) -#PreferredDecoders += opus(ffmpeg) -#PreferredDecoders += spx(speex) -#PreferredDecoders += application/ogg(vorbis):audio/ogg(vorbis) - -# Which resampling method to use. There are a few methods of resampling -# sound supported by libresamplerate. The default is 'Linear') which is -# also the fastest. A better description can be found at: -# -# http://www.mega-nerd.com/libsamplerate/api_misc.html#Converters -# -# but briefly, the following methods are based on bandlimited interpolation -# and are higher quality, but also slower: -# -# SincBestQuality - really slow (I know you probably have an xx GHz -# processor, but it's still not enough to not see -# this in the top output :) The worst case -# Signal-to-Noise Ratio is 97dB. -# SincMediumQuality - much faster. -# SincFastest - the fastest bandlimited interpolation. -# -# And these are lower quality, but much faster methods: -# -# ZeroOrderHold - really poor quality, but it's really fast. -# Linear - a bit better and a bit slower. -# -#ResampleMethod = Linear - -# Always use this sample rate (in Hz) when opening the audio device (and -# resample the sound if necessary). When set to 0 the device is opened -# with the file's rate. -#ForceSampleRate = 0 - -# By default, even if the sound card reports that it can output 24bit samples -# MOC converts 24bit PCM to 16bit. Setting this option to 'yes' allows MOC -# to use 24bit output. (The MP3 decoder, for example, uses this format.) -# This is disabled by default because there were reports that it prevents -# MP3 files from playing on some soundcards. -#Allow24bitOutput = no - -# Use realtime priority for output buffer thread. This will prevent gaps -# while playing even with heavy load. The user who runs MOC must have -# permissions to set such a priority. This could be dangerous, because it -# is possible that a bug in MOC will freeze your computer. -#UseRealtimePriority = no - -# The number of audio files for which MOC will cache tags. When this limit -# is reached, file tags are discarded on a least recently used basis (with -# one second resolution). You can disable the cache by giving it a size of -# zero. Note that if you decrease the cache size below the number of items -# currently in the cache, the number will not decrease immediately (if at -# all). -#TagsCacheSize = 256 - -# Number items in the playlist. -PlaylistNumbering = yes - -# Main window layouts can be configured. You can change the position and -# size of the menus (directory and playlist). You have three layouts and -# can switch between then using the 'l' key (standard mapping). By default, -# only two layouts are configured. -# -# The format is as follows: -# -# - Each layout is described as a list of menu entries. -# - Each menu entry is of the form: -# -# menu(position_x, position_y, width, height) -# -# where 'menu' is either 'directory' or 'playlist'. -# - The parameters define position and size of the menu. They can -# be absolute numbers (like 10) or a percentage of the screen size -# (like 45%). -# - 'width' and 'height' can have also value of 'FILL' which means -# fill the screen from the menu's position to the border. -# - Menus may overlap. -# -# You must describe at least one menu (default is to fill the whole window). -# There must be at least one layout (Layout1) defined; others can be empty. -# -# Example: Layout1 = playlist(50%,50%,50%,50%) -# Layout2 = "" -# Layout3 = "" -# -# Just one layout, the directory will occupy the whole -# screen, the playlist will have 1/4 of the screen size -# and be positioned at lower right corner. (Note that -# because the playlist will be hidden by the directory -# you will have to use the TAB key to make the playlist -# visible.) -# -# Example: Layout1 = playlist(0,0,100%,10):directory(0,10,100%,FILL) -# -# The screen is split into two parts: playlist at the top -# and the directory menu at the bottom. Playlist will -# occupy 10 lines and the directory menu the rest. -# -#Layout1 = directory(0,0,50%,100%):playlist(50%,0,FILL,100%) -#Layout2 = directory(0,0,100%,100%):playlist(0,0,100%,100%) -#Layout3 = "" - -# When the song changes, should the menu be scrolled so that the currently -# played file is visible? -#FollowPlayedFile = yes - -# What to do if the interface was started and the server is already playing -# something from the playlist? If CanStartInPlaylist is set to 'yes', the -# interface will switch to the playlist. When set to 'no' it will start -# from the last directory. -#CanStartInPlaylist = yes - -# Executing external commands (1 - 10) invoked with key commands (F1 - F10 -# by default). -# -# Some arguments are substituted before executing: -# -# %f - file path -# %i - title made from tags -# %S - start block mark (in seconds) -# %E - end block mark (in seconds) -# -# Data from tags can also be substituted: -# -# %t - title -# %a - album -# %r - artist -# %n - track -# %m - time of the file (in seconds) -# -# The parameters above apply to the currently selected file. If you change -# them to capital letters, they are taken from the file currently playing. -# -# Programs are run using execv(), not a shell, so you can't do things like -# redirecting the output to a file. The command string is split using blank -# characters as separators; the first element is the command to be executed -# and the rest are its parameters, so if you use "echo Playing: %I" we run -# program 'echo' (from $PATH) with 2 parameters: the string 'Playing:' and -# the title of the file currently playing. Even if the title contains -# spaces, it's still one parameter and it's safe if it contains `rm -rf /`. -# -# Examples: ExecCommand1 = "cp %f /mnt/usb_drive" -# ExecCommand2 = "/home/joe/now_playing %I" -# -#ExecCommand1 = -#ExecCommand2 = -#ExecCommand3 = -#ExecCommand4 = -#ExecCommand5 = -#ExecCommand6 = -#ExecCommand7 = -#ExecCommand8 = -#ExecCommand9 = -#ExecCommand10 = - -# Display the cursor in the line with the selected file. Some braille -# readers (the Handy Tech modular series ZMU 737, for example) use the -# cursor to focus and can make use of it to present the file line even -# when other fields are changing. -#UseCursorSelection = no - -# Set the terminal title when running under xterm. -#SetXtermTitle = yes - -# Set the terminal title when running under screen(1). If MOC can detect -# that it is running under screen(1), then it will set an appropriate -# title (see description of ScreenTerms above). However, if multiple -# levels of screen management are involved, detection might fail and this -# could cause a screen upset. In that situation you can use this option -# to force screen titles off. -#SetScreenTitle = yes - -# Display full paths instead of just file names in the playlist. -#PlaylistFullPaths = yes - -# The following setting describes how block markers are displayed in -# the play time progress bar. Its value is a string of exactly three -# characters. The first character is displayed in a position which -# corresponds to the time marked as the start of a block and the last -# character to the time marked as the end of the block. The middle -# character is displayed instead if both the start and the end of the block -# would fall in the same position (within the resolution of the interface). -# You can turn off the displaying of these block marker positions by using -# three space characters. -#BlockDecorators = "`\"'" - -# How long (in seconds) to leave a message displayed on the screen. -# Setting this to a high value allows you to scroll through the messages -# using the 'hide_message' key. Setting it to zero means you'll have to -# be quick to see any message at all. Any new messages will be queued up -# and displayed after the current message's linger time expires. -#MessageLingerTime = 3 - -# Does MOC display a prefix on delayed messages indicating -# the number of queued messages still to be displayed? -#PrefixQueuedMessages = yes - -# String to append to the queued message count if any -# error messages are still waiting to be displayed. -#ErrorMessagesQueued = "!" - -# Self-describing ModPlug options (with 'yes' or 'no' values). -#ModPlug_Oversampling = yes -#ModPlug_NoiseReduction = yes -#ModPlug_Reverb = no -#ModPlug_MegaBass = no -#ModPlug_Surround = no - -# ModPlug resampling mode. -# Valid values are: -# -# FIR - 8 tap fir filter (extremely high quality) -# SPLINE - Cubic spline interpolation (high quality) -# LINEAR - Linear interpolation (fast, good quality) -# NEAREST - No interpolation (very fast, extremely bad sound quality) -# -#ModPlug_ResamplingMode = FIR - -# Other self-describing ModPlug audio characteristic options. -# (Note that the 32 bit sample size seems to be buggy.) -#ModPlug_Channels = 2 # 1 or 2 channels -#ModPlug_Bits = 16 # 8, 16 or 32 bits -#ModPlug_Frequency = 44100 # 11025, 22050, 44100 or 48000 Hz -#ModPlug_ReverbDepth = 0 # 0 (quiet) to 100 (loud) -#ModPlug_ReverbDelay = 0 # Delay in ms (usually 40-200ms) -#ModPlug_BassAmount = 0 # 0 (quiet) to 100 (loud). -#ModPlug_BassRange = 10 # Cutoff in Hz (10-100). -#ModPlug_SurroundDepth = 0 # Surround level 0(quiet)-100(heavy). -#ModPlug_SurroundDelay = 0 # Surround delay in ms, usually 5-40ms. -#ModPlug_LoopCount = 0 # 0 (never), n (times) or -1 (forever) - -# Self-describing TiMidity audio characteristic options. -#TiMidity_Rate = 44100 # Between 8000 and 48000 -#TiMidity_Bits = 16 # 8 or 16 -#TiMidity_Channels = 2 # 1 or 2 -#TiMidity_Volume = 100 # 0 to 800 - -# You can setup a TiMidity-Config-File here. -# Leave it unset to use library defaults (/etc/timidity.cfg mostly). -# Setting it to 'yes' also uses the library defaults. -# Set it to 'no' if you don't have any configuration file. -# Otherwise set it to the name of a specific file. -#TiMidity_Config = - -# Self-describing SidPlay2 audio characteristic options. -#SidPlay2_DefaultSongLength = 180 # If not in database (in seconds) -#SidPlay2_MinimumSongLength = 0 # Play at least n (in seconds) -#SidPlay2_Frequency = 44100 # 4000 to 48000 -#SidPlay2_Bits = 16 # 8 or 16 -#SidPlay2_Optimisation = 0 # 0 (worst quality) to 2 (best quality) - -# Set path to a HVSC-compatible database (if not set, database is disabled). -#SidPlay2_Database = - -# SidPlay2 playback Mode: -# -# "M": Mono (best for many SIDs) -# "S": Stereo -# "L"/"R": Left / Right -# -#SidPlay2_PlayMode = "M" - -# Use start-song information from SID ('yes') or start at first song -# ('no'). Songs before the start-song won't be played. (Note that this -# option previously took the values 1 and 0; these are now deprecated -# in favour of 'yes' and 'no'.) -#SidPlay2_StartAtStart = yes - -# Play sub-tunes. (Note that this option previously took the values 1 -# and 0; these are now deprecated in favour of 'yes' and 'no'.) -#SidPlay2_PlaySubTunes = yes - -# Run the OnSongChange command when a new song starts playing. -# Specify the full path (i.e. no leading '~') of an executable to run. -# Arguments will be passed, and you can use the following escapes: -# -# %a artist -# %r album -# %f filename -# %t title -# %n track -# %d file duration in XX:YY form -# %D file duration, number of seconds -# -# No pipes/redirects can be used directly, but writing a shell script -# can do the job. -# -# Example: OnSongChange = "/home/jack/.moc/myscript %a %r" -# -#OnSongChange = - -# If RepeatSongChange is 'yes' then MOC will execute the command every time -# a song starts playing regardless of whether or not it is just repeating. -# Otherwise the command will only be executed when a different song is -# started. -#RepeatSongChange = no - -# Run the OnStop command (full path, no arguments) when MOC changes state -# to stopped (i.e., when user stopped playing or changes a song). -#OnStop = "/home/jack/.moc/myscript_on_stop" - -# This option determines which song to play after finishing all the songs -# in the queue. Setting this to 'yes' causes MOC to play the song which -# follows the song being played before queue playing started. If set to -# 'no', MOC will play the song following the last song in the queue if it -# is in the playlist. The default is 'yes' because this is the way other -# players usually behave. (Note that this option previously took the -# values 1 and 0; these are now deprecated in favour of 'yes' and 'no'.) -#QueueNextSongReturn = yes diff --git a/user/.moc/themes/black_theme b/user/.moc/themes/black_theme deleted file mode 100644 index 955ca38cb..000000000 --- a/user/.moc/themes/black_theme +++ /dev/null @@ -1,34 +0,0 @@ -# Black theme by Arn - -background = white black -frame = white black -window_title = white black -directory = white black -selected_directory = white black reverse -playlist = white black -selected_playlist = white black reverse -file = white black -selected_file = white black reverse -marked_file = white black bold -marked_selected_file = white black bold,reverse -info = white black underline -status = white black -title = white black bold -state = white black -current_time = white black bold -time_left = white black bold -total_time = white black bold -time_total_frames = white black -sound_parameters = white black bold -legend = white black -disabled = white black -enabled = white black bold -empty_mixer_bar = white black -filled_mixer_bar = white black reverse -empty_time_bar = white black -filled_time_bar = white black reverse -entry = white black -entry_title = white black -error = white black bold,underline -message = white black -plist_time = white black diff --git a/user/.moc/themes/darkdot_theme b/user/.moc/themes/darkdot_theme deleted file mode 100644 index 8bbec1b4f..000000000 --- a/user/.moc/themes/darkdot_theme +++ /dev/null @@ -1,34 +0,0 @@ -# Theme to match the 'darkdot' vim theme, by David Lazar (david_bv|at|yahoo|com) - -background = default default -frame = white default -window_title = white default -directory = blue default bold -selected_directory = black cyan -playlist = white default bold -selected_playlist = black cyan -file = white default -selected_file = black cyan -marked_file = white default bold -marked_selected_file = white cyan bold -info = white default -status = white default -title = white default bold -state = white default bold -current_time = white default bold -time_left = black default bold -total_time = white default -time_total_frames = white default -sound_parameters = white default bold -legend = white default -disabled = black default bold -enabled = white default bold -empty_mixer_bar = white default -filled_mixer_bar = black white -empty_time_bar = white default -filled_time_bar = black white -entry = white default -entry_title = white default -error = white red bold -message = white default -plist_time = white default diff --git a/user/.moc/themes/example_theme b/user/.moc/themes/example_theme deleted file mode 100644 index 44439d2c2..000000000 --- a/user/.moc/themes/example_theme +++ /dev/null @@ -1,125 +0,0 @@ -# Example color theme for MOC. -# You can use a theme by copying it to ~/.moc/themes directory and using -# Theme config option or -T command line option. -# -# Fill free to make your own themes and send me them. It will be included in -# official MOC releases or on the MOC web site. -# -# The format of this file is: -# Lines beginning with # are comments. -# Blank lines are ignored. -# Every other line is expected to be in format: -# -# ELEMENT = FOREGROUND_COLOR BACKGROUND_COLOR [ATTRIBUTE[,ATTRIBUTE,..]] -# -# or -# -# colordef COLOR = RED GREEN BLUE -# -# Where names are case insensitive. -# -# ELEMENT is an element of MOC interface. This can be: -# background - default background for regions when nothing is displayed -# frame - frames for windows -# window_title - the title of the window (eg name of the current -# directory) -# directory - a directory in the menu -# selected_directory - a directory that is selected using arrows -# playlist - playlist file -# selected_playlist - see selected directory -# file - an ordinary file in the menu (mp3, ogg, ...) -# selected_file - see selected directory -# marked_file - a file that is currently being played -# marked_selected_file - a file that is currently being played and is also -# selected using arrows -# info - information shown at the right side of files -# selected_info - see selected directory -# marked_info - a file (its time) that is currently being played -# marked_selected_info - a file (its time) that is currently being played -# and is also selected using arrows -# status - the status line with a message -# title - the title of the file that is currently being played -# state - the state: play, stop, or paused (>, [], ||) -# current_time - current time of playing -# time_left - the time left to the end of playing the current file -# total_time - the length of the currently played file -# time_total_frames - the brackets outside the total time of a file ([10:13]) -# sound_parameters - the frequency and bitrate numbers -# legend - "KHz" and "Kbps" -# disabled - disabled element ([STEREO]) -# enabled - enabled element -# empty_mixer_bar - "empty" part of the volume bar -# filled_mixer_bar - "filled" part of the volume bar -# empty_time_bar - "empty" part of the time bar -# filled_time_bar - "filled" part of the time bar -# entry - place wher user can type a search query or a file name -# entry_title - the title of an entry -# error - error message -# message - information message -# plist_time - total time of displayed items -# -# FOREGOUND_COLOR and BACKGROUND_COLOR can have one of the following values: -# black, red, green, yellow, blue, magenta, cyan, white, default (can be -# transparent), grey (not standard, but works) -# -# Optional ATTRIBUTE parameters can be (from ncurses manual): -# normal - default (no highlight) -# standout - best highlighting mode of the terminal -# underline - underlining -# reverse - reverse video -# blink - blinking -# dim - half bright -# bold - extra bright or bold -# protect - protected mode -# -# You can specify a list of attributes separated by commas: attr1,attr2,attr3. -# Don't use spaces anywhere in such a list. -# -# With colordef you can change the definition of a color. It works only if -# your terminal supports it, if not those lines will be silently ignored. -# COLOR must be a valid color name and the RED GREEN and BLUE are numbers -# from 0 to 1000. Example: -# -# colordef red = 1000 0 0 -# -# HINT: you have only 8 colors, but combined with attributes bold and/or -# reversed you actually get more colors. -# -# If you don't specify some elements, the default values will be used. -# -# Here follows the default configuration: -background = white blue -frame = white blue -window_title = white blue -directory = white blue bold -selected_directory = white black bold -playlist = white blue bold -selected_playlist = white black bold -file = white blue -selected_file = white black -marked_file = green blue bold -marked_selected_file = green black bold -info = blue blue bold -selected_info = blue black bold -marked_info = blue blue bold -marked_selected_info = blue black bold -status = white blue -title = white blue bold -state = white blue bold -current_time = white blue bold -time_left = white blue bold -total_time = white blue bold -time_total_frames = white blue -sound_parameters = white blue bold -legend = white blue -disabled = blue blue bold -enabled = white blue bold -empty_mixer_bar = white blue -filled_mixer_bar = black cyan -empty_time_bar = white blue -filled_time_bar = black cyan -entry = white blue -entry_title = black cyan -error = red blue bold -message = green blue bold -plist_time = white blue diff --git a/user/.moc/themes/green_theme b/user/.moc/themes/green_theme deleted file mode 100644 index 4df566758..000000000 --- a/user/.moc/themes/green_theme +++ /dev/null @@ -1,35 +0,0 @@ -# green theme by Jacek Lehmann -# best viewed on shaded or black terminal - -background = default default -frame = black default -window_title = green default -directory = red default -selected_directory = yellow default -playlist = blue default -selected_playlist = magenta default -file = green default -selected_file = cyan default -marked_file = green default bold -marked_selected_file = cyan default bold -info = cyan default -status = magenta default -title = green default -state = magenta default -current_time = magenta default -time_left = cyan default -total_time = cyan default -time_total_frames = magenta default -sound_parameters = cyan default -legend = magenta default -disabled = black default -enabled = yellow default -empty_mixer_bar = green default -filled_mixer_bar = black green -empty_time_bar = green default -filled_time_bar = black green -entry = yellow default -entry_title = red default -error = red default -message = yellow default -plist_time = magenta default diff --git a/user/.moc/themes/moca_theme b/user/.moc/themes/moca_theme deleted file mode 100644 index 58c2aa056..000000000 --- a/user/.moc/themes/moca_theme +++ /dev/null @@ -1,36 +0,0 @@ -# -# Theme: moca -# Author: Nicola Vitale -# -background = white black -frame = white black -window_title = yellow black bold -directory = white black -selected_directory = white black bold -playlist = white black -selected_playlist = cyan black bold -file = white black -selected_file = yellow red bold -marked_file = cyan black blink,bold -marked_selected_file = cyan red blink,bold -info = magenta black bold -status = yellow black bold -title = cyan black bold -state = red black bold -current_time = green black bold -time_left = magenta black bold -total_time = red black bold -time_total_frames = red black bold -sound_parameters = white black bold -legend = white black -disabled = white black bold -enabled = blue black bold -empty_mixer_bar = cyan blue -filled_mixer_bar = blue cyan -empty_time_bar = green magenta -filled_time_bar = magenta green -entry = white black -entry_title = magenta black bold -error = red black bold -message = green black bold -plist_time = red black bold diff --git a/user/.moc/themes/nightly_theme b/user/.moc/themes/nightly_theme deleted file mode 100644 index b9ff37b4a..000000000 --- a/user/.moc/themes/nightly_theme +++ /dev/null @@ -1,34 +0,0 @@ -# Author: Wim Speekenbrink - -background = blue black -frame = blue black bold -window_title = blue black bold -directory = blue black bold -selected_directory = black magenta -playlist = blue black bold -selected_playlist = black magenta -file = blue black bold -selected_file = black magenta -marked_file = green black bold -marked_selected_file = green magenta bold -info = green black bold -status = blue black bold -title = green black bold -state = blue black bold -current_time = magenta black bold -time_left = magenta black bold -total_time = magenta black bold -time_total_frames = blue black bold -sound_parameters = magenta black bold -legend = blue black bold -disabled = black black -enabled = blue black bold -empty_mixer_bar = blue black bold -filled_mixer_bar = black magenta -empty_time_bar = blue black bold -filled_time_bar = black magenta -entry = green black bold -entry_title = green black bold -error = red black bold -message = green black bold -plist_time = green black bold diff --git a/user/.moc/themes/red_theme b/user/.moc/themes/red_theme deleted file mode 100644 index fe6297ce1..000000000 --- a/user/.moc/themes/red_theme +++ /dev/null @@ -1,36 +0,0 @@ -# rednblack theme by yyz -# works good on a light term - -#property fg bg fx -background = default default -frame = black default -window_title = black default -directory = red default -selected_directory = black default bold -playlist = blue default -selected_playlist = black default bold -file = red default -selected_file = black default bold -marked_file = red default underline -marked_selected_file = black default bold -info = red default -status = black default -title = red default -state = black default -current_time = black default -time_left = black default -total_time = black default -time_total_frames = black default -sound_parameters = black default -legend = black default -disabled = white default -enabled = black default -empty_mixer_bar = black default -filled_mixer_bar = black red -empty_time_bar = black default -filled_time_bar = black red -entry = black default -entry_title = red default -error = red default -message = black default -plist_time = black default diff --git a/user/.moc/themes/transparent-background b/user/.moc/themes/transparent-background deleted file mode 100644 index a73ffa5be..000000000 --- a/user/.moc/themes/transparent-background +++ /dev/null @@ -1,34 +0,0 @@ -# Transparent background theme by Marcin MichaƂowski - -background = default default -frame = white default -window_title = white default -directory = white default bold -selected_directory = white blue bold -playlist = white default bold -selected_playlist = white blue bold -file = white default -selected_file = white blue -marked_file = green default bold -marked_selected_file = green blue bold -info = blue default bold -status = white default -title = white default bold -state = white default bold -current_time = white default bold -time_left = white default bold -total_time = white default bold -time_total_frames = white default -sound_parameters = white default bold -legend = white default -disabled = blue default bold -enabled = white default bold -empty_mixer_bar = white default -filled_mixer_bar = black cyan -empty_time_bar = white default -filled_time_bar = black cyan -entry = white default -entry_title = black cyan -error = red default bold -message = green default bold -plist_time = white default bold diff --git a/user/.moc/themes/yellow_red_theme b/user/.moc/themes/yellow_red_theme deleted file mode 100644 index 8a1bb71f1..000000000 --- a/user/.moc/themes/yellow_red_theme +++ /dev/null @@ -1,35 +0,0 @@ -# Yellow/Red theme - mostly Yellow. By Morten Grunnet Buhl -# Doesn't work on terminals when underline is not supported (like Linux console) - -background = red default -frame = red default -window_title = yellow default underline,dim -directory = yellow default -selected_directory = yellow default underline -playlist = yellow default -selected_playlist = yellow default -file = yellow default -selected_file = yellow default underline -marked_file = yellow default bold -marked_selected_file = red default bold,underline -info = yellow default -status = yellow default -title = yellow default -state = yellow default -current_time = yellow default -time_left = yellow default -total_time = yellow default -time_total_frames = yellow default -sound_parameters = yellow default -legend = yellow default -disabled = red default dim -enabled = yellow default bold -empty_mixer_bar = yellow red -filled_mixer_bar = red yellow -empty_time_bar = yellow default -filled_time_bar = default yellow -entry = yellow default -entry_title = yellow default bold -error = cyan default -message = yellow default -plist_time = yellow default diff --git a/new-config/.winitrc b/user/.winitrc similarity index 100% rename from new-config/.winitrc rename to user/.winitrc diff --git a/user/.xinitrc b/user/.xinitrc deleted file mode 100755 index 91aa360e1..000000000 --- a/user/.xinitrc +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/sh -## ____ __ -## / __ \_________ _/ /_____ -## / / / / ___/ __ `/ //_/ _ \ -## / /_/ / / / /_/ / ,< / __/ Clay Gomera (Drake) -## /_____/_/ \__,_/_/|_|\___/ My custom xinitrc -## - -userresources=$HOME/.Xresources -usermodmap=$HOME/.Xmodmap -sysresources=/etc/X11/xinit/.Xresources -sysmodmap=/etc/X11/xinit/.Xmodmap - -# merge in defaults and keymaps - -if [ -f $sysresources ]; then - xrdb -merge $sysresources -fi - -if [ -f $sysmodmap ]; then - xmodmap $sysmodmap -fi - -if [ -f "$userresources" ]; then - xrdb -merge "$userresources" -fi - -if [ -f "$usermodmap" ]; then - xmodmap "$usermodmap" -fi - -### ENVIRONMENT VARIABLES -export MOZ_USE_XINPUT2=1 -export EDITOR="lvim" # $EDITOR use lunarvim in terminal -export VISUAL="neovide --neovim-bin ./.local/bin/lvim" # $VISUAL use neovide for lunarvim in GUI -export XDG_DATA_HOME="${XDG_DATA_HOME:="$HOME/.local/share"}" -export XDG_CACHE_HOME="${XDG_CACHE_HOME:="$HOME/.cache"}" -export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:="$HOME/.config"}" -export QT_QPA_PLATFORMTHEME=qt5ct # Qt theeming stuff - -# start window manager / desktop environment -exec awesome diff --git a/new-config/dependencies.md b/user/dependencies.md similarity index 100% rename from new-config/dependencies.md rename to user/dependencies.md

TP_e z0Ri6cYJR0?7|MGDOXuVH!64MADRrigY9Z>jUs5IUr5zcwi*w_&IP;Eo8?ScZ@x6{& z^?VLlkLwM|hps-SNk$Q3f8}q}q;v$0@R&3bvnp5fKCXMQMEJ)3jTNVQu0Z844>A56 z#XkTkYsd;`YV}VDZ{od6Xl1CVV^d!V9@pXS%#?$Fm_pU2MJ4GoZF>|7SQ>15D&Oit z_UT{3y<=%8{H zaMKgdW5752t=eysOVd%Y(Uf6l-h1sKTglUk{E?KQ0L2Js<0m?8xB%v?U{-#Q9gEF_RTO8&dLp{6VJy$C+kpXJSl?ZH^FG@fx0@`-iF)>-;Xe5gS~{){Q)8YQU@#vh zu?E;6u&c&xqhxfxW^*L^++N8`-*|+>W*%WI{x1ZMQ?tSU-!1WH+Q13UJT?5(#HKC| zf9cNc8SJnb-QuH1Yrym&^rX=TnS6qS5yx&5AK3NjEPnVKIupZ*7h1F%u(t4UsRrY1 zpXH#qDK5jXRG?f8$mkqI8kvkEkE=yl}caS$Nhb5 zBrEw@fdE~Tq{91NRF{kMTfUXuOtnq6ztOjB@Ho&*IBJnHf2~QD60aTajLcy%g(cas zC0Bprc2g`BKFlPQ8=sVuu3zUq@$NNzvfIbPc2aLpI9*cTY_|sW;cIl@y&kAWB**b6 zbaqi$={zlIn+5UCUHg;XVd6=d7mH(GK3#61eqf(wP_1C-%S_(fvMJiy=WS~%3z@a! z!HSYck5A*EhN)kDwootCQn0ZhtzU8G-}AW$Pj>{G>6at@VL<2`RF*4kG-B0no8 z^Xq4AAN=bL$hvU{H$J{0QAA1`JnnT1QYWcl#@gy0fcb(1af+4+h(!cjWm^y`Ifw~=p~>{<7pKIpcCA4jmu zdF*WFtXIM2_0n?zGNF{>quENETU_+{3ri~;|NT-wU;W}Ehe z4qNj>KYO9zbW4>hu{?R;?eKlBF>82dN?KdYmy2kj%p4e2mumH2c`hz3Vu+#-Uu)qJ zZacVf2)2^=v2@f~=|HS+0>&9T5W3N6JMDB9`4>ZTlYcq|b$meo*t$kpNqG+4G60y~ z+k?ZikMIk?C-XfrUBE*=sU~_7>RWb-*?9Z$<0OWb-;{iS{Jn#mZx$WXm=aoYW~NDj ziUh)>{X2^*P}evtd<7;_#`UX^5T7DuKLb9YxSWzifV($8Fp3f6;{u;ORiF8Xf66>A z%xYhmmN17BgM`KgkRdHp7(gp;PioRt|FC^0vTQ#}l)C!(JQ%R{pSeqfY1YX5|1rx2Ja$C5S2)RZbxMeOK(dG;g^HJ=i{7W{FLPE=Hc}` zJf&;%**Nk1rrsvQyMXmDH%7v39_LqpvhTkWlUQgEAhJ{=2&Ujz0 z>m3%&3uEZ9(M2s9Gp&|-D-2U>37g2zQ{VTB67(}|y1frdL;8APkuYEIOCG9==68&* zoNqxdM>kzQ7qNb?cw3j***e%sTeIF6)Q&qn9amu)GrYO^jvg+U=4Sq$m$WbwogGYy zSU|+-{8f@*iF0&IyI}tI9^d1G>8*o*iiaUnt6-n!?P(>c;^pyKFOYX z!JgdmN7rahRh|n-WlOerHr$T`%}Nuzb5UmHs*2VdQiY}K^z~r-B??3v*GiFKW4nbQ zCU83sXwDO;7;+uE5xPk>Wug8`HBGOk`-*+v49DSuF_N5tfgs< zN*E2;ZbcxnU_7b)61A*lGYR_=t)Pr`Vr>+D%#%5|OdvX?$XtGW0Dj3u>o!w4a-Fj z0<0;B_#4|)0O?l z7OdNuxNu8sna6x=vZ=Kf(n_fDw~=HIukoNi#Qm&IEViKVn(6S# z({y%gZ&I7wNiqZ|%kJe-Voq*e;Wb81ZhhfB$~mVD8d+cwslya(zBnSUh)zvz>T^%w zd6l;IW6p)JR$pE@C#k3ukSCP+=)dO|DX9J~8w&4wYM3cC5fmfR6HP}YejFt0_ z@gn&$yMEhteTt;*Hi7-&*5^53-18Dk$9u5c6+&>f6A%aP9P8(J=94jl!p!cK#=)W{ zi7XJs;sWpZF(s#@cUa7@EILri#Pg|J1(U^7Vn^Hg(vqDOlomN9tkX)Qv!_T0(Iz>j zvcp=F+_)KjXn1rvGM7i*6yI3n{kuWglokxb7Xb%@oAEI3*C<78 zw09vYhVywOJhAnnx&3M3T2~w3l5L5S8znac?Z14UreF2YS=#a=U$OZh`?A$CT=D>+ zxw0jMN-*kb5W;9YT+{DAO|sTfnM9%I@Ugw&m@w?bKjLd0d&~4zB0ux@D}R2TtC4Eg zagWy+GKBkq1yU10u*yNmnL{Hki#k062%?1%Y|}vnJGQ&V7oUj7rUiWmn!EI zxKGXstm;H?3We3h!JJa{0y?3e@-1;Lx(o9834YM{`2t}YVFJMVBVU~x?0<7m^SW}s7<>7T97hYK@2XxAy z-)V3`23?lahv`Q`Cj?;AUL#amBS%&AUh{q%Kzm6CJYi-M=8$64AFa*H+wj-k{779AR!` zGh#NB^W^u<>8CSYCgVbS&>1iAGIh{l|7&?|8Hd>Mf2vJ%a`8n(fi$f}O(s^MEi4J; zVe*B=Q`*Wu4orIF;`Fh+GO>vW$I0r&Z$LTgHFSma{!ikc9CN}%;|-~elI|fgFm#yJ z$$ccB1w?3sTKIu>O!!O{V8~2ca%rRKk6%scO;Ii=q$jG>dG9q@4qw)2BnONA zorM$h$^fuynD@%-Enot3=!DCIagygG1X|-e-C-?Kwr3?x}X80BUDW z8h}0+LZQxTcP4rII=TXSYr@i8Cg*tz&)S~KTI=9$zcE_9OjPB0mXJCh2fDjlFfZot z%zF`Zs_jb&$8IVlEYMQ6R;jAJEC8NHM_!1jPUx83Ga|I{r<+fRJBAnpfgFFohFSjt zS4osEe(xYKltubPub?+)dcL}4=)O!hYo0M-(Qo!s92~ChJQ?;rXerM(kSj)PPNB{t z3Y{7{9ez>@-Dsy2dXwF+B%PY=XKQbNt-4(+b=dX+++m zbEVqmTt5K{>Cdy@_4P^L+AbJD9y34Dc)v4u4dH)ScB7c)uOr)}OC(kah1n;h;`Miw zcjl5@a0nff3C#C=sv1>uVfvosUwD9TdqKza;4Fiwcz#7+zSoeHp{P7F-(rR3;k3ib z5Uj_)yG80IxaYaC_k37q9)AkG-egUf!B4b-=35{gt0q>eegt^c3uRHquqGN~NW7<0 zEzn@k`ELvYsxHOdIRvn_aY2Z{VbS(A^zaf z-O;DXpAmgnf70_PVFn$E#pu64WF33H8nSm-(zEhnR^9%JL^)=auB^_`*L5f2cd_hc zLschrVv#E24O#7Evw)Ou`H|{$sp9c!R*j{)>*?68< zs1+8{;9Vlb@UdZ~^nEj$v9;%ml#CNcv=99FD=f4Iq5Ah$5p7?gZla6Ks*ioBP-$1q zH_=7nc!jv%qy0nFAstS$E2k^bZ;QOySwoyinYM@26+-tWRU zoVl=LKOxmLhMmMsd+r(S)&w=i~Slvcx1E{R{Sm?Hl+r=ID# zlDFTlayP!7(i70sS6jT`OSQXGnYKR7I?AI~lwR^cL%#rg#-ig^!>pM|>%u*e*q;3+ z1#~!k_d`qJy>unJ(OL*OXPh{lBHt^**i*d&4X(W3Z^g>}9BJt@KTrA0WCe6mPGkHUN$EE%|Ef2@3D|oQ=zBIU>zv!DTHU^t9RSxE~De7K@Z}WwRtPPzHpahC$ z*41&LOeaU;DwX3=VFztgSU_MJb-;#|zUbfa`Rvl0_7tWm5yTE_Kd~uqBfDKbfPzwP zLG&S2TlT)niv{cV1_N9^!zyd z4p$V%y9!PYZSFo$a<}WeJ35DnCChx`dw@l*UFZC@h;p`VmyjT)a^=`4ah;9&$ zh)B-wX|gDHsDucEo9%MdW9+4M{Hg~9&TERYo7qjx!Z==qQU)ebTysu6?Uquh(h|Af ziA53+AUHD|CLo!K*-TJC2$wDZV|#6UToTRxJI{i;QF1nabVSL<=p$wqnDgo}#H81k zDS{4QfjK@*(2-Ue9XY0{sq;~ZeYf65OuDvqA5O1<-PfSyOm3Jyz@XuR_kPP_f$IIS zaAUVW$#{;C(?|i-pmd_uf5<|^`b0{->P?ZDIm_J!yY0f$ zyub^(=Zm*zEbqhMwZNjhynI}4OPBkCBiUoX;>H|xDw|CSY)VM$^n<+ukuc5M`!NoT!^ECh) zSCY>0)lnj2{!g+{+itaL`mU6o@Sp-#bwm};W7V%{FS?j6d&4S*ZiLW$0X8e?DiAG$ zKzTqMA>1VT&gaIwkl6SUjqf1!MD_azc+asic=>TX2_LsWKD>uE{yY0&XNmYya+Nfi z%Ve5H={dI+__Jo4j%CKR9+$U{yK18+P=BUt?At~0TZZsk2RyIqIho5#d2{rfYe8*V zq^Yo+T%>6i(ys-b9x^J$RLq7To}%-#_Up9ghu~8~X-RZiYeB~l{kI)bN)*)M6W_qz zuj=2__e&V6Yg%&={?aeey5s5B2VQg@$|#90lq(vhugSB(_Gc)X+ty zvGkT;(&qyuw)W{h7wRwem-hRv4eD5*@cAb4)#4>*-9+jgUJ5Ta7*FLz~fjQ1lOUV;#}?A|Xl&@I+k4cL=- z9<$I}SP@c%i#@rh#QO0}HRSU(f?pfg4FCT_o&9D03rq(9&;N6zyOIv3-rdg(@tNYO z4P5l^cB>!i`pZSrsVaAwfuJA%in&cFe8|z z|1!I_8~IeW<>a#3sj?tCK$5=;vofZ6+I&Y2+z45~ZE-^0rr(#GE}J`2XZ7uJJ5H)$ zGt7;WwYDkP*u3jIOJ?z3uLx}X?dgqjj%_#an2Mr+TTIrg3*@SbSWL1tA|AUxv|=bo zdSwGxil&xBxf^GlXSP{Q0#TH64S@2)9@~0 zn{kQ#(@O}=l^s0Q;}!AWpS~o#AkE}0!Ml?4o3mFX&!wf+5&863HI!VD&%NbWGm}Qg zOCFqwTXB084K+hQeG*tuH1+jOOP7pU@MCrt)M+exi^WA!R818xlU#hT;}X#el;TS% zW>M_X4US1t4l#FWb0<2tg{&8H)m>7|6sv631iqbR?1r77mMvHNXI%0B`IgG_SDay( z1wUFGTGF4%yjiTlGjaNa`am7Zgg;!s7E0)~5w6sNS|gHO{oA;h8CGwQySJS{QazWU zHADohRzRZr7N2ifl z`>K1&xGQef_A|1`M@6CM0sZsg_Va#F%Y{j-r+8vQ(cDmkq@d#>*-(;l3VAs2=MVkB zGC%|&qQxe3BE8H1X>N4U>&jJi#1EAHH|_{>n@vn*{AEK*Qz1MuT)WU7G*r@;Av%Tk z###1_5nr~LpmNPxd?}Io`#l;rw_LgUwtNZG+I#iab*M9y3Ge z>G?9>Z3DhT6k$r<0Z29F%Rnpl+@X)Tb$vgEEch}z^J6O)NX%*9B`YI74Sk` zSl+!7Ql|w-4i4$1WjH(bDF!~iM@CaK3ub6q$=^2ia6B8B?3cbfl$ zw7_9}w)i&kj_DuR{pV!1`DsNGA`chikEqXplLB@bb1tx?k%QkrxhH`MQn`j&1%K%@hZo!yHmXmE4^@J?%AC`TGTHN`t?<% zGxLN`;#cE*K_;(Tl(bp&jJ!bEys(@R7`M|+nluwHp51i#K)P${b18@-NiVN-x;a{Y z?PixR8XwH#a=g8HLG`+OEph5h1(8R%eMmJa4NIk&oW)>sw!M*f-XXwc1{v=h(>kBD z$B8jNsi%JP3>beFZXX7VabF;xc~iGv#WZVr-dnewPN34v_L%E`ZxR~Rw()>obL@vy zRjqCiAI}*4%LTaJWa}Siw7(y$W?(3v6v||;KOy966>5ErewK$X-`;fRN~HQT^e&)F zniWl)5t$rCGchioR`_|2zR^BucYTuWsxIAT8L3EA55D`Wxy1;l`GS;q6n!uPK z9TSc!ra`kyRX1LwmJ#jLfU%^g}ss-3+ zX=mM-G?4E21(n2X)BfWB-hXS}Vh}jED+Fa4a8z5NCfRz(BE0nD>DJt2?^AMG)_21k zk=(=eMdJZ%P0P=w0h4@tiloLYKe29}erQ4+9R3Wg7KUB7iuJ^7 zCO2P5TY`7%_!5a&@d-DTrDHR@%M~`0KrMr8{xrsRRyg_CsB7K*K<;s*q<_^nI9RZ4 zU%#Tsz%|cyZQ!CAfepH7Zl1#6H!>KzbT&c>v$*e#xSzO*X1l@|ATvWaiQgbVfBDR} z!zO7~6C?mZ@qaH_!?Qog$!1R2 zJ^*9)MU*=v8nF{bYUuo91M8p~H&UxL-vyPC6aP^j%kqJF&s5{z6DP2SgY#cNn0Am- z;r84^tL`pVVJXm`uU;Hc>>4PZJnSD}s;(oU+ynUeE2si?M_26C8go3Ky-nUdKUl9u zRi)yw&k{}o^O*Fxuo4pR2{_)4HenxMa5;a|5VNqkwcwQ?X7xXFk00I|pHue}P^$0plr{FG|4}Nqxj`KTa1#050Ka&!Bf4^Ghzz5@l|cH4 zWB`UH4;iXEOm{Sk^q?PA4hEFGrL_^lZEpszmoF|?i!XjF&BXx*k;^EyasWH( zC7^p6ft#FgI|O57**+xHzy2ad*ejs_airgQmZE|HK(-=jPa$kLCp)#XuZoYSk@|RFi5IMP1Gvj z6>#Td6v39*lEAmuVLap6>cx=+16#Acet;(y(e-XPwqYl7VFZZH(A$=@CcMX1Wfww*D6Se&jk+9S*j)rtou#s=;Uesk}+gPJh=})!6<)=y~55rz7#lQM%WG^LV`R z!dzF@=r|9G7yyd>VB)Qr#&C`8 zp`PRXkP$0ZHZm^_-f8GDudVDlw@Y<^wh{pkWxZszqR7XxuWaGhy%=dX-e!MO8N$Si_ z5dK zqre(N*;B}qZef_bZHyH^z#n^Y3AJU0*uT~(J+?S=d!A%sEMk;&0le|G7`$$$^l?WeUiSKbk0lV8U`t|D<7H2OMuYAo> z{Acr#de{u*&N8vEa4TCS^~{(z?D4mN`$9jL_zf`!k<;M~93O~fza$#gD^J=kvJbPl zq8hY@Qpqm%Nk^R`T=?Zlsd8@@a{hGo?CjneuEXhI6k8O|zmyH%n*x zjD&x%SWD??$e&ydSv{g5_EcBFjJb zd}Bw!{N#L`BQ*QttPT!xV)-#(d!_w;$#eG}ld3#09>^iA7j-foE=^fzJF`(sK&}~M zH38KaAGikDq!ze>!@t>ATFRvNZUvHy#!w<6%OT6l*PRPQae(XT&i%;@4>sv`3gk)+ zrcI>LrCb~RS)phdxj)&^@djy|* zDIZa5&PD@mf1+I}p1y*(ve>f3q67yz#&8DgnOJ-(#>c5H6;>OcL2R2gJMO3~aO2&D z)9Yj0-n@fEpVJcuymN#6tVxI*8nt6j&tN~#Nzkz>drh1~S4Fr>TW45Pn!^bNjk3rB zp_L?=N-V=CZoo6`*U{Hd%qZD>zpaM=Wziy)PyOo&Isl?)hp?z@e$xTCQ~b_0-7#n? z2mvhfY`x#fOXy_g@+oEW{GA-({vTCe6&2UEZHs$wcc*Z7cXvW?cXuZ^1h>N7A;B%U zyGwA_3J@HE!>e=O-TR%_>ZjIURcmXs+2`nnA(>tbSwe2*>zNm;D7>DBVZW6bk;d}l zoW)-8jF`W3#+sD$DqkaQqjr0ScW2*i@o%t+PkuJ%pxMt^>sj4^eaK;T=@}twUbpSq1#Ey7P8|{6A1lVkoANn~_Msf#6+~7Dl63*cJz_Z)0+151p+N& zykA$muY{e081WKcxzTn$)Zu)g%2g^mb1$Ey?zuaxQ4-05VhTFmXlw0Ct25(F=!+aC zfDU{=PY<;45Xn3NORWd06349jGL9X{vSaTm;0l(P#|Yym?yu)7K^dK7ulRMs&Cn;| zhv|dlt=AnCjL%T%8y2$xX`)YIA0vscqaRbB1%F<*ICrJVAlaKr(V8B;YBCAG<0C6h zzAmWtgps{H8JBF4!8d*vLUkBL7S@QHJFxRJHS`imk_lce)s@M%vZV}+OkDVc}@-AO@k~6}gG9pKF zf<6K$u8sqg=xJKr>Y0$~nYj)eS(#X_gFgPg;K$2MwR*X2^kZr!P%5!#*#DuF=Wtl0 zb|aNV^~Pw?yBkKwfd5rZxD`Sv|7Eo|aHxkQwK=MjZ)?WqP-~={jsY;!(2eUdy~)C& z&Gp5PdB&F!*v(NpXW^QY_r`JN2kTg84hNToJjS(93P@)A&BUg`pMIl@fTfToK(4EJ zdmZ$Qk^@bfW<@+JxE9JiLACeog` z^E&?#7JZzA_7?OJ7T}1OrkGn)YIL6b8+f{HNy;zO|29gw{dJ?oU?)yTn}>32O}D^8 z8svZmXJ9ZFo+U|>5KYj~is^2%qMVBajXQ|Cmx`9eFkQ=7{uE926KWvL|@7>v{oFn_G`$ZuI#P6GpIm&+I<{OZ( zn%lw*16D&sutTKQ&;yy}HN^8lC{dE@d8n?rY~0+Em4f)TrlsTvp_4Ntvz`D!kqV)T z&iW-dU4>{%VUiKXb_}==WW>+{0;nMRM9z$6Cp?L{6OXpGwr|VXPhhqHhb$JRlzh?c zAe(Yt_wSOP@juf8zy?6={>w`+Dj?LCmd@L_I90`;`Rm`h8m_>y6ui7l5nbglr!!Bk zXKxUVvX^Ptp0R(ZshR68`&j*^DLOwsXkG>&jx^fvoW;pdK*Vduemq5aV@P9&{-qLy zh-1v)WlZ4xIP~q|{^G-V1>T}q5{RQGf%wxj(l#x?nckL(JA;PaTf<>!BHzw^x=v{` zgaxw?*L^<%2E|2*y?=i3qOUG}BfCQjg)7jxH-Rk2aYFXJhws4%1(5I+jx6L~obL z6~jU29S;)!2bH}R1+BnDa@3P3if+!(fD_1+J=o_GHjl z&d4t~Qaj<%zvzS^ePWlk${UH(2{eMYR^Ha@~( zb=n^et=6P#6wtAaeah+chKLv6T?&_enZ|sI}23`cYQ( z9#+YUhzn?%$=+&jzdq|f&Xc_g|5aL91*d7Ub zY4^S%`}+6csZaBval7{5SlR2GRWnPZuX~itB9mpFh^La9c|nKd{_W?mC~9b}VeF~HUgTKeu80r|{b zKh#z>03v0pydB1SwOL?M?D|;}H%E%lQ0#=o-weF@_*u)0T&#F;hr2ftRyOO$V%L`gR`v|MG{K-Y4{SjWoN5+~Z~Yw@twG^Hw4xW^p-qlB11t;%e~>-VmInff9&?f>TVev|#^ zo4#>H1}ThNJ8}&*I1~d0yoG@sU8m>BpCO%RptS$f_G*gn^!cyRGavnMlLT=3Zy85w z2JBQ$-P4rs-~hY+M&MxynYpEB8res*cZ2l<%K}%qfi|^zoTY9dIoRy)RB84@!^ge1 zgv}a1*V4)#+Lq|+1?VeWw5c8CK^pIQ|F~xQK17iN?IxVA9X=pJi$4uT&oA8w)jr+A z7JET(r7Xszc2Cn)60SA=awSOvV~Cvq>WKGSX_2skP2{bTKVnnU?s-0_35$ZJVjv_7 z@wp#rau0jGolp^VPF^9JqbF^C1u`u~wcVm9TnaIo29is{u6Yc70bP1g%b{LLDKi1T zki9&DV7mAvJ5_fCAdfFiFOHoejggMY=Y&Y*pry%Cr*W#M=6Fuq>Zp>-A5UYKE4T=% zuPSC9erL3PEdSXZlF@r7t<);i*e2QehAw;IyhxC5-W`-|vxV*%5D6`Qajc^(X?}w) z=$&DMS<)%#F-Mt!UddAQbHrjl8ITx4fNq6BQxOSF2~m*;xO8FQ4<*S{+N09C0j>TU!z=Yjl;W>KhJH-gJ=P2%$ULON2{TfDz?LK zX*FcG@~uqj5XG&E1i@au<`eOIY<=b;B$%uqJ5Uw%Ad@W+nr(00J&eFOvxoe=GWr>( z6&x(MSwFUk8mq80TKak7FSd08bA7s;M45V-V>K&^Za3ThFKbPe7gFBK0&*lXgZYxf z)yz#=R9xN5T8{ZuX+h$J3W-U5)BEHK8y=@!OV;kRFxDr1k*hV>p3A=?@p@Uc(V2|A zx+=I0UoMW)pMLm!&|Mtt^qzQj-8!DVJ{txl@bVwdE%_68L{j%-P0h|UwOOgNfawew zi<_DQE@jQQF<0RnHWYB01HzFL%n&Kqg9~%_63A2q$oS#0A|R)jY>5aq5Avl)Xkms> zCTPg?n{0L%D8Sq_X4PoufO&X}k9>!Nb4zG(bSrf8W|L1BxbgYAzMS zRNNgl%Cwoyy_d!4ivj&D!aM>1!uW z`13=M;plWqKpUm45i?BH)T0#Qo&4inyK3pFyX5Bra?#_Oar1|m9FCPoP$m7DnMOdD z_dmf)T~qUm_8z!&nd?MX3A{b=MBcL+bTq=AqKN^|LM4TYR+t^MnNAoNWch5xeOG^TBg3^gvoff-RjY{PK)qO}Zg{2Ui=ffOxI2XuFWpU0e( zAvAFmXaBdAz8xu9U`RZIk9bc2`nc9%{~Lx=dcFUEdB-Uyq4dzmFbt|uZ#2sb%3_=e z5VMSB%V;LcNlaE2r8|8582hEJBj0(oDUqbnil3$_K1aPlfSD~H6d*e1w1B)7O1A_eBwvO=yN z(Od4^6A6kxFs~j<&~CE7^d>}@KdApTT!zP-ogRlZk?i6tbiby?dZ`7GT>3EY+#dvu zHKcvB&t=g3T2S_ft2Mh%cd6bnqOIboFY5AuWaow>ftdt!F)K2$-Z-l@U2ZTDtrXVU z9ha(4tu99C7O+D?79^2EolPz8LP8eof;~s}H(5i&@fR4G@hQ)(`TTW8hmn$3>NXm7 zC5DNijst7I$r12BNupS7>a92S)q8Ft(YPwIKntTrcW;U-ARlHJ7d=Jj(KxdRJO!{A z7TyGyZT!_v;}GiXc#8Ow#rBzI?s~a(c67G+ zU#PiK`d?79E_gcUq-uuU1{iENUUB+zSAyS6G0D~Xc4sbPdG4a+o(k{#hAaEP!U&bLA=>KjA$iY7YMxpQy+n&bRr z^*v2sP@SyoPYwU@!P>~v@>!X!0?^)p(}Ju1F;DbSGOqEeY`EymYqu&6yo<7w87G=o zh8g@CO84V{VKmz`)1dz{=$M$no4?sP=7%+ukpQAmyS#Vi9I3Pp?JzfPZ7sP}o|Zjk zkvsyuU?fv(p_VzYoNF;SFO?LzXt#-Oy~`r#)1(vU#CPB($C-eM3Bxbjx#&JtMx}J~ zoA?P^M1&9wD0AxQMTt>y^UN##M>cDRS4zCEse-4 zty1>P;YWIv%F`Hw9EOJ1WTB#g%_x(%#zmlkxgdC1{YXrzrH0FAB*$YgqCj-F42n)c zwJ*VeQruOYZZKc*a`Jid+V(I>fYxM|BIYnKEbhJmRFIus6)oBa+!WCy5MN?W=7w$9 z2fWyOx!ZUns~+9SK&rE-rN@`i&Xx zXOQie|9DUD6ba1!xD|AwIrZwlu1{0#Y?^7%l=V4rtOH$=z3_E<>jb>?`Z5RIdqQr_X}SW zQNa!iT5v&PT5rw>Xu=iUNq1Qk-=H^1_y;3Q1}o~b#GYgNAy`)a-JONSNX(i(b%}7J zoQ_=4)clh;#yjr+>PC=eg*^vD-bC*WE~WmZ(^&g`;9O#8m=9%AFfHlNTUgQ$%ux6e z-m2#wvfLwh!#1abd6Y*&k~Ct#%1Ul;@2;9IhmGk8BMO-InV;XoM0a|eQixtkfRux~ z{vz_(`@W=P?^jW}hPsxQJ>6XT%=>)X+2UPmDFVuiH6VpFF-(_hv#5`EqF#9x?CHi) z?k~V9K2qk5q5`WnoSYL(m@`PcjwHF9Ml6>;oGyog$?Y{@L<^3{SDztSvKik$ZB~}b z`)km|NBg=WGDJ6A{c>T+aLgRlZL`@cL-DYh0%bo|vYg~BaG>rA;X-6%z{DOgWi9^qc|GXz}k+7#fmXBh&6PtE{Rk z4D;R8Qu;Pys|RP#uBmAHc^+r1M=09}Iy0 z{t1?2BplJp0M3-^EM@!{>9&de=T=vkbJs20MVBWYuakQw5lgD*H9lUxP=CWH>2bp- zs{76xUi*tP%T3k`uDI@Iz@pRF$Ci!u^K8WO@AaF8M^ozp$>*VG=+x}pHhse_;YNQB z6o=!8_9|KM21(D|;td-{hDf9i)iF791-W;BsaHzH=-17#r^h=wyy~TW4N5Dw#2BVf zS&}TxUPWN~p~B!lW|O7o&gvAH-Y%b$DC(CoW0n)R;%uE!g|5S0ZMXp##SwYiRX2Lg zCgS&gCuVKmTdHPZy2*mSq`+xvUXkUh;D{846(}>fsnmLN?R;dSi^hzb>9=9ppg{?9 z9kcJ$Nl?x&!|!u7aH#ry{{og<&D*sAo=D@Z!nl<2QKP^((Zfk?LIN>DCXsQ58(;Xn zC!J8^x6$wU?fKjR9X6~sX`dp5N4;)4n(FK2@cQZ4BB#@$}3GZ-{*J!A>m}d+2W6?w6^Y3yE*>-xpo)cdXA zAD+HN^)F{YDDk~Q9QPydo4976UqBx7M3C9n#c`9R1gNW+GnEneVcoe)<4gN25#;+Y z?8Q7`_P8NnMWjcjs2%D`oXV8iG;{1CxWHsF%au`Z5EP9!G*2sFyNjUcCWcJO(BW>G z4w<3Po!pQNOzbEzE%BLt_|2C7uw+Of-LaPsQ8&d0}UMMR# z)M+6!Wzf+-Q*RP(O|$26A9V9g<6HdIGM(F4rN=K*zN`0W1Y4##lg}sK+Z0+Ti_UD4 zfn5ownuqdqI|xa~ibQx69(K$BC4CK=_!v zTdcT^r0u6(gOYNGzbcOgYfKF#hi+RQ(Trecr*qxB#~HAZu!96MS5UggE1!?Jo(Ji1 zwVi@2$Rz#+&3^eMbnOHvXrz5`=A5-RVw=(8k%xQ+`6Fb=>&Gu*Sos2VF0(@S*YA?u zR+_G#maOtr%G>IND9LQgHKrpr_a*rDtIEO$K>`N9D9*9V%ga~02g|fIe*fxsr^!#n zO5^~Rp)=4%6xs}G`U z{e4@Mm}j!mBX6f2`=#rT-NoA`l|jRU9=fB7uqWJ(XBBV~Kt#L(CT)P{lxryR?&)8& z#~X<^T(5=jHoTI+WI!aBqD@`3sl0rNQH23>d}6zhEO~S)kQ~94*q^E%CeI$_KzC0= zp;XO+Ly|z=*)*6{K}m@lL&1at@@BHet6ONOn+xK?L*Nb`x)eD30)bDi%n6R|9Gx)~ z1Q)(hQNQ6~LKquJ*-sxHQXjby)ZDT%KzK1{m=e1_UXO}db18@jR#eoNk$Nlo%!u~> zLkJYrSN%7rB(I@vt)G+cz+j?}RF^}ivl(2TGVmN{+hz4Q2>c<oyWD%W zuQhjbgZfW@U8WEjJbc1I!h@v!7}NGWmgo#%Vzt*j)cz+wwfMjQ;K*GSH7lz=%ZVPd z2z_Kw5mV^P!X|%wM))5mm3b~wTl}K$DGPCZb)RgO{fJk4!lF|~G=DL@Y&5;}_aXX+urXP@N$$f!e)iAXbNpDDQmlzH8 z$z=aS7w1P%VkF@&JTf0czfyK+vwT2mALjW-t6@6J%*#J7S|&n!t3spknuLgg2~K=w zLT^f<+V%%afdEfv*N~u*@v(w42^NpMBF!P7{LjmwtxUEBP|?z0r=O2q`%`sg_%FC` zedFxuLkPDYP2M2(#xhXgPVc2#>w4$+htAo&z{o*@l)*hpyOGkNKJ5oAF{AMWCEICBI}$soZSOY@VPu7+5SBS^HDWS7wc#KS3ymUeBW?;v6Lt zX&)@9P)w+0YDfWYwsZ}h%Onf{53_Pp!}WLHkaZQ3UtML)(x%(X*oP7AaUPIqd#Lz>HV7@ z?7dyr_U4m%G($O}$Mcet%X-?Z$4#i*Uz*vFD%gDCLan>oS~${PWSOlyl8OkVG1E{h z&Az1?Z}Lyk1i809^PezL#^expnrCI5l*9n_Ggfr}$jM|;XrVeHTL7mRgUd>RkU34? zCW)w)J3^Ci-#nDi1t`s&1YP6&d(Tuv-mWuzoGv-&R&bCRc2AnDeINUye2$+qr8o|c z5A2CWwyoUT6f1;}$==@38vI2Lsz5UhZJQ&=QJ%M-NJzzrX>MmANE^+JeCtZ7r!{Vv zWC0=CNFa*5>B<$NUuWDm92MF>k}V0O)!BY0B0$G4Kx!}?o6>%Jf}XgZBJ{(f1hOZ^5JmA5v{O8vo|{f^o4 zj9J_?w2Jz8O9!VU1NpN~*Y24^n@4?|^65&5@tQK97zf0)j&WZY$zUcmPpxJcw^OX0 z@hcU=8EIl1SO~C1u<-*FqyL21fa`LYL!~y;Q@dr(op$jY2lcj1k}xXcQp%bL@||Tx z3!I-&vXD{$CFP>NpwbCzFnSQ9FHt7c%2ZNYS)Z=0MPxg;n+2xb-{UXgtAVA6s^m-q zK%WD)ERzc7_AdTGl(Q|sbX`7WQwxE zR5L|oX7yi^iCnn$VrK|dG`Nb1G_;HCme@^aegUVkfg*2X{G}P2-XHBm3QX2R zGsy`|dfx0DW$Aquc274=^u4!Z;i`d_QN_6~A31~phyGlbU4ijNb7FWH;%erZ#|EU9 znT4a*au~R{{LH`Q#`UOV?8n>XN3aG7TI3b#j`+SdDhH)sM}WM1_MrlfJPOVS3Z+x^ zh)|iC8&`Ftqj9(GJ@`#pvgV^DiX#Lp_(hl-8l;d^cd3gB+*fKIZm#R{K~jw6q+FRN zDeqOYjlbGp=Z(zEmiDK~+QL+Wo@scD>3z?N^%J7M;spCqoK_6jl|ySQK((Mh3(yL8>ADwC*sdOEMovechQp^nRPu*gid^z?)+ zJ6frEex1EthrAMpy&~#{y%UEBP-_qP`$so{R9FH(^5t{m4h7^@gdzkJ3(JBHSN)8^ zPv76WJ-mdUMuZ;rZ*6F*q9{hSGopbKw&KTbT>UG=n*SNH|Cz0KJ1t0;|2uRFWj6vh z+Z2D@QEF(Uc}nuBw&iokT7*0f^x8H9pY8k5pj=d0>i7 z4Il=}o@Cko{ZUn9&_!tPSl_8+(WsBAp`02;a$n~r_T$gT?p?dGN;NF;C4F<=7kI^- zg$n{g*SsdYPsYBqmaH}N)rp2$WrKGI52t?fg!H+FeboqYB=sb6Tmeezw`N7E+nYm ze!>RHbjSi~up2Qid%s8Ui|^tz$#Ql=Nq4Z6U^RvgUdVTfL3|ART&_$-YXal0@Z4iA zBH`26ADQH4LMP@G&;UII0yT*CWuU1N0j&jTWU6q!0PjI!uh3qqG1D3`z=QJS^Sj|>5VH^pSjx)9AkxUH)#uA@1zq*FWvYW zQHauQ&>R-$4cnptSvO-}SZ{~0SPS7Zp87hMZOLqJB4ptYkAe$pD~}LmbY_6i%LZ{y z(&R$5Owohj#;s_2lttSZEl6=n`U$8rVFiGa>FU}#g{r&2IZwiqfeZg7MB*)KqVz84 zXM2(u!Hv937F;RSpu$f{Y?(rPgdVSwu^`fGZX%uBpX5Ss{iLb$Ff=r=-K6K*w~;)L z&fyS`r;)^GC>1K*Q`5XVT|4dK*LsdGy(Gi|%8-QiBpEzBY}*ZutxD*yFnZ>3{m9al zl3ma=urqoCa+>L|5zOsvEt4+Z867v9UIBSt%meECNpfUY=Ol?={&)Tuc67f(wEfSa z2cAb?5?`^)pXfMHLZk%YN{gY_Oz@BzNX^T)Pdx^ouu=CD?eztAbVvf`W_(FoM-YOz zoB3Q0uKUssYPi3M1`V3`YTsY?M`<9{aO>F>0}kh9MQ1ftg~n@s?u=ZQ$Yzxh?8-M0 zfI~w*!nkSZP+N3P!oxLo!!5LNe?_KPQS0a}U=Q5Bt|12feI=bmtH^bwXT`}_P!bgTx@qNc#)tC};7PLTc0CJ7H!BN?iO31;gF=FnrL#F)epW0P>pggIPb;1agd zT>jqpsubkAo<*lNo6maKi|ND1=@T?)NVQ8H2B%0x(_+H<3G|Ip2x!0*NgyDv`XVrX zDw~wMp_SI9s$L;bwl>(rZxqJAJ^h>6y~ZK>vBj9nhgp;ZOV4k4GG9gxL}w5moOWp~ zL^l~g@CavsjUQNK7Oy0opabAh1q4g)hL3)KdOadvltWYBwc!?y6`nSuqec|dLoSZS zrcj9BqX$HcG9;qGilo=qCm;y7u9|f`Fxh_KIPe$Wg+?!aTh}eFEG)+X13BwY#y$>1 zbUnX7XuSeOqJ&MY=~r{m%%py?$1{WVn+Wp^6m%A97iNQm5w^krL}DRk9fOYFMWbHImg>_>5`{82?Y_KWDkrJxn8roAj|_ldh5%y`NJ zzZVg=a|@c=0kg^hyIYq>SOxxZzbx)>C1kS5#WWO!%2IE=PN(#{^v&@TWPF6qqL$Sc z4)P=s<{d1B@BZPw;F9;EF*gr#`dG7VT*4%c`Af8Rmp#g!DP2RO(iJ;&K*T~yG1u*c?Rzn2 z>HmX|XVM>^dxQTMOe!1+&MvigYbbPuI#mo`Y$yGC^sP5%=9pW7@4k3GZM5HTRiFnK z2-R?d@o$zA7(q%2^yvka4d1qmZuTkBr5*p3i7bAqGW!vsuI$R#Iz z%+x5&e3j<~i&r;u8d{2cPqE-cS(4(CSq7-))q~@ib=f3;Lg`71rRb!r7D75hJ;^-Jj+A)CIX4QTCzo(XM$aci&xXU;A-`)>4y%{%yRs=MFTqBVK{MFy& zDWf^)huciBseySo#n;#veo(O63f1#+6zbo})A<{n8ZU>lwciyy97v58Y44i) zE(FztQh`gYu;f|Zk-y&AjpVm?U_`6uDZkc`(lb)u= zD^;aJyonSG4vK=A4}Ljh5xbRo5{VeIh_clylK6tj#noI%0KchcvvjN0)KJDrSR9jW zYiobAN%cB4=q#|bXU6$$ebfeKRL790;V19jzGBco!_POirahFRmB)TE-Q)cqIRVF< zpvQJJc!yb@!phWW;Q;M}Q*o!D*%gDA3nA@>O)X5>`4puk9mBo$q$?-_JZ3AOw0=y+1U z2|eb`?s*i#%;;p_6V~X(d+=q?p5I|W){*=rZEL{!PedK~<9o%Er!pT;t8w~vYV^X5 zcaKK;K;HLhFsT@DY?`cQ%v;*tK1ppr!cOb;F}DbKZ!J>`@2fF!|8#BeF}2VJ^=p6mkPjqPe6(a=%#mD>D4VNBvY@ z57S_2{es^6{>no3($vI6V!Zz*JbdaGwj64rc38?nA&>h_OCi^g($+(sQ#mW*w^-2t z%AQ8o=WmVEN$yfNv^;ds`CDyMC+7mPXw0`4y~j2xtXC5=gtJOALfMWbl+tyd&0BEi zW1%FN8{#oZ;Bb%%H=)HxRyia1@FU2#8*9@IQ&BHTZpN{Jtu<%Kt$5akGde;`4#o&XwEo z__EpX7i%*R<_#2Uuc41i zxtP6teg%wpI6IspP6n&-@lDw$%5&XQuSz<0AU&yIZ=z4PmE6DRE^S2-2jbtSIw~5P z1PEQ!xLXY`Y~eb#C2)egSq=Cvp~F*v z4exBd=yi1;SRd;OJZ0GODF!PF&m(=0>ma`xkTVyd5-oVFDC=)qD|OSa*JMeL)I?O@HNoIau}oRBe-J0lEGI)7q}8jbhErymNCd**jXrMz3VBdkTT{K7NTLc!Mq6@?&B1ms%C29VT_aRfSfW&c>foM!4n6KE$u1d> zlW`BJ-0qi`*DZYvP@+~OY_!0x#*Bf}iOs>WIr+BlyRjzT6RjSp!)-e*UC$ZLb{890 zVaz4uX*aR$G&Qpfr^{c|nsT)pwKMYoj%K;->vjg=eay3_puYUtPf}@;`GGqNav*Y% zFzccO!tHVE3Q*)6%aJ5yL>4#u;9M`1QM6+b>&Jl{>qcoJ&KB(>xa_m3?b((&^8@x7 zyUs(X0uHIrZp&l~K#M_MSy30FN+qt};_*bMi?X8zA1H@0QruE|AKXQUMBjQps6H+d zjraSb{Ft12rXGhYDtqtwIx1{onQ_r%g?vwiuD|@$b^03du+=+bO(r;N;vL&{Q5nq= zwj~T+Tr8ddJ+c>0JmgZsJp?49Aa^sBXi@$?l^mbI?d(`e|cTbyojb3G3fPT4Ne@6sc@nvvn<*4dIqK8&2 z<3@ol%3k#2eB#9y9tlJ&!QjLN;nx0-7GTrD;;(gkhGn!nY7O@Zlcm3Z4wo{2<1aJY zq6k)ZnA>>q5&Tf{KHm>Gn_a_yR~o2VoWcJ>!IfkUBx_*}+rBUeYi2!o8~Qa;H1-j* zJlPY7vb!!ntm7KJUU9PJFyy}@nNJbkW%4QOX@&cupR0J#LXMWuce8_!*AIHOiFcoF zXMXGrunqYsVvkC>PBBf7#paIY2V|QDjY*V@+_;fkGK=dB5~}9MvtNhH>v0gu!uWlv zB08)kcP9|fReQ#)LWbcK(hQX|Ney;9;&awO^W;?*i5@s30B^Sk+2m1s#vB zgBJn~pRw8_Q0w@xfx=nmrnO8HEY>2&0}!EOq{3vg0iv}MB-r!$jn;1h{yxR+yeSmy zyxou*`-mKz+>#0yYA@?`fu3;~4*cA>SxQi?uMM?RjDSDnUL*F=dISM4C)wHaE2)sCUO zhpma(j{()&$q$g|(P+>eyzMg9`%A$`RKWE$-ES$w^v+2SK@#+@qydpoMg5Q1Oox`@ z=||X>h)}et>>3IJTPzV#lNO45B-7yeDlrO?qXq@evO*p^lIe_f>{qg|0KyDQ@(381Wqk!r4IpgEJLwN(;rEQ7S7c(N)0;cZS@+Yj zSgsV*JQ?UtGSUy}fD(c}iEq4jD7(-z{4)ijvo|*!@iNf6kt;9fa%$MHcswi=Wfq>E z5daj7mtGd&FS#-`1x>x!g=|GU*81-5Fo=XYPhA^sc1xAQ?BDp0s&=v8rnQak`37a zZ;G_p6&&z&;-S!;pF)kOF;RyYLN61vFGzGOr>7t(Rhogm26eH-}+@lU1H|`=1V6ewd)U{ZHBal&P@bI zlzU^-TH@nF5fq*j2H@EWFZ<+P`9S(&Yi42!fdieWk{`QTjU{Hda&=5>7eA{j1w zjWjtI^R|4X0gLk6uggELsL0+SojMNyAye|y4tYEKLC@{R`^mFHiVs(&xVQpR_W~*r zK-ys+RR?hf*SoCU(`{#_4^DuzM%yJW1c$ z+4(`oQwEA1e0SQQl(G^!->ZJX$NK~OfRkawNoVKV$4ROSp=Fc1g_2E=(ZOH)aA5(^ zQt=VP0<2wJg>ygdMxkRk%|-6s;U70aJri7tC&T&b{%NyaeEVVEFpq02+srP_onxiM z8hGqPL`1tn4C*LwlKXl}8g;2hoPWLG!KYctH$Y7N@_u)xU#*@ujl{j#SAA0^+w@c% z{yeLppaprIoSlIBjGGOxZQ9#eoZ< zLwD^5V(g*!!uSi}9g7vM>sq0=&|>O7<<`CNAxL$3-=5aHZM*SIauBDhc!w}e0%*~H zWUiSEv@4p!Ny>|OHk%Kx-yoHIjm|o%9K!5KLH5_@IwcW6#t^URQzcX^dm(c#&E!F#LT5jUk8>mY@OxFkb!RaXT ziGkYzWSTmsBkUro@9?jAA7)CPom}Y^L9KGzH)i$|!rPAX}Tc(2cY+05lbW}Xv?lZuY1^ZkC49cRfEYjl; zG@#Fc0&X5eq4!jTB>aBkh?t+Yq!tvQ&?B?%EhOCOAOJv&R8*|E@Ft44)pkc1upP>>ymvvyDpLjO(aKp{9Ezv~4tb zqy0(GR$i3`w-14qBkpHwBeRx`!Yu^fucfO5_u$kbm1@#4m$gsMY|_%70a`69CI`mwRL zwO+clK+NAbvo{#Ewz_I!xu@NOqYhg6ksnCa9Ma=D7>~X`k^P>B4rAO|-kZ*7T$lWd zkei2xXY3ZchDK3QI0YcKpY%c$RNW$1^Z=q(d`y3Z`TWlkJ|GQ=}iUC||skJbZ z_>cvXbeM!I8hFPu9ikg&Cll;T#LV%#pCRnh20Y%B{q}7+I-UH z^DuOC*GgFvU@cg;vY&LHoR=o#?%%e6-cpo{GvQOg@D0Nw?VNgEz--!sd)RK7xG@XI zgj5j>*FLm@nnKWmsEvRmEGh?Z#!wF9%M-(O-M8Xg@R_cip*=k$qWGSAsMP4Y?fanR z4Og?uJMpK?D`Rsv$fO_X{J1hIloIDesE2YBrq28nJ@C02Va!py5Gl7H1nYNc1gqP^ zLNG#-#w_D$7abxMq5420kS|BgFZ%u^=To@2LShoBG24y~xftB7S1tKoA;(q@%AY%=OMX_+h=FX^c! z5R7VfuIu}LQooA?&m^KgKbpuRgy>Up@AQ`UmQ3fCn4P#$DT+0f9k}oqd**7A>{AyO*^0$_;f6IcHyUUnBnW59u@AAfK_BI9CV;MJg!zs$2) zKlXQ}*!N(roceb6tUYX}&Le!YAN@0aeSWhh@abl^1b5>&Uw^-ePNmMi66JSgVhE+* zT)iPBW41 znb?Ge+=UJq^We8{ejC)YgW^wg@$SeVJBWT5v)~aCKtsE6+A}jBL)$;ZMvkj|{6cXc zli0XfG+3^*^L8eHYtY$OIKK~O-*R+%A!Bf$5Jit+ z)ccKeS|r|9`ZY4-$rl~$WUkKfts5O5wNx$SejeD$KE0n zn**U!MQm=Cfa*0#S}17fzOvIkGPxkMd6=H{8C}f(bNVm5C{gr(;6+_o7AfJP@jv_| zqufB~1-5w0_fK!y#?hdG9qU;bb2(fOVPCooTi?qr=6Q_aDqftmPvV=j>TSXpyGdoqqvv_GQYBZy>AbGF(KUvHDeyv82 z?=P7Zw3d}!dV!C_`!&#R7afPq!A z-3G04hDiUNOKkV>FVLr+4`R$HI^S>^&_XmSY=l&0T|k|>dDqBjar7n(T3gf)9wDn< zhlH7af^-EjVy2Dfe$>vVNf)-|3T0Kot zR=)T)9~KpzkOq279GGqJRO_VZ9*LYGBCUW^U}Af!mSzTNoxw4d?(@&rGy;h4Q%r3* z%q=n>x99^Mg{Wf$ZDv(#qdyOd=P$ry z{HDW`Q~DGpdZ*%hU;ji|su7Z(|C)$ca94~w{i8K6nU>Aq1tFK0s=xUeF4eFvHbStP6Fk0snsg+*1g?YIwW`s7OL4^ za;g#){N^n8>ky?Ixhpqg&@2?yiS@TpU?bmv?s>@w%FeL4zGaF8lL^@ z&jv+r-sGNrUlD(GB5W>T|AGR!lP~pC+xp(~4^2W89h;gN%>^REdz$j9SK1nxEABsA^J_f&Rv#(j{6PTNt`k&Q&p%xAkQP>Oy*}Y+?Xe z20n*y?2>)>5w<~fH{DKxBNC%ZXmx;DWuLwRX+IP3{6Y%%F8|Hs#VfK}(ksc_z@LK# z(z$g(`BGy)=SLZ;BO{nkr|6XP7<2?3UgpCSz8z&Lr_m$7>Cg?iM$*+<@-?sf6xDwF z_ugYs2TCpK9_x4J1v|}Xo&g(Zx{$j*?Z)NL{iV>oOlz5skwmN%lspta_Z@OMbIh{= z>7~kEp3Z~Lu474ds~F7oqL~B-;Tc#lfu)n>gy#bVvt9X zMLvY>^3CLyh`-}5aVEimVv3o(LgUBDeK|2+!(eOAsTAACH^khzKo}c2m&#VXOzmi4 znyTcs;)9^n}jQu?yg(32dX;pN|a+#FKhcErAN-RADNs(YNb97bvnBYEXMIEg+g zjkKbwfX_I|5-CltKEm-7Z@9tld$E~i5>-Z-vurh5%%bQI(R>TWv4~b;BmhoEED4KA zu6!<_I;YiuDazC-o~Gx)l1mYu$_^+Eif3`f@fj6=QI672r>!L8^&uWC2j$Zn2~t(G zdd3FRUDF21%)Vf^A8lwzalT$>Xi=#2q^42$E3L+;-SIYwHqNMH@Uvn))wrm8;$Upy zt^ajPu;|T0=K20x4uYOnQL9eGD!6JMgFCn3yu=Gr8)i={zR< zSJo}><;?c7_9cw9z*%Qk>&B)~N!gu)GWEk_yXxB7U~Hr8nS#mRn#9rnJ}7ynS5N;L z%<5yh>4FO!{d#(H_Xsw|#|1$Ek zp$ehCK%d#3>+3FlDCkN0LzJ@}6|1~xx#}w<$d`=`5;)d;me{uroxeW>x~=nk^|c$tTKBV4-oY*lO&|t8C%E0p*%J^9=sh=5Qu)x-fXq6TB?56o%n)GL3d=tct~#} zEyFKbT?tnp53?dTpyMb+0{bMzZ`tYT@lqU@&^723Y>kLIGb%xTz|{u&Ds^$)DLC|a zZHT0*@F}K%Ef0x?)t|YOm|jbqZA^8XpC(w7-6 zFV+d451y}7o{sFFMFc;BU2edm7UA@AB(Giq51TaN5sT`_F(q!Y=z$9g07;U+kuCYWhWmFVQ61XPkmD)bRUV<17L#7EDdyLJFpXMvy89vXOkuem z5pe~<@R0dbS&PP;9Vbq;bMKGp=#G7^m1@mJqQD!W~wE$4*pE7e1bC#~tv zr=c7U7sB?&X_2y)bS){BV|MtAnlHMU?_~*JC7PYGdgxndtmqWy>~xyDXR`~jY;r- z&``9vLYBo~>5XWXRbC}2NcGCRf;%3|ZF_3@ot(B_O zEf5HjE0|N2@JWZtaDpoEj&+X^gGT6n{w68*& zsJNc!iyQgZ=TAQ{ifGR#oUBb>wB%FKyQK0VA5$0Epz3nu9_Lj`v`I!ck-!cE?uk&ETxhmd~TEIfx~JO zE<^KLld>k?(iy``Uq(t2V1!hltR&`HXBr@6hm#V!4mBtc5ldDnbIh-MX)Jh?(&yu?V1|jU5WB}T24VD-WL15Myz;fIETF; zVbwP+5VRu){EkgqrBw74%obD*`kA+b2!oHC3dz88HKk-Vg7jeNElJK)kq-N+LhbYy6{43MJEGSJz^Mm7 zxVXp&00T*OCAe&t#2l79YH{H}5{!GXrZtB~DQ#7XAd!WjV$#yPhb0k2W5hcQuU6$V zt7cKj+GVdHg>t7IRlKJhqb83t_+CL|FHcs=s2ZiE-yX~w>2Y~Bx#Ts8jwY<#Fj)DX z<3jkPF?029j@qbzv^5yp>(O?Iw$~~;20J1RX2$pT+4N*I*R~mhdv!IS45V}M8bt2|zB72;H!G)A_h0@a&$=Gpf}ZIn2qUCSo%Xy6sSmRw3n5&X84|eLwLzb3a{z3#EP)qDA+vsl0$M2>5d` zV73wgnWeC8zlZD9{$z5?14#CifP9gsdP^I;@n)IV_bc2nX%s+UasFWeBw;s=B z#xP;SRl@B@FFH%cQg~O#$n3T!O%t-CX_rGHIS2RV`y1 zV+*wRiTGWpZrVqbGA=O3XV6wR^>xEl<$c2yW3*AR^19_N{n|}Uf15-YwTI_Gp-95n zte@}(Os84s(Lu~_ys&8E4@}U8;Tsb+8oCB-ym2qbMS}Fm`Qu^ayS@%(d#&+3 z{;CyuFRL~Yk!nG#D4Q82I01rUMTZxf&x)mO$Lu7dEn5}JKu&&MWX^=2wjwW3n-WV* z6fA9}uqLF+{cR{WwMWl$^GfK5rT#RcP&BxhT~w0r4h#n*uDvPvt2i;STO&|*1Cnu_ z!&rDCz1-aVJS_*Wl=W#K(Q@$Tr;YN}{_=+%-My=%Jq}hVZJMrC>EK0#MsY81u}Ow7 z%v6YqCtV2+U1c3U^~nS@zFnM>EIxY` zvea~5JnRcxcxw<7lVDMUMipvYzgjXJa2pA-oIS?$_F^kM2IZkR+PpSZI0o}s@DF>+ zR}HjY`y?LN-)XSFcZeCZ3W{gwb?M0tOj6q-+e^?w?E|~HxsgQoOR9te(WEm_erqs1 zMtluyh{#&K|!(lH^;h+7+11>cr)nO-&-yf}EpedSd=Nr)WwAD7DgQN8nK zB!3+J;Dc*NU|Gn?e@v&q-s+gvG#oW@?&Mqn`8R+rjv7@(K5!30$IAZ+mk;|TV!KQ9EZ9HdPZe@>&k zC?)-BP9e;X$QpXd(iJfk*n_jX8z2&{ z%!){b{2bu-V9#DUNALYvXlUAaW)xk$7zN7^8EnNt>w6JiPI#|@|F>LLBZ%UsE)?z7Y{qi?4 ziYTqc`Y`7xP?$p(lX}>?kr41YLVwuz9Iul^3;ASlwImn{`K(;-N@U8~2QicCG^^-l zi*8RzYTI2L?3W0d1jFc#*^GxMY#WVilRu*BIc_6TId>;4InN5`Sq}{jVYK>&fTPBB zV4Jbq-7epsB#<}#FxuukukFlOhMl6D=ebip&Vic;eXf`L0cJS_o04|8Sn;K2#^j#M zz{NuV_WGR!i&Xt${;a-{r)NqP>wm_zr~4E5RFN8RX9a+ae0+SUh$-vEgUz8ypB z_;;s8gC;JLvHIv$0uthC6F$2Y_E)?t$YnXoUm+HjX4{xKF8za3>%<$?ZyHCRJ-IjX zJk~y|U8f0Zob!J<(i_1Xwj)|Dwbr_EMof!F8&oWbXZdDbaX=o~Z6*gJbn*x1&%p}{ zI7`hm+G;j!^uUgKQ&3OS(5;q$Tk*~OXqUu}fbANFKs>qrj z{~7+9NlW*mwG_<}b9VKViJY}JZ2k80$w>gp>mOR8CNbJdM`mgBtaGFEo-FA6%G^~b zCY3NXJ0JYj%ZGBffZ>_T%pGRKN1o)5XFkC!ugnv(As`~EzQnl_FY0Lg+t*eO9A^f}7gaRNbG}iSjAN{LQhGYBv>DO->^$SYBXEE<^W!KKBRoBz0 z%6ooLE_E(3^&wd(~SCv)ILQ@yZfCK6NvBa{^ zEzYMKrULK|vad&+8VRX$AFhP6D|nc+tzS)CvxB2*L8ry+x?)I54MXFse|{PR*|_qm z^3ezO--Molh(k*s+muC-TQ0_UJejB^*v<@gKefmAPAfp!3de0Ub&%$nBc&Yx05z_c z+X^{zOi_QVG?X#$8Dw>6jAIC11_Uc%?n!-Az?@-1cehRra?VB96usrF_W|?{_iK(B z4%1}s*V&Ura%p>Y20a9OF}*wRWl^N*0twKpPaz#N0u6B$brqS;x&q|n623<#1zMO; zjG$A8y8VtT3;oeH(X44z7lOghK%hSbh?7}+;-vnARlz1YzQiFan*K6^RPBc~k9pIE zbVobOkj^>IkIqi|6MJ=9!VNvuZO23zwbRKKB~TLust3+*BtT*IMFS1kHJx zt{OH7dvx^Rd;m-kLl1JeY3mZ`WQNJ<*dlQiFn2coBq)?=`77f~#DtGsMrq=htw2(@ zgKc1mqBJni_+8$G{Ll`z(*}6tH$Zu_2Y4ZPf*fx?C~G*EF^9>2?E`e9mDH+)0;+F< zg20#PkMb>)1!{Sx4(4)e^{06~vn;-ZptvAs?Lnv=M(aDMmI=D{im@4nJQP1P2#mJJ zOftvveuGj3mDL!yjGm!+05McO6!j*Z$=d3=nAoX__Wxu=BSUu!~b6YE!H> z)$bC80;(9^q$Zq%f^?rmlw@mOYaQ`W66bBkKP-{^{UE3IqFhJ-uMb2rVtaqJb|}N2 zOn08^TGx~OP0_vnQuH*CW1~p9G5Gn4>12bao^typ);SG)ho_NvS8{aVJn9WD?msqn8Wl#+823TPnTx zI&hvkK5tD2+$TY=jacIcV^E`3qM@n~{Esp(o~GS>Q27nq1^gb%u209KebdyKjxAUB z5t|+vn$o2<@)U~=W6V*q!%kbi3l+cPxbe>!02044qq_wWN0wT|f%D-uqxP}OW;3lD zZ_VtgO_(|^vENK6Z~3^YvUNE0i04uVF^P?J?81jTm4{FJHF}0k4}&VhKLZ{a8CClK zK1^lV4riitRLD@%?%q=W{YS%Hb(i>)j16vA07g&Ke5zCwhTF6 zN~!Az%BeC{zp!TkH61#6#4fT1`>pyyb*-80$$A@&*`6HiI3_ZF-Gsr)GHC)SJZ=CNfvfaq~^a}vSavV-5_TE{EU%KjG z)YNxH@u~Db7cSUFCjDmh29b#e#VXJl(_=z)7f*EyjZ5m5N{)8kZ>-ACkNEdWaVecn zaH{JM@jcp&F^Me4mq?^)gwu@QP1HfdX>M~rKp?&-YwN)pQ+G}?Q=8O5w6KY+Qd39I zP)p%6i;T-Ha?h?!>h1(h{k}Hn!bg&~fY71C_^jni^@ohYAmj5G=ifvRVe`^25m-F?W7*y<9K4T}uDR=uA`QrgzsSdeZq4 zfG>OqiwJZJ9C!6 zumyfgE!3tU)=3h!n2CO{ghn0-&DlecQh7Kfrev12t04VgkaKrLe4)~K%2j8gxm@w< z%@9QGL@o+!IJw}P!u?xc_#b`^PNfhaJ2mIGlnNo(dfcwhf=M-`_}~v&4hBrR39WoTa|^t50?!*L!qJe!SZ^ zXKddT!YP^#5tgYu4CLc#IK{NVNTM`~z_%rShKDHiD#SXdF@T3t32*Xk_d!$rGnsZOu?(N?3^Ls9BQpprf0(td)$(}=9E2I2Z zjt2q_^=b`M0*(-eyAjd?YlCHFOV2Jv{?o7|U;ZRYtsU~VGaK-?=NAu0_o4${D;M=k z&eun>>*IFr0vK%P~0cB4D>SYAqZE($voldy6{f0M47-!*%nCsJz(pDVn0y z_3>tUdsez%%1az!f8xRMn$(BI@mf_+UaQQou$ER1KP(5BM2>-PXXUhy|7?f96%m${ z=lPDugsB!a_C1d{|%K%l>HU?Y8@q?dr@& zR-h}G={iHO`{?@XSUC0s4$r&mBPSz6)bj0yZ8`o6_skpQ!jRMwj+)b;99F&|oC;M0 zqLR+|DC-P@9xkY45L@P%i@Y)Ggc?W~9~uqQ3CDZMf}*58o6pcuKv2RbOCv`5QDf}b zjdKFG&h$r-g|k=EXsD@kmO!(BIhY&Gq)ddu>3}C=sI=afA-egt5;)Vd^ZIsKpjK56 zEdyWDI|Tx36MpJodf^0Lwg{)9B5VH|6?83rh0ztQ@*$Pl8UAI4O{b6w5#gEu_}&JreHQ#%8o2S5-ZVee7`X}=?b2Jzm~nRaiU7Z1E5^*t<{ zTgE2xwZG?mni)T?18dL8HwaudGHc4y!zyBgNLz)y=K>@l~)Wr!3zHOaV+(Xq&r8A1ZyR(yGA} zj&JD|)p9ff3TfTk>OT#sY?-$03&3`64e#}c?(_@dxvT<-e}FpohExnmAJ}r-B9N5S zVPVrzLYY}eQtqAS0rt-r8P^YRhb?Gz%gHh|9LMij8900i3zahH!;lga|ATi_0o-`; zbk{;0I0_Ebqe7)>W?Y`_vY-3|1bXBCx5JtNJ&d9VZ@6c6)Rev+cIGHSkQr=Mkm|%6PE+G`J z7d>~m+PlBqTSW8F&?4?=1HF?^lWJ|j#$aH$?K*hL{Sa*byeYa3FgXMwH~jqoaS@nA z2^hw@Ynt@~#^|uR_iydp2g4yHBd7U5`II@FwTBI4S4$Gm(egVNqR$`==LsH^Sw+PA(xmtJ_ICvKJJ4-s*9(%1>+0fDlAPDh; zyGTsGaT5->hj|JnxpWSO(9<+Gfqy`6uax(yrC>VLOS_b7i-*`JuIB6o-)aR&7^j$R z;LR^^dc+w$@aV!4J{KyM9A3(a%wbljsr;SQZJXH?e^vvch&&r$!W&ZVRk z6PNQbv=zZ6)Rjz`#6@teAl1&yOKajw?cO!9rQLo^6>Ex8Vcwog+jveBHh#F*ShZa# z&0Y;@G;@N2Cp$QP@aWs&b`R=$pA9=`#{ACVpsfgec`&=X zSkKKPJ+E0+z#=%L){cG3D?{?YgbMNKUPOg(RBEkiYWgk<`W(8UYSY`hvC}&>ek1;~ zFap#v!!}-u#$FhB;868-(et7fM>{US=S^l4cdQD~x zdB?2*JU2H~G@7|zhv!S>-bAYpk%r+)sIpk9-$1NQQ)?9bdR`3C_eIp}Ooq?h59Okd zx+`Z5YI$ z1o4GsDya;|^DT65!^)4;5u1< zO#j$0IV{U~v+Q5Ya6xf;1K)>nJZKkBn*c_loGE7QE3EgHH@Wq#k@miwn7givyE#21 z5)?0ajK@9^GI(lN)Qri<$5e&2mG++Bd3$=sNQ1(5)dYFrD z3s6hdZFz*Pj>6j3MY$Igwa;JkQ?(JrMh{AUcVqCUj!%j!?ToRjA9jh$))ASAcJz?N z0vgs;@r}_7Oij{F7Q<9^(+JRBt0TEsv$(jP6b^AN&G%j)0p@wWLo6rg5!M(~m5}tv zZshf>UjJssjaJ6vp{~c$E6wV*sY3E#EJlG|hg5*5h2r1RC?S)uB@@Lle}d$vgzMCL zO*HD5HC+mqsmQMfb?iDF$52ETN~#19*WTP3e#1QRfExn)FFFvFy&vOGB!(jZW_A&D zdJ{;f5N>%2X6iy4wZA$Q?>|Ov-lqLVSv#`|swMLKduS!>{7YVr8K_g@VJXP7c3m1P z?~!FfnHWr&)DJ{sPJgkjk{Dnrqm0+b)d&9i&O-2wRqwB{=r>#>A+A(?TQ^9YiD1a# z*GRO(pZ&`Ye16ZB%9`v}G^dX-^k)E#QS^=*O%6B6i=yl^_3`a15_~2~9bzDlF#Sik1DUK71C{ljK(5{$$IsYARMx?q>qhzhq%|!ftXQf z!8P@(a|aR@uU2AKKqk=~4Bv4EE2>3N zi$YU)EI-LRcE93xSnKfjq;OBq_*8D6q!Yf+H>dMnR9Tpv2HEl*^mFSbe#I||1Dlq= zA%=m4Vm5&+D2-6~L7`YoAwgJ);4EhQ#ev81tWcz~&%WE!-$&{V3F;^2dcX6{8{>h_ zVfMoIivQ4ir5djh%W4_Xkn#knU0dr-vZBf}%I!Vnfh%2rt6hWK(v9TsYh_hSk9>J} z&C3ee)o#I%;!GPGIQG#$&(I$~WJDtomd5_OPSI2!jSWUAIxyg@s^B<{fwpat)cDaq z{ZrRxK7Q=KW^%e$$`3Y=9x3|KJq^%-Q32=}aA?cC4!;5$yqRe975>gOedA-ee!sq? zuN{up2&LY-c@$5F7%uP?2PNf<0WHa~1q8tT*~EMn_>+em?lFqzBX3mab&! zGr)sd%b_x4=?(^A)5X!#V3-KOEDLNmkbfJ!D&@<6{k=<2W}UtX0v3PT!g)?>zaI#> z*|nu+av}K3CX3DHinhU3Dn;GSjFv7*^o#lD99bsK-W5w2J{Q|uIjfE`OWq5fe8Q+M z0Y>W|ZwTYl5lUap1oZk}Fw4tmtIzs+d2slnYG-hhT7vQLrO`3p77MLcMz0rVII+#H zo|2Tc9qZ^UL-p36wWg-(04%JIA1sa*=!|6R91+ABG04Oq&(g)2=IXcL`E0oydG|@3 z99I?Mz;nhy7qR%8d7a-EetlDG=!dDYWNiD`p(hsKrfI8T#jx8FhF+FdY3ig8rE6u1 zM?bo0xzUyRAfpnb8U~Q;gms^)e=qPV7T=$EA^U5hdmCKoA-FW_Z;X|{ep;DKuZ-J;)XU!6>mwVH&dK7K@8wa%Y3MjrO8$h78o$!!i;nr;# zwjaLs-kkO2vs9vHx-`iv{1b`S1x3+d>C}mogz^fZYNhdjro8pf9+7O3(do?pCIMszn)Q|4iGw-V`FD$0%erT`|y(T zliW#Lo|KO}0cMow2KLOA3n0mD!PVyDL;V+P4=;nlo893D@y^LQS?R8ya6%-2JglKm z0w%59E3nHh?)~4R-03ffaQzyuNo;nvr2i+jF7lL9?#$O`NqnP)8h`wA}Lw z=i(-ndN_qZ2F?4!(mss;Es48`MU&Iw`?`0^GznWp%55oy!bgJftM_nrJ7fQHIA2sZ%%3q(Pp@S9$t6?@sP z(})uUbME47ktE&?%#FPct5MbHl4tWSupTnv%$nQ-Z4sZ?x7^@75MO_ti7l;_uqz)P z(Ften(Q{ckSXz1y^}}j4hz5`p?{@qs^)vgsv67L?}HD1-K3Vy(1MG{{C9oy_ggs>fUV+tK>C-8diA>q=h- z|B3_S3AVrGtYiCb;Ogo@d6Mk3ZmY;kN=GDUKD}-9nG5E){?-zdy;-|+r|$)pvjPhp zBhaBt&?K1NKli0HR($=QOZt5kYd;5_!Ch67(`g6ykaGzuyW?~%aM$^T9*dK=>T;$> z4OU_CkkS!)v`H!`7+6SFMdsrF4LUuAhzlx~sh#sOq2DJU80_ErWQ4mI_B`r_mjR(; z$RSd3&b_z7K_~9VYgX2IVr%30XmscVVoL-^;-eb zp~o=-;>7-OmNvbX$dKg$B3G7o zLJLRlES2mlnt8U?Is=(SCEx$-{t05{WGqa-L<>y5ei{uC@O6u4()T1SQkq*3=rY4U zJ3PRtZss#_|EjgP+L;t41S5_3K^V;V6DdHu--cl%qdlYAuUjCz^OKgu8VZ)1JDyeB z#bSG~y;tW2>B%wvJ))EWEhMcm!!nh_h$u6iM*XK4&DJfuWr)Y&hc#Yt z&(DUOh*0^i2C2ko&TYbjmp7psjW93nRbW;$0uS9%x1T?s>Dqg~)z#H?S-^~tW&(Sj z1B57fP30XbPH`l4dD$@Fcqx(&d8{t&P%_ky&vW$P# zo2OMN#J62kH1XvALS!R6cv3+if}_B|vUVm-07#rL6I}chb8)Fl1-p3abtbjTq}u}w zp`3DsVhMR`UQaE#O~>{)k1@0yFTvAWtq zE%K)E_^#jSCahRXPb+^~X&`(MrEIko9aS6+a-xY;gTf$O_pWYE&^=1R=I!PCalNs3 zN+4E{)DQ>X)UbU6qF=vsjNq$8&uO8MN;zIJldP=ZoV#=`IcSDmX&W&1blu+tOOzS3q$ zw}k66(&6zjV5w&gi%=@;2ByVeUtB;)a})f0X9#vMNynze>?tF zPpu+B;qxt(JUXOYYrhlFv8Ds=dIIme_{@!q%;vz{{wQ3OQ%FDMPLq=Sp4XD!od{7A zqRKO9UaP8>uP2=N_A;tqK;8viTf_u>C3m4nwBSPpc8lA#8!_T$hMx9)sHuUK1H>Ru=LaUZe5jct+w3dgVjK#-CtxfUhkd-jjn&6f{E$o zF!%6dq}zPlJAK666UXoq1JPCB>xyZs2PlI~f*g1pDTKB&iRXGeXE%wR5N57NfxO}G ztf~0Oh#x4Cl8U zGzG6HX8)@N(6p}AafaI;sY0v1Qmrm3#SI~TNp9X%cz@8E5H)BdI~L~u=e-uXzbcXd zfnsY169=z#;%1P{R2aCqbr`@c_wWPzbRy3Q{ZT*s*3#EEkK2B@vwy(Wd5KlXV)^4o z9*4G;&_G`!-NOtZC}p6e598*LovaaTU#Lb$tf+o62Mij6^VK-jN3?T#70vIFd6m5% z6uoD|+u{d}$UpwT&w^;S!c%@9v4U7L2)}ob$b3G~!3_FF#3$_hcNhg1JH1d#B_~Z9 zruVEWFFgri{$i{jHM!;)w>(Y?ecg}Puo(q&+O2xA@-)_lCNTX_$Z2-#y>Dp!c1+4qR&S-lg_k>t?S2bzV9dfx;M)fM4l0Ccg02{*#avhMKWAJ2 zqT&^FfFrpQHfOI}_(dqT`GiB)ozgcMAy9=Nrd@g(Z9&km8~Q`ciPv8EZJqri z<8i~L-O5!)`}*>Uk7(w@R=>8E*7{nu#3galv@@xw{5>YoK0(App*h1REA^Ch+gh+_h2j;i^_8Zp!2c;WMRjui!P#+aZ=L*#+Hm> zpt971I&hnN8sk}0h+9RxJyXAo5l^dlX^4U5%@{wp@VvDcZR--?y{KV%qEpd0wvKWXa**~bozeR02i&@c4ZB==3>#u4y1MJRr&pjG&mMoy45 zVVBVd=ZH0T9Kn{CS*}c>W(FV!fRX6~t{$#TDdZQ7Er04Od-9(HqL3N8;~x-J6O8_@ zFVi8mH4GeYKfvN^wMyn#F(a7f$gl^8-s#*x(a7y_jk4p1o&c46Aj9nIPZVhjKeHY1yGh}9eD*06@V?