WIP: Switch to NixOS #5
333 changed files with 3736 additions and 36108 deletions
9
.editorconfig
Normal file
9
.editorconfig
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
node_modules/
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
||||||
[submodule "dotdrop"]
|
|
||||||
path = dotdrop
|
|
||||||
url = https://github.com/deadc0de6/dotdrop.git
|
|
21
LICENSE
21
LICENSE
|
@ -1,21 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2019 Marko Korhonen
|
|
||||||
|
|
||||||
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.
|
|
14
LICENSE.adoc
Normal file
14
LICENSE.adoc
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
== The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) {localyear} Marko Korhonen
|
||||||
|
|
||||||
|
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.
|
16
README.adoc
Normal file
16
README.adoc
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
= FunctionalHacker's dotfiles
|
||||||
|
|
||||||
|
My personal dotfiles for my workstations using Nix and NixOS.
|
||||||
|
|
||||||
|
== Mirrors
|
||||||
|
|
||||||
|
This repository lives at https://git.korhonen.cc/FunctionalHacker/dotfiles[my git server],
|
||||||
|
but it is also mirrored to:
|
||||||
|
|
||||||
|
* https://gitlab.com/FunctionalHacker/dotfiles[GitLab]
|
||||||
|
* https://github.com/FunctionalHacker/dotfiles[GitHub]
|
||||||
|
* https://bitbucket.org/FunctionalHacker/dotfiles[Bitbucket]
|
||||||
|
* https://codeberg.org/FunctionalHacker/dotfiles[codeberg]
|
||||||
|
|
||||||
|
If you have any ideas for improvements, questions or anything of this
|
||||||
|
sort, you can open an issue or a pull request at any of the mirrors.
|
16
README.md
16
README.md
|
@ -1,16 +0,0 @@
|
||||||
# ReekyMarko's dotfiles
|
|
||||||

|
|
||||||
|
|
||||||
My personal dotfiles for my workstations, mostly for easy access for myself
|
|
||||||
but feel free to steal them for yourself!
|
|
||||||
|
|
||||||
I'm using [dotdrop](https://github.com/deadc0de6/dotdrop) to manage and ease deployment of my dotfiles.
|
|
||||||
|
|
||||||
## Mirrors
|
|
||||||
This repository lives at [ReekyNET Git](https://git.reekynet.com/ReekyMarko/dotfiles), but it is also mirrored to:
|
|
||||||
- [GitLab](https://gitlab.com/ReekyMarko/dotfiles)
|
|
||||||
- [GitHub](https://github.com/ReekyMarko/dotfiles)
|
|
||||||
- [Bitbucket](https://bitbucket.org/ReekyMarko/dotfiles)
|
|
||||||
- [codeberg](https://codeberg.org/ReekyMarko/dotfiles)
|
|
||||||
|
|
||||||
If you have any ideas for improvements, questions or anything of this sort, you can open an issue or a pull request in either ReekyNET Git (registrations open for anyone), or any of the mirrors.
|
|
248
config-home.yaml
248
config-home.yaml
|
@ -1,248 +0,0 @@
|
||||||
actions:
|
|
||||||
vim-plug: nvim +PlugInstall +qall
|
|
||||||
zplug: zplug install
|
|
||||||
waybar: systemctl --user restart waybar
|
|
||||||
mako: systemctl --user restart mako
|
|
||||||
config:
|
|
||||||
backup: true
|
|
||||||
banner: true
|
|
||||||
create: true
|
|
||||||
dotpath: home
|
|
||||||
ignoreempty: false
|
|
||||||
keepdot: true
|
|
||||||
link_dotfile_default: nolink
|
|
||||||
link_on_import: nolink
|
|
||||||
longkey: false
|
|
||||||
showdiff: false
|
|
||||||
workdir: ~/.config/dotdrop
|
|
||||||
dotfiles:
|
|
||||||
d_systemd:
|
|
||||||
dst: ~/.config/systemd/user
|
|
||||||
src: .config/systemd/user
|
|
||||||
d_mpv:
|
|
||||||
dst: ~/.config/mpv
|
|
||||||
src: .config/mpv
|
|
||||||
d_nvim_config:
|
|
||||||
actions:
|
|
||||||
- vim-plug
|
|
||||||
dst: ~/.config/nvim/conf.d
|
|
||||||
src: .config/nvim/conf.d
|
|
||||||
d_scripts:
|
|
||||||
dst: ~/Scripts
|
|
||||||
src: Scripts
|
|
||||||
d_sway:
|
|
||||||
dst: ~/.config/sway
|
|
||||||
src: .config/sway
|
|
||||||
d_ticons:
|
|
||||||
dst: ~/.local/share/TelegramDesktop/tdata/ticons
|
|
||||||
src: .local/share/TelegramDesktop/tdata/ticons
|
|
||||||
d_waybar:
|
|
||||||
actions:
|
|
||||||
- waybar
|
|
||||||
dst: ~/.config/waybar
|
|
||||||
src: .config/waybar
|
|
||||||
f_abcde.conf:
|
|
||||||
dst: ~/.abcde.conf
|
|
||||||
src: .abcde.conf
|
|
||||||
f_alacritty.yml:
|
|
||||||
dst: ~/.config/alacritty/alacritty.yml
|
|
||||||
src: .config/alacritty/alacritty.yml
|
|
||||||
f_authorized_keys:
|
|
||||||
dst: ~/.ssh/authorized_keys
|
|
||||||
src: .ssh/authorized_keys
|
|
||||||
f_beets_config:
|
|
||||||
dst: ~/.config/beets/config.yaml
|
|
||||||
src: .config/beets/config.yaml
|
|
||||||
f_beets_whitelist:
|
|
||||||
dst: ~/.config/beets/whitelist
|
|
||||||
src: .config/beets/whitelist
|
|
||||||
f_bspwmrc:
|
|
||||||
dst: ~/.config/bspwm/bspwmrc
|
|
||||||
src: .config/bspwm/bspwmrc
|
|
||||||
f_coc-settings.json:
|
|
||||||
dst: ~/.config/nvim/coc-settings.json
|
|
||||||
src: .config/nvim/coc-settings.json
|
|
||||||
f_gitconfig:
|
|
||||||
dst: ~/.gitconfig
|
|
||||||
src: .gitconfig
|
|
||||||
f_init.vim:
|
|
||||||
dst: ~/.config/nvim/init.vim
|
|
||||||
src: .config/nvim/init.vim
|
|
||||||
f_libra_config:
|
|
||||||
dst: ~/.config/libra/config.toml
|
|
||||||
src: .config/libra/config.toml
|
|
||||||
f_mailcap:
|
|
||||||
dst: ~/.mailcap
|
|
||||||
src: .mailcap
|
|
||||||
f_makepkg.conf:
|
|
||||||
dst: ~/.config/pacman/makepkg.conf
|
|
||||||
src: .config/pacman/makepkg.conf
|
|
||||||
f_mako_config:
|
|
||||||
dst: ~/.config/mako/config
|
|
||||||
src: .config/mako/config
|
|
||||||
actions:
|
|
||||||
- mako
|
|
||||||
f_mimeo_associations.txt:
|
|
||||||
dst: ~/.config/mimeo/associations.txt
|
|
||||||
src: .config/mimeo/associations.txt
|
|
||||||
f_mpd.conf:
|
|
||||||
dst: ~/.config/mpd/mpd.conf
|
|
||||||
src: .config/mpd/mpd.conf
|
|
||||||
f_mpdris2.conf:
|
|
||||||
dst: ~/.config/mpDris2/mpDris2.conf
|
|
||||||
src: .config/mpDris2/mpDris2.conf
|
|
||||||
f_mpdscribble.conf:
|
|
||||||
dst: ~/.mpdscribble/mpdscribble.conf
|
|
||||||
src: .mpdscribble/mpdscribble.conf
|
|
||||||
f_ncmpcpp_bindings:
|
|
||||||
dst: ~/.config/ncmpcpp/bindings
|
|
||||||
src: .config/ncmpcpp/bindings
|
|
||||||
f_ranger.conf:
|
|
||||||
dst: ~/.config/ranger/rc.conf
|
|
||||||
src: .config/ranger/rc.conf
|
|
||||||
f_ranger_commands.py:
|
|
||||||
dst: ~/.config/ranger/commands.py
|
|
||||||
src: .config/ranger/commands.py
|
|
||||||
f_redshift.conf:
|
|
||||||
dst: ~/.config/redshift/redshift.conf
|
|
||||||
src: .config/redshift/redshift.conf
|
|
||||||
f_rofi-pass.conf:
|
|
||||||
dst: ~/.config/rofi-pass/config
|
|
||||||
src: .config/rofi-pass/config
|
|
||||||
f_rtv.cfg:
|
|
||||||
dst: ~/.config/rtv/rtv.cfg
|
|
||||||
src: .config/rtv/rtv.cfg
|
|
||||||
f_ssh.conf:
|
|
||||||
dst: ~/.ssh/config
|
|
||||||
src: .ssh/config
|
|
||||||
f_steam-native.desktop:
|
|
||||||
dst: ~/.local/share/applications/steam-native.desktop
|
|
||||||
src: .local/share/applications/steam-native.desktop
|
|
||||||
f_tdesktop_lang.strings:
|
|
||||||
dst: ~/.config/telegram-desktop/lang.strings
|
|
||||||
src: .config/telegram-desktop/lang.strings
|
|
||||||
f_tmux.conf:
|
|
||||||
dst: ~/.tmux.conf
|
|
||||||
src: .tmux.conf
|
|
||||||
f_yay_config.json:
|
|
||||||
dst: ~/.config/yay/config.json
|
|
||||||
src: .config/yay/config.json
|
|
||||||
f_youtube-dl_config:
|
|
||||||
dst: ~/.config/youtube-dl/config
|
|
||||||
src: .config/youtube-dl/config
|
|
||||||
f_youtube-viewer.conf:
|
|
||||||
dst: ~/.config/youtube-viewer/youtube-viewer.conf
|
|
||||||
src: .config/youtube-viewer/youtube-viewer.conf
|
|
||||||
f_zathurarc:
|
|
||||||
dst: ~/.config/zathura/zathurarc
|
|
||||||
src: .config/zathura/zathurarc
|
|
||||||
f_zprofile:
|
|
||||||
dst: ~/.zprofile
|
|
||||||
src: .zprofile
|
|
||||||
f_zshrc:
|
|
||||||
dst: ~/.zshrc
|
|
||||||
src: .zshrc
|
|
||||||
d_rofi:
|
|
||||||
src: .config/rofi
|
|
||||||
dst: ~/.config/rofi
|
|
||||||
d_zsh:
|
|
||||||
src: .config/zsh
|
|
||||||
dst: ~/.config/zsh
|
|
||||||
f_fonts.conf:
|
|
||||||
src: .config/fontconfig/fonts.conf
|
|
||||||
dst: ~/.config/fontconfig/fonts.conf
|
|
||||||
f_ignore:
|
|
||||||
src: .ignore
|
|
||||||
dst: ~/.ignore
|
|
||||||
f_nvimpager_init.vim:
|
|
||||||
src: .config/nvimpager/init.vim
|
|
||||||
dst: ~/.config/nvimpager/init.vim
|
|
||||||
f_ncmpcpp.conf:
|
|
||||||
src: .config/ncmpcpp/config
|
|
||||||
dst: ~/.config/ncmpcpp/config
|
|
||||||
d_efistub:
|
|
||||||
src: .EFISTUB
|
|
||||||
dst: ~/.EFISTUB
|
|
||||||
f_hushlogin:
|
|
||||||
src: .hushlogin
|
|
||||||
dst: ~/.hushlogin
|
|
||||||
profiles:
|
|
||||||
Base:
|
|
||||||
dotfiles:
|
|
||||||
- d_systemd
|
|
||||||
Media:
|
|
||||||
dotfiles:
|
|
||||||
- f_beets_config
|
|
||||||
- f_beets_whitelist
|
|
||||||
- f_abcde.conf
|
|
||||||
- d_mpv
|
|
||||||
- f_youtube-dl_config
|
|
||||||
- f_mpd.conf
|
|
||||||
- f_ncmpcpp_bindings
|
|
||||||
- f_ncmpcpp.conf
|
|
||||||
- f_libra_config
|
|
||||||
- f_mpdscribble.conf
|
|
||||||
- f_mpdris2.conf
|
|
||||||
- f_youtube-viewer.conf
|
|
||||||
Sway:
|
|
||||||
dotfiles:
|
|
||||||
- d_sway
|
|
||||||
- d_waybar
|
|
||||||
- d_rofi
|
|
||||||
- f_mako_config
|
|
||||||
- f_redshift.conf
|
|
||||||
- f_rofi-pass.conf
|
|
||||||
- f_zathurarc
|
|
||||||
- f_mimeo_associations.txt
|
|
||||||
- f_tdesktop_lang.strings
|
|
||||||
- f_fonts.conf
|
|
||||||
Pacman:
|
|
||||||
dotfiles:
|
|
||||||
- f_yay_config.json
|
|
||||||
- f_makepkg.conf
|
|
||||||
Mirkwood:
|
|
||||||
dotfiles:
|
|
||||||
- d_efistub
|
|
||||||
include:
|
|
||||||
- Base
|
|
||||||
- Terminal
|
|
||||||
- Media
|
|
||||||
- Sway
|
|
||||||
- Pacman
|
|
||||||
ReekyRaspberry:
|
|
||||||
include:
|
|
||||||
- Terminal
|
|
||||||
Rivendell:
|
|
||||||
include:
|
|
||||||
- Terminal
|
|
||||||
- Media
|
|
||||||
- Pacman
|
|
||||||
Terminal:
|
|
||||||
dotfiles:
|
|
||||||
- f_nvimpager_init.vim
|
|
||||||
- f_hushlogin
|
|
||||||
- f_ignore
|
|
||||||
- f_ranger_commands.py
|
|
||||||
- f_rtv.cfg
|
|
||||||
- f_mailcap
|
|
||||||
- d_zsh
|
|
||||||
- f_zshrc
|
|
||||||
- f_tmux.conf
|
|
||||||
- f_gitconfig
|
|
||||||
- f_ranger.conf
|
|
||||||
- f_ssh.conf
|
|
||||||
- f_authorized_keys
|
|
||||||
- d_scripts
|
|
||||||
- d_nvim_config
|
|
||||||
- f_init.vim
|
|
||||||
- f_coc-settings.json
|
|
||||||
- f_gitconfig
|
|
||||||
- f_alacritty.yml
|
|
||||||
AnittaPC:
|
|
||||||
include:
|
|
||||||
- Terminal
|
|
||||||
- Pacman
|
|
||||||
TakamakiPC:
|
|
||||||
include:
|
|
||||||
- Terminal
|
|
||||||
- Pacman
|
|
170
config-root.yaml
170
config-root.yaml
|
@ -1,170 +0,0 @@
|
||||||
config:
|
|
||||||
backup: true
|
|
||||||
banner: true
|
|
||||||
create: true
|
|
||||||
dotpath: root
|
|
||||||
ignoreempty: false
|
|
||||||
keepdot: true
|
|
||||||
link_dotfile_default: nolink
|
|
||||||
link_on_import: nolink
|
|
||||||
longkey: false
|
|
||||||
showdiff: false
|
|
||||||
workdir: ~/.config/sdotdrop
|
|
||||||
dotfiles:
|
|
||||||
f_60-uinput-permissions.rules:
|
|
||||||
dst: /etc/udev/rules.d/60-uinput-permissions.rules
|
|
||||||
src: etc/udev/rules.d/60-uinput-permissions.rules
|
|
||||||
d_bin:
|
|
||||||
dst: /usr/local/bin
|
|
||||||
src: usr/local/bin
|
|
||||||
f_99-sysctl.conf:
|
|
||||||
dst: /etc/sysctl.d/99-sysctl.conf
|
|
||||||
src: etc/sysctl.d/99-sysctl.conf
|
|
||||||
f_adb.service:
|
|
||||||
dst: /etc/systemd/system/adb.service
|
|
||||||
src: etc/systemd/system/adb.service
|
|
||||||
f_clamd.conf:
|
|
||||||
dst: /etc/clamav/clamd.conf
|
|
||||||
src: etc/clamav/clamd.conf
|
|
||||||
f_cryptissue:
|
|
||||||
dst: /etc/cryptissue
|
|
||||||
src: etc/cryptissue
|
|
||||||
f_detected.sh:
|
|
||||||
dst: /etc/clamav/detected.sh
|
|
||||||
src: etc/clamav/detected.sh
|
|
||||||
f_environment:
|
|
||||||
dst: /etc/environment
|
|
||||||
src: etc/environment
|
|
||||||
f_freetype2.sh:
|
|
||||||
dst: /etc/profile.d/freetype2.sh
|
|
||||||
src: etc/profile.d/freetype2.sh
|
|
||||||
f_iwd@.service:
|
|
||||||
dst: /etc/systemd/system/iwd@.service
|
|
||||||
src: etc/systemd/system/iwd@.service
|
|
||||||
f_loader.conf:
|
|
||||||
dst: /boot/loader/loader.conf
|
|
||||||
src: boot/loader/loader.conf
|
|
||||||
f_fonts.conf:
|
|
||||||
dst: /etc/fonts/local.conf
|
|
||||||
src: etc/fonts/local.conf
|
|
||||||
f_locale.conf:
|
|
||||||
dst: /etc/locale.conf
|
|
||||||
src: etc/locale.conf
|
|
||||||
f_locale.gen:
|
|
||||||
dst: /etc/locale.gen
|
|
||||||
src: etc/locale.gen
|
|
||||||
f_logind.conf:
|
|
||||||
dst: /etc/systemd/logind.conf
|
|
||||||
src: etc/systemd/logind.conf
|
|
||||||
f_bluetooth.conf:
|
|
||||||
dst: /etc/bluetooth/main.conf
|
|
||||||
src: etc/bluetooth/main.conf
|
|
||||||
f_pacman.conf:
|
|
||||||
dst: /etc/pacman.conf
|
|
||||||
src: etc/pacman.conf
|
|
||||||
f_pacserve.service.conf:
|
|
||||||
dst: /etc/pacserve/pacserve.service.conf
|
|
||||||
src: etc/pacserve/pacserve.service.conf
|
|
||||||
f_sshd_config:
|
|
||||||
dst: /etc/ssh/sshd_config
|
|
||||||
src: etc/ssh/sshd_config
|
|
||||||
f_timesyncd.conf:
|
|
||||||
dst: /etc/systemd/timesyncd.conf
|
|
||||||
src: etc/systemd/timesyncd.conf
|
|
||||||
f_welcomemessage.conf:
|
|
||||||
dst: /etc/welcomemessage.conf
|
|
||||||
src: etc/welcomemessage.conf
|
|
||||||
f_getty.conf:
|
|
||||||
src: etc/systemd/system/getty@tty1.service.d/override.conf
|
|
||||||
dst: /etc/systemd/system/getty@tty1.service.d/override.conf
|
|
||||||
f_99-conbee-usb-serial.rules:
|
|
||||||
src: etc/udev/rules.d/99-conbee-usb-serial.rules
|
|
||||||
dst: /etc/udev/rules.d/99-conbee-usb-serial.rules
|
|
||||||
f_99-lowbat.rules:
|
|
||||||
src: etc/udev/rules.d/99-lowbat.rules
|
|
||||||
dst: /etc/udev/rules.d/99-lowbat.rules
|
|
||||||
f_sleep.conf:
|
|
||||||
src: etc/systemd/sleep.conf
|
|
||||||
dst: /etc/systemd/sleep.conf
|
|
||||||
f_fstab:
|
|
||||||
src: etc/fstab
|
|
||||||
dst: /etc/fstab
|
|
||||||
f_ignore:
|
|
||||||
src: .ignore
|
|
||||||
dst: /.ignore
|
|
||||||
f_pacman-dl.service:
|
|
||||||
src: etc/systemd/system/pacman-dl.service
|
|
||||||
dst: /etc/systemd/system/pacman-dl.service
|
|
||||||
f_pacman-dl.timer:
|
|
||||||
src: etc/systemd/system/pacman-dl.timer
|
|
||||||
dst: /etc/systemd/system/pacman-dl.timer
|
|
||||||
f_zsh.hook:
|
|
||||||
src: etc/pacman.d/hooks/zsh.hook
|
|
||||||
dst: /etc/pacman.d/hooks/zsh.hook
|
|
||||||
f_nightly-reboot.service:
|
|
||||||
src: etc/systemd/system/nightly-reboot.service
|
|
||||||
dst: /etc/systemd/system/nightly-reboot.service
|
|
||||||
f_nightly-reboot.timer:
|
|
||||||
src: etc/systemd/system/nightly-reboot.timer
|
|
||||||
dst: /etc/systemd/system/nightly-reboot.timer
|
|
||||||
f_mkinitcpio.conf:
|
|
||||||
src: etc/mkinitcpio.conf
|
|
||||||
dst: /etc/mkinitcpio.conf
|
|
||||||
f_vconsole.conf:
|
|
||||||
src: etc/vconsole.conf
|
|
||||||
dst: /etc/vconsole.conf
|
|
||||||
f_20-quiet-printk.conf:
|
|
||||||
src: etc/sysctl.d/20-quiet-printk.conf
|
|
||||||
dst: /etc/sysctl.d/20-quiet-printk.conf
|
|
||||||
profiles:
|
|
||||||
Locale:
|
|
||||||
dotfiles:
|
|
||||||
- f_locale.conf
|
|
||||||
- f_locale.gen
|
|
||||||
Pacman:
|
|
||||||
dotfiles:
|
|
||||||
- f_pacman.conf
|
|
||||||
- f_pacserve.service.conf
|
|
||||||
- f_pacman-dl.service
|
|
||||||
- f_pacman-dl.timer
|
|
||||||
Mirkwood:
|
|
||||||
dotfiles:
|
|
||||||
- f_getty.conf
|
|
||||||
- f_environment
|
|
||||||
- f_cryptissue
|
|
||||||
- f_welcomemessage.conf
|
|
||||||
- d_bin
|
|
||||||
- f_adb.service
|
|
||||||
- f_bluetooth.conf
|
|
||||||
- f_iwd@.service
|
|
||||||
- f_loader.conf
|
|
||||||
- f_sshd_config
|
|
||||||
- f_logind.conf
|
|
||||||
- f_60-uinput-permissions.rules
|
|
||||||
- f_freetype2.sh
|
|
||||||
- f_fonts.conf
|
|
||||||
- f_timesyncd.conf
|
|
||||||
- f_99-sysctl.conf
|
|
||||||
- f_99-lowbat.rules
|
|
||||||
- f_ignore
|
|
||||||
- f_zsh.hook
|
|
||||||
- f_mkinitcpio.conf
|
|
||||||
- f_vconsole.conf
|
|
||||||
- f_20-quiet-printk.conf
|
|
||||||
include:
|
|
||||||
- Locale
|
|
||||||
- Pacman
|
|
||||||
Rivendell:
|
|
||||||
include:
|
|
||||||
- Locale
|
|
||||||
- Pacman
|
|
||||||
dotfiles:
|
|
||||||
- f_getty.conf
|
|
||||||
- f_vconsole.conf
|
|
||||||
- f_mkinitcpio.conf
|
|
||||||
- f_bluetooth.conf
|
|
||||||
- f_60-uinput-permissions.rules
|
|
||||||
- f_timesyncd.conf
|
|
||||||
- f_sshd_config
|
|
||||||
- f_nightly-reboot.service
|
|
||||||
- f_nightly-reboot.timer
|
|
52
deploy.sh
52
deploy.sh
|
@ -1,52 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# to run this, execute
|
|
||||||
# bash <(curl -sL git.reekynet.com/ReekyMarko/dotfiles/raw/branch/master/deploy.sh)
|
|
||||||
|
|
||||||
# Run this to install my dotfiles on a fresh Arch Linux installation.
|
|
||||||
# This should work on any Arch Linux install with an internet connection
|
|
||||||
# and sudo rights
|
|
||||||
|
|
||||||
# When asked a hostname, make sure it's already in the dotrop config,
|
|
||||||
# otherwise dotdrop won't install anything
|
|
||||||
|
|
||||||
export DOTREPO="$HOME/Git/dotfiles"
|
|
||||||
export HOSTNAME="$(hostnamectl | head -n 1 | sed 's/ //g' | cut -d':' -f2-)"
|
|
||||||
export DISTRO="$(lsb_release -ds | sed 's/"//g')"
|
|
||||||
|
|
||||||
if [ "$DISTRO" -ne "Arch Linux" ]; then
|
|
||||||
print "Not running on Arch Linux"
|
|
||||||
print "Other distros not supported, exiting..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -p "Hostname [$HOSTNAME]: " -i $HOSTNAME NEWHOSTNAME
|
|
||||||
if [ "$HOSTNAME -ne $NEWHOSTNAME" ]; then
|
|
||||||
sudo hostnamectl set-hostname $NEWHOSTNAME
|
|
||||||
fi
|
|
||||||
HOSTNAME=$NEWHOSTNAME
|
|
||||||
|
|
||||||
# install yay
|
|
||||||
if ! [ -x "$(command -v yay)" ]; then
|
|
||||||
read -p "Install yay? [Y/n] " -i "y" IYAY
|
|
||||||
if [ "$(tr '[:upper:]' ':lower:' $IYAY)" -eq "y" ]; then
|
|
||||||
print "Installing yay"
|
|
||||||
fi
|
|
||||||
sudo pacman -Syu --needed --noconfirm git wget base-devel
|
|
||||||
cd
|
|
||||||
wget https://aur.archlinux.org/cgit/aur.git/snapshot/yay.tar.gz
|
|
||||||
tar xfv yay.tar.gz
|
|
||||||
cd yay
|
|
||||||
makepkg -si --noconfirm
|
|
||||||
cd ..
|
|
||||||
rm -r yay*
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir ~/Git
|
|
||||||
git clone https://git.reekynet.com/ReekyMarko/dotfiles.git $DOTREPO
|
|
||||||
cd ~/Git/dotfiles
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
$DOTREPO/dotdrop.sh --cfg=$DOTREPO/config-home.yaml install
|
|
||||||
chsh -s /bin/zsh
|
|
||||||
zsh -c "source ~/.zshrc; sdotdrop install"
|
|
2
docker/.gitignore
vendored
Normal file
2
docker/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
*/.env
|
||||||
|
*/DISABLED
|
78
docker/authentik/docker-compose.toml
Normal file
78
docker/authentik/docker-compose.toml
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
[volumes]
|
||||||
|
redis = {}
|
||||||
|
media = {}
|
||||||
|
custom_templates = {}
|
||||||
|
geoip = {}
|
||||||
|
backups = {}
|
||||||
|
|
||||||
|
[services.redis]
|
||||||
|
image = "redis:alpine"
|
||||||
|
container_name = "authentik-redis"
|
||||||
|
networks = ["authentik"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
volumes = ["redis:/data"]
|
||||||
|
|
||||||
|
[services.redis.healthcheck]
|
||||||
|
test = ["CMD-SHELL", "redis-cli ping | grep PONG"]
|
||||||
|
start_period = "20s"
|
||||||
|
interval = "30s"
|
||||||
|
retries = 5
|
||||||
|
timeout = "3s"
|
||||||
|
|
||||||
|
[services.server]
|
||||||
|
image = "ghcr.io/goauthentik/server"
|
||||||
|
container_name = "authentik"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
command = "server"
|
||||||
|
volumes = [
|
||||||
|
"media:/media",
|
||||||
|
"custom_templates:/templates",
|
||||||
|
"geoip:/geoip",
|
||||||
|
]
|
||||||
|
env_file = [".env"]
|
||||||
|
networks = ["authentik", "postgres", "proxy"]
|
||||||
|
|
||||||
|
[services.worker]
|
||||||
|
image = "ghcr.io/goauthentik/server"
|
||||||
|
container_name = "authentik-worker"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
command = "worker"
|
||||||
|
user = "root"
|
||||||
|
volumes = [
|
||||||
|
"backups:/backups",
|
||||||
|
"custom_templates:/templates",
|
||||||
|
"geoip:/geoip",
|
||||||
|
"media:/media",
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock",
|
||||||
|
]
|
||||||
|
env_file = [".env"]
|
||||||
|
networks = ["authentik", "postgres"]
|
||||||
|
|
||||||
|
[services.geoipupdate]
|
||||||
|
image = "maxmindinc/geoipupdate"
|
||||||
|
container_name = "authentik-geoipupdate"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["authentik"]
|
||||||
|
volumes = ["geoip:/usr/share/GeoIP"]
|
||||||
|
env_file = [".env"]
|
||||||
|
|
||||||
|
[services.geoipupdate.environment]
|
||||||
|
GEOIPUPDATE_EDITION_IDS = "GeoLite2-City"
|
||||||
|
GEOIPUPDATE_FREQUENCY = "8"
|
||||||
|
|
||||||
|
[services.whoami-test]
|
||||||
|
image = "traefik/whoami"
|
||||||
|
container_name = "whoami-test"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
security_opt = ["no-new-privileges:true"]
|
||||||
|
networks = ["proxy"]
|
||||||
|
environment = ["TZ"]
|
||||||
|
|
||||||
|
[networks.authentik]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
37
docker/backup/docker-compose.toml
Normal file
37
docker/backup/docker-compose.toml
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
[volumes.caddy_data]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[volumes.caddy_config]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[volumes.caddy_wkd]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[volumes.homeautomation_hass]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[services.backup]
|
||||||
|
image = "offen/docker-volume-backup:v2"
|
||||||
|
container_name = "volume-backup"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = [
|
||||||
|
"AWS_ENDPOINT",
|
||||||
|
"AWS_S3_BUCKET_NAME",
|
||||||
|
"AWS_ACCESS_KEY_ID",
|
||||||
|
"AWS_SECRET_ACCESS_KEY",
|
||||||
|
"GPG_PASSPHRASE",
|
||||||
|
"EMAIL_SMTP_HOST",
|
||||||
|
"EMAIL_SMTP_PASSWORD",
|
||||||
|
"EMAIL_SMTP_USERNAME",
|
||||||
|
"EMAIL_SMTP_PORT",
|
||||||
|
"BACKUP_COMPRESSION=zst",
|
||||||
|
"BACKUP_RETENTION_DAYS=7",
|
||||||
|
]
|
||||||
|
volumes = [
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock:ro",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
"caddy_data:/backup/caddy_data:ro",
|
||||||
|
"caddy_config:/backup/caddy_config:ro",
|
||||||
|
"caddy_wkd:/backup/caddy_wkd:ro",
|
||||||
|
"homeautomation_hass:/backup/homeautomation_hass:ro",
|
||||||
|
]
|
218
docker/caddy/Caddyfile
Normal file
218
docker/caddy/Caddyfile
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
{
|
||||||
|
order umami first
|
||||||
|
}
|
||||||
|
|
||||||
|
(common_site_settings) {
|
||||||
|
encode zstd gzip
|
||||||
|
|
||||||
|
tls {
|
||||||
|
dns cloudflare {$CLOUDFLARE_API_TOKEN}
|
||||||
|
resolvers 1.1.1.1
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
korhonen.cc, *.korhonen.cc {
|
||||||
|
import common_site_settings
|
||||||
|
|
||||||
|
@static {
|
||||||
|
file
|
||||||
|
path *.ico *.css *.js *.gif *.webp *.avif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.pdf *.webmanifest
|
||||||
|
}
|
||||||
|
|
||||||
|
@homepage-www-redir host www.korhonen.cc
|
||||||
|
handle @homepage-www-redir {
|
||||||
|
redir https://korhonen.cc
|
||||||
|
}
|
||||||
|
|
||||||
|
@homepage host korhonen.cc
|
||||||
|
handle @homepage {
|
||||||
|
# Redirect finnish WIP
|
||||||
|
# @redirFinnish {
|
||||||
|
# header Accept-Language *fi-FI*
|
||||||
|
# not path *.js *.css *.png *.jpg *.jpeg *.svg
|
||||||
|
# not path /en* /fi*
|
||||||
|
# }
|
||||||
|
# redir @redirFinnish /fi{uri}
|
||||||
|
#
|
||||||
|
# uri strip_prefix /en
|
||||||
|
|
||||||
|
header @static Cache-Control max-age=5184000
|
||||||
|
root * /var/www/korhonen.cc
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
@wkd host openpgpkey.korhonen.cc
|
||||||
|
handle @wkd {
|
||||||
|
root * /var/www/wkd
|
||||||
|
file_server browse
|
||||||
|
header Access-Control-Allow-Origin "*"
|
||||||
|
}
|
||||||
|
|
||||||
|
@index host index.korhonen.cc
|
||||||
|
handle @index {
|
||||||
|
umami {
|
||||||
|
event_endpoint "https://umami.korhonen.cc/api/send"
|
||||||
|
website_uuid "9fe4f5c0-8e63-4479-a58d-d399cdbc0a3a"
|
||||||
|
client_ip_header X-Real-IP
|
||||||
|
device_detection
|
||||||
|
allowed_extensions "" .tar.zst .json .html
|
||||||
|
}
|
||||||
|
root * /var/www/index.korhonen.cc
|
||||||
|
file_server browse
|
||||||
|
}
|
||||||
|
|
||||||
|
@home-assistant host home.korhonen.cc
|
||||||
|
handle @home-assistant {
|
||||||
|
reverse_proxy home-assistant:8123
|
||||||
|
}
|
||||||
|
|
||||||
|
@authentik host sso.korhonen.cc
|
||||||
|
handle @authentik {
|
||||||
|
reverse_proxy authentik:9000
|
||||||
|
}
|
||||||
|
|
||||||
|
@forgejo host git.korhonen.cc
|
||||||
|
handle @forgejo {
|
||||||
|
rewrite /user/login /user/oauth2/authentik
|
||||||
|
reverse_proxy forgejo:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
@woodpecker host ci.korhonen.cc
|
||||||
|
handle @woodpecker {
|
||||||
|
reverse_proxy woodpecker:8000
|
||||||
|
}
|
||||||
|
|
||||||
|
@searx host search.korhonen.cc
|
||||||
|
handle @searx {
|
||||||
|
reverse_proxy searx:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
@freshrss host rss.korhonen.cc
|
||||||
|
handle @freshrss {
|
||||||
|
reverse_proxy freshrss
|
||||||
|
}
|
||||||
|
|
||||||
|
@jellyfin host jellyfin.korhonen.cc
|
||||||
|
handle @jellyfin {
|
||||||
|
reverse_proxy jellyfin:8096
|
||||||
|
}
|
||||||
|
|
||||||
|
@pihole host pihole.korhonen.cc
|
||||||
|
handle @pihole {
|
||||||
|
reverse_proxy pihole
|
||||||
|
}
|
||||||
|
|
||||||
|
@umami host umami.korhonen.cc
|
||||||
|
handle @umami {
|
||||||
|
reverse_proxy umami:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
@nextcloud host cloud.korhonen.cc
|
||||||
|
handle @nextcloud {
|
||||||
|
# Redirect login page to Authentik
|
||||||
|
redir /login /apps/sociallogin/custom_oidc/korhonen-sso 301
|
||||||
|
|
||||||
|
# .htaccess / data / config / ... shouldn't be accessible from outside
|
||||||
|
@forbidden {
|
||||||
|
path /.htaccess
|
||||||
|
path /data/*
|
||||||
|
path /config/*
|
||||||
|
path /db_structure
|
||||||
|
path /.xml
|
||||||
|
path /README
|
||||||
|
path /3rdparty/*
|
||||||
|
path /lib/*
|
||||||
|
path /templates/*
|
||||||
|
path /occ
|
||||||
|
path /console.php
|
||||||
|
}
|
||||||
|
handle @forbidden {
|
||||||
|
respond 404
|
||||||
|
}
|
||||||
|
|
||||||
|
redir /.well-known/carddav /remote.php/dav 301
|
||||||
|
redir /.well-known/caldav /remote.php/dav 301
|
||||||
|
|
||||||
|
root * /var/www/nextcloud
|
||||||
|
php_fastcgi nextcloud:9000 {
|
||||||
|
root /var/www/html
|
||||||
|
# Tells nextcloud to remove /index.php from URLs in links
|
||||||
|
env front_controller_active true
|
||||||
|
}
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
@tvheadend host tvheadend.korhonen.cc
|
||||||
|
handle @tvheadend {
|
||||||
|
reverse_proxy tvheadend:9981
|
||||||
|
}
|
||||||
|
|
||||||
|
@collabora host collabora.korhonen.cc
|
||||||
|
handle @collabora {
|
||||||
|
reverse_proxy collabora:9980
|
||||||
|
}
|
||||||
|
|
||||||
|
@grafana host grafana.korhonen.cc
|
||||||
|
handle @grafana {
|
||||||
|
reverse_proxy grafana:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
@drop host drop.korhonen.cc
|
||||||
|
handle @drop {
|
||||||
|
reverse_proxy drop:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
@ipvX host ipv6.korhonen.cc ipv4.korhonen.cc
|
||||||
|
handle @ipvX {
|
||||||
|
respond {remote_host}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ott host ott.korhonen.cc
|
||||||
|
handle @ott {
|
||||||
|
reverse_proxy opentogethertube:8080
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
respond "404 Not Found" 404
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_errors {
|
||||||
|
@homepage_404 {
|
||||||
|
expression {http.error.status_code} == 404
|
||||||
|
host korhonen.cc
|
||||||
|
}
|
||||||
|
handle @homepage_404 {
|
||||||
|
root * /var/www/korhonen.cc
|
||||||
|
rewrite * /404.html
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
|
||||||
|
respond "{err.status_code} {err.status_text}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
korhonen.social, *.korhonen.social {
|
||||||
|
import common_site_settings
|
||||||
|
|
||||||
|
@firefish-www-redir host www.korhonen.social
|
||||||
|
handle @firefish-www-redir {
|
||||||
|
redir https://korhonen.social
|
||||||
|
}
|
||||||
|
|
||||||
|
@firefish host korhonen.social
|
||||||
|
handle @firefish {
|
||||||
|
reverse_proxy firefish:3000
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
respond "404 Not Found" 404
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_errors {
|
||||||
|
respond "{err.status_code} {err.status_text}"
|
||||||
|
}
|
||||||
|
}
|
29
docker/caddy/docker-compose.toml
Normal file
29
docker/caddy/docker-compose.toml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
[volumes]
|
||||||
|
data = {}
|
||||||
|
config = {}
|
||||||
|
wkd = {}
|
||||||
|
korhonen_cc = {}
|
||||||
|
|
||||||
|
[volumes.nextcloud_config]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[services.caddy]
|
||||||
|
image = "git.korhonen.cc/functionalhacker/caddy"
|
||||||
|
container_name = "caddy"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
ports = ["80:80", "443:443/tcp", "443:443/udp"]
|
||||||
|
networks = ["proxy"]
|
||||||
|
volumes = [
|
||||||
|
"./Caddyfile:/etc/caddy/Caddyfile",
|
||||||
|
"data:/data",
|
||||||
|
"config:/config",
|
||||||
|
"wkd:/var/www/wkd",
|
||||||
|
"korhonen_cc:/var/www/korhonen.cc",
|
||||||
|
"nextcloud_config:/var/www/nextcloud",
|
||||||
|
"/var/www/index.korhonen.cc:/var/www/index.korhonen.cc",
|
||||||
|
]
|
||||||
|
environment = ["CLOUDFLARE_EMAIL", "CLOUDFLARE_API_TOKEN", "ACME_AGREE=true"]
|
||||||
|
cap_add = ["NET_ADMIN"]
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
8
docker/ddns/docker-compose.toml
Normal file
8
docker/ddns/docker-compose.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[services.cloudflare-ddns]
|
||||||
|
image = "timothyjmiller/cloudflare-ddns"
|
||||||
|
container_name = "cloudflare-ddns"
|
||||||
|
security_opt = ["no-new-privileges:true"]
|
||||||
|
network_mode = "host"
|
||||||
|
environment = ["PUID=1000", "PGID=1000"]
|
||||||
|
volumes = ["/mnt/Storage/docker/ddns/config.json:/config.json"]
|
||||||
|
restart = "unless-stopped"
|
9
docker/drop/docker-compose.toml
Normal file
9
docker/drop/docker-compose.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[services.drop]
|
||||||
|
image = "lscr.io/linuxserver/pairdrop"
|
||||||
|
container_name = "drop"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["proxy"]
|
||||||
|
environment = ["TZ=Europe/Helsinki", "IPV6_LOCALIZE=4"]
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
41
docker/firefish/docker-compose.toml
Normal file
41
docker/firefish/docker-compose.toml
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
[volumes]
|
||||||
|
files = {}
|
||||||
|
config = {}
|
||||||
|
redis = {}
|
||||||
|
db = {}
|
||||||
|
|
||||||
|
[services.firefish]
|
||||||
|
image = "registry.firefish.dev/firefish/firefish"
|
||||||
|
container_name = "firefish"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
depends_on = ["redis"]
|
||||||
|
ports = ["3084:3000"]
|
||||||
|
networks = ["firefish", "proxy"]
|
||||||
|
environment = { NODE_ENV = "production" }
|
||||||
|
volumes = ["files:/firefish/files", "config:/firefish/.config:ro"]
|
||||||
|
|
||||||
|
[services.redis]
|
||||||
|
image = "redis"
|
||||||
|
container_name = "redis-firefish"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["firefish"]
|
||||||
|
volumes = ["redis:/data"]
|
||||||
|
|
||||||
|
[services.db]
|
||||||
|
image = "groonga/pgroonga:3.1.8-alpine-16-slim"
|
||||||
|
container_name = "firefish-db"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["firefish"]
|
||||||
|
volumes = ["db:/var/lib/postgresql/data"]
|
||||||
|
|
||||||
|
[services.db.healthcheck]
|
||||||
|
test = "pg_isready --user=\"firefish\" --dbname=\"firefish\""
|
||||||
|
interval = "5s"
|
||||||
|
timeout = "5s"
|
||||||
|
retries = 5
|
||||||
|
|
||||||
|
[networks.firefish]
|
||||||
|
internal = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
32
docker/forgejo/docker-compose.toml
Normal file
32
docker/forgejo/docker-compose.toml
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
[volumes]
|
||||||
|
data = {}
|
||||||
|
runner = {}
|
||||||
|
|
||||||
|
[services.forgejo]
|
||||||
|
image = "git.korhonen.cc/functionalhacker/forgejo-asciidoc"
|
||||||
|
container_name = "forgejo"
|
||||||
|
environment = ["TZ=Europe/Helsinki", "USER_UID=1000", "USER_GID=1000"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["postgres", "proxy"]
|
||||||
|
ports = ["2882:22"]
|
||||||
|
volumes = ["data:/data", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.runner]
|
||||||
|
image = "code.forgejo.org/forgejo/runner:3.5.0"
|
||||||
|
container_name = "forgejo-runner"
|
||||||
|
user = "root:root"
|
||||||
|
volumes = [
|
||||||
|
"runner:/data",
|
||||||
|
"./runner.yaml:/data/config.yaml",
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
||||||
|
environment = ["SOCKFILE=/var/run/docker.sock"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
command = "forgejo-runner daemon -c /data/config.yaml"
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
34
docker/forgejo/runner.yaml
Normal file
34
docker/forgejo/runner.yaml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
log:
|
||||||
|
level: info
|
||||||
|
|
||||||
|
runner:
|
||||||
|
file: .runner
|
||||||
|
capacity: 2
|
||||||
|
env_file: .env
|
||||||
|
timeout: 3h
|
||||||
|
insecure: false
|
||||||
|
fetch_timeout: 5s
|
||||||
|
fetch_interval: 2s
|
||||||
|
labels:
|
||||||
|
- 'docker:docker://git.korhonen.cc/functionalhacker/ubuntu-act:22.04'
|
||||||
|
|
||||||
|
cache:
|
||||||
|
enabled: true
|
||||||
|
dir: ''
|
||||||
|
host: ''
|
||||||
|
port: 0
|
||||||
|
external_server: ''
|
||||||
|
|
||||||
|
container:
|
||||||
|
network: ''
|
||||||
|
enable_ipv6: false
|
||||||
|
privileged: false
|
||||||
|
options:
|
||||||
|
workdir_parent:
|
||||||
|
valid_volumes:
|
||||||
|
- 'caddy_korhonen_cc'
|
||||||
|
docker_host: ''
|
||||||
|
force_pull: false
|
||||||
|
|
||||||
|
host:
|
||||||
|
workdir_parent:
|
|
@ -1,31 +0,0 @@
|
||||||
version: '2'
|
|
||||||
|
|
||||||
services:
|
|
||||||
freepbx:
|
|
||||||
container_name: freepbx
|
|
||||||
image: tiredofit/freepbx
|
|
||||||
ports:
|
|
||||||
- 8012:80
|
|
||||||
- 5060:5060
|
|
||||||
- 5160:5160
|
|
||||||
- 18000-18100:18000-18100/udp
|
|
||||||
#### Flash Operator Panel
|
|
||||||
- 4445:4445
|
|
||||||
volumes:
|
|
||||||
- /docker/freepbx/certs:/certs
|
|
||||||
- /docker/freepbx/data:/data
|
|
||||||
- /docker/freepbx/logs:/var/log
|
|
||||||
- /docker/freepbx/www:/var/www/html
|
|
||||||
- /docker/freepbx/db:/var/lib/mysql
|
|
||||||
|
|
||||||
environment:
|
|
||||||
- RTP_START=18000
|
|
||||||
- RTP_FINISH=18100
|
|
||||||
- DB_EMBEDDED=TRUE
|
|
||||||
|
|
||||||
restart: always
|
|
||||||
|
|
||||||
### These final lines are for Fail2ban. If you don't want, comment and also add ENABLE_FAIL2BAN=FALSE to your environment
|
|
||||||
cap_add:
|
|
||||||
- NET_ADMIN
|
|
||||||
privileged: true
|
|
1
docker/freshrss/.gitignore
vendored
Normal file
1
docker/freshrss/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.env
|
19
docker/freshrss/docker-compose.toml
Normal file
19
docker/freshrss/docker-compose.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
|
||||||
|
[services.freshrss]
|
||||||
|
image = "linuxserver/freshrss"
|
||||||
|
container_name = "freshrss"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["freshrss", "postgres", "proxy"]
|
||||||
|
environment = ["PUID=1000", "PGID=985", "TZ=Europe/Helsinki"]
|
||||||
|
volumes = ["config:/config", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[networks.freshrss]
|
||||||
|
external = false
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
|
@ -1,41 +0,0 @@
|
||||||
version: '2'
|
|
||||||
|
|
||||||
networks:
|
|
||||||
gitea:
|
|
||||||
external: false
|
|
||||||
|
|
||||||
services:
|
|
||||||
gitea:
|
|
||||||
container_name: gitea
|
|
||||||
image: gitea/gitea:latest
|
|
||||||
environment:
|
|
||||||
- USER_UID=1000
|
|
||||||
- USER_GID=1000
|
|
||||||
- DB_TYPE=mysql
|
|
||||||
- DB_HOST=db:3306
|
|
||||||
- DB_NAME=gitea
|
|
||||||
- DB_USER=gitea
|
|
||||||
- DB_PASSWD=gitea
|
|
||||||
restart: always
|
|
||||||
networks:
|
|
||||||
- gitea
|
|
||||||
volumes:
|
|
||||||
- /docker/gitea/gitea:/data
|
|
||||||
- /etc/timezone:/etc/timezone:ro
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
ports:
|
|
||||||
- '3000:3000'
|
|
||||||
- '222:22'
|
|
||||||
depends_on:
|
|
||||||
- db
|
|
||||||
|
|
||||||
mariadb:
|
|
||||||
container_name: mariadb-gitea
|
|
||||||
image: mariadb
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
|
||||||
ports:
|
|
||||||
- '3308:3306'
|
|
||||||
volumes:
|
|
||||||
- /docker/gitea/mariadb:/var/lib/mysql
|
|
20
docker/headscale/docker-compose.toml
Normal file
20
docker/headscale/docker-compose.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
[services.headscale]
|
||||||
|
image = "headscale/headscale:0"
|
||||||
|
container_name = "headscale"
|
||||||
|
volumes = ["config:/etc/headscale", "data:/var/lib/headscale"]
|
||||||
|
ports = ["3478:3478/udp"]
|
||||||
|
command = "headscale serve"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["postgres"]
|
||||||
|
|
||||||
|
[services.headscale-ui]
|
||||||
|
image = "ghcr.io/gurucomputing/headscale-ui"
|
||||||
|
container_name = "headscale-ui"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
111
docker/homeautomation/docker-compose.toml
Normal file
111
docker/homeautomation/docker-compose.toml
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
[volumes]
|
||||||
|
hass = {}
|
||||||
|
mosquitto = {}
|
||||||
|
piper_english = {}
|
||||||
|
whisper_english = {}
|
||||||
|
openwakeword_english = {}
|
||||||
|
|
||||||
|
[services.home-assistant]
|
||||||
|
container_name = "home-assistant"
|
||||||
|
image = "homeassistant/home-assistant"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
devices = ["/dev/ttyACM0"]
|
||||||
|
volumes = ["hass:/config", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
networks = ["homeautomation", "postgres", "proxy"]
|
||||||
|
ports = ["8123:8123", "8300:8300"]
|
||||||
|
extra_hosts = ["host.docker.internal:host-gateway"]
|
||||||
|
|
||||||
|
[services.mosquitto]
|
||||||
|
container_name = "mosquitto"
|
||||||
|
image = "eclipse-mosquitto"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
ports = ["1883:1883", "8866:8866"]
|
||||||
|
volumes = ["mosquitto:/mosquitto", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.piper_english]
|
||||||
|
container_name = "piper_english"
|
||||||
|
image = "rhasspy/wyoming-piper"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
ports = ["10200:10200"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
command = ["--voice", "en_US-hfc_male-medium"]
|
||||||
|
volumes = ["piper_english:/data", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.whisper_english]
|
||||||
|
container_name = "whisper_english"
|
||||||
|
image = "rhasspy/wyoming-whisper"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
ports = ["10300:10300"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
depends_on = ["home-assistant"]
|
||||||
|
command = ["--model", "tiny-int8", "--language", "en"]
|
||||||
|
volumes = ["whisper_english:/data", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.openwakeword_english]
|
||||||
|
container_name = "openwakeword_english"
|
||||||
|
image = "rhasspy/wyoming-openwakeword"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
command = ["--preload-model", "ok_nabu"]
|
||||||
|
depends_on = ["home-assistant"]
|
||||||
|
volumes = ["openwakeword_english:/data", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.microphone]
|
||||||
|
build = "https://github.com/rhasspy/wyoming-mic-external.git"
|
||||||
|
image = "rhasspy/wyoming-mic-external"
|
||||||
|
container_name = "microphone"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
devices = ["/dev/snd:/dev/snd"]
|
||||||
|
ports = ["10600:10600"]
|
||||||
|
group_add = ["audio"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
command = ["--device", "plughw:CARD=USB,DEV=0", "--debug"]
|
||||||
|
volumes = ["/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.speaker]
|
||||||
|
build = "https://github.com/rhasspy/wyoming-snd-external.git"
|
||||||
|
image = "rhasspy/wyoming-snd-external"
|
||||||
|
container_name = "speaker"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
devices = ["/dev/snd:/dev/snd"]
|
||||||
|
ports = ["10601:10601"]
|
||||||
|
group_add = ["audio"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
command = ["--device", "iec958:CARD=USB,DEV=0", "--debug"]
|
||||||
|
volumes = ["/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[services.satellite]
|
||||||
|
build = "https://github.com/rhasspy/wyoming-satellite.git"
|
||||||
|
image = "rhasspy/wyoming-satellite"
|
||||||
|
container_name = "satellite"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
ports = ["10700:10700"]
|
||||||
|
networks = ["homeautomation"]
|
||||||
|
depends_on = ["speaker", "microphone", "whisper_english"]
|
||||||
|
command = [
|
||||||
|
"--name",
|
||||||
|
"ha-server-satellite",
|
||||||
|
"--mic-uri",
|
||||||
|
"tcp://microphone:10600",
|
||||||
|
"--snd-uri",
|
||||||
|
"tcp://speaker:10601",
|
||||||
|
"--wake-uri",
|
||||||
|
"tcp://openwakeword_english:10400",
|
||||||
|
"--debug",
|
||||||
|
]
|
||||||
|
volumes = ["/etc/localtime:/etc/localtime:ro"]
|
||||||
|
|
||||||
|
[networks.homeautomation]
|
||||||
|
external = false
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
|
@ -1,72 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
home-assistant:
|
|
||||||
environment:
|
|
||||||
TZ: 'Europe/Helsinki'
|
|
||||||
container_name: home-assistant
|
|
||||||
restart: always
|
|
||||||
image: homeassistant/home-assistant
|
|
||||||
volumes:
|
|
||||||
- /docker/homeautomation/home-assistant:/config
|
|
||||||
network_mode: host
|
|
||||||
depends_on:
|
|
||||||
- deconz
|
|
||||||
- mosquitto
|
|
||||||
|
|
||||||
deconz:
|
|
||||||
container_name: deconz
|
|
||||||
image: marthoc/deconz
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
DECONZ_WEB_PORT: 8083
|
|
||||||
DECONZ_WS_PORT: 8084
|
|
||||||
DECONZ_VNC_PORT: 5901
|
|
||||||
DECONZ_VNC_MODE: 1
|
|
||||||
DECONZ_VNC_PASSWORD: '${DECONZ_VNC_PASSWORD}'
|
|
||||||
DEBUG_OTAU: 1
|
|
||||||
network_mode: host
|
|
||||||
volumes:
|
|
||||||
- /etc/localtime:/etc/localtime:ro
|
|
||||||
- /docker/homeautomation/deconz:/root/.local/share/dresden-elektronik/deCONZ
|
|
||||||
devices:
|
|
||||||
- /dev/ttyACM0
|
|
||||||
|
|
||||||
node-red:
|
|
||||||
container_name: node-red
|
|
||||||
image: nodered/node-red
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
TZ: 'Europe/Helsinki'
|
|
||||||
ports:
|
|
||||||
- '1880:1880'
|
|
||||||
volumes:
|
|
||||||
- /docker/homeautomation/node-red:/data
|
|
||||||
depends_on:
|
|
||||||
- home-assistant
|
|
||||||
|
|
||||||
portainer:
|
|
||||||
container_name: portainer
|
|
||||||
image: portainer/portainer
|
|
||||||
restart: always
|
|
||||||
ports:
|
|
||||||
- '9000:9000'
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
- /docker/homeautomation/portainer:/data
|
|
||||||
|
|
||||||
mosquitto:
|
|
||||||
container_name: mosquitto
|
|
||||||
image: eclipse-mosquitto
|
|
||||||
restart: always
|
|
||||||
network_mode: host
|
|
||||||
volumes:
|
|
||||||
- /docker/homeautomation/mosquitto:/mosquitto
|
|
||||||
|
|
||||||
mariadb:
|
|
||||||
container_name: mariadb-hass
|
|
||||||
image: mariadb
|
|
||||||
restart: always
|
|
||||||
environment:
|
|
||||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
|
||||||
volumes:
|
|
||||||
- /docker/homeautomation/mariadb:/var/lib/mysql
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
cat <<ENV > .env
|
|
||||||
MYSQL_ROOT_PASSWORD=$(pass reekynet/docker-home-automation | rg 'MYSQL_ROOT_PASSWORD' | cut -d' ' -f2-)
|
|
||||||
HA_MYSQL_PASSWORD="$(pass reekynet/docker-home-automation | rg 'HA_MYSQL_PASSWORD' | cut -d' ' -f2-)
|
|
||||||
DECONZ_VNC_PASSWORD=$(pass reekynet/docker-home-automation | rg 'DECONZ_VNC_PASSWORD' | cut -d' ' -f2-)
|
|
||||||
ENV
|
|
||||||
|
|
||||||
docker-compose up -d
|
|
34
docker/jellyfin/docker-compose.toml
Normal file
34
docker/jellyfin/docker-compose.toml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
cache = {}
|
||||||
|
|
||||||
|
[volumes.media]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[volumes.nextcloud_data]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[services.jellyfin]
|
||||||
|
image = "jellyfin/jellyfin"
|
||||||
|
container_name = "jellyfin"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
ports = ["8096:8096"]
|
||||||
|
networks = ["proxy", "authentik"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
volumes = [
|
||||||
|
"config:/config",
|
||||||
|
"cache:/cache",
|
||||||
|
"media:/media",
|
||||||
|
"nextcloud_data:/nextcloud_data",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
||||||
|
devices = [
|
||||||
|
"/dev/dri/renderD128:/dev/dri/renderD128",
|
||||||
|
"/dev/dri/card1:/dev/dri/card0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.authentik]
|
||||||
|
external = true
|
|
@ -1,12 +0,0 @@
|
||||||
version: '3'
|
|
||||||
services:
|
|
||||||
jellyfin:
|
|
||||||
image: jellyfin/jellyfin
|
|
||||||
container_name: jellyfin
|
|
||||||
user: 1001:985
|
|
||||||
network_mode: 'host'
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- /docker/jellyfin/config:/config
|
|
||||||
- /docker/jellyfin/cache:/cache
|
|
||||||
- /mnt/Storage/Media:/media
|
|
10
docker/mumble/docker-compose.toml
Normal file
10
docker/mumble/docker-compose.toml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
|
||||||
|
[services.mumble]
|
||||||
|
container_name = "mumble"
|
||||||
|
image = "phlak/mumble"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
network_mode = "host"
|
||||||
|
volumes = ["config:/etc/mumble", "/etc/localtime:/etc/localtime:ro"]
|
||||||
|
restart = "unless-stopped"
|
20
docker/netbootxyz/docker-compose.toml
Normal file
20
docker/netbootxyz/docker-compose.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
assets = {}
|
||||||
|
|
||||||
|
[services.netbootxyz]
|
||||||
|
image = "lscr.io/linuxserver/netbootxyz"
|
||||||
|
container_name = "netbootxyz"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = [
|
||||||
|
"PUID=1000",
|
||||||
|
"PGID=1000",
|
||||||
|
"TZ=Etc/UTC",
|
||||||
|
"MENU_VERSION=1.9.9",
|
||||||
|
"PORT_RANGE=30000:30010",
|
||||||
|
"SUBFOLDER=/",
|
||||||
|
"NGINX_PORT=80",
|
||||||
|
"WEB_APP_PORT=3000",
|
||||||
|
]
|
||||||
|
ports = ["3000:3000", "69:69/udp", "8081:80"]
|
||||||
|
volumes = ["config:/config", "assets:/assets"]
|
1
docker/nextcloud/.gitignore
vendored
Normal file
1
docker/nextcloud/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.env
|
84
docker/nextcloud/docker-compose.toml
Normal file
84
docker/nextcloud/docker-compose.toml
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
[volumes.nextcloud_config]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[volumes.nextcloud_data]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[services.nextcloud]
|
||||||
|
image = "nextcloud:fpm-alpine"
|
||||||
|
container_name = "nextcloud"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["nextcloud", "postgres", "proxy"]
|
||||||
|
volumes = [
|
||||||
|
"nextcloud_config:/var/www/html",
|
||||||
|
"nextcloud_data:/var/www/html/data",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
||||||
|
environment = [
|
||||||
|
"REDIS_HOST=redis",
|
||||||
|
"REDIS_HOST_PASSWORD=123",
|
||||||
|
"TRUSTED_PROXIES=caddy",
|
||||||
|
"NEXTCLOUD_TRUSTED_DOMAINS=cloud.korhonen.cc",
|
||||||
|
"OVERWRITEHOST=cloud.korhonen.cc",
|
||||||
|
"OVERWRITEPROTOCOL=https",
|
||||||
|
]
|
||||||
|
depends_on = ["redis"]
|
||||||
|
|
||||||
|
[services.nextcloud.labels]
|
||||||
|
"ofelia.enabled" = true
|
||||||
|
"ofelia.job-exec.nextcloud.schedule" = "0 */5 * * * *"
|
||||||
|
"ofelia.job-exec.nextcloud.command" = "php /var/www/html/cron.php"
|
||||||
|
"ofelia.job-exec.nextcloud.user" = "www-data"
|
||||||
|
"ofelia.smtp-host" = "${SMTP_HOST}"
|
||||||
|
"ofelia.smtp-port" = "${SMTP_PORT}"
|
||||||
|
"ofelia.smtp-user" = "${SMTP_USER}"
|
||||||
|
"ofelia.smtp-password" = "${SMTP_PASSWORD}"
|
||||||
|
"ofelia.email-to" = "${EMAIL_TO}"
|
||||||
|
"ofelia.email-from" = "${EMAIL_FROM}"
|
||||||
|
"ofelia.mail-only-on-error" = true
|
||||||
|
|
||||||
|
[services.redis]
|
||||||
|
image = "redis:alpine"
|
||||||
|
container_name = "redis-nextcloud"
|
||||||
|
networks = ["nextcloud"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
command = "redis-server --requirepass 123"
|
||||||
|
|
||||||
|
[services.coturn]
|
||||||
|
image = "instrumentisto/coturn"
|
||||||
|
container_name = "coturn"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
env_file = ".env"
|
||||||
|
ports = ["3478:3478/tcp", "3478:3478/udp", "49160-49200:49160-49200/udp"]
|
||||||
|
networks = ["nextcloud"]
|
||||||
|
command = [
|
||||||
|
"-n",
|
||||||
|
"--log-file=stdout",
|
||||||
|
"--min-port=49160",
|
||||||
|
"--max-port=49200",
|
||||||
|
"--realm=cloud.korhonen.cc",
|
||||||
|
"--use-auth-secret",
|
||||||
|
"--static-auth-secret=${STATIC_AUTH_SECRET}",
|
||||||
|
]
|
||||||
|
|
||||||
|
[services.collabora]
|
||||||
|
image = "collabora/code"
|
||||||
|
container_name = "collabora"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
env_file = ".env"
|
||||||
|
environment = [
|
||||||
|
"username=${COLLABORA_USERNAME}",
|
||||||
|
"password=${COLLABORA_PASSWORD}",
|
||||||
|
"domain=cloud.korhonen.cc",
|
||||||
|
'extra_params=--o:ssl.enable=false --o:ssl.termination=true',
|
||||||
|
]
|
||||||
|
networks = ["proxy"]
|
||||||
|
|
||||||
|
[networks.nextcloud]
|
||||||
|
external = false
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
9
docker/ofelia/docker-compose.toml
Normal file
9
docker/ofelia/docker-compose.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[services.ofelia]
|
||||||
|
image = "mcuadros/ofelia"
|
||||||
|
container_name = "ofelia"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
volumes = [
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock:ro",
|
||||||
|
]
|
||||||
|
command = "daemon --docker"
|
38
docker/opentogethertube/docker-compose.toml
Normal file
38
docker/opentogethertube/docker-compose.toml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[services.opentogethertube]
|
||||||
|
image = "dyc3/opentogethertube"
|
||||||
|
container_name = "opentogethertube"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = [
|
||||||
|
"PORT=8080",
|
||||||
|
"REDIS_HOST=redis",
|
||||||
|
"REDIS_PORT=6379",
|
||||||
|
"FFPROBE_PATH=/usr/bin/ffprobe",
|
||||||
|
"DB_MODE=postgres",
|
||||||
|
"POSTGRES_USER=opentogethertube",
|
||||||
|
"POSTGRES_DB=opentogethertube",
|
||||||
|
"POSTGRES_HOST=postgres",
|
||||||
|
"POSTGRES_PASSWORD",
|
||||||
|
"DOCKER=1",
|
||||||
|
"OTT_HOSTNAME=ott.korhonen.cc",
|
||||||
|
"YOUTUBE_API_KEY",
|
||||||
|
"OPENTOGETHERTUBE_API_KEY",
|
||||||
|
"SESSION_SECRET",
|
||||||
|
]
|
||||||
|
ports = ["8080:8080", "3002:3002"]
|
||||||
|
networks = ["default", "postgres", "proxy"]
|
||||||
|
depends_on = ["redis"]
|
||||||
|
volumes = ["./production.toml:/app/env/production.toml"]
|
||||||
|
|
||||||
|
[services.redis]
|
||||||
|
container_name = "redis-opentogethertube"
|
||||||
|
image = "redis:alpine"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
|
||||||
|
[services.redis.healthcheck]
|
||||||
|
test = "redis-cli ping"
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
5
docker/opentogethertube/production.toml
Normal file
5
docker/opentogethertube/production.toml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
log = { level = "info" }
|
||||||
|
|
||||||
|
[room]
|
||||||
|
enable_create_temporary = false
|
||||||
|
enable_create_permanent = false
|
23
docker/pihole/docker-compose.toml
Normal file
23
docker/pihole/docker-compose.toml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
dnsmasq = {}
|
||||||
|
|
||||||
|
[services.pihole]
|
||||||
|
container_name = "pihole"
|
||||||
|
image = "pihole/pihole"
|
||||||
|
ports = ["53:53/tcp", "53:53/udp", "67:67/udp", "8069:80/tcp"]
|
||||||
|
networks = ["proxy"]
|
||||||
|
volumes = [
|
||||||
|
"config:/etc/pihole/",
|
||||||
|
"dnsmasq:/etc/dnsmasq.d/",
|
||||||
|
]
|
||||||
|
dns = ["127.0.0.1", "1.1.1.1"]
|
||||||
|
cap_add = ["NET_ADMIN"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
|
||||||
|
[services.pihole.environment]
|
||||||
|
TZ = "Europe/Helsinki"
|
||||||
|
WEBPASSWORD = "${WEBPASSWORD}"
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
17
docker/postgres/docker-compose.toml
Normal file
17
docker/postgres/docker-compose.toml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
[volumes]
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
[services.postgres]
|
||||||
|
container_name = "postgres"
|
||||||
|
image = "postgres:16"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
ports = ["127.0.0.1:5432:5432"]
|
||||||
|
networks = ["postgres"]
|
||||||
|
volumes = [
|
||||||
|
"data:/var/lib/postgresql/data",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
37
docker/searx/docker-compose.toml
Normal file
37
docker/searx/docker-compose.toml
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
|
||||||
|
[services.searx]
|
||||||
|
container_name = "searx"
|
||||||
|
image = "searxng/searxng"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["searx", "proxy"]
|
||||||
|
volumes = [
|
||||||
|
"config:/etc/searxng",
|
||||||
|
#"/docker/searx/logo.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png:ro"
|
||||||
|
]
|
||||||
|
environment = ["SEARXNG_BASE_URL=https://search.korhonen.cc/"]
|
||||||
|
cap_drop = ["ALL"]
|
||||||
|
cap_add = ["CHOWN", "SETGID", "SETUID", "DAC_OVERRIDE"]
|
||||||
|
|
||||||
|
[services.searx.logging]
|
||||||
|
driver = "json-file"
|
||||||
|
|
||||||
|
[services.searx.logging.options]
|
||||||
|
max-size = "1m"
|
||||||
|
max-file = "1"
|
||||||
|
|
||||||
|
[services.redis]
|
||||||
|
container_name = "redis-searx"
|
||||||
|
image = "redis:alpine"
|
||||||
|
command = "redis-server --save \"\" --appendonly \"no\""
|
||||||
|
networks = ["searx"]
|
||||||
|
tmpfs = ["/var/lib/redis"]
|
||||||
|
cap_drop = ["ALL"]
|
||||||
|
cap_add = ["SETGID", "SETUID", "DAC_OVERRIDE"]
|
||||||
|
|
||||||
|
[networks.searx.ipam]
|
||||||
|
driver = "default"
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
27
docker/stats/docker-compose.toml
Normal file
27
docker/stats/docker-compose.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[services.grafana]
|
||||||
|
image = "grafana/grafana"
|
||||||
|
container_name = "grafana"
|
||||||
|
volumes = ["grafana:/var/lib/grafana"]
|
||||||
|
networks = ["stats", "proxy"]
|
||||||
|
user = "1000:984"
|
||||||
|
env_file = [".env"]
|
||||||
|
environment = [
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_CLIENT_ID",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_ENABLED=true",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_NAME=authentik",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_SCOPES=openid profile email",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_AUTH_URL=https://sso.korhonen.cc/application/o/authorize/",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_TOKEN_URL=https://sso.korhonen.cc/application/o/token/",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_API_URL=https://sso.korhonen.cc/application/o/userinfo/",
|
||||||
|
"GF_AUTH_SIGNOUT_REDIRECT_URL=https://sso.korhonen.cc/application/o/grafana/end-session/",
|
||||||
|
"GF_AUTH_OAUTH_AUTO_LOGIN=true",
|
||||||
|
"GF_SERVER_ROOT_URL=https://grafana.korhonen.cc",
|
||||||
|
"GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH=contains(groups[*], 'Administrators') && 'Admin' || 'Viewer'",
|
||||||
|
]
|
||||||
|
|
||||||
|
[networks.stats]
|
||||||
|
external = false
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
9
docker/tftp/docker-compose.toml
Normal file
9
docker/tftp/docker-compose.toml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[services]
|
||||||
|
|
||||||
|
[services.tftp]
|
||||||
|
container_name = "tftp"
|
||||||
|
image = "pghalliday/tftp"
|
||||||
|
environment = ["TZ=Europe/Helsinki"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
ports = ["69:69/udp"]
|
||||||
|
volumes = ["/etc/localtime:/etc/localtime:ro", "/docker/tftp:/var/tftpboot"]
|
21
docker/tvheadend/docker-compose.toml
Normal file
21
docker/tvheadend/docker-compose.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[volumes]
|
||||||
|
config = {}
|
||||||
|
picons = {}
|
||||||
|
|
||||||
|
[services.tvheadend]
|
||||||
|
image = "linuxserver/tvheadend"
|
||||||
|
container_name = "tvheadend"
|
||||||
|
environment = ["TZ=Europe/Helsinki", "PUID=1000", "PGID=985"]
|
||||||
|
volumes = [
|
||||||
|
"config:/config",
|
||||||
|
"picons:/picons",
|
||||||
|
"/mnt/Storage/Media/PVR:/recordings",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
||||||
|
ports = ["9981:9981", "9982:9982"]
|
||||||
|
devices = ["/dev/dvb:/dev/dvb"]
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["proxy"]
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
20
docker/umami/docker-compose.toml
Normal file
20
docker/umami/docker-compose.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[services.umami]
|
||||||
|
image = "ghcr.io/umami-software/umami:postgresql-latest"
|
||||||
|
container_name = "umami"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
networks = ["postgres", "proxy"]
|
||||||
|
env_file = ".env"
|
||||||
|
|
||||||
|
[services.umami.environment]
|
||||||
|
DATABASE_URL = "postgresql://umami:${POSTGRES_PASS}@postgres:5432/umami"
|
||||||
|
HASH_SALT = "${HASH_SALT}"
|
||||||
|
|
||||||
|
[services.umami.logging.options]
|
||||||
|
max-size = "10m"
|
||||||
|
max-file = "10"
|
||||||
|
|
||||||
|
[networks.postgres]
|
||||||
|
external = true
|
||||||
|
|
||||||
|
[networks.proxy]
|
||||||
|
external = true
|
19
docker/watchtower/docker-compose.toml
Normal file
19
docker/watchtower/docker-compose.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[services.watchtower]
|
||||||
|
image = "containrrr/watchtower"
|
||||||
|
container_name = "watchtower"
|
||||||
|
restart = "unless-stopped"
|
||||||
|
environment = [
|
||||||
|
"WATCHTOWER_CLEANUP=true",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@korhonen.cc",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@korhonen.cc",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.migadu.com",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}",
|
||||||
|
"WATCHTOWER_NOTIFICATION_EMAIL_DELAY=30",
|
||||||
|
"WATCHTOWER_NOTIFICATIONS=email",
|
||||||
|
]
|
||||||
|
volumes = [
|
||||||
|
"/var/run/docker.sock:/var/run/docker.sock",
|
||||||
|
"/etc/localtime:/etc/localtime:ro",
|
||||||
|
]
|
1
dotdrop
1
dotdrop
|
@ -1 +0,0 @@
|
||||||
Subproject commit 2d64e2ee59281e358253fadb04432a040f9392ee
|
|
82
flake.lock
generated
Normal file
82
flake.lock
generated
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"firefox-gnome-theme": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730674701,
|
||||||
|
"narHash": "sha256-lf9MQs8+NUvQd8b5t+7c4kLqUQixGO9WwWcLa1XYuiQ=",
|
||||||
|
"owner": "rafaelmardojai",
|
||||||
|
"repo": "firefox-gnome-theme",
|
||||||
|
"rev": "823756d8ddd21cfd3a24a87dad402e490e0eb5ee",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rafaelmardojai",
|
||||||
|
"repo": "firefox-gnome-theme",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1726989464,
|
||||||
|
"narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"ref": "release-24.05",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730883749,
|
||||||
|
"narHash": "sha256-mwrFF0vElHJP8X3pFCByJR365Q2463ATp2qGIrDUdlE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "dba414932936fde69f0606b4f1d87c5bc0003ede",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nur": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731008709,
|
||||||
|
"narHash": "sha256-RBUutTfh/bcvWHzjnqybjB50evgMYGngOG1Iosxbs0E=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "NUR",
|
||||||
|
"rev": "dc5cb7606d6359297287945f6908ddf9d60e20f3",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "NUR",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"firefox-gnome-theme": "firefox-gnome-theme",
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nur": "nur"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
44
flake.nix
Normal file
44
flake.nix
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
{
|
||||||
|
description = "FunctionalHacker's NixOS config";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
|
||||||
|
nur.url = "github:nix-community/NUR";
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager/release-24.05";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
firefox-gnome-theme = {
|
||||||
|
url = "github:rafaelmardojai/firefox-gnome-theme";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { nixpkgs, home-manager, nur, ... } @inputs:
|
||||||
|
let
|
||||||
|
configureNixSystem = hostname: nixpkgs.lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
modules = [
|
||||||
|
# Common settings for all hosts
|
||||||
|
({ pkgs, ... }: import ./nixos_common.nix
|
||||||
|
{ inherit inputs; inherit pkgs; })
|
||||||
|
|
||||||
|
# Host specific configuration
|
||||||
|
./hosts/${hostname}/configuration.nix
|
||||||
|
|
||||||
|
# home-manager
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
({ ... }: import ./home-manager.nix { inherit inputs; })
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
nixosConfigurations = {
|
||||||
|
Mirkwood = configureNixSystem "Mirkwood";
|
||||||
|
Shire = configureNixSystem "Shire";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
19
gpg.nix
Normal file
19
gpg.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs = {
|
||||||
|
ssh.startAgent = false;
|
||||||
|
gnupg.agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSSHSupport = true;
|
||||||
|
enableExtraSocket = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
pcscd.enable = true;
|
||||||
|
udev.packages = [
|
||||||
|
pkgs.yubikey-personalization
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
14
home-manager.nix
Normal file
14
home-manager.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{ inputs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
extraSpecialArgs = { inherit inputs; };
|
||||||
|
backupFileExtension = "hm-backup";
|
||||||
|
users = {
|
||||||
|
functionalhacker = import ./users/functionalhacker/home.nix;
|
||||||
|
som = import ./users/som/home.nix;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# vim:ft=sh
|
|
||||||
|
|
||||||
sudo efibootmgr \
|
|
||||||
--disk /dev/sda \
|
|
||||||
--part 1 \
|
|
||||||
--create \
|
|
||||||
--quiet \
|
|
||||||
--remove-dups \
|
|
||||||
--label "Arch Linux" \
|
|
||||||
--loader /vmlinuz-linux \
|
|
||||||
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# vim:ft=sh
|
|
||||||
|
|
||||||
sudo efibootmgr \
|
|
||||||
--disk /dev/sda \
|
|
||||||
--part 1 \
|
|
||||||
--create \
|
|
||||||
--quiet \
|
|
||||||
--remove-dups \
|
|
||||||
--label "Arch Linux CK" \
|
|
||||||
--loader /vmlinuz-linux-ck-zen \
|
|
||||||
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# vim:ft=sh
|
|
||||||
|
|
||||||
sudo efibootmgr \
|
|
||||||
--disk /dev/sda \
|
|
||||||
--part 1 \
|
|
||||||
--create \
|
|
||||||
--quiet \
|
|
||||||
--remove-dups \
|
|
||||||
--label "Arch Linux LTS" \
|
|
||||||
--loader /vmlinuz-linux-lts \
|
|
||||||
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'
|
|
|
@ -1,14 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# remove old entries
|
|
||||||
for bootentry in $(efibootmgr | head -n 3 | tail -n 1 | cut -d' ' -f2- | sed 's/,/\n/g'); do
|
|
||||||
sudo efibootmgr -qBb $bootentry
|
|
||||||
done
|
|
||||||
|
|
||||||
# add all entries back
|
|
||||||
for bootscript in *.efi; do
|
|
||||||
./$bootscript
|
|
||||||
done
|
|
||||||
|
|
||||||
# set bootorder
|
|
||||||
sudo efibootmgr --bootorder 0000,0001,0002
|
|
|
@ -1,21 +0,0 @@
|
||||||
! Snazzy - Converted from https://github.com/sindresorhus/iterm2-snazzy
|
|
||||||
! using https://github.com/richo/itermcolors2xdefaults
|
|
||||||
URxvt*background: #1e1f28
|
|
||||||
URxvt*foreground: #ebece6
|
|
||||||
URxvt*cursorColor: #e4e4e4
|
|
||||||
URxvt*color0: #000
|
|
||||||
URxvt*color1: #fb4245
|
|
||||||
URxvt*color2: #50fa7b
|
|
||||||
URxvt*color3: #f0fa8b
|
|
||||||
URxvt*color4: #49b9fe
|
|
||||||
URxvt*color5: #fb4cb3
|
|
||||||
URxvt*color6: #8be9fd
|
|
||||||
URxvt*color7: #ededec
|
|
||||||
URxvt*color8: #555555
|
|
||||||
URxvt*color9: #fb4245
|
|
||||||
URxvt*color10: #50fa7b
|
|
||||||
URxvt*color11: #f0fa8b
|
|
||||||
URxvt*color12: #49b9fe
|
|
||||||
URxvt*color13: #fb4cb3
|
|
||||||
URxvt*color14: #8be9fd
|
|
||||||
URxvt*color15: #ededec
|
|
|
@ -1,89 +0,0 @@
|
||||||
# -----------------$HOME/.abcde.conf----------------- #
|
|
||||||
#
|
|
||||||
# A sample configuration file to convert music cds to
|
|
||||||
# FLAC using abcde version 2.7.2
|
|
||||||
#
|
|
||||||
# http://andrews-corner.org/linux/abcde/index.html
|
|
||||||
# -------------------------------------------------- #
|
|
||||||
|
|
||||||
# Encode tracks immediately after reading. Saves disk space, gives
|
|
||||||
# better reading of 'scratchy' disks and better troubleshooting of
|
|
||||||
# encoding process but slows the operation of abcde quite a bit:
|
|
||||||
LOWDISK=y
|
|
||||||
|
|
||||||
# Specify the method to use to retrieve the track information,
|
|
||||||
# the alternative is to specify 'musicbrainz':
|
|
||||||
CDDBMETHOD=cddb
|
|
||||||
|
|
||||||
# Make a local cache of cddb entries and then volunteer to use
|
|
||||||
# these entries when and if they match the cd:
|
|
||||||
CDDBCOPYLOCAL="y"
|
|
||||||
CDDBLOCALDIR="$HOME/.cddb"
|
|
||||||
CDDBLOCALRECURSIVE="y"
|
|
||||||
CDDBUSELOCAL="y"
|
|
||||||
|
|
||||||
# Specify the encoder to use for FLAC. In this case
|
|
||||||
# flac is the only choice.
|
|
||||||
FLACENCODERSYNTAX=flac
|
|
||||||
|
|
||||||
# Specify the path to the selected encoder. In most cases the encoder
|
|
||||||
# should be in your $PATH as I illustrate below, otherwise you will
|
|
||||||
# need to specify the full path. For example: /usr/bin/flac
|
|
||||||
FLAC=flac
|
|
||||||
|
|
||||||
# Specify your required encoding options here. Multiple options can
|
|
||||||
# be selected as '--best --another-option' etc.
|
|
||||||
# Overall bitrate is about 880 kbs/s with level 8.
|
|
||||||
FLACOPTS='-s -e -V -8'
|
|
||||||
|
|
||||||
# Output type for FLAC.
|
|
||||||
OUTPUTTYPE="flac"
|
|
||||||
|
|
||||||
# The cd ripping program to use. There are a few choices here: cdda2wav,
|
|
||||||
# dagrab, cddafs (Mac OS X only) and flac. New to abcde 2.7 is 'libcdio'.
|
|
||||||
CDROMREADERSYNTAX=cdparanoia
|
|
||||||
|
|
||||||
# Give the location of the ripping program and pass any extra options,
|
|
||||||
# if using libcdio set 'CD_PARANOIA=cd-paranoia'.
|
|
||||||
CDPARANOIA=cdparanoia
|
|
||||||
CDPARANOIAOPTS="--never-skip=40"
|
|
||||||
|
|
||||||
# Give the location of the CD identification program:
|
|
||||||
CDDISCID=cd-discid
|
|
||||||
|
|
||||||
# Give the base location here for the encoded music files.
|
|
||||||
OUTPUTDIR="$HOME/Documents/Rip"
|
|
||||||
|
|
||||||
# The default actions that abcde will take.
|
|
||||||
ACTIONS=cddb,playlist,read,encode,tag,move,clean
|
|
||||||
|
|
||||||
# Decide here how you want the tracks labelled for a standard 'single-artist',
|
|
||||||
# multi-track encode and also for a multi-track, 'various-artist' encode:
|
|
||||||
OUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'
|
|
||||||
VAOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${TRACKNUM}.${ARTISTFILE}-${TRACKFILE}'
|
|
||||||
|
|
||||||
# Decide here how you want the tracks labelled for a standard 'single-artist',
|
|
||||||
# single-track encode and also for a single-track 'various-artist' encode.
|
|
||||||
# (Create a single-track encode with 'abcde -1' from the commandline.)
|
|
||||||
ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}'
|
|
||||||
VAONETRACKOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}'
|
|
||||||
|
|
||||||
# Create playlists for single and various-artist encodes. I would suggest
|
|
||||||
# commenting these out for single-track encoding.
|
|
||||||
PLAYLISTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}.m3u'
|
|
||||||
VAPLAYLISTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}.m3u'
|
|
||||||
|
|
||||||
# This function takes out dots preceding the album name, and removes a grab
|
|
||||||
# bag of illegal characters. It allows spaces, if you do not wish spaces add
|
|
||||||
# in -e 's/ /_/g' after the first sed command.
|
|
||||||
mungefilename ()
|
|
||||||
{
|
|
||||||
echo "$@" | sed -e 's/^\.*//' | tr -d ":><|*/\"'?[:cntrl:]"
|
|
||||||
}
|
|
||||||
|
|
||||||
# What extra options?
|
|
||||||
MAXPROCS=2 # Run a few encoders simultaneously
|
|
||||||
PADTRACKS=y # Makes tracks 01 02 not 1 2
|
|
||||||
EXTRAVERBOSE=2 # Useful for debugging
|
|
||||||
COMMENT='abcde version 2.7.2' # Place a comment...
|
|
||||||
EJECTCD=y # Please eject cd when finished :-)
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,199 +0,0 @@
|
||||||
window:
|
|
||||||
dimensions:
|
|
||||||
columns: 0
|
|
||||||
lines: 0
|
|
||||||
padding:
|
|
||||||
x: 30
|
|
||||||
y: 20
|
|
||||||
dynamic_padding: false
|
|
||||||
decorations: full
|
|
||||||
|
|
||||||
scrolling:
|
|
||||||
history: 10000
|
|
||||||
multiplier: 3
|
|
||||||
auto_scroll: false
|
|
||||||
|
|
||||||
tabspaces: 8
|
|
||||||
|
|
||||||
font:
|
|
||||||
normal:
|
|
||||||
family: Hack Nerd Font Mono
|
|
||||||
size: 12.0
|
|
||||||
offset:
|
|
||||||
x: 0
|
|
||||||
y: 0
|
|
||||||
glyph_offset:
|
|
||||||
x: 0
|
|
||||||
y: 0
|
|
||||||
use_thin_strokes: true
|
|
||||||
|
|
||||||
# Colors (One Dark)
|
|
||||||
colors:
|
|
||||||
# Default colors
|
|
||||||
primary:
|
|
||||||
background: '0x282c34'
|
|
||||||
foreground: '0xabb2bf'
|
|
||||||
|
|
||||||
# Cursor colors
|
|
||||||
cursor:
|
|
||||||
text: '0x282c34'
|
|
||||||
cursor: '0xabb2bf'
|
|
||||||
|
|
||||||
# Normal colors
|
|
||||||
normal:
|
|
||||||
black: '0x282c34'
|
|
||||||
red: '0xe06c75'
|
|
||||||
green: '0x98c379'
|
|
||||||
yellow: '0xe5c07b'
|
|
||||||
blue: '0x61afef'
|
|
||||||
magenta: '0xc678dd'
|
|
||||||
cyan: '0x56b6c2'
|
|
||||||
white: '0xabb2bf'
|
|
||||||
|
|
||||||
# Bright colors
|
|
||||||
bright:
|
|
||||||
black: '0x3e4452'
|
|
||||||
red: '0xbe5046'
|
|
||||||
green: '0x98c379'
|
|
||||||
yellow: '0xd19a66'
|
|
||||||
blue: '0x61afef'
|
|
||||||
magenta: '0xc678dd'
|
|
||||||
cyan: '0x56b6c2'
|
|
||||||
white: '0x5c6370'
|
|
||||||
|
|
||||||
visual_bell:
|
|
||||||
animation: EaseOutExpo
|
|
||||||
duration: 0
|
|
||||||
color: '#ffffff'
|
|
||||||
|
|
||||||
background_opacity: 1.0
|
|
||||||
|
|
||||||
mouse_bindings:
|
|
||||||
- { mouse: Middle, action: PasteSelection }
|
|
||||||
|
|
||||||
mouse:
|
|
||||||
double_click: { threshold: 300 }
|
|
||||||
triple_click: { threshold: 300 }
|
|
||||||
hide_when_typing: false
|
|
||||||
url:
|
|
||||||
modifiers: None
|
|
||||||
|
|
||||||
selection:
|
|
||||||
semantic_escape_chars: ',│`|:"'' ()[]{}<>'
|
|
||||||
save_to_clipboard: false
|
|
||||||
|
|
||||||
dynamic_title: true
|
|
||||||
|
|
||||||
cursor:
|
|
||||||
style: Block
|
|
||||||
unfocused_hollow: true
|
|
||||||
|
|
||||||
live_config_reload: true
|
|
||||||
|
|
||||||
enable_experimental_conpty_backend: true
|
|
||||||
|
|
||||||
alt_send_esc: true
|
|
||||||
|
|
||||||
key_bindings:
|
|
||||||
- { key: Paste, action: Paste }
|
|
||||||
- { key: Copy, action: Copy }
|
|
||||||
- { key: L, mods: Control, action: ClearLogNotice }
|
|
||||||
- { key: L, mods: Control, chars: "\x0c" }
|
|
||||||
- { key: Home, chars: "\x1bOH", mode: AppCursor }
|
|
||||||
- { key: Home, chars: "\x1b[H", mode: ~AppCursor }
|
|
||||||
- { key: End, chars: "\x1bOF", mode: AppCursor }
|
|
||||||
- { key: End, chars: "\x1b[F", mode: ~AppCursor }
|
|
||||||
- { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt }
|
|
||||||
- { key: PageUp, mods: Shift, chars: "\x1b[5;2~", mode: Alt }
|
|
||||||
- { key: PageUp, mods: Control, chars: "\x1b[5;5~" }
|
|
||||||
- { key: PageUp, chars: "\x1b[5~" }
|
|
||||||
- { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt }
|
|
||||||
- { key: PageDown, mods: Shift, chars: "\x1b[6;2~", mode: Alt }
|
|
||||||
- { key: PageDown, mods: Control, chars: "\x1b[6;5~" }
|
|
||||||
- { key: PageDown, chars: "\x1b[6~" }
|
|
||||||
- { key: Tab, mods: Shift, chars: "\x1b[Z" }
|
|
||||||
- { key: Back, chars: "\x7f" }
|
|
||||||
- { key: Back, mods: Alt, chars: "\x1b\x7f" }
|
|
||||||
- { key: Insert, chars: "\x1b[2~" }
|
|
||||||
- { key: Delete, chars: "\x1b[3~" }
|
|
||||||
- { key: Left, mods: Shift, chars: "\x1b[1;2D" }
|
|
||||||
- { key: Left, mods: Control, chars: "\x1b[1;5D" }
|
|
||||||
- { key: Left, mods: Alt, chars: "\x1b[1;3D" }
|
|
||||||
- { key: Left, chars: "\x1b[D", mode: ~AppCursor }
|
|
||||||
- { key: Left, chars: "\x1bOD", mode: AppCursor }
|
|
||||||
- { key: Right, mods: Shift, chars: "\x1b[1;2C" }
|
|
||||||
- { key: Right, mods: Control, chars: "\x1b[1;5C" }
|
|
||||||
- { key: Right, mods: Alt, chars: "\x1b[1;3C" }
|
|
||||||
- { key: Right, chars: "\x1b[C", mode: ~AppCursor }
|
|
||||||
- { key: Right, chars: "\x1bOC", mode: AppCursor }
|
|
||||||
- { key: Up, mods: Shift, chars: "\x1b[1;2A" }
|
|
||||||
- { key: Up, mods: Control, chars: "\x1b[1;5A" }
|
|
||||||
- { key: Up, mods: Alt, chars: "\x1b[1;3A" }
|
|
||||||
- { key: Up, chars: "\x1b[A", mode: ~AppCursor }
|
|
||||||
- { key: Up, chars: "\x1bOA", mode: AppCursor }
|
|
||||||
- { key: Down, mods: Shift, chars: "\x1b[1;2B" }
|
|
||||||
- { key: Down, mods: Control, chars: "\x1b[1;5B" }
|
|
||||||
- { key: Down, mods: Alt, chars: "\x1b[1;3B" }
|
|
||||||
- { key: Down, chars: "\x1b[B", mode: ~AppCursor }
|
|
||||||
- { key: Down, chars: "\x1bOB", mode: AppCursor }
|
|
||||||
- { key: F1, chars: "\x1bOP" }
|
|
||||||
- { key: F2, chars: "\x1bOQ" }
|
|
||||||
- { key: F3, chars: "\x1bOR" }
|
|
||||||
- { key: F4, chars: "\x1bOS" }
|
|
||||||
- { key: F5, chars: "\x1b[15~" }
|
|
||||||
- { key: F6, chars: "\x1b[17~" }
|
|
||||||
- { key: F7, chars: "\x1b[18~" }
|
|
||||||
- { key: F8, chars: "\x1b[19~" }
|
|
||||||
- { key: F9, chars: "\x1b[20~" }
|
|
||||||
- { key: F10, chars: "\x1b[21~" }
|
|
||||||
- { key: F11, chars: "\x1b[23~" }
|
|
||||||
- { key: F12, chars: "\x1b[24~" }
|
|
||||||
- { key: F1, mods: Shift, chars: "\x1b[1;2P" }
|
|
||||||
- { key: F2, mods: Shift, chars: "\x1b[1;2Q" }
|
|
||||||
- { key: F3, mods: Shift, chars: "\x1b[1;2R" }
|
|
||||||
- { key: F4, mods: Shift, chars: "\x1b[1;2S" }
|
|
||||||
- { key: F5, mods: Shift, chars: "\x1b[15;2~" }
|
|
||||||
- { key: F6, mods: Shift, chars: "\x1b[17;2~" }
|
|
||||||
- { key: F7, mods: Shift, chars: "\x1b[18;2~" }
|
|
||||||
- { key: F8, mods: Shift, chars: "\x1b[19;2~" }
|
|
||||||
- { key: F9, mods: Shift, chars: "\x1b[20;2~" }
|
|
||||||
- { key: F10, mods: Shift, chars: "\x1b[21;2~" }
|
|
||||||
- { key: F11, mods: Shift, chars: "\x1b[23;2~" }
|
|
||||||
- { key: F12, mods: Shift, chars: "\x1b[24;2~" }
|
|
||||||
- { key: F1, mods: Control, chars: "\x1b[1;5P" }
|
|
||||||
- { key: F2, mods: Control, chars: "\x1b[1;5Q" }
|
|
||||||
- { key: F3, mods: Control, chars: "\x1b[1;5R" }
|
|
||||||
- { key: F4, mods: Control, chars: "\x1b[1;5S" }
|
|
||||||
- { key: F5, mods: Control, chars: "\x1b[15;5~" }
|
|
||||||
- { key: F6, mods: Control, chars: "\x1b[17;5~" }
|
|
||||||
- { key: F7, mods: Control, chars: "\x1b[18;5~" }
|
|
||||||
- { key: F8, mods: Control, chars: "\x1b[19;5~" }
|
|
||||||
- { key: F9, mods: Control, chars: "\x1b[20;5~" }
|
|
||||||
- { key: F10, mods: Control, chars: "\x1b[21;5~" }
|
|
||||||
- { key: F11, mods: Control, chars: "\x1b[23;5~" }
|
|
||||||
- { key: F12, mods: Control, chars: "\x1b[24;5~" }
|
|
||||||
- { key: F1, mods: Alt, chars: "\x1b[1;6P" }
|
|
||||||
- { key: F2, mods: Alt, chars: "\x1b[1;6Q" }
|
|
||||||
- { key: F3, mods: Alt, chars: "\x1b[1;6R" }
|
|
||||||
- { key: F4, mods: Alt, chars: "\x1b[1;6S" }
|
|
||||||
- { key: F5, mods: Alt, chars: "\x1b[15;6~" }
|
|
||||||
- { key: F6, mods: Alt, chars: "\x1b[17;6~" }
|
|
||||||
- { key: F7, mods: Alt, chars: "\x1b[18;6~" }
|
|
||||||
- { key: F8, mods: Alt, chars: "\x1b[19;6~" }
|
|
||||||
- { key: F9, mods: Alt, chars: "\x1b[20;6~" }
|
|
||||||
- { key: F10, mods: Alt, chars: "\x1b[21;6~" }
|
|
||||||
- { key: F11, mods: Alt, chars: "\x1b[23;6~" }
|
|
||||||
- { key: F12, mods: Alt, chars: "\x1b[24;6~" }
|
|
||||||
- { key: F1, mods: Super, chars: "\x1b[1;3P" }
|
|
||||||
- { key: F2, mods: Super, chars: "\x1b[1;3Q" }
|
|
||||||
- { key: F3, mods: Super, chars: "\x1b[1;3R" }
|
|
||||||
- { key: F4, mods: Super, chars: "\x1b[1;3S" }
|
|
||||||
- { key: F5, mods: Super, chars: "\x1b[15;3~" }
|
|
||||||
- { key: F6, mods: Super, chars: "\x1b[17;3~" }
|
|
||||||
- { key: F7, mods: Super, chars: "\x1b[18;3~" }
|
|
||||||
- { key: F8, mods: Super, chars: "\x1b[19;3~" }
|
|
||||||
- { key: F9, mods: Super, chars: "\x1b[20;3~" }
|
|
||||||
- { key: F10, mods: Super, chars: "\x1b[21;3~" }
|
|
||||||
- { key: F11, mods: Super, chars: "\x1b[23;3~" }
|
|
||||||
- { key: F12, mods: Super, chars: "\x1b[24;3~" }
|
|
||||||
- { key: NumpadEnter, chars: "\n" }
|
|
|
@ -1,9 +0,0 @@
|
||||||
continue
|
|
||||||
file-allocation=falloc
|
|
||||||
log-level=warn
|
|
||||||
max-connection-per-server=4
|
|
||||||
max-concurrent-downloads=3
|
|
||||||
max-overall-download-limit=0
|
|
||||||
min-split-size=5M
|
|
||||||
enable-http-pipelining=true
|
|
||||||
rpc-secret="{{@@ env['PASS_ARIA2'] @@}}"
|
|
|
@ -1,45 +0,0 @@
|
||||||
directory: ~/Music
|
|
||||||
library: ~/Music/beets.db
|
|
||||||
plugins:
|
|
||||||
- acousticbrainz
|
|
||||||
- check
|
|
||||||
- edit
|
|
||||||
- fetchart
|
|
||||||
- follow
|
|
||||||
- fuzzy
|
|
||||||
- info
|
|
||||||
- lastgenre
|
|
||||||
- lyrics
|
|
||||||
- mbcollection
|
|
||||||
- mpdupdate
|
|
||||||
- play
|
|
||||||
- replaygain
|
|
||||||
- thumbnails
|
|
||||||
- web
|
|
||||||
import:
|
|
||||||
copy: no
|
|
||||||
move: yes
|
|
||||||
link: no
|
|
||||||
lastgenre:
|
|
||||||
whitelist: ~/.config/beets/whitelist
|
|
||||||
lyrics:
|
|
||||||
fallback: ''
|
|
||||||
play:
|
|
||||||
command: mpv
|
|
||||||
mpd:
|
|
||||||
host: localhost
|
|
||||||
port: 6600
|
|
||||||
follow:
|
|
||||||
email: reekymarko@reekynet.com
|
|
||||||
password: "{{@@ env['PASS_MUSPY'] @@}}"
|
|
||||||
userid: w8njp08ude90mfzsgumjhqinnirj4g
|
|
||||||
auto: yes
|
|
||||||
replaygain:
|
|
||||||
backend: gstreamer
|
|
||||||
auto: yes
|
|
||||||
musicbrainz:
|
|
||||||
user: ReekyMarko
|
|
||||||
pass: "{{@@ env['PASS_MUSICBRAINZ'] @@}}"
|
|
||||||
mbcollection:
|
|
||||||
auto: "yes"
|
|
||||||
collection: "a4955b5c-db7f-4e27-9887-f77f820bad34"
|
|
|
@ -1,37 +0,0 @@
|
||||||
avantgarde
|
|
||||||
experimental music
|
|
||||||
lofi
|
|
||||||
blues
|
|
||||||
classical
|
|
||||||
comedy
|
|
||||||
comedy music
|
|
||||||
comedy rock
|
|
||||||
humor
|
|
||||||
parody music
|
|
||||||
standup
|
|
||||||
country
|
|
||||||
country rap
|
|
||||||
country rock
|
|
||||||
rockabilly
|
|
||||||
easy listening
|
|
||||||
electronic
|
|
||||||
drum and bass
|
|
||||||
hardcore
|
|
||||||
house
|
|
||||||
techno
|
|
||||||
uk garage
|
|
||||||
dubstep
|
|
||||||
rap
|
|
||||||
folk
|
|
||||||
hip hop
|
|
||||||
countryrap
|
|
||||||
rap rock
|
|
||||||
jazz
|
|
||||||
pop
|
|
||||||
rhythm and blues
|
|
||||||
rock
|
|
||||||
hard rock
|
|
||||||
alternative rock
|
|
||||||
heavy metal
|
|
||||||
punk rock
|
|
||||||
reggae
|
|
|
@ -1,75 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
# set screen timeout
|
|
||||||
xset s 300 120
|
|
||||||
xset dpms 422
|
|
||||||
|
|
||||||
# screen locker
|
|
||||||
xss-lock -n ~/Scripts/dim-screen.sh -- evenbetterlockscreen -l &
|
|
||||||
|
|
||||||
# lock screen
|
|
||||||
evenbetterlockscreen -l &
|
|
||||||
|
|
||||||
# set wallpaper
|
|
||||||
wal -R
|
|
||||||
|
|
||||||
# Start hotkey daemon
|
|
||||||
sxhkd &
|
|
||||||
|
|
||||||
bspc monitor -d web term chat mail music 6 7
|
|
||||||
|
|
||||||
bspc config border_width 0
|
|
||||||
bspc config window_gap 37
|
|
||||||
|
|
||||||
bspc config split_ratio 0.52
|
|
||||||
bspc config borderless_monocle true
|
|
||||||
bspc config gapless_monocle true
|
|
||||||
|
|
||||||
bspc rule -a TelegramDesktop desktop=^3
|
|
||||||
bspc rule -a Franz desktop=^3
|
|
||||||
bspc rule -a Thunderbird desktop=^4
|
|
||||||
|
|
||||||
bspc rule -a Zathura state=tiled
|
|
||||||
bspc rule -a Nightly:Navigator state=tiled
|
|
||||||
bspc rule -a kdeconnect-indicator state=tiled
|
|
||||||
bspc rule -a libreoffice state=tiled
|
|
||||||
bspc rule -a Screenkey manage=off
|
|
||||||
|
|
||||||
bspc config super mod4
|
|
||||||
bspc config pointer_action1 move
|
|
||||||
bspc config pointer_action2 none
|
|
||||||
bspc config pointer_action3 resize_corner
|
|
||||||
bspc config click_to_focus true
|
|
||||||
|
|
||||||
# set pywal colors
|
|
||||||
. "${HOME}/.cache/wal/colors.sh"
|
|
||||||
bspc config normal_border_color "$color1"
|
|
||||||
bspc config active_border_color "$color2"
|
|
||||||
bspc config focused_border_color "$color15"
|
|
||||||
bspc config presel_feedback_color "$color1"
|
|
||||||
|
|
||||||
|
|
||||||
# set cursor style
|
|
||||||
xsetroot -cursor_name left_ptr
|
|
||||||
|
|
||||||
# startup applications
|
|
||||||
joplin-desktop &
|
|
||||||
compton -f --config ~/.config/compton/config &
|
|
||||||
redshift &
|
|
||||||
/usr/lib/xfce4/notifyd/xfce4-notifyd &
|
|
||||||
telegram-desktop &
|
|
||||||
setxkbmap eu &
|
|
||||||
/usr/lib/kdeconnectd &
|
|
||||||
kdeconnect-indicator &
|
|
||||||
udiskie --tray &
|
|
||||||
xfce4-clipman &
|
|
||||||
/usr/bin/gnome-keyring-daemon --start --components=secrets &
|
|
||||||
~/Scripts/polybar.sh &
|
|
||||||
/usr/lib/mate-polkit/polkit-mate-authentication-agent-1 &
|
|
||||||
blueberry-tray &
|
|
||||||
nm-applet &
|
|
||||||
thunderbird &
|
|
||||||
mpDris2 &
|
|
||||||
|
|
||||||
# hide mouse cursor
|
|
||||||
unclutter -idle 1 &
|
|
|
@ -1,53 +0,0 @@
|
||||||
backend = "glx";
|
|
||||||
glx-no-stencil = true;
|
|
||||||
glx-copy-from-front = false;
|
|
||||||
glx-swap-method = 1;
|
|
||||||
inactive-opacity-override = true;
|
|
||||||
|
|
||||||
# Fix tearing
|
|
||||||
vsync = "opengl-swc";
|
|
||||||
unredir-if-possible = false;
|
|
||||||
paint-on-overlay = true;
|
|
||||||
|
|
||||||
# Shadow
|
|
||||||
shadow = true; # Enabled client-side shadows on windows.
|
|
||||||
no-dock-shadow = true; # Avoid drawing shadows on dock/panel windows.
|
|
||||||
no-dnd-shadow = true; # Don't draw shadows on DND windows.
|
|
||||||
shadow-radius = 10; # The blur radius for shadows. (default 12)
|
|
||||||
shadow-offset-x = -15; # The left offset for shadows. (default -15)
|
|
||||||
shadow-offset-y = -15; # The top offset for shadows. (default -15)
|
|
||||||
shadow-opacity = 0.5;
|
|
||||||
menu-opacity = 1;
|
|
||||||
shadow-exclude = [
|
|
||||||
"class_g = 'slop'",
|
|
||||||
"n:e:Notification",
|
|
||||||
"class_g ?= 'Xfce4-notifyd'",
|
|
||||||
#"class_g ?= 'Xfce4-power-manager'"
|
|
||||||
];
|
|
||||||
|
|
||||||
opacity-rule = [
|
|
||||||
"50:class_g = 'Bspwm' && class_i = 'presel_feedback'",
|
|
||||||
"99:class_g = 'slop'"
|
|
||||||
];
|
|
||||||
|
|
||||||
# The shadow exclude options are helpful if you have shadows enabled. Due to the way compton draws its shadows, certain applications will have visual glitches
|
|
||||||
# (most applications are fine, only apps that do weird things with xshapes or argb are affected).
|
|
||||||
# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher.
|
|
||||||
|
|
||||||
# Fading
|
|
||||||
fading = true; # Fade windows during opacity changes.
|
|
||||||
fade-delta = 4; # The time between steps in a fade in milliseconds. (default 10).
|
|
||||||
fade-in-step = 0.03; # Opacity change between steps while fading in. (default 0.028).
|
|
||||||
fade-out-step = 0.03; # Opacity change between steps while fading out. (default 0.03).
|
|
||||||
no-fading-openclose = false; # Fade windows in/out when opening/closing
|
|
||||||
|
|
||||||
detect-client-opacity = true; # This prevents opacity being ignored for some apps. For example without this enabled my xfce4-notifyd is 100% opacity no matter what.
|
|
||||||
|
|
||||||
#Window type settings
|
|
||||||
wintypes:
|
|
||||||
{
|
|
||||||
tooltip = { fade = true; shadow = false; };
|
|
||||||
menu = { shadow = false; };
|
|
||||||
dropdown_menu = { shadow = false; };
|
|
||||||
popup_menu = { shadow = false; };
|
|
||||||
};
|
|
|
@ -1,6 +0,0 @@
|
||||||
languages:
|
|
||||||
markdown:
|
|
||||||
lint-command: 'yarn --cwd ~/.bin/node run markdownlint -s'
|
|
||||||
lint-stdin: true
|
|
||||||
lint-formats:
|
|
||||||
- '%f: %l: %m'
|
|
|
@ -1,3 +0,0 @@
|
||||||
_JAVA_AWT_WM_NONREPARENTING=1
|
|
||||||
_JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
|
|
||||||
JAVA_FONTS=/usr/share/fonts/TTF
|
|
|
@ -1,8 +0,0 @@
|
||||||
flash-opacity: 0.8
|
|
||||||
default-opacity: 1
|
|
||||||
time: 300
|
|
||||||
simple: false
|
|
||||||
ntimepoints: 10
|
|
||||||
flash-on-focus: true
|
|
||||||
flash-fullscreen: true
|
|
||||||
flash-lone-windows: 'always'
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?xml version='1.0'?>
|
|
||||||
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
|
|
||||||
<fontconfig>
|
|
||||||
|
|
||||||
<alias>
|
|
||||||
<family>sans-serif</family>
|
|
||||||
<prefer>
|
|
||||||
<family>Overpass</family>
|
|
||||||
</prefer>
|
|
||||||
</alias>
|
|
||||||
|
|
||||||
<alias>
|
|
||||||
<family>serif</family>
|
|
||||||
<prefer>
|
|
||||||
<family>Overpass</family>
|
|
||||||
</prefer>
|
|
||||||
</alias>
|
|
||||||
|
|
||||||
<alias>
|
|
||||||
<family>monospace</family>
|
|
||||||
<prefer>
|
|
||||||
<family>Hack Nerd Font Mono</family>
|
|
||||||
</prefer>
|
|
||||||
</alias>
|
|
||||||
|
|
||||||
</fontconfig>
|
|
|
@ -1,3 +0,0 @@
|
||||||
VteTerminal, vte-terminal {
|
|
||||||
padding: 40px;
|
|
||||||
}
|
|
|
@ -1,266 +0,0 @@
|
||||||
# ~/.config/i3/config
|
|
||||||
|
|
||||||
client.focused #3F8AC2 #096BAA #00BAA7 #00DA8E
|
|
||||||
client.focused_inactive #333333 #5F676A #ffffff #484e50
|
|
||||||
client.unfocused #333333 #424242 #888888 #292d2e
|
|
||||||
client.urgent #C10004 #900000 #ffffff #900000
|
|
||||||
|
|
||||||
# GAPS
|
|
||||||
gaps inner 20
|
|
||||||
set $mode_gaps Gaps: (o) outer, (i) inner
|
|
||||||
set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
|
|
||||||
set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)
|
|
||||||
bindsym $mod+Shift+g mode "$mode_gaps"
|
|
||||||
|
|
||||||
# Modes for controlling gaps
|
|
||||||
mode "$mode_gaps" {
|
|
||||||
bindsym o mode "$mode_gaps_outer"
|
|
||||||
bindsym i mode "$mode_gaps_inner"
|
|
||||||
bindsym Return mode "default"
|
|
||||||
bindsym Escape mode "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
mode "$mode_gaps_inner" {
|
|
||||||
bindsym plus gaps inner current plus 5
|
|
||||||
bindsym minus gaps inner current minus 5
|
|
||||||
bindsym 0 gaps inner current set 0
|
|
||||||
|
|
||||||
bindsym Shift+plus gaps inner all plus 5
|
|
||||||
bindsym Shift+minus gaps inner all minus 5
|
|
||||||
bindsym Shift+0 gaps inner all set 0
|
|
||||||
|
|
||||||
bindsym Return mode "default"
|
|
||||||
bindsym Escape mode "default"
|
|
||||||
}
|
|
||||||
mode "$mode_gaps_outer" {
|
|
||||||
bindsym plus gaps outer current plus 5
|
|
||||||
bindsym minus gaps outer current minus 5
|
|
||||||
bindsym 0 gaps outer current set 0
|
|
||||||
|
|
||||||
bindsym Shift+plus gaps outer all plus 5
|
|
||||||
bindsym Shift+minus gaps outer all minus 5
|
|
||||||
bindsym Shift+0 gaps outer all set 0
|
|
||||||
|
|
||||||
bindsym Return mode "default"
|
|
||||||
bindsym Escape mode "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
set $mod mod4
|
|
||||||
set $term termite
|
|
||||||
|
|
||||||
bindsym $mod+d exec --no-startup-id rofi -show-icons -show drun -config /home/reekymarko/.config/rofi/config
|
|
||||||
bindsym $mod+p exec --no-startup-id rofi-pass --last-used
|
|
||||||
bindsym $mod+Shift+p exec --no-startup-id rofi-pass --bmarks --last-used
|
|
||||||
|
|
||||||
font pango:System San Francisco Display 11
|
|
||||||
|
|
||||||
new_window 1pixel
|
|
||||||
hide_edge_borders vertical
|
|
||||||
|
|
||||||
# Use Mouse+$mod to drag floating windows to their wanted position
|
|
||||||
floating_modifier $mod
|
|
||||||
|
|
||||||
# start a terminal
|
|
||||||
bindsym $mod+Return exec --no-startup-id $term
|
|
||||||
|
|
||||||
# kill focused window
|
|
||||||
bindsym $mod+Shift+q kill
|
|
||||||
|
|
||||||
# change focus
|
|
||||||
bindsym $mod+h focus left
|
|
||||||
bindsym $mod+j focus down
|
|
||||||
bindsym $mod+k focus up
|
|
||||||
bindsym $mod+l focus right
|
|
||||||
|
|
||||||
# alternatively, you can use the cursor keys:
|
|
||||||
bindsym $mod+Left focus left
|
|
||||||
bindsym $mod+Down focus down
|
|
||||||
bindsym $mod+Up focus up
|
|
||||||
bindsym $mod+Right focus right
|
|
||||||
|
|
||||||
# move focused window
|
|
||||||
bindsym $mod+Shift+h move left
|
|
||||||
bindsym $mod+Shift+j move down
|
|
||||||
bindsym $mod+Shift+k move up
|
|
||||||
bindsym $mod+Shift+l move right
|
|
||||||
|
|
||||||
# alternatively, you can use the cursor keys:
|
|
||||||
bindsym $mod+Shift+Left move left
|
|
||||||
bindsym $mod+Shift+Down move down
|
|
||||||
bindsym $mod+Shift+Up move up
|
|
||||||
bindsym $mod+Shift+Right move right
|
|
||||||
|
|
||||||
# split in horizontal orientation
|
|
||||||
bindsym $mod+y split h
|
|
||||||
|
|
||||||
# split in vertical orientation
|
|
||||||
bindsym $mod+x split v
|
|
||||||
|
|
||||||
# enter fullscreen mode for the focused container
|
|
||||||
bindsym $mod+f fullscreen toggle
|
|
||||||
|
|
||||||
# change container layout (stacked, tabbed, toggle split)
|
|
||||||
bindsym $mod+s layout stacking
|
|
||||||
bindsym $mod+w layout tabbed
|
|
||||||
bindsym $mod+e layout toggle split
|
|
||||||
|
|
||||||
# toggle tiling / floating
|
|
||||||
bindsym $mod+Shift+space floating toggle
|
|
||||||
|
|
||||||
# change focus between tiling / floating windows
|
|
||||||
bindsym $mod+space focus mode_toggle
|
|
||||||
|
|
||||||
# focus the parent container
|
|
||||||
bindsym $mod+a focus parent
|
|
||||||
|
|
||||||
focus_follows_mouse no
|
|
||||||
|
|
||||||
# focus the child container
|
|
||||||
#bindsym $mod+d focus child
|
|
||||||
|
|
||||||
# open with clipboard contents
|
|
||||||
bindsym $mod+v exec --no-startup-id mpv --ytdl-format="bestvideo[ext=mp4][height<=?1080]+bestaudio[ext=m4a]" $(xclip -o)
|
|
||||||
bindym $mod+Shift+b exec --no-startup-id firefox-nightly $(xclip -o)
|
|
||||||
|
|
||||||
#workspace names
|
|
||||||
set $workspace1 "1: Start "
|
|
||||||
set $workspace2 "2"
|
|
||||||
set $workspace3 "3"
|
|
||||||
set $workspace4 "4"
|
|
||||||
set $workspace5 "5"
|
|
||||||
set $workspace6 "6"
|
|
||||||
set $workspace7 "7"
|
|
||||||
set $workspace8 "8: Mail "
|
|
||||||
set $workspace9 "9: Messaging "
|
|
||||||
set $workspace10 "10: Music "
|
|
||||||
|
|
||||||
# switch to workspace
|
|
||||||
bindsym $mod+1 workspace $workspace1
|
|
||||||
bindsym $mod+2 workspace $workspace2
|
|
||||||
bindsym $mod+3 workspace $workspace3
|
|
||||||
bindsym $mod+4 workspace $workspace4
|
|
||||||
bindsym $mod+5 workspace $workspace5
|
|
||||||
bindsym $mod+6 workspace $workspace6
|
|
||||||
bindsym $mod+7 workspace $workspace7
|
|
||||||
bindsym $mod+8 workspace $workspace8
|
|
||||||
bindsym $mod+9 workspace $workspace9
|
|
||||||
bindsym $mod+0 workspace $workspace10
|
|
||||||
|
|
||||||
# classes
|
|
||||||
for_window [class="TelegramDesktop"] move to workspace $workspace9
|
|
||||||
for_window [class="Thunderbird"] move to workspace $workspace8
|
|
||||||
|
|
||||||
|
|
||||||
# move focused container to workspace
|
|
||||||
bindsym $mod+Shift+1 move container to workspace $workspace1
|
|
||||||
bindsym $mod+Shift+2 move container to workspace $workspace2
|
|
||||||
bindsym $mod+Shift+3 move container to workspace $workspace3
|
|
||||||
bindsym $mod+Shift+4 move container to workspace $workspace4
|
|
||||||
bindsym $mod+Shift+5 move container to workspace $workspace5
|
|
||||||
bindsym $mod+Shift+6 move container to workspace $workspace6
|
|
||||||
bindsym $mod+Shift+7 move container to workspace $workspace7
|
|
||||||
bindsym $mod+Shift+8 move container to workspace $workspace8
|
|
||||||
bindsym $mod+Shift+9 move container to workspace $workspace9
|
|
||||||
bindsym $mod+Shift+0 move container to workspace $workspace10
|
|
||||||
|
|
||||||
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
|
||||||
bindsym $mod+Shift+r restart
|
|
||||||
# exit i3 (logs you out of your X session)
|
|
||||||
bindsym $mod+Shift+e exec --no-startup-id i3-msg exit
|
|
||||||
|
|
||||||
# resize window (you can also use the mouse for that)
|
|
||||||
mode "resize" {
|
|
||||||
# These bindings trigger as soon as you enter the resize mode
|
|
||||||
|
|
||||||
# Pressing left will shrink the window’s width.
|
|
||||||
# Pressing right will grow the window’s width.
|
|
||||||
# Pressing up will shrink the window’s height.
|
|
||||||
# Pressing down will grow the window’s height.
|
|
||||||
bindsym j resize shrink width 10 px or 10 ppt
|
|
||||||
bindsym k resize grow height 10 px or 10 ppt
|
|
||||||
bindsym l resize shrink height 10 px or 10 ppt
|
|
||||||
bindsym semicolon resize grow width 10 px or 10 ppt
|
|
||||||
|
|
||||||
# same bindings, but for the arrow keys
|
|
||||||
bindsym Left resize shrink width 10 px or 10 ppt
|
|
||||||
bindsym Down resize grow height 10 px or 10 ppt
|
|
||||||
bindsym Up resize shrink height 10 px or 10 ppt
|
|
||||||
bindsym Right resize grow width 10 px or 10 ppt
|
|
||||||
|
|
||||||
# back to normal: Enter or Escape
|
|
||||||
bindsym Return mode "default"
|
|
||||||
bindsym Escape mode "default"
|
|
||||||
}
|
|
||||||
|
|
||||||
bindsym $mod+r mode "resize"
|
|
||||||
|
|
||||||
set $bg-color #263238
|
|
||||||
set $inactive-bg-color #263238
|
|
||||||
set $text-color #f3f4f5
|
|
||||||
set $inactive-text-color #676E7D
|
|
||||||
set $urgent-bg-color #E53935
|
|
||||||
|
|
||||||
# window colors
|
|
||||||
# border background text indicator
|
|
||||||
client.focused $bg-color $bg-color $text-color #00ff00
|
|
||||||
client.unfocused $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
|
|
||||||
client.focused_inactive $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
|
|
||||||
client.urgent $urgent-bg-color $urgent-bg-color $text-color #00ff00
|
|
||||||
|
|
||||||
# pulseaudio controls
|
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse sset Master 5%+ # increase sound volume
|
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D pulse sset Master 5%- # decrease sound volume
|
|
||||||
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse set Master 1+ toggle # mute sound
|
|
||||||
|
|
||||||
# sreen brightness controls
|
|
||||||
bindsym XF86MonBrightnessUp exec --no-startup-id light -A 5 # increase screen brightness
|
|
||||||
bindsym XF86MonBrightnessDown exec --no-startup-id light -U 5 # decrease screen brightness
|
|
||||||
|
|
||||||
# screenshot and screencast
|
|
||||||
bindsym Print exec --no-startup-id "maim -u -s -l -c 0.157,0.333,0.466,0.4 | xclip -selection clipboard -t image/png && canberra-gtk-play -i camera-shutter"
|
|
||||||
bindsym $mod+Print exec --no-startup-id ~/scripts/record-screen.sh
|
|
||||||
|
|
||||||
|
|
||||||
# mpd controls
|
|
||||||
bindsym XF86AudioNext exec --no-startup-id mpc next
|
|
||||||
bindsym XF86AudioPrev exec --no-startup-id mpc prev
|
|
||||||
bindsym XF86AudioPlay exec --no-startup-id mpc toggle
|
|
||||||
bindsym XF86AudioStop exec --no-startup-id mpc clear
|
|
||||||
|
|
||||||
# connect bluetooth headset
|
|
||||||
bindsym $mod+c exec --no-startup-id bluetoothctl connect 17:08:01:0D:09:33
|
|
||||||
|
|
||||||
# connect bluetooth speaker
|
|
||||||
bindsym $mod+Shift+c exec --no-startup-id bluetoothctl connect 27:59:BE:CE:45:42
|
|
||||||
|
|
||||||
# lock screen
|
|
||||||
bindsym Control+Shift+l exec --no-startup-id evenbetterlockscreen -l
|
|
||||||
|
|
||||||
# open browser
|
|
||||||
bindsym $mod+b exec --no-startup-id firefox-nightly
|
|
||||||
|
|
||||||
{%@@ if profile == "ReekyPC" @@%}
|
|
||||||
# desktop only
|
|
||||||
exec_always --no-startup-id ~/scripts/desktop_screenlayout.sh
|
|
||||||
{%@@ endif @@%}
|
|
||||||
|
|
||||||
# autostart applications
|
|
||||||
exec_always --no-startup-id ~/Scripts/polybar.sh
|
|
||||||
exec --no-startup-id redshift
|
|
||||||
exec --no-startup-id unclutter
|
|
||||||
exec --no-startup-id nm-applet
|
|
||||||
exec --no-startup-id compton -f --config ~/.config/compton/compton.conf
|
|
||||||
exec --no-startup-id LANG=en_DK.UTF-8 telegram-desktop
|
|
||||||
exec --no-startup-id setxkbmap eu
|
|
||||||
exec --no-startup-id blueberry-tray
|
|
||||||
exec --no-startup-id mpDris2
|
|
||||||
exec --no-startup-id /usr/lib/kdeconnectd
|
|
||||||
exec --no-startup-id kdeconnect-indicator
|
|
||||||
exec --no-startup-id /usr/lib/xfce4/notifyd/xfce4-notifyd
|
|
||||||
exec --no-startup-id udiskie --tray
|
|
||||||
exec --no-startup-id pamac-tray
|
|
||||||
exec --no-startup-id xfce4-clipman
|
|
||||||
exec --no-startup-id thunderbird
|
|
||||||
exec --no-startup-id /usr/bin/gnome-keyring-daemon --start --components=secrets
|
|
||||||
exec --no-startup-id evenbetterlockscreen -w
|
|
||||||
exec --no-startup-id evenbetterlockscreen -l
|
|
|
@ -1,132 +0,0 @@
|
||||||
# ~/.config/i3/config
|
|
||||||
set $mod mod4
|
|
||||||
set $term alacritty
|
|
||||||
|
|
||||||
bindsym $mod+d exec --no-startup-id rofi -show-icons -show drun -config /home/reekymarko/.config/rofi/config
|
|
||||||
|
|
||||||
font pango:System San Francisco Display 11
|
|
||||||
|
|
||||||
new_window 1pixel
|
|
||||||
hide_edge_borders vertical
|
|
||||||
|
|
||||||
# Use Mouse+$mod to drag floating windows to their wanted position
|
|
||||||
floating_modifier $mod
|
|
||||||
|
|
||||||
# start a terminal
|
|
||||||
bindsym $mod+Return exec --no-startup-id $term
|
|
||||||
|
|
||||||
# kill focused window
|
|
||||||
bindsym $mod+w kill
|
|
||||||
|
|
||||||
# change focus
|
|
||||||
bindsym $mod+h focus left
|
|
||||||
bindsym $mod+j focus down
|
|
||||||
bindsym $mod+k focus up
|
|
||||||
bindsym $mod+l focus right
|
|
||||||
|
|
||||||
# alternatively, you can use the cursor keys:
|
|
||||||
bindsym $mod+Left focus left
|
|
||||||
bindsym $mod+Down focus down
|
|
||||||
bindsym $mod+Up focus up
|
|
||||||
bindsym $mod+Right focus right
|
|
||||||
|
|
||||||
# move focused window
|
|
||||||
bindsym $mod+Shift+h move left
|
|
||||||
bindsym $mod+Shift+j move down
|
|
||||||
bindsym $mod+Shift+k move up
|
|
||||||
bindsym $mod+Shift+l move right
|
|
||||||
|
|
||||||
# alternatively, you can use the cursor keys:
|
|
||||||
bindsym $mod+Shift+Left move left
|
|
||||||
bindsym $mod+Shift+Down move down
|
|
||||||
bindsym $mod+Shift+Up move up
|
|
||||||
bindsym $mod+Shift+Right move right
|
|
||||||
|
|
||||||
# split in horizontal orientation
|
|
||||||
bindsym $mod+y split h
|
|
||||||
|
|
||||||
# split in vertical orientation
|
|
||||||
bindsym $mod+x split v
|
|
||||||
|
|
||||||
# enter fullscreen mode for the focused container
|
|
||||||
bindsym $mod+f fullscreen toggle
|
|
||||||
|
|
||||||
# change container layout (stacked, tabbed, toggle split)
|
|
||||||
bindsym $mod+s layout stacking
|
|
||||||
bindsym $mod+w layout tabbed
|
|
||||||
bindsym $mod+e layout toggle split
|
|
||||||
|
|
||||||
# toggle tiling / floating
|
|
||||||
bindsym $mod+Shift+space floating toggle
|
|
||||||
|
|
||||||
# change focus between tiling / floating windows
|
|
||||||
bindsym $mod+space focus mode_toggle
|
|
||||||
# focus the parent container
|
|
||||||
bindsym $mod+a focus parent
|
|
||||||
|
|
||||||
focus_follows_mouse no
|
|
||||||
|
|
||||||
# focus the child container
|
|
||||||
#bindsym $mod+d focus child
|
|
||||||
|
|
||||||
# open with clipboard contents
|
|
||||||
bindsym $mod+v exec --no-startup-id mpv --ytdl-format="bestvideo[ext=mp4][height<=?1080]+bestaudio[ext=m4a]" $(xclip -o)
|
|
||||||
bindym $mod+Shift+b exec --no-startup-id firefox-nightly $(xclip -o)
|
|
||||||
|
|
||||||
#workspace names
|
|
||||||
set $workspace1 "1: Start "
|
|
||||||
set $workspace2 "2"
|
|
||||||
set $workspace3 "3"
|
|
||||||
set $workspace4 "4"
|
|
||||||
set $workspace5 "5"
|
|
||||||
set $workspace6 "6"
|
|
||||||
set $workspace7 "7"
|
|
||||||
set $workspace8 "8: Mail "
|
|
||||||
set $workspace9 "9: Messaging "
|
|
||||||
set $workspace10 "10: Music "
|
|
||||||
|
|
||||||
# switch to workspace
|
|
||||||
bindsym $mod+1 workspace $workspace1
|
|
||||||
bindsym $mod+2 workspace $workspace2
|
|
||||||
bindsym $mod+3 workspace $workspace3
|
|
||||||
bindsym $mod+4 workspace $workspace4
|
|
||||||
bindsym $mod+5 workspace $workspace5
|
|
||||||
bindsym $mod+6 workspace $workspace6
|
|
||||||
bindsym $mod+7 workspace $workspace7
|
|
||||||
bindsym $mod+8 workspace $workspace8
|
|
||||||
bindsym $mod+9 workspace $workspace9
|
|
||||||
bindsym $mod+0 workspace $workspace10
|
|
||||||
|
|
||||||
# move focused container to workspace
|
|
||||||
bindsym $mod+Shift+1 move container to workspace $workspace1
|
|
||||||
bindsym $mod+Shift+2 move container to workspace $workspace2
|
|
||||||
bindsym $mod+Shift+3 move container to workspace $workspace3
|
|
||||||
bindsym $mod+Shift+4 move container to workspace $workspace4
|
|
||||||
bindsym $mod+Shift+5 move container to workspace $workspace5
|
|
||||||
bindsym $mod+Shift+6 move container to workspace $workspace6
|
|
||||||
bindsym $mod+Shift+7 move container to workspace $workspace7
|
|
||||||
bindsym $mod+Shift+8 move container to workspace $workspace8
|
|
||||||
bindsym $mod+Shift+9 move container to workspace $workspace9
|
|
||||||
bindsym $mod+Shift+0 move container to workspace $workspace10
|
|
||||||
|
|
||||||
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
|
|
||||||
bindsym $mod+Shift+r restart
|
|
||||||
# exit i3 (logs you out of your X session)
|
|
||||||
bindsym $mod+Shift+e exec --no-startup-id i3-msg exit
|
|
||||||
|
|
||||||
|
|
||||||
# pulseaudio controls
|
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse sset Master 5%+ # increase sound volume
|
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D pulse sset Master 5%- # decrease sound volume
|
|
||||||
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse set Master 1+ toggle # mute sound
|
|
||||||
|
|
||||||
# open browser
|
|
||||||
bindsym $mod+b exec --no-startup-id firefox-nightly
|
|
||||||
|
|
||||||
# window rules
|
|
||||||
for_window [class="Steam"] move to workspace $workspace2
|
|
||||||
|
|
||||||
# autostart applications
|
|
||||||
exec --no-startup-id setxkbmap eu
|
|
||||||
exec --no-startup-id steam-native
|
|
||||||
exec --no-startup-id kodi
|
|
|
@ -1,28 +0,0 @@
|
||||||
[calendars]
|
|
||||||
|
|
||||||
[[birthdays]]
|
|
||||||
path = ~/.calendars/contact_birthdays
|
|
||||||
type = calendar
|
|
||||||
color = light green
|
|
||||||
readonly = True
|
|
||||||
|
|
||||||
[[school]]
|
|
||||||
path = ~/.calendars/school
|
|
||||||
type = calendar
|
|
||||||
color = light green
|
|
||||||
|
|
||||||
[[personal]]
|
|
||||||
path = ~/.calendars/personal
|
|
||||||
type = calendar
|
|
||||||
color = light green
|
|
||||||
|
|
||||||
[[card_local]]
|
|
||||||
path = ~/.contacts/*
|
|
||||||
type = discover
|
|
||||||
|
|
||||||
[locale]
|
|
||||||
timeformat = %H:%M
|
|
||||||
dateformat = %Y-%m-%d
|
|
||||||
longdateformat = %Y-%m-%d
|
|
||||||
datetimeformat = %Y-%m-%d %H:%M
|
|
||||||
longdatetimeformat = %Y-%m-%d %H:%M
|
|
|
@ -1,28 +0,0 @@
|
||||||
# example configuration file for khard version >= 0.11.0
|
|
||||||
# place it under $HOME/.config/khard/khard.conf
|
|
||||||
|
|
||||||
[addressbooks]
|
|
||||||
[[contacts]]
|
|
||||||
path = ~/.contacts
|
|
||||||
|
|
||||||
[general]
|
|
||||||
debug = no
|
|
||||||
default_action = list
|
|
||||||
editor = vim
|
|
||||||
merge_editor = vimdiff
|
|
||||||
|
|
||||||
[contact table]
|
|
||||||
# display names by first or last name: first_name / last_name
|
|
||||||
display = first_name
|
|
||||||
# group by address book: yes / no
|
|
||||||
group_by_addressbook = no
|
|
||||||
# reverse table ordering: yes / no
|
|
||||||
reverse = no
|
|
||||||
# append nicknames to name column: yes / no
|
|
||||||
show_nicknames = no
|
|
||||||
# show uid table column: yes / no
|
|
||||||
show_uids = yes
|
|
||||||
# sort by first or last name: first_name / last_name
|
|
||||||
sort = last_name
|
|
||||||
# localize dates: yes / no
|
|
||||||
localize_dates = yes
|
|
|
@ -1,2 +0,0 @@
|
||||||
MPDAddress = "127.0.0.1:6600"
|
|
||||||
ListenbrainzToken = "{{@@ env['PASS_LISTENBRAINZ'] @@}}"
|
|
|
@ -1,6 +0,0 @@
|
||||||
background-color=#282828
|
|
||||||
text-color=#EBDBB2
|
|
||||||
border-color=#D65D0E
|
|
||||||
icons=1
|
|
||||||
default-timeout=5000
|
|
||||||
max-visible=6
|
|
|
@ -1,47 +0,0 @@
|
||||||
mpvq %U
|
|
||||||
^https?://invidio.us/.*
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://(m.)?(www.)?youtube.com/watch\?.*v=
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://(www.)?youtube.com/playlist\?.*list=
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://(www.)?youtu.be/
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://(www.)?(m.)?twitch.tv/
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:mp4|mkv|webm|avi|3gp|gif|gifv)
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://www.facebook.com/.*/videos/
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://gfycat.com/.*
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://vimeo.com/.*
|
|
||||||
|
|
||||||
mpvq %U
|
|
||||||
^https?://v.redd.it/.*
|
|
||||||
|
|
||||||
imgurviewer %U
|
|
||||||
^https?://(www.)?imgur.com/a/
|
|
||||||
|
|
||||||
imgurviewer %U
|
|
||||||
^https?://(www.)?imgur.com/gallery/
|
|
||||||
|
|
||||||
imageviewer %U
|
|
||||||
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:jpg|jpeg|png|svg)
|
|
||||||
|
|
||||||
zathura %U
|
|
||||||
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:pdf)
|
|
||||||
|
|
||||||
alacritty -e rtv "%U"
|
|
||||||
^https?://(www.)?reddit.com.*
|
|
||||||
|
|
||||||
alacritty -e rtv "%U"
|
|
||||||
^https?://redd.it.*
|
|
|
@ -1,7 +0,0 @@
|
||||||
[Connection]
|
|
||||||
host = localhost
|
|
||||||
port = 6600
|
|
||||||
password = {{@@ env['PASS_MPD'] @@}}
|
|
||||||
|
|
||||||
[Bling]
|
|
||||||
notify = False
|
|
|
@ -1,25 +0,0 @@
|
||||||
music_directory "~/Music"
|
|
||||||
playlist_directory "~/Music/Playlists"
|
|
||||||
db_file "~/.mpd/database"
|
|
||||||
log_file "~/.mpd/log"
|
|
||||||
pid_file "~/.mpd/pid"
|
|
||||||
state_file "~/.mpd/state"
|
|
||||||
sticker_file "~/.mpd/sticker.sql"
|
|
||||||
|
|
||||||
replaygain "track"
|
|
||||||
|
|
||||||
default_permissions "read"
|
|
||||||
password "{{@@ env['PASS_MPD'] @@}}@read,add,control"
|
|
||||||
password "{{@@ env['PASS_MPD_ADMIN'] @@}}@read,add,control,admin"
|
|
||||||
|
|
||||||
audio_output {
|
|
||||||
type "fifo"
|
|
||||||
name "Visualizer"
|
|
||||||
path "/tmp/mpd.fifo"
|
|
||||||
format "44100:16:2"
|
|
||||||
}
|
|
||||||
|
|
||||||
audio_output {
|
|
||||||
type "pulse"
|
|
||||||
name "MPD PulseAudio"
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
Alt+LEFT add video-pan-x -0.1
|
|
||||||
Alt+h add video-pan-x -0.1
|
|
||||||
|
|
||||||
Alt+DOWN add video-pan-y +0.1
|
|
||||||
Alt+j add video-pan-y +0.1
|
|
||||||
|
|
||||||
Alt+UP add video-pan-y -0.1
|
|
||||||
Alt+k add video-pan-y -0.1
|
|
||||||
|
|
||||||
Alt+RIGHT add video-pan-x +0.1
|
|
||||||
Alt+l add video-pan-x +0.1
|
|
||||||
|
|
||||||
# control pulseaudio volume
|
|
||||||
9 add ao-volume -2
|
|
||||||
0 add ao-volume +2
|
|
||||||
/ add ao-volume -2
|
|
||||||
* add ao-volume +2
|
|
||||||
m cycle ao-mute
|
|
||||||
VOLUME_DOWN add ao-volume -2
|
|
||||||
VOLUME_UP add ao-volume +2
|
|
||||||
MUTE cycle ao-mute
|
|
|
@ -1,112 +0,0 @@
|
||||||
#############
|
|
||||||
# Video #
|
|
||||||
#############
|
|
||||||
|
|
||||||
# Hardware decoding
|
|
||||||
vo=gpu
|
|
||||||
hwdec=vaapi
|
|
||||||
hwdec-codecs=all
|
|
||||||
|
|
||||||
{%@@ if profile == "Mirkwood" @@%}
|
|
||||||
gpu-context=wayland
|
|
||||||
{%@@ elif profile == "Rivendell" @@%}
|
|
||||||
ao=alsa
|
|
||||||
{%@@ endif @@%}
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Audio #
|
|
||||||
#############
|
|
||||||
pulse-buffer=50 # using a large buffer causes seeking issues
|
|
||||||
audio-pitch-correction=yes # automatically insert scaletempo when playing with higher speed
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Plugins/misc #
|
|
||||||
#############
|
|
||||||
# Mpris plugin
|
|
||||||
script=/usr/lib/mpv/mpris.so
|
|
||||||
|
|
||||||
# Start ipc server
|
|
||||||
input-ipc-server=/tmp/mpvsocket
|
|
||||||
|
|
||||||
# set youtube-dl max res to 1080
|
|
||||||
ytdl-format=bestvideo[height<=1080]+bestaudio/best[height<=1080]
|
|
||||||
|
|
||||||
# continue watching
|
|
||||||
save-position-on-quit
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Languages #
|
|
||||||
#############
|
|
||||||
slang=eng,en,enUS,en-US,fi,fiFI,fi-FI # automatically select these subtitles (decreasing priority)
|
|
||||||
alang=eng,en,enUS,en-US,fi,fiFI,fi-FI # automatically select these audio tracks (decreasing priority)
|
|
||||||
ytdl-raw-options=sub-lang="en,eng,enUS,en-US,fi,fiFI,fi-FI"
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Subtitles #
|
|
||||||
#############
|
|
||||||
no-sub # subtitles off on startup
|
|
||||||
demuxer-mkv-subtitle-preroll # try to correctly show embedded subs when seeking
|
|
||||||
sub-auto=fuzzy # external subs don't have to match the file name exactly to autoload
|
|
||||||
sub-file-paths=ass:srt:sub:subs:subtitles # search for external subs in the listed subdirectories
|
|
||||||
embeddedfonts=yes # use embedded fonts for SSA/ASS subs
|
|
||||||
sub-ass-force-style=Kerning=yes # allows you to override style parameters of ASS scripts
|
|
||||||
|
|
||||||
# the following options only apply to subtitles without own styling (i.e. not ASS but e.g. SRT)
|
|
||||||
sub-font="Overpass"
|
|
||||||
sub-font-size=45
|
|
||||||
sub-color="#FFFFFFFF"
|
|
||||||
sub-border-color="#FF262626"
|
|
||||||
sub-border-size=3.2
|
|
||||||
sub-shadow-offset=1
|
|
||||||
sub-shadow-color="#33000000"
|
|
||||||
sub-spacing=0.5
|
|
||||||
|
|
||||||
# OSD customizations
|
|
||||||
osd-font="Overpass"
|
|
||||||
osd-font-size=30
|
|
||||||
osd-color="#ffffffff" # ARGB format
|
|
||||||
osd-border-color="#ff151515" # ARGB format
|
|
||||||
osd-bar-align-y=0 # progress bar y alignment (-1 top, 0 centered, 1 bottom)
|
|
||||||
osd-border-size=2 # size for osd text and progress bar
|
|
||||||
osd-shadow-offset=1 # pixel width for osd text and progress bar
|
|
||||||
osd-bar-w=60 # width of " " "
|
|
||||||
osd-shadow-color="#11000000"
|
|
||||||
osd-fractions
|
|
||||||
|
|
||||||
# Protocol specific configuration
|
|
||||||
[protocol.https]
|
|
||||||
cache=yes
|
|
||||||
user-agent='Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0'
|
|
||||||
|
|
||||||
[protocol.http]
|
|
||||||
cache=yes
|
|
||||||
user-agent='Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0'
|
|
||||||
|
|
||||||
# Some settings for gifs
|
|
||||||
[extension.gif]
|
|
||||||
cache=no
|
|
||||||
no-pause
|
|
||||||
loop-file=yes
|
|
||||||
|
|
||||||
[extension.gifv]
|
|
||||||
cache=no
|
|
||||||
no-pause
|
|
||||||
loop-file=yes
|
|
||||||
|
|
||||||
# Profiles for different qualities
|
|
||||||
[360p]
|
|
||||||
ytdl-format="bestvideo[height<=360]+bestaudio/best[height<=360]"
|
|
||||||
[480p]
|
|
||||||
ytdl-format="bestvideo[height<=480]+bestaudio/best[height<=480]"
|
|
||||||
[720p]
|
|
||||||
ytdl-format="bestvideo[height<=720]+bestaudio/best[height<=720]"
|
|
||||||
[4k]
|
|
||||||
ytdl-format="bestvideo[height<=2160]+bestaudio/best[height<=2160]"
|
|
||||||
[best]
|
|
||||||
ytdl-format="bestvideo+bestaudio"
|
|
||||||
|
|
||||||
# Vulkan hwdec profile
|
|
||||||
[vulkan]
|
|
||||||
gpu-api=vulkan
|
|
||||||
gpu-context=waylandvk
|
|
||||||
hwdec=vaapi-copy
|
|
|
@ -1 +0,0 @@
|
||||||
hidetimeout=2000
|
|
|
@ -1,30 +0,0 @@
|
||||||
-- default keybinding: b
|
|
||||||
-- add the following to your input.conf to change the default keybinding:
|
|
||||||
-- keyname script_binding auto_load_subs
|
|
||||||
local utils = require 'mp.utils'
|
|
||||||
|
|
||||||
function display_error()
|
|
||||||
mp.msg.warn("Subtitle download failed: ")
|
|
||||||
mp.osd_message("Subtitle download failed")
|
|
||||||
end
|
|
||||||
|
|
||||||
function load_sub_fn()
|
|
||||||
path = mp.get_property("path")
|
|
||||||
srt_path = string.gsub(path, "%.%w+$", ".srt")
|
|
||||||
t = { args = { "subliminal", "download", "-s", "-f", "-l", "en", path } }
|
|
||||||
|
|
||||||
mp.osd_message("Searching subtitle")
|
|
||||||
res = utils.subprocess(t)
|
|
||||||
if res.error == nil then
|
|
||||||
if mp.commandv("sub_add", srt_path) then
|
|
||||||
mp.msg.warn("Subtitle download succeeded")
|
|
||||||
mp.osd_message("Subtitle '" .. srt_path .. "' download succeeded")
|
|
||||||
else
|
|
||||||
display_error()
|
|
||||||
end
|
|
||||||
else
|
|
||||||
display_error()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_key_binding("b", "auto_load_subs", load_sub_fn)
|
|
|
@ -1,367 +0,0 @@
|
||||||
local assdraw = require 'mp.assdraw'
|
|
||||||
|
|
||||||
local W = 0
|
|
||||||
local H = 0
|
|
||||||
-- 2D array of size W*H that's addressed via gField[x][y]. Each entry is a
|
|
||||||
-- table, with the following fields:
|
|
||||||
-- is_mine: true or false
|
|
||||||
-- area_mines: mine count in the 3x3 surrounding area
|
|
||||||
-- is_covered: true or false, for visibility
|
|
||||||
-- flag: flag put by user, one of FLAG_*
|
|
||||||
local gField = nil
|
|
||||||
|
|
||||||
local FLAG_NONE = "" -- not flagged
|
|
||||||
local FLAG_MINE = "⚑" -- "⚐" -- flagged as containing mine
|
|
||||||
local FLAG_MAYBE_MINE = "!" -- flagged as maybe containing mine
|
|
||||||
local FLAG_MAYBE_SAFE = "?" -- flagged as maybe empty
|
|
||||||
|
|
||||||
local STATUS_PLAYING = "playing"
|
|
||||||
local STATUS_WON = "won"
|
|
||||||
local STATUS_LOST = "lost"
|
|
||||||
|
|
||||||
local gStatus = nil
|
|
||||||
|
|
||||||
local gMines = 0
|
|
||||||
|
|
||||||
local gX = 0
|
|
||||||
local gY = 0
|
|
||||||
|
|
||||||
local gNeedRefresh = false
|
|
||||||
local gHidden = true
|
|
||||||
local gTransparent = false
|
|
||||||
|
|
||||||
local PRESETS = {
|
|
||||||
-- taken from kmines
|
|
||||||
{ name = "easy", w = 9, h = 9, mines = 10 },
|
|
||||||
{ name = "medium", w = 16, h = 16, mines = 40 },
|
|
||||||
{ name = "hard", w = 30, h = 16, mines = 99 },
|
|
||||||
}
|
|
||||||
local gCurrentPreset = 2
|
|
||||||
|
|
||||||
function init_field()
|
|
||||||
local preset = PRESETS[gCurrentPreset]
|
|
||||||
gStatus = STATUS_PLAYING
|
|
||||||
gField = {}
|
|
||||||
W = preset.w
|
|
||||||
H = preset.h
|
|
||||||
gMines = math.min(preset.mines, W * H - 1)
|
|
||||||
gX = 1
|
|
||||||
gY = 1
|
|
||||||
|
|
||||||
for x = 1, W do
|
|
||||||
gField[x] = {}
|
|
||||||
for y = 1, H do
|
|
||||||
gField[x][y] = {
|
|
||||||
is_mine = false,
|
|
||||||
area_mines = 0,
|
|
||||||
is_covered = true,
|
|
||||||
flag = FLAG_NONE,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- place mines using the dumbfuck algorithm
|
|
||||||
local place_mines = gMines
|
|
||||||
while place_mines > 0 do
|
|
||||||
local x = math.random(1, W)
|
|
||||||
local y = math.random(1, H)
|
|
||||||
if not gField[x][y].is_mine then
|
|
||||||
gField[x][y].is_mine = true
|
|
||||||
place_mines = place_mines - 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- pick a random start position (also using dumbfuck algorithm)
|
|
||||||
for i = 1, 1000000 do
|
|
||||||
local x = math.random(1, W)
|
|
||||||
local y = math.random(1, H)
|
|
||||||
if not gField[x][y].is_mine then
|
|
||||||
gX = x
|
|
||||||
gY = y
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- compute proximities after mines have been placed
|
|
||||||
for y = 1, H do
|
|
||||||
for x = 1, W do
|
|
||||||
local tile = gField[x][y]
|
|
||||||
for a_x = -1, 1 do
|
|
||||||
for a_y = -1, 1 do
|
|
||||||
local t_x = x + a_x
|
|
||||||
local t_y = y + a_y
|
|
||||||
if t_x >= 1 and t_x <= W and t_y >= 1 and t_y <= H and
|
|
||||||
gField[t_x][t_y].is_mine
|
|
||||||
then
|
|
||||||
tile.area_mines = tile.area_mines + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
uncover()
|
|
||||||
|
|
||||||
check_status()
|
|
||||||
|
|
||||||
gNeedRefresh = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function uncover_at(x, y)
|
|
||||||
if x < 1 or x > W or y < 1 or y > H then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local tile = gField[x][y]
|
|
||||||
|
|
||||||
if not tile.is_covered then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
tile.is_covered = false
|
|
||||||
|
|
||||||
if tile.is_mine then
|
|
||||||
return -- lost anyway
|
|
||||||
end
|
|
||||||
|
|
||||||
-- uncover mines as far as it goes
|
|
||||||
-- apparently, the standard thing to do is recursively uncovering all
|
|
||||||
-- tiles which have 0 neightbours - tiles with 1 or more neighbours are
|
|
||||||
-- uncovered, but not recursively
|
|
||||||
if tile.area_mines == 0 then
|
|
||||||
for a_x = -1, 1 do
|
|
||||||
for a_y = -1, 1 do
|
|
||||||
uncover_at(x + a_x, y + a_y)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
gNeedRefresh = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function check_status()
|
|
||||||
if gStatus ~= STATUS_PLAYING then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local won = true
|
|
||||||
local lost = false
|
|
||||||
|
|
||||||
for y = 1, H do
|
|
||||||
for x = 1, W do
|
|
||||||
local tile = gField[x][y]
|
|
||||||
won = won and (tile.is_mine == tile.is_covered)
|
|
||||||
lost = lost or (tile.is_mine and not tile.is_covered)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if lost then
|
|
||||||
gStatus = STATUS_LOST
|
|
||||||
gNeedRefresh = true
|
|
||||||
elseif won then
|
|
||||||
gStatus = STATUS_WON
|
|
||||||
gNeedRefresh = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function uncover()
|
|
||||||
if gStatus ~= STATUS_PLAYING and not gField[gX][gY].is_covered then
|
|
||||||
init_field()
|
|
||||||
render()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
uncover_at(gX, gY)
|
|
||||||
check_status()
|
|
||||||
render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function flag()
|
|
||||||
local tile = gField[gX][gY]
|
|
||||||
local cycle = {FLAG_NONE, FLAG_MINE, FLAG_MAYBE_MINE, FLAG_MAYBE_SAFE}
|
|
||||||
for i = 1, #cycle do
|
|
||||||
if tile.flag == cycle[i] then
|
|
||||||
tile.flag = cycle[(i - 1 + 1) % #cycle + 1]
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not tile.is_covered then
|
|
||||||
tile.flag = FLAG_NONE
|
|
||||||
end
|
|
||||||
force_render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function move(x, y)
|
|
||||||
gX = math.min(math.max(gX + x, 1), W)
|
|
||||||
gY = math.min(math.max(gY + y, 1), H)
|
|
||||||
|
|
||||||
force_render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function force_render()
|
|
||||||
gNeedRefresh = true
|
|
||||||
render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function render()
|
|
||||||
if not gNeedRefresh then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if gHidden then
|
|
||||||
mp.set_osd_ass(1280, 720, "")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local canvas_w = 1280
|
|
||||||
local canvas_h = 720
|
|
||||||
local dw, dh, da = mp.get_osd_size()
|
|
||||||
if dw ~= nil and dw > 0 and dh > 0 then
|
|
||||||
canvas_w = dw / dh * canvas_h
|
|
||||||
end
|
|
||||||
|
|
||||||
local tile_wh = 32
|
|
||||||
|
|
||||||
local o_x = canvas_w / 2 - tile_wh * W / 2
|
|
||||||
local o_y = canvas_h / 2 - tile_wh * (H + 2) / 2 + tile_wh
|
|
||||||
|
|
||||||
local ass = assdraw.ass_new()
|
|
||||||
|
|
||||||
local transp = nil
|
|
||||||
if gTransparent then
|
|
||||||
transp = "{\\1a&HA0&\\3a&HA0&}"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- some shitty background
|
|
||||||
ass:new_event()
|
|
||||||
ass:append("{\\1c&Ha3a3a3&\\1a&H30&}")
|
|
||||||
if transp then
|
|
||||||
ass:append(transp)
|
|
||||||
end
|
|
||||||
ass:pos(o_x - tile_wh, o_y - tile_wh)
|
|
||||||
ass:draw_start()
|
|
||||||
ass:rect_cw(0, 0, (W + 2) * tile_wh, (H + 2) * tile_wh)
|
|
||||||
-- grid
|
|
||||||
local function grid_line(x0, y0, x1, y1)
|
|
||||||
ass:new_event()
|
|
||||||
ass:append("{\\bord0.5}")
|
|
||||||
if transp then
|
|
||||||
ass:append(transp)
|
|
||||||
end
|
|
||||||
ass:pos(x0, y0)
|
|
||||||
ass:draw_start()
|
|
||||||
ass:coord(0, 0)
|
|
||||||
ass:line_to(x1 - x0, y1 - y0)
|
|
||||||
end
|
|
||||||
for x = 0, W do
|
|
||||||
local p_x = x * tile_wh + o_x
|
|
||||||
grid_line(p_x, o_y, p_x, o_y + tile_wh * H)
|
|
||||||
end
|
|
||||||
for y = 0, H do
|
|
||||||
local p_y = y * tile_wh + o_y
|
|
||||||
grid_line(o_x, p_y, o_x + tile_wh * W, p_y)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function draw_sym(x, y, sym, c)
|
|
||||||
ass:new_event()
|
|
||||||
ass:pos(x, y)
|
|
||||||
ass:append("{\\an5\\fs25\\bord0\\1c&H" .. c .. "&\\b1}" .. sym)
|
|
||||||
end
|
|
||||||
|
|
||||||
for x = 1, W do
|
|
||||||
for y = 1, H do
|
|
||||||
local tile = gField[x][y]
|
|
||||||
local p_x = (x - 1) * tile_wh + tile_wh / 2 + o_x
|
|
||||||
local p_y = (y - 1) * tile_wh + tile_wh / 2 + o_y
|
|
||||||
local wh = tile_wh - 4
|
|
||||||
local sym = nil
|
|
||||||
if tile.is_covered then
|
|
||||||
ass:new_event()
|
|
||||||
if transp then
|
|
||||||
ass:append(transp)
|
|
||||||
end
|
|
||||||
ass:pos(p_x, p_y)
|
|
||||||
ass:draw_start()
|
|
||||||
ass:round_rect_cw(-wh / 2, -wh / 2, wh / 2, wh / 2, 5)
|
|
||||||
ass:draw_stop()
|
|
||||||
elseif tile.is_mine then
|
|
||||||
draw_sym(p_x, p_y, "💣", "0000FF")
|
|
||||||
elseif tile.area_mines > 0 then
|
|
||||||
draw_sym(p_x, p_y, tile.area_mines, "000000")
|
|
||||||
end
|
|
||||||
if tile.flag ~= FLAG_NONE then
|
|
||||||
draw_sym(p_x, p_y, tile.flag, "FF0000")
|
|
||||||
end
|
|
||||||
if x == gX and y == gY then
|
|
||||||
local wh = tile_wh - 12
|
|
||||||
ass:new_event()
|
|
||||||
ass:append("{\\1a&HFF&}")
|
|
||||||
ass:pos(p_x, p_y)
|
|
||||||
ass:draw_start()
|
|
||||||
ass:rect_cw(-wh / 2, -wh / 2, wh / 2, wh / 2)
|
|
||||||
ass:draw_stop()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local banner = nil
|
|
||||||
if gStatus == STATUS_WON then
|
|
||||||
banner = "You may have won, but actually you just wasted time."
|
|
||||||
elseif gStatus == STATUS_LOST then
|
|
||||||
banner = "You lost (and wasted time)."
|
|
||||||
end
|
|
||||||
if banner then
|
|
||||||
ass:new_event()
|
|
||||||
ass:pos(o_x + tile_wh * W / 2, o_y - tile_wh - 10)
|
|
||||||
ass:append("{\\fs40\\b1\\an2}" .. banner)
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.set_osd_ass(canvas_w, canvas_h, ass.text)
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.observe_property("osd-width", "native", force_render)
|
|
||||||
mp.observe_property("osd-height", "native", force_render)
|
|
||||||
|
|
||||||
init_field()
|
|
||||||
force_render()
|
|
||||||
|
|
||||||
function toggle_transp()
|
|
||||||
gTransparent = not gTransparent
|
|
||||||
force_render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function cycle_preset()
|
|
||||||
gCurrentPreset = (gCurrentPreset + 1 - 1) % #PRESETS + 1
|
|
||||||
init_field()
|
|
||||||
render()
|
|
||||||
end
|
|
||||||
|
|
||||||
function toggle_show()
|
|
||||||
if gHidden then
|
|
||||||
gHidden = false
|
|
||||||
|
|
||||||
local REP = {repeatable = true}
|
|
||||||
mp.add_forced_key_binding("left", "mines-left", function() move(-1, 0) end, REP)
|
|
||||||
mp.add_forced_key_binding("right", "mines-right", function() move(1, 0) end, REP)
|
|
||||||
mp.add_forced_key_binding("up", "mines-up", function() move(0, -1) end, REP)
|
|
||||||
mp.add_forced_key_binding("down", "mines-down", function() move(0, 1) end, REP)
|
|
||||||
mp.add_forced_key_binding("space", "mines-uncover", uncover)
|
|
||||||
mp.add_forced_key_binding("b", "mines-flag", flag)
|
|
||||||
mp.add_forced_key_binding("t", "mines-transp", toggle_transp)
|
|
||||||
mp.add_forced_key_binding("w", "mines-preset", cycle_preset)
|
|
||||||
else
|
|
||||||
gHidden = true
|
|
||||||
|
|
||||||
mp.remove_key_binding("mines-left")
|
|
||||||
mp.remove_key_binding("mines-right")
|
|
||||||
mp.remove_key_binding("mines-up")
|
|
||||||
mp.remove_key_binding("mines-down")
|
|
||||||
mp.remove_key_binding("mines-uncover")
|
|
||||||
mp.remove_key_binding("mines-flag")
|
|
||||||
mp.remove_key_binding("mines-transp")
|
|
||||||
mp.remove_key_binding("mines-preset")
|
|
||||||
end
|
|
||||||
|
|
||||||
force_render()
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_forced_key_binding("ctrl+x", "mines-show", toggle_show)
|
|
|
@ -1,43 +0,0 @@
|
||||||
-- Toggle redshift when viewing videos with mpv
|
|
||||||
|
|
||||||
if os.execute("pgrep -x redshift >/dev/null") ~= 0
|
|
||||||
then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Consider that redshift is enabled when starting
|
|
||||||
rs_enabled = true
|
|
||||||
|
|
||||||
function rs_toggle()
|
|
||||||
os.execute("pkill -x -USR1 redshift")
|
|
||||||
end
|
|
||||||
|
|
||||||
function rs_disable()
|
|
||||||
if rs_enabled
|
|
||||||
then
|
|
||||||
rs_toggle()
|
|
||||||
rs_enabled = false
|
|
||||||
mp.msg.log("info", "Disabling redshift")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function rs_enable()
|
|
||||||
if not rs_enabled
|
|
||||||
then
|
|
||||||
rs_toggle()
|
|
||||||
rs_enabled = true
|
|
||||||
mp.msg.log("info", "Reenabling redshift")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function rs_handler()
|
|
||||||
if mp.get_property("video") ~= "no"
|
|
||||||
then
|
|
||||||
rs_disable()
|
|
||||||
else
|
|
||||||
rs_enable()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.register_event("file-loaded", rs_handler)
|
|
||||||
mp.register_event("shutdown", rs_enable)
|
|
|
@ -1,145 +0,0 @@
|
||||||
local msg = require "mp.msg"
|
|
||||||
local utils = require "mp.utils"
|
|
||||||
local options = require "mp.options"
|
|
||||||
|
|
||||||
local cut_pos = nil
|
|
||||||
local copy_audio = true
|
|
||||||
local o = {
|
|
||||||
target_dir = "~",
|
|
||||||
vcodec = "rawvideo",
|
|
||||||
acodec = "pcm_s16le",
|
|
||||||
prevf = "",
|
|
||||||
vf = "format=yuv444p16$hqvf,scale=in_color_matrix=$matrix,format=bgr24",
|
|
||||||
hqvf = "",
|
|
||||||
postvf = "",
|
|
||||||
opts = "",
|
|
||||||
ext = "avi",
|
|
||||||
command_template = [[
|
|
||||||
ffmpeg -v warning -y -stats
|
|
||||||
-ss $shift -i "$in" -t $duration
|
|
||||||
-c:v $vcodec -c:a $acodec $audio
|
|
||||||
-vf $prevf$vf$postvf $opts "$out.$ext"
|
|
||||||
]],
|
|
||||||
}
|
|
||||||
options.read_options(o)
|
|
||||||
|
|
||||||
function timestamp(duration)
|
|
||||||
local hours = duration / 3600
|
|
||||||
local minutes = duration % 3600 / 60
|
|
||||||
local seconds = duration % 60
|
|
||||||
return string.format("%02d:%02d:%02.03f", hours, minutes, seconds)
|
|
||||||
end
|
|
||||||
|
|
||||||
function osd(str)
|
|
||||||
return mp.osd_message(str, 3)
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_homedir()
|
|
||||||
-- It would be better to do platform detection instead of fallback but
|
|
||||||
-- it's not that easy in Lua.
|
|
||||||
return os.getenv("HOME") or os.getenv("USERPROFILE") or ""
|
|
||||||
end
|
|
||||||
|
|
||||||
function log(str)
|
|
||||||
local logpath = utils.join_path(
|
|
||||||
o.target_dir:gsub("~", get_homedir()),
|
|
||||||
"mpv_slicing.log")
|
|
||||||
f = io.open(logpath, "a")
|
|
||||||
f:write(string.format("# %s\n%s\n",
|
|
||||||
os.date("%Y-%m-%d %H:%M:%S"),
|
|
||||||
str))
|
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
|
|
||||||
function escape(str)
|
|
||||||
-- FIXME(Kagami): This escaping is NOT enough, see e.g.
|
|
||||||
-- https://stackoverflow.com/a/31413730
|
|
||||||
-- Consider using `utils.subprocess` instead.
|
|
||||||
return str:gsub("\\", "\\\\"):gsub('"', '\\"')
|
|
||||||
end
|
|
||||||
|
|
||||||
function trim(str)
|
|
||||||
return str:gsub("^%s+", ""):gsub("%s+$", "")
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_csp()
|
|
||||||
local csp = mp.get_property("colormatrix")
|
|
||||||
if csp == "bt.601" then return "bt601"
|
|
||||||
elseif csp == "bt.709" then return "bt709"
|
|
||||||
elseif csp == "smpte-240m" then return "smpte240m"
|
|
||||||
else
|
|
||||||
local err = "Unknown colorspace: " .. csp
|
|
||||||
osd(err)
|
|
||||||
error(err)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function get_outname(shift, endpos)
|
|
||||||
local name = mp.get_property("filename")
|
|
||||||
local dotidx = name:reverse():find(".", 1, true)
|
|
||||||
if dotidx then name = name:sub(1, -dotidx-1) end
|
|
||||||
name = name:gsub(" ", "_")
|
|
||||||
name = name:gsub(":", "-")
|
|
||||||
name = name .. string.format(".%s-%s", timestamp(shift), timestamp(endpos))
|
|
||||||
return name
|
|
||||||
end
|
|
||||||
|
|
||||||
function cut(shift, endpos)
|
|
||||||
local cmd = trim(o.command_template:gsub("%s+", " "))
|
|
||||||
local inpath = escape(utils.join_path(
|
|
||||||
utils.getcwd(),
|
|
||||||
mp.get_property("stream-path")))
|
|
||||||
local outpath = escape(utils.join_path(
|
|
||||||
o.target_dir:gsub("~", get_homedir()),
|
|
||||||
get_outname(shift, endpos)))
|
|
||||||
|
|
||||||
cmd = cmd:gsub("$shift", shift)
|
|
||||||
cmd = cmd:gsub("$duration", endpos - shift)
|
|
||||||
cmd = cmd:gsub("$vcodec", o.vcodec)
|
|
||||||
cmd = cmd:gsub("$acodec", o.acodec)
|
|
||||||
cmd = cmd:gsub("$audio", copy_audio and "" or "-an")
|
|
||||||
cmd = cmd:gsub("$prevf", o.prevf)
|
|
||||||
cmd = cmd:gsub("$vf", o.vf)
|
|
||||||
cmd = cmd:gsub("$hqvf", o.hqvf)
|
|
||||||
cmd = cmd:gsub("$postvf", o.postvf)
|
|
||||||
cmd = cmd:gsub("$matrix", get_csp())
|
|
||||||
cmd = cmd:gsub("$opts", o.opts)
|
|
||||||
-- Beware that input/out filename may contain replacing patterns.
|
|
||||||
cmd = cmd:gsub("$ext", o.ext)
|
|
||||||
cmd = cmd:gsub("$out", outpath)
|
|
||||||
cmd = cmd:gsub("$in", inpath, 1)
|
|
||||||
|
|
||||||
msg.info(cmd)
|
|
||||||
log(cmd)
|
|
||||||
os.execute(cmd)
|
|
||||||
end
|
|
||||||
|
|
||||||
function toggle_mark()
|
|
||||||
local pos = mp.get_property_number("time-pos")
|
|
||||||
if cut_pos then
|
|
||||||
local shift, endpos = cut_pos, pos
|
|
||||||
if shift > endpos then
|
|
||||||
shift, endpos = endpos, shift
|
|
||||||
end
|
|
||||||
if shift == endpos then
|
|
||||||
osd("Cut fragment is empty")
|
|
||||||
else
|
|
||||||
cut_pos = nil
|
|
||||||
osd(string.format("Cut fragment: %s - %s",
|
|
||||||
timestamp(shift),
|
|
||||||
timestamp(endpos)))
|
|
||||||
cut(shift, endpos)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
cut_pos = pos
|
|
||||||
osd(string.format("Marked %s as start position", timestamp(pos)))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function toggle_audio()
|
|
||||||
copy_audio = not copy_audio
|
|
||||||
osd("Audio capturing is " .. (copy_audio and "enabled" or "disabled"))
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_key_binding("c", "slicing_mark", toggle_mark)
|
|
||||||
mp.add_key_binding("a", "slicing_audio", toggle_audio)
|
|
|
@ -1,99 +0,0 @@
|
||||||
SPACE repeatable playlist-next
|
|
||||||
alt+SPACE repeatable playlist-prev
|
|
||||||
|
|
||||||
UP ignore
|
|
||||||
DOWN ignore
|
|
||||||
LEFT repeatable playlist-prev
|
|
||||||
RIGHT repeatable playlist-next
|
|
||||||
|
|
||||||
# simple reminder of default bindings
|
|
||||||
#1 add contrast -1
|
|
||||||
#2 add contrast 1
|
|
||||||
#3 add brightness -1
|
|
||||||
#4 add brightness 1
|
|
||||||
#5 add gamma -1
|
|
||||||
#6 add gamma 1
|
|
||||||
#7 add saturation -1
|
|
||||||
#8 add saturation 1
|
|
||||||
|
|
||||||
# mouse-centric bindings
|
|
||||||
MBTN_RIGHT script-binding image_viewer/drag-to-pan
|
|
||||||
MBTN_LEFT script-binding image_viewer/pan-follows-cursor
|
|
||||||
WHEEL_UP script-message cursor-centric-zoom 0.1
|
|
||||||
WHEEL_DOWN script-message cursor-centric-zoom -0.1
|
|
||||||
|
|
||||||
# panning with the keyboard:
|
|
||||||
# pan-image takes the following arguments
|
|
||||||
# pan-image AXIS AMOUNT ZOOM_INVARIANT IMAGE_CONSTRAINED
|
|
||||||
# ^ ^ ^
|
|
||||||
# x or y | |
|
|
||||||
# | |
|
|
||||||
# if yes, will pan by the same if yes, stops panning if the image
|
|
||||||
# amount regardless of zoom would go outside of the window
|
|
||||||
|
|
||||||
ctrl+down repeatable script-message pan-image y -0.1 yes yes
|
|
||||||
ctrl+up repeatable script-message pan-image y +0.1 yes yes
|
|
||||||
ctrl+right repeatable script-message pan-image x -0.1 yes yes
|
|
||||||
ctrl+left repeatable script-message pan-image x +0.1 yes yes
|
|
||||||
|
|
||||||
# now with more precision
|
|
||||||
alt+down repeatable script-message pan-image y -0.01 yes yes
|
|
||||||
alt+up repeatable script-message pan-image y +0.01 yes yes
|
|
||||||
alt+right repeatable script-message pan-image x -0.01 yes yes
|
|
||||||
alt+left repeatable script-message pan-image x +0.01 yes yes
|
|
||||||
|
|
||||||
# replace at will with h,j,k,l if you prefer vim-style bindings
|
|
||||||
|
|
||||||
# on a trackpad you may want to use these
|
|
||||||
#WHEEL_UP repeatable script-message pan-image y -0.02 yes yes
|
|
||||||
#WHEEL_DOWN repeatable script-message pan-image y +0.02 yes yes
|
|
||||||
#WHEEL_LEFT repeatable script-message pan-image x -0.02 yes yes
|
|
||||||
#WHEEL_RIGHT repeatable script-message pan-image x +0.02 yes yes
|
|
||||||
|
|
||||||
# align the border of the image to the border of the window
|
|
||||||
# align-border takes the following arguments:
|
|
||||||
# align-border ALIGN_X ALIGN_Y
|
|
||||||
# any value for ALIGN_* is accepted, -1 and 1 map to the border of the window
|
|
||||||
ctrl+shift+right script-message align-border -1 ""
|
|
||||||
ctrl+shift+left script-message align-border 1 ""
|
|
||||||
ctrl+shift+down script-message align-border "" -1
|
|
||||||
ctrl+shift+up script-message align-border "" 1
|
|
||||||
|
|
||||||
# reset the image
|
|
||||||
ctrl+0 no-osd set video-pan-x 0; no-osd set video-pan-y 0; no-osd set video-zoom 0
|
|
||||||
|
|
||||||
+ add video-zoom 0.5
|
|
||||||
- add video-zoom -0.5; script-message reset-pan-if-visible
|
|
||||||
= no-osd set video-zoom 0; script-message reset-pan-if-visible
|
|
||||||
|
|
||||||
# sxiv compatibility
|
|
||||||
w no-osd set video-unscaled yes; keypress =
|
|
||||||
e no-osd set video-unscaled no; keypress =
|
|
||||||
|
|
||||||
h no-osd vf toggle hflip; show-text "Horizontal flip"
|
|
||||||
v no-osd vf toggle vflip; show-text "Vertical flip"
|
|
||||||
|
|
||||||
r script-message rotate-video 90; show-text "Clockwise rotation"
|
|
||||||
R script-message rotate-video -90; show-text "Counter-clockwise rotation"
|
|
||||||
alt+r no-osd set video-rotate 0; show-text "Reset rotation"
|
|
||||||
|
|
||||||
d script-message ruler
|
|
||||||
|
|
||||||
# Toggling between pixel-exact reproduction and interpolation
|
|
||||||
a cycle-values scale nearest ewa_lanczossharp
|
|
||||||
|
|
||||||
# Toggle color management on or off
|
|
||||||
c cycle icc-profile-auto
|
|
||||||
|
|
||||||
# Screenshot of the window output
|
|
||||||
S screenshot window
|
|
||||||
|
|
||||||
# Toggle aspect ratio information on and off
|
|
||||||
A cycle-values video-aspect "-1" "no"
|
|
||||||
|
|
||||||
p script-message force-print-filename
|
|
||||||
|
|
||||||
# ADVANCED: you can define bindings that belong to a "section" (named "image-viewer" here) like so:
|
|
||||||
#alt+SPACE {image-viewer} repeatable playlist-prev
|
|
||||||
#SPACE {image-viewer} repeatable playlist-next
|
|
||||||
# to load them conditionally with a command. See scripts-opts/image_viewer.conf for how you can do this
|
|
|
@ -1,46 +0,0 @@
|
||||||
## IMAGE
|
|
||||||
# classic opengl-hq parameter, change at will
|
|
||||||
scale=spline36
|
|
||||||
cscale=spline36
|
|
||||||
dscale=mitchell
|
|
||||||
dither-depth=auto
|
|
||||||
correct-downscaling
|
|
||||||
sigmoid-upscaling
|
|
||||||
# debanding seems rarely useful with images
|
|
||||||
#deband
|
|
||||||
|
|
||||||
## MISC
|
|
||||||
mute=yes
|
|
||||||
# the osc is mostly useful for videos
|
|
||||||
osc=no
|
|
||||||
# don't try to autoload subtitles or audio files
|
|
||||||
sub-auto=no
|
|
||||||
audio-file-auto=no
|
|
||||||
# get rid of the useless V: 00:00:00 / 00:00:00 line
|
|
||||||
term-status-msg=
|
|
||||||
|
|
||||||
# replace mpv with mvi in the window title
|
|
||||||
title="${?media-title:${media-title}}${!media-title:No file} - mvi"
|
|
||||||
|
|
||||||
# don't slideshow by default
|
|
||||||
image-display-duration=inf
|
|
||||||
# loop files in case of webms or gifs
|
|
||||||
loop-file=inf
|
|
||||||
# and loop the whole playlist
|
|
||||||
loop-playlist=inf
|
|
||||||
|
|
||||||
# you need this if you plan to use drag-to-pan or pan-follows-cursor with MOUSE_LEFT
|
|
||||||
window-dragging=no
|
|
||||||
|
|
||||||
#according to haasn, aspect ratio info for PNG and JPG is "universally bust"
|
|
||||||
[extension.png]
|
|
||||||
video-aspect=no
|
|
||||||
|
|
||||||
[extension.jpg]
|
|
||||||
video-aspect=no
|
|
||||||
|
|
||||||
[extension.jpeg]
|
|
||||||
profile=extension.jpg
|
|
||||||
|
|
||||||
[silent]
|
|
||||||
msg-level=all=no
|
|
|
@ -1,78 +0,0 @@
|
||||||
## MISC
|
|
||||||
# size of the margins with pan-follows-cursor
|
|
||||||
pan_follows_cursor_margin=50
|
|
||||||
# whether pan-follows-cursor should pan when the entire image is visible
|
|
||||||
pan_follows_cursor_move_if_full_view=no
|
|
||||||
|
|
||||||
## STATUS LINE
|
|
||||||
# whether to show a status line
|
|
||||||
status_line_enabled=yes
|
|
||||||
# its position, possible values: (bottom|top)_(left|right)
|
|
||||||
status_line_position=bottom_left
|
|
||||||
# its font size
|
|
||||||
status_line_size=36
|
|
||||||
# the text to be expanded
|
|
||||||
# see property expansion: https://mpv.io/manual/master/#property-expansion
|
|
||||||
# \N can be used for line breaks
|
|
||||||
# you can also use ass tags, see here: http://docs.aegisub.org/3.2/ASS_Tags/
|
|
||||||
status_line=${filename} [${playlist-pos-1}/${playlist-count}]
|
|
||||||
|
|
||||||
## MINIMAP
|
|
||||||
# whether to show a minimap
|
|
||||||
minimap_enabled=yes
|
|
||||||
# the position of the center of the minimap, in percentage of the window (x, y)
|
|
||||||
minimap_center=92,92
|
|
||||||
# the scale of the minimap (i.e. the view rectangle is scale / 100 times the size of the window)
|
|
||||||
minimap_scale=12
|
|
||||||
# the cutoff size of the minimap (i.e. the image rectangle is clipped if it falls outside of the this zone)
|
|
||||||
minimap_max_size=16,16
|
|
||||||
# opacity of the "image" (from 00=opaque to FF=transparent)
|
|
||||||
minimap_image_opacity=88
|
|
||||||
# color of the "image" (#BBGGRR where each component rages from 00 to FF)
|
|
||||||
minimap_image_color=BBBBBB
|
|
||||||
# opacity of the "view"
|
|
||||||
minimap_view_opacity=BB
|
|
||||||
minimap_view_color=222222
|
|
||||||
# whether the view should be drawn above the image
|
|
||||||
minimap_view_above_image=yes
|
|
||||||
# whether to show the minimap if the current image is fully visible
|
|
||||||
minimap_hide_when_full_image_in_view=yes
|
|
||||||
|
|
||||||
## RULER
|
|
||||||
# whether to show the length of the lines between the two points
|
|
||||||
ruler_show_distance=yes
|
|
||||||
# whether to show the coordinates of the two points
|
|
||||||
ruler_show_coordinates=yes
|
|
||||||
# the coordinate space of the text shown. Can be "image", "window", "both"
|
|
||||||
ruler_coordinates_space=image
|
|
||||||
# can be "degrees", "radians", "both", or "no"
|
|
||||||
ruler_show_angles=degrees
|
|
||||||
ruler_line_width=2
|
|
||||||
ruler_dots_radius=3
|
|
||||||
ruler_font_size=36
|
|
||||||
# ranges from 00 (black) to FF (white)
|
|
||||||
ruler_line_color=33
|
|
||||||
# bindings used to set points. The binding to trigger ruler mode can also be used. Comma-separated list
|
|
||||||
ruler_confirm_bindings=MBTN_LEFT,ENTER
|
|
||||||
# bindings used to set points. The binding to trigger ruler mode can also be used. Comma-separated list
|
|
||||||
ruler_exit_bindings=ESC
|
|
||||||
# if yes, the first point will be immediately set at the cursor position when calling 'ruler'
|
|
||||||
ruler_set_first_point_on_begin=no
|
|
||||||
# if yes, the ruler overlay will be immediately cleared when setting the second point
|
|
||||||
ruler_clear_on_second_point_set=no
|
|
||||||
|
|
||||||
## HOOKS
|
|
||||||
# commands to execute when a file detected as an image (1 frame, no audio) is loaded or unloaded
|
|
||||||
# an image was loaded, and the previous file was not an image (or there was no previous file)
|
|
||||||
command_on_first_image_loaded=
|
|
||||||
# an image was loaded (regardless of what the previous file was)
|
|
||||||
command_on_image_loaded=
|
|
||||||
# a non-image was loaded, and the previous file was an image
|
|
||||||
command_on_non_image_loaded=
|
|
||||||
# the purpose of these "hooks" is to let you change bindings, profiles, reset properties...
|
|
||||||
# see https://mpv.io/manual/master/#list-of-input-commands for general command information
|
|
||||||
# note that there is no such thing as "unloading a profile", to emulate this you must create an opposite profile and load that
|
|
||||||
# example possible values:
|
|
||||||
#command_on_first_image_loaded=apply-profile image; enable-section image-viewer; script-message enable-status-line
|
|
||||||
#command_on_image_loaded=no-osd set video-pan-x 0; script-message align-border "" -1
|
|
||||||
#command_on_non_image_loaded=disable-section image-viewer; no-osd set video-pan-x 0; no-osd set video-pan-y 0; no-osd set video-zoom 0; script-message disable-status-line
|
|
|
@ -1,953 +0,0 @@
|
||||||
local opts = {
|
|
||||||
pan_follows_cursor_margin = 50,
|
|
||||||
pan_follows_cursor_move_if_full_view = false,
|
|
||||||
|
|
||||||
status_line_enabled = false,
|
|
||||||
status_line_position = "bottom_left",
|
|
||||||
status_line_size = 36,
|
|
||||||
status_line = "${filename} [${playlist-pos-1}/${playlist-count}]",
|
|
||||||
|
|
||||||
minimap_enabled = true,
|
|
||||||
minimap_center = "92,92",
|
|
||||||
minimap_scale = 12,
|
|
||||||
minimap_max_size = "16,16",
|
|
||||||
minimap_image_opacity = "88",
|
|
||||||
minimap_image_color = "BBBBBB",
|
|
||||||
minimap_view_opacity = "BB",
|
|
||||||
minimap_view_color = "222222",
|
|
||||||
minimap_view_above_image = true,
|
|
||||||
minimap_hide_when_full_image_in_view = true,
|
|
||||||
|
|
||||||
ruler_show_distance=true,
|
|
||||||
ruler_show_coordinates=true,
|
|
||||||
ruler_coordinates_space="both",
|
|
||||||
ruler_show_angles="degrees",
|
|
||||||
ruler_line_width=2,
|
|
||||||
ruler_dots_radius=3,
|
|
||||||
ruler_font_size=36,
|
|
||||||
ruler_line_color="33",
|
|
||||||
ruler_confirm_bindings="MBTN_LEFT,ENTER",
|
|
||||||
ruler_exit_bindings="ESC",
|
|
||||||
ruler_set_first_point_on_begin=false,
|
|
||||||
ruler_clear_on_second_point_set=false,
|
|
||||||
|
|
||||||
command_on_first_image_loaded="",
|
|
||||||
command_on_image_loaded="",
|
|
||||||
command_on_non_image_loaded="",
|
|
||||||
}
|
|
||||||
(require 'mp.options').read_options(opts)
|
|
||||||
function split(input)
|
|
||||||
local ret = {}
|
|
||||||
for str in string.gmatch(input, "([^,]+)") do
|
|
||||||
ret[#ret + 1] = str
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
function str_to_num(array)
|
|
||||||
local ret = {}
|
|
||||||
for _, v in ipairs(array) do
|
|
||||||
ret[#ret + 1] = tonumber(v)
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
opts.minimap_center=str_to_num(split(opts.minimap_center))
|
|
||||||
opts.minimap_max_size=str_to_num(split(opts.minimap_max_size))
|
|
||||||
opts.ruler_confirm_bindings=split(opts.ruler_confirm_bindings)
|
|
||||||
opts.ruler_exit_bindings=split(opts.ruler_exit_bindings)
|
|
||||||
|
|
||||||
function clamp(value, low, high)
|
|
||||||
if value <= low then
|
|
||||||
return low
|
|
||||||
elseif value >= high then
|
|
||||||
return high
|
|
||||||
else
|
|
||||||
return value
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local msg = require 'mp.msg'
|
|
||||||
local assdraw = require 'mp.assdraw'
|
|
||||||
|
|
||||||
local ass = { -- shared ass state
|
|
||||||
status_line = "",
|
|
||||||
minimap = "",
|
|
||||||
ruler = "",
|
|
||||||
}
|
|
||||||
|
|
||||||
local cleanup = nil -- function set up by drag-to-pan/pan-follows cursor and must be called to clean lingering state
|
|
||||||
local mouse_move_callbacks = {} -- functions that are called when mouse_move is triggered
|
|
||||||
function add_mouse_move_callback(key, func)
|
|
||||||
if #mouse_move_callbacks == 0 then
|
|
||||||
mp.add_forced_key_binding("mouse_move", "image-viewer-internal", function()
|
|
||||||
for _, func in pairs(mouse_move_callbacks) do
|
|
||||||
func()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
mouse_move_callbacks[key] = func
|
|
||||||
end
|
|
||||||
function remove_mouse_move_callback(key)
|
|
||||||
mouse_move_callbacks[key] = nil
|
|
||||||
for _,_ in pairs(mouse_move_callbacks) do
|
|
||||||
return
|
|
||||||
end
|
|
||||||
mp.remove_key_binding("image-viewer-internal")
|
|
||||||
end
|
|
||||||
|
|
||||||
video_dimensions_stale = true
|
|
||||||
function get_video_dimensions()
|
|
||||||
-- this function is very much ripped from video/out/aspect.c in mpv's source
|
|
||||||
if not video_dimensions_stale then return _video_dimensions end
|
|
||||||
local video_params = mp.get_property_native("video-out-params")
|
|
||||||
if not video_params then
|
|
||||||
_video_dimensions = nil
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
if not _timestamp then _timestamp = 0 end
|
|
||||||
_timestamp = _timestamp + 1
|
|
||||||
_video_dimensions = {
|
|
||||||
timestamp = _timestamp,
|
|
||||||
top_left = {x = 0, y = 0},
|
|
||||||
bottom_right = {x = 0, y = 0},
|
|
||||||
size = {w = 0, h = 0},
|
|
||||||
ratios = {w = 0, h = 0}, -- by how much the original video got scaled
|
|
||||||
}
|
|
||||||
local keep_aspect = mp.get_property_bool("keepaspect")
|
|
||||||
local w = video_params["w"]
|
|
||||||
local h = video_params["h"]
|
|
||||||
local dw = video_params["dw"]
|
|
||||||
local dh = video_params["dh"]
|
|
||||||
if mp.get_property_number("video-rotate") % 180 == 90 then
|
|
||||||
w, h = h,w
|
|
||||||
dw, dh = dh, dw
|
|
||||||
end
|
|
||||||
local window_w, window_h = mp.get_osd_size()
|
|
||||||
|
|
||||||
if keep_aspect then
|
|
||||||
local unscaled = mp.get_property_native("video-unscaled")
|
|
||||||
local panscan = mp.get_property_number("panscan")
|
|
||||||
|
|
||||||
local fwidth = window_w
|
|
||||||
local fheight = math.floor(window_w / dw * dh)
|
|
||||||
if fheight > window_h or fheight < h then
|
|
||||||
local tmpw = math.floor(window_h / dh * dw)
|
|
||||||
if tmpw <= window_w then
|
|
||||||
fheight = window_h
|
|
||||||
fwidth = tmpw
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local vo_panscan_area = window_h - fheight
|
|
||||||
local f_w = fwidth / fheight
|
|
||||||
local f_h = 1
|
|
||||||
if vo_panscan_area == 0 then
|
|
||||||
vo_panscan_area = window_h - fwidth
|
|
||||||
f_w = 1
|
|
||||||
f_h = fheight / fwidth
|
|
||||||
end
|
|
||||||
if unscaled or unscaled == "downscale-big" then
|
|
||||||
vo_panscan_area = 0
|
|
||||||
if unscaled or (dw <= window_w and dh <= window_h) then
|
|
||||||
fwidth = dw
|
|
||||||
fheight = dh
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local scaled_width = fwidth + math.floor(vo_panscan_area * panscan * f_w)
|
|
||||||
local scaled_height = fheight + math.floor(vo_panscan_area * panscan * f_h)
|
|
||||||
|
|
||||||
local split_scaling = function (dst_size, scaled_src_size, zoom, align, pan)
|
|
||||||
scaled_src_size = math.floor(scaled_src_size * 2 ^ zoom)
|
|
||||||
align = (align + 1) / 2
|
|
||||||
local dst_start = math.floor((dst_size - scaled_src_size) * align + pan * scaled_src_size)
|
|
||||||
if dst_start < 0 then
|
|
||||||
--account for C int cast truncating as opposed to flooring
|
|
||||||
dst_start = dst_start + 1
|
|
||||||
end
|
|
||||||
local dst_end = dst_start + scaled_src_size;
|
|
||||||
if dst_start >= dst_end then
|
|
||||||
dst_start = 0
|
|
||||||
dst_end = 1
|
|
||||||
end
|
|
||||||
return dst_start, dst_end
|
|
||||||
end
|
|
||||||
local zoom = mp.get_property_number("video-zoom")
|
|
||||||
|
|
||||||
local align_x = mp.get_property_number("video-align-x")
|
|
||||||
local pan_x = mp.get_property_number("video-pan-x")
|
|
||||||
_video_dimensions.top_left.x, _video_dimensions.bottom_right.x = split_scaling(window_w, scaled_width, zoom, align_x, pan_x)
|
|
||||||
|
|
||||||
local align_y = mp.get_property_number("video-align-y")
|
|
||||||
local pan_y = mp.get_property_number("video-pan-y")
|
|
||||||
_video_dimensions.top_left.y, _video_dimensions.bottom_right.y = split_scaling(window_h, scaled_height, zoom, align_y, pan_y)
|
|
||||||
else
|
|
||||||
_video_dimensions.top_left.x = 0
|
|
||||||
_video_dimensions.bottom_right.x = window_w
|
|
||||||
_video_dimensions.top_left.y = 0
|
|
||||||
_video_dimensions.bottom_right.y = window_h
|
|
||||||
end
|
|
||||||
_video_dimensions.size.w = _video_dimensions.bottom_right.x - _video_dimensions.top_left.x
|
|
||||||
_video_dimensions.size.h = _video_dimensions.bottom_right.y - _video_dimensions.top_left.y
|
|
||||||
_video_dimensions.ratios.w = _video_dimensions.size.w / w
|
|
||||||
_video_dimensions.ratios.h = _video_dimensions.size.h / h
|
|
||||||
video_dimensions_stale = false
|
|
||||||
return _video_dimensions
|
|
||||||
end
|
|
||||||
|
|
||||||
for _, p in ipairs({
|
|
||||||
"keepaspect",
|
|
||||||
"video-out-params",
|
|
||||||
"video-unscaled",
|
|
||||||
"panscan",
|
|
||||||
"video-zoom",
|
|
||||||
"video-align-x",
|
|
||||||
"video-pan-x",
|
|
||||||
"video-align-y",
|
|
||||||
"video-pan-y",
|
|
||||||
"osd-width",
|
|
||||||
"osd-height",
|
|
||||||
}) do
|
|
||||||
mp.observe_property(p, "native", function() video_dimensions_stale = true end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function drag_to_pan_handler(table)
|
|
||||||
if cleanup then
|
|
||||||
cleanup()
|
|
||||||
cleanup = nil
|
|
||||||
end
|
|
||||||
if table["event"] == "down" then
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local mouse_pos_origin, video_pan_origin = {}, {}
|
|
||||||
local moved = false
|
|
||||||
mouse_pos_origin.x, mouse_pos_origin.y = mp.get_mouse_pos()
|
|
||||||
video_pan_origin.x = mp.get_property("video-pan-x")
|
|
||||||
video_pan_origin.y = mp.get_property("video-pan-y")
|
|
||||||
local idle = function()
|
|
||||||
if moved then
|
|
||||||
local mX, mY = mp.get_mouse_pos()
|
|
||||||
local pX = video_pan_origin.x + (mX - mouse_pos_origin.x) / video_dimensions.size.w
|
|
||||||
local pY = video_pan_origin.y + (mY - mouse_pos_origin.y) / video_dimensions.size.h
|
|
||||||
mp.command("no-osd set video-pan-x " .. clamp(pX, -3, 3) .. "; no-osd set video-pan-y " .. clamp(pY, -3, 3))
|
|
||||||
moved = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
mp.register_idle(idle)
|
|
||||||
add_mouse_move_callback("drag-to-pan", function() moved = true end)
|
|
||||||
cleanup = function()
|
|
||||||
remove_mouse_move_callback("drag-to-pan")
|
|
||||||
mp.unregister_idle(idle)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function pan_follows_cursor_handler(table)
|
|
||||||
if cleanup then
|
|
||||||
cleanup()
|
|
||||||
cleanup = nil
|
|
||||||
end
|
|
||||||
if table["event"] == "down" then
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local window_w, window_h = mp.get_osd_size()
|
|
||||||
local moved = true
|
|
||||||
local idle = function()
|
|
||||||
if moved then
|
|
||||||
local mX, mY = mp.get_mouse_pos()
|
|
||||||
local x = math.min(1, math.max(- 2 * mX / window_w + 1, -1))
|
|
||||||
local y = math.min(1, math.max(- 2 * mY / window_h + 1, -1))
|
|
||||||
local command = ""
|
|
||||||
local margin, move_full = opts.pan_follows_cursor_margin, opts.pan_follows_cursor_move_if_full_view
|
|
||||||
if (not move_full and window_w < video_dimensions.size.w) then
|
|
||||||
command = command .. "no-osd set video-pan-x " .. clamp(x * (video_dimensions.size.w - window_w + 2 * margin) / (2 * video_dimensions.size.w), -3, 3) .. ";"
|
|
||||||
elseif mp.get_property_number("video-pan-x") ~= 0 then
|
|
||||||
command = command .. "no-osd set video-pan-x " .. "0;"
|
|
||||||
end
|
|
||||||
if (not move_full and window_h < video_dimensions.size.h) then
|
|
||||||
command = command .. "no-osd set video-pan-y " .. clamp(y * (video_dimensions.size.h - window_h + 2 * margin) / (2 * video_dimensions.size.h), -3, 3) .. ";"
|
|
||||||
elseif mp.get_property_number("video-pan-y") ~= 0 then
|
|
||||||
command = command .. "no-osd set video-pan-y " .. "0;"
|
|
||||||
end
|
|
||||||
if command ~= "" then
|
|
||||||
mp.command(command)
|
|
||||||
end
|
|
||||||
moved = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
mp.register_idle(idle)
|
|
||||||
add_mouse_move_callback("pan-follows-cursor", function() moved = true end)
|
|
||||||
cleanup = function()
|
|
||||||
remove_mouse_move_callback("pan-follows-cursor")
|
|
||||||
mp.unregister_idle(idle)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function cursor_centric_zoom_handler(amt)
|
|
||||||
local zoom_inc = tonumber(amt)
|
|
||||||
if not zoom_inc or zoom_inc == 0 then return end
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local mouse_pos_origin, video_pan_origin = {}, {}
|
|
||||||
mouse_pos_origin.x, mouse_pos_origin.y = mp.get_mouse_pos()
|
|
||||||
video_pan_origin.x = mp.get_property("video-pan-x")
|
|
||||||
video_pan_origin.y = mp.get_property("video-pan-y")
|
|
||||||
local zoom_origin = mp.get_property("video-zoom")
|
|
||||||
-- how far the cursor is form the middle of the video (in percentage)
|
|
||||||
local rx = (video_dimensions.top_left.x + video_dimensions.size.w / 2 - mouse_pos_origin.x) / (video_dimensions.size.w / 2)
|
|
||||||
local ry = (video_dimensions.top_left.y + video_dimensions.size.h / 2 - mouse_pos_origin.y) / (video_dimensions.size.h / 2)
|
|
||||||
|
|
||||||
-- the size in pixels of the (in|de)crement
|
|
||||||
local diffHeight = (2 ^ zoom_inc - 1) * video_dimensions.size.h
|
|
||||||
local diffWidth = (2 ^ zoom_inc - 1) * video_dimensions.size.w
|
|
||||||
local newPanX = (video_pan_origin.x * video_dimensions.size.w + rx * diffWidth / 2) / (video_dimensions.size.w + diffWidth)
|
|
||||||
local newPanY = (video_pan_origin.y * video_dimensions.size.h + ry * diffHeight / 2) / (video_dimensions.size.h + diffHeight)
|
|
||||||
mp.command("no-osd set video-zoom " .. zoom_origin + zoom_inc .. "; no-osd set video-pan-x " .. clamp(newPanX, -3, 3) .. "; no-osd set video-pan-y " .. clamp(newPanY, -3, 3))
|
|
||||||
end
|
|
||||||
|
|
||||||
function align_border(x, y)
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local window_w, window_h = mp.get_osd_size()
|
|
||||||
local x, y = tonumber(x), tonumber(y)
|
|
||||||
local command = ""
|
|
||||||
if x then
|
|
||||||
command = command .. "no-osd set video-pan-x " .. clamp(x * (video_dimensions.size.w - window_w) / (2 * video_dimensions.size.w), -3, 3) .. ";"
|
|
||||||
end
|
|
||||||
if y then
|
|
||||||
command = command .. "no-osd set video-pan-y " .. clamp(y * (video_dimensions.size.h - window_h) / (2 * video_dimensions.size.h), -3, 3) .. ";"
|
|
||||||
end
|
|
||||||
if command ~= "" then
|
|
||||||
mp.command(command)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function pan_image(axis, amount, zoom_invariant, image_constrained)
|
|
||||||
amount = tonumber(amount)
|
|
||||||
if not amount or amount == 0 or axis ~= "x" and axis ~= "y" then return end
|
|
||||||
if zoom_invariant == "yes" then
|
|
||||||
amount = amount / 2 ^ mp.get_property_number("video-zoom")
|
|
||||||
end
|
|
||||||
local prop = "video-pan-" .. axis
|
|
||||||
local old_pan = mp.get_property_number(prop)
|
|
||||||
if image_constrained == "yes" then
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local measure = axis == "x" and "w" or "h"
|
|
||||||
local window = {}
|
|
||||||
window.w, window.h = mp.get_osd_size()
|
|
||||||
local pixels_moved = amount * video_dimensions.size[measure]
|
|
||||||
-- should somehow refactor this
|
|
||||||
if pixels_moved > 0 then
|
|
||||||
if window[measure] > video_dimensions.size[measure] then
|
|
||||||
if video_dimensions.bottom_right[axis] >= window[measure] then return end
|
|
||||||
if video_dimensions.bottom_right[axis] + pixels_moved > window[measure] then
|
|
||||||
amount = (window[measure] - video_dimensions.bottom_right[axis]) / video_dimensions.size[measure]
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if video_dimensions.top_left[axis] >= 0 then return end
|
|
||||||
if video_dimensions.top_left[axis] + pixels_moved > 0 then
|
|
||||||
amount = (0 - video_dimensions.top_left[axis]) / video_dimensions.size[measure]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if window[measure] > video_dimensions.size[measure] then
|
|
||||||
if video_dimensions.top_left[axis] <= 0 then return end
|
|
||||||
if video_dimensions.top_left[axis] + pixels_moved < 0 then
|
|
||||||
amount = (0 - video_dimensions.top_left[axis]) / video_dimensions.size[measure]
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if video_dimensions.bottom_right[axis] <= window[measure] then return end
|
|
||||||
if video_dimensions.bottom_right[axis] + pixels_moved < window[measure] then
|
|
||||||
amount = (window[measure] - video_dimensions.bottom_right[axis]) / video_dimensions.size[measure]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
mp.set_property_number(prop, old_pan + amount)
|
|
||||||
end
|
|
||||||
|
|
||||||
function rotate_video(amt)
|
|
||||||
local rot = mp.get_property_number("video-rotate")
|
|
||||||
rot = (rot + amt) % 360
|
|
||||||
mp.set_property_number("video-rotate", rot)
|
|
||||||
end
|
|
||||||
|
|
||||||
function reset_pan_if_visible()
|
|
||||||
local video_dimensions = get_video_dimensions()
|
|
||||||
if not video_dimensions then return end
|
|
||||||
local window_w, window_h = mp.get_osd_size()
|
|
||||||
local command = ""
|
|
||||||
if (window_w >= video_dimensions.size.w) then
|
|
||||||
command = command .. "no-osd set video-pan-x 0" .. ";"
|
|
||||||
end
|
|
||||||
if (window_h >= video_dimensions.size.h) then
|
|
||||||
command = command .. "no-osd set video-pan-y 0" .. ";"
|
|
||||||
end
|
|
||||||
if command ~= "" then
|
|
||||||
mp.command(command)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function force_print_filename()
|
|
||||||
mp.set_property("msg-level", "cplayer=info")
|
|
||||||
mp.commandv("print-text", mp.get_property("path"))
|
|
||||||
mp.set_property("msg-level", "all=no")
|
|
||||||
end
|
|
||||||
|
|
||||||
function draw_ass()
|
|
||||||
local ww, wh = mp.get_osd_size()
|
|
||||||
local merge = function(a, b)
|
|
||||||
return b ~= "" and (a .. "\n" .. b) or a
|
|
||||||
end
|
|
||||||
mp.set_osd_ass(ww, wh, merge(merge(ass.status_line, ass.minimap), ass.ruler))
|
|
||||||
end
|
|
||||||
|
|
||||||
local status_line_enabled = false
|
|
||||||
local status_line_stale = true
|
|
||||||
|
|
||||||
function mark_status_line_stale()
|
|
||||||
status_line_stale = true
|
|
||||||
end
|
|
||||||
|
|
||||||
function refresh_status_line()
|
|
||||||
if not status_line_stale then return end
|
|
||||||
status_line_stale = false
|
|
||||||
local path = mp.get_property("path")
|
|
||||||
if path == nil or path == "" then
|
|
||||||
ass.status_line = ""
|
|
||||||
draw_ass()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local expanded = mp.command_native({ "expand-text", opts.status_line })
|
|
||||||
if not expanded then
|
|
||||||
msg.warn("Error expanding status line")
|
|
||||||
ass.status_line = ""
|
|
||||||
draw_ass()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local w,h = mp.get_osd_size()
|
|
||||||
local an, x, y
|
|
||||||
local margin = 10
|
|
||||||
if opts.status_line_position == "top_left" then
|
|
||||||
x = margin
|
|
||||||
y = margin
|
|
||||||
an = 7
|
|
||||||
elseif opts.status_line_position == "top_right" then
|
|
||||||
x = w-margin
|
|
||||||
y = margin
|
|
||||||
an = 9
|
|
||||||
elseif opts.status_line_position == "bottom_right" then
|
|
||||||
x = w-margin
|
|
||||||
y = h-margin
|
|
||||||
an = 3
|
|
||||||
else
|
|
||||||
x = margin
|
|
||||||
y = h-margin
|
|
||||||
an = 1
|
|
||||||
end
|
|
||||||
local a = assdraw:ass_new()
|
|
||||||
a:new_event()
|
|
||||||
a:an(an)
|
|
||||||
a:pos(x,y)
|
|
||||||
a:append("{\\fs".. opts.status_line_size.. "}{\\bord1.0}")
|
|
||||||
a:append(expanded)
|
|
||||||
ass.status_line = a.text
|
|
||||||
draw_ass()
|
|
||||||
end
|
|
||||||
|
|
||||||
function enable_status_line()
|
|
||||||
if status_line_enabled then return end
|
|
||||||
status_line_enabled = true
|
|
||||||
local start = 0
|
|
||||||
while true do
|
|
||||||
local s, e, cap = string.find(opts.status_line, "%${[?!]?([%l%d-/]*)", start)
|
|
||||||
if not s then break end
|
|
||||||
mp.observe_property(cap, nil, mark_status_line_stale)
|
|
||||||
start = e
|
|
||||||
end
|
|
||||||
mp.observe_property("path", nil, mark_status_line_stale)
|
|
||||||
mp.observe_property("osd-width", nil, mark_status_line_stale)
|
|
||||||
mp.observe_property("osd-height", nil, mark_status_line_stale)
|
|
||||||
mp.register_idle(refresh_status_line)
|
|
||||||
mark_status_line_stale()
|
|
||||||
end
|
|
||||||
|
|
||||||
function disable_status_line()
|
|
||||||
if not status_line_enabled then return end
|
|
||||||
status_line_enabled = false
|
|
||||||
mp.unobserve_property(mark_status_line_stale)
|
|
||||||
mp.unregister_idle(refresh_status_line)
|
|
||||||
ass.status_line = ""
|
|
||||||
draw_ass()
|
|
||||||
end
|
|
||||||
|
|
||||||
if opts.status_line_enabled then
|
|
||||||
enable_status_line()
|
|
||||||
end
|
|
||||||
|
|
||||||
if opts.command_on_image_loaded ~= "" or opts.command_on_non_image_loaded ~= "" then
|
|
||||||
local was_image = false
|
|
||||||
local frame_count = nil
|
|
||||||
local audio_tracks = nil
|
|
||||||
local out_params_ready = nil
|
|
||||||
local path = nil
|
|
||||||
|
|
||||||
function state_changed()
|
|
||||||
function set_image(is_image)
|
|
||||||
if is_image and not was_image and opts.command_on_first_image_loaded ~= "" then
|
|
||||||
mp.command(opts.command_on_first_image_loaded)
|
|
||||||
end
|
|
||||||
if is_image and opts.command_on_image_loaded ~= "" then
|
|
||||||
mp.command(opts.command_on_image_loaded)
|
|
||||||
end
|
|
||||||
if not is_image and was_image and opts.command_on_non_image_loaded ~= "" then
|
|
||||||
mp.command(opts.command_on_non_image_loaded)
|
|
||||||
end
|
|
||||||
was_image = is_image
|
|
||||||
end
|
|
||||||
-- only do things when state is consistent
|
|
||||||
if path ~= nil and audio_tracks ~= nil then
|
|
||||||
if frame_count == nil and audio_tracks > 0 then
|
|
||||||
set_image(false)
|
|
||||||
elseif out_params_ready and frame_count ~= nil then
|
|
||||||
-- png have 0 frames, jpg 1 ¯\_(ツ)_/¯
|
|
||||||
set_image((frame_count == 0 or frame_count == 1) and audio_tracks == 0)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.observe_property("video-out-params/par", "number", function(_, val)
|
|
||||||
out_params_ready = (val ~= nil and val > 0)
|
|
||||||
state_changed()
|
|
||||||
end)
|
|
||||||
mp.observe_property("estimated-frame-count", "number", function(_, val)
|
|
||||||
frame_count = val
|
|
||||||
state_changed()
|
|
||||||
end)
|
|
||||||
mp.observe_property("path", "string", function(_, val)
|
|
||||||
if not val or val == "" then
|
|
||||||
path = nil
|
|
||||||
else
|
|
||||||
path = val
|
|
||||||
end
|
|
||||||
state_changed()
|
|
||||||
end)
|
|
||||||
mp.register_event("tracks-changed", function()
|
|
||||||
audio_tracks = 0
|
|
||||||
local tracks = 0
|
|
||||||
for _, track in ipairs(mp.get_property_native("track-list")) do
|
|
||||||
tracks = tracks + 1
|
|
||||||
if track.type == "audio" then
|
|
||||||
audio_tracks = audio_tracks + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if tracks == 0 then
|
|
||||||
audio_tracks = nil
|
|
||||||
end
|
|
||||||
state_changed()
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function refresh_minimap()
|
|
||||||
local dim = get_video_dimensions()
|
|
||||||
if not dim then
|
|
||||||
ass.minimap = ""
|
|
||||||
draw_ass()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if _minimap_old_timestamp and dim.timestamp == _minimap_old_timestamp then return end
|
|
||||||
_minimap_old_timestamp = dim.timestamp
|
|
||||||
local ww, wh = mp.get_osd_size()
|
|
||||||
if opts.minimap_hide_when_full_image_in_view then
|
|
||||||
if dim.top_left.x >= 0 and
|
|
||||||
dim.top_left.y >= 0 and
|
|
||||||
dim.bottom_right.x <= ww and
|
|
||||||
dim.bottom_right.y <= wh
|
|
||||||
then
|
|
||||||
ass.minimap = ""
|
|
||||||
draw_ass()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local center = {
|
|
||||||
x=opts.minimap_center[1]/100*ww,
|
|
||||||
y=opts.minimap_center[2]/100*wh
|
|
||||||
}
|
|
||||||
local cutoff = {
|
|
||||||
x=opts.minimap_max_size[1]/100*ww/2,
|
|
||||||
y=opts.minimap_max_size[2]/100*wh/2
|
|
||||||
}
|
|
||||||
local a = assdraw.ass_new()
|
|
||||||
local draw = function(x, y, w, h, opacity, color)
|
|
||||||
a:new_event()
|
|
||||||
a:pos(center.x, center.y)
|
|
||||||
a:append("{\\bord0}")
|
|
||||||
a:append("{\\shad0}")
|
|
||||||
a:append("{\\c&" .. color .. "&}")
|
|
||||||
a:append("{\\2a&HFF}")
|
|
||||||
a:append("{\\3a&HFF}")
|
|
||||||
a:append("{\\4a&HFF}")
|
|
||||||
a:append("{\\1a&H" .. opacity .. "}")
|
|
||||||
w=w/2
|
|
||||||
h=h/2
|
|
||||||
a:draw_start()
|
|
||||||
local rounded = {true,true,true,true} -- tl, tr, br, bl
|
|
||||||
local x0,y0,x1,y1 = x-w, y-h, x+w, y+h
|
|
||||||
if x0 < -cutoff.x then
|
|
||||||
x0 = -cutoff.x
|
|
||||||
rounded[4] = false
|
|
||||||
rounded[1] = false
|
|
||||||
end
|
|
||||||
if y0 < -cutoff.y then
|
|
||||||
y0 = -cutoff.y
|
|
||||||
rounded[1] = false
|
|
||||||
rounded[2] = false
|
|
||||||
end
|
|
||||||
if x1 > cutoff.x then
|
|
||||||
x1 = cutoff.x
|
|
||||||
rounded[2] = false
|
|
||||||
rounded[3] = false
|
|
||||||
end
|
|
||||||
if y1 > cutoff.y then
|
|
||||||
y1 = cutoff.y
|
|
||||||
rounded[3] = false
|
|
||||||
rounded[4] = false
|
|
||||||
end
|
|
||||||
|
|
||||||
local r = 3
|
|
||||||
local c = 0.551915024494 * r
|
|
||||||
if rounded[0] then
|
|
||||||
a:move_to(x0 + r, y0)
|
|
||||||
else
|
|
||||||
a:move_to(x0,y0)
|
|
||||||
end
|
|
||||||
if rounded[1] then
|
|
||||||
a:line_to(x1 - r, y0)
|
|
||||||
a:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r)
|
|
||||||
else
|
|
||||||
a:line_to(x1, y0)
|
|
||||||
end
|
|
||||||
if rounded[2] then
|
|
||||||
a:line_to(x1, y1 - r)
|
|
||||||
a:bezier_curve(x1, y1 - r + c, x1 - r + c, y1, x1 - r, y1)
|
|
||||||
else
|
|
||||||
a:line_to(x1, y1)
|
|
||||||
end
|
|
||||||
if rounded[3] then
|
|
||||||
a:line_to(x0 + r, y1)
|
|
||||||
a:bezier_curve(x0 + r - c, y1, x0, y1 - r + c, x0, y1 - r)
|
|
||||||
else
|
|
||||||
a:line_to(x0, y1)
|
|
||||||
end
|
|
||||||
if rounded[4] then
|
|
||||||
a:line_to(x0, y0 + r)
|
|
||||||
a:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0)
|
|
||||||
else
|
|
||||||
a:line_to(x0, y0)
|
|
||||||
end
|
|
||||||
a:draw_stop()
|
|
||||||
end
|
|
||||||
local image = function()
|
|
||||||
draw((dim.top_left.x + dim.size.w/2 - ww/2) / opts.minimap_scale,
|
|
||||||
(dim.top_left.y + dim.size.h/2 - wh/2) / opts.minimap_scale,
|
|
||||||
dim.size.w / opts.minimap_scale,
|
|
||||||
dim.size.h / opts.minimap_scale,
|
|
||||||
opts.minimap_image_opacity,
|
|
||||||
opts.minimap_image_color)
|
|
||||||
end
|
|
||||||
local view = function()
|
|
||||||
draw(0,
|
|
||||||
0,
|
|
||||||
ww / opts.minimap_scale,
|
|
||||||
wh / opts.minimap_scale,
|
|
||||||
opts.minimap_view_opacity,
|
|
||||||
opts.minimap_view_color)
|
|
||||||
end
|
|
||||||
if opts.minimap_view_above_image then
|
|
||||||
image()
|
|
||||||
view()
|
|
||||||
else
|
|
||||||
view()
|
|
||||||
image()
|
|
||||||
end
|
|
||||||
ass.minimap = a.text
|
|
||||||
draw_ass()
|
|
||||||
end
|
|
||||||
|
|
||||||
local minimap_enabled = false
|
|
||||||
|
|
||||||
function enable_minimap()
|
|
||||||
if minimap_enabled then return end
|
|
||||||
minimap_enabled = true
|
|
||||||
mp.register_idle(refresh_minimap)
|
|
||||||
end
|
|
||||||
|
|
||||||
function disable_minimap()
|
|
||||||
if not minimap_enabled then return end
|
|
||||||
minimap_enabled = false
|
|
||||||
ass.minimap = a.text
|
|
||||||
draw_ass()
|
|
||||||
mp.unregister_idle(refresh_minimap)
|
|
||||||
end
|
|
||||||
|
|
||||||
if opts.minimap_enabled then
|
|
||||||
enable_minimap()
|
|
||||||
end
|
|
||||||
|
|
||||||
local ruler_state = 0 -- {0,1,2,3} = {inactive,setting first point,setting second point,done}
|
|
||||||
local ruler_first_point = nil -- in video space coordinates
|
|
||||||
local ruler_second_point = nil -- in video space coordinates
|
|
||||||
|
|
||||||
function cursor_video_space()
|
|
||||||
local dim = get_video_dimensions()
|
|
||||||
if not dim then return nil end
|
|
||||||
local mx, my = mp.get_mouse_pos()
|
|
||||||
local ret = {}
|
|
||||||
ret.x = (mx - dim.top_left.x) / dim.ratios.w
|
|
||||||
ret.y = (my - dim.top_left.y) / dim.ratios.h
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
function video_space_to_screen(point)
|
|
||||||
local dim = get_video_dimensions()
|
|
||||||
if not dim then return nil end
|
|
||||||
local ret = {}
|
|
||||||
ret.x = point.x * dim.ratios.w + dim.top_left.x
|
|
||||||
ret.y = point.y * dim.ratios.h + dim.top_left.y
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
function refresh_ruler()
|
|
||||||
local dim = get_video_dimensions()
|
|
||||||
if not dim then
|
|
||||||
ass.ruler = ""
|
|
||||||
draw_ass()
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local line_start = {}
|
|
||||||
local line_end = {}
|
|
||||||
if ruler_second_point then
|
|
||||||
line_start.image = ruler_first_point
|
|
||||||
line_start.screen = video_space_to_screen(ruler_first_point)
|
|
||||||
line_end.image = ruler_second_point
|
|
||||||
line_end.screen = video_space_to_screen(ruler_second_point)
|
|
||||||
elseif ruler_first_point then
|
|
||||||
line_start.image = ruler_first_point
|
|
||||||
line_start.screen = video_space_to_screen(ruler_first_point)
|
|
||||||
line_end.image = cursor_video_space()
|
|
||||||
line_end.screen = {}
|
|
||||||
line_end.screen.x, line_end.screen.y = mp.get_mouse_pos()
|
|
||||||
else
|
|
||||||
local mx, my = mp.get_mouse_pos()
|
|
||||||
line_start.image = cursor_video_space()
|
|
||||||
line_start.screen = {}
|
|
||||||
line_start.screen.x, line_start.screen.y = mp.get_mouse_pos()
|
|
||||||
line_end = line_start
|
|
||||||
end
|
|
||||||
local distinct = (math.abs(line_start.screen.x - line_end.screen.x) >= 1
|
|
||||||
or math.abs(line_start.screen.y - line_end.screen.y) >= 1)
|
|
||||||
|
|
||||||
local a = assdraw:ass_new()
|
|
||||||
local draw_setup = function(bord)
|
|
||||||
a:new_event()
|
|
||||||
a:pos(0,0)
|
|
||||||
a:append("{\\bord" .. bord .. "}")
|
|
||||||
a:append("{\\shad0}")
|
|
||||||
local r = opts.ruler_line_color
|
|
||||||
a:append("{\\3c&H".. r .. r .. r .. "&}")
|
|
||||||
a:append("{\\1a&HFF}")
|
|
||||||
a:append("{\\2a&HFF}")
|
|
||||||
a:append("{\\3a&H00}")
|
|
||||||
a:append("{\\4a&HFF}")
|
|
||||||
a:draw_start()
|
|
||||||
end
|
|
||||||
local dot = function(pos, size)
|
|
||||||
draw_setup(size)
|
|
||||||
a:move_to(pos.x, pos.y-0.5)
|
|
||||||
a:line_to(pos.x, pos.y+0.5)
|
|
||||||
end
|
|
||||||
local line = function(from, to, size)
|
|
||||||
draw_setup(size)
|
|
||||||
a:move_to(from.x, from.y)
|
|
||||||
a:line_to(to.x, to.y)
|
|
||||||
end
|
|
||||||
if distinct then
|
|
||||||
dot(line_start.screen, opts.ruler_dots_radius)
|
|
||||||
line(line_start.screen, line_end.screen, opts.ruler_line_width)
|
|
||||||
dot(line_end.screen, opts.ruler_dots_radius)
|
|
||||||
else
|
|
||||||
dot(line_start.screen, opts.ruler_dots_radius)
|
|
||||||
end
|
|
||||||
|
|
||||||
local line_info = function()
|
|
||||||
if not opts.ruler_show_distance then return end
|
|
||||||
a:new_event()
|
|
||||||
a:append("{\\fs36}{\\bord1}")
|
|
||||||
a:pos((line_start.screen.x + line_end.screen.x) / 2, (line_start.screen.y + line_end.screen.y) / 2)
|
|
||||||
local an = 1
|
|
||||||
if line_start.image.x < line_end.image.x then an = an + 2 end
|
|
||||||
if line_start.image.y < line_end.image.y then an = an + 6 end
|
|
||||||
a:an(an)
|
|
||||||
local image = math.sqrt(math.pow(line_start.image.x - line_end.image.x, 2) + math.pow(line_start.image.y - line_end.image.y, 2))
|
|
||||||
local screen = math.sqrt(math.pow(line_start.screen.x - line_end.screen.x, 2) + math.pow(line_start.screen.y - line_end.screen.y, 2))
|
|
||||||
if opts.ruler_coordinates_space == "both" then
|
|
||||||
a:append(string.format("image: %.1f\\Nscreen: %.1f", image, screen))
|
|
||||||
elseif opts.ruler_coordinates_space == "image" then
|
|
||||||
a:append(string.format("%.1f", image))
|
|
||||||
elseif opts.ruler_coordinates_space == "window" then
|
|
||||||
a:append(string.format("%.1f", screen))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local dot_info = function(pos, opposite)
|
|
||||||
if not opts.ruler_show_coordinates then return end
|
|
||||||
a:new_event()
|
|
||||||
a:append("{\\fs" .. opts.ruler_font_size .."}{\\bord1}")
|
|
||||||
a:pos(pos.screen.x, pos.screen.y)
|
|
||||||
local an
|
|
||||||
if distinct then
|
|
||||||
an = 1
|
|
||||||
if line_start.image.x > line_end.image.x then an = an + 2 end
|
|
||||||
if line_start.image.y < line_end.image.y then an = an + 6 end
|
|
||||||
else
|
|
||||||
an = 7
|
|
||||||
end
|
|
||||||
if opposite then
|
|
||||||
an = 9 + 1 - an
|
|
||||||
end
|
|
||||||
a:an(an)
|
|
||||||
if opts.ruler_coordinates_space == "both" then
|
|
||||||
a:append(string.format("image: %.1f, %.1f\\Nscreen: %i, %i",
|
|
||||||
pos.image.x, pos.image.y, pos.screen.x, pos.screen.y))
|
|
||||||
elseif opts.ruler_coordinates_space == "image" then
|
|
||||||
a:append(string.format("%.1f, %.1f", pos.image.x, pos.image.y))
|
|
||||||
elseif opts.ruler_coordinates_space == "window" then
|
|
||||||
a:append(string.format("%i, %i", pos.screen.x, pos.screen.y))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
dot_info(line_start, true)
|
|
||||||
if distinct then
|
|
||||||
line_info()
|
|
||||||
dot_info(line_end, false)
|
|
||||||
end
|
|
||||||
if distinct and opts.ruler_show_angles ~= "no" then
|
|
||||||
local dist = 50
|
|
||||||
local pos_from_angle = function(mult, angle)
|
|
||||||
return {
|
|
||||||
x = line_start.screen.x + mult * dist * math.cos(angle),
|
|
||||||
y = line_start.screen.y + mult * dist * math.sin(angle)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
local extended = {x=line_start.screen.x, y=line_start.screen.y}
|
|
||||||
if line_end.screen.x > line_start.screen.x then
|
|
||||||
extended.x = extended.x + dist
|
|
||||||
else
|
|
||||||
extended.x = extended.x - dist
|
|
||||||
end
|
|
||||||
line(line_start.screen, extended, math.max(0, opts.ruler_line_width-0.5))
|
|
||||||
local angle = math.atan(math.abs(line_start.image.y - line_end.image.y) / math.abs(line_start.image.x - line_end.image.x))
|
|
||||||
local fix_angle
|
|
||||||
local an
|
|
||||||
if line_end.image.y < line_start.image.y and line_end.image.x > line_start.image.x then
|
|
||||||
-- upper-right
|
|
||||||
an = 4
|
|
||||||
fix_angle = function(angle) return - angle end
|
|
||||||
elseif line_end.image.y < line_start.image.y then
|
|
||||||
-- upper-left
|
|
||||||
an = 6
|
|
||||||
fix_angle = function(angle) return math.pi + angle end
|
|
||||||
elseif line_end.image.x < line_start.image.x then
|
|
||||||
-- bottom-left
|
|
||||||
an = 6
|
|
||||||
fix_angle = function(angle) return math.pi - angle end
|
|
||||||
else
|
|
||||||
-- bottom-right
|
|
||||||
an = 4
|
|
||||||
fix_angle = function(angle) return angle end
|
|
||||||
end
|
|
||||||
-- should implement this https://math.stackexchange.com/questions/873224/calculate-control-points-of-cubic-bezier-curve-approximating-a-part-of-a-circle
|
|
||||||
local cp1 = pos_from_angle(1, fix_angle(angle*1/4))
|
|
||||||
local cp2 = pos_from_angle(1, fix_angle(angle*3/4))
|
|
||||||
local p2 = pos_from_angle(1, fix_angle(angle))
|
|
||||||
a:bezier_curve(cp1.x, cp1.y, cp2.x, cp2.y, p2.x, p2.y)
|
|
||||||
|
|
||||||
a:new_event()
|
|
||||||
a:append("{\\fs" .. opts.ruler_font_size .."}{\\bord1}")
|
|
||||||
local text_pos = pos_from_angle(1.1, fix_angle(angle*2/3)) -- you'd think /2 would make more sense, but *2/3 looks better
|
|
||||||
a:pos(text_pos.x, text_pos.y)
|
|
||||||
a:an(an)
|
|
||||||
if opts.ruler_show_angles == "both" then
|
|
||||||
a:append(string.format("%.2f\\N%.1f°", angle, angle / math.pi * 180))
|
|
||||||
elseif opts.ruler_show_angles == "degrees" then
|
|
||||||
a:append(string.format("%.1f°", angle / math.pi * 180))
|
|
||||||
elseif opts.ruler_show_angles == "radians" then
|
|
||||||
a:append(string.format("%.2f", angle))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
ass.ruler = a.text
|
|
||||||
draw_ass()
|
|
||||||
end
|
|
||||||
|
|
||||||
function ruler_next()
|
|
||||||
if ruler_state == 0 then
|
|
||||||
mp.register_idle(refresh_ruler)
|
|
||||||
add_mouse_move_callback("ruler", function() end) -- only used to get an idle event on mouse move
|
|
||||||
for _,key in ipairs(opts.ruler_confirm_bindings) do
|
|
||||||
mp.add_forced_key_binding(key, "ruler-next-" .. key, ruler_next)
|
|
||||||
end
|
|
||||||
for _,key in ipairs(opts.ruler_exit_bindings) do
|
|
||||||
mp.add_forced_key_binding(key, "ruler-stop-" .. key, ruler_stop)
|
|
||||||
end
|
|
||||||
ruler_state = 1
|
|
||||||
if opts.ruler_set_first_point_on_begin then
|
|
||||||
ruler_next()
|
|
||||||
end
|
|
||||||
elseif ruler_state == 1 then
|
|
||||||
ruler_first_point = cursor_video_space()
|
|
||||||
ruler_state = 2
|
|
||||||
elseif ruler_state == 2 then
|
|
||||||
ruler_state = 3
|
|
||||||
ruler_second_point = cursor_video_space()
|
|
||||||
if opts.ruler_clear_on_second_point_set then
|
|
||||||
ruler_next()
|
|
||||||
end
|
|
||||||
else
|
|
||||||
ruler_stop()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ruler_stop()
|
|
||||||
if ruler_state == 0 then return end
|
|
||||||
mp.unregister_idle(refresh_ruler)
|
|
||||||
for _,key in ipairs(opts.ruler_confirm_bindings) do
|
|
||||||
mp.remove_key_binding("ruler-next-" .. key)
|
|
||||||
end
|
|
||||||
for _,key in ipairs(opts.ruler_exit_bindings) do
|
|
||||||
mp.remove_key_binding("ruler-stop-" .. key)
|
|
||||||
end
|
|
||||||
remove_mouse_move_callback("ruler")
|
|
||||||
ruler_state = 0
|
|
||||||
ruler_first_point = nil
|
|
||||||
ruler_second_point = nil
|
|
||||||
ass.ruler = ""
|
|
||||||
draw_ass()
|
|
||||||
end
|
|
||||||
|
|
||||||
mp.add_key_binding(nil, "drag-to-pan", drag_to_pan_handler, {complex = true})
|
|
||||||
mp.add_key_binding(nil, "pan-follows-cursor", pan_follows_cursor_handler, {complex = true})
|
|
||||||
mp.add_key_binding(nil, "cursor-centric-zoom", cursor_centric_zoom_handler)
|
|
||||||
mp.add_key_binding(nil, "align-border", align_border)
|
|
||||||
mp.add_key_binding(nil, "pan-image", pan_image)
|
|
||||||
mp.add_key_binding(nil, "rotate-video", rotate_video)
|
|
||||||
mp.add_key_binding(nil, "reset-pan-if-visible", reset_pan_if_visible)
|
|
||||||
mp.add_key_binding(nil, "force-print-filename", force_print_filename)
|
|
||||||
|
|
||||||
mp.add_key_binding(nil, "ruler", ruler_next)
|
|
||||||
|
|
||||||
mp.add_key_binding(nil, "enable-status-line", enable_status_line)
|
|
||||||
mp.add_key_binding(nil, "disable-status-line", disable_status_line)
|
|
||||||
mp.add_key_binding(nil, "toggle-status-line", function() if status_line_enabled then disable_status_line() else enable_status_line() end end)
|
|
||||||
|
|
||||||
mp.add_key_binding(nil, "enable-minimap", enable_minimap)
|
|
||||||
mp.add_key_binding(nil, "disable-minimap", disable_minimap)
|
|
||||||
mp.add_key_binding(nil, "toggle-minimap", function() if minimap_enabled then disable_minimap() else enable_minimap() end end)
|
|
|
@ -1,551 +0,0 @@
|
||||||
##############################################################
|
|
||||||
## This is the example bindings file. Copy it to ##
|
|
||||||
## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ##
|
|
||||||
## and set up your preferences ##
|
|
||||||
##############################################################
|
|
||||||
##
|
|
||||||
##### General rules #####
|
|
||||||
##
|
|
||||||
## 1) Because each action has runtime checks whether it's
|
|
||||||
## ok to run it, a few actions can be bound to one key.
|
|
||||||
## Actions will be bound in order given in configuration
|
|
||||||
## file. When a key is pressed, first action in order
|
|
||||||
## will test itself whether it's possible to run it. If
|
|
||||||
## test succeeds, action is executed and other actions
|
|
||||||
## bound to this key are ignored. If it doesn't, next
|
|
||||||
## action in order tests itself etc.
|
|
||||||
##
|
|
||||||
## 2) It's possible to bind more that one action at once
|
|
||||||
## to a key. It can be done using the following syntax:
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## action1
|
|
||||||
## action2
|
|
||||||
## ...
|
|
||||||
##
|
|
||||||
## This creates a chain of actions. When such chain is
|
|
||||||
## executed, each action in chain is run until the end of
|
|
||||||
## chain is reached or one of its actions fails to execute
|
|
||||||
## due to its requirements not being met. If multiple actions
|
|
||||||
## and/or chains are bound to the same key, they will be
|
|
||||||
## consecutively run until one of them gets fully executed.
|
|
||||||
##
|
|
||||||
## 3) When ncmpcpp starts, bindings configuration file is
|
|
||||||
## parsed and then ncmpcpp provides "missing pieces"
|
|
||||||
## of default keybindings. If you want to disable some
|
|
||||||
## bindings, there is a special action called 'dummy'
|
|
||||||
## for that purpose. Eg. if you want to disable ability
|
|
||||||
## to crop playlists, you need to put the following
|
|
||||||
## into configuration file:
|
|
||||||
##
|
|
||||||
## def_key "C"
|
|
||||||
## dummy
|
|
||||||
##
|
|
||||||
## After that ncmpcpp will not bind any default action
|
|
||||||
## to this key.
|
|
||||||
##
|
|
||||||
## 4) To let you write simple macros, the following special
|
|
||||||
## actions are provided:
|
|
||||||
##
|
|
||||||
## - push_character "character" - pushes given special
|
|
||||||
## character into input queue, so it will be immediately
|
|
||||||
## picked by ncmpcpp upon next call to readKey function.
|
|
||||||
## Accepted values: mouse, up, down, page_up, page_down,
|
|
||||||
## home, end, space, enter, insert, delete, left, right,
|
|
||||||
## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\,
|
|
||||||
## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace.
|
|
||||||
## In addition, most of these names can be prefixed with
|
|
||||||
## alt-/ctrl-/shift- to be recognized with the appropriate
|
|
||||||
## modifier key(s).
|
|
||||||
##
|
|
||||||
## - push_characters "string" - pushes given string into
|
|
||||||
## input queue.
|
|
||||||
##
|
|
||||||
## - require_runnable "action" - checks whether given action
|
|
||||||
## is runnable and fails if it isn't. This is especially
|
|
||||||
## useful when mixed with previous two functions. Consider
|
|
||||||
## the following macro definition:
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## push_characters "custom_filter"
|
|
||||||
## apply_filter
|
|
||||||
##
|
|
||||||
## If apply_filter can't be currently run, we end up with
|
|
||||||
## sequence of characters in input queue which will be
|
|
||||||
## treated just as we typed them. This may lead to unexpected
|
|
||||||
## results (in this case 'c' will most likely clear current
|
|
||||||
## playlist, 'u' will trigger database update, 's' will stop
|
|
||||||
## playback etc.). To prevent such thing from happening, we
|
|
||||||
## need to change above definition to this one:
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## require_runnable "apply_filter"
|
|
||||||
## push_characters "custom_filter"
|
|
||||||
## apply_filter
|
|
||||||
##
|
|
||||||
## Here, first we test whether apply_filter can be actually run
|
|
||||||
## before we stuff characters into input queue, so if condition
|
|
||||||
## is not met, whole chain is aborted and we're fine.
|
|
||||||
##
|
|
||||||
## - require_screen "screen" - checks whether given screen is
|
|
||||||
## currently active. accepted values: browser, clock, help,
|
|
||||||
## media_library, outputs, playlist, playlist_editor,
|
|
||||||
## search_engine, tag_editor, visualizer, last_fm, lyrics,
|
|
||||||
## selected_items_adder, server_info, song_info,
|
|
||||||
## sort_playlist_dialog, tiny_tag_editor.
|
|
||||||
##
|
|
||||||
## - run_external_command "command" - runs given command using
|
|
||||||
## system() function.
|
|
||||||
##
|
|
||||||
## 5) In addition to binding to a key, you can also bind actions
|
|
||||||
## or chains of actions to a command. If it comes to commands,
|
|
||||||
## syntax is very similar to defining keys. Here goes example
|
|
||||||
## definition of a command:
|
|
||||||
##
|
|
||||||
## def_command "quit" [deferred]
|
|
||||||
## stop
|
|
||||||
## quit
|
|
||||||
##
|
|
||||||
## If you execute the above command (which can be done by
|
|
||||||
## invoking action execute_command, typing 'quit' and pressing
|
|
||||||
## enter), ncmpcpp will stop the player and then quit. Note the
|
|
||||||
## presence of word 'deferred' enclosed in square brackets. It
|
|
||||||
## tells ncmpcpp to wait for confirmation (ie. pressing enter)
|
|
||||||
## after you typed quit. Instead of 'deferred', 'immediate'
|
|
||||||
## could be used. Then ncmpcpp will not wait for confirmation
|
|
||||||
## (enter) and will execute the command the moment it sees it.
|
|
||||||
##
|
|
||||||
## Note: while command chains are executed, internal environment
|
|
||||||
## update (which includes current window refresh and mpd status
|
|
||||||
## update) is not performed for performance reasons. However, it
|
|
||||||
## may be desirable to do so in some situration. Therefore it's
|
|
||||||
## possible to invoke by hand by performing 'update enviroment'
|
|
||||||
## action.
|
|
||||||
##
|
|
||||||
## Note: There is a difference between:
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## action1
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## action2
|
|
||||||
##
|
|
||||||
## and
|
|
||||||
##
|
|
||||||
## def_key "key"
|
|
||||||
## action1
|
|
||||||
## action2
|
|
||||||
##
|
|
||||||
## First one binds two single actions to the same key whilst
|
|
||||||
## second one defines a chain of actions. The behavior of
|
|
||||||
## these two is different and is described in (1) and (2).
|
|
||||||
##
|
|
||||||
## Note: Function def_key accepts non-ascii characters.
|
|
||||||
##
|
|
||||||
##### List of unbound actions #####
|
|
||||||
##
|
|
||||||
## The following actions are not bound to any key/command:
|
|
||||||
##
|
|
||||||
## - set_volume
|
|
||||||
##
|
|
||||||
#
|
|
||||||
#def_key "mouse"
|
|
||||||
# mouse_event
|
|
||||||
#
|
|
||||||
#def_key "h"
|
|
||||||
# previous_column
|
|
||||||
def_key "j"
|
|
||||||
scroll_down
|
|
||||||
def_key "k"
|
|
||||||
scroll_up
|
|
||||||
#def_key "l"
|
|
||||||
# next_column
|
|
||||||
#def_key "up"
|
|
||||||
# scroll_up
|
|
||||||
#
|
|
||||||
#def_key "shift-up"
|
|
||||||
# select_item
|
|
||||||
# scroll_up
|
|
||||||
#
|
|
||||||
#def_key "down"
|
|
||||||
# scroll_down
|
|
||||||
#
|
|
||||||
#def_key "shift-down"
|
|
||||||
# select_item
|
|
||||||
# scroll_down
|
|
||||||
#
|
|
||||||
#def_key "["
|
|
||||||
# scroll_up_album
|
|
||||||
#
|
|
||||||
#def_key "]"
|
|
||||||
# scroll_down_album
|
|
||||||
#
|
|
||||||
#def_key "{"
|
|
||||||
# scroll_up_artist
|
|
||||||
#
|
|
||||||
#def_key "}"
|
|
||||||
# scroll_down_artist
|
|
||||||
#
|
|
||||||
#def_key "page_up"
|
|
||||||
# page_up
|
|
||||||
#
|
|
||||||
#def_key "page_down"
|
|
||||||
# page_down
|
|
||||||
#
|
|
||||||
#def_key "home"
|
|
||||||
# move_home
|
|
||||||
#
|
|
||||||
#def_key "end"
|
|
||||||
# move_end
|
|
||||||
#
|
|
||||||
#def_key "insert"
|
|
||||||
# select_item
|
|
||||||
#
|
|
||||||
#def_key "enter"
|
|
||||||
# enter_directory
|
|
||||||
#
|
|
||||||
#def_key "enter"
|
|
||||||
# toggle_output
|
|
||||||
#
|
|
||||||
#def_key "enter"
|
|
||||||
# run_action
|
|
||||||
#
|
|
||||||
#def_key "enter"
|
|
||||||
# play_item
|
|
||||||
#
|
|
||||||
#def_key "space"
|
|
||||||
# add_item_to_playlist
|
|
||||||
#
|
|
||||||
#def_key "space"
|
|
||||||
# toggle_lyrics_update_on_song_change
|
|
||||||
#
|
|
||||||
#def_key "space"
|
|
||||||
# toggle_visualization_type
|
|
||||||
#
|
|
||||||
#def_key "delete"
|
|
||||||
# delete_playlist_items
|
|
||||||
#
|
|
||||||
#def_key "delete"
|
|
||||||
# delete_browser_items
|
|
||||||
#
|
|
||||||
#def_key "delete"
|
|
||||||
# delete_stored_playlist
|
|
||||||
#
|
|
||||||
#def_key "right"
|
|
||||||
# next_column
|
|
||||||
#
|
|
||||||
#def_key "right"
|
|
||||||
# slave_screen
|
|
||||||
#
|
|
||||||
#def_key "right"
|
|
||||||
# volume_up
|
|
||||||
#
|
|
||||||
#def_key "+"
|
|
||||||
# volume_up
|
|
||||||
#
|
|
||||||
#def_key "left"
|
|
||||||
# previous_column
|
|
||||||
#
|
|
||||||
#def_key "left"
|
|
||||||
# master_screen
|
|
||||||
#
|
|
||||||
#def_key "left"
|
|
||||||
# volume_down
|
|
||||||
#
|
|
||||||
#def_key "-"
|
|
||||||
# volume_down
|
|
||||||
#
|
|
||||||
#def_key ":"
|
|
||||||
# execute_command
|
|
||||||
#
|
|
||||||
#def_key "tab"
|
|
||||||
# next_screen
|
|
||||||
#
|
|
||||||
#def_key "shift-tab"
|
|
||||||
# previous_screen
|
|
||||||
#
|
|
||||||
#def_key "f1"
|
|
||||||
# show_help
|
|
||||||
#
|
|
||||||
#def_key "1"
|
|
||||||
# show_playlist
|
|
||||||
#
|
|
||||||
#def_key "2"
|
|
||||||
# show_browser
|
|
||||||
#
|
|
||||||
#def_key "2"
|
|
||||||
# change_browse_mode
|
|
||||||
#
|
|
||||||
#def_key "3"
|
|
||||||
# show_search_engine
|
|
||||||
#
|
|
||||||
#def_key "3"
|
|
||||||
# reset_search_engine
|
|
||||||
#
|
|
||||||
#def_key "4"
|
|
||||||
# show_media_library
|
|
||||||
#
|
|
||||||
#def_key "4"
|
|
||||||
# toggle_media_library_columns_mode
|
|
||||||
#
|
|
||||||
#def_key "5"
|
|
||||||
# show_playlist_editor
|
|
||||||
#
|
|
||||||
#def_key "6"
|
|
||||||
# show_tag_editor
|
|
||||||
#
|
|
||||||
#def_key "7"
|
|
||||||
# show_outputs
|
|
||||||
#
|
|
||||||
#def_key "8"
|
|
||||||
# show_visualizer
|
|
||||||
#
|
|
||||||
#def_key "="
|
|
||||||
# show_clock
|
|
||||||
#
|
|
||||||
#def_key "@"
|
|
||||||
# show_server_info
|
|
||||||
#
|
|
||||||
#def_key "s"
|
|
||||||
# stop
|
|
||||||
#
|
|
||||||
#def_key "p"
|
|
||||||
# pause
|
|
||||||
#
|
|
||||||
#def_key ">"
|
|
||||||
# next
|
|
||||||
#
|
|
||||||
#def_key "<"
|
|
||||||
# previous
|
|
||||||
#
|
|
||||||
#def_key "ctrl-h"
|
|
||||||
# jump_to_parent_directory
|
|
||||||
#
|
|
||||||
#def_key "ctrl-h"
|
|
||||||
# replay_song
|
|
||||||
#
|
|
||||||
#def_key "backspace"
|
|
||||||
# jump_to_parent_directory
|
|
||||||
#
|
|
||||||
#def_key "backspace"
|
|
||||||
# replay_song
|
|
||||||
#
|
|
||||||
#def_key "f"
|
|
||||||
# seek_forward
|
|
||||||
#
|
|
||||||
#def_key "b"
|
|
||||||
# seek_backward
|
|
||||||
#
|
|
||||||
#def_key "r"
|
|
||||||
# toggle_repeat
|
|
||||||
#
|
|
||||||
#def_key "z"
|
|
||||||
# toggle_random
|
|
||||||
#
|
|
||||||
#def_key "y"
|
|
||||||
# save_tag_changes
|
|
||||||
#
|
|
||||||
#def_key "y"
|
|
||||||
# start_searching
|
|
||||||
#
|
|
||||||
#def_key "y"
|
|
||||||
# toggle_single
|
|
||||||
#
|
|
||||||
#def_key "R"
|
|
||||||
# toggle_consume
|
|
||||||
#
|
|
||||||
#def_key "Y"
|
|
||||||
# toggle_replay_gain_mode
|
|
||||||
#
|
|
||||||
#def_key "T"
|
|
||||||
# toggle_add_mode
|
|
||||||
#
|
|
||||||
#def_key "|"
|
|
||||||
# toggle_mouse
|
|
||||||
#
|
|
||||||
#def_key "#"
|
|
||||||
# toggle_bitrate_visibility
|
|
||||||
#
|
|
||||||
#def_key "Z"
|
|
||||||
# shuffle
|
|
||||||
#
|
|
||||||
#def_key "x"
|
|
||||||
# toggle_crossfade
|
|
||||||
#
|
|
||||||
#def_key "X"
|
|
||||||
# set_crossfade
|
|
||||||
#
|
|
||||||
#def_key "u"
|
|
||||||
# update_database
|
|
||||||
#
|
|
||||||
#def_key "ctrl-s"
|
|
||||||
# sort_playlist
|
|
||||||
#
|
|
||||||
#def_key "ctrl-s"
|
|
||||||
# toggle_browser_sort_mode
|
|
||||||
#
|
|
||||||
#def_key "ctrl-s"
|
|
||||||
# toggle_media_library_sort_mode
|
|
||||||
#
|
|
||||||
#def_key "ctrl-r"
|
|
||||||
# reverse_playlist
|
|
||||||
#
|
|
||||||
#def_key "ctrl-f"
|
|
||||||
# apply_filter
|
|
||||||
#
|
|
||||||
#def_key "ctrl-_"
|
|
||||||
# select_found_items
|
|
||||||
#
|
|
||||||
#def_key "/"
|
|
||||||
# find
|
|
||||||
#
|
|
||||||
#def_key "/"
|
|
||||||
# find_item_forward
|
|
||||||
#
|
|
||||||
#def_key "?"
|
|
||||||
# find
|
|
||||||
#
|
|
||||||
#def_key "?"
|
|
||||||
# find_item_backward
|
|
||||||
#
|
|
||||||
#def_key "."
|
|
||||||
# next_found_item
|
|
||||||
#
|
|
||||||
#def_key ","
|
|
||||||
# previous_found_item
|
|
||||||
#
|
|
||||||
#def_key "w"
|
|
||||||
# toggle_find_mode
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_song
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_library_tag
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_library_album
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_directory_name
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_playlist_name
|
|
||||||
#
|
|
||||||
#def_key "e"
|
|
||||||
# edit_lyrics
|
|
||||||
#
|
|
||||||
#def_key "i"
|
|
||||||
# show_song_info
|
|
||||||
#
|
|
||||||
#def_key "I"
|
|
||||||
# show_artist_info
|
|
||||||
#
|
|
||||||
#def_key "g"
|
|
||||||
# jump_to_position_in_song
|
|
||||||
#
|
|
||||||
#def_key "l"
|
|
||||||
# show_lyrics
|
|
||||||
#
|
|
||||||
#def_key "ctrl-v"
|
|
||||||
# select_range
|
|
||||||
#
|
|
||||||
#def_key "v"
|
|
||||||
# reverse_selection
|
|
||||||
#
|
|
||||||
#def_key "V"
|
|
||||||
# remove_selection
|
|
||||||
#
|
|
||||||
#def_key "B"
|
|
||||||
# select_album
|
|
||||||
#
|
|
||||||
#def_key "a"
|
|
||||||
# add_selected_items
|
|
||||||
#
|
|
||||||
#def_key "c"
|
|
||||||
# clear_playlist
|
|
||||||
#
|
|
||||||
#def_key "c"
|
|
||||||
# clear_main_playlist
|
|
||||||
#
|
|
||||||
#def_key "C"
|
|
||||||
# crop_playlist
|
|
||||||
#
|
|
||||||
#def_key "C"
|
|
||||||
# crop_main_playlist
|
|
||||||
#
|
|
||||||
#def_key "m"
|
|
||||||
# move_sort_order_up
|
|
||||||
#
|
|
||||||
#def_key "m"
|
|
||||||
# move_selected_items_up
|
|
||||||
#
|
|
||||||
#def_key "n"
|
|
||||||
# move_sort_order_down
|
|
||||||
#
|
|
||||||
#def_key "n"
|
|
||||||
# move_selected_items_down
|
|
||||||
#
|
|
||||||
#def_key "M"
|
|
||||||
# move_selected_items_to
|
|
||||||
#
|
|
||||||
#def_key "A"
|
|
||||||
# add
|
|
||||||
#
|
|
||||||
#def_key "S"
|
|
||||||
# save_playlist
|
|
||||||
#
|
|
||||||
#def_key "o"
|
|
||||||
# jump_to_playing_song
|
|
||||||
#
|
|
||||||
#def_key "G"
|
|
||||||
# jump_to_browser
|
|
||||||
#
|
|
||||||
#def_key "G"
|
|
||||||
# jump_to_playlist_editor
|
|
||||||
#
|
|
||||||
#def_key "~"
|
|
||||||
# jump_to_media_library
|
|
||||||
#
|
|
||||||
#def_key "E"
|
|
||||||
# jump_to_tag_editor
|
|
||||||
#
|
|
||||||
#def_key "U"
|
|
||||||
# toggle_playing_song_centering
|
|
||||||
#
|
|
||||||
#def_key "P"
|
|
||||||
# toggle_display_mode
|
|
||||||
#
|
|
||||||
#def_key "\\"
|
|
||||||
# toggle_interface
|
|
||||||
#
|
|
||||||
#def_key "!"
|
|
||||||
# toggle_separators_between_albums
|
|
||||||
#
|
|
||||||
#def_key "L"
|
|
||||||
# toggle_lyrics_fetcher
|
|
||||||
#
|
|
||||||
#def_key "F"
|
|
||||||
# fetch_lyrics_in_background
|
|
||||||
#
|
|
||||||
#def_key "alt-l"
|
|
||||||
# toggle_fetching_lyrics_in_background
|
|
||||||
#
|
|
||||||
#def_key "ctrl-l"
|
|
||||||
# toggle_screen_lock
|
|
||||||
#
|
|
||||||
#def_key "`"
|
|
||||||
# toggle_library_tag_type
|
|
||||||
#
|
|
||||||
#def_key "`"
|
|
||||||
# refetch_lyrics
|
|
||||||
#
|
|
||||||
#def_key "`"
|
|
||||||
# add_random_items
|
|
||||||
#
|
|
||||||
#def_key "ctrl-p"
|
|
||||||
# set_selected_items_priority
|
|
||||||
#
|
|
||||||
#def_key "q"
|
|
||||||
# quit
|
|
||||||
#
|
|
|
@ -1,157 +0,0 @@
|
||||||
##### directories ######
|
|
||||||
ncmpcpp_directory = ~/.ncmpcpp
|
|
||||||
lyrics_directory = ~/.lyrics
|
|
||||||
##### MPD settings #####
|
|
||||||
mpd_host = {{@@ env['PASS_MPD_ADMIN'] @@}}@localhost
|
|
||||||
mpd_port = 6600
|
|
||||||
mpd_connection_timeout = 5
|
|
||||||
mpd_music_dir = ~/Music
|
|
||||||
mpd_crossfade_time = 2
|
|
||||||
|
|
||||||
##### visualizer #####
|
|
||||||
visualizer_fifo_path = /tmp/mpd.fifo
|
|
||||||
visualizer_output_name = Visualizer
|
|
||||||
visualizer_in_stereo = yes
|
|
||||||
visualizer_sync_interval = 30
|
|
||||||
# spectrum,wave,wave_filled,ellipse.
|
|
||||||
visualizer_type = wave_filled
|
|
||||||
visualizer_look = ●▮
|
|
||||||
visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
|
|
||||||
|
|
||||||
##### delays #####
|
|
||||||
# Time of inactivity (in seconds) after playlist highlighting will be disabled
|
|
||||||
## (0 = always on).
|
|
||||||
playlist_disable_highlight_delay = 5
|
|
||||||
message_delay_time = 5
|
|
||||||
|
|
||||||
##### song format #####
|
|
||||||
# %l - length
|
|
||||||
# %f - filename
|
|
||||||
# %D - directory
|
|
||||||
# %a - artist
|
|
||||||
# %A - album artist
|
|
||||||
# %t - title
|
|
||||||
# %b - album
|
|
||||||
# %y - date
|
|
||||||
# %n - track number (01/12 -> 01)
|
|
||||||
# %N - full track info (01/12 -> 01/12)
|
|
||||||
# %g - genre
|
|
||||||
# %c - composer
|
|
||||||
# %p - performer
|
|
||||||
# %d - disc
|
|
||||||
# %C - comment
|
|
||||||
# %P - priority
|
|
||||||
# $R - begin right alignment
|
|
||||||
|
|
||||||
song_list_format = {%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
|
|
||||||
song_status_format = {{%a{ "%b"{ (%y)}} - }{%t}}|{%f}
|
|
||||||
song_library_format = {%n - }{%t}|{%f}
|
|
||||||
alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
|
|
||||||
alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
|
|
||||||
current_item_prefix = $(yellow)$r
|
|
||||||
current_item_suffix = $/r$(end)
|
|
||||||
current_item_inactive_column_prefix = $(white)$r
|
|
||||||
current_item_inactive_column_suffix = $/r$(end)
|
|
||||||
now_playing_prefix = $b
|
|
||||||
now_playing_suffix = $/b
|
|
||||||
browser_playlist_prefix = "$2playlist$9 "
|
|
||||||
selected_item_prefix = $6
|
|
||||||
selected_item_suffix = $9
|
|
||||||
modified_item_prefix = $3> $9
|
|
||||||
song_window_title_format = {%a - }{%t}|{%f}
|
|
||||||
browser_sort_mode = name
|
|
||||||
browser_sort_format = {%a - }{%t}|{%f} {(%l)}
|
|
||||||
|
|
||||||
##### columns #####
|
|
||||||
song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
|
|
||||||
|
|
||||||
##### misc #####
|
|
||||||
execute_on_song_change = ""
|
|
||||||
execute_on_player_state_change = ""
|
|
||||||
playlist_show_mpd_host = no
|
|
||||||
playlist_show_remaining_time = no
|
|
||||||
playlist_shorten_total_times = no
|
|
||||||
playlist_separate_albums = no
|
|
||||||
playlist_display_mode = columns
|
|
||||||
browser_display_mode = classic
|
|
||||||
search_engine_display_mode = classic
|
|
||||||
playlist_editor_display_mode = classic
|
|
||||||
discard_colors_if_item_is_selected = yes
|
|
||||||
show_duplicate_tags = yes
|
|
||||||
incremental_seeking = yes
|
|
||||||
seek_time = 1
|
|
||||||
volume_change_step = 2
|
|
||||||
autocenter_mode = no
|
|
||||||
centered_cursor = no
|
|
||||||
progressbar_look = =>
|
|
||||||
default_place_to_search_in = database
|
|
||||||
user_interface = alternative
|
|
||||||
data_fetching_delay = yes
|
|
||||||
media_library_primary_tag = album_artist
|
|
||||||
media_library_albums_split_by_date = yes
|
|
||||||
default_find_mode = wrapped
|
|
||||||
default_tag_editor_pattern = %n - %t
|
|
||||||
header_visibility = yes
|
|
||||||
statusbar_visibility = yes
|
|
||||||
titles_visibility = yes
|
|
||||||
header_text_scrolling = yes
|
|
||||||
cyclic_scrolling = no
|
|
||||||
lines_scrolled = 2
|
|
||||||
lastfm_preferred_language = en
|
|
||||||
screen_switcher_mode = playlist, browser
|
|
||||||
startup_screen = playlist
|
|
||||||
startup_slave_screen = ""
|
|
||||||
startup_slave_screen_focus = no
|
|
||||||
locked_screen_width_part = 50
|
|
||||||
ask_for_locked_screen_width_part = yes
|
|
||||||
jump_to_now_playing_song_at_start = yes
|
|
||||||
ask_before_clearing_playlists = yes
|
|
||||||
clock_display_seconds = no
|
|
||||||
display_volume_level = yes
|
|
||||||
display_bitrate = no
|
|
||||||
display_remaining_time = no
|
|
||||||
regular_expressions = perl
|
|
||||||
ignore_leading_the = no
|
|
||||||
ignore_diacritics = no
|
|
||||||
block_search_constraints_change_if_items_found = yes
|
|
||||||
mouse_support = yes
|
|
||||||
mouse_list_scroll_whole_page = yes
|
|
||||||
empty_tag_marker = <empty>
|
|
||||||
tags_separator = " | "
|
|
||||||
tag_editor_extended_numeration = no
|
|
||||||
media_library_sort_by_mtime = no
|
|
||||||
enable_window_title = yes
|
|
||||||
search_engine_default_search_mode = 1
|
|
||||||
external_editor = nvim
|
|
||||||
use_console_editor = yes
|
|
||||||
|
|
||||||
##### lyrics #####
|
|
||||||
#lyrics_fetchers = embedded
|
|
||||||
follow_now_playing_lyrics = yes
|
|
||||||
fetch_lyrics_for_current_song_in_background = no
|
|
||||||
store_lyrics_in_song_dir = no
|
|
||||||
|
|
||||||
##### files #####
|
|
||||||
generate_win32_compatible_filenames = yes
|
|
||||||
allow_for_physical_item_deletion = no
|
|
||||||
space_add_mode = add_remove
|
|
||||||
show_hidden_files_in_local_browser = no
|
|
||||||
|
|
||||||
##### colors #####
|
|
||||||
colors_enabled = yes
|
|
||||||
empty_tag_color = cyan
|
|
||||||
header_window_color = red
|
|
||||||
volume_color = default
|
|
||||||
state_line_color = default
|
|
||||||
state_flags_color = default:b
|
|
||||||
main_window_color = yellow
|
|
||||||
color1 = white
|
|
||||||
color2 = green
|
|
||||||
progressbar_color = black:b
|
|
||||||
progressbar_elapsed_color = green:b
|
|
||||||
statusbar_color = default
|
|
||||||
statusbar_time_color = default:b
|
|
||||||
player_state_color = default:b
|
|
||||||
alternative_ui_separator_color = black:b
|
|
||||||
window_border_color = green
|
|
||||||
active_window_border = red
|
|
|
@ -1,14 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
set my_email = "admin@reekynet.com"
|
|
||||||
set from = $my_email
|
|
||||||
set sendmail = "/usr/bin/msmtp -a $my_email"
|
|
||||||
set realname = "ReekyNET Admin"
|
|
||||||
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set folder = "~/.mail/$my_email"
|
|
||||||
set mbox = "+INBOX"
|
|
||||||
set record = "+INBOX"
|
|
||||||
set postponed = "+Drafts"
|
|
||||||
set spoolfile = "+INBOX"
|
|
||||||
mailboxes = +INBOX
|
|
|
@ -1,14 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
set my_email = "marko.korhonen@metropolia.fi"
|
|
||||||
set from = $my_email
|
|
||||||
set sendmail = "/usr/bin/msmtp -a $my_email"
|
|
||||||
set realname = "Marko Korhonen"
|
|
||||||
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set folder = "~/.mail/$my_email"
|
|
||||||
set mbox = "+INBOX"
|
|
||||||
set record = "+INBOX"
|
|
||||||
set postponed = "+Drafts"
|
|
||||||
set spoolfile = "+INBOX"
|
|
||||||
mailboxes = +INBOX
|
|
|
@ -1,14 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
set my_email = "marko.korhonen@reekynet.com"
|
|
||||||
set from = $my_email
|
|
||||||
set sendmail = "/usr/bin/msmtp -a $my_email"
|
|
||||||
set realname = "Marko Korhonen"
|
|
||||||
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set folder = "~/.mail/$my_email"
|
|
||||||
set mbox = "+INBOX"
|
|
||||||
set record = "+INBOX"
|
|
||||||
set postponed = "+Drafts"
|
|
||||||
set spoolfile = "+INBOX"
|
|
||||||
mailboxes = +INBOX
|
|
|
@ -1,15 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
# Incoming mail from maildir
|
|
||||||
set my_email = "reekymarko@reekynet.com"
|
|
||||||
set from = $my_email
|
|
||||||
set sendmail = "/usr/bin/msmtp -a $my_email"
|
|
||||||
set realname = "Marko Korhonen"
|
|
||||||
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set folder = ~/.mail/$my_email
|
|
||||||
set mbox = +INBOX
|
|
||||||
set record = +Sent
|
|
||||||
set postponed = +Drafts
|
|
||||||
set spoolfile = +INBOX
|
|
||||||
mailboxes = +INBOX
|
|
|
@ -1 +0,0 @@
|
||||||
color normal default default
|
|
|
@ -1,15 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
set sendmail = "/usr/bin/msmtp"
|
|
||||||
set mbox_type = Maildir
|
|
||||||
set folder = ~/.mail
|
|
||||||
set spoolfile = +Personal/INBOX
|
|
||||||
|
|
||||||
source ~/.config/neomutt/appearance
|
|
||||||
source ~/.config/neomutt/sidebar
|
|
||||||
source ~/.config/neomutt/accounts/reekymarko@reekynet.com
|
|
||||||
|
|
||||||
macro index <f2> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/reekymarko@reekynet.com<enter><change-folder>!<enter>'
|
|
||||||
macro index <f3> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/marko.korhonen@reekynet.com<enter><change-folder>!<enter>'
|
|
||||||
macro index <f4> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/admin@reekynet.com<enter><change-folder>!<enter>'
|
|
||||||
macro index <f5> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/marko.korhonen@metropolia.fi<enter><change-folder>!<enter>'
|
|
|
@ -1,5 +0,0 @@
|
||||||
# vim: filetype=muttrc
|
|
||||||
|
|
||||||
set sidebar_visible = yes
|
|
||||||
set sidebar_indent_string = ' '
|
|
||||||
sidebar_whitelist '~/.mail/<>/INBOX'
|
|
|
@ -1,28 +0,0 @@
|
||||||
[dmenu]
|
|
||||||
fn = -*-SF-Pro-Display-Regular-*-*-*-10-*-*-*-*-*-*-*
|
|
||||||
dmenu_command = /usr/bin/rofi
|
|
||||||
l = 10
|
|
||||||
# # Note that dmenu_command can contain arguments as well like `rofi -width 30`
|
|
||||||
# # Rofi and dmenu are set to case insensitive by default `-i`
|
|
||||||
# l = number of lines to display, defaults to number of total network options
|
|
||||||
# fn = font string
|
|
||||||
# nb = normal background (name, #RGB, or #RRGGBB)
|
|
||||||
# nf = normal foreground
|
|
||||||
# sb = selected background
|
|
||||||
# sf = selected foreground
|
|
||||||
# b = (just set to empty value and menu will appear at the bottom
|
|
||||||
# m = number of monitor to display on
|
|
||||||
# p = Custom Prompt for the networks menu
|
|
||||||
# pinentry = Pinentry command
|
|
||||||
# rofi_highlight = <True or False> # (Default: False) use rofi highlighting instead of '**'
|
|
||||||
|
|
||||||
# # override normal foreground and background colors (dmenu) or use the
|
|
||||||
# # -password option (rofi) to obscure passphrase entry
|
|
||||||
# [dmenu_passphrase]
|
|
||||||
# nf = #222222
|
|
||||||
# nb = #222222
|
|
||||||
# rofi_obscure = True
|
|
||||||
|
|
||||||
[editor]
|
|
||||||
terminal = termite
|
|
||||||
gui_if_available = True
|
|
16
home/.config/nvim/README.adoc
Normal file
16
home/.config/nvim/README.adoc
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
= FunctionalHacker's NeoVim configuration
|
||||||
|
|
||||||
|
This is my personal NeoVim configuration I use for all text editing in my free
|
||||||
|
time and at my day job. I mostly code in Java, TypeScript and ReactJS, with
|
||||||
|
a bit of Rust and Python once in a blue moon.
|
||||||
|
|
||||||
|
The configuration is quite minimal but still fully featured. Some highlights
|
||||||
|
include
|
||||||
|
|
||||||
|
* LSP support with neovim's built in LSP client
|
||||||
|
** LSP servers are easily installed and auto-configured with Mason
|
||||||
|
* Treesitter
|
||||||
|
** Code folding
|
||||||
|
** Code highlighting
|
||||||
|
** Text objects
|
||||||
|
* Lazy plugin manager for fast startup times
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue