summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore66
-rw-r--r--Makefile34
-rw-r--r--X11/xresources (renamed from X11/Xresources)2
-rwxr-xr-xautostart.sh4
-rw-r--r--darkman/config.yaml3
-rw-r--r--doas.conf1
-rw-r--r--environment.d/cursor.conf2
-rw-r--r--gtk-2.0/gtkrc19
-rw-r--r--gtk-3.0/settings.ini23
-rw-r--r--handlr/handlr.toml4
-rw-r--r--hypr/hypridle.conf34
-rw-r--r--hypr/hyprland.conf283
-rw-r--r--hypr/hyprlock.conf55
-rw-r--r--hypr/hyprpaper.conf14
-rw-r--r--hypr/pyprland.toml2
-rwxr-xr-xinstallers/vimplug_nvim.sh4
-rw-r--r--kitty/kitty.conf16
-rwxr-xr-xlf/cleaner2
-rw-r--r--lf/lfrc11
-rwxr-xr-xlf/previewer36
-rw-r--r--mpv/mpv.conf2
-rw-r--r--mpv/scripts/quality-menu-osc.lua2911
-rwxr-xr-xnsxiv/exec/key-handler2
-rw-r--r--nvim/after/ftplugin/rust.vim2
-rw-r--r--nvim/init.lua6
-rw-r--r--nvim/lua/colorscheme.lua8
-rw-r--r--nvim/lua/keymaps.lua97
-rw-r--r--nvim/lua/lsp.lua22
-rw-r--r--nvim/lua/options.lua86
-rw-r--r--nvim/lua/plugins.lua62
-rw-r--r--nvim/lua/term.lua51
-rw-r--r--nwg-bar/bar.json22
-rw-r--r--nwg-bar/style.css35
-rw-r--r--python/pythonrc40
-rw-r--r--qt5ct/qt5ct.conf12
-rw-r--r--qt6ct/qt6ct.conf8
-rw-r--r--runit/conf/logind.conf54
-rw-r--r--runit/sv/dunst/conf9
-rwxr-xr-xrunit/sv/dunst/log/run12
-rwxr-xr-xrunit/sv/dunst/run5
-rw-r--r--runit/sv/mako/conf9
-rw-r--r--runit/sv/mako/down0
-rwxr-xr-xrunit/sv/mako/log/run12
-rwxr-xr-xrunit/sv/mako/run5
-rw-r--r--runit/sv/mpd-mpris/conf9
-rwxr-xr-xrunit/sv/mpd-mpris/log/run12
-rwxr-xr-xrunit/sv/mpd-mpris/run8
-rw-r--r--runit/sv/mpd-notification/conf9
-rwxr-xr-xrunit/sv/mpd-notification/log/run12
-rwxr-xr-xrunit/sv/mpd-notification/run9
-rw-r--r--runit/sv/mpd/conf9
-rwxr-xr-xrunit/sv/mpd/log/run12
-rwxr-xr-xrunit/sv/mpd/run8
-rw-r--r--runit/sv/pipewire-pulse/conf12
-rwxr-xr-xrunit/sv/pipewire-pulse/log/run12
-rwxr-xr-xrunit/sv/pipewire-pulse/run12
-rw-r--r--runit/sv/wireplumber/conf12
-rwxr-xr-xrunit/sv/wireplumber/log/run12
-rwxr-xr-xrunit/sv/wireplumber/run12
-rw-r--r--sh/aliases29
-rw-r--r--sh/profile135
-rw-r--r--tmux/tmux.conf4
-rw-r--r--tofi/colors17
-rw-r--r--tofi/cosmic22
-rw-r--r--tofi/themes/colors12
-rw-r--r--user-dirs.dirs2
-rw-r--r--vim/vimrc (renamed from nvim/init.vim)46
-rw-r--r--waybar/config55
-rw-r--r--waybar/style.css14
-rw-r--r--xdg-desktop-portal/portals.conf4
-rw-r--r--xsettingsd/xsettingsd.conf4
-rw-r--r--yay/config.json31
-rw-r--r--zsh/.zlogout1
-rw-r--r--zsh/.zprofile6
-rw-r--r--zsh/.zshenv4
-rw-r--r--zsh/.zshrc100
-rw-r--r--zsh/zshenv7
-rw-r--r--zsh/zshrc94
78 files changed, 1458 insertions, 3376 deletions
diff --git a/.gitignore b/.gitignore
index 0197c0b..3dcf353 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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,14 +219,20 @@ 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
@@ -206,16 +241,25 @@ 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 +271,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 +289,7 @@ waybar/config-Hyprland-*
waybar/config-river-*
weechat/
whoozle.github.io/
+wireshark/
xmonad/.stack-work
xmonad/stack.yaml.lock
xmonad/xmonad.hi
@@ -247,13 +297,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
diff --git a/Makefile b/Makefile
index 0faf846..28bc66e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,31 +1,24 @@
VIM := $(shell command -v vim 2>/dev/null)
-NVIM := $(shell command -v nvim 2>/dev/null)
-XCONFS := X11/Xresources
-ZCONFS := zsh/.zshenv
+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
-install-xconfigs: $(XCONFS)
- @echo "Installing Xorg conf files..."
- @echo "Xresources..."
- @ln -sf `pwd`/X11/Xresources ~/.Xresources
+install-zshconfigs: $(ZCONFS)
+ @echo "Installing zsh conf files..."
+ @echo ".zshenv..."
+ @ln -sf `pwd`/zsh/zshenv ~/.zshenv
+ @echo ".zshrc..."
+ @ln -sf `pwd`/zsh/zshrc ~/.zshrc
@echo "Done."
install-shconfigs: $(SCONFS)
- @echo "Installing SH conf files..."
+ @echo "Installing sh conf files..."
@echo ".profile..."
@ln -sf `pwd`/sh/profile ~/.profile
- @echo "Done."
-
-install-zshconfigs: $(ZCONFS)
- @echo "Installing zsh conf files..."
- @echo ".zshenv..."
- @ln -sf `pwd`/zsh/.zshenv ~/.zshenv
- @echo "Done."
vimplug-vim: installers/vimplug_vim.sh
ifdef VIM
@@ -36,15 +29,6 @@ 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..."
diff --git a/X11/Xresources b/X11/xresources
index d5c4550..7115b96 100644
--- a/X11/Xresources
+++ b/X11/xresources
@@ -30,7 +30,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: Fira Code Nerd Font Mono:pixelsize=12:antialias=true:autohint=true;
!st.font2: Symbola:pixelsize=12:antialias=true:autohint=true;
st.borderpx: 3
! st alpha
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/darkman/config.yaml b/darkman/config.yaml
new file mode 100644
index 0000000..5cf7ee4
--- /dev/null
+++ b/darkman/config.yaml
@@ -0,0 +1,3 @@
+usegeoclue: false
+dbusserver: true
+portal: true
diff --git a/doas.conf b/doas.conf
index 90ab328..d598fa1 100644
--- a/doas.conf
+++ b/doas.conf
@@ -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/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/gtk-2.0/gtkrc b/gtk-2.0/gtkrc
new file mode 100644
index 0000000..628ed00
--- /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-Solid"
+gtk-icon-theme-name="Cosmic"
+gtk-font-name="Cantarell 11"
+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..28ef3a0
--- /dev/null
+++ b/gtk-3.0/settings.ini
@@ -0,0 +1,23 @@
+[Settings]
+gtk-theme-name=Flat-Remix-GTK-Green-Darkest-Solid
+gtk-icon-theme-name=Cosmic
+gtk-font-name=Cantarell 11
+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..4d18296
--- /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 0 # 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 -sd led::kbd_backlight set 0 # turn off keyboard backlight.
+ on-resume = brightnessctl -rd led::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..cdcca3d 100644
--- a/hypr/hyprland.conf
+++ b/hypr/hyprland.conf
@@ -1,8 +1,6 @@
# See https://wiki.hyprland.org/Configuring/Monitors/
#{{{ Monitor config
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
@@ -10,16 +8,51 @@ monitor = DP-1, 1920x1080@60, 1920x0, 1
#{{{ 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 = dinit
exec-once = xdph
exec-once = hyprpm reload -n
+#exec-once = hyprpaper
+#exec-once = hypridle
+exec-once = waybar
exec-once = pypr
+exec-once = lxqt-policykit-agent
+exec-once = import-gsettings gtk-theme 'Flat-Remix-GTK-Green-Darkest-Solid'
+exec-once = import-gsettings icon-theme 'COSMIC'
+exec-once = import-gsettings cursor-theme 'BreezeX-Black'
+exec-once = xrdb -load "$XDG_CONFIG_HOME"/X11/xresources
+#exec-once = com.github.wwmm.easyeffects
+#exec-once = dunst
+#exec-once = hypridle
+#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
#}}}
# 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 +66,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.
@@ -51,7 +90,12 @@ general {
col.active_border = rgba(198844ee)
col.inactive_border = rgba(1b1d1cee)
layout = master
- no_cursor_warps = false
+}
+#}}}
+
+#{{{ cursor
+cursor {
+ no_warps = false
}
#}}}
@@ -61,8 +105,9 @@ misc {
disable_splash_rendering = true
enable_swallow = true
swallow_regex = ^(kitty)$
- vfr = false
- vrr = true
+ swallow_exception_regex = ^(wev|.*ueberzug|n?vi?m? .*)$
+ vfr = true
+ vrr = 3
}
#}}}
@@ -70,10 +115,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,6 +124,14 @@ decoration {
xray = true
}
#}}}
+ #{{{ Shadow options
+ shadow {
+ enabled = false
+ range = 4
+ render_power = 3
+ color = 0xee1a1a1a
+ }
+ #}}}
}
#}}}
@@ -115,11 +164,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 +182,48 @@ gestures {
#}}}
#{{{ plugin options
-#plugin {
-# split-monitor-workspaces {
-# count = 9
-# }
-#}
+plugin {
+ hyprsplit {
+ num_workspaces = 9
+ persistent_workspaces = 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)$
#}}}
#{{{ Mods
@@ -198,27 +252,6 @@ 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
-#}}}
-
#{{{ Group binds
# Group binds
#bind = $mainMod CONTROL, G, togglegroup,
@@ -230,6 +263,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,
@@ -243,74 +280,41 @@ bind = $mainMod SHIFT, N, togglespecialworkspace, minimized
#{{{ Workspace binds (using split-monitor-workspaces 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
-# 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
+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, 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
#}}}
#{{{ Mouse binds
@@ -331,8 +335,8 @@ 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, R, exec, sh -c "$(tofi-drun -c ~/.config/tofi/themes/dmenu_vertical --prompt-text Run:)"
+bind = $mainMod, D, exec, sh -c "$(tofi-run -c ~/.config/tofi/themes/dmenu_vertical --prompt-text Run:)"
bind = $mainMod $secdMod, Q, exec, qbc
bind = $mainMod $secdMod, W, exec, lwc
bind = $mainMod $secdMod, E, exec, mbc
@@ -348,87 +352,86 @@ 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, 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)$
+$sphtop = class:^(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)$
+$spterm = class:^(spterm)$
windowrule = float,$spterm
-windowrule = workspace special:spterm silent,$dropterm
+windowrule = workspace special:spterm silent,$spterm
windowrule = size 50% 50%,$spterm
windowrule = move 25% 25%,$spterm
bind = $mainMod CONTROL, C, exec, pypr toggle sppmxr
-$sppmxr = ^(sppmxr)$
+$sppmxr = class:^(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)$
+$spblue = class:^(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)$
+$spncmp = class:^(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)$
+$spmutt = class:^(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)$
+$spprof = class:^(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)$
+$spirss = class:^(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)$
+$sptodo = class:^(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)$
+$sptrmc = class:^(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)$
+$spqpwg = class:^(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)$
+$speasy = class:^(com\.github\.wwmm\.easyeffects)$
windowrule = float,$speasy
windowrule = workspace special:speasy silent,$speasy
windowrule = size 50% 50%,$speasy
@@ -466,9 +469,7 @@ bind = , XF86AudioNext, exec, playerctl next
bind = , XF86AudioMute, exec, volsv -t
#bindl = , XF86AudioMicMute, exec, volsv -m
bind = , XF86AudioMicMute, exec, volsv -m
-bindel = , XF86MonBrightnessUp, exec, bl -i
-bindel = , XF86MonBrightnessDown, exec, bl -d
-bindl = $mainMod, XF86MonBrightnessUp, exec, bl -I 1
-bindl = $mainMod, XF86MonBrightnessDown, exec, bl -D 1
+bindel = , XF86MonBrightnessUp, exec, hypr-brightness +
+bindel = , XF86MonBrightnessDown, exec, hypr-brightness -
bind = , Print, exec, scrshot
#}}}
diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf
new file mode 100644
index 0000000..57f9fdd
--- /dev/null
+++ b/hypr/hyprlock.conf
@@ -0,0 +1,55 @@
+general {
+ disable_loading_bar = true
+ hide_cursor = true
+ grace = 0
+ no_fade_in = true
+ no_fade_out = true
+ ignore_empty_input = true
+}
+
+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..19b84f2 100644
--- a/hypr/hyprpaper.conf
+++ b/hypr/hyprpaper.conf
@@ -1,2 +1,16 @@
+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
preload = ~/Pictures/background.png
diff --git a/hypr/pyprland.toml b/hypr/pyprland.toml
index dfa2aab..af439ab 100644
--- a/hypr/pyprland.toml
+++ b/hypr/pyprland.toml
@@ -98,6 +98,6 @@ animation = ""
command = "flatpak run com.github.wwmm.easyeffects"
class = "com.github.wwmm.easyeffects"
lazy = true
-size = "50% 50%"
+size = "75% 75%"
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/kitty/kitty.conf b/kitty/kitty.conf
index 6207c2f..b833ace 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 FiraCode Nerd Font Mono
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 12.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:
@@ -1151,7 +1151,7 @@ color8 #969896
#: black
color1 #89231d
-color9 #cc342b
+color9 #ec0101
#: red
@@ -1170,8 +1170,8 @@ color12 #3971ed
#: blue
-color5 #784e93
-color13 #a36ac7
+color5 #6e3c85
+color13 #8400c1
#: magenta
@@ -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
diff --git a/lf/lfrc b/lf/lfrc
index 702fc2d..32c9a10 100644
--- a/lf/lfrc
+++ b/lf/lfrc
@@ -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
}}
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/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/nsxiv/exec/key-handler b/nsxiv/exec/key-handler
index 9e78004..53099e4 100755
--- a/nsxiv/exec/key-handler
+++ b/nsxiv/exec/key-handler
@@ -7,7 +7,7 @@ while read file; do
cp "$file" ~/Pictures/background.png
;;
*)
- convert "$file" ~/Pictures/background.png
+ magick "$file" ~/Pictures/background.png
;;
esac
t -r hyprpaper
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..4b295d5
--- /dev/null
+++ b/nvim/init.lua
@@ -0,0 +1,6 @@
+require('options')
+require('keymaps')
+require('lsp')
+require('plugins')
+require('colorscheme')
+require('term')
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..4f4a489
--- /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..f90b09c
--- /dev/null
+++ b/nvim/lua/plugins.lua
@@ -0,0 +1,62 @@
+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 = {} },
+ {
+ "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/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..5d9a12c 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
+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/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/sh/aliases b/sh/aliases
index 7b3eba2..93784e7 100644
--- a/sh/aliases
+++ b/sh/aliases
@@ -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"
+ alias ls="eza"
+ ;;
+ "Darwin")
+ 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")
+ 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/profile b/sh/profile
index c03fc93..45911b5 100644
--- a/sh/profile
+++ b/sh/profile
@@ -1,16 +1,13 @@
-# 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_STATE_HOME="${HOME}/.local/state"
export XDG_VIDEOS_DIR=${HOME}/Videos
export XDG_DATA_DIRS="${XDG_DATA_DIRS}:$HOME/.nix-profile/share"
@@ -25,6 +22,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
@@ -39,8 +40,9 @@ export NUGET_PACKAGES="$XDG_CACHE_HOME"/NuGetPackages
export RXVT_SOCKET="$XDG_RUNTIME_DIR"/urxvtd
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 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
@@ -48,16 +50,24 @@ 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 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
@@ -74,6 +84,10 @@ 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 +97,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/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..9a5b4be
--- /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 = Fira Code Nerd Font Mono
+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/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..49cc19c 100644
--- a/waybar/config
+++ b/waybar/config
@@ -11,7 +11,7 @@
"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
@@ -40,8 +40,7 @@
"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 ],
+ "eDP-1": [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],
},
"on-scroll-up": "hyprctl dispatch split-workspace e+1",
"on-scroll-down": "hyprctl dispatch split-workspace e-1",
@@ -61,9 +60,9 @@
}
},
"mpd": {
- "format": "{artist} - {title}",
+ "format": "{title}",
"format-stopped": "",
- "format-paused": "{artist} - {title}",
+ "format-paused": "{title}",
"format-disconnected": "",
"artist-len": 15,
"title-len": 15,
@@ -95,7 +94,8 @@
"format": "{}% "
},
"battery": {
- "bat": "BAT0",
+ //"bat": "BAT0",
+ "weighted-average": "true",
"interval": 60,
"state": {
"warning": 30,
@@ -105,19 +105,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 +127,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,24 +136,13 @@
"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": "",
diff --git a/waybar/style.css b/waybar/style.css
index 88b8900..6c22341 100644
--- a/waybar/style.css
+++ b/waybar/style.css
@@ -45,7 +45,7 @@ window#waybar.hidden {
/*
#workspaces button:hover {
- background: #39c1ed;
+ background: #6e3c85;
color: black;
border-bottom: 3px solid #ffffff;
@@ -58,7 +58,7 @@ window#waybar.hidden {
/*
#workspaces button.active:hover {
- background: #39c1ed;
+ background: #6e3c85;
color: black;
border-bottom: 3px solid #ffffff;
}
@@ -81,7 +81,7 @@ window#waybar.hidden {
#temperature,
#backlight,
#network,
-#pulseaudio,
+#wireplumber,
#custom-media,
#custom-launcher,
#custom-power,
@@ -126,7 +126,7 @@ window#waybar.hidden {
}
#battery.charging, #battery.plugged {
- color: #26A65B;
+ color: #198844;
background-color: #1b1d1c;
}
@@ -181,12 +181,12 @@ label:focus {
color: #ffffff;
}
-#pulseaudio {
+#wireplumber {
background-color: #198844;
color: #ffffff;
}
-#pulseaudio.muted {
+#wireplumber.muted {
background-color: #1b1d1c;
color: #198844;
}
@@ -278,7 +278,7 @@ label:focus {
}
#tray {
- background-color: #198844;
+ background-color: transparent;
color: #ffffff;
}
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..c4ab3db 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/IconThemeName "Cosmic"
+Gtk/CursorThemeName "BreezeX-Black"
Net/EnableEventSounds 1
EnableInputFeedbackSounds 0
Xft/Antialias 1
diff --git a/yay/config.json b/yay/config.json
index 0e764be..c06f416 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",
+ "removemake": "yes",
"sudobin": "sudo",
"sudoflags": "",
+ "version": "12.4.2",
"requestsplitn": 150,
- "sortmode": 0,
"completionrefreshtime": 7,
- "sudoloop": false,
+ "maxconcurrentdownloads": 1,
+ "bottomup": true,
+ "sudoloop": true,
"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
deleted file mode 100644
index 1740c82..0000000
--- a/zsh/.zshenv
+++ /dev/null
@@ -1,4 +0,0 @@
-# ZSH SPECIFIC CONFIGS
-unset HISTFILE
-[ -f "$HOME/.profile" ] && . "$HOME/.profile"
-export ZDOTDIR=$HOME/.config/zsh
diff --git a/zsh/.zshrc b/zsh/.zshrc
deleted file mode 100644
index 3314bb3..0000000
--- a/zsh/.zshrc
+++ /dev/null
@@ -1,100 +0,0 @@
-HISTFILE="$ZDOTDIR"/hist
-SAVEHIST=1000
-HISTSIZE=1000
-setopt APPEND_HISTORY
-setopt HIST_FIND_NO_DUPS
-setopt HIST_EXPIRE_DUPS_FIRST
-setopt HIST_VERIFY
-setopt HIST_IGNORE_DUPS
-setopt INC_APPEND_HISTORY
-setopt HIST_REDUCE_BLANKS
-
-_SH="zsh"
-
-if [ -f "$XDG_CONFIG_HOME"/sh/aliases ]; then
- source "$XDG_CONFIG_HOME"/sh/aliases
-fi
-if [ -f "$XDG_CONFIG_HOME"/sh/functions ]; then
- source "$XDG_CONFIG_HOME"/sh/functions
-fi
-
-if [ -n "$ZDOTDIR"/.zshrc -a -f "$ZDOTDIR"/.zshrc ]; then
- alias e='source "$ZDOTDIR"/.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
-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
-}
-
-unset COLOR1
-
-zle -N zle-line-init
-zle -N zle-keymap-select
-export KEYTIMEOUT=1
-
-fpath+="$ZDOTDIR/zfunc"
-
-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
-
-zstyle ':completion:*' menu select
-zstyle ':completion::complete:*' gain-privileges 1
-zstyle ':completion:*' rehash true
-
-setopt COMPLETE_ALIASES
-setopt AUTO_CD
-
-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"}
diff --git a/zsh/zshenv b/zsh/zshenv
new file mode 100644
index 0000000..3719ef4
--- /dev/null
+++ b/zsh/zshenv
@@ -0,0 +1,7 @@
+# ZSH SPECIFIC CONFIGS
+unset HISTFILE
+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"
diff --git a/zsh/zshrc b/zsh/zshrc
new file mode 100644
index 0000000..f8fdac5
--- /dev/null
+++ b/zsh/zshrc
@@ -0,0 +1,94 @@
+#zmodload zsh/zprof
+if [ -n "$ZPLUG_HOME" ]; then
+ if [ -d "$ZPLUG_HOME" ]; then
+ export ZPLUG_INSTALLED="y"
+ source "$ZPLUG_HOME/init.zsh"
+ fi
+elif [ -d "$XDG_DATA_HOME/zplug" ]; then
+ export ZPLUG_INSTALLED="y"
+ source "$XDG_DATA_HOME/zplug/init.zsh"
+elif [ -d "$HOME/.zplug" ]; then
+ export ZPLUG_INSTALLED="y"
+ source "$HOME/.zplug/init.zsh"
+fi
+[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
+HISTFILE="$XDG_CONFIG_HOME/zsh/hist"
+SAVEHIST=1000
+HISTSIZE=1000
+setopt APPEND_HISTORY
+setopt HIST_FIND_NO_DUPS
+setopt HIST_EXPIRE_DUPS_FIRST
+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
+fi
+if [ -f "$XDG_CONFIG_HOME"/sh/functions ]; then
+ source "$XDG_CONFIG_HOME"/sh/functions
+fi
+
+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
+
+source ~/.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
+
+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{002}[%n@%m]%F{006}\UE0B2%K{006}%F{000}%~%F{006}%K{002}\UE0B0%F{000}%#%F{002}%k\UE0B0%f '
+fi
+function zle-line-init zle-keymap-select {
+ VIM_PROMPT=$'%F{000}%K{012}[%n@%m]%F{006}\UE0B2%K{006}%F{000}%~%F{006}%K{012}\UE0B0%F{000}%#%F{012}%k\UE0B0%f '
+ PS1="${${KEYMAP/vicmd/$VIM_PROMPT}/main/$MYPROMPT}"
+ zle reset-prompt
+}
+
+zle -N zle-line-init
+zle -N zle-keymap-select
+export KEYTIMEOUT=1
+
+fpath+="$XDG_CONFIG_HOME/zsh/zfunc"
+
+if [ -n "$ZPLUG_INSTALLED" ]; then
+ # zsh history substring search
+ zplug "zsh-users/zsh-history-substring-search", as:plugin
+
+ 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
+
+ # zsh syntax highlighting
+ zplug "zsh-users/zsh-syntax-highlighting", defer:2
+
+ # load zsh plugins
+ zplug load
+fi
+
+autoload -Uz compinit
+compinit -d "$XDG_CACHE_HOME"/zsh/zcompdump-"$ZSH_VERSION"
+
+#zprof