diff options
107 files changed, 3622 insertions, 3723 deletions
@@ -1,4 +1,8 @@ +@companion-app/ +5DB5/ +5db5/ abook/ +Applied Computer Music Technologies/ AHM 5050 v3/ AHM 5050 v3.settings aIR Impulse RackEX.settings @@ -6,8 +10,11 @@ Amp Locker/ Amp Locker.settings amsynth/ ardour*/ +audacity/ +Audio Assault/ autostart/ Binance/ +Blackmagic Design/ Blacksun/ Blacksun.settings blender/ @@ -20,10 +27,13 @@ calcurse/* calibre/ calibre/conversion carla/ +cava/ +CCL Cross-platform Framework/ cef_user_data .charles.config chromium/ clangd/ +cmus/ cni/ coc/extensions/db.json companion*/ @@ -31,6 +41,7 @@ computerrc computerrc.sh configstore/ cordless/config.json +cosmic/ dconf/ dde-printer.ini DELTARUNE/ @@ -43,6 +54,7 @@ Element/ emacs/ EmeraldWallet/ enchant/ +enigma/ Epic/ Etherdyne/ evolution/ @@ -57,19 +69,22 @@ galculator/ gamescope/ ghb/ GIMP/ +git/ glib-2.0/ +glow/ gnome-control-center/ gnome-initial-setup-done gnome-session/ +go/ goa-1.0/ godot/ gomuks/ -gtk-2.0/ -gtk-3.0/ -gtkrc -gtkrc-2.0 +gtk-2.0/* +!gtk-2.0/gtkrc +gtk-3.0/* +!gtk-3.0/settings.ini +gtk-4.0/ guitarix/ -<<<<<<< HEAD Hellbeast v2/ Hellbeast v2.settings htop/htoprc @@ -88,6 +103,7 @@ joplin/ Joplin/ joplin-desktop/ kaidan/ +karboncalligraphyrc kdeconnect/ kdeglobals kdenlive.* @@ -98,15 +114,18 @@ kde.org/ keepassxc/ khal/ kicad/ +kid3rc Kitware/ kritadisplayrc kritarc ksh/history +kwalletrc lab/ lbry/ LBRY/ LBRY-GTK/ lbry-viewer/ +libaccounts-glib/ libfm/ libreoffice/ LibrePCB/ @@ -116,6 +135,7 @@ lkjb/ lsp-plugins/ lutris/ lxqt/ +MangoHud/ menus/ mgba/ micro/buffers/ @@ -144,12 +164,13 @@ newsboat/cache.db newsboat/urls nextcloud/ Nextcloud/ +Nickvision Cavalier/ nitrogen/bg-saved.cfg notmuch/ npm/ nssdb/ NuGet/ -nvim/plugged/ +nvim/lazy-lock.json nwg-look/ nwg-outputs/ obs-studio/ @@ -157,6 +178,8 @@ odysee-nativefier*/ okularpartrc okularrc openrazer/ +package-lock.json +parallel/ pavucontrol.ini pcmanfm/ pcmanfm-qt/ @@ -164,20 +187,26 @@ PCSX2/ pipewire/ pipewire/media-session.d/ pipewire/pipewire.conf.d/ +plasmarc +pluginregistry.cfg +pluginsettings.cfg pmbootstrap.cfg poezio/ polychromatic/ pop-shell/ pop-system-updater/ Portmaster/ +PreSonus/ print-manager/ profanity/profrc +Proton/ Proton AG/ protonfixes/ protonmail/ protonvpn/ pulse/ pupgui/ +qobuz-dl/ qrcp/ qt5ct/* !qt5ct/qt5ct.conf @@ -190,32 +219,48 @@ qutebrowser/jmatrix-rules r2modman/ r2modmanPlus-local/ raveloxmidi/ +razergenie/ rclone/ ReAmp Studio R1/ ReAmp Studio R1.settings REAPER/ +remmina/ Resonant DSP/ retroarch/ rncbc.org/ +.rt64/ rtorrent/ +runit/sv/*/supervise +runit/sv/*/*/supervise +runit/runsvdir/* RVXX EXEX.settings RVXX v2/ RVXX v2.settings SchildiChat/ +scroll/config.d/user.conf Serenity/ Session/ Shibalba EXEX.settings sh/weather +SNAPSHOT PLAYER/ snownews/urls.opml solaar/ +sonobus/ +spicy/ spotifyd/ spotify-tui/ straw-viewer/ +strawberry/ +subversion/ SUPERHOT/ +suyu/ switcher/ syncthing/ +Synergy/ +synergy/ systemd/ systemsettingsrc +tenacity.cfg The Crown EXEX.settings themes/ tmux/plugins @@ -227,12 +272,17 @@ transmission-daemon/ tremc/ Trolltech.conf .tsrc +tuxclocker.conf ubports-installer/ +ultravnc-viewer/ UNDERTALE*/ unity3d/ Valve Corporation/ vdirsyncer/ +vkBasalt/ VeraCrypt/ +vim/* +!vim/vimrc VirtualBox/ vlc/vlc-qt-interface.conf waybar/config-dwl-* @@ -240,6 +290,7 @@ waybar/config-Hyprland-* waybar/config-river-* weechat/ whoozle.github.io/ +wireshark/ xmonad/.stack-work xmonad/stack.yaml.lock xmonad/xmonad.hi @@ -247,13 +298,17 @@ xmonad/xmonad.o xmonad/xmonad-x86_64-linux xsettingsd/ yabridgectl/ +yarn/ ytfzf/subscriptions yuzu/ zec-qt-wallet-org/ +Zelda64Recompiled/ zirless/ zoomus.conf +zoom.conf zsh/hist zsh/.zcompdump zsh/zcompdump zsh/zfunc +zsh/.zkbd/ zsh/.zsh_theme @@ -1,32 +1,61 @@ VIM := $(shell command -v vim 2>/dev/null) -NVIM := $(shell command -v nvim 2>/dev/null) -XCONFS := X11/Xresources -ZCONFS := zsh/.zshenv +BCONFS := bash/.bash_logout bash/.bashrc +ZCONFS := zsh/zshenv zsh/zshrc SCONFS := sh/profile DCONFS := doas.conf all: -install: install-xconfigs install-shconfigs install-zshconfigs vimplug-vim vimplug-nvim +install: install-zshconfigs install-shconfigs vimplug-vim wc -install-xconfigs: $(XCONFS) - @echo "Installing Xorg conf files..." - @echo "Xresources..." - @ln -sf `pwd`/X11/Xresources ~/.Xresources +wc: + @echo "Installing wayland compositor stuff..." + @./installers/wc @echo "Done." -install-shconfigs: $(SCONFS) - @echo "Installing SH conf files..." - @echo ".profile..." - @ln -sf `pwd`/sh/profile ~/.profile +install-hyprplugins: install-hyprsplit install-hyprland-plugins + +install-hyprsplit: + @echo "Installing hyprsplit..." + @hyprpm add https://github.com/shezdy/hyprsplit || echo "Already installed!" + @echo "Enabling hyprsplit..." + @hyprpm enable hyprsplit + @echo "Done." + +install-hyprland-plugins: + @echo "Installing hyprland-plugins..." + @hyprpm add https://github.com/hyprwm/hyprland-plugins || echo "Already installed!" + @echo "Enabling hyprscrolling..." + @hyprpm enable hyprscrolling + @echo "Done." + +install-scrollconf: scroll/config.d/user.conf + +scroll/config.d/user.conf: + @echo "Generating user.conf..." + @mkdir -p scroll/config.d + @echo 'set $$home' $(shell echo $(HOME)) > scroll/config.d/user.conf + @echo "Done." + +install-bashconfigs: $(BCONFS) install-shconfigs + @echo "Installing bash conf files..." + @echo ".bashrc..." + @ln -sf `pwd`/bash/.bashrc ~/.bashrc + @echo ".bash_logout..." + @ln -sf `pwd`/bash/.bash_logout ~/.bash_logout @echo "Done." -install-zshconfigs: $(ZCONFS) - @echo "Installing zsh conf files..." - @echo ".zshenv..." - @ln -sf `pwd`/zsh/.zshenv ~/.zshenv +install-zshconfigs: install-shconfigs + @echo "Settings up ZDOTDIR..." + @echo "Installing .zprofile..." + @ln -sf `pwd`/sh/profile ~/.zprofile @echo "Done." +install-shconfigs: $(SCONFS) + @echo "Installing sh conf files..." + @echo ".profile..." + @ln -sf `pwd`/sh/profile ~/.profile + vimplug-vim: installers/vimplug_vim.sh ifdef VIM @echo "Installing vim-plug for vim..." @@ -36,17 +65,10 @@ else @echo "vim not installed." endif -vimplug-nvim: installers/vimplug_nvim.sh -ifdef NVIM - @echo "Installing vim-plug for nvim..." - @$(shell installers/vimplug_nvim.sh) - @echo "Done." -else - @echo "nvim not installed." -endif - doas-conf: $(DCONFS) @echo "Installing doas config files..." @echo "doas.conf..." @sudo cp -n doas.conf /etc/doas.conf @echo "Done." + +.PHONY: install-hyprplugins install-zshconfigs install-shconfigs vimplug-vim doas-conf install install-scrollconf install-bashconfigs @@ -16,7 +16,7 @@ make install` Note that the `make install` will only install the files that are required to be in the home dir to their corresponding place as hard links and install vimplug -for neovim, vim, or both (depending on which are installed). Make sure to save -changes to these files before running `make install`! Additionally, if you only -want my configs for specific programs, I would recommend cloning it into a -separate directory and avoiding the `make install`. +for vim if it is installed. Make sure to save changes to these files before +running `make install`! Additionally, if you only want my configs for specific +programs, I would recommend cloning it into a separate directory and avoiding +the `make install`. diff --git a/X11/xinitrc b/X11/xinitrc index 534bfc6..e949fbc 100755 --- a/X11/xinitrc +++ b/X11/xinitrc @@ -1,5 +1,10 @@ #!/bin/sh [ -x ~/.screenlayout/layout.sh ] && ~/.screenlayout/layout.sh +xwallpaper --zoom ~/Pictures/background.png & +picom & setxkbmap -option "caps:escape" & -xrdb ~/.Xresources -exec awesome +systemctl --user start dunst & +sxhkd & +xss-lock slockd & +xrdb ~/.config/X11/xresources +exec dwm diff --git a/X11/Xresources b/X11/xresources index d5c4550..2624d72 100644 --- a/X11/Xresources +++ b/X11/xresources @@ -1,6 +1,13 @@ !! dmenu -dmenu.font: mononoki Nerd Font Mono:size=24 +dmenu.font: JetBrainsMono Nerd Font:size=15 + +dmenu.selbackground: #198844 +dmenu.selforeground: #000000 +dmenu.hibackground: #000000 +dmenu.hiforeground: #39c1ed +dmenu.selhibackground: #198844 +dmenu.selhiforeground: #39c1ed !! dwm @@ -30,7 +37,7 @@ st.termname: st-256color st.shell: /usr/bin/tmux ! The following options options can be reloaded via USR1 signal. -!st.font: mononoki Nerd Font Mono:pixelsize=12:antialias=true:autohint=true; +!st.font: JetBrainsMono Nerd Font:pixelsize=12:antialias=true:autohint=true; !st.font2: Symbola:pixelsize=12:antialias=true:autohint=true; st.borderpx: 3 ! st alpha @@ -76,7 +83,7 @@ URxvt.secondaryScreen: 1 URxvt.secondaryScroll: 0 URxvt.secondaryWheel: 1 ! URxvt font -URxvt.font: xft:Fira Code:regular:size=8,xft:symbola:regular:size=9 +URxvt.font: xft:JetBrainsMono:regular:size=8,xft:symbola:regular:size=9 ! fix font spacing URxvt.letterSpace: -1 ! Disable printing @@ -119,7 +126,7 @@ rofi.width: 1366 ! "Number of columns" Set from: Default ! rofi.columns: 1 ! "Font to use" Set from: Default -rofi.font: mononoki 9 +rofi.font: JetBrainsMono 9 ! "Border width" Set from: Default ! rofi.bw: 1 ! "Location on screen" Set from: Default @@ -413,54 +420,11 @@ rofi.color-window: #1d1f21, #101010, #000000 ! "Accept hovered row with custom action" Set from: Default ! rofi.me-accept-custom: Control+MouseDPrimary -!! special -!*.foreground: #c5c8c6 -!*.background: #1d1f21 -!*.cursorColor: #c5c8c6 -! -!! black -!*.color0: #282a2e -!*.color8: #373b41 -! -!! red -!*.color1: #a54242 -!*.color9: #cc6666 -! -!! green -!*.color2: #8c9440 -!*.color10: #b5bd68 -! -!! yellow -!*.color3: #de935f -!*.color11: #f0c674 -! -!! blue -!*.color4: #5f819d -!*.color12: #81a2be -! -!! magenta -!*.color5: #85678f -!*.color13: #b294bb -! -!! cyan -!*.color6: #5e8d87 -!*.color14: #8abeb7 -! -!! white -!*.color7: #707880 -!*.color15: #c5c8c6 -! -!! special +! special *.foreground: #c5c8c6 *.background: #000000 *.cursorColor: #c5c8c6 *.reverseCursor: #333536 -dmenu.selbackground: #39c1ed -dmenu.selforeground: #000000 -dmenu.hibackground: #000000 -dmenu.hiforeground: #198844 -dmenu.selhibackground: #39c1ed -dmenu.selhiforeground: #198844 ! black *.color0: #1b1d1c @@ -493,3 +457,5 @@ dmenu.selhiforeground: #198844 ! white *.color7: #b4b7b5 *.color15: #ffffff +Xcursor.theme: BreezeX-Black +Xcursor.size: 32 diff --git a/X11/xserverrc b/X11/xserverrc new file mode 100755 index 0000000..c96ab6d --- /dev/null +++ b/X11/xserverrc @@ -0,0 +1,3 @@ +#!/bin/sh + +exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR diff --git a/alacritty/alacritty.yml b/alacritty/alacritty.yml index 25af5d4..0b30805 100644 --- a/alacritty/alacritty.yml +++ b/alacritty/alacritty.yml @@ -115,7 +115,7 @@ font: # - (macOS) Menlo # - (Linux/BSD) monospace # - (Windows) Consolas - family: mononoki Nerd Font Mono + family: JetBrainsMono Nerd Font # The `style` can be specified to pick a specific face. style: Regular @@ -126,7 +126,7 @@ font: # # If the bold family is not specified, it will fall back to the # value specified for the normal font. - family: mononoki Nerd Font Mono + family: JetBrainsMono Nerd Font # The `style` can be specified to pick a specific face. style: Bold @@ -137,7 +137,7 @@ font: # # If the italic family is not specified, it will fall back to the # value specified for the normal font. - family: mononoki Nerd Font Mono + family: JetBrainsMono Nerd Font # The `style` can be specified to pick a specific face. style: Italic @@ -148,7 +148,7 @@ font: # # If the bold italic family is not specified, it will fall back to the # value specified for the normal font. - family: mononoki Nerd Font Mono + family: JetBrainsMono Nerd Font # The `style` can be specified to pick a specific face. style: Bold Italic diff --git a/autostart.sh b/autostart.sh index 311953f..7124a5e 100755 --- a/autostart.sh +++ b/autostart.sh @@ -18,14 +18,14 @@ killandrun () { } if [ -n "${WAYLAND_DISPLAY}${DISPLAY}" ]; then + dinit & notify-sound.sh off & runifnot swayidle killandrun hyprpaper runifnot waybar import-gsettings gtk-theme 'Flat-Remix-GTK-Green-Darkest-Solid' import-gsettings icon-theme 'Mint-X-Grey' - import-gsettings cursor-theme 'Adwaita' - xrdb ~/.Xresources + xrdb "$XDG_CONFIG_HOME/X11/xresources" fi [ -x "$XDG_CONFIG_HOME/computerrc.sh" ] && "$XDG_CONFIG_HOME/computerrc.sh" diff --git a/awesome/rc.lua b/awesome/rc.lua index a5605d1..7fa49ef 100644 --- a/awesome/rc.lua +++ b/awesome/rc.lua @@ -58,7 +58,7 @@ awesome_config_folder = config_dir .. "awesome" theme.dir = string.format("%s/awesome/themes/%s", config_dir, theme.name) beautiful.init(theme.dir .. "/theme.lua") beautiful.useless_gap = 5 -font = beautiful.font or "mononoki Nerd Font Mono 18" +font = beautiful.font or "JetBrainsMono Nerd Font 18" -- Library I'm using for swallowing, but it does much more diff --git a/awesome/themes/zachir/theme.lua b/awesome/themes/zachir/theme.lua index bef4f5c..30a575a 100644 --- a/awesome/themes/zachir/theme.lua +++ b/awesome/themes/zachir/theme.lua @@ -12,8 +12,8 @@ local themes_path = gfs.get_themes_dir() local theme = {} -theme.font = "mononoki Nerd Font Mono 18" -theme.font2 = "mononoki Nerd Font Mono 12" +theme.font = "JetBrainsMono Nerd Font 18" +theme.font2 = "JetBrainsMono Nerd Font 12" theme.bg_normal = xrdb.background theme.bg_focus = xrdb.color2 @@ -162,7 +162,7 @@ theme.tabbar_disable = false -- disable the tab bar entirely theme.tabbar_ontop = false theme.tabbar_radius = 0 -- border radius of the tabbar theme.tabbar_style = "default" -- style of the tabbar ("default", "boxes" or "modern") -theme.tabbar_font = "mononoki Nerd Font Mono 24" -- font of the tabbar +theme.tabbar_font = "JetBrainsMono Nerd Font 24" -- font of the tabbar theme.tabbar_size = 40 -- size of the tabbar theme.tabbar_position = "top" -- position of the tabbar theme.tabbar_bg_normal = "#000000" -- background color of the focused client on the tabbar diff --git a/bash/.bash_logout b/bash/.bash_logout new file mode 100644 index 0000000..9bccd62 --- /dev/null +++ b/bash/.bash_logout @@ -0,0 +1,2 @@ +clear +reset diff --git a/bash/.bashrc b/bash/.bashrc new file mode 100644 index 0000000..600352a --- /dev/null +++ b/bash/.bashrc @@ -0,0 +1,24 @@ +# Syntax Highlighting +source /usr/share/blesh/ble.sh + +# Incorporate my SH agnostic stuff +[ -f "$XDG_CONFIG_HOME/sh/aliases" ] && source "$XDG_CONFIG_HOME/sh/aliases" +[ -f "$XDG_CONFIG_HOME/sh/functions" ] && source "$XDG_CONFIG_HOME/sh/functions" + +# History Search +bind '"\e[A": history-search-backward' +bind '"\e[B": history-search-forward' + +# History Cleaning +export HISTCONTROL="erasedups:ignorespace" + +# Run-Help Ability +run-help() { help "$READLINE_LINE" 2>/dev/null || man "$READLINE_LINE"; } +bind -m vi-insert -x '"\eh": run-help' +bind -m emacs -x '"\eh": run-help' + +# CD when typing directory name +shopt -s autocd + +# Set my prompt +export PS1='\e[42m[\u@\H]\e[46\w\e[42m\$\e(B\e[m ' @@ -12,6 +12,7 @@ permit nopass :wheel cmd pacman permit nopass :wheel cmd cryptsetup permit nopass :wheel cmd systemctl permit setenv { EDITOR } :wheel cmd visudo args +permit setenv { EDITOR } :wheel cmd vidoas args permit setenv { EDITOR } :wheel cmd vimv permit nopass keepenv zachir as zachir diff --git a/dunst/dunstrc b/dunst/dunstrc index 403ffca..6377f26 100644 --- a/dunst/dunstrc +++ b/dunst/dunstrc @@ -86,7 +86,7 @@ ### Text ### - font = mononoki Nerd Font Mono 18 + font = JetBrainsMono Nerd Font 18 # The spacing between lines. If the height is smaller than the # font height, it will get raised to the font height. diff --git a/dwm/autostart.sh b/dwm/autostart.sh new file mode 100755 index 0000000..07f82d1 --- /dev/null +++ b/dwm/autostart.sh @@ -0,0 +1,2 @@ +#!/bin/sh +pgrep -x slstatus || slstatus diff --git a/environment.d/cursor.conf b/environment.d/cursor.conf new file mode 100644 index 0000000..9b9ef2b --- /dev/null +++ b/environment.d/cursor.conf @@ -0,0 +1,2 @@ +XCURSOR_THEME=BreezeX-Black +XCURSOR_SIZE=32 diff --git a/firejail/mpv.profile b/firejail/mpv.profile new file mode 100644 index 0000000..8ac7ccc --- /dev/null +++ b/firejail/mpv.profile @@ -0,0 +1,2 @@ +whitelist ~/.cache +include /etc/firejail/mpv.profile diff --git a/firejail/neomutt.profile b/firejail/neomutt.profile new file mode 100644 index 0000000..b8fa362 --- /dev/null +++ b/firejail/neomutt.profile @@ -0,0 +1,2 @@ +whitelist /usr/share/mutt-wizard +include /etc/firejail/mpv.profile diff --git a/gtk-2.0/gtkrc b/gtk-2.0/gtkrc new file mode 100644 index 0000000..42f1844 --- /dev/null +++ b/gtk-2.0/gtkrc @@ -0,0 +1,19 @@ +# DO NOT EDIT! This file will be overwritten by nwg-look. +# Any customization should be done in ~/.gtkrc-2.0.mine instead. + +include "/home/zachir/.gtkrc-2.0.mine" +gtk-theme-name="Flat-Remix-GTK-Green-Darkest" +gtk-icon-theme-name="Papirus-Dark" +gtk-font-name="Noto Sans, 10" +gtk-cursor-theme-name="BreezeX-Black" +gtk-cursor-theme-size=32 +gtk-toolbar-style=3 +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=0 +gtk-menu-images=0 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=0 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle="hintslight" +gtk-xft-rgba="rgb" diff --git a/gtk-3.0/settings.ini b/gtk-3.0/settings.ini new file mode 100644 index 0000000..809e192 --- /dev/null +++ b/gtk-3.0/settings.ini @@ -0,0 +1,23 @@ +[Settings] +gtk-theme-name=Flat-Remix-GTK-Green-Darkest +gtk-icon-theme-name=Papirus-Dark +gtk-font-name=Noto Sans, 10 +gtk-cursor-theme-name=BreezeX-Black +gtk-cursor-theme-size=32 +gtk-toolbar-style=3 +gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR +gtk-button-images=0 +gtk-menu-images=0 +gtk-enable-event-sounds=1 +gtk-enable-input-feedback-sounds=0 +gtk-xft-antialias=1 +gtk-xft-hinting=1 +gtk-xft-hintstyle=hintslight +gtk-xft-rgba=rgb +gtk-application-prefer-dark-theme=1 +gtk-decoration-layout=icon:minimize,maximize,close +gtk-enable-animations=true +gtk-modules=colorreload-gtk-module +gtk-primary-button-warps-slider=true +gtk-sound-theme-name=ocean +gtk-xft-dpi=98304 diff --git a/handlr/handlr.toml b/handlr/handlr.toml new file mode 100644 index 0000000..58e04ba --- /dev/null +++ b/handlr/handlr.toml @@ -0,0 +1,4 @@ +enable_selector = false +selector = "tofi -c ~/.conifg/tofi/cosmic --prompt-text 'Open With: '" +term_exec_args = '-e' +expand_wildcards = false diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..5494a33 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,34 @@ +general { + lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. + before_sleep_cmd = loginctl lock-session # lock before suspend. + after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. +} + +listener { + timeout = 150 # 2.5min. + on-timeout = brightnessctl set 1 # set monitor backlight to minimum, avoid 0 on OLED monitor. + on-resume = brightnessctl -r # monitor backlight restore. +} + +# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight. +listener { + timeout = 150 # 2.5min. + on-timeout = brightnessctl -d tpacpi::kbd_backlight set 0 # turn off keyboard backlight. + on-resume = brightnessctl -rd tpacpi::kbd_backlight # turn on keyboard backlight. +} + +listener { + timeout = 300 # 5min + on-timeout = loginctl lock-session # lock screen when timeout has passed +} + +listener { + timeout = 330 # 5.5min + on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed + on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired. +} + +listener { + timeout = 1800 # 30min + on-timeout = systemctl suspend # suspend pc +} diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf index e053008..1e558ef 100644 --- a/hypr/hyprland.conf +++ b/hypr/hyprland.conf @@ -1,25 +1,70 @@ # See https://wiki.hyprland.org/Configuring/Monitors/ #{{{ Monitor config +#monitor = DP-2, 1920x1080@75, 0x0, 1 +#monitor = HDMI-A-1, 1920x1080@75, 1920x0, 1 +monitor = eDP-1, 1920x1080@60, 0x0, 1 monitor = , preferred, auto, 1 -monitor = HDMI-A-1, 1920x1080@60, 0x0, 1 -monitor = DP-1, 1920x1080@60, 1920x0, 1 #}}} # See https://wiki.hyprland.org/Configuring/Keywords/ for more +#{{{ Plugins +plugin = /var/cache/hyprpm/zachir/hyprland-plugins/hyprscrolling.so +plugin = /var/cache/hyprpm/zachir/hyprsplit/hyprsplit.so +#}}} + #{{{ Autostart # Execute your favorite apps at launch # exec-once = waybar & hyprpaper & firefox -exec-once = ~/.config/autostart.sh -exec-once = /usr/lib/polkit-kde-authentication-agent-1 -exec-once = xdph exec-once = hyprpm reload -n +#exec-once = dinit +#exec-once = xdph +exec-once = dinitctl start hyprpaper.user +exec-once = waybar exec-once = pypr +exec-once = hyprscratch init +exec-once = lxqt-policykit-agent +exec-once = import-gsettings gtk-theme 'Flat-Remix-GTK-Green-Darkest' +exec-once = import-gsettings icon-theme 'Papirus-Dark' +exec-once = import-gsettings cursor-theme 'BreezeX-Black' +exec-once = gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' +exec-once = xrdb -load "$XDG_CONFIG_HOME"/X11/xresources +#exec-once = com.github.wwmm.easyeffects +exec-once = dunst +exec-once = hypridle +exec-once = xwayland-satellite :1 +exec-once = bl-save +#exec-once = mpd +#}}} + +#{{{ env +# Environment variables set at launch +env = HYPRCURSOR_THEME,theme_BreezeX-Black +env = HYPRCURSOR_SIZE,32 +env = XCURSOR_THEME,BreezeX-Black +env = XCURSOR_SIZE,32 +env = DISPLAY=:1 #}}} # Source a file (multi-file configs) # source = ~/.config/hypr/myColors.conf +# Debug {{{ +debug { + enable_stdout_logs = false + disable_logs = true + full_cm_proto = true +} +# }}} + +# device {{{ +$LAPTOP_TP_ENABLED = true +device { + name = synps/2-synaptics-touchpad + enabled = $LAPTOP_TP_ENABLED +} +# }}} + #{{{ Input options # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ input { @@ -33,7 +78,13 @@ input { follow_mouse = 1 mouse_refocus = false touchpad { - natural_scroll = no + disable_while_typing = true + natural_scroll = false + tap_button_map = "lrm" + clickfinger_behavior = true + tap-to-click = true + drag_lock = false + tap-and-drag = true } float_switch_override_focus = 0 sensitivity = 0 # -1.0 - 1.0, 0 means no modification. @@ -50,8 +101,13 @@ general { #col.inactive_border = rgba(595959aa) col.active_border = rgba(198844ee) col.inactive_border = rgba(1b1d1cee) - layout = master - no_cursor_warps = false + layout = scrolling +} +#}}} + +#{{{ cursor +cursor { + no_warps = false } #}}} @@ -61,8 +117,9 @@ misc { disable_splash_rendering = true enable_swallow = true swallow_regex = ^(kitty)$ - vfr = false - vrr = true + swallow_exception_regex = ^(wev|.*ueberzug|n?vi?m? .*|.*dragon.*)$ + vfr = true + vrr = 3 } #}}} @@ -70,10 +127,6 @@ misc { decoration { # See https://wiki.hyprland.org/Configuring/Variables/ for more rounding = 10 - drop_shadow = yes - shadow_range = 4 - shadow_render_power = 3 - col.shadow = rgba(1a1a1aee) #{{{ Blur options blur { enabled = true @@ -83,13 +136,21 @@ decoration { xray = true } #}}} + #{{{ Shadow options + shadow { + enabled = false + range = 4 + render_power = 3 + color = 0xee1a1a1a + } + #}}} } #}}} #{{{ Animations options animations { - enabled = no + enabled = yes # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = myBezier, 0.05, 0.9, 0.1, 1.05 animation = windows, 1, 7, myBezier @@ -115,11 +176,13 @@ master { special_scale_factor = 0.55 mfact = 0.55 # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more - new_is_master = false - new_on_top = true - no_gaps_when_only = false + new_status = slave + new_on_top = false + new_on_active = before + #no_gaps_when_only = false orientation = left inherit_fullscreen = true + drop_at_cursor = true } #}}} @@ -131,45 +194,63 @@ gestures { #}}} #{{{ plugin options -#plugin { -# split-monitor-workspaces { -# count = 9 -# } -#} +plugin { + hyprsplit { + num_workspaces = 9 + persistent_workspaces = true + } + + hyprscrolling { + fullscreen_on_one_column = true + column_width = 0.5 + explicit_column_widths = 0.25, 0.333, 0.5, 0.667, 0.75, 1.0 + focus_fit_method = 1 + follow_focus = true + } +} #}}} #{{{ Windowrules # Example windowrule v1 # windowrule = float, ^(kitty)$ # Example windowrule v2 -# windowrulev2 = float, class:^(kitty)$, title:^(kitty)$ +# windowrule = float, class:^(kitty)$, title:^(kitty)$ # See https://wiki.hyprland.org/Configuring/Window-Rules/ for more -windowrule = windowdance, title:^(Rhythm Doctor)$ -windowrule = fullscreen, ^(Xephyr)$ +windowrule = fullscreen, class:^(Xephyr)$ windowrule = float, title:^(LibreWolf - Choose User Profile)$ windowrule = float, class:^(xdg-desktop-portal-gtk) +windowrule = float, title:^(UNDERTALE)$ windowrule = float, class:^(Tk)$ -windowrule = workspace 2, title:^(REAPER .*initializing.*)$ -windowrulev2 = stayfocused, title:^()$,class:^(steam)$ -windowrulev2 = minsize 1 1, title:^()$,class:^(steam)$ +windowrule = float, class:^(lxqt-policykit-agent)$ +windowrulev2 = stayfocused, title:^()$, class:^(steam)$ +windowrulev2 = minsize 1 1, title:^()$, class:^(steam)$ windowrulev2 = stayfocused, title:^(menu)$,class:^(yabridge-host.exe.so)$ windowrulev2 = minsize 1 1, title:^(menu)$,class:^(yabridge-host.exe.so)$ +windowrulev2 = float, class:^(yabridge-host.exe.so)$, title:^(menu)$ +windowrulev2 = float, floating:0, title:^(menu*) +windowrule = workspace 2, title:^(REAPER .*initializing.*)$ windowrulev2 = tile, class:^(REAPER)$, title:^(.*REAPER v[0-9.]* - Licensed for personal/small business use)$ +windowrule = tile, class:^(WebApp-Qobuz[0-9]*)$ +windowrulev2 = float, title:^(menu)$ windowrulev2 = move cursor -50% -50%, class:^(yabridge-host.exe.so)$, title:^(menu)$ #windowrulev2 = nofocus, class:^(yabridge-host.exe.so)$, title:^(\s*)$ #windowrulev2 = move cursor -50% -50%, class:^(REAPER)$, title:^(Snap/Grid Settings)$ #windowrulev2 = move cursor -50% -50%, class:^(REAPER)$, title:^(Routing for track [0-9]*)$ #windowrulev2 = move cursor -50% -50%, class:^(REAPER)$, title:^(Metronome and pre-roll settings)$ -windowrulev2 = tile, class:^(WebApp-Qobuz[0-9]*)$ #windowrulev2 = move cursor -50% -50%, class:^(yabridge-host.exe.so)$, title:^(menu)$ #windowrulev2 = nofocus, class:^(yabridge-host.exe.so)$, title:^(\s*)$ #windowrulev2 = move cursor -50% -50%, class:^(yabridge-host.exe.so)$, title:^(\s*)$ #windowrulev2 = move cursor -50% -50%, class:^(REAPER)$, title:^(Snap/Grid Settings)$ #windowrulev2 = move cursor -50% -50%, class:^(REAPER)$, title:^(Routing for track [0-9]*)$ -#windowrulev2 = float,floating:0, title:^(menu)$ +#windowrulev2 = float, floating:0, title:^(menu)$ #windowrulev2 = forceinput, title:^(menu)$ -#windowrulev2 = windowdance, title:^(menu)$ -#windowrulev2 = nofocus, title:^(menu)$, class:^(yabridge\-host\.exe\.so)$ +windowrulev2 = workspace special:easyeffects silent, class: ^(com\.github\.wwmm\.easyeffects)$ +# Fix brave xray menus +windowrulev2 = xray 0, class: ^(\s*), title: ^(\s*)$ +#}}} + +#{{{ Layerrules +layerrule = blur, waybar #}}} #{{{ Mods @@ -184,39 +265,46 @@ $secdMod = ALT #}}} #{{{ Master layout binds -# Master layout binds -bind = $mainMod+SHIFT, Return, layoutmsg, swapwithmaster master #MASTER -bind = $mainMod+SHIFT, J, layoutmsg, swapnext #MASTER -bind = $mainMod+SHIFT, K, layoutmsg, swapprev #MASTER -bind = $mainMod+SHIFT, H, layoutmsg, addmaster #MASTER -bind = $mainMod+SHIFT, L, layoutmsg, removemaster #MASTER -binde = $mainMod, J, layoutmsg, cyclenext #MASTER -binde = $mainMod, K, layoutmsg, cycleprev #MASTER -binde = $mainMod, H, splitratio, -0.01 #MASTER -binde = $mainMod, L, splitratio, +0.01 #MASTER -bind = $mainMod+SHIFT, O, splitratio, exact 0.55 #MASTER -bind = $mainMod, O, splitratio, exact 0.69 #MASTER -#}}} - -#{{{ Dwindle layout binds -# Dwindle layout binds -#bind = $mainMod, P, pseudo, #DWINDLE -#bind = $mainMod $secdMod, S, togglesplit, #DWINDLE -# Move focus with mainMod + HJKL -#bind = $mainMod, H, movefocus, l #DWINDLE -#bind = $mainMod, L, movefocus, r #DWINDLE -#bind = $mainMod, K, movefocus, u #DWINDLE -#bind = $mainMod, J, movefocus, d #DWINDLE -# Move window with mainMod + HJKL -#bind = $mainMod SHIFT, L, movewindow, r #DWINDLE -#bind = $mainMod SHIFT, H, movewindow, l #DWINDLE -#bind = $mainMod SHIFT, J, movewindow, d #DWINDLE -#bind = $mainMod SHIFT, K, movewindow, u #DWINDLE -# Resize clients with mainMod + secdMod + HJKL -#binde = $mainMod $secdMod, L, resizeactive, 10 0 #DWINDLE -#binde = $mainMod $secdMod, H, resizeactive, -10 0 #DWINDLE -#binde = $mainMod $secdMod, K, resizeactive, 0 -10 #DWINDLE -#binde = $mainMod $secdMod, J, resizeactive, 0 10 #DWINDLE +## Master layout binds +#bind = $mainMod+SHIFT, Return, layoutmsg, swapwithmaster master #MASTER +#bind = $mainMod+SHIFT, J, layoutmsg, swapnext #MASTER +#bind = $mainMod+SHIFT, K, layoutmsg, swapprev #MASTER +#bind = $mainMod+SHIFT, H, layoutmsg, addmaster #MASTER +#bind = $mainMod+SHIFT, L, layoutmsg, removemaster #MASTER +#binde = $mainMod, J, layoutmsg, cyclenext #MASTER +#binde = $mainMod, K, layoutmsg, cycleprev #MASTER +#binde = $mainMod, H, splitratio, -0.01 #MASTER +#binde = $mainMod, L, splitratio, +0.01 #MASTER +#bind = $mainMod+SHIFT, O, splitratio, exact 0.55 #MASTER +#bind = $mainMod, O, splitratio, exact 0.69 #MASTER +#}}} + +#{{{ hyprscrolling layout binds +# hyprscrolling layout binds +#bind = $mainMod+SHIFT, H, layoutmsg, move -1 #HYPRSCROLLING +#bind = $mainMod+SHIFT, L, layoutmsg, move +1 #HYPRSCROLLING +bind = $mainMod+SHIFT, H, layoutmsg, movewindowto l #HYPRSCROLLING +bind = $mainMod+SHIFT, J, layoutmsg, movewindowto d #HYPRSCROLLING +bind = $mainMod+SHIFT, K, layoutmsg, movewindowto u #HYPRSCROLLING +bind = $mainMod+SHIFT, L, layoutmsg, movewindowto r #HYPRSCROLLING +bind = $mainMod+CONTROL, H, exec, hyprswap.sh -l +bind = $mainMod+CONTROL, L, exec, hyprswap.sh -r +#bind = $mainMod+SHIFT, H, movewindow, l #HYPRSCROLLING +#bind = $mainMod+SHIFT, L, movewindow, r #HYPRSCROLLING +#bind = $mainMod+SHIFT, K, movewindow, u #HYPRSCROLLING +#bind = $mainMod+SHIFT, J, movewindow, d #HYPRSCROLLING +bind = $mainMod, H, layoutmsg, focus l #HYPRSCROLLING +bind = $mainMod, J, layoutmsg, focus d #HYPRSCROLLING +bind = $mainMod, K, layoutmsg, focus u #HYPRSCROLLING +bind = $mainMod, L, layoutmsg, focus r #HYPRSCROLLING +bind = $mainMod+SHIFT, R, layoutmsg, colresize +conf #HYPRSCROLLING +bind = $mainMod+SHIFT, Return, layoutmsg, promote #HYPRSCROLLING +#}}} + +#{{{ tab binds +bind = $mainMod+ALT, O, togglegroup +bind = $mainMod+ALT, J, changegroupactive, f +bind = $mainMod+ALT, K, changegroupactive, b #}}} #{{{ Group binds @@ -230,6 +318,10 @@ bind = $mainMod, O, splitratio, exact 0.69 #MASTER #bind = $mainMod CONTROL, K, moveintogroup, u #}}} +#{{{ Device binds +bind = $mainMod, Backspace, exec, touchpad.sh +#}}} + #{{{ WC binds bind = $mainMod SHIFT, Q, killactive, bind = $mainMod SHIFT, E, exit, @@ -241,76 +333,79 @@ bind = $mainMod, N, exec, pypr toggle_special bind = $mainMod SHIFT, N, togglespecialworkspace, minimized #}}} -#{{{ Workspace binds (using split-monitor-workspaces plugin!) +#{{{ Workspace binds (using hyprsplit plugin!) # Switch workspaces with mainMod + [0-9] -#bind = $mainMod, 1, split-workspace, 1 -#bind = $mainMod, 2, split-workspace, 2 -#bind = $mainMod, 3, split-workspace, 3 -#bind = $mainMod, 4, split-workspace, 4 -#bind = $mainMod, 5, split-workspace, 5 -#bind = $mainMod, 6, split-workspace, 6 -#bind = $mainMod, 7, split-workspace, 7 -#bind = $mainMod, 8, split-workspace, 8 -#bind = $mainMod, 9, split-workspace, 9 +bind = $mainMod, 1, split:workspace, 1 +bind = $mainMod, 2, split:workspace, 2 +bind = $mainMod, 3, split:workspace, 3 +bind = $mainMod, 4, split:workspace, 4 +bind = $mainMod, 5, split:workspace, 5 +bind = $mainMod, 6, split:workspace, 6 +bind = $mainMod, 7, split:workspace, 7 +bind = $mainMod, 8, split:workspace, 8 +bind = $mainMod, 9, split:workspace, 9 # Move active window to a workspace with mainMod + SHIFT + [0-9] -#bind = $mainMod SHIFT, 1, split-movetoworkspacesilent, 1 -#bind = $mainMod SHIFT, 2, split-movetoworkspacesilent, 2 -#bind = $mainMod SHIFT, 3, split-movetoworkspacesilent, 3 -#bind = $mainMod SHIFT, 4, split-movetoworkspacesilent, 4 -#bind = $mainMod SHIFT, 5, split-movetoworkspacesilent, 5 -#bind = $mainMod SHIFT, 6, split-movetoworkspacesilent, 6 -#bind = $mainMod SHIFT, 7, split-movetoworkspacesilent, 7 -#bind = $mainMod SHIFT, 8, split-movetoworkspacesilent, 8 -#bind = $mainMod SHIFT, 9, split-movetoworkspacesilent, 9 -#bind = $mainMod CONTROL SHIFT, 1, split-movetoworkspace, 1 -#bind = $mainMod CONTROL SHIFT, 2, split-movetoworkspace, 2 -#bind = $mainMod CONTROL SHIFT, 3, split-movetoworkspace, 3 -#bind = $mainMod CONTROL SHIFT, 4, split-movetoworkspace, 4 -#bind = $mainMod CONTROL SHIFT, 5, split-movetoworkspace, 5 -#bind = $mainMod CONTROL SHIFT, 6, split-movetoworkspace, 6 -#bind = $mainMod CONTROL SHIFT, 7, split-movetoworkspace, 7 -#bind = $mainMod CONTROL SHIFT, 8, split-movetoworkspace, 8 -#bind = $mainMod CONTROL SHIFT, 9, split-movetoworkspace, 9 -#bind = $mainMod, mouse_down, split-workspace, e+1 -#bind = $mainMod, mouse_up, split-workspace, e-1 -#bind = $mainMod, comma, split-changemonitor, +1 -#bind = $mainMod, period, split-changemonitor, -1 -#}}} - -#{{{ Workspace binds (not using split-monitor-workspaces plugin!) -# Switch workspaces with mainMod + [0-9] -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -# Move active window to a workspace with mainMod + SHIFT + [0-9] -bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1 -bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2 -bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3 -bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4 -bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5 -bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6 -bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7 -bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8 -bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9 -bind = $mainMod CONTROL SHIFT, 1, movetoworkspace, 1 -bind = $mainMod CONTROL SHIFT, 2, movetoworkspace, 2 -bind = $mainMod CONTROL SHIFT, 3, movetoworkspace, 3 -bind = $mainMod CONTROL SHIFT, 4, movetoworkspace, 4 -bind = $mainMod CONTROL SHIFT, 5, movetoworkspace, 5 -bind = $mainMod CONTROL SHIFT, 6, movetoworkspace, 6 -bind = $mainMod CONTROL SHIFT, 7, movetoworkspace, 7 -bind = $mainMod CONTROL SHIFT, 8, movetoworkspace, 8 -bind = $mainMod CONTROL SHIFT, 9, movetoworkspace, 9 -bind = $mainMod, mouse_down, workspace, e+1 -bind = $mainMod, mouse_up, workspace, e-1 -#bind = $mainMod, comma, split-changemonitor, +1 -#bind = $mainMod, period, split-changemonitor, -1 +bind = $mainMod SHIFT, 1, split:movetoworkspacesilent, 1 +bind = $mainMod SHIFT, 2, split:movetoworkspacesilent, 2 +bind = $mainMod SHIFT, 3, split:movetoworkspacesilent, 3 +bind = $mainMod SHIFT, 4, split:movetoworkspacesilent, 4 +bind = $mainMod SHIFT, 5, split:movetoworkspacesilent, 5 +bind = $mainMod SHIFT, 6, split:movetoworkspacesilent, 6 +bind = $mainMod SHIFT, 7, split:movetoworkspacesilent, 7 +bind = $mainMod SHIFT, 8, split:movetoworkspacesilent, 8 +bind = $mainMod SHIFT, 9, split:movetoworkspacesilent, 9 +bind = $mainMod CONTROL SHIFT, 1, split:movetoworkspace, 1 +bind = $mainMod CONTROL SHIFT, 2, split:movetoworkspace, 2 +bind = $mainMod CONTROL SHIFT, 3, split:movetoworkspace, 3 +bind = $mainMod CONTROL SHIFT, 4, split:movetoworkspace, 4 +bind = $mainMod CONTROL SHIFT, 5, split:movetoworkspace, 5 +bind = $mainMod CONTROL SHIFT, 6, split:movetoworkspace, 6 +bind = $mainMod CONTROL SHIFT, 7, split:movetoworkspace, 7 +bind = $mainMod CONTROL SHIFT, 8, split:movetoworkspace, 8 +bind = $mainMod CONTROL SHIFT, 9, split:movetoworkspace, 9 +#bind = $mainMod, mouse_down, split:workspace, e+1 +#bind = $mainMod, mouse_up, split:workspace, e-1 +bind = $mainMod, G, split:grabroguewindows +bind = $mainMod, comma, focusmonitor, -1 +bind = $mainMod, period, focusmonitor, +1 +bind = $mainMod SHIFT, comma, movewindow, mon:-1 +bind = $mainMod SHIFT, period, movewindow, mon:+1 +#}}} + +#{{{ Workspace binds (not using hyprsplit plugin) +## Switch workspaces with mainMod + [0-9] +#bind = $mainMod, 1, workspace, 1 +#bind = $mainMod, 2, workspace, 2 +#bind = $mainMod, 3, workspace, 3 +#bind = $mainMod, 4, workspace, 4 +#bind = $mainMod, 5, workspace, 5 +#bind = $mainMod, 6, workspace, 6 +#bind = $mainMod, 7, workspace, 7 +#bind = $mainMod, 8, workspace, 8 +#bind = $mainMod, 9, workspace, 9 +## Move active window to a workspace with mainMod + SHIFT + [0-9] +#bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1 +#bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2 +#bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3 +#bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4 +#bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5 +#bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6 +#bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7 +#bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8 +#bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9 +#bind = $mainMod CONTROL SHIFT, 1, movetoworkspace, 1 +#bind = $mainMod CONTROL SHIFT, 2, movetoworkspace, 2 +#bind = $mainMod CONTROL SHIFT, 3, movetoworkspace, 3 +#bind = $mainMod CONTROL SHIFT, 4, movetoworkspace, 4 +#bind = $mainMod CONTROL SHIFT, 5, movetoworkspace, 5 +#bind = $mainMod CONTROL SHIFT, 6, movetoworkspace, 6 +#bind = $mainMod CONTROL SHIFT, 7, movetoworkspace, 7 +#bind = $mainMod CONTROL SHIFT, 8, movetoworkspace, 8 +#bind = $mainMod CONTROL SHIFT, 9, movetoworkspace, 9 +#bind = $mainMod, comma, focusmonitor, -1 +#bind = $mainMod, period, focusmonitor, +1 +#bind = $mainMod SHIFT, comma, movewindow, mon:-1 +#bind = $mainMod SHIFT, period, movewindow, mon:+1 #}}} #{{{ Mouse binds @@ -331,11 +426,12 @@ submap = reset #}}} #{{{ Menu bindings -bind = $mainMod, R, exec, exec sh -c "$(tofi-drun -c ~/.config/tofi/themes/dmenu_vertical --prompt-text Run:)" -bind = $mainMod, D, exec, exec sh -c "$(tofi-run -c ~/.config/tofi/themes/dmenu_vertical --prompt-text Run:)" +bind = $mainMod, E, exec, sh -c "tofi-drun --drun-launch=true -c $HOME/.config/tofi/themes/dmenu_vertical" +bind = $mainMod, D, exec, sh -c "$(tofi-run -c $HOME/.config/tofi/themes/dmenu_vertical)" +bind = $mainMod, R, exec, rs bind = $mainMod $secdMod, Q, exec, qbc bind = $mainMod $secdMod, W, exec, lwc -bind = $mainMod $secdMod, E, exec, mbc +bind = $mainMod $secdMod, E, exec, brc bind = $mainMod $secdMod, R, exec, ffc bind = $mainMod $secdMod, 1, exec, bm bind = $mainMod $secdMod, comma, exec, dmount -p @@ -347,92 +443,29 @@ bind = $mainMod $secdMod, P, exec, passmenu #{{{ Misc bindings bind = $mainMod, Return, exec, kitty -bind = $mainMod $secdMod, F, exec, kitty -e lf -bind = $mainMod, W, exec, t waybar +bind = $mainMod $secdMod, F, exec, kitty lf +bind = $mainMod, W, exec, pkill -USR1 waybar bind = $mainMod, Q, exec, loginctl lock-session bind = $mainMod $secdMod CONTROL, Q, exec, systemctl suspend bind = $mainMod SHIFT, G, exec, get-app-id -#bindr = , XF86AudioMicMute, exec, volsv -m -bind = $mainMod CONTROL, M, exec, volsv -m -bindr = $mainMod CONTROL, M, exec, volsv -m +bind = $mainMod Control, M, exec, volsv -m +#bind = $mainMod, Comma, exec, acpi-notify.sh #bind = $mainMod CONTROL, R, exec, startx -- /usr/bin/Xephyr -screen 1920x1080 :1 #}}} #{{{ Scratchpads -bind = $mainMod CONTROL, Z, exec, pypr toggle sphtop -$sphtop = ^(sphtop)$ -windowrule = float,$sphtop -windowrule = workspace special:sphtop silent,$sphtop -windowrule = size 50% 50%,$sphtop -windowrule = move 25% 25%,$sphtop -bind = $mainMod CONTROL, X, exec, pypr toggle spterm -$spterm = ^(spterm)$ -windowrule = float,$spterm -windowrule = workspace special:spterm silent,$dropterm -windowrule = size 50% 50%,$spterm -windowrule = move 25% 25%,$spterm -bind = $mainMod CONTROL, C, exec, pypr toggle sppmxr -$sppmxr = ^(sppmxr)$ -windowrule = float,$sppmxr -windowrule = workspace special:sppmxr silent,$sppmxr -windowrule = size 50% 50%,$sppmxr -windowrule = move 25% 25%,$sppmxr -bind = $mainMod CONTROL, V, exec, pypr toggle spblue -$spblue = ^(spblue)$ -windowrule = float,$spblue -windowrule = workspace special:spblue silent,$spblue -windowrule = size 50% 50%,$spblue -windowrule = move 25% 25%,$spblue -bind = $mainMod CONTROL, B, exec, pypr toggle spncmp -$spncmp = ^(spncmp)$ -windowrule = float,$spncmp -windowrule = workspace special:spncmp silent,$spncmp -windowrule = size 50% 50%,$spncmp -windowrule = move 25% 25%,$spncmp -bind = $mainMod CONTROL, A, exec, pypr toggle spmutt -$spmutt = ^(spmutt)$ -windowrule = float,$spmutt -windowrule = workspace special:spmutt silent,$spmutt -windowrule = size 50% 50%,$spmutt -windowrule = move 25% 25%,$spmutt -bind = $mainMod CONTROL, S, exec, pypr toggle spprof -$spprof = ^(spprof)$ -windowrule = float,$spprof -windowrule = workspace special:spprof silent,$spprof -windowrule = size 50% 50%,$spprof -windowrule = move 25% 25%,$spprof -bind = $mainMod CONTROL, D, exec, pypr toggle spirss -$spirss = ^(spirss)$ -windowrule = float,$spirss -windowrule = workspace special:spirss silent,$spirss -windowrule = size 50% 50%,$spirss -windowrule = move 25% 25%,$spirss -bind = $mainMod CONTROL, F, exec, pypr toggle sptodo -$sptodo = ^(sptodo)$ -windowrule = float,$sptodo -windowrule = workspace special:sptodo silent,$sptodo -windowrule = size 50% 50%,$sptodo -windowrule = move 25% 25%,$sptodo -bind = $mainMod CONTROL, G, exec, pypr toggle sptrmc -$sptrmc = ^(sptrmc)$ -windowrule = float,$sptrmc -windowrule = workspace special:sptrmc silent,$sptrmc -windowrule = size 50% 50%,$sptrmc -windowrule = move 25% 25%,$sptrmc - -bind = $mainMod CONTROL, Q, exec, pypr toggle qpwgraph -$spqpwg = ^(org\.rncbc\.qpwgraph)$ -windowrule = float,$spqpwg -windowrule = workspace special:spqpwg silent,$spqpwg -windowrule = size 50% 50%,$spqpwg -windowrule = move 25% 25%,$spqpwg - -bind = $mainMod CONTROL, E, togglespecialworkspace, speasy -$speasy = ^(com\.github\.wwmm\.easyeffects)$ -windowrule = float,$speasy -windowrule = workspace special:speasy silent,$speasy -windowrule = size 50% 50%,$speasy -windowrule = move 25% 25%,$speasy +bind = $mainMod CONTROL, Z, exec, hyprscratch toggle sphtop +bind = $mainMod CONTROL, X, exec, hyprscratch toggle spterm +bind = $mainMod CONTROL, C, exec, hyprscratch toggle sppmxr +bind = $mainMod CONTROL, V, exec, hyprscratch toggle spblue +bind = $mainMod CONTROL, B, exec, hyprscratch toggle spncmp +bind = $mainMod CONTROL, A, exec, hyprscratch toggle spmutt +bind = $mainMod CONTROL, S, exec, hyprscratch toggle spprof +bind = $mainMod CONTROL, D, exec, hyprscratch toggle spirss +bind = $mainMod CONTROL, F, exec, hyprscratch toggle spvimw +bind = $mainMod CONTROL, G, exec, hyprscratch toggle sptrmc +bind = $mainMod CONTROL, Q, exec, hyprscratch toggle helvum +bind = $mainMod CONTROL, E, exec, hyprscratch toggle easyeffects #}}} #{{{ OBS bindings diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..8ee636d --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,55 @@ +general { + hide_cursor = true + immediate_render = true +} + +animations { + enabled = false +} + +background { + monitor = + path = + color = rgba(0, 0, 0, 1.0) + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + #blur_passes = 0 # 0 disables blurring + #blur_size = 7 + #noise = 0.0117 + #contrast = 0.8916 + #brightness = 0.8172 + #vibrancy = 0.1696 + #vibrancy_darkness = 0.0 +} + +input-field { + monitor = + size = 200, 50 + outline_thickness = 3 + dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = false + dots_rounding = -1 # -1 default circle, -2 follow input-field rounding + outer_color = rgb(151515) + inner_color = rgb(200, 200, 200) + font_color = rgb(10, 10, 10) + fade_on_empty = true + fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered. + placeholder_text = <i>Input Password...</i> # Text rendered in the input box when it's empty. + hide_input = false + rounding = -1 # -1 means complete rounding (circle/oval) + check_color = rgb(204, 136, 34) + fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color + fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i> # can be set to empty + #fail_transition = 300 # transition time in ms between normal outer_color and fail_color + capslock_color = -1 + numlock_color = -1 + bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above) + invert_numlock = false # change color if numlock is off + swap_font_color = false # see below + + position = 0, -20 + halign = center + valign = center +} + diff --git a/hypr/hyprpaper.conf b/hypr/hyprpaper.conf index 69e5224..728c00c 100644 --- a/hypr/hyprpaper.conf +++ b/hypr/hyprpaper.conf @@ -1,2 +1,15 @@ -splash = false preload = ~/Pictures/background.png +#if more than one preload is desired then continue to preload other backgrounds +#preload = /path/to/next_image.png +# .. more preloads + +#set the default wallpaper(s) seen on inital workspace(s) --depending on the number of monitors used +wallpaper = eDP-1,~/Pictures/background.png +wallpaper = HDMI-A-1,~/Pictures/background.png +wallpaper = HDMI-A-2,~/Pictures/background.png +wallpaper = DP-1,~/Pictures/background.png +wallpaper = DP-2,~/Pictures/background.png +#if more than one monitor in use, can load a 2nd image +#wallpaper = monitor2,~/background.png +# .. more monitors +splash = false diff --git a/hypr/hyprscratch.conf b/hypr/hyprscratch.conf new file mode 100644 index 0000000..5964419 --- /dev/null +++ b/hypr/hyprscratch.conf @@ -0,0 +1,126 @@ +# Optional globals that apply to all scratchpads +daemon_options = clean +daemon_options = eager + +global_rules = size 50% 50% + +sphtop { + # Mandatory fields + title = sphtop + command = kitty -T sphtop htop + + # Optional fields + options = lazy + options = special +} + +spterm { + # Mandatory fields + title = spterm + command = kitty -T spterm + + # Optional fields + options = lazy + options = special +} + +sppmxr { + # Mandatory fields + title = sppmxr + command = kitty -T sppmxr pulsemixer + + # Optional fields + options = lazy + options = special +} + +spblue { + # Mandatory fields + title = spblue + command = kitty -T spblue bluetoothctl + + # Optional fields + options = lazy + options = special +} + +spncmp { + # Mandatory fields + title = spncmp + command = kitty -T spncmp ncmpcpp + + # Optional fields + options = lazy + options = special +} + +spmutt { + # Mandatory fields + title = spmutt + command = kitty -T spmutt neomutt + + # Optional fields + options = lazy + options = special +} + +spprof { + # Mandatory fields + title = spprof + command = kitty -T spprof profanity + + # Optional fields + options = lazy + options = special +} + +spirss { + # Mandatory fields + title = spirss + command = kitty -T spirss irssi + + # Optional fields + options = lazy + options = special +} + +spvimw { + # Mandatory fields + title = spvimw + command = kitty -T spvimw nvim +VimwikiIndex + + # Optional fields + options = lazy + options = special +} + +sptrmc { + # Mandatory fields + title = sptrmc + command = kitty -T sptrmc tremc + + # Optional fields + options = lazy + options = special +} + +helvum { + # Mandatory fields + title = Helvum - Pipewire Patchbay + command = helvum + + # Optional fields + options = lazy + options = special +} + +easyeffects { + # Mandatory fields + title = Easy Effects + command = easyeffects + + # Optional fields + options = lazy + options = special +} + diff --git a/hypr/pyprland.toml b/hypr/pyprland.toml index dfa2aab..cacd7f1 100644 --- a/hypr/pyprland.toml +++ b/hypr/pyprland.toml @@ -1,103 +1,5 @@ [pyprland] plugins = [ - "scratchpads", "toggle_special", "expose" ] - -[scratchpads.sphtop] -animation = "" -command = "kitty --class sphtop htop" -class = "sphtop" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spterm] -animation = "" -command = "kitty --class spterm" -class = "spterm" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.sppmxr] -animation = "" -command = "kitty --class sppmxr pulsemixer" -class = "sppmxr" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spblue] -animation = "" -command = "kitty --class spblue bluetoothctl" -class = "spblue" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spncmp] -animation = "" -command = "kitty --class spncmp ncmpcpp" -class = "spncmp" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spmutt] -animation = "" -command = "kitty --class spmutt neomutt" -class = "spmutt" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spprof] -animation = "" -command = "kitty --class spprof profanity" -class = "spprof" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.spirss] -animation = "" -command = "kitty --class spirss irssi" -class = "spirss" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.sptodo] -animation = "" -command = "kitty --class sptodo todo" -class = "sptodo" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.sptrmc] -animation = "" -command = "kitty --class sptrmc tremc" -class = "sptremc" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.qpwgraph] -animation = "" -command = "qpwgraph" -class = "org.rncbc.qpwgraph" -lazy = true -size = "50% 50%" -position = "25% 25%" - -[scratchpads.easyeffects] -animation = "" -command = "flatpak run com.github.wwmm.easyeffects" -class = "com.github.wwmm.easyeffects" -lazy = true -size = "50% 50%" -position = "25% 25%" -unfocus = "hide" diff --git a/installers/vimplug_nvim.sh b/installers/vimplug_nvim.sh deleted file mode 100755 index feddd03..0000000 --- a/installers/vimplug_nvim.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ - https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim diff --git a/installers/wc b/installers/wc new file mode 100755 index 0000000..bfdb299 --- /dev/null +++ b/installers/wc @@ -0,0 +1,6 @@ +#!/bin/sh + +pgrep -x Hyprland && make install-hyprplugins +pgrep -x scroll && make install-scrollconf + + diff --git a/kitty/kitty.conf b/kitty/kitty.conf index 6207c2f..7afcb30 100644 --- a/kitty/kitty.conf +++ b/kitty/kitty.conf @@ -6,7 +6,7 @@ #: individual font faces and even specify special fonts for particular #: characters. -font_family mononoki Nerd Font +font_family JetBrainsMono Nerd Font bold_font auto italic_font auto bold_italic_font auto @@ -24,7 +24,7 @@ bold_italic_font auto #: italic_font Operator Mono Book Italic #: bold_italic_font Operator Mono Medium Italic -font_size 10.0 +font_size 15.0 #: Font size (in pts) @@ -879,7 +879,7 @@ resize_draw_strategy static #: insensitive, from the set [0-9A-Z]. Specify your preference as a #: string of characters. -# confirm_os_window_close -1 +confirm_os_window_close 0 #: Ask for confirmation when closing an OS window or a tab with at #: least this number of kitty windows in it by window manager (e.g. @@ -913,7 +913,7 @@ resize_draw_strategy static #: The second number is the margin between the tab bar and the #: contents of the current tab. -# tab_bar_style fade +tab_bar_style powerline #: The tab bar style, can be one of: @@ -1833,7 +1833,7 @@ map kitty_mod+g show_last_command_output #:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R -map f1 launch --stdin-source=@last_cmd_output --type=background wl-copy +#:: map f1 launch --stdin-source=@last_cmd_output --type=background wl-copy #:: To get the output of the first command on the screen, use #:: @first_cmd_output_on_screen. To get the output of the last jumped diff --git a/lf/cleaner b/lf/cleaner new file mode 100755 index 0000000..af197ee --- /dev/null +++ b/lf/cleaner @@ -0,0 +1,2 @@ +#!/bin/sh +exec kitten icat --clear --stdin no --transfer-mode memory </dev/null >/dev/tty @@ -7,9 +7,10 @@ main() { > "$FIFO_UEBERZUG" ;; "draw") - declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" \ - [x]="$3" [y]="$4" [max_width]="$5" [max_height]="$6" \ - [path]="$2") > "$FIFO_UEBERZUG" + kitten icat --stdin no --transfer-mode memory --place"${5}x${6}@${3}x${4}" "$1" /dev/tty + #declare -p -A cmd=([action]=add [identifier]="$ID_PREVIEW" \ + #[x]="$3" [y]="$4" [max_width]="$5" [max_height]="$6" \ + #[path]="$2") > "$FIFO_UEBERZUG" ;; "*") echo "Unknown command: '$1', '$2'" ;; esac @@ -1,9 +1,8 @@ set ratios 1:2:3 -set cleaner ctpvclear -set previewer ctpv -&ctpv -s $id . -&ctpvquit $id +set previewer ~/.config/lf/previewer +set cleaner ~/.config/lf/cleaner # Basic Settings +set sixel true set preview true set drawbox false set icons true @@ -51,9 +50,9 @@ cmd chmod ${{ printf "Mode Bits: " read ans - for file in "$fx" + echo "$fx" | while read file do - chmod $ans $file + chmod "$ans" "$file" done }} @@ -321,7 +320,7 @@ map C clear map U unselect # Movement -map g. cd "/home/zachir" +map g. cd "~" ## PATHS map gE. cd "/etc" map gO. cd "/opt" @@ -330,64 +329,65 @@ map gR cd "/" map gU. cd "/usr" map gUs cd "/usr/share" map gV. cd "/var" -map gaw cd "/home/zachir/.config/awesome" -map gb. cd "/home/zachir/.local/bin" -map gbb cd "/home/zachir/.local/bin/blocks" -map gbf cd "/home/zachir/.local/bin/slatpak-sc" -map gbg cd "/home/zachir/.local/bin/generics" -map gbi cd "/home/zachir/.local/bin/ignore" -map gbsc cd "/home/zachir/.local/bin/scripts" -map gbsh cd "/home/zachir/.local/bin/shortcmds" -map gbsp cd "/home/zachir/.local/bin/sp" -map gc cd "/home/zachir/.config" -map gdb cd "/home/zachir/.local/src/dwmbar" -map gdc cd "/home/zachir/Documents" -map gdl cd "/home/zachir/.local/src/dwl" -map gdm cd "/home/zachir/.local/src/dmenu" -map gdo cd "/home/zachir/Downloads" -map gdp cd "/home/zachir/Downloads/plugin/zachir_librem.one" -map gdw cd "/home/zachir/Downloads/wine" -map ge cd "/home/zachir/Desktop" -map gf cd "/home/zachir/.var/app" -map gh cd "/home/zachir/.config/hypr" -map glb cd "/home/zachir/.local/bin" -map glc cd "/home/zachir/Games/cache" -map glf cd "/home/zachir/.config/lf" -map gls cd "/home/zachir/.local/share" -map gn3 cd "/home/zachir/.vst3/native" -map gns cd "/home/zachir/.vst/native" -map gnv cd "/home/zachir/.config/nvim" -map gp cd "/home/zachir/Pictures" -map gqb cd "/home/zachir/.config/qutebrowser" -map gqp cd "/home/zachir/.local/share/qutebrowser-profiles" -map gre cd "/home/zachir/.local/src" +map gaw cd "~/.config/awesome" +map gb. cd "~/.local/bin" +map gbb cd "~/.local/bin/blocks" +map gbf cd "~/.local/bin/slatpak-sc" +map gbg cd "~/.local/bin/generics" +map gbi cd "~/.local/bin/ignore" +map gbsc cd "~/.local/bin/scripts" +map gbsh cd "~/.local/bin/shortcmds" +map gbsp cd "~/.local/bin/sp" +map gc cd "~/.config" +map gdb cd "~/.local/src/dwmbar" +map gdc cd "~/Documents" +map gdl cd "~/.local/src/dwl" +map gdm cd "~/.local/src/dmenu" +map gdo cd "~/Downloads" +map gdp cd "~/Downloads/plugin/zachir_librem.one" +map gdw cd "~/Downloads/wine" +map ge cd "~/Desktop" +map gf cd "~/.var/app" +map gh cd "~/.config/hypr" +map glb cd "~/.local/bin" +map glc cd "~/Games/cache" +map glf cd "~/.config/lf" +map gls cd "~/.local/share" +map gn3 cd "~/.vst3/native" +map gns cd "~/.vst/native" +map gnv cd "~/.config/nvim" +map gp cd "~/Pictures" +map gqb cd "~/.config/qutebrowser" +map gqp cd "~/.local/share/qutebrowser-profiles" +map gre cd "~/.local/src" map grs cd "/etc/runit/sv" -map gsc cd "/home/zachir/.local/bin/scripts" -map gsh cd "/home/zachir/.config/sh" -map gsl cd "/home/zachir/.local/src/slock" +map gsc cd "~/.local/bin/scripts" +map gsh cd "~/.config/sh" +map gsl cd "~/.local/src/slock" map gss cd "/etc/s6/sv" -map gst cd "/home/zachir/.local/src/st" -map gsx cd "/home/zachir/.config/sxhkd" -map gtr cd "/home/zachir/.local/share/Trash/files" -map gurs cd "/home/zachir/.runit/sv" -map gv3. cd "/home/zachir/.vst3" -map gv3n cd "/home/zachir/.vst3/native" -map gv3y cd "/home/zachir/.vst3/yabridge" -map gv. cd "/home/zachir/var" -map gvi cd "/home/zachir/Videos" -map gvsn cd "/home/zachir/.vst/native" -map gvs. cd "/home/zachir/.vst" -map gvsy cd "/home/zachir/.vst/yabridge" -map gwdo cd "/home/zachir/.local/share/wineprefixes/default/drive_c/users/zachir/Downloads" -map gwa cd "/home/zachir/.local/src/wallpapers" -map gwd cd "/home/zachir/.local/share/wineprefixes/default" -map gwr cd "/home/zachir/.local/share/wineprefixes" -map gwv3 cd "/home/zachir/.winvst3" -map gwvs cd "/home/zachir/.winvst" -map gww cd "/home/zachir/.local/share/wineprefixes/work" -map gx cd "/home/zachir/.config/X11" -map gy3 cd "/home/zachir/.vst3/yabridge" -map gyb cd "/home/zachir/.cache/yay" -map gyc cd "/home/zachir/.config/yay" -map gzs cd "/home/zachir/.config/zsh" -map gzx cd "/home/zachir/Documents/zachir.xyz" +map gst cd "~/.local/src/st" +map gsx cd "~/.config/sxhkd" +map gtr cd "~/.local/share/Trash/files" +map gurs cd "~/.runit/sv" +map gv3. cd "~/.vst3" +map gv3n cd "~/.vst3/native" +map gv3y cd "~/.vst3/yabridge" +map gv. cd "~/var" +map gvi cd "~/Videos" +map gvsn cd "~/.vst/native" +map gvs. cd "~/.vst" +map gvsy cd "~/.vst/yabridge" +map gvw cd "~/.local/share/vimwiki" +map gwdo cd "~/.local/share/wineprefixes/default/drive_c/users/zachir/Downloads" +map gwa cd "~/.local/src/wallpapers" +map gwd cd "~/.local/share/wineprefixes/default" +map gwr cd "~/.local/share/wineprefixes" +map gwv3 cd "~/.winvst3" +map gwvs cd "~/.winvst" +map gww cd "~/.local/share/wineprefixes/work" +map gx cd "~/.config/X11" +map gy3 cd "~/.vst3/yabridge" +map gyb cd "~/.cache/yay" +map gyc cd "~/.config/yay" +map gzs cd "~/.config/zsh" +map gzx cd "~/Documents/zachir.xyz" diff --git a/lf/previewer b/lf/previewer new file mode 100755 index 0000000..24db043 --- /dev/null +++ b/lf/previewer @@ -0,0 +1,36 @@ +#!/bin/sh +draw() { + kitten icat --stdin no --transfer-mode memory --place "${w}x${h}@${x}x${y}" "$1" </dev/null >/dev/tty + exit 1 +} + +file="$1" +w="$2" +h="$3" +x="$4" +y="$5" + +case "$(file -Lb --mime-type "$file")" in + image/*) + draw "$file" + ;; + video/*) + # vidthumb is from here: + # https://raw.githubusercontent.com/duganchen/kitty-pistol-previewer/main/vidthumb + draw "$(vidthumb "$file")" + ;; + application/pdf) + CACHE=$(mktemp /tmp/thumbcache.XXXXX) + pdftoppm -png -f 1 -singlefile "$1" "$CACHE" + draw "$CACHE.png" + rm -f "$CACHE" "$CACHE.png" + ;; + application/epub+zip|application/epub) + CACHE=$(mktemp /tmp/thumbcache.XXXXX) + epub-thumbnailer "$1" "$CACHE" 1024 + $HOME/.config/lf/image draw "$CACHE" + rm -f "$CACHE" "$CACHE.png" + ;; +esac + +pistol "$file" diff --git a/mpd/mpd.conf b/mpd/mpd.conf index e26dbd1..6fdf1b0 100644 --- a/mpd/mpd.conf +++ b/mpd/mpd.conf @@ -79,7 +79,7 @@ sticker_file "~/.config/mpd/sticker.sql" # systemd socket activiation is in use. # # For network -# bind_to_address "127.0.0.1" +bind_to_address "127.0.0.1" # # And for Unix Socket bind_to_address "~/.config/mpd/socket" @@ -275,11 +275,18 @@ input { # # An example of a pulseaudio output (streaming to a remote pulseaudio server) # +#audio_output { +# type "pulse" +# name "My Pulse Output" +## server "remote_server" # optional +## sink "remote_server_sink" # optional +#} +# +# Pipewire output +# audio_output { - type "pulse" - name "My Pulse Output" -# server "remote_server" # optional -# sink "remote_server_sink" # optional + type "pipewire" + name "Pipewire Sound Server" } audio_output { diff --git a/mpv/mpv.conf b/mpv/mpv.conf index 5521474..649af35 100644 --- a/mpv/mpv.conf +++ b/mpv/mpv.conf @@ -1,5 +1,5 @@ save-position-on-quit -osc=no ao=pipewire,pulse,jack vo=gpu +hwdec=yes audio-channels=2 diff --git a/mpv/scripts/quality-menu-osc.lua b/mpv/scripts/quality-menu-osc.lua deleted file mode 100644 index 0a2f6c2..0000000 --- a/mpv/scripts/quality-menu-osc.lua +++ /dev/null @@ -1,2911 +0,0 @@ -local assdraw = require 'mp.assdraw' -local msg = require 'mp.msg' -local opt = require 'mp.options' -local utils = require 'mp.utils' - --- --- Parameters --- --- default user option values --- do not touch, change them in osc.conf -local user_opts = { - showwindowed = true, -- show OSC when windowed? - showfullscreen = true, -- show OSC when fullscreen? - idlescreen = true, -- show mpv logo on idle - scalewindowed = 1, -- scaling of the controller when windowed - scalefullscreen = 1, -- scaling of the controller when fullscreen - scaleforcedwindow = 2, -- scaling when rendered on a forced window - vidscale = true, -- scale the controller with the video? - valign = 0.8, -- vertical alignment, -1 (top) to 1 (bottom) - halign = 0, -- horizontal alignment, -1 (left) to 1 (right) - barmargin = 0, -- vertical margin of top/bottombar - boxalpha = 80, -- alpha of the background box, - -- 0 (opaque) to 255 (fully transparent) - hidetimeout = 500, -- duration in ms until the OSC hides if no - -- mouse movement. enforced non-negative for the - -- user, but internally negative is "always-on". - fadeduration = 200, -- duration of fade out in ms, 0 = no fade - deadzonesize = 0.5, -- size of deadzone - minmousemove = 0, -- minimum amount of pixels the mouse has to - -- move between ticks to make the OSC show up - iamaprogrammer = false, -- use native mpv values and disable OSC - -- internal track list management (and some - -- functions that depend on it) - layout = "bottombar", - seekbarstyle = "bar", -- bar, diamond or knob - seekbarhandlesize = 0.6, -- size ratio of the diamond and knob handle - seekrangestyle = "inverted",-- bar, line, slider, inverted or none - seekrangeseparate = true, -- whether the seekranges overlay on the bar-style seekbar - seekrangealpha = 200, -- transparency of seekranges - seekbarkeyframes = true, -- use keyframes when dragging the seekbar - title = "${media-title}", -- string compatible with property-expansion - -- to be shown as OSC title - tooltipborder = 1, -- border of tooltip in bottom/topbar - timetotal = false, -- display total time instead of remaining time? - timems = false, -- display timecodes with milliseconds? - tcspace = 100, -- timecode spacing (compensate font size estimation) - visibility = "auto", -- only used at init to set visibility_mode(...) - boxmaxchars = 80, -- title crop threshold for box layout - boxvideo = false, -- apply osc_param.video_margins to video - windowcontrols = "auto", -- whether to show window controls - windowcontrols_alignment = "right", -- which side to show window controls on - greenandgrumpy = false, -- disable santa hat - livemarkers = true, -- update seekbar chapter markers on duration change - chapters_osd = true, -- whether to show chapters OSD on next/prev - playlist_osd = true, -- whether to show playlist OSD on next/prev - chapter_fmt = "Chapter: %s", -- chapter print format for seekbar-hover. "no" to disable - unicodeminus = false, -- whether to use the Unicode minus sign character -} - --- read options from config and command-line -opt.read_options(user_opts, "osc", function(list) update_options(list) end) - -local osc_param = { -- calculated by osc_init() - playresy = 0, -- canvas size Y - playresx = 0, -- canvas size X - display_aspect = 1, - unscaled_y = 0, - areas = {}, - video_margins = { - l = 0, r = 0, t = 0, b = 0, -- left/right/top/bottom - }, -} - -local osc_styles = { - bigButtons = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs50\\fnmpv-osd-symbols}", - smallButtonsL = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs19\\fnmpv-osd-symbols}", - smallButtonsLlabel = "{\\fscx105\\fscy105\\fn" .. mp.get_property("options/osd-font") .. "}", - smallButtonsR = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs30\\fnmpv-osd-symbols}", - topButtons = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs12\\fnmpv-osd-symbols}", - - elementDown = "{\\1c&H999999}", - timecodes = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs20}", - vidtitle = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs12\\q2}", - box = "{\\rDefault\\blur0\\bord1\\1c&H000000\\3c&HFFFFFF}", - - topButtonsBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\fnmpv-osd-symbols}", - smallButtonsBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs28\\fnmpv-osd-symbols}", - timecodesBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs27}", - timePosBar = "{\\blur0\\bord".. user_opts.tooltipborder .."\\1c&HFFFFFF\\3c&H000000\\fs30}", - vidtitleBar = "{\\blur0\\bord0\\1c&HFFFFFF\\3c&HFFFFFF\\fs18\\q2}", - - wcButtons = "{\\1c&HFFFFFF\\fs24\\fnmpv-osd-symbols}", - wcTitle = "{\\1c&HFFFFFF\\fs24\\q2}", - wcBar = "{\\1c&H000000}", -} - --- internal states, do not touch -local state = { - showtime, -- time of last invocation (last mouse move) - osc_visible = false, - anistart, -- time when the animation started - anitype, -- current type of animation - animation, -- current animation alpha - mouse_down_counter = 0, -- used for softrepeat - active_element = nil, -- nil = none, 0 = background, 1+ = see elements[] - active_event_source = nil, -- the "button" that issued the current event - rightTC_trem = not user_opts.timetotal, -- if the right timecode should display total or remaining time - tc_ms = user_opts.timems, -- Should the timecodes display their time with milliseconds - mp_screen_sizeX, mp_screen_sizeY, -- last screen-resolution, to detect resolution changes to issue reINITs - initREQ = false, -- is a re-init request pending? - marginsREQ = false, -- is a margins update pending? - last_mouseX, last_mouseY, -- last mouse position, to detect significant mouse movement - mouse_in_window = false, - message_text, - message_hide_timer, - fullscreen = false, - tick_timer = nil, - tick_last_time = 0, -- when the last tick() was run - hide_timer = nil, - cache_state = nil, - idle = false, - enabled = true, - input_enabled = true, - showhide_enabled = false, - dmx_cache = 0, - using_video_margins = false, - border = true, - maximized = false, - osd = mp.create_osd_overlay("ass-events"), - chapter_list = {}, -- sorted by time -} - -local window_control_box_width = 80 -local tick_delay = 0.03 - -local is_december = os.date("*t").month == 12 - --- --- Helperfunctions --- - -function kill_animation() - state.anistart = nil - state.animation = nil - state.anitype = nil -end - -function set_osd(res_x, res_y, text) - if state.osd.res_x == res_x and - state.osd.res_y == res_y and - state.osd.data == text then - return - end - state.osd.res_x = res_x - state.osd.res_y = res_y - state.osd.data = text - state.osd.z = 1000 - state.osd:update() -end - -local margins_opts = { - {"l", "video-margin-ratio-left"}, - {"r", "video-margin-ratio-right"}, - {"t", "video-margin-ratio-top"}, - {"b", "video-margin-ratio-bottom"}, -} - --- scale factor for translating between real and virtual ASS coordinates -function get_virt_scale_factor() - local w, h = mp.get_osd_size() - if w <= 0 or h <= 0 then - return 0, 0 - end - return osc_param.playresx / w, osc_param.playresy / h -end - --- return mouse position in virtual ASS coordinates (playresx/y) -function get_virt_mouse_pos() - if state.mouse_in_window then - local sx, sy = get_virt_scale_factor() - local x, y = mp.get_mouse_pos() - return x * sx, y * sy - else - return -1, -1 - end -end - -function set_virt_mouse_area(x0, y0, x1, y1, name) - local sx, sy = get_virt_scale_factor() - mp.set_mouse_area(x0 / sx, y0 / sy, x1 / sx, y1 / sy, name) -end - -function scale_value(x0, x1, y0, y1, val) - local m = (y1 - y0) / (x1 - x0) - local b = y0 - (m * x0) - return (m * val) + b -end - --- returns hitbox spanning coordinates (top left, bottom right corner) --- according to alignment -function get_hitbox_coords(x, y, an, w, h) - - local alignments = { - [1] = function () return x, y-h, x+w, y end, - [2] = function () return x-(w/2), y-h, x+(w/2), y end, - [3] = function () return x-w, y-h, x, y end, - - [4] = function () return x, y-(h/2), x+w, y+(h/2) end, - [5] = function () return x-(w/2), y-(h/2), x+(w/2), y+(h/2) end, - [6] = function () return x-w, y-(h/2), x, y+(h/2) end, - - [7] = function () return x, y, x+w, y+h end, - [8] = function () return x-(w/2), y, x+(w/2), y+h end, - [9] = function () return x-w, y, x, y+h end, - } - - return alignments[an]() -end - -function get_hitbox_coords_geo(geometry) - return get_hitbox_coords(geometry.x, geometry.y, geometry.an, - geometry.w, geometry.h) -end - -function get_element_hitbox(element) - return element.hitbox.x1, element.hitbox.y1, - element.hitbox.x2, element.hitbox.y2 -end - -function mouse_hit(element) - return mouse_hit_coords(get_element_hitbox(element)) -end - -function mouse_hit_coords(bX1, bY1, bX2, bY2) - local mX, mY = get_virt_mouse_pos() - return (mX >= bX1 and mX <= bX2 and mY >= bY1 and mY <= bY2) -end - -function limit_range(min, max, val) - if val > max then - val = max - elseif val < min then - val = min - end - return val -end - --- translate value into element coordinates -function get_slider_ele_pos_for(element, val) - - local ele_pos = scale_value( - element.slider.min.value, element.slider.max.value, - element.slider.min.ele_pos, element.slider.max.ele_pos, - val) - - return limit_range( - element.slider.min.ele_pos, element.slider.max.ele_pos, - ele_pos) -end - --- translates global (mouse) coordinates to value -function get_slider_value_at(element, glob_pos) - - local val = scale_value( - element.slider.min.glob_pos, element.slider.max.glob_pos, - element.slider.min.value, element.slider.max.value, - glob_pos) - - return limit_range( - element.slider.min.value, element.slider.max.value, - val) -end - --- get value at current mouse position -function get_slider_value(element) - return get_slider_value_at(element, get_virt_mouse_pos()) -end - -function countone(val) - if not (user_opts.iamaprogrammer) then - val = val + 1 - end - return val -end - --- align: -1 .. +1 --- frame: size of the containing area --- obj: size of the object that should be positioned inside the area --- margin: min. distance from object to frame (as long as -1 <= align <= +1) -function get_align(align, frame, obj, margin) - return (frame / 2) + (((frame / 2) - margin - (obj / 2)) * align) -end - --- multiplies two alpha values, formular can probably be improved -function mult_alpha(alphaA, alphaB) - return 255 - (((1-(alphaA/255)) * (1-(alphaB/255))) * 255) -end - -function add_area(name, x1, y1, x2, y2) - -- create area if needed - if (osc_param.areas[name] == nil) then - osc_param.areas[name] = {} - end - table.insert(osc_param.areas[name], {x1=x1, y1=y1, x2=x2, y2=y2}) -end - -function ass_append_alpha(ass, alpha, modifier) - local ar = {} - - for ai, av in pairs(alpha) do - av = mult_alpha(av, modifier) - if state.animation then - av = mult_alpha(av, state.animation) - end - ar[ai] = av - end - - ass:append(string.format("{\\1a&H%X&\\2a&H%X&\\3a&H%X&\\4a&H%X&}", - ar[1], ar[2], ar[3], ar[4])) -end - -function ass_draw_rr_h_cw(ass, x0, y0, x1, y1, r1, hexagon, r2) - if hexagon then - ass:hexagon_cw(x0, y0, x1, y1, r1, r2) - else - ass:round_rect_cw(x0, y0, x1, y1, r1, r2) - end -end - -function ass_draw_rr_h_ccw(ass, x0, y0, x1, y1, r1, hexagon, r2) - if hexagon then - ass:hexagon_ccw(x0, y0, x1, y1, r1, r2) - else - ass:round_rect_ccw(x0, y0, x1, y1, r1, r2) - end -end - - --- --- Tracklist Management --- - -local nicetypes = {video = "Video", audio = "Audio", sub = "Subtitle"} - --- updates the OSC internal playlists, should be run each time the track-layout changes -function update_tracklist() - local tracktable = mp.get_property_native("track-list", {}) - - -- by osc_id - tracks_osc = {} - tracks_osc.video, tracks_osc.audio, tracks_osc.sub = {}, {}, {} - -- by mpv_id - tracks_mpv = {} - tracks_mpv.video, tracks_mpv.audio, tracks_mpv.sub = {}, {}, {} - for n = 1, #tracktable do - if not (tracktable[n].type == "unknown") then - local type = tracktable[n].type - local mpv_id = tonumber(tracktable[n].id) - - -- by osc_id - table.insert(tracks_osc[type], tracktable[n]) - - -- by mpv_id - tracks_mpv[type][mpv_id] = tracktable[n] - tracks_mpv[type][mpv_id].osc_id = #tracks_osc[type] - end - end -end - --- return a nice list of tracks of the given type (video, audio, sub) -function get_tracklist(type) - local msg = "Available " .. nicetypes[type] .. " Tracks: " - if not tracks_osc or #tracks_osc[type] == 0 then - msg = msg .. "none" - else - for n = 1, #tracks_osc[type] do - local track = tracks_osc[type][n] - local lang, title, selected = "unknown", "", "○" - if not(track.lang == nil) then lang = track.lang end - if not(track.title == nil) then title = track.title end - if (track.id == tonumber(mp.get_property(type))) then - selected = "●" - end - msg = msg.."\n"..selected.." "..n..": ["..lang.."] "..title - end - end - return msg -end - --- relatively change the track of given <type> by <next> tracks - --(+1 -> next, -1 -> previous) -function set_track(type, next) - local current_track_mpv, current_track_osc - if (mp.get_property(type) == "no") then - current_track_osc = 0 - else - current_track_mpv = tonumber(mp.get_property(type)) - current_track_osc = tracks_mpv[type][current_track_mpv].osc_id - end - local new_track_osc = (current_track_osc + next) % (#tracks_osc[type] + 1) - local new_track_mpv - if new_track_osc == 0 then - new_track_mpv = "no" - else - new_track_mpv = tracks_osc[type][new_track_osc].id - end - - mp.commandv("set", type, new_track_mpv) - - if (new_track_osc == 0) then - show_message(nicetypes[type] .. " Track: none") - else - show_message(nicetypes[type] .. " Track: " - .. new_track_osc .. "/" .. #tracks_osc[type] - .. " [".. (tracks_osc[type][new_track_osc].lang or "unknown") .."] " - .. (tracks_osc[type][new_track_osc].title or "")) - end -end - --- get the currently selected track of <type>, OSC-style counted -function get_track(type) - local track = mp.get_property(type) - if track ~= "no" and track ~= nil then - local tr = tracks_mpv[type][tonumber(track)] - if tr then - return tr.osc_id - end - end - return 0 -end - --- WindowControl helpers -function window_controls_enabled() - val = user_opts.windowcontrols - if val == "auto" then - return not state.border - else - return val ~= "no" - end -end - -function window_controls_alignment() - return user_opts.windowcontrols_alignment -end - --- --- Element Management --- - -local elements = {} - -function prepare_elements() - - -- remove elements without layout or invisble - local elements2 = {} - for n, element in pairs(elements) do - if not (element.layout == nil) and (element.visible) then - table.insert(elements2, element) - end - end - elements = elements2 - - function elem_compare (a, b) - return a.layout.layer < b.layout.layer - end - - table.sort(elements, elem_compare) - - - for _,element in pairs(elements) do - - local elem_geo = element.layout.geometry - - -- Calculate the hitbox - local bX1, bY1, bX2, bY2 = get_hitbox_coords_geo(elem_geo) - element.hitbox = {x1 = bX1, y1 = bY1, x2 = bX2, y2 = bY2} - - local style_ass = assdraw.ass_new() - - -- prepare static elements - style_ass:append("{}") -- hack to troll new_event into inserting a \n - style_ass:new_event() - style_ass:pos(elem_geo.x, elem_geo.y) - style_ass:an(elem_geo.an) - style_ass:append(element.layout.style) - - element.style_ass = style_ass - - local static_ass = assdraw.ass_new() - - - if (element.type == "box") then - --draw box - static_ass:draw_start() - ass_draw_rr_h_cw(static_ass, 0, 0, elem_geo.w, elem_geo.h, - element.layout.box.radius, element.layout.box.hexagon) - static_ass:draw_stop() - - elseif (element.type == "slider") then - --draw static slider parts - - local r1 = 0 - local r2 = 0 - local slider_lo = element.layout.slider - -- offset between element outline and drag-area - local foV = slider_lo.border + slider_lo.gap - - -- calculate positions of min and max points - if (slider_lo.stype ~= "bar") then - r1 = elem_geo.h / 2 - element.slider.min.ele_pos = elem_geo.h / 2 - element.slider.max.ele_pos = elem_geo.w - (elem_geo.h / 2) - if (slider_lo.stype == "diamond") then - r2 = (elem_geo.h - 2 * slider_lo.border) / 2 - elseif (slider_lo.stype == "knob") then - r2 = r1 - end - else - element.slider.min.ele_pos = - slider_lo.border + slider_lo.gap - element.slider.max.ele_pos = - elem_geo.w - (slider_lo.border + slider_lo.gap) - end - - element.slider.min.glob_pos = - element.hitbox.x1 + element.slider.min.ele_pos - element.slider.max.glob_pos = - element.hitbox.x1 + element.slider.max.ele_pos - - -- -- -- - - static_ass:draw_start() - - -- the box - ass_draw_rr_h_cw(static_ass, 0, 0, elem_geo.w, elem_geo.h, r1, slider_lo.stype == "diamond") - - -- the "hole" - ass_draw_rr_h_ccw(static_ass, slider_lo.border, slider_lo.border, - elem_geo.w - slider_lo.border, elem_geo.h - slider_lo.border, - r2, slider_lo.stype == "diamond") - - -- marker nibbles - if not (element.slider.markerF == nil) and (slider_lo.gap > 0) then - local markers = element.slider.markerF() - for _,marker in pairs(markers) do - if (marker > element.slider.min.value) and - (marker < element.slider.max.value) then - - local s = get_slider_ele_pos_for(element, marker) - - if (slider_lo.gap > 1) then -- draw triangles - - local a = slider_lo.gap / 0.5 --0.866 - - --top - if (slider_lo.nibbles_top) then - static_ass:move_to(s - (a/2), slider_lo.border) - static_ass:line_to(s + (a/2), slider_lo.border) - static_ass:line_to(s, foV) - end - - --bottom - if (slider_lo.nibbles_bottom) then - static_ass:move_to(s - (a/2), - elem_geo.h - slider_lo.border) - static_ass:line_to(s, - elem_geo.h - foV) - static_ass:line_to(s + (a/2), - elem_geo.h - slider_lo.border) - end - - else -- draw 2x1px nibbles - - --top - if (slider_lo.nibbles_top) then - static_ass:rect_cw(s - 1, slider_lo.border, - s + 1, slider_lo.border + slider_lo.gap); - end - - --bottom - if (slider_lo.nibbles_bottom) then - static_ass:rect_cw(s - 1, - elem_geo.h -slider_lo.border -slider_lo.gap, - s + 1, elem_geo.h - slider_lo.border); - end - end - end - end - end - end - - element.static_ass = static_ass - - - -- if the element is supposed to be disabled, - -- style it accordingly and kill the eventresponders - if not (element.enabled) then - element.layout.alpha[1] = 136 - element.eventresponder = nil - end - end -end - - --- --- Element Rendering --- - --- returns nil or a chapter element from the native property chapter-list -function get_chapter(possec) - local cl = state.chapter_list -- sorted, get latest before possec, if any - - for n=#cl,1,-1 do - if possec >= cl[n].time then - return cl[n] - end - end -end - -function render_elements(master_ass) - - -- when the slider is dragged or hovered and we have a target chapter name - -- then we use it instead of the normal title. we calculate it before the - -- render iterations because the title may be rendered before the slider. - state.forced_title = nil - local se, ae = state.slider_element, elements[state.active_element] - if user_opts.chapter_fmt ~= "no" and se and (ae == se or (not ae and mouse_hit(se))) then - local dur = mp.get_property_number("duration", 0) - if dur > 0 then - local possec = get_slider_value(se) * dur / 100 -- of mouse pos - local ch = get_chapter(possec) - if ch and ch.title and ch.title ~= "" then - state.forced_title = string.format(user_opts.chapter_fmt, ch.title) - end - end - end - - for n=1, #elements do - local element = elements[n] - - local style_ass = assdraw.ass_new() - style_ass:merge(element.style_ass) - ass_append_alpha(style_ass, element.layout.alpha, 0) - - if element.eventresponder and (state.active_element == n) then - - -- run render event functions - if not (element.eventresponder.render == nil) then - element.eventresponder.render(element) - end - - if mouse_hit(element) then - -- mouse down styling - if (element.styledown) then - style_ass:append(osc_styles.elementDown) - end - - if (element.softrepeat) and (state.mouse_down_counter >= 15 - and state.mouse_down_counter % 5 == 0) then - - element.eventresponder[state.active_event_source.."_down"](element) - end - state.mouse_down_counter = state.mouse_down_counter + 1 - end - - end - - local elem_ass = assdraw.ass_new() - - elem_ass:merge(style_ass) - - if not (element.type == "button") then - elem_ass:merge(element.static_ass) - end - - if (element.type == "slider") then - - local slider_lo = element.layout.slider - local elem_geo = element.layout.geometry - local s_min = element.slider.min.value - local s_max = element.slider.max.value - - -- draw pos marker - local foH, xp - local pos = element.slider.posF() - local foV = slider_lo.border + slider_lo.gap - local innerH = elem_geo.h - (2 * foV) - local seekRanges = element.slider.seekRangesF() - local seekRangeLineHeight = innerH / 5 - - if slider_lo.stype ~= "bar" then - foH = elem_geo.h / 2 - else - foH = slider_lo.border + slider_lo.gap - end - - if pos then - xp = get_slider_ele_pos_for(element, pos) - - if slider_lo.stype ~= "bar" then - local r = (user_opts.seekbarhandlesize * innerH) / 2 - ass_draw_rr_h_cw(elem_ass, xp - r, foH - r, - xp + r, foH + r, - r, slider_lo.stype == "diamond") - else - local h = 0 - if seekRanges and user_opts.seekrangeseparate and slider_lo.rtype ~= "inverted" then - h = seekRangeLineHeight - end - elem_ass:rect_cw(foH, foV, xp, elem_geo.h - foV - h) - - if seekRanges and not user_opts.seekrangeseparate and slider_lo.rtype ~= "inverted" then - -- Punch holes for the seekRanges to be drawn later - for _,range in pairs(seekRanges) do - if range["start"] < pos then - local pstart = get_slider_ele_pos_for(element, range["start"]) - local pend = xp - - if pos > range["end"] then - pend = get_slider_ele_pos_for(element, range["end"]) - end - elem_ass:rect_ccw(pstart, elem_geo.h - foV - seekRangeLineHeight, pend, elem_geo.h - foV) - end - end - end - end - - if slider_lo.rtype == "slider" then - ass_draw_rr_h_cw(elem_ass, foH - innerH / 6, foH - innerH / 6, - xp, foH + innerH / 6, - innerH / 6, slider_lo.stype == "diamond", 0) - ass_draw_rr_h_cw(elem_ass, xp, foH - innerH / 15, - elem_geo.w - foH + innerH / 15, foH + innerH / 15, - 0, slider_lo.stype == "diamond", innerH / 15) - for _,range in pairs(seekRanges or {}) do - local pstart = get_slider_ele_pos_for(element, range["start"]) - local pend = get_slider_ele_pos_for(element, range["end"]) - ass_draw_rr_h_ccw(elem_ass, pstart, foH - innerH / 21, - pend, foH + innerH / 21, - innerH / 21, slider_lo.stype == "diamond") - end - end - end - - if seekRanges then - if slider_lo.rtype ~= "inverted" then - elem_ass:draw_stop() - elem_ass:merge(element.style_ass) - ass_append_alpha(elem_ass, element.layout.alpha, user_opts.seekrangealpha) - elem_ass:merge(element.static_ass) - end - - for _,range in pairs(seekRanges) do - local pstart = get_slider_ele_pos_for(element, range["start"]) - local pend = get_slider_ele_pos_for(element, range["end"]) - - if slider_lo.rtype == "slider" then - ass_draw_rr_h_cw(elem_ass, pstart, foH - innerH / 21, - pend, foH + innerH / 21, - innerH / 21, slider_lo.stype == "diamond") - elseif slider_lo.rtype == "line" then - if slider_lo.stype == "bar" then - elem_ass:rect_cw(pstart, elem_geo.h - foV - seekRangeLineHeight, pend, elem_geo.h - foV) - else - ass_draw_rr_h_cw(elem_ass, pstart - innerH / 8, foH - innerH / 8, - pend + innerH / 8, foH + innerH / 8, - innerH / 8, slider_lo.stype == "diamond") - end - elseif slider_lo.rtype == "bar" then - if slider_lo.stype ~= "bar" then - ass_draw_rr_h_cw(elem_ass, pstart - innerH / 2, foV, - pend + innerH / 2, foV + innerH, - innerH / 2, slider_lo.stype == "diamond") - elseif range["end"] >= (pos or 0) then - elem_ass:rect_cw(pstart, foV, pend, elem_geo.h - foV) - else - elem_ass:rect_cw(pstart, elem_geo.h - foV - seekRangeLineHeight, pend, elem_geo.h - foV) - end - elseif slider_lo.rtype == "inverted" then - if slider_lo.stype ~= "bar" then - ass_draw_rr_h_ccw(elem_ass, pstart, (elem_geo.h / 2) - 1, pend, - (elem_geo.h / 2) + 1, - 1, slider_lo.stype == "diamond") - else - elem_ass:rect_ccw(pstart, (elem_geo.h / 2) - 1, pend, (elem_geo.h / 2) + 1) - end - end - end - end - - elem_ass:draw_stop() - - -- add tooltip - if not (element.slider.tooltipF == nil) then - - if mouse_hit(element) then - local sliderpos = get_slider_value(element) - local tooltiplabel = element.slider.tooltipF(sliderpos) - - local an = slider_lo.tooltip_an - - local ty - - if (an == 2) then - ty = element.hitbox.y1 - slider_lo.border - else - ty = element.hitbox.y1 + elem_geo.h/2 - end - - local tx = get_virt_mouse_pos() - if (slider_lo.adjust_tooltip) then - if (an == 2) then - if (sliderpos < (s_min + 3)) then - an = an - 1 - elseif (sliderpos > (s_max - 3)) then - an = an + 1 - end - elseif (sliderpos > (s_max-s_min)/2) then - an = an + 1 - tx = tx - 5 - else - an = an - 1 - tx = tx + 10 - end - end - - -- tooltip label - elem_ass:new_event() - elem_ass:pos(tx, ty) - elem_ass:an(an) - elem_ass:append(slider_lo.tooltip_style) - ass_append_alpha(elem_ass, slider_lo.alpha, 0) - elem_ass:append(tooltiplabel) - - end - end - - elseif (element.type == "button") then - - local buttontext - if type(element.content) == "function" then - buttontext = element.content() -- function objects - elseif not (element.content == nil) then - buttontext = element.content -- text objects - end - - local maxchars = element.layout.button.maxchars - if not (maxchars == nil) and (#buttontext > maxchars) then - local max_ratio = 1.25 -- up to 25% more chars while shrinking - local limit = math.max(0, math.floor(maxchars * max_ratio) - 3) - if (#buttontext > limit) then - while (#buttontext > limit) do - buttontext = buttontext:gsub(".[\128-\191]*$", "") - end - buttontext = buttontext .. "..." - end - local _, nchars2 = buttontext:gsub(".[\128-\191]*", "") - local stretch = (maxchars/#buttontext)*100 - buttontext = string.format("{\\fscx%f}", - (maxchars/#buttontext)*100) .. buttontext - end - - elem_ass:append(buttontext) - end - - master_ass:merge(elem_ass) - end -end - --- --- Message display --- - --- pos is 1 based -function limited_list(prop, pos) - local proplist = mp.get_property_native(prop, {}) - local count = #proplist - if count == 0 then - return count, proplist - end - - local fs = tonumber(mp.get_property('options/osd-font-size')) - local max = math.ceil(osc_param.unscaled_y*0.75 / fs) - if max % 2 == 0 then - max = max - 1 - end - local delta = math.ceil(max / 2) - 1 - local begi = math.max(math.min(pos - delta, count - max + 1), 1) - local endi = math.min(begi + max - 1, count) - - local reslist = {} - for i=begi, endi do - local item = proplist[i] - item.current = (i == pos) and true or nil - table.insert(reslist, item) - end - return count, reslist -end - -function get_playlist() - local pos = mp.get_property_number('playlist-pos', 0) + 1 - local count, limlist = limited_list('playlist', pos) - if count == 0 then - return 'Empty playlist.' - end - - local message = string.format('Playlist [%d/%d]:\n', pos, count) - for i, v in ipairs(limlist) do - local title = v.title - local _, filename = utils.split_path(v.filename) - if title == nil then - title = filename - end - message = string.format('%s %s %s\n', message, - (v.current and '●' or '○'), title) - end - return message -end - -function get_chapterlist() - local pos = mp.get_property_number('chapter', 0) + 1 - local count, limlist = limited_list('chapter-list', pos) - if count == 0 then - return 'No chapters.' - end - - local message = string.format('Chapters [%d/%d]:\n', pos, count) - for i, v in ipairs(limlist) do - local time = mp.format_time(v.time) - local title = v.title - if title == nil then - title = string.format('Chapter %02d', i) - end - message = string.format('%s[%s] %s %s\n', message, time, - (v.current and '●' or '○'), title) - end - return message -end - -function show_message(text, duration) - - --print("text: "..text.." duration: " .. duration) - if duration == nil then - duration = tonumber(mp.get_property("options/osd-duration")) / 1000 - elseif not type(duration) == "number" then - print("duration: " .. duration) - end - - -- cut the text short, otherwise the following functions - -- may slow down massively on huge input - text = string.sub(text, 0, 4000) - - -- replace actual linebreaks with ASS linebreaks - text = string.gsub(text, "\n", "\\N") - - state.message_text = text - - if not state.message_hide_timer then - state.message_hide_timer = mp.add_timeout(0, request_tick) - end - state.message_hide_timer:kill() - state.message_hide_timer.timeout = duration - state.message_hide_timer:resume() - request_tick() -end - -function render_message(ass) - if state.message_hide_timer and state.message_hide_timer:is_enabled() and - state.message_text - then - local _, lines = string.gsub(state.message_text, "\\N", "") - - local fontsize = tonumber(mp.get_property("options/osd-font-size")) - local outline = tonumber(mp.get_property("options/osd-border-size")) - local maxlines = math.ceil(osc_param.unscaled_y*0.75 / fontsize) - local counterscale = osc_param.playresy / osc_param.unscaled_y - - fontsize = fontsize * counterscale / math.max(0.65 + math.min(lines/maxlines, 1), 1) - outline = outline * counterscale / math.max(0.75 + math.min(lines/maxlines, 1)/2, 1) - - local style = "{\\bord" .. outline .. "\\fs" .. fontsize .. "}" - - - ass:new_event() - ass:append(style .. state.message_text) - else - state.message_text = nil - end -end - --- --- Initialisation and Layout --- - -function new_element(name, type) - elements[name] = {} - elements[name].type = type - - -- add default stuff - elements[name].eventresponder = {} - elements[name].visible = true - elements[name].enabled = true - elements[name].softrepeat = false - elements[name].styledown = (type == "button") - elements[name].state = {} - - if (type == "slider") then - elements[name].slider = {min = {value = 0}, max = {value = 100}} - end - - - return elements[name] -end - -function add_layout(name) - if not (elements[name] == nil) then - -- new layout - elements[name].layout = {} - - -- set layout defaults - elements[name].layout.layer = 50 - elements[name].layout.alpha = {[1] = 0, [2] = 255, [3] = 255, [4] = 255} - - if (elements[name].type == "button") then - elements[name].layout.button = { - maxchars = nil, - } - elseif (elements[name].type == "slider") then - -- slider defaults - elements[name].layout.slider = { - border = 1, - gap = 1, - nibbles_top = true, - nibbles_bottom = true, - stype = "slider", - adjust_tooltip = true, - tooltip_style = "", - tooltip_an = 2, - alpha = {[1] = 0, [2] = 255, [3] = 88, [4] = 255}, - } - elseif (elements[name].type == "box") then - elements[name].layout.box = {radius = 0, hexagon = false} - end - - return elements[name].layout - else - msg.error("Can't add_layout to element \""..name.."\", doesn't exist.") - end -end - --- Window Controls -function window_controls(topbar) - local wc_geo = { - x = 0, - y = 30 + user_opts.barmargin, - an = 1, - w = osc_param.playresx, - h = 30, - } - - local alignment = window_controls_alignment() - local controlbox_w = window_control_box_width - local titlebox_w = wc_geo.w - controlbox_w - - -- Default alignment is "right" - local controlbox_left = wc_geo.w - controlbox_w - local titlebox_left = wc_geo.x - local titlebox_right = wc_geo.w - controlbox_w - - if alignment == "left" then - controlbox_left = wc_geo.x - titlebox_left = wc_geo.x + controlbox_w - titlebox_right = wc_geo.w - end - - add_area("window-controls", - get_hitbox_coords(controlbox_left, wc_geo.y, wc_geo.an, - controlbox_w, wc_geo.h)) - - local lo - - -- Background Bar - new_element("wcbar", "box") - lo = add_layout("wcbar") - lo.geometry = wc_geo - lo.layer = 10 - lo.style = osc_styles.wcBar - lo.alpha[1] = user_opts.boxalpha - - local button_y = wc_geo.y - (wc_geo.h / 2) - local first_geo = - {x = controlbox_left + 5, y = button_y, an = 4, w = 25, h = 25} - local second_geo = - {x = controlbox_left + 30, y = button_y, an = 4, w = 25, h = 25} - local third_geo = - {x = controlbox_left + 55, y = button_y, an = 4, w = 25, h = 25} - - -- Window control buttons use symbols in the custom mpv osd font - -- because the official unicode codepoints are sufficiently - -- exotic that a system might lack an installed font with them, - -- and libass will complain that they are not present in the - -- default font, even if another font with them is available. - - -- Close: 🗙 - ne = new_element("close", "button") - ne.content = "\238\132\149" - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("quit") end - lo = add_layout("close") - lo.geometry = alignment == "left" and first_geo or third_geo - lo.style = osc_styles.wcButtons - - -- Minimize: 🗕 - ne = new_element("minimize", "button") - ne.content = "\238\132\146" - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("cycle", "window-minimized") end - lo = add_layout("minimize") - lo.geometry = alignment == "left" and second_geo or first_geo - lo.style = osc_styles.wcButtons - - -- Maximize: 🗖 /🗗 - ne = new_element("maximize", "button") - if state.maximized or state.fullscreen then - ne.content = "\238\132\148" - else - ne.content = "\238\132\147" - end - ne.eventresponder["mbtn_left_up"] = - function () - if state.fullscreen then - mp.commandv("cycle", "fullscreen") - else - mp.commandv("cycle", "window-maximized") - end - end - lo = add_layout("maximize") - lo.geometry = alignment == "left" and third_geo or second_geo - lo.style = osc_styles.wcButtons - - -- deadzone below window controls - local sh_area_y0, sh_area_y1 - sh_area_y0 = user_opts.barmargin - sh_area_y1 = (wc_geo.y + (wc_geo.h / 2)) + - get_align(1 - (2 * user_opts.deadzonesize), - osc_param.playresy - (wc_geo.y + (wc_geo.h / 2)), 0, 0) - add_area("showhide_wc", wc_geo.x, sh_area_y0, wc_geo.w, sh_area_y1) - - if topbar then - -- The title is already there as part of the top bar - return - else - -- Apply boxvideo margins to the control bar - osc_param.video_margins.t = wc_geo.h / osc_param.playresy - end - - -- Window Title - ne = new_element("wctitle", "button") - ne.content = function () - local title = mp.command_native({"expand-text", user_opts.title}) - -- escape ASS, and strip newlines and trailing slashes - title = title:gsub("\\n", " "):gsub("\\$", ""):gsub("{","\\{") - return not (title == "") and title or "mpv" - end - local left_pad = 5 - local right_pad = 10 - lo = add_layout("wctitle") - lo.geometry = - { x = titlebox_left + left_pad, y = wc_geo.y - 3, an = 1, - w = titlebox_w, h = wc_geo.h } - lo.style = string.format("%s{\\clip(%f,%f,%f,%f)}", - osc_styles.wcTitle, - titlebox_left + left_pad, wc_geo.y - wc_geo.h, - titlebox_right - right_pad , wc_geo.y + wc_geo.h) - - add_area("window-controls-title", - titlebox_left, 0, titlebox_right, wc_geo.h) -end - --- --- Layouts --- - -local layouts = {} - --- Classic box layout -layouts["box"] = function () - - local osc_geo = { - w = 550, -- width - h = 138, -- height - r = 10, -- corner-radius - p = 15, -- padding - } - - -- make sure the OSC actually fits into the video - if (osc_param.playresx < (osc_geo.w + (2 * osc_geo.p))) then - osc_param.playresy = (osc_geo.w+(2*osc_geo.p))/osc_param.display_aspect - osc_param.playresx = osc_param.playresy * osc_param.display_aspect - end - - -- position of the controller according to video aspect and valignment - local posX = math.floor(get_align(user_opts.halign, osc_param.playresx, - osc_geo.w, 0)) - local posY = math.floor(get_align(user_opts.valign, osc_param.playresy, - osc_geo.h, 0)) - - -- position offset for contents aligned at the borders of the box - local pos_offsetX = (osc_geo.w - (2*osc_geo.p)) / 2 - local pos_offsetY = (osc_geo.h - (2*osc_geo.p)) / 2 - - osc_param.areas = {} -- delete areas - - -- area for active mouse input - add_area("input", get_hitbox_coords(posX, posY, 5, osc_geo.w, osc_geo.h)) - - -- area for show/hide - local sh_area_y0, sh_area_y1 - if user_opts.valign > 0 then - -- deadzone above OSC - sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), - posY - (osc_geo.h / 2), 0, 0) - sh_area_y1 = osc_param.playresy - else - -- deadzone below OSC - sh_area_y0 = 0 - sh_area_y1 = (posY + (osc_geo.h / 2)) + - get_align(1 - (2*user_opts.deadzonesize), - osc_param.playresy - (posY + (osc_geo.h / 2)), 0, 0) - end - add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) - - -- fetch values - local osc_w, osc_h, osc_r, osc_p = - osc_geo.w, osc_geo.h, osc_geo.r, osc_geo.p - - local lo - - -- - -- Background box - -- - - new_element("bgbox", "box") - lo = add_layout("bgbox") - - lo.geometry = {x = posX, y = posY, an = 5, w = osc_w, h = osc_h} - lo.layer = 10 - lo.style = osc_styles.box - lo.alpha[1] = user_opts.boxalpha - lo.alpha[3] = user_opts.boxalpha - lo.box.radius = osc_r - - -- - -- Title row - -- - - local titlerowY = posY - pos_offsetY - 10 - - lo = add_layout("title") - lo.geometry = {x = posX, y = titlerowY, an = 8, w = 496, h = 12} - lo.style = osc_styles.vidtitle - lo.button.maxchars = user_opts.boxmaxchars - - lo = add_layout("pl_prev") - lo.geometry = - {x = (posX - pos_offsetX), y = titlerowY, an = 7, w = 12, h = 12} - lo.style = osc_styles.topButtons - - lo = add_layout("pl_next") - lo.geometry = - {x = (posX + pos_offsetX), y = titlerowY, an = 9, w = 12, h = 12} - lo.style = osc_styles.topButtons - - -- - -- Big buttons - -- - - local bigbtnrowY = posY - pos_offsetY + 35 - local bigbtndist = 60 - - lo = add_layout("playpause") - lo.geometry = - {x = posX, y = bigbtnrowY, an = 5, w = 40, h = 40} - lo.style = osc_styles.bigButtons - - lo = add_layout("skipback") - lo.geometry = - {x = posX - bigbtndist, y = bigbtnrowY, an = 5, w = 40, h = 40} - lo.style = osc_styles.bigButtons - - lo = add_layout("skipfrwd") - lo.geometry = - {x = posX + bigbtndist, y = bigbtnrowY, an = 5, w = 40, h = 40} - lo.style = osc_styles.bigButtons - - lo = add_layout("ch_prev") - lo.geometry = - {x = posX - (bigbtndist * 2), y = bigbtnrowY, an = 5, w = 40, h = 40} - lo.style = osc_styles.bigButtons - - lo = add_layout("ch_next") - lo.geometry = - {x = posX + (bigbtndist * 2), y = bigbtnrowY, an = 5, w = 40, h = 40} - lo.style = osc_styles.bigButtons - - lo = add_layout("cy_audio") - lo.geometry = - {x = posX - pos_offsetX, y = bigbtnrowY, an = 1, w = 70, h = 18} - lo.style = osc_styles.smallButtonsL - - lo = add_layout("cy_sub") - lo.geometry = - {x = posX - pos_offsetX, y = bigbtnrowY, an = 7, w = 70, h = 18} - lo.style = osc_styles.smallButtonsL - - lo = add_layout("tog_fs") - lo.geometry = - {x = posX+pos_offsetX - 25, y = bigbtnrowY, an = 4, w = 25, h = 25} - lo.style = osc_styles.smallButtonsR - - lo = add_layout("volume") - lo.geometry = - {x = posX+pos_offsetX - (25 * 2) - osc_geo.p, - y = bigbtnrowY, an = 4, w = 25, h = 25} - lo.style = osc_styles.smallButtonsR - - -- - -- Seekbar - -- - - lo = add_layout("seekbar") - lo.geometry = - {x = posX, y = posY+pos_offsetY-22, an = 2, w = pos_offsetX*2, h = 15} - lo.style = osc_styles.timecodes - lo.slider.tooltip_style = osc_styles.vidtitle - lo.slider.stype = user_opts["seekbarstyle"] - lo.slider.rtype = user_opts["seekrangestyle"] - - -- - -- Timecodes + Cache - -- - - local bottomrowY = posY + pos_offsetY - 5 - - lo = add_layout("tc_left") - lo.geometry = - {x = posX - pos_offsetX, y = bottomrowY, an = 4, w = 110, h = 18} - lo.style = osc_styles.timecodes - - lo = add_layout("tc_right") - lo.geometry = - {x = posX + pos_offsetX, y = bottomrowY, an = 6, w = 110, h = 18} - lo.style = osc_styles.timecodes - - lo = add_layout("cache") - lo.geometry = - {x = posX, y = bottomrowY, an = 5, w = 110, h = 18} - lo.style = osc_styles.timecodes - -end - --- slim box layout -layouts["slimbox"] = function () - - local osc_geo = { - w = 660, -- width - h = 70, -- height - r = 10, -- corner-radius - } - - -- make sure the OSC actually fits into the video - if (osc_param.playresx < (osc_geo.w)) then - osc_param.playresy = (osc_geo.w)/osc_param.display_aspect - osc_param.playresx = osc_param.playresy * osc_param.display_aspect - end - - -- position of the controller according to video aspect and valignment - local posX = math.floor(get_align(user_opts.halign, osc_param.playresx, - osc_geo.w, 0)) - local posY = math.floor(get_align(user_opts.valign, osc_param.playresy, - osc_geo.h, 0)) - - osc_param.areas = {} -- delete areas - - -- area for active mouse input - add_area("input", get_hitbox_coords(posX, posY, 5, osc_geo.w, osc_geo.h)) - - -- area for show/hide - local sh_area_y0, sh_area_y1 - if user_opts.valign > 0 then - -- deadzone above OSC - sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), - posY - (osc_geo.h / 2), 0, 0) - sh_area_y1 = osc_param.playresy - else - -- deadzone below OSC - sh_area_y0 = 0 - sh_area_y1 = (posY + (osc_geo.h / 2)) + - get_align(1 - (2*user_opts.deadzonesize), - osc_param.playresy - (posY + (osc_geo.h / 2)), 0, 0) - end - add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) - - local lo - - local tc_w, ele_h, inner_w = 100, 20, osc_geo.w - 100 - - -- styles - local styles = { - box = "{\\rDefault\\blur0\\bord1\\1c&H000000\\3c&HFFFFFF}", - timecodes = "{\\1c&HFFFFFF\\3c&H000000\\fs20\\bord2\\blur1}", - tooltip = "{\\1c&HFFFFFF\\3c&H000000\\fs12\\bord1\\blur0.5}", - } - - - new_element("bgbox", "box") - lo = add_layout("bgbox") - - lo.geometry = {x = posX, y = posY - 1, an = 2, w = inner_w, h = ele_h} - lo.layer = 10 - lo.style = osc_styles.box - lo.alpha[1] = user_opts.boxalpha - lo.alpha[3] = 0 - if not (user_opts["seekbarstyle"] == "bar") then - lo.box.radius = osc_geo.r - lo.box.hexagon = user_opts["seekbarstyle"] == "diamond" - end - - - lo = add_layout("seekbar") - lo.geometry = - {x = posX, y = posY - 1, an = 2, w = inner_w, h = ele_h} - lo.style = osc_styles.timecodes - lo.slider.border = 0 - lo.slider.gap = 1.5 - lo.slider.tooltip_style = styles.tooltip - lo.slider.stype = user_opts["seekbarstyle"] - lo.slider.rtype = user_opts["seekrangestyle"] - lo.slider.adjust_tooltip = false - - -- - -- Timecodes - -- - - lo = add_layout("tc_left") - lo.geometry = - {x = posX - (inner_w/2) + osc_geo.r, y = posY + 1, - an = 7, w = tc_w, h = ele_h} - lo.style = styles.timecodes - lo.alpha[3] = user_opts.boxalpha - - lo = add_layout("tc_right") - lo.geometry = - {x = posX + (inner_w/2) - osc_geo.r, y = posY + 1, - an = 9, w = tc_w, h = ele_h} - lo.style = styles.timecodes - lo.alpha[3] = user_opts.boxalpha - - -- Cache - - lo = add_layout("cache") - lo.geometry = - {x = posX, y = posY + 1, - an = 8, w = tc_w, h = ele_h} - lo.style = styles.timecodes - lo.alpha[3] = user_opts.boxalpha - - -end - -function bar_layout(direction) - local osc_geo = { - x = -2, - y, - an = (direction < 0) and 7 or 1, - w, - h = 56, - } - - local padX = 9 - local padY = 3 - local buttonW = 27 - local tcW = (state.tc_ms) and 170 or 110 - if user_opts.tcspace >= 50 and user_opts.tcspace <= 200 then - -- adjust our hardcoded font size estimation - tcW = tcW * user_opts.tcspace / 100 - end - - local tsW = 90 - local minW = (buttonW + padX)*5 + (tcW + padX)*4 + (tsW + padX)*2 - - -- Special topbar handling when window controls are present - local padwc_l - local padwc_r - if direction < 0 or not window_controls_enabled() then - padwc_l = 0 - padwc_r = 0 - elseif window_controls_alignment() == "left" then - padwc_l = window_control_box_width - padwc_r = 0 - else - padwc_l = 0 - padwc_r = window_control_box_width - end - - if ((osc_param.display_aspect > 0) and (osc_param.playresx < minW)) then - osc_param.playresy = minW / osc_param.display_aspect - osc_param.playresx = osc_param.playresy * osc_param.display_aspect - end - - osc_geo.y = direction * (54 + user_opts.barmargin) - osc_geo.w = osc_param.playresx + 4 - if direction < 0 then - osc_geo.y = osc_geo.y + osc_param.playresy - end - - local line1 = osc_geo.y - direction * (9 + padY) - local line2 = osc_geo.y - direction * (36 + padY) - - osc_param.areas = {} - - add_area("input", get_hitbox_coords(osc_geo.x, osc_geo.y, osc_geo.an, - osc_geo.w, osc_geo.h)) - - local sh_area_y0, sh_area_y1 - if direction > 0 then - -- deadzone below OSC - sh_area_y0 = user_opts.barmargin - sh_area_y1 = (osc_geo.y + (osc_geo.h / 2)) + - get_align(1 - (2*user_opts.deadzonesize), - osc_param.playresy - (osc_geo.y + (osc_geo.h / 2)), 0, 0) - else - -- deadzone above OSC - sh_area_y0 = get_align(-1 + (2*user_opts.deadzonesize), - osc_geo.y - (osc_geo.h / 2), 0, 0) - sh_area_y1 = osc_param.playresy - user_opts.barmargin - end - add_area("showhide", 0, sh_area_y0, osc_param.playresx, sh_area_y1) - - local lo, geo - - -- Background bar - new_element("bgbox", "box") - lo = add_layout("bgbox") - - lo.geometry = osc_geo - lo.layer = 10 - lo.style = osc_styles.box - lo.alpha[1] = user_opts.boxalpha - - - -- Playlist prev/next - geo = { x = osc_geo.x + padX, y = line1, - an = 4, w = 18, h = 18 - padY } - lo = add_layout("pl_prev") - lo.geometry = geo - lo.style = osc_styles.topButtonsBar - - geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("pl_next") - lo.geometry = geo - lo.style = osc_styles.topButtonsBar - - local t_l = geo.x + geo.w + padX - - -- Cache - geo = { x = osc_geo.x + osc_geo.w - padX, y = geo.y, - an = 6, w = 150, h = geo.h } - lo = add_layout("cache") - lo.geometry = geo - lo.style = osc_styles.vidtitleBar - - local t_r = geo.x - geo.w - padX*2 - - -- Title - geo = { x = t_l, y = geo.y, an = 4, - w = t_r - t_l, h = geo.h } - lo = add_layout("title") - lo.geometry = geo - lo.style = string.format("%s{\\clip(%f,%f,%f,%f)}", - osc_styles.vidtitleBar, - geo.x, geo.y-geo.h, geo.w, geo.y+geo.h) - - - -- Playback control buttons - geo = { x = osc_geo.x + padX + padwc_l, y = line2, an = 4, - w = buttonW, h = 36 - padY*2} - lo = add_layout("playpause") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("ch_prev") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - geo = { x = geo.x + geo.w + padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("ch_next") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - -- Left timecode - geo = { x = geo.x + geo.w + padX + tcW, y = geo.y, an = 6, - w = tcW, h = geo.h } - lo = add_layout("tc_left") - lo.geometry = geo - lo.style = osc_styles.timecodesBar - - local sb_l = geo.x + padX - - -- Fullscreen button - geo = { x = osc_geo.x + osc_geo.w - buttonW - padX - padwc_r, y = geo.y, an = 4, - w = buttonW, h = geo.h } - lo = add_layout("tog_fs") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - -- START quality-menu - geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("quality-menu") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - -- END quality-menu - - -- Volume - geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("volume") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - -- Track selection buttons - geo = { x = geo.x - tsW - padX, y = geo.y, an = geo.an, w = tsW, h = geo.h } - lo = add_layout("cy_sub") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - geo = { x = geo.x - geo.w - padX, y = geo.y, an = geo.an, w = geo.w, h = geo.h } - lo = add_layout("cy_audio") - lo.geometry = geo - lo.style = osc_styles.smallButtonsBar - - - -- Right timecode - geo = { x = geo.x - padX - tcW - 10, y = geo.y, an = geo.an, - w = tcW, h = geo.h } - lo = add_layout("tc_right") - lo.geometry = geo - lo.style = osc_styles.timecodesBar - - local sb_r = geo.x - padX - - - -- Seekbar - geo = { x = sb_l, y = geo.y, an = geo.an, - w = math.max(0, sb_r - sb_l), h = geo.h } - new_element("bgbar1", "box") - lo = add_layout("bgbar1") - - lo.geometry = geo - lo.layer = 15 - lo.style = osc_styles.timecodesBar - lo.alpha[1] = - math.min(255, user_opts.boxalpha + (255 - user_opts.boxalpha)*0.8) - if not (user_opts["seekbarstyle"] == "bar") then - lo.box.radius = geo.h / 2 - lo.box.hexagon = user_opts["seekbarstyle"] == "diamond" - end - - lo = add_layout("seekbar") - lo.geometry = geo - lo.style = osc_styles.timecodesBar - lo.slider.border = 0 - lo.slider.gap = 2 - lo.slider.tooltip_style = osc_styles.timePosBar - lo.slider.tooltip_an = 5 - lo.slider.stype = user_opts["seekbarstyle"] - lo.slider.rtype = user_opts["seekrangestyle"] - - if direction < 0 then - osc_param.video_margins.b = osc_geo.h / osc_param.playresy - else - osc_param.video_margins.t = osc_geo.h / osc_param.playresy - end -end - -layouts["bottombar"] = function() - bar_layout(-1) -end - -layouts["topbar"] = function() - bar_layout(1) -end - --- Validate string type user options -function validate_user_opts() - if layouts[user_opts.layout] == nil then - msg.warn("Invalid setting \""..user_opts.layout.."\" for layout") - user_opts.layout = "bottombar" - end - - if user_opts.seekbarstyle ~= "bar" and - user_opts.seekbarstyle ~= "diamond" and - user_opts.seekbarstyle ~= "knob" then - msg.warn("Invalid setting \"" .. user_opts.seekbarstyle - .. "\" for seekbarstyle") - user_opts.seekbarstyle = "bar" - end - - if user_opts.seekrangestyle ~= "bar" and - user_opts.seekrangestyle ~= "line" and - user_opts.seekrangestyle ~= "slider" and - user_opts.seekrangestyle ~= "inverted" and - user_opts.seekrangestyle ~= "none" then - msg.warn("Invalid setting \"" .. user_opts.seekrangestyle - .. "\" for seekrangestyle") - user_opts.seekrangestyle = "inverted" - end - - if user_opts.seekrangestyle == "slider" and - user_opts.seekbarstyle == "bar" then - msg.warn("Using \"slider\" seekrangestyle together with \"bar\" seekbarstyle is not supported") - user_opts.seekrangestyle = "inverted" - end - - if user_opts.windowcontrols ~= "auto" and - user_opts.windowcontrols ~= "yes" and - user_opts.windowcontrols ~= "no" then - msg.warn("windowcontrols cannot be \"" .. - user_opts.windowcontrols .. "\". Ignoring.") - user_opts.windowcontrols = "auto" - end - if user_opts.windowcontrols_alignment ~= "right" and - user_opts.windowcontrols_alignment ~= "left" then - msg.warn("windowcontrols_alignment cannot be \"" .. - user_opts.windowcontrols_alignment .. "\". Ignoring.") - user_opts.windowcontrols_alignment = "right" - end -end - -function update_options(list) - validate_user_opts() - request_tick() - visibility_mode(user_opts.visibility, true) - update_duration_watch() - request_init() -end - -local UNICODE_MINUS = string.char(0xe2, 0x88, 0x92) -- UTF-8 for U+2212 MINUS SIGN - --- OSC INIT -function osc_init() - msg.debug("osc_init") - - -- set canvas resolution according to display aspect and scaling setting - local baseResY = 720 - local display_w, display_h, display_aspect = mp.get_osd_size() - local scale = 1 - - if (mp.get_property("video") == "no") then -- dummy/forced window - scale = user_opts.scaleforcedwindow - elseif state.fullscreen then - scale = user_opts.scalefullscreen - else - scale = user_opts.scalewindowed - end - - if user_opts.vidscale then - osc_param.unscaled_y = baseResY - else - osc_param.unscaled_y = display_h - end - osc_param.playresy = osc_param.unscaled_y / scale - if (display_aspect > 0) then - osc_param.display_aspect = display_aspect - end - osc_param.playresx = osc_param.playresy * osc_param.display_aspect - - -- stop seeking with the slider to prevent skipping files - state.active_element = nil - - osc_param.video_margins = {l = 0, r = 0, t = 0, b = 0} - - elements = {} - - -- some often needed stuff - local pl_count = mp.get_property_number("playlist-count", 0) - local have_pl = (pl_count > 1) - local pl_pos = mp.get_property_number("playlist-pos", 0) + 1 - local have_ch = (mp.get_property_number("chapters", 0) > 0) - local loop = mp.get_property("loop-playlist", "no") - - local ne - - -- title - ne = new_element("title", "button") - - ne.content = function () - local title = state.forced_title or - mp.command_native({"expand-text", user_opts.title}) - -- escape ASS, and strip newlines and trailing slashes - title = title:gsub("\\n", " "):gsub("\\$", ""):gsub("{","\\{") - return not (title == "") and title or "mpv" - end - - ne.eventresponder["mbtn_left_up"] = function () - local title = mp.get_property_osd("media-title") - if (have_pl) then - title = string.format("[%d/%d] %s", countone(pl_pos - 1), - pl_count, title) - end - show_message(title) - end - - ne.eventresponder["mbtn_right_up"] = - function () show_message(mp.get_property_osd("filename")) end - - -- playlist buttons - - -- prev - ne = new_element("pl_prev", "button") - - ne.content = "\238\132\144" - ne.enabled = (pl_pos > 1) or (loop ~= "no") - ne.eventresponder["mbtn_left_up"] = - function () - mp.commandv("playlist-prev", "weak") - if user_opts.playlist_osd then - show_message(get_playlist(), 3) - end - end - ne.eventresponder["shift+mbtn_left_up"] = - function () show_message(get_playlist(), 3) end - ne.eventresponder["mbtn_right_up"] = - function () show_message(get_playlist(), 3) end - - --next - ne = new_element("pl_next", "button") - - ne.content = "\238\132\129" - ne.enabled = (have_pl and (pl_pos < pl_count)) or (loop ~= "no") - ne.eventresponder["mbtn_left_up"] = - function () - mp.commandv("playlist-next", "weak") - if user_opts.playlist_osd then - show_message(get_playlist(), 3) - end - end - ne.eventresponder["shift+mbtn_left_up"] = - function () show_message(get_playlist(), 3) end - ne.eventresponder["mbtn_right_up"] = - function () show_message(get_playlist(), 3) end - - - -- big buttons - - --playpause - ne = new_element("playpause", "button") - - ne.content = function () - if mp.get_property("pause") == "yes" then - return ("\238\132\129") - else - return ("\238\128\130") - end - end - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("cycle", "pause") end - - --skipback - ne = new_element("skipback", "button") - - ne.softrepeat = true - ne.content = "\238\128\132" - ne.eventresponder["mbtn_left_down"] = - function () mp.commandv("seek", -5, "relative", "keyframes") end - ne.eventresponder["shift+mbtn_left_down"] = - function () mp.commandv("frame-back-step") end - ne.eventresponder["mbtn_right_down"] = - function () mp.commandv("seek", -30, "relative", "keyframes") end - - --skipfrwd - ne = new_element("skipfrwd", "button") - - ne.softrepeat = true - ne.content = "\238\128\133" - ne.eventresponder["mbtn_left_down"] = - function () mp.commandv("seek", 10, "relative", "keyframes") end - ne.eventresponder["shift+mbtn_left_down"] = - function () mp.commandv("frame-step") end - ne.eventresponder["mbtn_right_down"] = - function () mp.commandv("seek", 60, "relative", "keyframes") end - - --ch_prev - ne = new_element("ch_prev", "button") - - ne.enabled = have_ch - ne.content = "\238\132\132" - ne.eventresponder["mbtn_left_up"] = - function () - mp.commandv("add", "chapter", -1) - if user_opts.chapters_osd then - show_message(get_chapterlist(), 3) - end - end - ne.eventresponder["shift+mbtn_left_up"] = - function () show_message(get_chapterlist(), 3) end - ne.eventresponder["mbtn_right_up"] = - function () show_message(get_chapterlist(), 3) end - - --ch_next - ne = new_element("ch_next", "button") - - ne.enabled = have_ch - ne.content = "\238\132\133" - ne.eventresponder["mbtn_left_up"] = - function () - mp.commandv("add", "chapter", 1) - if user_opts.chapters_osd then - show_message(get_chapterlist(), 3) - end - end - ne.eventresponder["shift+mbtn_left_up"] = - function () show_message(get_chapterlist(), 3) end - ne.eventresponder["mbtn_right_up"] = - function () show_message(get_chapterlist(), 3) end - - -- - update_tracklist() - - --cy_audio - ne = new_element("cy_audio", "button") - - ne.enabled = (#tracks_osc.audio > 0) - ne.content = function () - local aid = "–" - if not (get_track("audio") == 0) then - aid = get_track("audio") - end - return ("\238\132\134" .. osc_styles.smallButtonsLlabel - .. " " .. aid .. "/" .. #tracks_osc.audio) - end - ne.eventresponder["mbtn_left_up"] = - function () set_track("audio", 1) end - ne.eventresponder["mbtn_right_up"] = - function () set_track("audio", -1) end - ne.eventresponder["shift+mbtn_left_down"] = - function () show_message(get_tracklist("audio"), 2) end - - --cy_sub - ne = new_element("cy_sub", "button") - - ne.enabled = (#tracks_osc.sub > 0) - ne.content = function () - local sid = "–" - if not (get_track("sub") == 0) then - sid = get_track("sub") - end - return ("\238\132\135" .. osc_styles.smallButtonsLlabel - .. " " .. sid .. "/" .. #tracks_osc.sub) - end - ne.eventresponder["mbtn_left_up"] = - function () set_track("sub", 1) end - ne.eventresponder["mbtn_right_up"] = - function () set_track("sub", -1) end - ne.eventresponder["shift+mbtn_left_down"] = - function () show_message(get_tracklist("sub"), 2) end - - --tog_fs - ne = new_element("tog_fs", "button") - ne.content = function () - if (state.fullscreen) then - return ("\238\132\137") - else - return ("\238\132\136") - end - end - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("cycle", "fullscreen") end - - --seekbar - ne = new_element("seekbar", "slider") - - ne.enabled = not (mp.get_property("percent-pos") == nil) - state.slider_element = ne.enabled and ne or nil -- used for forced_title - ne.slider.markerF = function () - local duration = mp.get_property_number("duration", nil) - if not (duration == nil) then - local chapters = mp.get_property_native("chapter-list", {}) - local markers = {} - for n = 1, #chapters do - markers[n] = (chapters[n].time / duration * 100) - end - return markers - else - return {} - end - end - ne.slider.posF = - function () return mp.get_property_number("percent-pos", nil) end - ne.slider.tooltipF = function (pos) - local duration = mp.get_property_number("duration", nil) - if not ((duration == nil) or (pos == nil)) then - possec = duration * (pos / 100) - return mp.format_time(possec) - else - return "" - end - end - ne.slider.seekRangesF = function() - if user_opts.seekrangestyle == "none" then - return nil - end - local cache_state = state.cache_state - if not cache_state then - return nil - end - local duration = mp.get_property_number("duration", nil) - if (duration == nil) or duration <= 0 then - return nil - end - local ranges = cache_state["seekable-ranges"] - if #ranges == 0 then - return nil - end - local nranges = {} - for _, range in pairs(ranges) do - nranges[#nranges + 1] = { - ["start"] = 100 * range["start"] / duration, - ["end"] = 100 * range["end"] / duration, - } - end - return nranges - end - ne.eventresponder["mouse_move"] = --keyframe seeking when mouse is dragged - function (element) - -- mouse move events may pile up during seeking and may still get - -- sent when the user is done seeking, so we need to throw away - -- identical seeks - local seekto = get_slider_value(element) - if (element.state.lastseek == nil) or - (not (element.state.lastseek == seekto)) then - local flags = "absolute-percent" - if not user_opts.seekbarkeyframes then - flags = flags .. "+exact" - end - mp.commandv("seek", seekto, flags) - element.state.lastseek = seekto - end - - end - ne.eventresponder["mbtn_left_down"] = --exact seeks on single clicks - function (element) mp.commandv("seek", get_slider_value(element), - "absolute-percent", "exact") end - ne.eventresponder["reset"] = - function (element) element.state.lastseek = nil end - - - -- tc_left (current pos) - ne = new_element("tc_left", "button") - - ne.content = function () - if (state.tc_ms) then - return (mp.get_property_osd("playback-time/full")) - else - return (mp.get_property_osd("playback-time")) - end - end - ne.eventresponder["mbtn_left_up"] = function () - state.tc_ms = not state.tc_ms - request_init() - end - - -- tc_right (total/remaining time) - ne = new_element("tc_right", "button") - - ne.visible = (mp.get_property_number("duration", 0) > 0) - ne.content = function () - if (state.rightTC_trem) then - local minus = user_opts.unicodeminus and UNICODE_MINUS or "-" - if state.tc_ms then - return (minus..mp.get_property_osd("playtime-remaining/full")) - else - return (minus..mp.get_property_osd("playtime-remaining")) - end - else - if state.tc_ms then - return (mp.get_property_osd("duration/full")) - else - return (mp.get_property_osd("duration")) - end - end - end - ne.eventresponder["mbtn_left_up"] = - function () state.rightTC_trem = not state.rightTC_trem end - - -- cache - ne = new_element("cache", "button") - - ne.content = function () - local cache_state = state.cache_state - if not (cache_state and cache_state["seekable-ranges"] and - #cache_state["seekable-ranges"] > 0) then - -- probably not a network stream - return "" - end - local dmx_cache = cache_state and cache_state["cache-duration"] - local thresh = math.min(state.dmx_cache * 0.05, 5) -- 5% or 5s - if dmx_cache and math.abs(dmx_cache - state.dmx_cache) >= thresh then - state.dmx_cache = dmx_cache - else - dmx_cache = state.dmx_cache - end - local min = math.floor(dmx_cache / 60) - local sec = math.floor(dmx_cache % 60) -- don't round e.g. 59.9 to 60 - return "Cache: " .. (min > 0 and - string.format("%sm%02.0fs", min, sec) or - string.format("%3.0fs", sec)) - end - - -- START quality-menu - ne = new_element("quality-menu", "button") - ne.content = function() - return ("≚") - end - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("script-message", "video_formats_toggle") end - ne.eventresponder["mbtn_right_up"] = - function () mp.commandv("script-message", "audio_formats_toggle") end - -- END quality-menu - - -- volume - ne = new_element("volume", "button") - - ne.content = function() - local volume = mp.get_property_number("volume", 0) - local mute = mp.get_property_native("mute") - local volicon = {"\238\132\139", "\238\132\140", - "\238\132\141", "\238\132\142"} - if volume == 0 or mute then - return "\238\132\138" - else - return volicon[math.min(4,math.ceil(volume / (100/3)))] - end - end - ne.eventresponder["mbtn_left_up"] = - function () mp.commandv("cycle", "mute") end - - ne.eventresponder["wheel_up_press"] = - function () mp.commandv("osd-auto", "add", "volume", 5) end - ne.eventresponder["wheel_down_press"] = - function () mp.commandv("osd-auto", "add", "volume", -5) end - - - -- load layout - layouts[user_opts.layout]() - - -- load window controls - if window_controls_enabled() then - window_controls(user_opts.layout == "topbar") - end - - --do something with the elements - prepare_elements() - - update_margins() -end - -function reset_margins() - if state.using_video_margins then - for _, opt in ipairs(margins_opts) do - mp.set_property_number(opt[2], 0.0) - end - state.using_video_margins = false - end -end - -function update_margins() - local margins = osc_param.video_margins - - -- Don't use margins if it's visible only temporarily. - if (not state.osc_visible) or (get_hidetimeout() >= 0) or - (state.fullscreen and not user_opts.showfullscreen) or - (not state.fullscreen and not user_opts.showwindowed) - then - margins = {l = 0, r = 0, t = 0, b = 0} - end - - if user_opts.boxvideo then - -- check whether any margin option has a non-default value - local margins_used = false - - if not state.using_video_margins then - for _, opt in ipairs(margins_opts) do - if mp.get_property_number(opt[2], 0.0) ~= 0.0 then - margins_used = true - end - end - end - - if not margins_used then - for _, opt in ipairs(margins_opts) do - local v = margins[opt[1]] - if (v ~= 0) or state.using_video_margins then - mp.set_property_number(opt[2], v) - state.using_video_margins = true - end - end - end - else - reset_margins() - end - - utils.shared_script_property_set("osc-margins", - string.format("%f,%f,%f,%f", margins.l, margins.r, margins.t, margins.b)) -end - -function shutdown() - reset_margins() - utils.shared_script_property_set("osc-margins", nil) -end - --- --- Other important stuff --- - - -function show_osc() - -- show when disabled can happen (e.g. mouse_move) due to async/delayed unbinding - if not state.enabled then return end - - msg.trace("show_osc") - --remember last time of invocation (mouse move) - state.showtime = mp.get_time() - - osc_visible(true) - - if (user_opts.fadeduration > 0) then - state.anitype = nil - end -end - -function hide_osc() - msg.trace("hide_osc") - if not state.enabled then - -- typically hide happens at render() from tick(), but now tick() is - -- no-op and won't render again to remove the osc, so do that manually. - state.osc_visible = false - render_wipe() - elseif (user_opts.fadeduration > 0) then - if not(state.osc_visible == false) then - state.anitype = "out" - request_tick() - end - else - osc_visible(false) - end -end - -function osc_visible(visible) - if state.osc_visible ~= visible then - state.osc_visible = visible - update_margins() - end - request_tick() -end - -function pause_state(name, enabled) - state.paused = enabled - request_tick() -end - -function cache_state(name, st) - state.cache_state = st - request_tick() -end - --- Request that tick() is called (which typically re-renders the OSC). --- The tick is then either executed immediately, or rate-limited if it was --- called a small time ago. -function request_tick() - if state.tick_timer == nil then - state.tick_timer = mp.add_timeout(0, tick) - end - - if not state.tick_timer:is_enabled() then - local now = mp.get_time() - local timeout = tick_delay - (now - state.tick_last_time) - if timeout < 0 then - timeout = 0 - end - state.tick_timer.timeout = timeout - state.tick_timer:resume() - end -end - -function mouse_leave() - if get_hidetimeout() >= 0 then - hide_osc() - end - -- reset mouse position - state.last_mouseX, state.last_mouseY = nil, nil - state.mouse_in_window = false -end - -function request_init() - state.initREQ = true - request_tick() -end - --- Like request_init(), but also request an immediate update -function request_init_resize() - request_init() - -- ensure immediate update - state.tick_timer:kill() - state.tick_timer.timeout = 0 - state.tick_timer:resume() -end - -function render_wipe() - msg.trace("render_wipe()") - state.osd.data = "" -- allows set_osd to immediately update on enable - state.osd:remove() -end - -function render() - msg.trace("rendering") - local current_screen_sizeX, current_screen_sizeY, aspect = mp.get_osd_size() - local mouseX, mouseY = get_virt_mouse_pos() - local now = mp.get_time() - - -- check if display changed, if so request reinit - if not (state.mp_screen_sizeX == current_screen_sizeX - and state.mp_screen_sizeY == current_screen_sizeY) then - - request_init_resize() - - state.mp_screen_sizeX = current_screen_sizeX - state.mp_screen_sizeY = current_screen_sizeY - end - - -- init management - if state.active_element then - -- mouse is held down on some element - keep ticking and igore initReq - -- till it's released, or else the mouse-up (click) will misbehave or - -- get ignored. that's because osc_init() recreates the osc elements, - -- but mouse handling depends on the elements staying unmodified - -- between mouse-down and mouse-up (using the index active_element). - request_tick() - elseif state.initREQ then - osc_init() - state.initREQ = false - - -- store initial mouse position - if (state.last_mouseX == nil or state.last_mouseY == nil) - and not (mouseX == nil or mouseY == nil) then - - state.last_mouseX, state.last_mouseY = mouseX, mouseY - end - end - - - -- fade animation - if not(state.anitype == nil) then - - if (state.anistart == nil) then - state.anistart = now - end - - if (now < state.anistart + (user_opts.fadeduration/1000)) then - - if (state.anitype == "in") then --fade in - osc_visible(true) - state.animation = scale_value(state.anistart, - (state.anistart + (user_opts.fadeduration/1000)), - 255, 0, now) - elseif (state.anitype == "out") then --fade out - state.animation = scale_value(state.anistart, - (state.anistart + (user_opts.fadeduration/1000)), - 0, 255, now) - end - - else - if (state.anitype == "out") then - osc_visible(false) - end - kill_animation() - end - else - kill_animation() - end - - --mouse show/hide area - for k,cords in pairs(osc_param.areas["showhide"]) do - set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide") - end - if osc_param.areas["showhide_wc"] then - for k,cords in pairs(osc_param.areas["showhide_wc"]) do - set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "showhide_wc") - end - else - set_virt_mouse_area(0, 0, 0, 0, "showhide_wc") - end - do_enable_keybindings() - - --mouse input area - local mouse_over_osc = false - - for _,cords in ipairs(osc_param.areas["input"]) do - if state.osc_visible then -- activate only when OSC is actually visible - set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "input") - end - if state.osc_visible ~= state.input_enabled then - if state.osc_visible then - mp.enable_key_bindings("input") - else - mp.disable_key_bindings("input") - end - state.input_enabled = state.osc_visible - end - - if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then - mouse_over_osc = true - end - end - - if osc_param.areas["window-controls"] then - for _,cords in ipairs(osc_param.areas["window-controls"]) do - if state.osc_visible then -- activate only when OSC is actually visible - set_virt_mouse_area(cords.x1, cords.y1, cords.x2, cords.y2, "window-controls") - mp.enable_key_bindings("window-controls") - else - mp.disable_key_bindings("window-controls") - end - - if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then - mouse_over_osc = true - end - end - end - - if osc_param.areas["window-controls-title"] then - for _,cords in ipairs(osc_param.areas["window-controls-title"]) do - if (mouse_hit_coords(cords.x1, cords.y1, cords.x2, cords.y2)) then - mouse_over_osc = true - end - end - end - - -- autohide - if not (state.showtime == nil) and (get_hidetimeout() >= 0) then - local timeout = state.showtime + (get_hidetimeout()/1000) - now - if timeout <= 0 then - if (state.active_element == nil) and not (mouse_over_osc) then - hide_osc() - end - else - -- the timer is only used to recheck the state and to possibly run - -- the code above again - if not state.hide_timer then - state.hide_timer = mp.add_timeout(0, tick) - end - state.hide_timer.timeout = timeout - -- re-arm - state.hide_timer:kill() - state.hide_timer:resume() - end - end - - - -- actual rendering - local ass = assdraw.ass_new() - - -- Messages - render_message(ass) - - -- actual OSC - if state.osc_visible then - render_elements(ass) - end - - -- submit - set_osd(osc_param.playresy * osc_param.display_aspect, - osc_param.playresy, ass.text) -end - --- --- Eventhandling --- - -local function element_has_action(element, action) - return element and element.eventresponder and - element.eventresponder[action] -end - -function process_event(source, what) - local action = string.format("%s%s", source, - what and ("_" .. what) or "") - - if what == "down" or what == "press" then - - for n = 1, #elements do - - if mouse_hit(elements[n]) and - elements[n].eventresponder and - (elements[n].eventresponder[source .. "_up"] or - elements[n].eventresponder[action]) then - - if what == "down" then - state.active_element = n - state.active_event_source = source - end - -- fire the down or press event if the element has one - if element_has_action(elements[n], action) then - elements[n].eventresponder[action](elements[n]) - end - - end - end - - elseif what == "up" then - - if elements[state.active_element] then - local n = state.active_element - - if n == 0 then - --click on background (does not work) - elseif element_has_action(elements[n], action) and - mouse_hit(elements[n]) then - - elements[n].eventresponder[action](elements[n]) - end - - --reset active element - if element_has_action(elements[n], "reset") then - elements[n].eventresponder["reset"](elements[n]) - end - - end - state.active_element = nil - state.mouse_down_counter = 0 - - elseif source == "mouse_move" then - - state.mouse_in_window = true - - local mouseX, mouseY = get_virt_mouse_pos() - if (user_opts.minmousemove == 0) or - (not ((state.last_mouseX == nil) or (state.last_mouseY == nil)) and - ((math.abs(mouseX - state.last_mouseX) >= user_opts.minmousemove) - or (math.abs(mouseY - state.last_mouseY) >= user_opts.minmousemove) - ) - ) then - show_osc() - end - state.last_mouseX, state.last_mouseY = mouseX, mouseY - - local n = state.active_element - if element_has_action(elements[n], action) then - elements[n].eventresponder[action](elements[n]) - end - end - - -- ensure rendering after any (mouse) event - icons could change etc - request_tick() -end - - -local logo_lines = { - -- White border - "{\\c&HE5E5E5&\\p6}m 895 10 b 401 10 0 410 0 905 0 1399 401 1800 895 1800 1390 1800 1790 1399 1790 905 1790 410 1390 10 895 10 {\\p0}", - -- Purple fill - "{\\c&H682167&\\p6}m 925 42 b 463 42 87 418 87 880 87 1343 463 1718 925 1718 1388 1718 1763 1343 1763 880 1763 418 1388 42 925 42{\\p0}", - -- Darker fill - "{\\c&H430142&\\p6}m 1605 828 b 1605 1175 1324 1456 977 1456 631 1456 349 1175 349 828 349 482 631 200 977 200 1324 200 1605 482 1605 828{\\p0}", - -- White fill - "{\\c&HDDDBDD&\\p6}m 1296 910 b 1296 1131 1117 1310 897 1310 676 1310 497 1131 497 910 497 689 676 511 897 511 1117 511 1296 689 1296 910{\\p0}", - -- Triangle - "{\\c&H691F69&\\p6}m 762 1113 l 762 708 b 881 776 1000 843 1119 911 1000 978 881 1046 762 1113{\\p0}", -} - -local santa_hat_lines = { - -- Pompoms - "{\\c&HC0C0C0&\\p6}m 500 -323 b 491 -322 481 -318 475 -311 465 -312 456 -319 446 -318 434 -314 427 -304 417 -297 410 -290 404 -282 395 -278 390 -274 387 -267 381 -265 377 -261 379 -254 384 -253 397 -244 409 -232 425 -228 437 -228 446 -218 457 -217 462 -216 466 -213 468 -209 471 -205 477 -203 482 -206 491 -211 499 -217 508 -222 532 -235 556 -249 576 -267 584 -272 584 -284 578 -290 569 -305 550 -312 533 -309 523 -310 515 -316 507 -321 505 -323 503 -323 500 -323{\\p0}", - "{\\c&HE0E0E0&\\p6}m 315 -260 b 286 -258 259 -240 246 -215 235 -210 222 -215 211 -211 204 -188 177 -176 172 -151 170 -139 163 -128 154 -121 143 -103 141 -81 143 -60 139 -46 125 -34 129 -17 132 -1 134 16 142 30 145 56 161 80 181 96 196 114 210 133 231 144 266 153 303 138 328 115 373 79 401 28 423 -24 446 -73 465 -123 483 -174 487 -199 467 -225 442 -227 421 -232 402 -242 384 -254 364 -259 342 -250 322 -260 320 -260 317 -261 315 -260{\\p0}", - -- Main cap - "{\\c&H0000F0&\\p6}m 1151 -523 b 1016 -516 891 -458 769 -406 693 -369 624 -319 561 -262 526 -252 465 -235 479 -187 502 -147 551 -135 588 -111 1115 165 1379 232 1909 761 1926 800 1952 834 1987 858 2020 883 2053 912 2065 952 2088 1000 2146 962 2139 919 2162 836 2156 747 2143 662 2131 615 2116 567 2122 517 2120 410 2090 306 2089 199 2092 147 2071 99 2034 64 1987 5 1928 -41 1869 -86 1777 -157 1712 -256 1629 -337 1578 -389 1521 -436 1461 -476 1407 -509 1343 -507 1284 -515 1240 -519 1195 -521 1151 -523{\\p0}", - -- Cap shadow - "{\\c&H0000AA&\\p6}m 1657 248 b 1658 254 1659 261 1660 267 1669 276 1680 284 1689 293 1695 302 1700 311 1707 320 1716 325 1726 330 1735 335 1744 347 1752 360 1761 371 1753 352 1754 331 1753 311 1751 237 1751 163 1751 90 1752 64 1752 37 1767 14 1778 -3 1785 -24 1786 -45 1786 -60 1786 -77 1774 -87 1760 -96 1750 -78 1751 -65 1748 -37 1750 -8 1750 20 1734 78 1715 134 1699 192 1694 211 1689 231 1676 246 1671 251 1661 255 1657 248 m 1909 541 b 1914 542 1922 549 1917 539 1919 520 1921 502 1919 483 1918 458 1917 433 1915 407 1930 373 1942 338 1947 301 1952 270 1954 238 1951 207 1946 214 1947 229 1945 239 1939 278 1936 318 1924 356 1923 362 1913 382 1912 364 1906 301 1904 237 1891 175 1887 150 1892 126 1892 101 1892 68 1893 35 1888 2 1884 -9 1871 -20 1859 -14 1851 -6 1854 9 1854 20 1855 58 1864 95 1873 132 1883 179 1894 225 1899 273 1908 362 1910 451 1909 541{\\p0}", - -- Brim and tip pompom - "{\\c&HF8F8F8&\\p6}m 626 -191 b 565 -155 486 -196 428 -151 387 -115 327 -101 304 -47 273 2 267 59 249 113 219 157 217 213 215 265 217 309 260 302 285 283 373 264 465 264 555 257 608 252 655 292 709 287 759 294 816 276 863 298 903 340 972 324 1012 367 1061 394 1125 382 1167 424 1213 462 1268 482 1322 506 1385 546 1427 610 1479 662 1510 690 1534 725 1566 752 1611 796 1664 830 1703 880 1740 918 1747 986 1805 1005 1863 991 1897 932 1916 880 1914 823 1945 777 1961 725 1979 673 1957 622 1938 575 1912 534 1862 515 1836 473 1790 417 1755 351 1697 305 1658 266 1633 216 1593 176 1574 138 1539 116 1497 110 1448 101 1402 77 1371 37 1346 -16 1295 15 1254 6 1211 -27 1170 -62 1121 -86 1072 -104 1027 -128 976 -133 914 -130 851 -137 794 -162 740 -181 679 -168 626 -191 m 2051 917 b 1971 932 1929 1017 1919 1091 1912 1149 1923 1214 1970 1254 2000 1279 2027 1314 2066 1325 2139 1338 2212 1295 2254 1238 2281 1203 2287 1158 2282 1116 2292 1061 2273 1006 2229 970 2206 941 2167 938 2138 918{\\p0}", -} - --- called by mpv on every frame -function tick() - if state.marginsREQ == true then - update_margins() - state.marginsREQ = false - end - - if (not state.enabled) then return end - - if (state.idle) then - - -- render idle message - msg.trace("idle message") - local icon_x, icon_y = 320 - 26, 140 - local line_prefix = ("{\\rDefault\\an7\\1a&H00&\\bord0\\shad0\\pos(%f,%f)}"):format(icon_x, icon_y) - - local ass = assdraw.ass_new() - -- mpv logo - if user_opts.idlescreen then - for i, line in ipairs(logo_lines) do - ass:new_event() - ass:append(line_prefix .. line) - end - end - - -- Santa hat - if is_december and user_opts.idlescreen and not user_opts.greenandgrumpy then - for i, line in ipairs(santa_hat_lines) do - ass:new_event() - ass:append(line_prefix .. line) - end - end - - if user_opts.idlescreen then - ass:new_event() - ass:pos(320, icon_y+65) - ass:an(8) - ass:append("Drop files or URLs to play here.") - end - set_osd(640, 360, ass.text) - - if state.showhide_enabled then - mp.disable_key_bindings("showhide") - mp.disable_key_bindings("showhide_wc") - state.showhide_enabled = false - end - - - elseif (state.fullscreen and user_opts.showfullscreen) - or (not state.fullscreen and user_opts.showwindowed) then - - -- render the OSC - render() - else - -- Flush OSD - render_wipe() - end - - state.tick_last_time = mp.get_time() - - if state.anitype ~= nil then - -- state.anistart can be nil - animation should now start, or it can - -- be a timestamp when it started. state.idle has no animation. - if not state.idle and - (not state.anistart or - mp.get_time() < 1 + state.anistart + user_opts.fadeduration/1000) - then - -- animating or starting, or still within 1s past the deadline - request_tick() - else - kill_animation() - end - end -end - -function do_enable_keybindings() - if state.enabled then - if not state.showhide_enabled then - mp.enable_key_bindings("showhide", "allow-vo-dragging+allow-hide-cursor") - mp.enable_key_bindings("showhide_wc", "allow-vo-dragging+allow-hide-cursor") - end - state.showhide_enabled = true - end -end - -function enable_osc(enable) - state.enabled = enable - if enable then - do_enable_keybindings() - else - hide_osc() -- acts immediately when state.enabled == false - if state.showhide_enabled then - mp.disable_key_bindings("showhide") - mp.disable_key_bindings("showhide_wc") - end - state.showhide_enabled = false - end -end - --- duration is observed for the sole purpose of updating chapter markers --- positions. live streams with chapters are very rare, and the update is also --- expensive (with request_init), so it's only observed when we have chapters --- and the user didn't disable the livemarkers option (update_duration_watch). -function on_duration() request_init() end - -local duration_watched = false -function update_duration_watch() - local want_watch = user_opts.livemarkers and - (mp.get_property_number("chapters", 0) or 0) > 0 and - true or false -- ensure it's a boolean - - if (want_watch ~= duration_watched) then - if want_watch then - mp.observe_property("duration", nil, on_duration) - else - mp.unobserve_property(on_duration) - end - duration_watched = want_watch - end -end - -validate_user_opts() -update_duration_watch() - -mp.register_event("shutdown", shutdown) -mp.register_event("start-file", request_init) -mp.observe_property("track-list", nil, request_init) -mp.observe_property("playlist", nil, request_init) -mp.observe_property("chapter-list", "native", function(_, list) - list = list or {} -- safety, shouldn't return nil - table.sort(list, function(a, b) return a.time < b.time end) - state.chapter_list = list - update_duration_watch() - request_init() -end) - -mp.register_script_message("osc-message", show_message) -mp.register_script_message("osc-chapterlist", function(dur) - show_message(get_chapterlist(), dur) -end) -mp.register_script_message("osc-playlist", function(dur) - show_message(get_playlist(), dur) -end) -mp.register_script_message("osc-tracklist", function(dur) - local msg = {} - for k,v in pairs(nicetypes) do - table.insert(msg, get_tracklist(k)) - end - show_message(table.concat(msg, '\n\n'), dur) -end) - -mp.observe_property("fullscreen", "bool", - function(name, val) - state.fullscreen = val - state.marginsREQ = true - request_init_resize() - end -) -mp.observe_property("border", "bool", - function(name, val) - state.border = val - request_init_resize() - end -) -mp.observe_property("window-maximized", "bool", - function(name, val) - state.maximized = val - request_init_resize() - end -) -mp.observe_property("idle-active", "bool", - function(name, val) - state.idle = val - request_tick() - end -) -mp.observe_property("pause", "bool", pause_state) -mp.observe_property("demuxer-cache-state", "native", cache_state) -mp.observe_property("vo-configured", "bool", function(name, val) - request_tick() -end) -mp.observe_property("playback-time", "number", function(name, val) - request_tick() -end) -mp.observe_property("osd-dimensions", "native", function(name, val) - -- (we could use the value instead of re-querying it all the time, but then - -- we might have to worry about property update ordering) - request_init_resize() -end) - --- mouse show/hide bindings -mp.set_key_bindings({ - {"mouse_move", function(e) process_event("mouse_move", nil) end}, - {"mouse_leave", mouse_leave}, -}, "showhide", "force") -mp.set_key_bindings({ - {"mouse_move", function(e) process_event("mouse_move", nil) end}, - {"mouse_leave", mouse_leave}, -}, "showhide_wc", "force") -do_enable_keybindings() - ---mouse input bindings -mp.set_key_bindings({ - {"mbtn_left", function(e) process_event("mbtn_left", "up") end, - function(e) process_event("mbtn_left", "down") end}, - {"shift+mbtn_left", function(e) process_event("shift+mbtn_left", "up") end, - function(e) process_event("shift+mbtn_left", "down") end}, - {"mbtn_right", function(e) process_event("mbtn_right", "up") end, - function(e) process_event("mbtn_right", "down") end}, - -- alias to shift_mbtn_left for single-handed mouse use - {"mbtn_mid", function(e) process_event("shift+mbtn_left", "up") end, - function(e) process_event("shift+mbtn_left", "down") end}, - {"wheel_up", function(e) process_event("wheel_up", "press") end}, - {"wheel_down", function(e) process_event("wheel_down", "press") end}, - {"mbtn_left_dbl", "ignore"}, - {"shift+mbtn_left_dbl", "ignore"}, - {"mbtn_right_dbl", "ignore"}, -}, "input", "force") -mp.enable_key_bindings("input") - -mp.set_key_bindings({ - {"mbtn_left", function(e) process_event("mbtn_left", "up") end, - function(e) process_event("mbtn_left", "down") end}, -}, "window-controls", "force") -mp.enable_key_bindings("window-controls") - -function get_hidetimeout() - if user_opts.visibility == "always" then - return -1 -- disable autohide - end - return user_opts.hidetimeout -end - -function always_on(val) - if state.enabled then - if val then - show_osc() - else - hide_osc() - end - end -end - --- mode can be auto/always/never/cycle --- the modes only affect internal variables and not stored on its own. -function visibility_mode(mode, no_osd) - if mode == "cycle" then - if not state.enabled then - mode = "auto" - elseif user_opts.visibility ~= "always" then - mode = "always" - else - mode = "never" - end - end - - if mode == "auto" then - always_on(false) - enable_osc(true) - elseif mode == "always" then - enable_osc(true) - always_on(true) - elseif mode == "never" then - enable_osc(false) - else - msg.warn("Ignoring unknown visibility mode '" .. mode .. "'") - return - end - - user_opts.visibility = mode - utils.shared_script_property_set("osc-visibility", mode) - - if not no_osd and tonumber(mp.get_property("osd-level")) >= 1 then - mp.osd_message("OSC visibility: " .. mode) - end - - -- Reset the input state on a mode change. The input state will be - -- recalculated on the next render cycle, except in 'never' mode where it - -- will just stay disabled. - mp.disable_key_bindings("input") - mp.disable_key_bindings("window-controls") - state.input_enabled = false - - update_margins() - request_tick() -end - -function idlescreen_visibility(mode, no_osd) - if mode == "cycle" then - if user_opts.idlescreen then - mode = "no" - else - mode = "yes" - end - end - - if mode == "yes" then - user_opts.idlescreen = true - else - user_opts.idlescreen = false - end - - utils.shared_script_property_set("osc-idlescreen", mode) - - if not no_osd and tonumber(mp.get_property("osd-level")) >= 1 then - mp.osd_message("OSC logo visibility: " .. tostring(mode)) - end - - request_tick() -end - -visibility_mode(user_opts.visibility, true) -mp.register_script_message("osc-visibility", visibility_mode) -mp.add_key_binding(nil, "visibility", function() visibility_mode("cycle") end) - -mp.register_script_message("osc-idlescreen", idlescreen_visibility) - -set_virt_mouse_area(0, 0, 0, 0, "input") -set_virt_mouse_area(0, 0, 0, 0, "window-controls") diff --git a/niri/config.kdl b/niri/config.kdl new file mode 100644 index 0000000..07783fb --- /dev/null +++ b/niri/config.kdl @@ -0,0 +1,612 @@ +// This config is in the KDL format: https://kdl.dev +// "/-" comments out the following node. +// Check the wiki for a full description of the configuration: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction + +// Input device configuration. +// Find the full list of options on the wiki: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Input +input { + keyboard { + xkb { + // You can set rules, model, layout, variant and options. + // For more information, see xkeyboard-config(7). + + // For example: + // layout "us,ru" + // options "grp:win_space_toggle,compose:ralt,ctrl:nocaps" + layout "us" + options "caps:escape" + } + + // Enable numlock on startup, omitting this setting disables it. + numlock + } + + // Next sections include libinput settings. + // Omitting settings disables them, or leaves them at their default values. + touchpad { + // off + tap + // dwt + // dwtp + // drag false + // drag-lock + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + scroll-method "two-finger" + // disabled-on-external-mouse + } + + mouse { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "no-scroll" + } + + trackpoint { + // off + // natural-scroll + // accel-speed 0.2 + // accel-profile "flat" + // scroll-method "on-button-down" + // scroll-button 273 + // middle-emulation + } + + // Uncomment this to make the mouse warp to the center of newly focused windows. + warp-mouse-to-focus + + // Focus windows and outputs automatically when moving the mouse into them. + // Setting max-scroll-amount="0%" makes it work only on windows already fully on screen. + focus-follows-mouse max-scroll-amount="0%" +} + +// You can configure outputs by their name, which you can find +// by running `niri msg outputs` while inside a niri instance. +// The built-in laptop monitor is usually called "eDP-1". +// Find more information on the wiki: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs +// Remember to uncomment the node by removing "/-"! +output "eDP-1" { + // Uncomment this line to disable this output. + //off + + // Resolution and, optionally, refresh rate of the output. + // The format is "<width>x<height>" or "<width>x<height>@<refresh rate>". + // If the refresh rate is omitted, niri will pick the highest refresh rate + // for the resolution. + // If the mode is omitted altogether or is invalid, niri will pick one automatically. + // Run `niri msg outputs` while inside a niri instance to list all outputs and their modes. + mode "1920x1080@60.000" + + // You can use integer or fractional scale, for example use 1.5 for 150% scale. + scale 1 + + // Transform allows to rotate the output counter-clockwise, valid values are: + // normal, 90, 180, 270, flipped, flipped-90, flipped-180 and flipped-270. + transform "normal" + + // Position of the output in the global coordinate space. + // This affects directional monitor actions like "focus-monitor-left", and cursor movement. + // The cursor can only move between directly adjacent outputs. + // Output scale and rotation has to be taken into account for positioning: + // outputs are sized in logical, or scaled, pixels. + // For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, + // so to put another output directly adjacent to it on the right, set its x to 1920. + // If the position is unset or results in an overlap, the output is instead placed + // automatically. + position x=0 y=0 +} + +/-output "DP-2" { + mode "1920x1080@75.000" + scale 1 + transform "normal" + position x=0 y=0 +} + +/-output "HDMI-A-1" { + mode "1920x1080@75.000" + scale 1 + transform "normal" + position x=1920 y=0 +} + +// Settings that influence how windows are positioned and sized. +// Find more information on the wiki: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout +layout { + // Set gaps around windows in logical pixels. + gaps 16 + + // When to center a column when changing focus, options are: + // - "never", default behavior, focusing an off-screen column will keep at the left + // or right edge of the screen. + // - "always", the focused column will always be centered. + // - "on-overflow", focusing a column will center it if it doesn't fit + // together with the previously focused column. + center-focused-column "never" + + // You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between. + preset-column-widths { + // Proportion sets the width as a fraction of the output width, taking gaps into account. + // For example, you can perfectly fit four windows sized "proportion 0.25" on an output. + // The default preset widths are 1/3, 1/2 and 2/3 of the output. + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + + // Fixed sets the width in logical pixels exactly. + // fixed 1920 + } + + // You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between. + // preset-window-heights { } + + // You can change the default width of the new windows. + default-column-width { proportion 0.5; } + // If you leave the brackets empty, the windows themselves will decide their initial width. + // default-column-width {} + + // By default focus ring and border are rendered as a solid background rectangle + // behind windows. That is, they will show up through semitransparent windows. + // This is because windows using client-side decorations can have an arbitrary shape. + // + // If you don't like that, you should uncomment `prefer-no-csd` below. + // Niri will draw focus ring and border *around* windows that agree to omit their + // client-side decorations. + // + // Alternatively, you can override it with a window rule called + // `draw-border-with-background`. + + // You can change how the focus ring looks. + focus-ring { + // Uncomment this line to disable the focus ring. + // off + + // How many logical pixels the ring extends out from the windows. + width 4 + + // Colors can be set in a variety of ways: + // - CSS named colors: "red" + // - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa" + // - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others. + + // Color of the ring on the active monitor. + active-color "#198844" + + // Color of the ring on inactive monitors. + inactive-color "#1b1d1c" + + // You can also use gradients. They take precedence over solid colors. + // Gradients are rendered the same as CSS linear-gradient(angle, from, to). + // The angle is the same as in linear-gradient, and is optional, + // defaulting to 180 (top-to-bottom gradient). + // You can use any CSS linear-gradient tool on the web to set these up. + // Changing the color space is also supported, check the wiki for more info. + // + // active-gradient from="#80c8ff" to="#bbddff" angle=45 + + // You can also color the gradient relative to the entire view + // of the workspace, rather than relative to just the window itself. + // To do that, set relative-to="workspace-view". + // + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can also add a border. It's similar to the focus ring, but always visible. + border { + // The settings are the same as for the focus ring. + // If you enable the border, you probably want to disable the focus ring. + off + + width 4 + active-color "#198844" + inactive-color "#1b1d1c" + + // Color of the border around windows that request your attention. + urgent-color "#9b0000" + + // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view" + // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" + } + + // You can enable drop shadows for windows. + shadow { + // Uncomment the next line to enable shadows. + // on + + // By default, the shadow draws only around its window, and not behind it. + // Uncomment this setting to make the shadow draw behind its window. + // + // Note that niri has no way of knowing about the CSD window corner + // radius. It has to assume that windows have square corners, leading to + // shadow artifacts inside the CSD rounded corners. This setting fixes + // those artifacts. + // + // However, instead you may want to set prefer-no-csd and/or + // geometry-corner-radius. Then, niri will know the corner radius and + // draw the shadow correctly, without having to draw it behind the + // window. These will also remove client-side shadows if the window + // draws any. + // + // draw-behind-window true + + // You can change how shadows look. The values below are in logical + // pixels and match the CSS box-shadow properties. + + // Softness controls the shadow blur radius. + softness 30 + + // Spread expands the shadow. + spread 5 + + // Offset moves the shadow relative to the window. + offset x=0 y=5 + + // You can also change the shadow color and opacity. + color "#0007" + } + + // Struts shrink the area occupied by windows, similarly to layer-shell panels. + // You can think of them as a kind of outer gaps. They are set in logical pixels. + // Left and right struts will cause the next window to the side to always be visible. + // Top and bottom struts will simply add outer gaps in addition to the area occupied by + // layer-shell panels and regular gaps. + struts { + // left 64 + // right 64 + // top 64 + // bottom 64 + } +} + +// Add lines like this to spawn processes at startup. +// Note that running niri as a session supports xdg-desktop-autostart, +// which may be more convenient to use. +// See the binds section below for more spawn examples. + +// This line starts waybar, a commonly used bar for Wayland compositors. +spawn-at-startup "waybar" +spawn-at-startup "dinitctl start hyprpaper" +spawn-at-startup "dinitctl start hypridle" +spawn-at-startup "dunst" +spawn-at-startup "xwayland-satellite" + +environment { + DISPLAY ":0" +} + +// Uncomment this line to ask the clients to omit their client-side decorations if possible. +// If the client will specifically ask for CSD, the request will be honored. +// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners. +// This option will also fix border/focus ring drawing behind some semitransparent windows. +// After enabling or disabling this, you need to restart the apps for this to take effect. +prefer-no-csd + +// You can change the path where screenshots are saved. +// A ~ at the front will be expanded to the home directory. +// The path is formatted with strftime(3) to give you the screenshot date and time. +screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" + +// You can also set this to null to disable saving screenshots to disk. +// screenshot-path null + +// Animation settings. +// The wiki explains how to configure individual animations: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations +animations { + // Uncomment to turn off all animations. + // off + + // Slow down all animations by this factor. Values below 1 speed them up instead. + // slowdown 3.0 +} + +// Window rules let you adjust behavior for individual windows. +// Find more information on the wiki: +// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules + +// Work around WezTerm's initial configure bug +// by setting an empty default-column-width. +window-rule { + // This regular expression is intentionally made as specific as possible, + // since this is the default config, and we want no false positives. + // You can get away with just app-id="wezterm" if you want. + match app-id=r#"^org\.wezfurlong\.wezterm$"# + default-column-width {} +} + +// Open the Firefox picture-in-picture player as floating by default. +window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + open-floating true +} + +// Example: block out two password managers from screen capture. +// (This example rule is commented out with a "/-" in front.) +/-window-rule { + match app-id=r#"^org\.keepassxc\.KeePassXC$"# + match app-id=r#"^org\.gnome\.World\.Secrets$"# + + block-out-from "screen-capture" + + // Use this instead if you want them visible on third-party screenshot tools. + // block-out-from "screencast" +} + +// Example: enable rounded corners for all windows. +// (This example rule is commented out with a "/-" in front.) +window-rule { + geometry-corner-radius 10 + clip-to-geometry true +} + +binds { + // Keys consist of modifiers separated by + signs, followed by an XKB key name + // in the end. To find an XKB name for a particular key, you may use a program + // like wev. + // + // "Mod" is a special modifier equal to Super when running on a TTY, and to Alt + // when running as a winit window. + // + // Most actions that you can bind here can also be invoked programmatically with + // `niri msg action do-something`. + + // Mod-Shift-/, which is usually the same as Mod-?, + // shows a list of important hotkeys. + Mod+Shift+Slash { show-hotkey-overlay; } + + // Suggested binds for running programs: terminal, app launcher, screen locker. + Mod+Return hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; } + Mod+D hotkey-overlay-title="Run an Application: tofi-run" { spawn "sh" "-c" "$(tofi-run -c ~/.config/tofi/themes/dmenu_vertical)"; } + Mod+E hotkey-overlay-title="Run an Application: tofi-drun" { spawn "sh" "-c" "$(tofi-drun -c ~/.config/tofi/themes/dmenu_vertical)"; } + Mod+Q hotkey-overlay-title="Lock the Screen" { spawn "loginctl" "lock-session"; } + + // You can also use a shell. Do this if you need pipes, multiple commands, etc. + // Note: the entire command goes as a single argument in the end. + // Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; } + + // Example volume keys mappings for PipeWire & WirePlumber. + // The allow-when-locked=true property makes them work even when the session is locked. + XF86AudioRaiseVolume allow-when-locked=true { spawn "volsv" "-i"; } + XF86AudioLowerVolume allow-when-locked=true { spawn "volsv" "-d"; } + XF86AudioMute allow-when-locked=true { spawn "volsv" "-t"; } + XF86AudioMicMute allow-when-locked=true { spawn "volsv" "-m"; } + + // Open/close the Overview: a zoomed-out view of workspaces and windows. + // You can also move the mouse into the top-left hot corner, + // or do a four-finger swipe up on a touchpad. + Mod+O repeat=false { toggle-overview; } + + Mod+Shift+Q { close-window; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + + // Alternative commands that move across workspaces when reaching + // the first or last window in a column. + // Mod+J { focus-window-or-workspace-down; } + // Mod+K { focus-window-or-workspace-up; } + // Mod+Ctrl+J { move-window-down-or-to-workspace-down; } + // Mod+Ctrl+K { move-window-up-or-to-workspace-up; } + + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Ctrl+Home { move-column-to-first; } + Mod+Ctrl+End { move-column-to-last; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + + // Alternatively, there are commands to move just a single window: + // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } + // ... + + // And you can also move a whole workspace to another monitor: + // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } + // ... + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } + // ... + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + // You can bind mouse wheel scroll ticks using the following syntax. + // These binds will change direction based on the natural-scroll setting. + // + // To avoid scrolling through workspaces really fast, you can use + // the cooldown-ms property. The bind will be rate-limited to this value. + // You can set a cooldown on any bind, but it's most useful for the wheel. + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+Ctrl+WheelScrollRight { move-column-right; } + Mod+Ctrl+WheelScrollLeft { move-column-left; } + + // Usually scrolling up and down with Shift in applications results in + // horizontal scrolling; these binds replicate that. + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } + + // Similarly, you can bind touchpad scroll "ticks". + // Touchpad scrolling is continuous, so for these binds it is split into + // discrete intervals. + // These binds are also affected by touchpad's natural-scroll, so these + // example binds are "inverted", since we have natural-scroll enabled for + // touchpads by default. + // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } + // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } + + // You can refer to workspaces by index. However, keep in mind that + // niri is a dynamic workspace system, so these commands are kind of + // "best effort". Trying to refer to a workspace index bigger than + // the current workspace count will instead refer to the bottommost + // (empty) workspace. + // + // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on + // will all refer to the 3rd workspace. + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+1 { move-window-to-workspace 1; } + + // Switches focus between the current and the previous workspace. + // Mod+Tab { focus-workspace-previous; } + + // The following binds move the focused window in and out of a column. + // If the window is alone, they will consume it into the nearby column to the side. + // If the window is already in a column, they will expel it out. + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + + // Consume one window from the right to the bottom of the focused column. + Mod+Comma { consume-window-into-column; } + // Expel the bottom window from the focused column to the right. + Mod+Period { expel-window-from-column; } + + Mod+R { switch-preset-column-width; } + Mod+Shift+R { switch-preset-window-height; } + Mod+Ctrl+R { reset-window-height; } + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + + // Expand the focused column to space not taken up by other fully visible columns. + // Makes the column "fill the rest of the space". + Mod+Ctrl+F { expand-column-to-available-width; } + + Mod+C { center-column; } + + // Center all fully visible columns on screen. + Mod+Ctrl+C { center-visible-columns; } + + // Finer width adjustments. + // This command can also: + // * set width in pixels: "1000" + // * adjust width in pixels: "-5" or "+5" + // * set width as a percentage of screen width: "25%" + // * adjust width as a percentage of screen width: "-10%" or "+10%" + // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, + // set-column-width "100" will make the column occupy 200 physical screen pixels. + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + // Finer height adjustments when in column with other windows. + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { set-window-height "+10%"; } + + // Move the focused window between the floating and the tiling layout. + Mod+V { toggle-window-floating; } + Mod+Shift+V { switch-focus-between-floating-and-tiling; } + + // Toggle tabbed column display mode. + // Windows in this column will appear as vertical tabs, + // rather than stacked on top of each other. + Mod+W { toggle-column-tabbed-display; } + + // Actions to switch layouts. + // Note: if you uncomment these, make sure you do NOT have + // a matching layout switch hotkey configured in xkb options above. + // Having both at once on the same hotkey will break the switching, + // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). + // Mod+Space { switch-layout "next"; } + // Mod+Shift+Space { switch-layout "prev"; } + + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } + + // Applications such as remote-desktop clients and software KVM switches may + // request that niri stops processing the keyboard shortcuts defined here + // so they may, for example, forward the key presses as-is to a remote machine. + // It's a good idea to bind an escape hatch to toggle the inhibitor, + // so a buggy application can't hold your session hostage. + // + // The allow-inhibiting=false property can be applied to other binds as well, + // which ensures niri always processes them, even when an inhibitor is active. + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + // The quit action will show a confirmation dialog to avoid accidental exits. + Mod+Shift+E { quit; } + Ctrl+Alt+Delete { quit; } + + // Powers off the monitors. To turn them back on, do any input like + // moving the mouse or pressing any other key. + Mod+Shift+P { power-off-monitors; } + + // Browsers + Super+Alt+W { spawn "lwc"; } +} diff --git a/nsxiv/exec/key-handler b/nsxiv/exec/key-handler index 9e78004..e653dd6 100755 --- a/nsxiv/exec/key-handler +++ b/nsxiv/exec/key-handler @@ -7,10 +7,10 @@ while read file; do cp "$file" ~/Pictures/background.png ;; *) - convert "$file" ~/Pictures/background.png + magick "$file" ~/Pictures/background.png ;; esac - t -r hyprpaper + dinitctl restart hyprpaper ;; esac done diff --git a/nvim/after/ftplugin/rust.vim b/nvim/after/ftplugin/rust.vim new file mode 100644 index 0000000..7a152a7 --- /dev/null +++ b/nvim/after/ftplugin/rust.vim @@ -0,0 +1,2 @@ +:set formatoptions+=t +:set textwidth=80 diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..06b973a --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,7 @@ +require('options') +require('keymaps') +require('lsp') +require('plugins') +require('colorscheme') +require('term') +require('vimwiki') diff --git a/nvim/lua/colorscheme.lua b/nvim/lua/colorscheme.lua new file mode 100644 index 0000000..66516fa --- /dev/null +++ b/nvim/lua/colorscheme.lua @@ -0,0 +1,8 @@ +-- define your colorscheme here +local colorscheme = 'badwolf' + +local is_ok, _ = pcall(vim.cmd, "colorscheme " .. colorscheme) +if not is_ok then + vim.notify('colorscheme ' .. colorscheme .. ' not found!') + return +end diff --git a/nvim/lua/keymaps.lua b/nvim/lua/keymaps.lua new file mode 100644 index 0000000..ff04b7d --- /dev/null +++ b/nvim/lua/keymaps.lua @@ -0,0 +1,97 @@ +-- define common options +local opts = { + noremap = true, -- non-recursive + silent = true, -- do not show message +} + +-- set leader key +vim.g.mapleader = "'" + +----------------- +-- Normal mode -- +----------------- + +-- Hint: see `:h vim.map.set()` +-- Better window navigation +vim.keymap.set('n', '<C-h>', '<C-w>h', opts) +vim.keymap.set('n', '<C-j>', '<C-w>j', opts) +vim.keymap.set('n', '<C-k>', '<C-w>k', opts) +vim.keymap.set('n', '<C-l>', '<C-w>l', opts) + +-- Resize with arrows +vim.keymap.set('n', '<C-Up>', ':resize -2<CR>', opts) +vim.keymap.set('n', '<C-Down>', ':resize +2<CR>', opts) +vim.keymap.set('n', '<C-Left>', ':vertical resize -2<CR>', opts) +vim.keymap.set('n', '<C-Right>', ':vertical resize +2<CR>', opts) +vim.keymap.set('n', '<leader>wh', ':vertical resize -1<CR>') +vim.keymap.set('n', '<leader>wj', ':resize -1<CR>') +vim.keymap.set('n', '<leader>wk', ':resize +1<CR>') +vim.keymap.set('n', '<leader>wl', ':vertical resize +1<CR>') + +-- NerdTREE +vim.keymap.set('n', '<leader>tt', ':NERDTreeToggle<CR>') + +-- files +-- these may go away soon +vim.keymap.set('n', '<leader>xx', ':q<CR>') +vim.keymap.set('n', '<leader>x!', ':q!<CR>') + +-- Close with leader +vim.keymap.set('n', '<leader>ww', ':w<CR>', opts) +vim.keymap.set('n', '<leader>qq', ':q<CR>', opts) +vim.keymap.set('n', '<leader>wq', ':wq<CR>', opts) +vim.keymap.set('n', '<leader>q!', ':q!<CR>', opts) +vim.keymap.set('n', '<leader>wq', ':wq<CR>') +vim.keymap.set('n', '<leader>ee :e', '') + +-- Tabs with leader +vim.keymap.set('n', '<leader>th', ':tabprevious<CR>', opts) +vim.keymap.set('n', '<leader>tl', ':tabnext<CR>', opts) +vim.keymap.set('n', '<leader>tk', ':tabnew<CR>', opts) +vim.keymap.set('n', '<leader>tj', ':tabclose<CR>', opts) + +-- Write with sudo +vim.keymap.set('n', 'ZW', ':w !pkexec tee % >/dev/null', opts) + +-- clear search highlights +vim.keymap.set('n', '<leader>/', ':noh<CR>') + +-- toggles +vim.keymap.set('n', '<leader>tn :set', 'number!<CR>') +vim.keymap.set('n', '<leader>tr :set', 'relativenumber!<CR>') + +-- write as root +vim.keymap.set('n', 'ZW', ':w !pkexec tee % >/dev/null') + +-- config +vim.keymap.set('n', '<leader>en', ':e ~/.config/nvim/init.lua<CR>') +vim.keymap.set('n', '<leader>ec', ':source %<CR>') +vim.keymap.set('n', '<leader>er', ':source ~/.config/nvim/init.lua<CR>') + +-- Goyo +vim.keymap.set('n', '<leader>G', ':Goyo<CR>') + +-- fugitive +vim.keymap.set('n', '<leader>gp :G', 'pull<CR>') +vim.keymap.set('n', '<leader>gd :G diff', '%<CR>') + +----------------- +-- Visual mode -- +----------------- + +-- Hint: start visual mode with the same area as the previous area and the same mode +--vim.keymap.set('v', '<', '<gv', opts) +--vim.keymap.set('v', '>', '>gv', opts) + +-- windows +vim.keymap.set('v', '<C-h>', '<C-w>h') +vim.keymap.set('v', '<C-j>', '<C-w>j') +vim.keymap.set('v', '<C-k>', '<C-w>k') +vim.keymap.set('v', '<C-l>', '<C-w>l') + +-------------- +-- TERMINAL -- +-------------- + +-- escape for term windows +vim.keymap.set('t', '<Esc>', '<C-\\><C-n>') diff --git a/nvim/lua/lsp.lua b/nvim/lua/lsp.lua new file mode 100644 index 0000000..343c76b --- /dev/null +++ b/nvim/lua/lsp.lua @@ -0,0 +1,22 @@ +-- Remove Global Default Key mapping +vim.keymap.del("n", "grn") +vim.keymap.del("n", "gra") +vim.keymap.del("n", "grr") +vim.keymap.del("n", "gri") +vim.keymap.del("n", "gO") + +-- Create keymapping +-- LspAttach: After an LSP Client performs "initialize" and attaches to a buffer. +vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local keymap = vim.keymap + local lsp = vim.lsp + local bufopts = { noremap = true, silent = true } + + keymap.set("n", "gr", lsp.buf.references, bufopts) + keymap.set("n", "gd", lsp.buf.definition, bufopts) + keymap.set("n", "<space>rn", lsp.buf.rename, bufopts) + keymap.set("n", "K", lsp.buf.hover, bufopts) + keymap.set("n", "<space>f", lsp.buf.format, bufopts) + end +}) diff --git a/nvim/lua/options.lua b/nvim/lua/options.lua new file mode 100644 index 0000000..ae802be --- /dev/null +++ b/nvim/lua/options.lua @@ -0,0 +1,86 @@ +-- Hint: use `:h <option>` to figure out the meaning if needed +vim.opt.clipboard = 'unnamedplus' -- use system clipboard +vim.opt.completeopt = {'menu', 'menuone', 'noselect'} +vim.opt.mouse = 'a' -- allow the mouse to be used in nvim + +-- Tab +vim.opt.tabstop = 2 -- number of visual spaces per TAB +vim.opt.softtabstop = 2 -- number of spaces in tab when editing +vim.opt.shiftwidth = 2 -- insert 2 spaces on a tab +vim.opt.expandtab = true -- tabs are spaces +vim.opt.smartindent = true +vim.opt.smarttab = true + +-- UI config +vim.opt.number = true -- show absolute number +vim.opt.relativenumber = true -- show relative numbers +vim.opt.cursorline = true -- highlight cursor line underneath cursor horizontally +vim.opt.splitbelow = true -- open new vertical splits bottom +vim.opt.splitright = true -- open new horizontal splits right +-- vim.opt.termguicolors = true -- enable 24-bit RGB color in the TUI +vim.opt.showmode = false -- show the "-- INSERT --" and other hints + +-- Searching +vim.opt.incsearch = true -- search as characters are entered +vim.opt.hlsearch = false -- do not highlight matches +vim.opt.ignorecase = true -- ignore case in searches by default +vim.opt.smartcase = true -- but make it case sensitive if an uppercase is entered + +-- Etc +vim.opt.ruler = true -- Show row and column ruler info +vim.opt.undolevels = 1000 -- Number of undo levels +vim.opt.backspace = { "indent", "eol", "start" } -- Backspace behavior +vim.opt.foldmethod = "marker" +vim.opt.conceallevel = 2 + +-- Plugins +-- emmet +vim.g.user_emmet_leader_key = '<C-a>' + +-- zig +vim.g.zig_fmt_autosave = 1 + +-- markdown +vim.g.vim_markdown_folding_disabled = 1 +vim.g.vim_markdown_folding_level = 3 +vim.g.vim_markdown_toc_autofit = 1 +vim.g.vim_markdown_emphasis_multiline = 0 +vim.g.tex_conceal = "" +vim.g.vim_markdown_math = 1 +vim.g.vim_markdown_conceal_code_blocks = 1 +vim.g.vim_markdown_fenced_languages = { 'c++=cpp', 'viml=vim', 'bash=sh', 'ini=dosini' } +vim.g.vim_markdown_follow_anchor = 1 +vim.g.vim_markdown_math = 1 +vim.g.vim_markdown_frontmatter = 1 +vim.g.vim_markdown_toml_frontmatter = 1 +vim.g.vim_markdown_strikethrough = 1 +vim.g.vim_markdown_no_extensions_in_markdown = 1 +vim.g.vim_markdown_autowrite = 1 +vim.g.vim_markdown_auto_insert_bullets = 0 +vim.g.vim_markdown_new_list_item_indent = 0 +vim.g.vim_markdown_edit_url_in = 'tab' + +-- NERDTree +vim.g.NERDTreeGitStatusUseNerdFonts = 1 +vim.g.NERDTreeGitStatusShowClean = 1 +vim.g.NERDTreeDirArrowExpandable = '>' +vim.g.NERDTreeDirArrowCollapsible = '<' +vim.g.NERDTreeMapToggleHidden = 'z' + +-- goyo +vim.g.goyo_width = '90%' +vim.g.goyo_height = '100%' + +-- limelight +vim.g.limelight_conceal_ctermfg = 'gray' +vim.g.limelight_conceal_guifg = 'gray' + +-- devicon +vim.g.airline_powerline_fonts = 1 +vim.g.webdevicons_enable_nerdtree = 1 + +-- vim-indent-guides +vim.g.indent_guides_enable_on_vim_startup = 0 + +-- vim-signify +vim.opt.updatetime = 100 diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua new file mode 100644 index 0000000..3684b89 --- /dev/null +++ b/nvim/lua/plugins.lua @@ -0,0 +1,71 @@ +local lazypath = vim.fn.stdpath("data") .. "lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", -- latest stable release + lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +require("lazy").setup({ + -- LSP manager + { "mason-org/mason.nvim", opts = {} }, + {"vimwiki/vimwiki", + init = function() + vim.g.vimwiki_list = { + { + path = '~/.local/share/vimwiki' + }, + } + end, + }, + { + "mason-org/mason-lspconfig.nvim", + dependencies = { + "mason-org/mason.nvim", + "neovim/nvim-lspconfig", + }, + opts = { + ensure_installed = { "pylsp", "clangd", "rust_analyzer", "zls" }, + }, + }, + { + "neovim/nvim-lspconfig", + config = function() + local lspconfig = require("lspconfig") + + lspconfig.pylsp.setup({}) + end, + }, + "tanvirtin/monokai.nvim", + "lervag/vimtex", + 'tomasiser/vim-code-dark', + 'flazz/vim-colorschemes', + 'ZachIndigo/vim-preglow', + 'axvr/org.vim', + 'ziglang/zig.vim', + 'jdonaldson/vaxe', + 'xuhdev/vim-latex-live-preview', + 'waycrate/swhkd-vim', + 'HiPhish/guile.vim', + 'preservim/nerdtree', + 'Xuyuanp/nerdtree-git-plugin', + 'PhilRunninger/nerdtree-visual-selection', + 'tpope/vim-fugitive', + 'junegunn/goyo.vim', + 'junegunn/limelight.vim', + 'vim-airline/vim-airline', + 'nathanaelkane/vim-indent-guides', + 'mhinz/vim-signify', + 'tpope/vim-endwise', + 'tpope/vim-surround', + 'mattn/emmet-vim', + 'godlygeek/tabular', + 'plasticboy/vim-markdown', + 'ryanoasis/vim-devicons', + {'akinsho/toggleterm.nvim', version = "*", config = true}, +}) diff --git a/nvim/lua/term.lua b/nvim/lua/term.lua new file mode 100644 index 0000000..e7aac4e --- /dev/null +++ b/nvim/lua/term.lua @@ -0,0 +1,51 @@ +require("toggleterm").setup{ + -- size can be a number or function which is passed the current terminal + size = function(term) + if term.direction == "horizontal" then + return 15 + elseif term.direction == "vertical" then + return vim.o.columns * 0.4 + end + end, + open_mapping = [[<leader>`]], -- or { [[<c-\>]], [[<c-¥>]] } if you also use a Japanese keyboard. + hide_numbers = true, -- hide the number column in toggleterm buffers + shade_filetypes = {}, + autochdir = false, -- when neovim changes it current directory the terminal will change it's own when next it's opened + shade_terminals = true, -- NOTE: this option takes priority over highlights specified so if you specify Normal highlights you should set this to false + shading_factor = '-30', -- the percentage by which to lighten dark terminal background, default: -30 + shading_ratio = '-3', -- the ratio of shading factor for light/dark terminal background, default: -3 + start_in_insert = true, + insert_mappings = true, -- whether or not the open mapping applies in insert mode + terminal_mappings = true, -- whether or not the open mapping applies in the opened terminals + persist_size = true, + persist_mode = true, -- if set to true (default) the previous terminal mode will be remembered + direction = 'horizontal', + close_on_exit = true, -- close the terminal window when the process exits + clear_env = false, -- use only environmental variables from `env`, passed to jobstart() + -- Change the default shell. Can be a string or a function returning a string + shell = vim.o.shell, + auto_scroll = true, -- automatically scroll to the bottom on terminal output + -- This field is only relevant if direction is set to 'float' + float_opts = { + -- The border key is *almost* the same as 'nvim_open_win' + -- see :h nvim_open_win for details on borders however + -- the 'curved' border is a custom border type + -- not natively supported but implemented in this plugin. + border = 'single', + -- like `size`, width, height, row, and col can be a number or function which is passed the current terminal + winblend = 3, + title_pos = 'left' + }, + winbar = { + enabled = false, + name_formatter = function(term) -- term: Terminal + return term.name + end + }, + responsiveness = { + -- breakpoint in terms of `vim.o.columns` at which terminals will start to stack on top of each other + -- instead of next to each other + -- default = 0 which means the feature is turned off + horizontal_breakpoint = 135, + } +} diff --git a/nvim/lua/vimwiki.lua b/nvim/lua/vimwiki.lua new file mode 100644 index 0000000..43b8aa6 --- /dev/null +++ b/nvim/lua/vimwiki.lua @@ -0,0 +1,10 @@ +-- Required for Vimwiki to work +vim.opt.compatible = false + +-- Vimwiki Keybindings +local opts = { + noremap = false, + silent = true, +} + +vim.keymap.set('n', '<leader>wx', '<Plug>VimwikiIndex', opts) diff --git a/nwg-bar/bar.json b/nwg-bar/bar.json new file mode 100644 index 0000000..01a92c3 --- /dev/null +++ b/nwg-bar/bar.json @@ -0,0 +1,22 @@ +[ + { + "label": "Lock", + "exec": "loginctl lock-session", + "icon": "/usr/share/nwg-bar/images/system-lock-screen.svg" + }, + { + "label": "Logout", + "exec": "hyprctl dispatch exit", + "icon": "/usr/share/nwg-bar/images/system-log-out.svg" + }, + { + "label": "Reboot", + "exec": "systemctl reboot", + "icon": "/usr/share/nwg-bar/images/system-reboot.svg" + }, + { + "label": "Shutdown", + "exec": "systemctl -i poweroff", + "icon": "/usr/share/nwg-bar/images/system-shutdown.svg" + } +] diff --git a/nwg-bar/style.css b/nwg-bar/style.css new file mode 100644 index 0000000..023d282 --- /dev/null +++ b/nwg-bar/style.css @@ -0,0 +1,35 @@ +window { + background-color: rgba (0, 0, 0, 1.0) +} + +/* Outer bar container, takes all the window width/height */ +#outer-box { + margin: 0px +} + +/* Inner bar container, surrounds buttons */ +#inner-box { + background-color: rgba (27, 29, 28, 0.85); + border-radius: 10px; + border-style: none; + border-width: 1px; + border-color: rgba (156, 142, 122, 0.7); + padding: 5px; + margin: 5px +} + +button, image { + background: none; + border: none; + box-shadow: none +} + +button { + padding-left: 10px; + padding-right: 10px; + margin: 5px +} + +button:hover { + background-color: rgba (25, 138, 68, 1.0) +} diff --git a/python/pythonrc b/python/pythonrc new file mode 100644 index 0000000..c7cf7d5 --- /dev/null +++ b/python/pythonrc @@ -0,0 +1,40 @@ +try: + import atexit + import os + import sys + from pathlib import Path + import readline +except ImportError as e: + print(f"Couldn't load module. {e}") + sys.exit(1) + + +################ +# TAB COMPLETION # +################## + +try: + readline.parse_and_bind("tab: complete") +except ImportError: + pass + + +### XDG Compliant History File +# See https://gist.github.com/viliampucik/8713b09ff7e4d984b29bfcd7804dc1f4?permalink_comment_id=4582040#gistcomment-4582040 + +# Destroy default history file writing hook (and also tab completion, which is why we manually added it above) +if hasattr(sys, '__interactivehook__'): + del sys.__interactivehook__ + + +histfile = Path(os.getenv("XDG_CACHE_HOME", Path.home() / ".cache")) / "python_history" +try: + histfile.touch(exist_ok=True) +except FileNotFoundError: # Probably the parent directory doesn't exist + histfile.parent.mkdir(parents=True, exist_ok=True) + +readline.read_history_file(histfile) +# Don't store an obscene amount of history +readline.set_history_length(5000) +# Write to history file on exit +atexit.register(readline.write_history_file, histfile) diff --git a/qt5ct/qt5ct.conf b/qt5ct/qt5ct.conf index bf4c0e0..964da53 100644 --- a/qt5ct/qt5ct.conf +++ b/qt5ct/qt5ct.conf @@ -1,13 +1,13 @@ [Appearance] -color_scheme_path=/usr/share/qt5ct/colors/darker.conf -custom_palette=false -icon_theme=Mint-X-Grey +color_scheme_path=/home/zachir/.config/qt5ct/style-colors.conf +custom_palette=true +icon_theme=Cosmic standard_dialogs=gtk2 style=gtk2 [Fonts] -fixed=@Variant(\0\0\0@\0\0\0\x1e\0\x44\0\x65\0j\0\x61\0V\0u\0 \0L\0G\0\x43\0 \0S\0\x61\0n\0s@(\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10) -general=@Variant(\0\0\0@\0\0\0\x1e\0\x44\0\x65\0j\0\x61\0V\0u\0 \0L\0G\0\x43\0 \0S\0\x61\0n\0s@(\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10) +fixed="DejaVu LGC Sans,12,-1,5,50,0,0,0,0,0" +general="DejaVu LGC Sans,12,-1,5,50,0,0,0,0,0" [Interface] activate_item_on_single_click=1 @@ -25,7 +25,7 @@ underline_shortcut=1 wheel_scroll_lines=3 [SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1\x95\0\0\0\xfb\0\0\x5\x45\0\0\x3\x93\0\0\x1\x96\0\0\0\xfc\0\0\x5\x44\0\0\x3\x92\0\0\0\0\0\0\0\0\a\x80\0\0\x1\x96\0\0\0\xfc\0\0\x5\x44\0\0\x3\x92) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0H\0\0\x2T\0\0\x3\xdb\0\0\x4/\0\0\0H\0\0\x2T\0\0\x3\xdb\0\0\x4/\0\0\0\0\0\0\0\0\a\x80\0\0\0H\0\0\x2T\0\0\x3\xdb\0\0\x4/) [Troubleshooting] force_raster_widgets=1 diff --git a/qt6ct/qt6ct.conf b/qt6ct/qt6ct.conf index 29cd0a9..3dce998 100644 --- a/qt6ct/qt6ct.conf +++ b/qt6ct/qt6ct.conf @@ -1,8 +1,8 @@ [Appearance] -color_scheme_path=/usr/share/qt6ct/colors/airy.conf -custom_palette=false -icon_theme=Mint-X -standard_dialogs=default +color_scheme_path=/home/zachir/.config/qt6ct/style-colors.conf +custom_palette=true +icon_theme=Cosmic +standard_dialogs=gtk2 style=qt6gtk2 [Fonts] @@ -12,7 +12,7 @@ general="DejaVu LGC Sans,12,-1,5,400,0,0,0,0,0,0,0,0,0,0,1" [Interface] activate_item_on_single_click=1 buttonbox_layout=0 -cursor_flash_time=1000 +cursor_flash_time=1200 dialog_buttons_have_icons=1 double_click_interval=400 gui_effects=@Invalid() @@ -25,7 +25,7 @@ underline_shortcut=1 wheel_scroll_lines=3 [SettingsWindow] -geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\0\0\0\x3\x42\0\0\x3\xe7\0\0\0\0\0\0\0\0\0\0\x2\xde\0\0\x2\x46\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\x3\x42\0\0\x3\xe7) +geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\xff\xff\xff\xfd\xff\xff\xff\xe2\0\0\a<\0\0\x3\xf9\0\0\0\0\0\0\0\0\0\0\a9\0\0\x3\xf6\0\0\0\0\x2\0\0\0\a\x80\0\0\0\0\0\0\0\0\0\0\a9\0\0\x3\xf6) [Troubleshooting] force_raster_widgets=1 diff --git a/rofi/config.rasi b/rofi/config.rasi new file mode 100644 index 0000000..1de6cb4 --- /dev/null +++ b/rofi/config.rasi @@ -0,0 +1 @@ +@theme "dmenu.rasi" diff --git a/rofi/dmenu.rasi b/rofi/dmenu.rasi new file mode 100644 index 0000000..2ac7745 --- /dev/null +++ b/rofi/dmenu.rasi @@ -0,0 +1,43 @@ +/** + * ROFI Color theme + * User: Qball + * Copyright: Dave Davenport + */ + +* { + background-color: Black; + border-color: White; + text-color: White; + font: "JetBrainsMono Nerd Font 12"; +} +window { + anchor: north; + location: north; + width: 100%; + padding: 4px; + children: [ horibox ]; +} +horibox { + orientation: vertical; + children: [ prompt, entry, listview ]; +} +listview { + layout: vertical; + spacing: 5px; + lines: 15; +} +entry { + expand: false; + width: 10em; +} +element { + padding: 0px 2px; +} +element selected { + background-color: #198844; +} + +element-text, element-icon { + background-color: inherit; + text-color: inherit; +} diff --git a/runit/conf/logind.conf b/runit/conf/logind.conf new file mode 100644 index 0000000..c31f33a --- /dev/null +++ b/runit/conf/logind.conf @@ -0,0 +1,54 @@ +# This file is part of elogind. +# +# elogind is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# Entries in this file show the compile time defaults. +# You can change settings by editing this file. +# Defaults can be restored by simply deleting this file. +# +# See logind.conf(5) for details. + +[Login] +KillUserProcesses=yes +#KillOnlyUsers= +#KillExcludeUsers=root +#InhibitDelayMaxSec=5 +#HandlePowerKey=poweroff +#HandleSuspendKey=suspend +#HandleHibernateKey=hibernate +#HandleLidSwitch=suspend +#HandleLidSwitchExternalPower=suspend +#HandleLidSwitchDocked=ignore +#PowerKeyIgnoreInhibited=no +#SuspendKeyIgnoreInhibited=no +#HibernateKeyIgnoreInhibited=no +#LidSwitchIgnoreInhibited=yes +#HoldoffTimeoutSec=30s +#IdleAction=ignore +#IdleActionSec=30min +#RuntimeDirectorySize=10% +#RuntimeDirectoryInodes=400k +#RemoveIPC=yes +#InhibitorsMax=8192 +#SessionsMax=8192 + +[Sleep] +#AllowSuspend=yes +#AllowHibernation=yes +#AllowSuspendThenHibernate=yes +#AllowHybridSleep=yes +#AllowPowerOffInterrupts=no +#BroadcastPowerOffInterrupts=yes +#AllowSuspendInterrupts=no +#BroadcastSuspendInterrupts=yes +#HandleNvidiaSleep=no +#SuspendState=mem standby freeze +#SuspendMode= +#HibernateState=disk +#HibernateMode=platform shutdown +#HybridSleepState=disk +#HybridSleepMode=suspend platform shutdown +#HibernateDelaySec=10800 diff --git a/runit/sv/dunst/conf b/runit/sv/dunst/conf new file mode 100644 index 0000000..88353ef --- /dev/null +++ b/runit/sv/dunst/conf @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire(1). +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=1 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/dunst" diff --git a/runit/sv/dunst/log/run b/runit/sv/dunst/log/run new file mode 100755 index 0000000..09818ce --- /dev/null +++ b/runit/sv/dunst/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR:-}" ] || mkdir -p "${LOG_DIR:-}" + + exec svlogd -tt "${LOG_DIR:-}" +else + exec chpst -b mpd-log-null cat >/dev/null +fi diff --git a/runit/sv/dunst/run b/runit/sv/dunst/run new file mode 100755 index 0000000..1c0aa88 --- /dev/null +++ b/runit/sv/dunst/run @@ -0,0 +1,5 @@ +#!/bin/sh + +[ -r ./conf ] && . ./conf + +exec dunst ${OPTS:-} 2>&1 diff --git a/runit/sv/mako/conf b/runit/sv/mako/conf new file mode 100644 index 0000000..6bb79d1 --- /dev/null +++ b/runit/sv/mako/conf @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire(1). +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=1 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/mako" diff --git a/runit/sv/mako/down b/runit/sv/mako/down new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/runit/sv/mako/down diff --git a/runit/sv/mako/log/run b/runit/sv/mako/log/run new file mode 100755 index 0000000..09818ce --- /dev/null +++ b/runit/sv/mako/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR:-}" ] || mkdir -p "${LOG_DIR:-}" + + exec svlogd -tt "${LOG_DIR:-}" +else + exec chpst -b mpd-log-null cat >/dev/null +fi diff --git a/runit/sv/mako/run b/runit/sv/mako/run new file mode 100755 index 0000000..266f521 --- /dev/null +++ b/runit/sv/mako/run @@ -0,0 +1,5 @@ +#!/bin/sh + +[ -r ./conf ] && . ./conf + +exec mako ${OPTS:-} 2>&1 diff --git a/runit/sv/mpd-mpris/conf b/runit/sv/mpd-mpris/conf new file mode 100644 index 0000000..7b43455 --- /dev/null +++ b/runit/sv/mpd-mpris/conf @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire(1). +OPTS='-network unix' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=0 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/mpd-mpris" diff --git a/runit/sv/mpd-mpris/log/run b/runit/sv/mpd-mpris/log/run new file mode 100755 index 0000000..09818ce --- /dev/null +++ b/runit/sv/mpd-mpris/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR:-}" ] || mkdir -p "${LOG_DIR:-}" + + exec svlogd -tt "${LOG_DIR:-}" +else + exec chpst -b mpd-log-null cat >/dev/null +fi diff --git a/runit/sv/mpd-mpris/run b/runit/sv/mpd-mpris/run new file mode 100755 index 0000000..3883e70 --- /dev/null +++ b/runit/sv/mpd-mpris/run @@ -0,0 +1,8 @@ +#!/bin/sh + +# Wait for the PipeWire Pulse daemon to start. +sv check "$HOME/.config/runit/sv/mpd" >/dev/null || exit 1 + +[ -r ./conf ] && . ./conf + +exec mpd-mpris ${OPTS:--network unix} 2>&1 diff --git a/runit/sv/mpd-notification/conf b/runit/sv/mpd-notification/conf new file mode 100644 index 0000000..e0b9aa3 --- /dev/null +++ b/runit/sv/mpd-notification/conf @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire(1). +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=0 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/mpd-notification" diff --git a/runit/sv/mpd-notification/log/run b/runit/sv/mpd-notification/log/run new file mode 100755 index 0000000..09818ce --- /dev/null +++ b/runit/sv/mpd-notification/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR:-}" ] || mkdir -p "${LOG_DIR:-}" + + exec svlogd -tt "${LOG_DIR:-}" +else + exec chpst -b mpd-log-null cat >/dev/null +fi diff --git a/runit/sv/mpd-notification/run b/runit/sv/mpd-notification/run new file mode 100755 index 0000000..a643d56 --- /dev/null +++ b/runit/sv/mpd-notification/run @@ -0,0 +1,9 @@ +#!/bin/sh + +# Wait for the PipeWire Pulse daemon to start. +sv check "$HOME/.config/runit/sv/mpd" >/dev/null || exit 1 +sv check "$HOME/.config/runit/sv/mako" >/dev/null || exit 1 + +[ -r ./conf ] && . ./conf + +exec mpd-notification ${OPTS:-} 2>&1 diff --git a/runit/sv/mpd/conf b/runit/sv/mpd/conf new file mode 100644 index 0000000..ca3a82f --- /dev/null +++ b/runit/sv/mpd/conf @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire(1). +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=0 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/mpd" diff --git a/runit/sv/mpd/log/run b/runit/sv/mpd/log/run new file mode 100755 index 0000000..09818ce --- /dev/null +++ b/runit/sv/mpd/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR:-}" ] || mkdir -p "${LOG_DIR:-}" + + exec svlogd -tt "${LOG_DIR:-}" +else + exec chpst -b mpd-log-null cat >/dev/null +fi diff --git a/runit/sv/mpd/run b/runit/sv/mpd/run new file mode 100755 index 0000000..b57d5ac --- /dev/null +++ b/runit/sv/mpd/run @@ -0,0 +1,8 @@ +#!/bin/sh + +# Wait for the PipeWire Pulse daemon to start. +sv check "$HOME/.config/runit/sv/pipewire-pulse" >/dev/null || exit 1 + +[ -r ./conf ] && . ./conf + +exec mpd --no-daemon --stderr ${OPTS:-} 2>&1 diff --git a/runit/sv/pipewire-pulse/conf b/runit/sv/pipewire-pulse/conf new file mode 100644 index 0000000..606eac5 --- /dev/null +++ b/runit/sv/pipewire-pulse/conf @@ -0,0 +1,12 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for pipewire-pulse. +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=0 +# Set the pipewire log level. +# See: https://docs.pipewire.org/page_daemon.html#sec_logging +LOG_LEVEL=1 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/pipewire-pulse" diff --git a/runit/sv/pipewire-pulse/log/run b/runit/sv/pipewire-pulse/log/run new file mode 100755 index 0000000..ba8236e --- /dev/null +++ b/runit/sv/pipewire-pulse/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" = "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR}" ] || mkdir -p "${LOG_DIR}" + + exec svlogd -tt "${LOG_DIR}" +else + exec chpst -b pipewire-pulse-log-null cat >/dev/null +fi diff --git a/runit/sv/pipewire-pulse/run b/runit/sv/pipewire-pulse/run new file mode 100755 index 0000000..0e43d6f --- /dev/null +++ b/runit/sv/pipewire-pulse/run @@ -0,0 +1,12 @@ +#!/bin/sh + +# Wait for the PipeWire Media Session daemon to start. +sv check "$HOME/.config/runit/sv/wireplumber" >/dev/null || exit 1 + +[ -r ./conf ] && . ./conf + +if [ "${LOGGING_ENABLE}x" = "1x" -a -n "${LOG_LEVEL}" ]; then + export PIPEWIRE_DEBUG="${LOG_LEVEL}" +fi + +exec pipewire-pulse ${OPTS:-} 2>&1 diff --git a/runit/sv/wireplumber/conf b/runit/sv/wireplumber/conf new file mode 100644 index 0000000..d712f03 --- /dev/null +++ b/runit/sv/wireplumber/conf @@ -0,0 +1,12 @@ +# -*- mode: sh; -*- + +# Additional command line arguments for wireplumber. +OPTS='' + +# Setting this to 1 enables logging, any other value - disables. +LOGGING_ENABLE=0 +# Set the wireplumber log level. +# See: https://pipewire.pages.freedesktop.org/wireplumber/daemon-logging.html +LOG_LEVEL=2 +# The directory will be created for you, if logging is enabled. +LOG_DIR="$HOME/.local/var/log/wireplumber" diff --git a/runit/sv/wireplumber/log/run b/runit/sv/wireplumber/log/run new file mode 100755 index 0000000..aa89d14 --- /dev/null +++ b/runit/sv/wireplumber/log/run @@ -0,0 +1,12 @@ +#!/bin/sh + +[ -r ../conf ] && . ../conf + +if [ "${LOGGING_ENABLE}x" == "1x" ]; then + # Create the log directory if not exists. + [ -d "${LOG_DIR}" ] || mkdir -p "${LOG_DIR}" + + exec svlogd -tt "${LOG_DIR}" +else + exec chpst -b wireplumber-log-null cat >/dev/null +fi diff --git a/runit/sv/wireplumber/run b/runit/sv/wireplumber/run new file mode 100755 index 0000000..5fb9edc --- /dev/null +++ b/runit/sv/wireplumber/run @@ -0,0 +1,12 @@ +#!/bin/sh + +# Wait for the PipeWire daemon to start. +sv check "$HOME/.config/runit/sv/pipewire" >/dev/null || exit 1 + +[ -r ./conf ] && . ./conf + +if [ "${LOGGING_ENABLE}x" = "1x" -a -n "${LOG_LEVEL}" ]; then + export WIREPLUMBER_DEBUG="${LOG_LEVEL}" +fi + +exec wireplumber ${OPTS:-} 2>&1 diff --git a/scroll/config b/scroll/config new file mode 100644 index 0000000..c6bb704 --- /dev/null +++ b/scroll/config @@ -0,0 +1,595 @@ +# vim: ft=swayconfig +# +# Default config for scroll +# +# Copy this to ~/.config/scroll/config and edit it to your liking. +# +# Read `man 5 scroll` for a complete reference. + +include /etc/scroll/config.d/* + +# This includes config.d/user.conf, which should set the $home variable +include ~/.config/scroll/config.d/user.conf + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left Left +set $down Down +set $up Up +set $right Right +# Your preferred terminal emulator +set $term kitty +# Your preferred application launcher +set $rmenu tofi-drun --drun-launch=true -c ~/.config/tofi/themes/dmenu_vertical +set $dmenu dmenu_run -l 15 +# Your preferred file manager +set $filemanager kitty -e lf + +# The scripts directory +set $scripts $home/.config/scroll/scripts + +exec waybar +exec hypridle +exec hyprpaper + +### Output configuration +# +# Default wallpaper (more resolutions are available in /usr/share/backgrounds/scroll/) +# output * bg /usr/share/backgrounds/scroll/Sway_Wallpaper_Blue_1920x1080.png fill +# +# Example configuration: +# +# output HDMI-A-1 resolution 1920x1080 position 1920,0 +# +# You can get the names of your outputs by running: scrollmsg -t get_outputs + +#output eDP-1 resolution 1920x1080 position 0 0 +#output HDMI-A-1 resolution 1920x1080 position 1920 0 +#output DP-2 resolution 1920x1080 position 0 0 + +### Idle configuration +# +# Example configuration: +# +# exec swayidle -w \ +# timeout 300 'swaylock -f -c 000000' \ +# timeout 600 'scrollmsg "output * power off"' resume 'scrollmsg "output * power on"' \ +# before-sleep 'swaylock -f -c 000000' +# +# This will lock your screen after 300 seconds of inactivity, then turn off +# your displays after another 300 seconds, and turn your screens back on when +# resumed. It will also lock your screen before your computer goes to sleep. + +### Input configuration +# +# Example configuration: +# +# input type:touchpad { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# input type:keyboard { +# xkb_layout "eu" +# } +# +# You can also configure each device individually. +# Read `man 5 scroll-input` for more information about this section. + +### Windows defaults +default_border pixel 2 +gaps inner 4 +gaps outer 20 +client.focused #198844 #000000 #e0e0e0 #198844 #198844 +client.focused_inactive #1b1d1c #000000 #e0e0e0 #1b1d1c #1b1d1c +client.unfocused #1b1d1c #000000 #e0e0e0 #1b1d1c #1b1d1c + +# Idle inhibit for fullscreen windows +for_window [all] inhibit_idle fullscreen + +# Layout settings +layout_default_width 0.5 +layout_default_height 1.0 +layout_widths [0.33333333 0.5 0.666666667 1.0] +layout_heights [0.33333333 0.5 0.666666667 1.0] + +fullscreen_movefocus true + +focus_follows_mouse yes + +mouse_warping none + +# Animations +animations { + enabled yes + default yes 100 var 3 [ 0.215 0.61 0.355 1 ] + window_open yes 100 var 3 [ 0 0 1 1 ] + window_move yes 100 var 3 [ 0.215 0.61 0.355 1 ] off 0.05 6 [0 0.6 0.4 0 1 0 0.4 -0.6 1 -0.6] + window_size yes 100 var 3 [ -0.35 0 0 0.5 ] +} + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+Backspace kill + bindsym $mod+Shift+Backspace kill unfocused + bindsym $mod+Ctrl+Backspace kill all + + # Start your launcher + bindsym $mod+e exec $rmenu + bindsym $mod+d exec $dmenu + + # Start restart menu + bindsym $mod+r exec rs + + # Launch your file manager + bindsym $mod+Alt+f exec $filemanager + + # Lock your screen + bindsym $mod+q exec loginctl lock-session + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Closes the active application (hopefully) + bindsym $mod+Shift+q kill + + # Exit scroll (logs you out of your Wayland session) + bindsym $mod+Shift+e exec scrollnag -t warning -m 'You pressed the exit shortcut. Do you really want to exit scroll? This will end your Wayland session.' -B 'Yes, exit scroll' 'scrollmsg exit' + + # Layout mode + bindsym $mod+bracketleft set_mode h + bindsym $mod+bracketright set_mode v +# +# Moving around: +# + # Move your focus around + bindsym $mod+h focus left + bindsym $mod+j focus down + bindsym $mod+k focus up + bindsym $mod+l focus right + bindsym $mod+home focus beginning + bindsym $mod+end focus end + # Move the focused window with the same, but add Ctrl + bindsym $mod+Ctrl+h move left + bindsym $mod+Ctrl+j move down + bindsym $mod+Ctrl+k move up + bindsym $mod+Ctrl+l move right + bindsym $mod+Ctrl+home move beginning + bindsym $mod+Ctrl+end move end + # nomode + bindsym $mod+Alt+h move left nomode + bindsym $mod+Alt+j move down nomode + bindsym $mod+Alt+k move up nomode + bindsym $mod+Alt+l move right nomode + bindsym $mod+Alt+home move beginning nomode + bindsym $mod+Alt+end move end nomode + + # Focus other monitors + bindsym $mod+Shift+h focus output left + bindsym $mod+Shift+j focus output down + bindsym $mod+Shift+k focus output up + bindsym $mod+Shift+l focus output right + + # Move window to other monitors + bindsym $mod+Shift+Ctrl+h move container to output left + bindsym $mod+Shift+Ctrl+j move container to output down + bindsym $mod+Shift+Ctrl+k move container to output up + bindsym $mod+Shift+Ctrl+l move container to output right +## +## Workspaces: +## NOW USING SWAYSOME +## +# # Switch to workspace +# bindsym $mod+1 workspace number 1 +# bindsym $mod+2 workspace number 2 +# bindsym $mod+3 workspace number 3 +# bindsym $mod+4 workspace number 4 +# bindsym $mod+5 workspace number 5 +# bindsym $mod+6 workspace number 6 +# bindsym $mod+7 workspace number 7 +# bindsym $mod+8 workspace number 8 +# bindsym $mod+9 workspace number 9 +# # Move focused container to workspace +# bindsym $mod+Shift+1 move container to workspace number 1; workspace number 1 +# bindsym $mod+Shift+2 move container to workspace number 2; workspace number 2 +# bindsym $mod+Shift+3 move container to workspace number 3; workspace number 3 +# bindsym $mod+Shift+4 move container to workspace number 4; workspace number 4 +# bindsym $mod+Shift+5 move container to workspace number 5; workspace number 5 +# bindsym $mod+Shift+6 move container to workspace number 6; workspace number 6 +# bindsym $mod+Shift+7 move container to workspace number 7; workspace number 7 +# bindsym $mod+Shift+8 move container to workspace number 8; workspace number 8 +# bindsym $mod+Shift+9 move container to workspace number 9; workspace number 9 +# # Note: workspaces can have any name you want, not just numbers. +# # We just use 1-10 as the default. + +# Scaling + # Workspace + bindsym $mod+Shift+comma scale_workspace incr -0.05 + bindsym --whole-window $mod+Shift+button4 scale_workspace incr -0.05 + bindsym $mod+Shift+period scale_workspace incr 0.05 + bindsym --whole-window $mod+Shift+button5 scale_workspace incr 0.05 + bindsym $mod+Shift+Ctrl+period scale_workspace reset + + # Overview + bindsym --no-repeat $mod+tab scale_workspace overview + #bindsym --whole-window button8 scale_workspace overview + + # Jump + # jump_labels_color #9e1530FF + # jump_labels_background #15309eFF + # jump_labels_scale 0.9 + # jump_labels_keys asdf + bindsym --no-repeat $mod+slash jump + bindsym --no-repeat $mod+Shift+slash jump container + bindsym --no-repeat $mod+Ctrl+slash jump workspaces + bindsym --no-repeat $mod+Alt+slash jump floating + + # Content + bindsym $mod+comma scale_content incr -0.05 + bindsym --whole-window $mod+button4 scale_content incr -0.05 + bindsym $mod+period scale_content incr 0.05 + bindsym --whole-window $mod+button5 scale_content incr 0.05 + bindsym $mod+Ctrl+period scale_content reset + +# +# Layout stuff: +# + # Make the current focus fullscreen + bindsym $mod+f fullscreen + #bindsym $mod+Shift+f fullscreen global + bindsym $mod+Shift+f fullscreen_application toggle + bindsym $mod+Ctrl+Alt+f fullscreen_application reset + + # Maximize, not fullscreen + bindsym $mod+m lua $scripts/maximize.lua toggle + + # Toggle the current focus between tiling and floating mode + bindsym $mod+y focus mode_toggle + # Toggle layout type (h<->v) + bindsym $mod+Shift+y layout_transpose + + # Float a window + bindsym $mod+Shift+space floating toggle + + # Toggle sticky + bindsym $mod+Shift+Ctrl+a sticky toggle + # Toggle pin + bindsym --no-repeat $mod+a pin beginning + bindsym --no-repeat $mod+Shift+a pin end + + # Selection + bindsym --no-repeat $mod+Insert selection toggle + bindsym --no-repeat $mod+Ctrl+Insert selection reset + bindsym --no-repeat $mod+Shift+Insert selection move + bindsym --no-repeat $mod+Ctrl+Shift+Insert selection workspace + bindsym --no-repeat $mod+Alt+Insert selection to_trail + + # Marks + # bindsym $mod+m exec scroll-mark-toggle.sh + # bindsym $mod+Shift+m exec scroll-mark-remove.sh + # bindsym $mod+apostrophe exec scroll-mark-switch.sh + +# +# Scratchpad: +# + # Scroll has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + #bindsym $mod+Shift+z move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + #bindsym $mod+z scratchpad show + #bindsym --no-repeat $mod+Alt+z scratchpad jump + + #bindsym $mod+Ctrl+z workspace back_and_forth + +# +# Mode modifiers +# +mode "modifiers" { + bindsym $right set_mode after; mode default + bindsym $left set_mode before; mode default + bindsym home set_mode beginning; mode default + bindsym end set_mode end; mode default + bindsym $up set_mode focus; mode default + bindsym $down set_mode nofocus; mode default + bindsym h set_mode center_horiz; mode default + bindsym Shift+h set_mode nocenter_horiz; mode default + bindsym v set_mode center_vert; mode default + bindsym Shift+v set_mode nocenter_vert; mode default + bindsym r set_mode reorder_auto; mode default + bindsym Shift+r set_mode noreorder_auto; mode default + + # Return to default mode + bindsym Escape mode "default" +} +bindsym $mod+backslash mode "modifiers" + +# +# Resizing containers: +# +bindsym $mod+minus cycle_size h prev +bindsym $mod+equal cycle_size h next +bindsym $mod+Shift+minus cycle_size v prev +bindsym $mod+Shift+equal cycle_size v next + +mode "setsizeh" { + bindsym 1 set_size h 0.125; mode default + bindsym 2 set_size h 0.1666666667; mode default + bindsym 3 set_size h 0.25; mode default + bindsym 4 set_size h 0.333333333; mode default + bindsym 5 set_size h 0.375; mode default + bindsym 6 set_size h 0.5; mode default + bindsym 7 set_size h 0.625; mode default + bindsym 8 set_size h 0.6666666667; mode default + bindsym 9 set_size h 0.75; mode default + bindsym 0 set_size h 0.833333333; mode default + bindsym minus set_size h 0.875; mode default + bindsym equal set_size h 1.0; mode default + + # Return to default mode + bindsym Escape mode "default" +} +bindsym $mod+b mode "setsizeh" + +mode "setsizev" { + bindsym 1 set_size v 0.125; mode default + bindsym 2 set_size v 0.1666666667; mode default + bindsym 3 set_size v 0.25; mode default + bindsym 4 set_size v 0.333333333; mode default + bindsym 5 set_size v 0.375; mode default + bindsym 6 set_size v 0.5; mode default + bindsym 7 set_size v 0.625; mode default + bindsym 8 set_size v 0.6666666667; mode default + bindsym 9 set_size v 0.75; mode default + bindsym 0 set_size v 0.833333333; mode default + bindsym minus set_size v 0.875; mode default + bindsym equal set_size v 1.0; mode default + + # Return to default mode + bindsym Escape mode "default" +} +bindsym $mod+Shift+b mode "setsizev" + +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 100px + bindsym $down resize grow height 100px + bindsym $up resize shrink height 100px + bindsym $right resize grow width 100px + + # Return to default mode + bindsym Escape mode "default" +} +bindsym $mod+Shift+r mode "resize" + +mode "align" { + bindsym c align center; mode default + bindsym m align middle; mode default + bindsym r align reset; mode default + bindsym $left align left; mode default + bindsym $right align right; mode default + bindsym $up align up; mode default + bindsym $down align down; mode default + bindsym Escape mode "default" +} +bindsym $mod+c mode "align" + +mode "fit_size" { + bindsym w fit_size h visible proportional; mode default + bindsym Shift+w fit_size v visible proportional; mode default + bindsym Ctrl+w fit_size h visible equal; mode default + bindsym Ctrl+Shift+w fit_size v visible equal; mode default + + bindsym $right fit_size h toend proportional; mode default + bindsym Shift+$right fit_size v toend proportional; mode default + bindsym Ctrl+$right fit_size h toend equal; mode default + bindsym Ctrl+Shift+$right fit_size v toend equal; mode default + + bindsym $left fit_size h tobeg proportional; mode default + bindsym Shift+$left fit_size v tobeg proportional; mode default + bindsym Ctrl+$left fit_size h tobeg equal; mode default + bindsym Ctrl+Shift+$left fit_size v tobeg equal; mode default + + bindsym $up fit_size h active proportional; mode default + bindsym Shift+$up fit_size v active proportional; mode default + #bindsym Ctrl+$up fit_size h active equal; mode default + #bindsym Ctrl+Shift+$up fit_size v active equal; mode default + + bindsym $down fit_size h all proportional; mode default + bindsym Shift+$down fit_size v all proportional; mode default + bindsym Ctrl+$down fit_size h all equal; mode default + bindsym Ctrl+Shift+$down fit_size v all equal; mode default + bindsym Escape mode "default" +} +bindsym $mod+w mode "fit_size" + +mode "trailmark" { + bindsym bracketright trailmark next + bindsym bracketleft trailmark prev + bindsym semicolon trailmark toggle; mode default + bindsym Escape mode "default" +} +bindsym $mod+semicolon mode "trailmark" + +mode "trail" { + bindsym bracketright trail next + bindsym bracketleft trail prev + bindsym semicolon trail new; mode default + bindsym d trail delete; mode default + bindsym c trail clear; mode default + bindsym insert trail to_selection; mode default + bindsym Escape mode "default" +} +bindsym $mod+Shift+semicolon mode "trail" + +mode "spaces" { + bindsym 1 space load 1; mode default + bindsym 2 space load 2; mode default + bindsym 3 space load 3; mode default + bindsym 4 space load 4; mode default + bindsym 5 space load 5; mode default + bindsym 6 space load 6; mode default + bindsym 7 space load 7; mode default + bindsym 8 space load 8; mode default + bindsym 9 space load 9; mode default + bindsym 0 space load 0; mode default + bindsym Shift+1 space save 1; mode default + bindsym Shift+2 space save 2; mode default + bindsym Shift+3 space save 3; mode default + bindsym Shift+4 space save 4; mode default + bindsym Shift+5 space save 5; mode default + bindsym Shift+6 space save 6; mode default + bindsym Shift+7 space save 7; mode default + bindsym Shift+8 space save 8; mode default + bindsym Shift+9 space save 9; mode default + bindsym Shift+0 space save 0; mode default + bindsym Ctrl+1 space restore 1; mode default + bindsym Ctrl+2 space restore 2; mode default + bindsym Ctrl+3 space restore 3; mode default + bindsym Ctrl+4 space restore 4; mode default + bindsym Ctrl+5 space restore 5; mode default + bindsym Ctrl+6 space restore 6; mode default + bindsym Ctrl+7 space restore 7; mode default + bindsym Ctrl+8 space restore 8; mode default + bindsym Ctrl+9 space restore 9; mode default + bindsym Ctrl+0 space restore 0; mode default + bindsym Escape mode "default" +} +bindsym $mod+g mode "spaces" + +# +# Utilities: +# + # Special keys to adjust volume via PulseAudio + bindsym --locked XF86AudioMute exec volsv -t + bindsym --locked XF86AudioLowerVolume exec volsv -d + bindsym --locked XF86AudioRaiseVolume exec volsv -i + bindsym --locked XF86AudioMicMute exec volsv -m + + # Special keys to control media via playerctl + bindsym --locked XF86AudioPlay exec playerctl play-pause + bindsym --locked XF86AudioPause exec playerctl play-pause + bindsym --locked XF86AudioPrev exec playerctl previous + bindsym --locked XF86AudioNext exec playerctl next + bindsym --locked XF86AudioStop exec playerctl stop + + # Special keys to adjust brightness via brightnessctl + bindsym --locked XF86MonBrightnessDown exec bl -d + bindsym --locked XF86MonBrightnessUp exec bl -i + + # Special key to take a screenshot with grim + bindsym Print exec grim + +# Launch lwc librewolf profile interface +bindsym $mod+Alt+w exec lwc +# Launch qbc qutebrowser profile interface +bindsym $mod+Alt+q exec qbc +# Launch dmount dmenu mount script +bindsym $mod+Alt+comma exec dmount +# Launch dmenuumount dmenu umount script +bindsym $mod+Alt+period exec dmenuumount + +focus_wrapping yes + +bindgesture swipe:4:right workspace next +bindgesture swipe:4:left workspace prev + +bindgesture swipe:4:up scale_workspace overview + +# Enable window swallowing (of mpv specifically) +lua $scripts/swallow.lua + +# Enable maximize when only +lua $scripts/maximize_when_only.lua + +# Scratchpads +for_window [app_id="sphtop"] move scratchpad +for_window [app_id="sphtop"] scratchpad show +bindsym $mod+Ctrl+z lua $scripts/scratchpad.lua sphtop kitty htop +for_window [app_id="spterm"] move scratchpad +for_window [app_id="spterm"] scratchpad show +bindsym $mod+Ctrl+x lua $scripts/scratchpad.lua spterm kitty +for_window [app_id="sppmxr"] move scratchpad +for_window [app_id="sppmxr"] scratchpad show +bindsym $mod+Ctrl+c lua $scripts/scratchpad.lua sppmxr kitty pulsemixer +for_window [app_id="spblue"] move scratchpad +for_window [app_id="spblue"] scratchpad show +bindsym $mod+Ctrl+v lua $scripts/scratchpad.lua spblue kitty bluetoothctl +for_window [app_id="spncmp"] move scratchpad +for_window [app_id="spncmp"] scratchpad show +bindsym $mod+Ctrl+b lua $scripts/scratchpad.lua spncmp kitty ncmpcpp +for_window [app_id="spmutt"] move scratchpad +for_window [app_id="spmutt"] scratchpad show +bindsym $mod+Ctrl+a lua $scripts/scratchpad.lua spmutt kitty neomutt +for_window [app_id="spprof"] move scratchpad +for_window [app_id="spprof"] scratchpad show +bindsym $mod+Ctrl+s lua $scripts/scratchpad.lua spprof kitty profanity +for_window [app_id="spirss"] move scratchpad +for_window [app_id="spirss"] scratchpad show +bindsym $mod+Ctrl+d lua $scripts/scratchpad.lua spirss kitty irssi +for_window [app_id="sptodo"] move scratchpad +for_window [app_id="sptodo"] scratchpad show +bindsym $mod+Ctrl+f lua $scripts/scratchpad.lua sptodo kitty todo +for_window [app_id="sptrmc"] move scratchpad +for_window [app_id="sptrmc"] scratchpad show +bindsym $mod+Ctrl+g lua $scripts/scratchpad.lua sptrmc kitty tremc +for_window [app_id="org.pipewire.Helvum"] move scratchpad +for_window [app_id="org.pipewire.Helvum"] scratchpad show +bindsym $mod+Ctrl+q lua $scripts/scratchpad.lua org.pipewire.Helvum helvum +for_window [app_id="com.github.wwmm.easyeffects"] move scratchpad +for_window [app_id="com.github.wwmm.easyeffects"] scratchpad show +bindsym $mod+Ctrl+e lua $scripts/scratchpad.lua com.github.wwmm.easyeffects easyeffects + +# +# Workspace rules: +# +# Opens a terminal when creating workspace 6 +# workspace 6 exec kitty + + +# +# Status Bar: +# +# Read `man 5 scroll-bar` for more information about this section. +bar { + mode invisible + + #position top + + ## When the status_command prints a new line to stdout, scrollbar updates. + ## The default just shows the current date and time. + #status_command while date +'%Y-%m-%d %X'; do sleep 1; done + + #colors { + # statusline #ffffff + # background #323232 + # inactive_workspace #32323200 #32323200 #5c5c5c + # scroller #2F343AFF #055E20FF #FFFFFFFF + #} +} +# +include ~/.config/scroll/config.d/* diff --git a/scroll/config.d/swaysome.conf b/scroll/config.d/swaysome.conf new file mode 100644 index 0000000..eebf6a3 --- /dev/null +++ b/scroll/config.d/swaysome.conf @@ -0,0 +1,69 @@ +# vim: ft=swayconfig +# +# Use (un)bindcode or (un)bindsym, depending on what you used in your main sway config file. +# The `--no-warn` setting is only added to shortcuts that exist in the default config. You may want to add or remove +# that flag on some bindings depending on your config. + + +# Change focus between workspaces +bindsym --no-warn $mod+1 exec "swaysome focus 1" +bindsym --no-warn $mod+2 exec "swaysome focus 2" +bindsym --no-warn $mod+3 exec "swaysome focus 3" +bindsym --no-warn $mod+4 exec "swaysome focus 4" +bindsym --no-warn $mod+5 exec "swaysome focus 5" +bindsym --no-warn $mod+6 exec "swaysome focus 6" +bindsym --no-warn $mod+7 exec "swaysome focus 7" +bindsym --no-warn $mod+8 exec "swaysome focus 8" +bindsym --no-warn $mod+9 exec "swaysome focus 9" +#bindsym --no-warn $mod+0 exec "swaysome focus 0" + +# Move containers between workspaces +bindsym --no-warn $mod+Shift+1 exec "swaysome move 1" +bindsym --no-warn $mod+Shift+2 exec "swaysome move 2" +bindsym --no-warn $mod+Shift+3 exec "swaysome move 3" +bindsym --no-warn $mod+Shift+4 exec "swaysome move 4" +bindsym --no-warn $mod+Shift+5 exec "swaysome move 5" +bindsym --no-warn $mod+Shift+6 exec "swaysome move 6" +bindsym --no-warn $mod+Shift+7 exec "swaysome move 7" +bindsym --no-warn $mod+Shift+8 exec "swaysome move 8" +bindsym --no-warn $mod+Shift+9 exec "swaysome move 9" +#bindsym --no-warn $mod+Shift+0 exec "swaysome move 0" + +# Focus workspace groups +bindsym $mod+Alt+1 exec "swaysome focus-group 1" +bindsym $mod+Alt+2 exec "swaysome focus-group 2" +bindsym $mod+Alt+3 exec "swaysome focus-group 3" +bindsym $mod+Alt+4 exec "swaysome focus-group 4" +bindsym $mod+Alt+5 exec "swaysome focus-group 5" +bindsym $mod+Alt+6 exec "swaysome focus-group 6" +bindsym $mod+Alt+7 exec "swaysome focus-group 7" +bindsym $mod+Alt+8 exec "swaysome focus-group 8" +bindsym $mod+Alt+9 exec "swaysome focus-group 9" +#bindsym $mod+Alt+0 exec "swaysome focus-group 0" + +# Move containers to other workspace groups +bindsym $mod+Alt+Shift+1 exec "swaysome move-to-group 1" +bindsym $mod+Alt+Shift+2 exec "swaysome move-to-group 2" +bindsym $mod+Alt+Shift+3 exec "swaysome move-to-group 3" +bindsym $mod+Alt+Shift+4 exec "swaysome move-to-group 4" +bindsym $mod+Alt+Shift+5 exec "swaysome move-to-group 5" +bindsym $mod+Alt+Shift+6 exec "swaysome move-to-group 6" +bindsym $mod+Alt+Shift+7 exec "swaysome move-to-group 7" +bindsym $mod+Alt+Shift+8 exec "swaysome move-to-group 8" +bindsym $mod+Alt+Shift+9 exec "swaysome move-to-group 9" +#bindsym $mod+Alt+Shift+0 exec "swaysome move-to-group 0" + +# Move focused container to next output +bindsym $mod+o exec "swaysome next-output" +# Move focused container to previous output +bindsym $mod+Shift+o exec "swaysome prev-output" + +# Move focused workspace group to next output +bindsym $mod+Alt+o exec "swaysome workspace-group-next-output" +# Move focused workspace group to previous output +bindsym $mod+Alt+Shift+o exec "swaysome workspace-group-prev-output" + +# Init workspaces for every screen +exec "swaysome init 1" + + diff --git a/scroll/scripts/maximize.lua b/scroll/scripts/maximize.lua new file mode 100644 index 0000000..f0df156 --- /dev/null +++ b/scroll/scripts/maximize.lua @@ -0,0 +1,42 @@ +local args, state = ... + +-- Set up views table +local views = scroll.state_get_value(state, "views") +if views == nil then + scroll.state_set_value(state, "views", {}) + views = scroll.state_get_value(state, "views") +end + +local function find_view(view) + for _, v in ipairs(views) do + if v["object"] == view then + return v + end + end + return nil +end + +if args[1] == 'toggle' then + local focused_view = scroll.focused_view() + local view = find_view(focused_view) + if view == nil then + view = { + object = focused_view, + maximized = false, + wf = 0, + hf = 0 + } + table.insert(views, view) + end + view["maximized"] = not view["maximized"] + if view["maximized"] then + local container = scroll.view_get_container(focused_view) + view["wf"] = scroll.container_get_width_fraction(container) + view["hf"] = scroll.container_get_height_fraction(container) + scroll.command(nil, "set_size h 1.0") + scroll.command(nil, "set_size v 1.0") + else + scroll.command(nil, "set_size h " .. view["wf"]) + scroll.command(nil, "set_size v " .. view["hf"]) + end +end diff --git a/scroll/scripts/maximize_when_only.lua b/scroll/scripts/maximize_when_only.lua new file mode 100644 index 0000000..a047180 --- /dev/null +++ b/scroll/scripts/maximize_when_only.lua @@ -0,0 +1,38 @@ +local args, state = ... + +local maximized_containers = scroll.state_get_value(state, "maximized_containers") or {} + +local debug_notify = function(msg) + scroll.command(nil, "exec notify-send " .. msg) +end + +local maximize_container = function(container, workspace) + local wf = scroll.container_get_width_fraction(container) + local hf = scroll.container_get_height_fraction(container) + maximized_containers[workspace] = { container = container, wf = wf, hf = hf, workspace = workspace } + scroll.state_set_value(state, "maximized_containers", maximized_containers) + scroll.command(container, "set_size h 1.0") + scroll.command(container, "set_size v 1.0") +end + +local maximize_when_only = function() + local focused_workspace = scroll.focused_workspace() + local containers = scroll.workspace_get_tiling(focused_workspace) + local focused_container = scroll.focused_container() + local maximized_container = maximized_containers[focused_workspace] + if #containers == 1 then + if not maximized_container or (maximized_container and maximized_container.container ~= focused_container) then + -- debug_notify("Maximizing") + maximize_container(focused_container, focused_workspace) + end + elseif #containers > 1 and maximized_container then + -- debug_notify("Shrinking") + scroll.command(maximized_container.container, "set_size h " .. maximized_container.wf) + scroll.command(maximized_container.container, "set_size v " .. maximized_container.hf) + maximized_containers[focused_workspace] = nil + scroll.state_set_value(state, "maximized_containers", maximized_containers) + end + scroll.command(focused_container, "nop") +end + +scroll.add_callback("view_focus", maximize_when_only, nil) diff --git a/scroll/scripts/scratchpad.lua b/scroll/scripts/scratchpad.lua new file mode 100644 index 0000000..0afaa97 --- /dev/null +++ b/scroll/scripts/scratchpad.lua @@ -0,0 +1,66 @@ +local args, _ = ... +local id = "" +local terminal = false +local command = nil + +for i, arg in ipairs(args) do + if i <= 1 then + id = arg + if #args == 1 then + command = arg + end + elseif i == 2 then + if (arg == "kitty") then + terminal = true + else + command = arg + end + elseif (terminal == true) then + command = arg + break + end +end + +command = command or "kitty" + +local function exists(id) + local is_in_scratchpad = false + local cons = scroll.scratchpad_get_containers() + for _, con in ipairs(cons) do + local views = scroll.container_get_views(con) + for _, view in ipairs(views) do + local app_id = scroll.view_get_app_id(view) + if (app_id == id) then + is_in_scratchpad = true + end + end + end + return is_in_scratchpad +end + +local function is_focused(id) + local view = scroll.focused_view() + local app_id = scroll.view_get_app_id(view) + return app_id == id +end + +local function spawn(term, comm) + if (term) then + if (comm) then + scroll.command(nil, "exec kitty --class " .. id .. " -e " .. comm) + else + scroll.command(nil, "exec kitty --class " .. id) + end + else + scroll.command(nil, "exec " .. comm) + end +end + +if (not exists(id)) then + spawn(terminal, command) +end +if (is_focused(id)) then + scroll.command(nil, "scratchpad show") +else + scroll.command(nil, "[app_id=\"" .. id .. "\"] scratchpad show") +end diff --git a/scroll/scripts/swallow.lua b/scroll/scripts/swallow.lua new file mode 100644 index 0000000..5760886 --- /dev/null +++ b/scroll/scripts/swallow.lua @@ -0,0 +1,32 @@ +local function candidate(view) + local app_id = scroll.view_get_app_id(view) + if app_id == "mpv" then + local pview = scroll.view_get_parent_view(view) + if pview ~= nil and pview ~= view then + local papp_id = scroll.view_get_app_id(pview) + if papp_id == "kitty" then + return scroll.view_get_container(pview) + end + end + end + return nil +end + +local function on_create(view, _) + local parent = candidate(view) + if parent ~= nil then + scroll.command(parent, "move scratchpad") + end +end + +local function on_destroy(view, _) + local parent = candidate(view) + if parent ~= nil then + scroll.command(nil, "scratchpad show; floating toggle") + end +end + +scroll.add_callback("view_map", on_create, nil) +scroll.add_callback("view_unmap", on_destroy, nil) + + @@ -18,12 +18,18 @@ case `uname -s` in alias ls="ls -h" ;; "Linux") - alias ls="ls -h $COLOR_FLAGS_GNU" + #alias ls="ls -h $COLOR_FLAGS_GNU" + type eza >/dev/null && alias ls="eza" + ;; + "Darwin") + type eza >/dev/null && alias ls="eza --color" ;; esac alias ll='ls -l' -alias la='ls -A' -alias lla='ls -lA' +alias lt='ls -l --total-size' +alias lts='ls -l --total-size --sort size --reverse' +alias la='ls -a' +alias lla='ls -la' alias lb='lsblk' alias md='mkdir -p' alias ch='cd $HOME' @@ -33,7 +39,14 @@ alias nv='nvim' alias v='nvim' ## Change utils -alias rm='rm -i' +case `uname -s` in + "OpenBSD" | "Darwin") + alias rm='rm -i' + ;; + "Linux") + type trash-put >/dev/null && alias rm='trash-put' + ;; +esac alias cp='cp -i' alias srsync='rsync -KPUcrtvyz' @@ -73,7 +86,13 @@ esac ## Systemctl alias us='systemctl --user' -alias s='systemctl' +alias s='sudo systemctl' ## Runit #alias ursm='env SVDIR="$HOME/.local/sv/" rsm' + +# XDG dirs fix +alias svn="svn --config-dir $XDG_CONFIG_HOME/subversion" +alias adb="HOME="$XDG_DATA_HOME"/android adb" +alias wget="wget --hsts-file=\"$XDG_DATA_HOME/wget-hsts\"" +alias yarn="yarn --use-yarnrc $XDG_CONFIG_HOME/yarn/config" diff --git a/sh/functions b/sh/functions index e8515d8..e7270bc 100644 --- a/sh/functions +++ b/sh/functions @@ -57,67 +57,68 @@ R - / U. - /usr Us - /usr/share V. - /var -aw - /home/zachir/.config/awesome -b. - /home/zachir/.local/bin -bb - /home/zachir/.local/bin/blocks -bf - /home/zachir/.local/bin/slatpak-sc -bg - /home/zachir/.local/bin/generics -bi - /home/zachir/.local/bin/ignore -bsc - /home/zachir/.local/bin/scripts -bsh - /home/zachir/.local/bin/shortcmds -bsp - /home/zachir/.local/bin/sp -c - /home/zachir/.config -db - /home/zachir/.local/src/dwmbar -dc - /home/zachir/Documents -dl - /home/zachir/.local/src/dwl -dm - /home/zachir/.local/src/dmenu -do - /home/zachir/Downloads -dp - /home/zachir/Downloads/plugin/zachir_librem.one -dw - /home/zachir/Downloads/wine -e - /home/zachir/Desktop -f - /home/zachir/.var/app -h - /home/zachir/.config/hypr -lb - /home/zachir/.local/bin -lc - /home/zachir/Games/cache -lf - /home/zachir/.config/lf -ls - /home/zachir/.local/share -n3 - /home/zachir/.vst3/native -ns - /home/zachir/.vst/native -nv - /home/zachir/.config/nvim -p - /home/zachir/Pictures -qb - /home/zachir/.config/qutebrowser -qp - /home/zachir/.local/share/qutebrowser-profiles -re - /home/zachir/.local/src +aw - $XDG_CONFIG_HOME/awesome +b. - $HOME/.local/bin +bb - $HOME/.local/bin/blocks +bf - $HOME/.local/bin/slatpak-sc +bg - $HOME/.local/bin/generics +bi - $HOME/.local/bin/ignore +bsc - $HOME/.local/bin/scripts +bsh - $HOME/.local/bin/shortcmds +bsp - $HOME/.local/bin/sp +c - $XDG_CONFIG_HOME +db - $SRCDIR/dwmbar +dc - $XDG_DOCUMENTS_DIR +dl - $SRCDIR/dwl +dm - $SRCDIR/dmenu +do - $XDG_DOWNLOAD_DIR +dp - $XDG_DOWNLOAD_DIR/plugin/zachir_librem.one +dw - $XDG_DOWNLOAD_DIR/wine +e - $XDG_DESKTOP_DIR +f - $HOME/.var/app +h - $XDG_CONFIG_HOME/hypr +lb - $HOME/.local/bin +lc - $HOME/Games/cache +lf - $XDG_CONFIG_HOME/lf +ls - $XDG_DATA_HOME +n3 - $HOME/.vst3/native +ns - $HOME/.vst/native +nv - $XDG_CONFIG_HOME/nvim +p - $XDG_PICTURES_DIR +qb - $XDG_CONFIG_HOME/qutebrowser +qp - $XDG_DATA_HOME/qutebrowser-profiles +re - $SRCDIR rs - /etc/runit/sv -sc - /home/zachir/.local/bin/scripts -sh - /home/zachir/.config/sh -sl - /home/zachir/.local/src/slock +sc - $HOME/.local/bin/scripts +sh - $XDG_CONFIG_HOME/sh +sl - $SRCDIR/slock ss - /etc/s6/sv -st - /home/zachir/.local/src/st -sx - /home/zachir/.config/sxhkd -tr - /home/zachir/.local/share/Trash/files -urs - /home/zachir/.runit/sv -v3. - /home/zachir/.vst3 -v3n - /home/zachir/.vst3/native -v3y - /home/zachir/.vst3/yabridge -v. - /home/zachir/var -vi - /home/zachir/Videos -vsn - /home/zachir/.vst/native -vs. - /home/zachir/.vst -vsy - /home/zachir/.vst/yabridge -wdo - /home/zachir/.local/share/wineprefixes/default/drive_c/users/zachir/Downloads -wa - /home/zachir/.local/src/wallpapers -wd - /home/zachir/.local/share/wineprefixes/default -wr - /home/zachir/.local/share/wineprefixes -wv3 - /home/zachir/.winvst3 -wvs - /home/zachir/.winvst -ww - /home/zachir/.local/share/wineprefixes/work -x - /home/zachir/.config/X11 -y3 - /home/zachir/.vst3/yabridge -yb - /home/zachir/.cache/yay -yc - /home/zachir/.config/yay -zs - /home/zachir/.config/zsh -zx - /home/zachir/Documents/zachir.xyz +st - $SRCDIR/st +sx - $XDG_CONFIG_HOME/sxhkd +tr - $XDG_DATA_HOME/Trash/files +urs - $HOME/.runit/sv +v3. - $HOME/.vst3 +v3n - $HOME/.vst3/native +v3y - $HOME/.vst3/yabridge +v. - $HOME/var +vi - $XDG_VIDEOS_DIR +vsn - $HOME/.vst/native +vs. - $HOME/.vst +vsy - $HOME/.vst/yabridge +vw\t- $XDG_DATA_HOME/vimwiki +wdo - $WINEPREFIX/drive_c/users/zachir/Downloads +wa - $SRCDIR/wallpapers +wd - $WINEPREFIX +wr - $WINEROOT +wv3 - $HOME/.winvst3 +wvs - $HOME/.winvst +ww - $WINEROOT/work +x - $XDG_CONFIG_HOME/X11 +y3 - $HOME/.vst3/yabridge +yb - $XDG_CACHE_HOME/yay +yc - $XDG_CONFIG_HOME/yay +zs - $XDG_CONFIG_HOME/zsh +zx - $XDG_DOCUMENTS_DIR/zachir.xyz " ;; # STOPPRINT # STARTPATHS @@ -176,6 +177,7 @@ zx - /home/zachir/Documents/zachir.xyz "vsn") cd "$HOME/.vst/native" ;; "vs.") cd "$HOME/.vst" ;; "vsy") cd "$HOME/.vst/yabridge" ;; +"vw") cd "$XDG_DATA_HOME/vimwiki" ;; "wdo") cd "$WINEPREFIX/drive_c/users/$USER/Downloads" ;; "wa") cd "$SRCDIR/wallpapers" ;; "wd") cd "$WINEPREFIX" ;; @@ -1,16 +1,14 @@ -# Import ENV from system -. /etc/profile -[ -f /etc/profile.d/nix-daemon.sh ] && . /etc/profile.d/nix-daemon.sh - -# Other XDG vars +# XDG paths export XDG_DATA_HOME=${XDG_DATA_HOME:="$HOME/.local/share"} export XDG_CACHE_HOME=${XDG_CACHE_HOME:="$HOME/.cache"} export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"} . "$HOME/.config/user-dirs.dirs" -export XDG_CURRENT_DESKTOP="i3" +export XDG_CURRENT_DESKTOP="Hyprland" export XDG_DOCUMENTS_DIR=${HOME}/Documents export XDG_DOWNLOAD_DIR=${HOME}/Downloads export XDG_DESKTOP_DIR=${HOME}/Desktop +export XDG_PICTURES_DIR=${HOME}/Pictures +export XDG_STATE_HOME="${HOME}/.local/state" export XDG_VIDEOS_DIR=${HOME}/Videos export XDG_DATA_DIRS="${XDG_DATA_DIRS}:$HOME/.nix-profile/share" @@ -25,6 +23,10 @@ export ADB_VENDOR_KEY="$XDG_CONFIG_HOME"/android export LESSHISTFILE=- # Fixing Paths +export RENPY_PATH_TO_SAVES="$XDG_DATA_HOME" +export PARALLEL_HOME="$XDG_CONFIG_HOME"/parallel +export ZPLUG_HOME="$XDG_DATA_HOME/zplug" +export DOTNET_CLI_HOME="$XDG_DATA_HOME"/dotnet export MBSYNCRC="$XDG_CONFIG_HOME"/isync/mbsyncrc export ATOM_HOME="$XDG_DATA_HOME"/atom export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc @@ -41,23 +43,32 @@ export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java export GTK2_RC_FILES="$XDG_CONFIG_HOME"/gtk-2.0/gtkrc export ZDOTDIR=$HOME/.config/zsh export CARGO_HOME="$XDG_DATA_HOME"/cargo +export RUSTUP_HOME="$XDG_DATA_HOME"/rustup export WEECHAT_HOME="$XDG_CONFIG_HOME"/weechat export PASSWORD_STORE_DIR="$XDG_DATA_HOME"/pass export NOTMUCH_CONFIG="$XDG_CONFIG_HOME"/notmuch/notmuchrc export NMBGIT="$XDG_DATA_HOME"/notmuch/nmbug export WINEROOT="$XDG_DATA_HOME"/wineprefixes export WINEPREFIX="$WINEROOT"/default -export MPD_HOST="$XDG_CONFIG_HOME/mpd/socket" +export MPD_HOST="127.0.0.1" +export GTK2_RC_FILES="$XDG_CONFIG_HOME"/gtk-2.0/gtkrc +export RENPY_PATH_TO_SAVES="$XDG_DATA_HOME" +export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc +export XAUTHORITY="$XDG_RUNTIME_DIR"/X11/Xauthority +#export VIMINIT="set nocp | source ${XDG_CONFIG_HOME:-$HOME.config}/vim/vimrc" +export ANDROID_USER_HOME="$XDG_DATA_HOME"/android +export XCURSOR_PATH="/usr/share/icons:$XDG_DATA_HOME/icons" +export PYTHONSTARTUP="$XDG_CONFIG_HOME"/python/pythonrc # Scaling -export QT_AUTO_SCREEN_SCALE_FACTOR=0 -export QT_SCALE_FACTOR=1 -export QT_SCREEN_SCALE_FACTORS="1;1;1" +#export QT_AUTO_SCREEN_SCALE_FACTOR=0 +#export QT_SCALE_FACTOR=1 +#export QT_SCREEN_SCALE_FACTORS="1;1;1" export GDK_SCALE=1 export GDK_DPI_SCALE=1 # Theming -export QT_QPA_PLATFORMTHEME=qt5ct +export QT_QPA_PLATFORMTHEME=qt6ct # Fix wayland stuff export MOZ_ENABLE_WAYLAND=1 @@ -67,13 +78,17 @@ export XKB_DEFAULT_OPTIONS=caps:escape export EDITOR="nvim" export READER="zathura" export VISUAL="nvim" -export TERMINAL="alacritty" +export TERMINAL="st" export BROWSER="browser" export VIDEO="mpv" export IMAGE="sxiv" export OPENER="xdg-open" export PAGER="less" +# ZVM +export ZVM_INSTALL="$HOME/.zvm/self" +export ZVMPATH="$HOME/.zvm/bin" + # Modern SDK export N64_LIBGCCDIR="/opt/crashsdk/lib/gcc/mips64-elf/12.2.0" export ROOT=/etc/n64 @@ -83,63 +98,54 @@ export BLENDER_3_0="/usr/bin/blender" export SRCDIR="$HOME/.local/src" # OLD PATH -export SYSPATH="$PATH" +export PATHS="$(echo "$PATH" | sed 's/:/\n/g')" +USERPATH="" -# NEW PATH addtopath () { - if [ -n "$PATH" ]; then - PATH="$@:$PATH" - else - PATH="$@" - fi + local USERPATHS="$(echo "$USERPATH" | sed 's/:/\n/g')" + if [ -d "$1" ]; then + echo "$PATHS" | /usr/bin/grep -qE "^$1$" && return + echo "$USERPATHS" | /usr/bin/grep -qE "^$1$" && return + [ -n "$USERPATH" ] && USERPATH="${USERPATH}:" + USERPATH="${USERPATH}$1" + fi } -unset PATH -if [ -d "$HOME/.local/bin/testing" ]; then - addtopath "$HOME/.local/bin/testing" -fi -if [ -d "$HOME/.local/bin/shortcmds" ]; then - addtopath "$HOME/.local/bin/shortcmds" -fi -if [ -d "$HOME/.local/bin/generics" ]; then - addtopath "$HOME/.local/bin/generics" -fi -if [ -d "$HOME/.local/bin/scripts" ]; then - addtopath "$HOME/.local/bin/scripts" -fi -if [ -d "$HOME/.local/bin/sp" ]; then - addtopath "$HOME/.local/bin/sp" -fi -if [ -d "$HOME/.local/bin/blocks" ]; then - addtopath "$HOME/.local/bin/blocks" -fi -if [ -d "$HOME/.local/bin/ignore" ]; then - addtopath "$HOME/.local/bin/ignore" -fi -if [ -d "$HOME/.local/bin/volsv" ]; then - PATH="$PATH:$HOME/.local/bin/volsv" -fi -if [ -d "$HOME/.local/bin" ]; then - addtopath "$HOME/.local/bin" -fi -if [ -d "$HOME/.local/bin/flatpak-sc" ]; then - addtopath "$HOME/.local/bin/flatpak-sc" -fi -if [ -d "$HOME/.local/bin/flatpak/exports/bin" ]; then - addtopath "$HOME/.local/share/flatpak/exports/bin/" -fi -if [ -d "$CARGO_HOME/bin" ]; then - addtopath "$CARGO_HOME/bin" -fi -if [ -d "$GOPATH/bin" ]; then - addtopath "$GOPATH/bin" -fi -if [ -d "/var/lib/flatpak/exports/bin" ]; then - addtopath "/var/lib/flatpak/exports/bin" -fi +# NEW PATH +addtopath "$HOME/.local/bin/testing" +addtopath "$HOME/.local/bin/shortcmds" +addtopath "$HOME/.local/bin/generics" +addtopath "$HOME/.local/bin/scripts" +addtopath "$HOME/.local/bin/sp" +addtopath "$HOME/.local/bin/blocks" +addtopath "$HOME/.local/bin/ignore" +addtopath "$HOME/.local/bin/volsv" +addtopath "$HOME/.local/bin" +addtopath "$HOME/.local/bin/flatpak-sc" +addtopath "$HOME/.local/share/flatpak/exports/bin/" +addtopath "$CARGO_HOME/bin" +addtopath "$GOPATH/bin" +addtopath "$ZVMPATH" +addtopath "$ZVM_INSTALL" +addtopath "/var/lib/flatpak/exports/bin" # MERGE PATHS -export PATH="$PATH:$SYSPATH" - -# CLEANUP -unset SYSPATH +[ -n "$USERPATH" ] && export PATH="$USERPATH:$PATH" + +unset -f addtopath +unset USERPATH +unset PATHS + +command_not_found_handle() { +# don't run if not in a container + if [ ! -e /run/.containerenv ] && [ ! -e /.dockerenv ]; then + exit 127 + fi + + distrobox-host-exec "${@}" +} +if [ -n "${ZSH_VERSION-}" ]; then + command_not_found_handler() { + command_not_found_handle "$@" + } +fi diff --git a/sxhkd/sxhkdrc b/sxhkd/sxhkdrc index 26e633b..125f8fe 100755 --- a/sxhkd/sxhkdrc +++ b/sxhkd/sxhkdrc @@ -12,11 +12,15 @@ super + Escape # program launcher super + d - dmenu_run -i -l 15 -h 36 -fn 'mononoki Nerd Font Mono' -nb '#000' -nf '#c5c8c6' -sb '#198844' -sf '#000' + dmenu_run -l 15 # desktop application launcher +super + e + j4-dmenu-desktop --dmenu="dmenu -l 15" + +# dmenu prompt to restart programs super + r - j4-dmenu-desktop --dmenu="dmenu -i -l 15 -h 36 -fn 'mononoki Nerd Font Mono' -nb '#000' -nf '#c5c8c6' -sb '#198844' -sf '#000'" + rs # dmenu prompt for recording super + control + r diff --git a/tmux/tmux.conf b/tmux/tmux.conf index 5d3bd6c..8b23a90 100644 --- a/tmux/tmux.conf +++ b/tmux/tmux.conf @@ -6,8 +6,8 @@ set -g status-bg "#000000" set -g status-fg "#c5c6c4" # remove administrative debris (session-name, hostname, time) in status bar -set -g status-left '' -set -g status-right '#{battery_status_bg} Batt: #{battery_icon} #{battery_percentage} #{battery_remain}' +set -g status-left '%H:%M| ' +set -g status-right '%a %Y-%m-%d' # act live dvtm unbind C-b diff --git a/tofi/colors b/tofi/colors new file mode 100644 index 0000000..047c875 --- /dev/null +++ b/tofi/colors @@ -0,0 +1,17 @@ +background-color = #000000 +outline-color = #198844 +border-color = #198844 +text-color = #ffffff +prompt-color = #198844 +prompt-background = #000000 +placeholder-color = #198844 +placeholder-background = #000000 +input-color = #ffffff +input-background = #000000 +default-result-background = #000000 +alternate-result-color = #ffffff +alternate-result-background = #000000 +selection-color = #000000 +selection-match-color = #39c1ed +selection-background = #198844 + diff --git a/tofi/cosmic b/tofi/cosmic new file mode 100644 index 0000000..b339f73 --- /dev/null +++ b/tofi/cosmic @@ -0,0 +1,22 @@ +include = "themes/colors" + +hidden-character = "*" +anchor = top +width = 100% +height = 32 +horizontal = true +font-size = 18 +prompt-text = "" +font = JetBrainsMono Nerd Font +outline-width = 0 +border-width = 0 +min-input-width = 424 +result-spacing = 15 +padding-top = 0 +padding-bottom = 0 +padding-left = 0 +padding-right = 0 +history = false +selection-background-padding = 12 +result-spacing = 24 +require-match=false diff --git a/tofi/themes/colors b/tofi/themes/colors index a5f480c..047c875 100644 --- a/tofi/themes/colors +++ b/tofi/themes/colors @@ -1,10 +1,10 @@ background-color = #000000 -outline-color = #39c1ed -border-color = #39c1ed +outline-color = #198844 +border-color = #198844 text-color = #ffffff -prompt-color = #39c1ed +prompt-color = #198844 prompt-background = #000000 -placeholder-color = #39c1ed +placeholder-color = #198844 placeholder-background = #000000 input-color = #ffffff input-background = #000000 @@ -12,6 +12,6 @@ default-result-background = #000000 alternate-result-color = #ffffff alternate-result-background = #000000 selection-color = #000000 -selection-match-color = #198844 -selection-background = #39c1ed +selection-match-color = #39c1ed +selection-background = #198844 diff --git a/tofi/themes/dmenu b/tofi/themes/dmenu index 75fd7f2..8af8c80 100644 --- a/tofi/themes/dmenu +++ b/tofi/themes/dmenu @@ -1,13 +1,13 @@ -include = "themes/colors" +include = "colors" hidden-character = "*" anchor = top width = 100% -height = 24 +height = 36 horizontal = true font-size = 18 prompt-text = "" -font = mononoki Nerd Font Mono +font = JetBrainsMono Nerd Font outline-width = 0 border-width = 0 min-input-width = 424 @@ -20,3 +20,4 @@ history = false selection-background-padding = 12 result-spacing = 24 require-match=false +physical-keybindings=false diff --git a/tofi/themes/dmenu_vertical b/tofi/themes/dmenu_vertical index 24df784..2e95559 100644 --- a/tofi/themes/dmenu_vertical +++ b/tofi/themes/dmenu_vertical @@ -8,7 +8,7 @@ horizontal = false font-size = 18 prompt-text = "" prompt-padding = 18 -font = mononoki Nerd Font Mono +font = JetBrainsMono Nerd Font outline-width = 0 border-width = 0 min-input-width = 424 @@ -26,3 +26,4 @@ clip-to-padding=true history = false require-match = false num-results = 15 +physical-keybindings=false diff --git a/user-dirs.dirs b/user-dirs.dirs index 7f9a959..02d53bb 100644 --- a/user-dirs.dirs +++ b/user-dirs.dirs @@ -8,7 +8,7 @@ XDG_DESKTOP_DIR="$HOME/Desktop" XDG_DOWNLOAD_DIR="$HOME/Downloads" XDG_TEMPLATES_DIR="$HOME/Templates" -XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_PUBLICSHARE_DIR="$HOME/Shared" XDG_DOCUMENTS_DIR="$HOME/Documents" XDG_MUSIC_DIR="$HOME/Music" XDG_PICTURES_DIR="$HOME/Pictures" diff --git a/nvim/init.vim b/vim/vimrc index 8c0d378..01156b5 100644 --- a/nvim/init.vim +++ b/vim/vimrc @@ -1,8 +1,25 @@ +set runtimepath^=$XDG_CONFIG_HOME/vim +set runtimepath+=$XDG_DATA_HOME/vim +set runtimepath+=$XDG_CONFIG_HOME/vim/after + +set packpath^=$XDG_DATA_HOME/vim,$XDG_CONFIG_HOME/vim +set packpath+=$XDG_CONFIG_HOME/vim/after,$XDG_DATA_HOME/vim/after + +let g:netrw_home = $XDG_DATA_HOME."/vim" +call mkdir($XDG_DATA_HOME."/vim/spell", 'p') + +set backupdir=$XDG_STATE_HOME/vim/backup | call mkdir(&backupdir, 'p') +set directory=$XDG_STATE_HOME/vim/swap | call mkdir(&directory, 'p') +set undodir=$XDG_STATE_HOME/vim/undo | call mkdir(&undodir, 'p') +set viewdir=$XDG_STATE_HOME/vim/view | call mkdir(&viewdir, 'p') + " vimplugs {{{ -call plug#begin('~/.config/nvim/plugged') +call plug#begin('~/.config/vim/plugged') " colorschemes {{{ Plug 'tomasiser/vim-code-dark' " codedark color scheme Plug 'flazz/vim-colorschemes' " meta-color scheme package +Plug 'tomasiser/vim-code-dark' " codedark color scheme +Plug 'flazz/vim-colorschemes' " meta-color scheme package Plug 'ZachIndigo/vim-preglow' " my old color scheme " }}} " language support {{{ @@ -33,9 +50,9 @@ Plug 'ryanoasis/vim-devicons' " dev icons for nerdtree call plug#end() " }}} -" nvim options {{{ +" vim options {{{ -"" nvimrc: +"" vimrc: "" General set showmatch " Highlight matching brace @@ -43,19 +60,17 @@ set showmatch " Highlight matching brace set number set relativenumber -colorscheme 256-grayvim +colorscheme Dark2 set hlsearch " Highlight all search results set smartcase " Enable smart-case search set incsearch " Searches for strings incrementally -set autoindent " Enable auto-indent -"set smartindent " Enable smart-indent -"set nosmarttab " Enable smart-tabs set expandtab " Use spaces instead of tabs -set tabstop=2 " Number of spaces per tab set shiftwidth=2 " Number of auto-indent spaces - +set smartindent " Enable smart-indent +set smarttab " Enable smart-tabs +set softtabstop=2 " Number of spaces per Tab "" Advanced set ruler " Show row and column ruler information @@ -63,8 +78,9 @@ set undolevels=1000 " Number of undo levels set backspace=indent,eol,start " Backspace behaviour filetype plugin indent on -"" GUI Config -set guifont=mononoki\ Nerd\ Font\ Mono:h12 +"hi Normal guibg=NONE ctermbg=NONE +"hi NonText guibg=NONE ctermbg=NONE +"set background=dark set foldmethod=marker @@ -186,7 +202,7 @@ autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif " custom augroup {{{ augroup custom autocmd! - au BufEnter *.tex :LLPStartPreview + "au BufEnter *.tex :LLPStartPreview au BufEnter *.md :set textwidth=80 au BufEnter *.ms :set textwidth=80 "au BufEnter *.c :colo DevC++ @@ -196,7 +212,7 @@ augroup custom "au BufEnter *.cpp :colo DevC++ "au BufEnter *.hpp :colo DevC++ au BufWritePost init.vim :source % - " au BufWritePost *.tex :make + "au BufWritePost *.tex :make au BufWritePost *sxhkdrc* :!pkill -USR1 -x sxhkd au BufWritePost .Xresources :!xrdb ~/.Xresources au BufWritePost .gitignore :!git add .gitignore @@ -239,7 +255,7 @@ nnoremap <leader>wk :resize +1<CR> nnoremap <leader>wl :vertical resize +1<CR> " config -nnoremap <leader>en :e ~/.config/nvim/init.vim<CR> +nnoremap <leader>en :e ~/.config/vim/vimrc<CR> nnoremap <leader>ec :source %<CR> " write as root @@ -282,4 +298,4 @@ nnoremap <leader>pc :PlugClean<CR> nnoremap <leader>gp :G pull<CR> nnoremap <leader>gd :G diff %<CR> -" }}} +" }} diff --git a/waybar/config b/waybar/config index ec04dec..cc9d5e5 100644 --- a/waybar/config +++ b/waybar/config @@ -1,24 +1,77 @@ +// vim: set filetype=json5 : { - "layer": "top", + "layer": "bottom", "position": "top", "height": 36, //"output": "%%DISPLAY%%", "spacing": 4, //"margin-top": 5, - //"margin-bottom":5, + //"margin-bottom": 5, // Choose the order of the modules "modules-left":[ "hyprland/workspaces", "custom/launcher", "hyprland/window"], "modules-center":[], - "modules-right":[ "mpd", "idle_inhibitor", "pulseaudio", "cpu", "memory", "temperature#cpu", "temperature#gpu", "backlight", "network", "clock", "tray", "custom/power"], + "modules-right":[ "tray", "mpd", "idle_inhibitor", "wireplumber", "cpu", "memory", "battery", "temperature#cpu", "temperature#gpu", "backlight", "network", "clock", "custom/power"], // Modules configuration + "sway/workspaces": { + "all-outputs": false, + "persistent-workspaces": { + "11": ["eDP-1"], + "12": ["eDP-1"], + "13": ["eDP-1"], + "14": ["eDP-1"], + "15": ["eDP-1"], + "16": ["eDP-1"], + "17": ["eDP-1"], + "18": ["eDP-1"], + "19": ["eDP-1"], + }, + "format": "{icon}", + "format-icons": { + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "0", + "11": "1", + "12": "2", + "13": "3", + "14": "4", + "15": "5", + "16": "6", + "17": "7", + "18": "8", + "19": "9", + "20": "0", + "21": "1", + "22": "2", + "23": "3", + "24": "4", + "25": "5", + "26": "6", + "27": "7", + "28": "8", + "29": "9", + }, + }, + "niri/workspaces": { + "format": "{value}", + "all-outputs": false, + "on-click": "activate" + }, "hyprland/workspaces": { "format": "{icon}", "active-only": false, "all-outputs": false, + "persistent-only": true, "format-icons": { "1": "1", "2": "2", @@ -40,16 +93,29 @@ "18": "9", }, "persistent-workspaces": { - "DP-1": [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], - "HDMI-A-1": [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], + "*": 9, }, - "on-scroll-up": "hyprctl dispatch split-workspace e+1", - "on-scroll-down": "hyprctl dispatch split-workspace e-1", + "on-scroll-up": "hyprctl dispatch split:workspace r+1", + "on-scroll-down": "hyprctl dispatch split:workspace r-1", "on-click": "activate" }, + "sway/window": { + "separate-outputs": true, + "icon": true, + "format": "{title}", + "expand": true + }, + "niri/window": { + "separate-outputs": true, + "icon": true, + "format": "{title}", + "expand": true + }, "hyprland/window": { "separate-outputs": true, - "format": "{}" + "icon": true, + "format": "{title}", + "expand": true, }, "keyboard-state": { "numlock": true, @@ -92,10 +158,11 @@ "tooltip": false }, "memory": { - "format": "{}% " + "format": "{used}G " }, "battery": { - "bat": "BAT0", + //"bat": "BAT0", + "weighted-average": "true", "interval": 60, "state": { "warning": 30, @@ -105,19 +172,19 @@ "max-length": 25 }, "temperature#cpu": { - // "thermal-zone": 2, - "hwmon-path": "/sys/class/hwmon/hwmon3/temp1_input", - "critical-threshold": 80, - // "format-critical": "{temperatureC}°C {icon}", - "format": "{temperatureC}°C", + "thermal-zone": 0, + // "hwmon-path": "cat /sys/class/hwmon/hwmon5/temp1_input", + "critical-threshold": 110, + "format-critical": "{temperatureC}°C", + "format": "", "format-icons": ["", "", ""] }, "temperature#gpu": { - // "thermal-zone": 2, - "hwmon-path": "/sys/class/hwmon/hwmon1/temp2_input", - "critical-threshold": 110, - // "format-critical": "{temperatureC}°C {icon}", - "format": "{temperatureC}°C", + "thermal-zone": 1, + // "hwmon-path": "/sys/class/hwmon/hwmon4/temp1_input", + "critical-threshold": 126, + "format-critical": "{temperatureC}°C", + "format": "", "format-icons": ["", "", ""] }, "backlight": { @@ -127,7 +194,7 @@ }, "network": { // "interface": "wlp2*", // (Optional) To force the use of this interface - "format-wifi": "{essid} ({signalStrength}%) ", + "format-wifi": "{essid} ", "format-ethernet": "Connected ", "tooltip-format": "{ifname} via {gwaddr} ", "format-linked": "{ifname} (No IP) ", @@ -136,34 +203,30 @@ "max-length": 22, "on-click-right": "bash ~/.config/rofi/wifi_menu/rofi_wifi_menu" }, - "pulseaudio": { + "wireplumber": { // "scroll-step": 1, // %, can be a float "format": "{volume}% {icon}", - "format-bluetooth": "{volume}% {icon}", - "format-bluetooth-muted": "{icon} {format_source}", - "format-muted": "{format_source}", - "format-source": "", - "format-source-muted": "", - "format-icons": { - "headphone": "", - "hands-free": "", - "headset": "", - "phone": "", - "portable": "", - "car": "", - "default": ["", "", ""] - }, - "on-click": "pavucontrol" + "format-muted": "{volume}% ", + "format-icons": ["", "", ""], + "on-click": "volsv -t", + "scroll-step": 0.1 }, "custom/launcher":{ - "format": "", - "on-click": "exec $(tofi-drun)", - "on-click-right": "killall tofi" + "format": ">_", + "on-click": "rofi -show drun", + //"on-click-right": "killall rofi" + }, + "custom/battery":{ + "interval": 15, + "format": "{percentage}%", + "return-type": "json", + "exec": "custom-battery", + "tooltip": true, }, "custom/power":{ - "format": " ", - "on-click": "nwg-bar", - "on-click-right": "killall nwg-bar" + "format": "", + "on-click": "power-menu", + //"on-click-right": "killall rofi" }, "custom/snip":{ "format": " ", diff --git a/waybar/style.css b/waybar/style.css index 88b8900..04a1c3e 100644 --- a/waybar/style.css +++ b/waybar/style.css @@ -3,7 +3,7 @@ margin: 0px; border-radius: 0px; /* `otf-font-awesome` is required to be installed for icons */ - font-family: mononoki Nerd Font Mono; + font-family: JetBrainsMono Nerd Font; font-size: 18px; min-height: 0px; min-width: 0px; @@ -14,6 +14,7 @@ window#waybar { color: #ffffff; transition-property: background-color; transition-duration: .5s; + background: rgba(0, 0, 0, 0.4); } window#waybar.hidden { @@ -45,7 +46,7 @@ window#waybar.hidden { /* #workspaces button:hover { - background: #39c1ed; + background: #6e3c85; color: black; border-bottom: 3px solid #ffffff; @@ -56,9 +57,13 @@ window#waybar.hidden { background: #198844; } +#workspaces button.focused { + background: #198844; +} + /* #workspaces button.active:hover { - background: #39c1ed; + background: #6e3c85; color: black; border-bottom: 3px solid #ffffff; } @@ -81,10 +86,11 @@ window#waybar.hidden { #temperature, #backlight, #network, -#pulseaudio, +#wireplumber, #custom-media, #custom-launcher, #custom-power, +#custom-battery, #custom-layout, #custom-updater, #custom-snip, @@ -126,7 +132,7 @@ window#waybar.hidden { } #battery.charging, #battery.plugged { - color: #26A65B; + color: #198844; background-color: #1b1d1c; } @@ -154,11 +160,13 @@ label:focus { #cpu { background-color: #1b1d1c; color: #ffffff; + padding-right: 18px; } #memory { background-color: #198844; color: #ffffff; + padding-right: 18px; } #disk { @@ -174,6 +182,7 @@ label:focus { #network { background-color: #198844; color: #ffffff; + padding-right: 18px; } #network.disconnected { @@ -181,12 +190,13 @@ label:focus { color: #ffffff; } -#pulseaudio { +#wireplumber { background-color: #198844; color: #ffffff; + padding-right: 18px; } -#pulseaudio.muted { +#wireplumber.muted { background-color: #1b1d1c; color: #198844; } @@ -211,7 +221,26 @@ label:focus { background-color: #1b1d1c; font-size: 18px; margin-right: 5px; +} + +#custom-battery{ + background-color: #1b1d1c; + font-size: 18px; +} +#custom-battery.battery_low{ + background-color: yellow; + color: #1b1d1c; +} + +#custom-battery.battery_crit{ + background-color: red; + color: #1b1d1c; +} + +#custom-battery.battery_charging{ + background-color: #1d1b1c; + color: #198844; } #custom-launcher{ @@ -278,7 +307,8 @@ label:focus { } #tray { - background-color: #198844; + border-radius: 20px; + background-color: black; color: #ffffff; } @@ -297,7 +327,7 @@ label:focus { #idle_inhibitor { background-color: #1b1d1c; border-radius: 20px 0px 0px 20px; - + padding-right: 18px; } #idle_inhibitor.activated { diff --git a/wireplumber/wireplumber.conf.d/51-id4.conf b/wireplumber/wireplumber.conf.d/51-id4.conf new file mode 100644 index 0000000..c01df40 --- /dev/null +++ b/wireplumber/wireplumber.conf.d/51-id4.conf @@ -0,0 +1,17 @@ +monitor.alsa.rules = [ + { + matches = [ + { + device.name = "alsa_card.usb-Audient_Audient_iD4-00" + } + ] + actions = { + update-props = { + api.alsa.use-acp = false, + device.profile = "pro-audio", + api.acp.auto-profile = false, + api.acp.auto-port = false + } + } + } +] diff --git a/wireplumber/wireplumber.conf.d/51-volt4.conf b/wireplumber/wireplumber.conf.d/51-volt4.conf new file mode 100644 index 0000000..0c03252 --- /dev/null +++ b/wireplumber/wireplumber.conf.d/51-volt4.conf @@ -0,0 +1,17 @@ +monitor.alsa.rules = [ + { + matches = [ + { + device.name = "alsa_card.usb-Universal_Audio_Volt_4_22282055004772-00" + } + ] + actions = { + update-props = { + api.alsa.use-acp = false, + device.profile = "pro-audio", + api.acp.auto-profile = false, + api.acp.auto-port = false + } + } + } +] diff --git a/xdg-desktop-portal/portals.conf b/xdg-desktop-portal/portals.conf new file mode 100644 index 0000000..b1a274e --- /dev/null +++ b/xdg-desktop-portal/portals.conf @@ -0,0 +1,4 @@ +[preferred] +default=hyprland +org.freedesktop.impl.portal.FileChooser=gtk +org.freedesktop.impl.portal.Settings=darkman diff --git a/xsettingsd/xsettingsd.conf b/xsettingsd/xsettingsd.conf index 8fa8d9b..7e001eb 100644 --- a/xsettingsd/xsettingsd.conf +++ b/xsettingsd/xsettingsd.conf @@ -1,6 +1,6 @@ -Net/ThemeName "Flat-Remix-GTK-Green-Darkest-Solid" -Net/IconThemeName "Mint-X" -Gtk/CursorThemeName "Adwaita" +Net/ThemeName "Flat-Remix-GTK-Green-Darkest" +Net/IconThemeName "Papirus-Dark" +Gtk/CursorThemeName "BreezeX-Black" Net/EnableEventSounds 1 EnableInputFeedbackSounds 0 Xft/Antialias 1 diff --git a/yay/config.json b/yay/config.json index 0e764be..61f2d02 100644 --- a/yay/config.json +++ b/yay/config.json @@ -1,7 +1,7 @@ { "aururl": "https://aur.archlinux.org", - "buildDir": "$HOME/.cache/yay", - "absdir": "$HOME/.cache/yay/abs", + "aurrpcurl": "https://aur.archlinux.org/rpc?", + "buildDir": "/home/zachir/.cache/yay", "editor": "nvim", "editorflags": "", "makepkgbin": "makepkg", @@ -9,9 +9,8 @@ "pacmanbin": "pacman", "pacmanconf": "/etc/pacman.conf", "redownload": "no", - "rebuild": "no", - "answerclean": "", - "answerdiff": "", + "answerclean": "All", + "answerdiff": "All", "answeredit": "", "answerupgrade": "", "gitbin": "git", @@ -21,23 +20,31 @@ "sortby": "votes", "searchby": "name-desc", "gitflags": "", - "removemake": "ask", - "sudobin": "sudo", + "removemake": "yes", + "sudobin": "doas", "sudoflags": "", + "version": "12.4.2", "requestsplitn": 150, - "sortmode": 0, "completionrefreshtime": 7, + "maxconcurrentdownloads": 1, + "bottomup": true, "sudoloop": false, "timeupdate": false, "devel": false, - "cleanAfter": false, + "cleanAfter": true, + "keepSrc": false, "provides": true, "pgpfetch": true, - "upgrademenu": true, "cleanmenu": true, "diffmenu": true, - "editmenu": true, + "editmenu": false, "combinedupgrade": false, "useask": false, - "batchinstall": false + "batchinstall": false, + "singlelineresults": false, + "separatesources": true, + "debug": false, + "rpc": true, + "doubleconfirm": true, + "rebuild": "no" } diff --git a/zsh/.zlogout b/zsh/.zlogout deleted file mode 100644 index 33666be..0000000 --- a/zsh/.zlogout +++ /dev/null @@ -1 +0,0 @@ -rm -rf /tmp/xorg-awake diff --git a/zsh/.zprofile b/zsh/.zprofile deleted file mode 100644 index 1eae5e7..0000000 --- a/zsh/.zprofile +++ /dev/null @@ -1,6 +0,0 @@ -#export GDK_DPI_SCALE=0.7 - -#gnome_schema=org.gnome.desktop.interface -# -#gsettings set $gnome_schema gtk-theme 'Plata-Noir-Compact' -#gsettings set $gnome_schema icon-theme 'Papirus-Dark' diff --git a/zsh/.zshenv b/zsh/.zshenv index 1740c82..3719ef4 100644 --- a/zsh/.zshenv +++ b/zsh/.zshenv @@ -1,4 +1,7 @@ # ZSH SPECIFIC CONFIGS unset HISTFILE -[ -f "$HOME/.profile" ] && . "$HOME/.profile" -export ZDOTDIR=$HOME/.config/zsh +export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" +export skip_global_compinit=1 +fpath=($XDG_CONFIG_HOME/functions $fpath) +[ -f /etc/profile ] && . /etc/profile +[ -f "$XDG_CONFIG_HOME/sh/profile" ] && . "$XDG_CONFIG_HOME/sh/profile" @@ -1,4 +1,6 @@ -HISTFILE="$ZDOTDIR"/hist +#zmodload zsh/zprof +[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" +HISTFILE="$XDG_CONFIG_HOME/zsh/hist" SAVEHIST=1000 HISTSIZE=1000 setopt APPEND_HISTORY @@ -8,93 +10,121 @@ setopt HIST_VERIFY setopt HIST_IGNORE_DUPS setopt INC_APPEND_HISTORY setopt HIST_REDUCE_BLANKS +setopt COMPLETE_ALIASES +setopt AUTO_CD _SH="zsh" if [ -f "$XDG_CONFIG_HOME"/sh/aliases ]; then - source "$XDG_CONFIG_HOME"/sh/aliases + source "$XDG_CONFIG_HOME"/sh/aliases fi if [ -f "$XDG_CONFIG_HOME"/sh/functions ]; then - source "$XDG_CONFIG_HOME"/sh/functions + source "$XDG_CONFIG_HOME"/sh/functions fi -if [ -n "$ZDOTDIR"/.zshrc -a -f "$ZDOTDIR"/.zshrc ]; then - alias e='source "$ZDOTDIR"/.zshrc' +if [ -f "$XDG_CONFIG_HOME/zsh/zshrc" ]; then + alias e='source "$XDG_CONFIG_HOME/zsh/zshrc"' +elif [ -f "$XDG_CONFIG_HOME/zshrc" ]; then + alias e='source "$XDG_CONFIG_HOME/zshrc"' elif [ -f "$HOME"/.zshrc ]; then alias e='source ~/.zshrc' fi -bindkey "^?" backward-delete-char - -# bindkey -v - -if [ "$TERM" = "st-256color" ] || [ "$TERM" = "xterm-256color" ]; then - function zle-line-init () { echoti smkx } - function zle-line-finish () { echoti rmkx } - - zle -N zle-line-init - zle -N zle-line-finish -fi - -unset COLOR1 -ZSHTHEMERC="${ZDOTDIR:-$HOME}/.zsh_theme" -[ -f "$ZSHTHEMERC" ] && . "$ZSHTHEMERC" - -if [ -z "$COLOR1" ]; then - case "$(whoami)" in - zachir) COLOR1="014" ;; - git) COLOR1="013" ;; - subsonic) COLOR1="012" ;; - *) COLOR1="015" ;; - esac +source ~/.config/zsh/.zkbd/$TERM-${${DISPLAY:t}:-$VENDOR-$OSTYPE} + +#autoload zkbd; zkbd +bindkey -v +bindkey "${key[Backspace]}" backward-delete-char +bindkey "${key[Delete]}" delete-char +bindkey "${key[Home]}" beginning-of-line +bindkey "${key[End]}" end-of-line +bindkey "${key[PageUp]}" history-substring-search-up +bindkey "${key[PageDown]}" history-substring-search-down + +[ -f "$ZDOTDIR/.zsh_theme" ] && . "$ZDOTDIR/.zsh_theme" +COLOR1="${COLOR1:-002}" +COLOR2="${COLOR2:-006}" +COLORV="${COLORV:-012}" + +if (env | grep -Fq 'DISTROBOX'); then + MYPROMPT=$'%F{000}%K{004}[%n@%m]%F{013}\UE0B2%K{013}%F{000}%~%F{013}%K{004}\UE0B0%F{000}%#%F{004}%k\UE0B0%f ' +else + MYPROMPT=$'%F{000}%K{'"$COLOR1"$'}[%n@%m]%F{'"$COLOR2"$'}\UE0B2%K{'"$COLOR2"$'}%F{000}%~%F{'"$COLOR2"$'}%K{'"$COLOR1"$'}\UE0B0%F{000}%#%F{'"$COLOR1"$'}%k\UE0B0%f ' fi - -MYPROMPT='%B%S%F{'"$COLOR1"'}[%n@%m]:%f%s%F{015}%~%f%S%F{'"$COLOR1"'}%#%f%s%b ' function zle-line-init zle-keymap-select { - VIM_PROMPT="%B%F{012}[%n@%m]:%f%F{015}%~%f%F{012}%#%f%b " - PS1="${${KEYMAP/vicmd/$VIM_PROMPT}/main/$MYPROMPT}" - #PS1="$PROMPT $KEYMAP" - zle reset-prompt + VIM_PROMPT=$'%F{000}%K{'"$COLORV"$'}[%n@%m]%F{'"$COLOR2"$'}\UE0B2%K{'"$COLOR2"$'}%F{000}%~%F{'"$COLOR2"$'}%K{'"$COLORV"$'}\UE0B0%F{000}%#%F{'"$COLORV"$'}%k\UE0B0%f ' + PS1="${${KEYMAP/vicmd/$VIM_PROMPT}/main/$MYPROMPT}" + zle reset-prompt } -unset COLOR1 - zle -N zle-line-init zle -N zle-keymap-select export KEYTIMEOUT=1 -fpath+="$ZDOTDIR/zfunc" +fpath+="$XDG_CONFIG_HOME/zsh/functions" -autoload -Uz compinit promptinit -compinit -d $CONFIG/zcompdump -promptinit -autoload -Uz up-line-or-beginning-search down-line-or-beginning-search -zle -N up-line-or-beginning-search -zle -N down-line-or-beginning-search +autoload -Uz anonsh -zstyle ':completion:*' menu select -zstyle ':completion::complete:*' gain-privileges 1 -zstyle ':completion:*' rehash true +autoload -Uz compinit +if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+24) ]]; then + compinit +else + compinit -C +fi -setopt COMPLETE_ALIASES -setopt AUTO_CD +zshcache_time="$(date +%s%N)" + +autoload -Uz add-zsh-hook + +rehash_precmd() { + if [[ -a /var/cache/zsh/pacman ]]; then + local paccache_time="$(date -r /var/cache/zsh/pacman +%s%N)" + if (( zshcache_time < paccache_time )); then + rehash + zshcache_time="$paccache_time" + fi + fi +} + +add-zsh-hook -Uz precmd rehash_precmd + +zstyle ':completion:*' hosts off + +### Added by Zinit's installer +if [[ ! -f $HOME/.local/share/zinit/zinit.git/zinit.zsh ]]; then + print -P "%F{33} %F{220}Installing %F{33}ZDHARMA-CONTINUUM%F{220} Initiative Plugin Manager (%F{33}zdharma-continuum/zinit%F{220})…%f" + command mkdir -p "$HOME/.local/share/zinit" && command chmod g-rwX "$HOME/.local/share/zinit" + command git clone https://github.com/zdharma-continuum/zinit "$HOME/.local/share/zinit/zinit.git" && \ + print -P "%F{33} %F{34}Installation successful.%f%b" || \ + print -P "%F{160} The clone has failed.%f%b" +fi -typeset -g -A key - -key[Up]="${terminfo[kcuu1]}" -key[Down]="${terminfo[kcud1]}" -key[Left]="${terminfo[kcub1]}" -key[Right]="${terminfo[kcuf1]}" -key[Shift-Tab]="${terminfo[kcbt]}" -key[Delete]="${terminfo[kdch1]}" - -[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-beginning-search -bindkey -- '^[[A' up-line-or-beginning-search -bindkey -- '^[[B' down-line-or-beginning-search -[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search -[[ -n "${key[Left]}" ]] && bindkey -- "${key[Left]}" backward-char -[[ -n "${key[Right]}" ]] && bindkey -- "${key[Right]}" forward-char -[[ -n "${key[Shift-Tab]}" ]] && bindkey -- "${key[Shift-Tab]}" reverse-menu-complete -[[ -n "${key[Delete]}" ]] && bindkey -- "${key[Delete]}" delete-char - -precmd () {print -Pn "\e]0;terminal\a"} +source "$HOME/.local/share/zinit/zinit.git/zinit.zsh" +autoload -Uz _zinit +(( ${+_comps} )) && _comps[zinit]=_zinit + +# Load a few important annexes, without Turbo +# (this is currently required for annexes) +zinit light-mode for \ + zdharma-continuum/zinit-annex-as-monitor \ + zdharma-continuum/zinit-annex-bin-gem-node \ + zdharma-continuum/zinit-annex-patch-dl \ + zdharma-continuum/zinit-annex-rust + +### End of Zinit's installer chunk +zinit snippet OMZ::plugins/git/git.plugin.zsh + +zinit load 'zsh-users/zsh-history-substring-search' +zinit ice wait atload'_history_substring_search_config' + +bindkey "${key[Up]}" history-substring-search-up +bindkey "${key[Down]}" history-substring-search-down +bindkey -M vicmd "${key[Up]}" history-substring-search-up +bindkey -M vicmd "${key[Down]}" history-substring-search-down +bindkey -M vicmd "k" history-substring-search-up +bindkey -M vicmd "j" history-substring-search-down + +#source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh +zinit light 'zsh-users/zsh-syntax-highlighting' +zinit ice wait atload'_history_substring_search_config' +#zprof |