summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZachIR <zachir@zdx-raina>2023-07-10 22:11:51 -0500
committerZachIR <zachir@zdx-raina>2023-07-10 22:11:51 -0500
commitcbe59feb58690b2606bdd7abc2c53cae6b06bf75 (patch)
tree765137a1e11059a26dbff7a5de8ebd9914073bb3
parent593eb0c5dec831863188e87cc4e4d4826ef9384d (diff)
Remove graphical configs for server branch
-rw-r--r--.gitmodules3
-rw-r--r--X11/Xresources495
-rw-r--r--alacritty/alacritty.yml852
-rwxr-xr-xautostart.sh33
-rw-r--r--dunst/dunstrc418
-rw-r--r--foot/foot.ini199
-rwxr-xr-xhypr/gamemode.sh14
-rw-r--r--hypr/hyprland.conf336
-rw-r--r--hypr/hyprpaper.conf13
-rw-r--r--mpv/input.conf2
-rw-r--r--mpv/mpv.conf5
-rw-r--r--mpv/script-opts/quality-menu.conf95
-rw-r--r--mpv/script-opts/youtube-download.conf48
-rw-r--r--mpv/scripts/quality-menu-osc.lua2911
-rw-r--r--mpv/scripts/quality-menu.lua806
-rw-r--r--mpv/scripts/youtube-download.lua758
-rw-r--r--nwg-bar/bar.json22
-rw-r--r--open/openrc15
-rw-r--r--pipewire/filters-available/toharmantarget/akg271mkii.conf98
-rw-r--r--pipewire/filters-available/toharmantarget/atm50x.conf98
-rw-r--r--pipewire/filters-available/toharmantarget/jbudsair.conf98
-rw-r--r--qutebrowser/bookmarks/urls1
-rw-r--r--qutebrowser/config.py275
m---------qutebrowser/jmatrix0
-rw-r--r--qutebrowser/quickmarks1
-rwxr-xr-xriver/init223
-rwxr-xr-xriver/sp/river_sp51
-rwxr-xr-xriver/sp/sp_a3
-rwxr-xr-xriver/sp/sp_b3
-rwxr-xr-xriver/sp/sp_c3
-rwxr-xr-xriver/sp/sp_d3
-rwxr-xr-xriver/sp/sp_f3
-rwxr-xr-xriver/sp/sp_g3
-rwxr-xr-xriver/sp/sp_q3
-rwxr-xr-xriver/sp/sp_s3
-rwxr-xr-xriver/sp/sp_v3
-rwxr-xr-xriver/sp/sp_x3
-rwxr-xr-xriver/sp/sp_z3
-rw-r--r--swayidle/config3
-rw-r--r--swaylock/config2
l---------tofi/config1
-rw-r--r--tofi/themes/colors17
-rw-r--r--tofi/themes/dmenu22
-rw-r--r--waybar/config157
-rw-r--r--waybar/style.css322
-rw-r--r--wireplumber/main.lua.d/51-custom.lua22
-rw-r--r--ytfzf/conf.sh9
47 files changed, 0 insertions, 8458 deletions
diff --git a/.gitmodules b/.gitmodules
index f477143..cce1535 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,6 +4,3 @@
[submodule "xplr/dragon.xplr"]
path = xplr/dragon.xplr
url = https://github.com/sayanarijit/dragon.xplr
-[submodule "qutebrowser/jmatrix"]
- path = qutebrowser/jmatrix
- url = https://gitlab.com/jgkamat/jmatrix.git
diff --git a/X11/Xresources b/X11/Xresources
deleted file mode 100644
index e5b0aea..0000000
--- a/X11/Xresources
+++ /dev/null
@@ -1,495 +0,0 @@
-!! dmenu
-
-dmenu.font: mononoki Nerd Font Mono:size=24
-
-!! dwm
-
-dwm.normbgcolor: #000000
-dwm.normbordercolor: #1b1d1c
-dwm.normfgcolor: #ffffff
-dwm.selbgcolor: #198844
-dwm.selbordercolor: #198844
-dwm.selfgcolor: #ffffff
-dwm.urgfgcolor: #ffffff
-dwm.urgbordercolor: #198844
-dwm.urgbgcolor: #cc342b
-dwm.borderpx: 3
-dwm.gappx: 6
-dwm.snap: 32
-dwm.showbar: 1
-dwm.topbar: 1
-dwm.nmaster: 1
-dwm.resizehints: 1
-dwm.mfact: 0.50
-
-!! st
-
-! These options only take effect on startup.
-st.termname: st-256color
-! if you do not set shell, precedence is: -e arg, utmp option, SHELL env var, /etc/passwd shell
-st.shell: /usr/bin/tmux
-
-! The following options options can be reloaded via USR1 signal.
-st.font: mononoki Nerd Font Mono:pixelsize=9:antialias=true:autohint=true;
-st.font2: Symbola:pixelsize=12:antialias=true:autohint=true;
-st.borderpx: 3
-! st alpha
-! st.alpha: 0.8
-! st.alphaUnfocused: 0.8
-! Available cursor values: 2 4 6 7 = █ _ | ☃ ( 1 3 5 are blinking versions)
-st.cursorshape: 6
-! thickness of underline and bar cursors
-st.cursorthickness: 2
-! 0: normal blinking, 1: leave cursor border and blink with cursor''s background
-st.cursorblinkstyle: 0
-! 0: cursor blinks with a constant interval; 1: blinking cycle resets on key input
-st.cursorblinkontype: 1
-! st.bold_font: 0
-st.xfps: 120
-st.actionfps: 60
-! Amount of lines scrolled
-st.mouseScrollLines: 1
-! Kerning / character bounding-box height multiplier
-st.chscale: 1.0
-! Kerning / character bounding-box width multiplier
-st.cwscale: 1.0
-! blinking timeout for terminal and cursor blinking (0 disables)
-st.blinktimeout: 800
-! bell volume. Value between -100 and 100. (0 disables)
-st.bellvolume: 0
-! this is a char that is exposed like so: `printf '\033[z'`
-st.prompt_char: $
-! This option is can be preedit style. Available values: `root` `overthespot` (Default taken `root`)
-st.imstyle: root
-! This option sets the number of spaces for a tab
-st.tabspaces: 2
-
-!! RXVT-Unicode (urxvt) config
-! do not scroll with output
-URxvt.scrollTtyOutput: false
-! scroll in relation to buffer (with mouse scroll or Shift+Page Up)
-URxvt.scrollWithBuffer: true
-! scroll back to the bottom on keypress
-URxvt.scrollTtyKeypress: true
-! disable scrollback buffer for secondary screen
-URxvt.secondaryScreen: 1
-URxvt.secondaryScroll: 0
-URxvt.secondaryWheel: 1
-! URxvt font
-URxvt.font: xft:Fira Code:regular:size=8,xft:symbola:regular:size=9
-! fix font spacing
-URxvt.letterSpace: -1
-! Disable printing
-URxvt.print-pipe: "cat > /dev/null"
-! disable iso14755
-URxvt.iso14755: false
-URxvt.iso14755_52: false
-! enable transparency
-URxvt.depth: 32
-URxvt.background: rgba:0000/0000/0200/c800
-! disable scrollbar
-URxvt.scrollBar: false
-
-!! perls
-! perls
-URxvt.perl-ext: default,url-select,tabbed,resize-font,clipboard
-! clipboard
-URxvt.clipboard.autocopy: true
-URxvt.keysym.Shift-Control-C: perl:clipboard:copy
-URxvt.keysym.Shift-Control-V: perl:clipboard:paste
-! url-select
-URxvt.keysum.M-u: perl:url-select:select-next
-URxvt.url-select.launcher: /usr/bin/xdg-open
-URxvt.url-select.underline: true
-! tabbed
-URxvt.tabbed.tabbar-fg: 2
-URxvt.tabbed.tabbar-bg: 0
-URxvt.tabbed.tab-fg: 3
-URxvt.tabbed.tab-bg: 0
-! resize-font
-URxvt.keysym.C-Minus: resize-font:smaller
-URxvt.keysym.C-Plus: resize-font:bigger
-
-! "Enabled modi" Set from: Default
-rofi.modi: window,run,ssh,drun
-! "Window width" Set from: Default
-rofi.width: 1366
-! "Number of lines" Set from: Default
-! rofi.lines: 15
-! "Number of columns" Set from: Default
-! rofi.columns: 1
-! "Font to use" Set from: Default
-rofi.font: mononoki 9
-! "Border width" Set from: Default
-! rofi.bw: 1
-! "Location on screen" Set from: Default
-rofi.location: 2
-! "Padding" Set from: Default
-! rofi.padding: 5
-! "Y-offset relative to location" Set from: Default
-! rofi.yoffset: 0
-! "X-offset relative to location" Set from: Default
-! rofi.xoffset: 0
-! "Always show number of lines" Set from: Default
-! rofi.fixed-num-lines: true
-! "Whether to load and show icons" Set from: Default
-! rofi.show-icons: false
-! "Terminal to use" Set from: Default
-! rofi.terminal: rofi-sensible-terminal
-! "Ssh client to use" Set from: Default
-! rofi.ssh-client: ssh
-! "Ssh command to execute" Set from: Default
-! rofi.ssh-command: {terminal} -e {ssh-client} {host} [-p {port}]
-! "Run command to execute" Set from: Default
-! rofi.run-command: {cmd}
-! "Command to get extra run targets" Set from: Default
-! rofi.run-list-command:
-! "Run command to execute that runs in shell" Set from: Default
-! rofi.run-shell-command: {terminal} -e {cmd}
-! "Command to executed when -kb-accept-alt binding is hit on selected window " Set from: Default
-! rofi.window-command: wmctrl -i -R {window}
-! "Window fields to match in window mode" Set from: Default
-! rofi.window-match-fields: all
-! "Theme to use to look for icons" Set from: Default
-! rofi.icon-theme:
-! "Desktop entry fields to match in drun" Set from: Default
-! rofi.drun-match-fields: name,generic,exec,categories,keywords
-! "Only show Desktop entry from these categories" Set from: Default
-! rofi.drun-categories:
-! "Desktop entry show actions." Set from: Default
-! rofi.drun-show-actions: false
-! "DRUN format string. (Supports: generic,name,comment,exec,categories)" Set from: Default
-! rofi.drun-display-format: {name} [<span weight='light' size='small'><i>({generic})</i></span>]
-! "Command to open an Desktop Entry that is a Link." Set from: Default
-! rofi.drun-url-launcher: xdg-open
-! "Disable history in run/ssh" Set from: Default
-! rofi.disable-history: false
-! "Programs ignored for history" Set from: Default
-! rofi.ignored-prefixes:
-! "Use sorting" Set from: Default
-! rofi.sort: false
-! "Choose the strategy used for sorting: normal (levenshtein) or fzf." Set from: Default
-! rofi.sorting-method: normal
-! "Set case-sensitivity" Set from: Default
-! rofi.case-sensitive: false
-! "Cycle through the results list" Set from: Default
-! rofi.cycle: true
-! "Enable sidebar-mode" Set from: Default
-! rofi.sidebar-mode: false
-! "Row height (in chars)" Set from: Default
-! rofi.eh: 1
-! "Enable auto select mode" Set from: Default
-! rofi.auto-select: false
-! "Parse hosts file for ssh mode" Set from: Default
-! rofi.parse-hosts: false
-! "Parse known_hosts file for ssh mode" Set from: Default
-! rofi.parse-known-hosts: true
-! "Set the modi to combine in combi mode" Set from: Default
-! rofi.combi-modi: window,run
-! "Set the matching algorithm. (normal, regex, glob, fuzzy)" Set from: Default
-! rofi.matching: normal
-! "Tokenize input string" Set from: Default
-! rofi.tokenize: true
-! "Monitor id to show on" Set from: Default
-! rofi.m: -5
-! "Margin between rows *DEPRECATED*" Set from: Default
-! rofi.line-margin: 2
-! "Padding within rows *DEPRECATED*" Set from: Default
-! rofi.line-padding: 1
-! "Pre-set filter" Set from: Default
-! rofi.filter:
-! "Separator style (none, dash, solid) *DEPRECATED*" Set from: Default
-! rofi.separator-style: dash
-! "Hide scroll-bar *DEPRECATED*" Set from: Default
-! rofi.hide-scrollbar: false
-! "Fullscreen" Set from: Default
-! rofi.fullscreen: false
-! "Fake transparency *DEPRECATED*" Set from: Default
-! rofi.fake-transparency: false
-! "DPI" Set from: Default
-! rofi.dpi: -1
-! "Threads to use for string matching" Set from: Default
-! rofi.threads: 0
-! "Scrollbar width *DEPRECATED*" Set from: Default
-! rofi.scrollbar-width: 8
-! "Scrolling method. (0: Page, 1: Centered)" Set from: Default
-! rofi.scroll-method: 0
-! "Background to use for fake transparency. (background or screenshot) *DEPRECATED*" Set from: Default
-! rofi.fake-background: screenshot
-! "Window Format. w (desktop name), t (title), n (name), r (role), c (class)" Set from: Default
-! rofi.window-format: {w} {c} {t}
-! "Click outside the window to exit" Set from: Default
-! rofi.click-to-exit: true
-! "Indicate how it match by underlining it." Set from: Default
-! rofi.show-match: true
-! "New style theme file" Set from: Default
-! rofi.theme:
-! "Color scheme for normal row" Set from: Default
-! 'bg' 'fg' 'bgalt' 'hlbg' 'hlfg'
-rofi.color-normal: #000000, #b4b7b5, #89231d, #cc342b, #000000
-! "Color scheme for urgent row" Set from: Default
-! rofi.color-urgent:
-! "Color scheme for active row" Set from: Default
-! rofi.color-active:
-! "Color scheme window" Set from: Default
-! 'background' 'border' 'separator'
-rofi.color-window: #1d1f21, #101010, #000000
-! "Max history size (WARNING: can cause slowdowns when set to high)." Set from: Default
-! rofi.max-history-size: 25
-! "Hide the prefix mode prefix on the combi view." Set from: Default
-! rofi.combi-hide-mode-prefix: false
-! "Set the character used to negate the matching. ('\0' to disable)" Set from: Default
-! rofi.matching-negate-char: -
-! "Directory where history and temporary files are stored." Set from: Default
-! rofi.cache-dir:
-! "Show window thumbnail (if available) as icon in window switcher." Set from: Default
-! rofi.window-thumbnail: false
-! "DRUN: build and use a cache with desktop file content." Set from: Default
-! rofi.drun-use-desktop-cache: false
-! "DRUN: If enabled, reload the cache with desktop file content." Set from: Default
-! rofi.drun-reload-desktop-cache: false
-! "Normalize string when matching (implies -no-show-match)." Set from: Default
-! rofi.normalize-match: false
-! "Pidfile location" Set from: Default
-! rofi.pid: /run/user/1000/rofi.pid
-! "The display name of this browser" Set from: Default
-! rofi.display-window:
-! "The display name of this browser" Set from: Default
-! rofi.display-windowcd:
-! "The display name of this browser" Set from: Default
-! rofi.display-run:
-! "The display name of this browser" Set from: Default
-! rofi.display-ssh:
-! "The display name of this browser" Set from: Default
-! rofi.display-drun:
-! "The display name of this browser" Set from: Default
-! rofi.display-combi:
-! "The display name of this browser" Set from: Default
-! rofi.display-keys:
-! "The display name of this browser" Set from: Default
-! rofi.display-file-browser:
-! "Paste primary selection" Set from: Default
-! rofi.kb-primary-paste: Control+V,Shift+Insert
-! "Paste clipboard" Set from: Default
-! rofi.kb-secondary-paste: Control+v,Insert
-! "Clear input line" Set from: Default
-! rofi.kb-clear-line: Control+w
-! "Beginning of line" Set from: Default
-! rofi.kb-move-front: Control+a
-! "End of line" Set from: Default
-! rofi.kb-move-end: Control+e
-! "Move back one word" Set from: Default
-! rofi.kb-move-word-back: Alt+b,Control+Left
-! "Move forward one word" Set from: Default
-! rofi.kb-move-word-forward: Alt+f,Control+Right
-! "Move back one char" Set from: Default
-! rofi.kb-move-char-back: Left,Control+b
-! "Move forward one char" Set from: Default
-! rofi.kb-move-char-forward: Right,Control+f
-! "Delete previous word" Set from: Default
-! rofi.kb-remove-word-back: Control+Alt+h,Control+BackSpace
-! "Delete next word" Set from: Default
-! rofi.kb-remove-word-forward: Control+Alt+d
-! "Delete next char" Set from: Default
-! rofi.kb-remove-char-forward: Delete,Control+d
-! "Delete previous char" Set from: Default
-! rofi.kb-remove-char-back: BackSpace,Shift+BackSpace,Control+h
-! "Delete till the end of line" Set from: Default
-! rofi.kb-remove-to-eol: Control+k
-! "Delete till the start of line" Set from: Default
-! rofi.kb-remove-to-sol: Control+u
-! "Accept entry" Set from: Default
-! rofi.kb-accept-entry: Control+j,Control+m,Return,KP_Enter
-! "Use entered text as command (in ssh/run modi)" Set from: Default
-! rofi.kb-accept-custom: Control+Return
-! "Use alternate accept command." Set from: Default
-! rofi.kb-accept-alt: Shift+Return
-! "Delete entry from history" Set from: Default
-! rofi.kb-delete-entry: Shift+Delete
-! "Switch to the next mode." Set from: Default
-! rofi.kb-mode-next: Shift+Right,Control+Tab
-! "Switch to the previous mode." Set from: Default
-! rofi.kb-mode-previous: Shift+Left,Control+ISO_Left_Tab
-! "Go to the previous column" Set from: Default
-! rofi.kb-row-left: Control+Page_Up
-! "Go to the next column" Set from: Default
-! rofi.kb-row-right: Control+Page_Down
-! "Select previous entry" Set from: Default
-! rofi.kb-row-up: Up,Control+p,ISO_Left_Tab
-! "Select next entry" Set from: Default
-! rofi.kb-row-down: Down,Control+n
-! "Go to next row, if one left, accept it, if no left next mode." Set from: Default
-! rofi.kb-row-tab: Tab
-! "Go to the previous page" Set from: Default
-! rofi.kb-page-prev: Page_Up
-! "Go to the next page" Set from: Default
-! rofi.kb-page-next: Page_Down
-! "Go to the first entry" Set from: Default
-! rofi.kb-row-first: Home,KP_Home
-! "Go to the last entry" Set from: Default
-! rofi.kb-row-last: End,KP_End
-! "Set selected item as input text" Set from: Default
-! rofi.kb-row-select: Control+space
-! "Take a screenshot of the rofi window" Set from: Default
-! rofi.kb-screenshot: Alt+S
-! "Toggle between ellipsize modes for displayed data" Set from: Default
-! rofi.kb-ellipsize: Alt+period
-! "Toggle case sensitivity" Set from: Default
-! rofi.kb-toggle-case-sensitivity: grave,dead_grave
-! "Toggle sort" Set from: Default
-! rofi.kb-toggle-sort: Alt+grave
-! "Quit rofi" Set from: Default
-! rofi.kb-cancel: Escape,Control+g,Control+bracketleft
-! "Custom keybinding 1" Set from: Default
-! rofi.kb-custom-1: Alt+1
-! "Custom keybinding 2" Set from: Default
-! rofi.kb-custom-2: Alt+2
-! "Custom keybinding 3" Set from: Default
-! rofi.kb-custom-3: Alt+3
-! "Custom keybinding 4" Set from: Default
-! rofi.kb-custom-4: Alt+4
-! "Custom Keybinding 5" Set from: Default
-! rofi.kb-custom-5: Alt+5
-! "Custom keybinding 6" Set from: Default
-! rofi.kb-custom-6: Alt+6
-! "Custom Keybinding 7" Set from: Default
-! rofi.kb-custom-7: Alt+7
-! "Custom keybinding 8" Set from: Default
-! rofi.kb-custom-8: Alt+8
-! "Custom keybinding 9" Set from: Default
-! rofi.kb-custom-9: Alt+9
-! "Custom keybinding 10" Set from: Default
-! rofi.kb-custom-10: Alt+0
-! "Custom keybinding 11" Set from: Default
-! rofi.kb-custom-11: Alt+exclam
-! "Custom keybinding 12" Set from: Default
-! rofi.kb-custom-12: Alt+at
-! "Custom keybinding 13" Set from: Default
-! rofi.kb-custom-13: Alt+numbersign
-! "Custom keybinding 14" Set from: Default
-! rofi.kb-custom-14: Alt+dollar
-! "Custom keybinding 15" Set from: Default
-! rofi.kb-custom-15: Alt+percent
-! "Custom keybinding 16" Set from: Default
-! rofi.kb-custom-16: Alt+dead_circumflex
-! "Custom keybinding 17" Set from: Default
-! rofi.kb-custom-17: Alt+ampersand
-! "Custom keybinding 18" Set from: Default
-! rofi.kb-custom-18: Alt+asterisk
-! "Custom Keybinding 19" Set from: Default
-! rofi.kb-custom-19: Alt+parenleft
-! "Select row 1" Set from: Default
-! rofi.kb-select-1: Super+1
-! "Select row 2" Set from: Default
-! rofi.kb-select-2: Super+2
-! "Select row 3" Set from: Default
-! rofi.kb-select-3: Super+3
-! "Select row 4" Set from: Default
-! rofi.kb-select-4: Super+4
-! "Select row 5" Set from: Default
-! rofi.kb-select-5: Super+5
-! "Select row 6" Set from: Default
-! rofi.kb-select-6: Super+6
-! "Select row 7" Set from: Default
-! rofi.kb-select-7: Super+7
-! "Select row 8" Set from: Default
-! rofi.kb-select-8: Super+8
-! "Select row 9" Set from: Default
-! rofi.kb-select-9: Super+9
-! "Select row 10" Set from: Default
-! rofi.kb-select-10: Super+0
-! "Go to the previous column" Set from: Default
-! rofi.ml-row-left: ScrollLeft
-! "Go to the next column" Set from: Default
-! rofi.ml-row-right: ScrollRight
-! "Select previous entry" Set from: Default
-! rofi.ml-row-up: ScrollUp
-! "Select next entry" Set from: Default
-! rofi.ml-row-down: ScrollDown
-! "Select hovered row" Set from: Default
-! rofi.me-select-entry: MousePrimary
-! "Accept hovered row" Set from: Default
-! rofi.me-accept-entry: MouseDPrimary
-! "Accept hovered row with custom action" Set from: Default
-! rofi.me-accept-custom: Control+MouseDPrimary
-
-!! special
-!*.foreground: #c5c8c6
-!*.background: #1d1f21
-!*.cursorColor: #c5c8c6
-!
-!! black
-!*.color0: #282a2e
-!*.color8: #373b41
-!
-!! red
-!*.color1: #a54242
-!*.color9: #cc6666
-!
-!! green
-!*.color2: #8c9440
-!*.color10: #b5bd68
-!
-!! yellow
-!*.color3: #de935f
-!*.color11: #f0c674
-!
-!! blue
-!*.color4: #5f819d
-!*.color12: #81a2be
-!
-!! magenta
-!*.color5: #85678f
-!*.color13: #b294bb
-!
-!! cyan
-!*.color6: #5e8d87
-!*.color14: #8abeb7
-!
-!! white
-!*.color7: #707880
-!*.color15: #c5c8c6
-!
-!! special
-*.foreground: #c5c8c6
-*.background: #000000
-*.cursorColor: #c5c8c6
-*.reverseCursor: #333536
-dmenu.selbackground: #39c1ed
-dmenu.selforeground: #000000
-dmenu.hibackground: #000000
-dmenu.hiforeground: #198844
-dmenu.selhibackground: #39c1ed
-dmenu.selhiforeground: #198844
-
-! black
-*.color0: #1b1d1c
-*.color8: #969896
-
-! red
-*.color1: #89231d
-*.color9: #cc342b
-
-! green
-*.color2: #198844
-*.color10: #4eec4e
-
-! yellow
-*.color3: #ae7518
-*.color11: #fba922
-
-! blue
-*.color4: #2b55b2
-*.color12: #3971ed
-
-! magenta
-*.color5: #784e93
-*.color13: #a36ac7
-
-! cyan
-*.color6: #2783a1
-*.color14: #39c1ed
-
-! white
-*.color7: #b4b7b5
-*.color15: #ffffff
diff --git a/alacritty/alacritty.yml b/alacritty/alacritty.yml
deleted file mode 100644
index 25af5d4..0000000
--- a/alacritty/alacritty.yml
+++ /dev/null
@@ -1,852 +0,0 @@
-# Configuration for Alacritty, the GPU enhanced terminal emulator.
-
-# Import additional configuration files
-#
-# Imports are loaded in order, skipping all missing files, with the importing
-# file being loaded last. If a field is already present in a previous import, it
-# will be replaced.
-#
-# All imports must either be absolute paths starting with `/`, or paths relative
-# to the user's home directory starting with `~/`.
-#import:
-# - /path/to/alacritty.yml
-
-# Any items in the `env` entry below will be added as
-# environment variables. Some entries may override variables
-# set by alacritty itself.
-env:
- # TERM variable
- #
- # This value is used to set the `$TERM` environment variable for
- # each instance of Alacritty. If it is not present, alacritty will
- # check the local terminfo database and use `alacritty` if it is
- # available, otherwise `xterm-256color` is used.
- TERM: xterm-256color
-
-window:
- # Window dimensions (changes require restart)
- #
- # Number of lines/columns (not pixels) in the terminal. The number of columns
- # must be at least `2`, while using a value of `0` for columns and lines will
- # fall back to the window manager's recommended size.
- #dimensions:
- # columns: 0
- # lines: 0
-
- # Window position (changes require restart)
- #
- # Specified in number of pixels.
- # If the position is not set, the window manager will handle the placement.
- #position:
- # x: 0
- # y: 0
-
- # Window padding (changes require restart)
- #
- # Blank space added around the window in pixels. This padding is scaled
- # by DPI and the specified value is always added at both opposing sides.
- #padding:
- # x: 0
- # y: 0
-
- # Spread additional padding evenly around the terminal content.
- #dynamic_padding: false
-
- # Window decorations
- #
- # Values for `decorations`:
- # - full: Borders and title bar
- # - none: Neither borders nor title bar
- #
- # Values for `decorations` (macOS only):
- # - transparent: Title bar, transparent background and title bar buttons
- # - buttonless: Title bar, transparent background and no title bar buttons
- #decorations: full
-
- # Startup Mode (changes require restart)
- #
- # Values for `startup_mode`:
- # - Windowed
- # - Maximized
- # - Fullscreen
- #
- # Values for `startup_mode` (macOS only):
- # - SimpleFullscreen
- #startup_mode: Windowed
-
- # Window title
- #title: Alacritty
-
- # Allow terminal applications to change Alacritty's window title.
- #dynamic_title: true
-
- # Window class (Linux/BSD only):
- #class:
- # Application instance name
- #instance: Alacritty
- # General application class
- #general: Alacritty
-
- # GTK theme variant (Linux/BSD only)
- #
- # Override the variant of the GTK theme. Commonly supported values are `dark`
- # and `light`. Set this to `None` to use the default theme variant.
- #gtk_theme_variant: None
-
- # Background opacity
- #
- opacity: 0.8
-
-scrolling:
- # Maximum number of lines in the scrollback buffer.
- # Specifying '0' will disable scrolling.
- history: 10000
-
- # Scrolling distance multiplier.
- multiplier: 3
-
-# Font configuration
-font:
- # Normal (roman) font face
- normal:
- # Font family
- #
- # Default:
- # - (macOS) Menlo
- # - (Linux/BSD) monospace
- # - (Windows) Consolas
- family: mononoki Nerd Font Mono
-
- # The `style` can be specified to pick a specific face.
- style: Regular
-
- # Bold font face
- bold:
- # Font family
- #
- # If the bold family is not specified, it will fall back to the
- # value specified for the normal font.
- family: mononoki Nerd Font Mono
-
- # The `style` can be specified to pick a specific face.
- style: Bold
-
- # Italic font face
- italic:
- # Font family
- #
- # If the italic family is not specified, it will fall back to the
- # value specified for the normal font.
- family: mononoki Nerd Font Mono
-
- # The `style` can be specified to pick a specific face.
- style: Italic
-
- # Bold italic font face
- bold_italic:
- # Font family
- #
- # If the bold italic family is not specified, it will fall back to the
- # value specified for the normal font.
- family: mononoki Nerd Font Mono
-
- # The `style` can be specified to pick a specific face.
- style: Bold Italic
-
- # Point size
- size: 12.0
-
- # Offset is the extra space around each character. `offset.y` can be thought
- # of as modifying the line spacing, and `offset.x` as modifying the letter
- # spacing.
- #offset:
- # x: 0
- # y: 0
-
- # Glyph offset determines the locations of the glyphs within their cells with
- # the default being at the bottom. Increasing `x` moves the glyph to the
- # right, increasing `y` moves the glyph upward.
- #glyph_offset:
- # x: 0
- # y: 0
-
- # Thin stroke font rendering (macOS only)
- #
- # Thin strokes are suitable for retina displays, but for non-retina screens
- # it is recommended to set `use_thin_strokes` to `false`.
- #use_thin_strokes: true
-
-# If `true`, bold text is drawn using the bright color variants.
-draw_bold_text_with_bright_colors: true
-
-# Colors (ZachIR)
-colors:
- # Default colors
-
- footer_bar:
- background: '#c5c8c6'
- foreground: '#1d1f21'
-
-
- primary:
- background: '#000000'
- foreground: '#c5c8c6'
-
- # Bright and dim foreground colors
- #
- # The dimmed foreground color is calculated automatically if it is not
- # present. If the bright foreground color is not set, or
- # `draw_bold_text_with_bright_colors` is `false`, the normal foreground
- # color will be used.
- dim_foreground: '#828482'
- bright_foreground: '#eaeaea'
-
- # Cursor colors
- #
- # Colors which should be used to draw the terminal cursor.
- #
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- cursor:
- text: CellBackground
- cursor: CellForeground
-
- # Vi mode cursor colors
- #
- # Colors for the cursor when the vi mode is active.
- #
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- vi_mode_cursor:
- text: CellBackground
- cursor: CellForeground
-
- # Search colors
- #
- # Colors used for the search bar and match highlighting.
- search:
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- matches:
- foreground: '#000000'
- background: '#ffffff'
- focused_match:
- foreground: '#ffffff'
- background: '#000000'
-
- # Keyboard regex hints
- hints:
- # First character in the hint label
- #
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- start:
- foreground: '#1d1f21'
- background: '#e9ff5e'
-
- # All characters after the first one in the hint label
- #
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- end:
- foreground: '#e9ff5e'
- background: '#1d1f21'
-
- # Line indicator
- #
- # Color used for the indicator displaying the position in history during
- # search and vi mode.
- #
- # By default, these will use the opposing primary color.
- line_indicator:
- foreground: None
- background: None
-
- # Selection colors
- #
- # Colors which should be used to draw the selection area.
- #
- # Allowed values are CellForeground/CellBackground, which reference the
- # affected cell, or hexadecimal colors like #ff00ff.
- selection:
- text: CellBackground
- background: CellForeground
-
- # Normal colors
- normal:
- black: '#1d1f21'
- red: '#89231d'
- green: '#146e37'
- yellow: '#ae7518'
- blue: '#2b55b2'
- magenta: '#784e93'
- cyan: '#2783a1'
- white: '#b4b7b5'
-
- # Bright colors
- bright:
- black: '#969896'
- red: '#cc342b'
- green: '#198844'
- yellow: '#fba922'
- blue: '#3971ed'
- magenta: '#a36ac7'
- cyan: '#39c1ed'
- white: '#ffffff'
-
- # Dim colors
- #
- # If the dim colors are not set, they will be calculated automatically based
- # on the `normal` colors.
- #dim:
- # black: '#131415'
- # red: '#864343'
- # green: '#777c44'
- # yellow: '#9e824c'
- # blue: '#556a7d'
- # magenta: '#75617b'
- # cyan: '#5b7d78'
- # white: '#828482'
-
- # Indexed Colors
- #
- # The indexed colors include all colors from 16 to 256.
- # When these are not set, they're filled with sensible defaults.
- #
- # Example:
- # `- { index: 16, color: '#ff00ff' }`
- #
- #indexed_colors: []
-
-# Bell
-#
-# The bell is rung every time the BEL control character is received.
-bell:
- # Visual Bell Animation
- #
- # Animation effect for flashing the screen when the visual bell is rung.
- #
- # Values for `animation`:
- # - Ease
- # - EaseOut
- # - EaseOutSine
- # - EaseOutQuad
- # - EaseOutCubic
- # - EaseOutQuart
- # - EaseOutQuint
- # - EaseOutExpo
- # - EaseOutCirc
- # - Linear
- #animation: EaseOutExpo
-
- # Duration of the visual bell flash in milliseconds. A `duration` of `0` will
- # disable the visual bell animation.
- duration: 0
-
- # Visual bell animation color.
- #color: '#ffffff'
-
- # Bell Command
- #
- # This program is executed whenever the bell is rung.
- #
- # When set to `command: None`, no command will be executed.
- #
- # Example:
- # command:
- # program: notify-send
- # args: ["Hello, World!"]
- #
- #command: None
-
-#selection:
- # This string contains all characters that are used as separators for
- # "semantic words" in Alacritty.
- #semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
-
- # When set to `true`, selected text will be copied to the primary clipboard.
- #save_to_clipboard: false
-
-cursor:
- # Cursor style
- style:
- # Cursor shape
- #
- # Values for `shape`:
- # - ▇ Block
- # - _ Underline
- # - | Beam
- shape: Block
-
- # Cursor blinking state
- #
- # Values for `blinking`:
- # - Never: Prevent the cursor from ever blinking
- # - Off: Disable blinking by default
- # - On: Enable blinking by default
- # - Always: Force the cursor to always blink
- blinking: Off
-
- # Vi mode cursor style
- #
- # If the vi mode cursor style is `None` or not specified, it will fall back to
- # the style of the active value of the normal cursor.
- #
- # See `cursor.style` for available options.
- #vi_mode_style: None
-
- # Cursor blinking interval in milliseconds.
- #blink_interval: 750
-
- # If this is `true`, the cursor will be rendered as a hollow box when the
- # window is not focused.
- #unfocused_hollow: true
-
- # Thickness of the cursor relative to the cell width as floating point number
- # from `0.0` to `1.0`.
- #thickness: 0.15
-
-# Live config reload (changes require restart)
-#live_config_reload: true
-
-# Shell
-#
-# You can set `shell.program` to the path of your favorite shell, e.g.
-# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the
-# shell.
-#
-# Default:
-# - (macOS) /bin/bash --login
-# - (Linux/BSD) user login shell
-# - (Windows) powershell
-# shell:
- # program: /bin/ksh
- #args:
- # - --login
-
-# Startup directory
-#
-# Directory the shell is started in. If this is unset, or `None`, the working
-# directory of the parent process will be used.
-#working_directory: None
-
-# Send ESC (\x1b) before characters when alt is pressed.
-#alt_send_esc: true
-
-#mouse:
- # Click settings
- #
- # The `double_click` and `triple_click` settings control the time
- # alacritty should wait for accepting multiple clicks as one double
- # or triple click.
- #double_click: { threshold: 300 }
- #triple_click: { threshold: 300 }
-
- # If this is `true`, the cursor is temporarily hidden when typing.
- #hide_when_typing: false
-
-# Regex hints
-#
-# Terminal hints can be used to find text in the visible part of the terminal
-# and pipe it to other applications.
-#hints:
- # Keys used for the hint labels.
- #alphabet: "jfkdls;ahgurieowpq"
-
- # List with all available hints
- #
- # Each hint must have a `regex` and either an `action` or a `command` field.
- # The fields `mouse`, `binding` and `post_processing` are optional.
- #
- # The fields `command`, `binding.key`, `binding.mods` and `mouse.mods` accept
- # the same values as they do in the `key_bindings` section.
- #
- # The `mouse.enabled` field controls if the hint should be underlined while
- # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it.
- #
- # If the `post_processing` field is set to `true`, heuristics will be used to
- # shorten the match if there are characters likely not to be part of the hint
- # (e.g. a trailing `.`). This is most useful for URIs.
- #
- # Values for `action`:
- # - Copy
- # Copy the hint's text to the clipboard.
- # - Paste
- # Paste the hint's text to the terminal or search.
- # - Select
- # Select the hint's text.
- # - MoveViModeCursor
- # Move the vi mode cursor to the beginning of the hint.
- #enabled:
- # - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\
- # [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+"
- # command: xdg-open
- # post_processing: true
- # mouse:
- # enabled: true
- # mods: None
- # binding:
- # key: U
- # mods: Control|Shift
-
-# Mouse bindings
-#
-# Mouse bindings are specified as a list of objects, much like the key
-# bindings further below.
-#
-# To trigger mouse bindings when an application running within Alacritty
-# captures the mouse, the `Shift` modifier is automatically added as a
-# requirement.
-#
-# Each mouse binding will specify a:
-#
-# - `mouse`:
-#
-# - Middle
-# - Left
-# - Right
-# - Numeric identifier such as `5`
-#
-# - `action` (see key bindings)
-#
-# And optionally:
-#
-# - `mods` (see key bindings)
-#mouse_bindings:
-# - { mouse: Middle, action: PasteSelection }
-
-# Key bindings
-#
-# Key bindings are specified as a list of objects. For example, this is the
-# default paste binding:
-#
-# `- { key: V, mods: Control|Shift, action: Paste }`
-#
-# Each key binding will specify a:
-#
-# - `key`: Identifier of the key pressed
-#
-# - A-Z
-# - F1-F24
-# - Key0-Key9
-#
-# A full list with available key codes can be found here:
-# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants
-#
-# Instead of using the name of the keys, the `key` field also supports using
-# the scancode of the desired key. Scancodes have to be specified as a
-# decimal number. This command will allow you to display the hex scancodes
-# for certain keys:
-#
-# `showkey --scancodes`.
-#
-# Then exactly one of:
-#
-# - `chars`: Send a byte sequence to the running application
-#
-# The `chars` field writes the specified string to the terminal. This makes
-# it possible to pass escape sequences. To find escape codes for bindings
-# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
-# of tmux. Note that applications use terminfo to map escape sequences back
-# to keys. It is therefore required to update the terminfo when changing an
-# escape sequence.
-#
-# - `action`: Execute a predefined action
-#
-# - ToggleViMode
-# - SearchForward
-# Start searching toward the right of the search origin.
-# - SearchBackward
-# Start searching toward the left of the search origin.
-# - Copy
-# - Paste
-# - IncreaseFontSize
-# - DecreaseFontSize
-# - ResetFontSize
-# - ScrollPageUp
-# - ScrollPageDown
-# - ScrollHalfPageUp
-# - ScrollHalfPageDown
-# - ScrollLineUp
-# - ScrollLineDown
-# - ScrollToTop
-# - ScrollToBottom
-# - ClearHistory
-# Remove the terminal's scrollback history.
-# - Hide
-# Hide the Alacritty window.
-# - Minimize
-# Minimize the Alacritty window.
-# - Quit
-# Quit Alacritty.
-# - ToggleFullscreen
-# - SpawnNewInstance
-# Spawn a new instance of Alacritty.
-# - ClearLogNotice
-# Clear Alacritty's UI warning and error notice.
-# - ClearSelection
-# Remove the active selection.
-# - ReceiveChar
-# - None
-#
-# - Vi mode exclusive actions:
-#
-# - Open
-# Perform the action of the first matching hint under the vi mode cursor
-# with `mouse.enabled` set to `true`.
-# - ToggleNormalSelection
-# - ToggleLineSelection
-# - ToggleBlockSelection
-# - ToggleSemanticSelection
-# Toggle semantic selection based on `selection.semantic_escape_chars`.
-#
-# - Vi mode exclusive cursor motion actions:
-#
-# - Up
-# One line up.
-# - Down
-# One line down.
-# - Left
-# One character left.
-# - Right
-# One character right.
-# - First
-# First column, or beginning of the line when already at the first column.
-# - Last
-# Last column, or beginning of the line when already at the last column.
-# - FirstOccupied
-# First non-empty cell in this terminal row, or first non-empty cell of
-# the line when already at the first cell of the row.
-# - High
-# Top of the screen.
-# - Middle
-# Center of the screen.
-# - Low
-# Bottom of the screen.
-# - SemanticLeft
-# Start of the previous semantically separated word.
-# - SemanticRight
-# Start of the next semantically separated word.
-# - SemanticLeftEnd
-# End of the previous semantically separated word.
-# - SemanticRightEnd
-# End of the next semantically separated word.
-# - WordLeft
-# Start of the previous whitespace separated word.
-# - WordRight
-# Start of the next whitespace separated word.
-# - WordLeftEnd
-# End of the previous whitespace separated word.
-# - WordRightEnd
-# End of the next whitespace separated word.
-# - Bracket
-# Character matching the bracket at the cursor's location.
-# - SearchNext
-# Beginning of the next match.
-# - SearchPrevious
-# Beginning of the previous match.
-# - SearchStart
-# Start of the match to the left of the vi mode cursor.
-# - SearchEnd
-# End of the match to the right of the vi mode cursor.
-#
-# - Search mode exclusive actions:
-# - SearchFocusNext
-# Move the focus to the next search match.
-# - SearchFocusPrevious
-# Move the focus to the previous search match.
-# - SearchConfirm
-# - SearchCancel
-# - SearchClear
-# Reset the search regex.
-# - SearchDeleteWord
-# Delete the last word in the search regex.
-# - SearchHistoryPrevious
-# Go to the previous regex in the search history.
-# - SearchHistoryNext
-# Go to the next regex in the search history.
-#
-# - macOS exclusive actions:
-# - ToggleSimpleFullscreen
-# Enter fullscreen without occupying another space.
-#
-# - Linux/BSD exclusive actions:
-#
-# - CopySelection
-# Copy from the selection buffer.
-# - PasteSelection
-# Paste from the selection buffer.
-#
-# - `command`: Fork and execute a specified command plus arguments
-#
-# The `command` field must be a map containing a `program` string and an
-# `args` array of command line parameter strings. For example:
-# `{ program: "alacritty", args: ["-e", "vttest"] }`
-#
-# And optionally:
-#
-# - `mods`: Key modifiers to filter binding actions
-#
-# - Command
-# - Control
-# - Option
-# - Super
-# - Shift
-# - Alt
-#
-# Multiple `mods` can be combined using `|` like this:
-# `mods: Control|Shift`.
-# Whitespace and capitalization are relevant and must match the example.
-#
-# - `mode`: Indicate a binding for only specific terminal reported modes
-#
-# This is mainly used to send applications the correct escape sequences
-# when in different modes.
-#
-# - AppCursor
-# - AppKeypad
-# - Search
-# - Alt
-# - Vi
-#
-# A `~` operator can be used before a mode to apply the binding whenever
-# the mode is *not* active, e.g. `~Alt`.
-#
-# Bindings are always filled by default, but will be replaced when a new
-# binding with the same triggers is defined. To unset a default binding, it can
-# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
-# a no-op if you do not wish to receive input characters for that binding.
-#
-# If the same trigger is assigned to multiple actions, all of them are executed
-# in the order they were defined in.
-#key_bindings:
- #- { key: Paste, action: Paste }
- #- { key: Copy, action: Copy }
- #- { key: L, mods: Control, action: ClearLogNotice }
- #- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" }
- #- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, }
- #- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown }
- #- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, }
- #- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom }
-
- # Vi Mode
- #- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom }
- #- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode }
- #- { key: Escape, mode: Vi|~Search, action: ClearSelection }
- #- { key: I, mode: Vi|~Search, action: ScrollToBottom }
- #- { key: I, mode: Vi|~Search, action: ToggleViMode }
- #- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode }
- #- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp }
- #- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown }
- #- { key: G, mode: Vi|~Search, action: ScrollToTop }
- #- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom }
- #- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp }
- #- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown }
- #- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp }
- #- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown }
- #- { key: Y, mode: Vi|~Search, action: Copy }
- #- { key: Y, mode: Vi|~Search, action: ClearSelection }
- #- { key: Copy, mode: Vi|~Search, action: ClearSelection }
- #- { key: V, mode: Vi|~Search, action: ToggleNormalSelection }
- #- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection }
- #- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection }
- #- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection }
- #- { key: Return, mode: Vi|~Search, action: Open }
- #- { key: K, mode: Vi|~Search, action: Up }
- #- { key: J, mode: Vi|~Search, action: Down }
- #- { key: H, mode: Vi|~Search, action: Left }
- #- { key: L, mode: Vi|~Search, action: Right }
- #- { key: Up, mode: Vi|~Search, action: Up }
- #- { key: Down, mode: Vi|~Search, action: Down }
- #- { key: Left, mode: Vi|~Search, action: Left }
- #- { key: Right, mode: Vi|~Search, action: Right }
- #- { key: Key0, mode: Vi|~Search, action: First }
- #- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last }
- #- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied }
- #- { key: H, mods: Shift, mode: Vi|~Search, action: High }
- #- { key: M, mods: Shift, mode: Vi|~Search, action: Middle }
- #- { key: L, mods: Shift, mode: Vi|~Search, action: Low }
- #- { key: B, mode: Vi|~Search, action: SemanticLeft }
- #- { key: W, mode: Vi|~Search, action: SemanticRight }
- #- { key: E, mode: Vi|~Search, action: SemanticRightEnd }
- #- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft }
- #- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight }
- #- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd }
- #- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket }
- #- { key: Slash, mode: Vi|~Search, action: SearchForward }
- #- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward }
- #- { key: N, mode: Vi|~Search, action: SearchNext }
- #- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious }
-
- # Search Mode
- #- { key: Return, mode: Search|Vi, action: SearchConfirm }
- #- { key: Escape, mode: Search, action: SearchCancel }
- #- { key: C, mods: Control, mode: Search, action: SearchCancel }
- #- { key: U, mods: Control, mode: Search, action: SearchClear }
- #- { key: W, mods: Control, mode: Search, action: SearchDeleteWord }
- #- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious }
- #- { key: N, mods: Control, mode: Search, action: SearchHistoryNext }
- #- { key: Up, mode: Search, action: SearchHistoryPrevious }
- #- { key: Down, mode: Search, action: SearchHistoryNext }
- #- { key: Return, mode: Search|~Vi, action: SearchFocusNext }
- #- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious }
-
- # (Windows, Linux, and BSD only)
- #- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste }
- #- { key: C, mods: Control|Shift, action: Copy }
- #- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward }
- #- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward }
- #- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection }
- #- { key: Insert, mods: Shift, action: PasteSelection }
- #- { key: Key0, mods: Control, action: ResetFontSize }
- #- { key: Equals, mods: Control, action: IncreaseFontSize }
- #- { key: Plus, mods: Control, action: IncreaseFontSize }
- #- { key: NumpadAdd, mods: Control, action: IncreaseFontSize }
- #- { key: Minus, mods: Control, action: DecreaseFontSize }
- #- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize }
-
- # (Windows only)
- #- { key: Return, mods: Alt, action: ToggleFullscreen }
-
- # (macOS only)
- #- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" }
- #- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory }
- #- { key: Key0, mods: Command, action: ResetFontSize }
- #- { key: Equals, mods: Command, action: IncreaseFontSize }
- #- { key: Plus, mods: Command, action: IncreaseFontSize }
- #- { key: NumpadAdd, mods: Command, action: IncreaseFontSize }
- #- { key: Minus, mods: Command, action: DecreaseFontSize }
- #- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize }
- #- { key: V, mods: Command, action: Paste }
- #- { key: C, mods: Command, action: Copy }
- #- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection }
- #- { key: H, mods: Command, action: Hide }
- #- { key: H, mods: Command|Alt, action: HideOtherApplications }
- #- { key: M, mods: Command, action: Minimize }
- #- { key: Q, mods: Command, action: Quit }
- #- { key: W, mods: Command, action: Quit }
- #- { key: N, mods: Command, action: SpawnNewInstance }
- #- { key: F, mods: Command|Control, action: ToggleFullscreen }
- #- { key: F, mods: Command, mode: ~Search, action: SearchForward }
- #- { key: B, mods: Command, mode: ~Search, action: SearchBackward }
-
-#debug:
- # Display the time it takes to redraw each frame.
- #render_timer: false
-
- # Keep the log file after quitting Alacritty.
- #persistent_logging: false
-
- # Log level
- #
- # Values for `log_level`:
- # - Off
- # - Error
- # - Warn
- # - Info
- # - Debug
- # - Trace
- #log_level: Warn
-
- # Print all received window events.
- #print_events: false
diff --git a/autostart.sh b/autostart.sh
deleted file mode 100755
index f1a84af..0000000
--- a/autostart.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-runifnot () {
- if type $1 >/dev/null; then
- echo $1
- if [ -z "$(pgrep -Uzachir -f $1)" ]; then
- $@ &
- fi
- fi
-}
-killandrun () {
- if type $1 >/dev/null; then
- echo $1
- if [ -n "$(pgrep -Uzachir -f $1)" ]; then
- pkill -Uzachir $1
- fi
- $@ &
- fi
-}
-
-if [ -n "${WAYLAND_DISPLAY}${DISPLAY}" ]; then
- notify-sound.sh off &
- runifnot swayidle
- killandrun hyprpaper
- runifnot waybar
- gsettings set $gnome-schema gtk-theme 'Plata-Noir-Compact'
- gsettings set $gnome-schema icon-theme 'Mint-Y-Dark-Blue'
- gsettings set $gnome-schema cursor-theme 'Adwaita'
- xrdb ~/.Xresources
- runifnot portmaster-start --data=/opt/safing/portmaster notifier
- runifnot jamesdsp -t
-fi
-
-[ -x "$XDG_CONFIG_HOME/computerrc.sh" ] && "$XDG_CONFIG_HOME/computerrc.sh"
diff --git a/dunst/dunstrc b/dunst/dunstrc
deleted file mode 100644
index 403ffca..0000000
--- a/dunst/dunstrc
+++ /dev/null
@@ -1,418 +0,0 @@
-[global]
- ### Display ###
-
- # Which monitor should the notifications be displayed on.
- monitor = 0
-
- # Display notification on focused monitor. Possible modes are:
- # mouse: follow mouse pointer
- # keyboard: follow window with keyboard focus
- # none: don't follow anything
- #
- # "keyboard" needs a window manager that exports the
- # _NET_ACTIVE_WINDOW property.
- # This should be the case for almost all modern window managers.
- #
- # If this option is set to mouse or keyboard, the monitor option
- # will be ignored.
- follow = mouse
-
- # The geometry of the window:
- # [{width}]x{height}[+/-{x}+/-{y}]
- # The geometry of the message window.
- # The height is measured in number of notifications everything else
- # in pixels. If the width is omitted but the height is given
- # ("-geometry x2"), the message window expands over the whole screen
- # (dmenu-like). If width is 0, the window expands to the longest
- # message displayed. A positive x is measured from the left, a
- # negative from the right side of the screen. Y is measured from
- # the top and down respectively.
- # The width can be negative. In this case the actual width is the
- # screen width minus the width defined in within the geometry option.
- geometry = "0x0-30+20"
-
- # Show how many messages are currently hidden (because of geometry).
- indicate_hidden = yes
-
- # Shrink window if it's smaller than the width. Will be ignored if
- # width is 0.
- shrink = no
-
- # The transparency of the window. Range: [0; 100].
- # This option will only work if a compositing window manager is
- # present (e.g. xcompmgr, compiz, etc.).
- transparency = 10
-
- # The height of the entire notification. If the height is smaller
- # than the font height and padding combined, it will be raised
- # to the font height and padding.
- notification_height = 0
-
- # Draw a line of "separator_height" pixel height between two
- # notifications.
- # Set to 0 to disable.
- separator_height = 2
-
- # Padding between text and separator.
- padding = 8
-
- # Horizontal padding.
- horizontal_padding = 8
-
- # Defines width in pixels of frame around the notification window.
- # Set to 0 to disable.
- frame_width = 3
-
- # Defines color of the frame around the notification window.
- frame_color = "#aaaaaa"
-
- # Define a color for the separator.
- # possible values are:
- # * auto: dunst tries to find a color fitting to the background;
- # * foreground: use the same color as the foreground;
- # * frame: use the same color as the frame;
- # * anything else will be interpreted as a X color.
- separator_color = frame
-
- # Sort messages by urgency.
- sort = yes
-
- # Don't remove messages, if the user is idle (no mouse or keyboard input)
- # for longer than idle_threshold seconds.
- # Set to 0 to disable.
- # A client can set the 'transient' hint to bypass this. See the rules
- # section for how to disable this if necessary
- idle_threshold = 120
-
- ### Text ###
-
- font = mononoki Nerd Font Mono 18
-
- # The spacing between lines. If the height is smaller than the
- # font height, it will get raised to the font height.
- line_height = 0
-
- # Possible values are:
- # full: Allow a small subset of html markup in notifications:
- # <b>bold</b>
- # <i>italic</i>
- # <s>strikethrough</s>
- # <u>underline</u>
- #
- # For a complete reference see
- # <http://developer.gnome.org/pango/stable/PangoMarkupFormat.html>.
- #
- # strip: This setting is provided for compatibility with some broken
- # clients that send markup even though it's not enabled on the
- # server. Dunst will try to strip the markup but the parsing is
- # simplistic so using this option outside of matching rules for
- # specific applications *IS GREATLY DISCOURAGED*.
- #
- # no: Disable markup parsing, incoming notifications will be treated as
- # plain text. Dunst will not advertise that it has the body-markup
- # capability if this is set as a global setting.
- #
- # It's important to note that markup inside the format option will be parsed
- # regardless of what this is set to.
- markup = full
-
- # The format of the message. Possible variables are:
- # %a appname
- # %s summary
- # %b body
- # %i iconname (including its path)
- # %I iconname (without its path)
- # %p progress value if set ([ 0%] to [100%]) or nothing
- # %n progress value if set without any extra characters
- # %% Literal %
- # Markup is allowed
- format = "<b>%s</b>\n%b"
-
- # Alignment of message text.
- # Possible values are "left", "center" and "right".
- alignment = left
-
- # Show age of message if message is older than show_age_threshold
- # seconds.
- # Set to -1 to disable.
- show_age_threshold = 60
-
- # Split notifications into multiple lines if they don't fit into
- # geometry.
- word_wrap = yes
-
- # When word_wrap is set to no, specify where to make an ellipsis in long lines.
- # Possible values are "start", "middle" and "end".
- ellipsize = middle
-
- # Ignore newlines '\n' in notifications.
- ignore_newline = no
-
- # Stack together notifications with the same content
- stack_duplicates = true
-
- # Hide the count of stacked notifications with the same content
- hide_duplicate_count = false
-
- # Display indicators for URLs (U) and actions (A).
- show_indicators = yes
-
- ### Icons ###
-
- # Align icons left/right/off
- icon_position = off
-
- # Scale larger icons down to this size, set to 0 to disable
- max_icon_size = 24
-
- # Paths to default icons.
- icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
-
- ### History ###
-
- # Should a notification popped up from history be sticky or timeout
- # as if it would normally do.
- sticky_history = yes
-
- # Maximum amount of notifications kept in history
- history_length = 20
-
- ### Misc/Advanced ###
-
- # dmenu path.
- dmenu = /usr/bin/dmenu -p dunst:
-
- # Browser for opening urls in context menu.
- browser = /usr/bin/firefox -new-tab
-
- # Always run rule-defined scripts, even if the notification is suppressed
- always_run_script = true
-
- # Define the title of the windows spawned by dunst
- title = Dunst
-
- # Define the class of the windows spawned by dunst
- class = Dunst
-
- # Print a notification on startup.
- # This is mainly for error detection, since dbus (re-)starts dunst
- # automatically after a crash.
- startup_notification = false
-
- # Manage dunst's desire for talking
- # Can be one of the following values:
- # crit: Critical features. Dunst aborts
- # warn: Only non-fatal warnings
- # mesg: Important Messages
- # info: all unimportant stuff
- # debug: all less than unimportant stuff
- verbosity = mesg
-
- # Define the corner radius of the notification window
- # in pixel size. If the radius is 0, you have no rounded
- # corners.
- # The radius will be automatically lowered if it exceeds half of the
- # notification height to avoid clipping text and/or icons.
- corner_radius = 0
-
- ### Legacy
-
- # Use the Xinerama extension instead of RandR for multi-monitor support.
- # This setting is provided for compatibility with older nVidia drivers that
- # do not support RandR and using it on systems that support RandR is highly
- # discouraged.
- #
- # By enabling this setting dunst will not be able to detect when a monitor
- # is connected or disconnected which might break follow mode if the screen
- # layout changes.
- force_xinerama = false
-
- ### mouse
-
- # Defines action of mouse event
- # Possible values are:
- # * none: Don't do anything.
- # * do_action: If the notification has exactly one action, or one is marked as default,
- # invoke it. If there are multiple and no default, open the context menu.
- # * close_current: Close current notification.
- # * close_all: Close all notifications.
- mouse_left_click = close_current
- mouse_middle_click = do_action
- mouse_right_click = close_all
-
-# Experimental features that may or may not work correctly. Do not expect them
-# to have a consistent behaviour across releases.
-[experimental]
- # Calculate the dpi to use on a per-monitor basis.
- # If this setting is enabled the Xft.dpi value will be ignored and instead
- # dunst will attempt to calculate an appropriate dpi value for each monitor
- # using the resolution and physical size. This might be useful in setups
- # where there are multiple screens with very different dpi values.
- per_monitor_dpi = false
-
-[shortcuts]
-
- # Shortcuts are specified as [modifier+][modifier+]...key
- # Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
- # "mod3" and "mod4" (windows-key).
- # Xev might be helpful to find names for keys.
-
- # Close notification.
- close = ctrl+space
-
- # Close all notifications.
- close_all = ctrl+shift+space
-
- # Redisplay last message(s).
- # On the US keyboard layout "grave" is normally above TAB and left
- # of "1". Make sure this key actually exists on your keyboard layout,
- # e.g. check output of 'xmodmap -pke'
- history = ctrl+grave
-
- # Context menu.
- context = ctrl+shift+period
-
-[urgency_low]
- # IMPORTANT: colors have to be defined in quotation marks.
- # Otherwise the "#" and following would be interpreted as a comment.
- background = "#222222"
- foreground = "#888888"
- timeout = 10
- # Icon for notifications with low urgency, uncomment to enable
- #icon = /path/to/icon
-
-[urgency_normal]
- background = "#285577"
- foreground = "#ffffff"
- timeout = 10
- # Icon for notifications with normal urgency, uncomment to enable
- #icon = /path/to/icon
-
-[urgency_critical]
- background = "#900000"
- foreground = "#ffffff"
- frame_color = "#ff0000"
- timeout = 0
- # Icon for notifications with critical urgency, uncomment to enable
- #icon = /path/to/icon
-
-# Every section that isn't one of the above is interpreted as a rules to
-# override settings for certain messages.
-#
-# Messages can be matched by
-# appname (discouraged, see desktop_entry)
-# body
-# category
-# desktop_entry
-# icon
-# match_transient
-# msg_urgency
-# stack_tag
-# summary
-#
-# and you can override the
-# background
-# foreground
-# format
-# frame_color
-# fullscreen
-# new_icon
-# set_stack_tag
-# set_transient
-# timeout
-# urgency
-#
-# Shell-like globbing will get expanded.
-#
-# Instead of the appname filter, it's recommended to use the desktop_entry filter.
-# GLib based applications export their desktop-entry name. In comparison to the appname,
-# the desktop-entry won't get localized.
-#
-# SCRIPTING
-# You can specify a script that gets run when the rule matches by
-# setting the "script" option.
-# The script will be called as follows:
-# script appname summary body icon urgency
-# where urgency can be "LOW", "NORMAL" or "CRITICAL".
-#
-# NOTE: if you don't want a notification to be displayed, set the format
-# to "".
-# NOTE: It might be helpful to run dunst -print in a terminal in order
-# to find fitting options for rules.
-
-# Disable the transient hint so that idle_threshold cannot be bypassed from the
-# client
-#[transient_disable]
-# match_transient = yes
-# set_transient = no
-#
-# Make the handling of transient notifications more strict by making them not
-# be placed in history.
-#[transient_history_ignore]
-# match_transient = yes
-# history_ignore = yes
-
-# fullscreen values
-# show: show the notifications, regardless if there is a fullscreen window opened
-# delay: displays the new notification, if there is no fullscreen window active
-# If the notification is already drawn, it won't get undrawn.
-# pushback: same as delay, but when switching into fullscreen, the notification will get
-# withdrawn from screen again and will get delayed like a new notification
-#[fullscreen_delay_everything]
-# fullscreen = delay
-#[fullscreen_show_critical]
-# msg_urgency = critical
-# fullscreen = show
-
-#[espeak]
-# summary = "*"
-# script = dunst_espeak.sh
-
-#[script-test]
-# summary = "*script*"
-# script = dunst_test.sh
-
-#[ignore]
-# # This notification will not be displayed
-# summary = "foobar"
-# format = ""
-
-#[history-ignore]
-# # This notification will not be saved in history
-# summary = "foobar"
-# history_ignore = yes
-
-#[skip-display]
-# # This notification will not be displayed, but will be included in the history
-# summary = "foobar"
-# skip_display = yes
-
-#[signed_on]
-# appname = Pidgin
-# summary = "*signed on*"
-# urgency = low
-#
-#[signed_off]
-# appname = Pidgin
-# summary = *signed off*
-# urgency = low
-#
-#[says]
-# appname = Pidgin
-# summary = *says*
-# urgency = critical
-#
-#[twitter]
-# appname = Pidgin
-# summary = *twitter.com*
-# urgency = normal
-#
-#[stack-volumes]
-# appname = "some_volume_notifiers"
-# set_stack_tag = "volume"
-
-[play_sound]
- summary = "*"
- script = notify-sound.sh
-
-# vim: ft=cfg
diff --git a/foot/foot.ini b/foot/foot.ini
deleted file mode 100644
index 11ebba6..0000000
--- a/foot/foot.ini
+++ /dev/null
@@ -1,199 +0,0 @@
-# -*- conf -*-
-
-# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
-# term=foot (or xterm-256color if built with -Dterminfo=disabled)
-# login-shell=no
-
-# app-id=foot
-# title=foot
-# locked-title=no
-
-font=mononoki Nerd Font Mono:size=10
-# font-bold=<bold variant of regular font>
-# font-italic=<italic variant of regular font>
-# font-bold-italic=<bold+italic variant of regular font>
-# font-size-adjustment=0.5
-# line-height=<font metrics>
-# letter-spacing=0
-# horizontal-letter-offset=0
-# vertical-letter-offset=0
-# underline-offset=<font metrics>
-# underline-thickness=<font underline thickness>
-# box-drawings-uses-font-glyphs=no
-# dpi-aware=auto
-
-# initial-window-size-pixels=700x500 # Or,
-# initial-window-size-chars=<COLSxROWS>
-# initial-window-mode=windowed
-# pad=0x0 # optionally append 'center'
-# resize-delay-ms=100
-
-# notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body}
-
-# bold-text-in-bright=no
-# word-delimiters=,│`|:"'()[]{}<>
-# selection-target=primary
-# workers=<number of logical CPUs>
-# utempter=/usr/lib/utempter/utempter
-
-[environment]
-# name=value
-
-[bell]
-# urgent=no
-# notify=no
-# command=
-# command-focused=no
-
-[scrollback]
-# lines=1000
-# multiplier=3.0
-# indicator-position=relative
-# indicator-format=""
-
-[url]
-launch=browser ${url}
-# label-letters=sadfjklewcmpgh
-# osc8-underline=url-mode
-# protocols=http, https, ftp, ftps, file, gemini, gopher
-# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
-
-[cursor]
-# style=block
-# color=<inverse foreground/background>
-# blink=no
-# beam-thickness=1.5
-# underline-thickness=<font underline thickness>
-
-[mouse]
-hide-when-typing=yes
-# alternate-scroll-mode=yes
-
-[colors]
-alpha=0.8
-background=000000
-foreground=c5c8c6
-
-## Normal/regular colors (color palette 0-7)
-regular0=1b1d1c # black
-regular1=89231d # red
-regular2=198844 # green
-regular3=ae7518 # yellow
-regular4=2b55b2 # blue
-regular5=784e93 # magenta
-regular6=2783a1 # cyan
-regular7=b4b7b5 # white
-
-## Bright colors (color palette 8-15)
-bright0=969896 # bright black
-bright1=cc342b # bright red
-bright2=4eec4e # bright green
-bright3=fba922 # bright yellow
-bright4=3971ed # bright blue
-bright5=a36ac7 # bright magenta
-bright6=39c1ed # bright cyan
-bright7=ffffff # bright white
-
-## dimmed colors (see foot.ini(5) man page)
-# dim0=<not set>
-# ...
-# dim7=<not-set>
-
-## The remaining 256-color palette
-# 16 = <256-color palette #16>
-# ...
-# 255 = <256-color palette #255>
-
-## Misc colors
-# selection-foreground=<inverse foreground/background>
-# selection-background=<inverse foreground/background>
-# jump-labels=<regular0> <regular3> # black-on-yellow
-# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
-# search-box-no-match=<regular0> <regular1> # black-on-red
-# search-box-match=<regular0> <regular3> # black-on-yellow
-# urls=<regular3>
-
-[csd]
-# preferred=server
-# size=26
-# font=<primary font>
-# color=<foreground color>
-# hide-when-typing=no
-# border-width=0
-# border-color=<csd.color>
-# button-width=26
-# button-color=<background color>
-# button-minimize-color=<regular4>
-# button-maximize-color=<regular2>
-# button-close-color=<regular1>
-
-[key-bindings]
-# scrollback-up-page=Shift+Page_Up
-# scrollback-up-half-page=none
-# scrollback-up-line=none
-# scrollback-down-page=Shift+Page_Down
-# scrollback-down-half-page=none
-# scrollback-down-line=none
-# clipboard-copy=Control+Shift+c XF86Copy
-# clipboard-paste=Control+Shift+v XF86Paste
-# primary-paste=Shift+Insert
-# search-start=Control+Shift+r
-# font-increase=Control+plus Control+equal Control+KP_Add
-# font-decrease=Control+minus Control+KP_Subtract
-# font-reset=Control+0 Control+KP_0
-# spawn-terminal=Control+Shift+n
-# minimize=none
-# maximize=none
-# fullscreen=none
-pipe-visible=[sh -c "xurls | xargs -r browser"] none
-pipe-scrollback=[sh -c "xurls | xargs -r browser"] Mod4+l
-pipe-selected=[xargs -r browser] none
-# show-urls-launch=Control+Shift+u
-# show-urls-copy=none
-# show-urls-persistent=none
-# prompt-prev=Control+Shift+z
-# prompt-next=Control+Shift+x
-# unicode-input=none
-# noop=none
-
-[search-bindings]
-# cancel=Control+g Control+c Escape
-# commit=Return
-# find-prev=Control+r
-# find-next=Control+s
-# cursor-left=Left Control+b
-# cursor-left-word=Control+Left Mod1+b
-# cursor-right=Right Control+f
-# cursor-right-word=Control+Right Mod1+f
-# cursor-home=Home Control+a
-# cursor-end=End Control+e
-# delete-prev=BackSpace
-# delete-prev-word=Mod1+BackSpace Control+BackSpace
-# delete-next=Delete
-# delete-next-word=Mod1+d Control+Delete
-# extend-to-word-boundary=Control+w
-# extend-to-next-whitespace=Control+Shift+w
-# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
-# primary-paste=Shift+Insert
-# unicode-input=none
-
-[url-bindings]
-# cancel=Control+g Control+c Control+d Escape
-# toggle-url-visible=t
-
-[text-bindings]
-# \x03=Mod4+c # Map Super+c -> Ctrl+c
-
-[mouse-bindings]
-# selection-override-modifiers=Shift
-# primary-paste=BTN_MIDDLE
-# select-begin=BTN_LEFT
-# select-begin-block=Control+BTN_LEFT
-# select-extend=BTN_RIGHT
-# select-extend-character-wise=Control+BTN_RIGHT
-# select-word=BTN_LEFT-2
-# select-word-whitespace=Control+BTN_LEFT-2
-# select-row=BTN_LEFT-3
-
-# vim: ft=dosini
-
diff --git a/hypr/gamemode.sh b/hypr/gamemode.sh
deleted file mode 100755
index a07ac4a..0000000
--- a/hypr/gamemode.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env sh
-HYPRGAMEMODE=$(hyprctl getoption animations:enabled | sed -n '2p' | awk '{print $2}')
-if [ $HYPRGAMEMODE = 1 ] ; then
- hyprctl --batch "\
- keyword animations:enabled 0;\
- keyword decoration:drop_shadow 0;\
- keyword decoration:blur 0;\
- keyword general:gaps_in 0;\
- keyword general:gaps_out 0;\
- keyword general:border_size 1;\
- keyword decoration:rounding 0"
- exit
-fi
-hyprctl reload
diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf
deleted file mode 100644
index 4cd8511..0000000
--- a/hypr/hyprland.conf
+++ /dev/null
@@ -1,336 +0,0 @@
-# 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
-
-#{{{ Autostart
-# Execute your favorite apps at launch
-# exec-once = waybar & hyprpaper & firefox
-exec-once = ~/.config/autostart.sh
-exec-once = /usr/lib/polkit-kde-authentication-agent-1
-exec-once = xdph
-#}}}
-
-# Source a file (multi-file configs)
-# source = ~/.config/hypr/myColors.conf
-
-#{{{ Input options
-# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
-input {
- kb_layout = us
- kb_variant =
- kb_model =
- kb_options = caps:escape
- kb_rules =
- numlock_by_default = true
- scroll_method = "2fg"
- follow_mouse = 1
- touchpad {
- natural_scroll = no
- }
- float_switch_override_focus = 0
- sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
-}
-#}}}
-
-#{{{ General options
-general {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
- gaps_in = 5
- gaps_out = 20
- border_size = 2
- #col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
- #col.inactive_border = rgba(595959aa)
- col.active_border = rgba(198844ee)
- col.inactive_border = rgba(1b1d1cee)
- layout = master
- no_cursor_warps = false
-}
-#}}}
-
-#{{{ Misc options
-misc {
- enable_swallow = true
- swallow_regex = ^(Alacritty)$
- vfr = false
-}
-#}}}
-
-#{{{ Decoration options
-decoration {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
- rounding = 10
- blur = yes
- blur_size = 3
- blur_passes = 1
- blur_new_optimizations = on
- blur_xray = yes
- drop_shadow = yes
- shadow_range = 4
- shadow_render_power = 3
- col.shadow = rgba(1a1a1aee)
-}
-#}}}
-
-#{{{ Animations options
-animations {
- enabled = no
- # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
- bezier = myBezier, 0.05, 0.9, 0.1, 1.05
- animation = windows, 1, 7, myBezier
- animation = windowsOut, 1, 7, default, popin 80%
- animation = border, 1, 10, default
- animation = borderangle, 1, 8, default
- animation = fade, 1, 7, default
- animation = workspaces, 1, 6, default
-}
-#}}}
-
-#{{{ Dwindle layout options
-dwindle {
- # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
- pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
- preserve_split = yes # you probably want this
- special_scale_factor = 0.55
-}
-#}}}
-
-#{{{ Master layout options
-master {
- special_scale_factor = 0.55
- mfact = 0.69
- # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
- new_is_master = false
- new_on_top = true
- no_gaps_when_only = true
- orientation = left
- inherit_fullscreen = true
-}
-#}}}
-
-#{{{ Gestures options
-gestures {
- # See https://wiki.hyprland.org/Configuring/Variables/ for more
- workspace_swipe = off
-}
-#}}}
-
-#{{{ Device options
-# Example per-device config
-# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
-device:epic mouse V1 {
- sensitivity = -0.5
-}
-#}}}
-
-#{{{ Windowrules
-# Example windowrule v1
-# windowrule = float, ^(kitty)$
-# Example windowrule v2
-# windowrulev2 = float, class:^(kitty)$, title:^(kitty)$
-# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
-windowrule = windowdance, title:^(Rhythm Doctor)$
-windowrule = fullscreen, ^(Xephyr)$
-windowrule = float, title:^(LibreWolf - Choose User Profile)$
-windowrulev2 = float, class:^(yabridge-host.exe.so)$, title:^(menu)$
-windowrulev2 = float,floating:0,title:^(menu*)
-windowrulev2 = forceinput,title:^(menu*)
-windowrulev2 = windowdance,title:^(menu*)
-#}}}
-
-#{{{ Mods
-# See https://wiki.hyprland.org/Configuring/Keywords/ for more
-$mainMod = ALT
-$secdMod = SUPER
-#}}}
-
-#{{{ Layout toggle bind
-# Layout toggle
-#bind = $mainMod $secdMod, A, exec, hypr-layout -t
-#}}}
-
-#{{{ Master layout binds
-# Master layout binds
-bind = $mainMod+SHIFT, Return, layoutmsg, swapwithmaster master #MASTER
-bind = $mainMod+SHIFT, J, layoutmsg, swapnext #MASTER
-bind = $mainMod+SHIFT, K, layoutmsg, swapprev #MASTER
-bind = $mainMod+SHIFT, H, layoutmsg, addmaster #MASTER
-bind = $mainMod+SHIFT, L, layoutmsg, removemaster #MASTER
-binde = $mainMod, J, layoutmsg, cyclenext #MASTER
-binde = $mainMod, K, layoutmsg, cycleprev #MASTER
-binde = $mainMod, H, splitratio, -0.01 #MASTER
-binde = $mainMod, L, splitratio, +0.01 #MASTER
-bind = $mainMod+SHIFT, O, splitratio, exact 0.5 #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,
-#bind = $mainMod CONTROL, I, lockgroups, lock
-#bind = $mainMod CONTROL, U, lockgroups, unlock
-#bind = $mainMod CONTROL, H, moveintogroup, r
-#bind = $mainMod CONTROL, L, moveintogroup, l
-#bind = $mainMod CONTROL, J, moveintogroup, d
-#bind = $mainMod CONTROL, K, moveintogroup, u
-#}}}
-
-#{{{ WC binds
-bind = $mainMod SHIFT, Q, killactive,
-bind = $mainMod SHIFT, E, exit,
-bind = $mainMod SHIFT, SPACE, togglefloating,
-bind = $mainMod $secdMod, F2, exec, ~/.config/hypr/gamemode.sh
-bind = $mainMod, F, fullscreen, 0
-bind = $mainMod, M, fullscreen, 1
-#}}}
-
-#{{{ Workspace binds
-# 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, 0, workspace, 10
-# 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 SHIFT, 0, movetoworkspacesilent, 10
-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 CONTROL SHIFT, 0, movetoworkspace, 10
-bind = $mainMod, mouse_down, workspace, e+1
-bind = $mainMod, mouse_up, workspace, e-1
-#}}}
-
-#{{{ Mouse binds
-# Move/resize windows with mainMod + LMB/RMB and dragging
-bindm = $mainMod, mouse:272, movewindow
-bindm = $mainMod, mouse:273, resizewindow
-#}}}
-
-#{{{ Resize submap binds
-bind = $mainMod $secdMod, R, submap, resize
-submap = resize
-binde = CONTROL, L, resizeactive, 10 0
-binde = CONTROL, H, resizeactive, -10 0
-binde = CONTROL, K, resizeactive, 0 -10
-binde = CONTROL, J, resizeactive, 0 10
-binde = , escape, submap, reset
-submap = reset
-#}}}
-
-#{{{ Menu bindings
-bind = $mainMod, R, exec, exec j4-dmenu-desktop --dmenu="bemenu -i -l 10 -p \"Run:\""
-bind = $mainMod, D, exec, exec bemenu-run -i -l 15 -p "Run:"
-bind = $mainMod $secdMod, Q, exec, qbc
-bind = $mainMod $secdMod, W, exec, lwc
-bind = $mainMod $secdMod, E, exec, mbc
-bind = $mainMod $secdMod, R, exec, ffc
-bind = $mainMod $secdMod, 1, exec, bm
-bind = $mainMod $secdMod, comma, exec, dmount -p
-bind = $mainMod $secdMod, period, exec, dmenuumount
-bind = $mainMod $secdMod CONTROL, U, exec, dmenuunicode
-bind = $mainMod $secdMod, U, exec, mprisctl
-bind = $mainMod $secdMod, P, exec, passmenu
-#}}}
-
-#{{{ Misc bindings
-bind = $mainMod, Return, exec, alacritty
-bind = $mainMod $secdMod, F, exec, alacritty -e lfrun
-bind = $mainMod, W, exec, t waybar
-bind = $mainMod, Q, exec, loginctl lock-session
-bind = $mainMod $secdMod CONTROL, Q, exec, systemctl suspend
-bind = $mainMod SHIFT, G, exec, get-app-id
-#bind = $mainMod CONTROL, R, exec, startx -- /usr/bin/Xephyr -screen 1920x1080 :1
-#}}}
-
-#{{{ Scratchpads
-bind = $mainMod CONTROL, Z, exec, [workspace special:sphtop;float;noanim] sphtop
-bind = $mainMod CONTROL, X, exec, [workspace special:spterm;float;noanim] spterm
-bind = $mainMod CONTROL, C, exec, [workspace special:sppmxr;float;noanim] sppmxr
-bind = $mainMod CONTROL, V, exec, [workspace special:spblue;float;noanim] spblue
-bind = $mainMod CONTROL, B, exec, [workspace special:spncmp;float;noanim] spncmp
-bind = $mainMod CONTROL, A, exec, [workspace special:spmutt;float;noanim] spmutt
-bind = $mainMod CONTROL, S, exec, [workspace special:spprof;float;noanim] spprof
-bind = $mainMod CONTROL, D, exec, [workspace special:spirss;float;noanim] spirss
-bind = $mainMod CONTROL, F, exec, [workspace special:sptodo;float;noanim] sptodo
-bind = $mainMod CONTROL, G, exec, [workspace special:sptrmc;float;noanim] sptrmc
-bind = $mainMod CONTROL, Q, exec, [workspace special:spqpwg;float;noanim] spqpwg
-#}}}
-
-#{{{ OBS bindings
-bind = $mainMod CONTROL, 1, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 2, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 3, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 4, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 5, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 6, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 7, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 8, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 9, pass, ^(com\.obsproject\.Studio)$
-bind = $mainMod CONTROL, 0, pass, ^(com\.obsproject\.Studio)$
-#}}}
-
-#{{{ Inert submap binds
-bind = $mainMod, B, submap, inert
-submap = inert
-bind = $mainMod, B, submap, reset
-submap = reset
-#}}}
-
-#{{{ Media bindings
-bindl = $secdMod, P, exec, playerctl play-pause
-bindel = , XF86AudioRaiseVolume, exec, volsv -i 5
-bindel = , XF86AudioLowerVolume, exec, volsv -d 5
-bind = , XF86AudioMute, exec, volsv -t
-bindl = , XF86AudioMicMute, exec, volsv -m
-bindel = , XF86MonBrightnessUp, exec, bl -i
-bindel = , XF86MonBrightnessDown, exec, bl -d
-bindl = $mainMod, XF86MonBrightnessUp, exec, bl -s 100
-bindl = $mainMod, XF86MonBrightnessDown, exec, bl -s 1
-bind = , Print, exec, scrshot
-#}}}
diff --git a/hypr/hyprpaper.conf b/hypr/hyprpaper.conf
deleted file mode 100644
index 65bc2e3..0000000
--- a/hypr/hyprpaper.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-preload = ~/background.jpg
-#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,~/background.jpg
-wallpaper = HDMI-A-1,~/background.jpg
-wallpaper = HDMI-A-2,~/background.jpg
-wallpaper = DP-1,~/background.jpg
-#if more than one monitor in use, can load a 2nd image
-#wallpaper = monitor2,~/background.jpg
-# .. more monitors
diff --git a/mpv/input.conf b/mpv/input.conf
deleted file mode 100644
index d28ab28..0000000
--- a/mpv/input.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-Ctrl+f script-binding quality_menu/video_formats_toggle
-Ctrl+a script-binding quality_menu/audio_formats_toggle
diff --git a/mpv/mpv.conf b/mpv/mpv.conf
deleted file mode 100644
index 5521474..0000000
--- a/mpv/mpv.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-save-position-on-quit
-osc=no
-ao=pipewire,pulse,jack
-vo=gpu
-audio-channels=2
diff --git a/mpv/script-opts/quality-menu.conf b/mpv/script-opts/quality-menu.conf
deleted file mode 100644
index 80ab845..0000000
--- a/mpv/script-opts/quality-menu.conf
+++ /dev/null
@@ -1,95 +0,0 @@
-# KEY BINDINGS
-
-# move the menu cursor up
-up_binding=UP WHEEL_UP
-# move the menu cursor down
-down_binding=DOWN WHEEL_DOWN
-# select menu entry
-select_binding=ENTER MBTN_LEFT
-# close menu
-close_menu_binding=ESC MBTN_RIGHT Ctrl+f Alt+f
-
-# youtube-dl version(could be youtube-dl or yt-dlp, or something else)
-ytdl_ver=yt-dlp
-
-# formatting / cursors
-selected_and_active=▶ -
-selected_and_inactive=● -
-unselected_and_active=▷ -
-unselected_and_inactive=○ -
-
-# font size scales by window, if false requires larger font and padding sizes
-scale_playlist_by_window=yes
-
-# playlist ass style overrides inside curly brackets, \keyvalue is one field, extra \ for escape in lua
-# example {\\fnUbuntu\\fs10\\b0\\bord1} equals: font=Ubuntu, size=10, bold=no, border=1
-# read http://docs.aegisub.org/3.2/ASS_Tags/ for reference of tags
-# undeclared tags will use default osd settings
-# these styles will be used for the whole playlist. More specific styling will need to be hacked in
-#
-# (a monospaced font is recommended but not required)
-style_ass_tags={\\fnmonospace\\fs10\\bord1}
-
-# paddings for top left corner
-text_padding_x=5
-text_padding_y=5
-
-# how many seconds until the quality menu times out
-# setting this to 0 deactivates the timeout
-menu_timeout=6
-
-# use youtube-dl to fetch a list of available formats (overrides quality_strings)
-fetch_formats=yes
-
-# list of ytdl-format strings to choose from
-quality_strings=[ {"4320p" : "bestvideo[height<=?4320p]+bestaudio/best"}, {"2160p" : "bestvideo[height<=?2160]+bestaudio/best"}, {"1440p" : "bestvideo[height<=?1440]+bestaudio/best"}, {"1080p" : "bestvideo[height<=?1080]+bestaudio/best"}, {"720p" : "bestvideo[height<=?720]+bestaudio/best"}, {"480p" : "bestvideo[height<=?480]+bestaudio/best"}, {"360p" : "bestvideo[height<=?360]+bestaudio/best"}, {"240p" : "bestvideo[height<=?240]+bestaudio/best"}, {"144p" : "bestvideo[height<=?144]+bestaudio/best"} ]
-
-# reset youtube-dl format to the original format string when changing files (e.g. going to the next playlist entry)
-# if file was opened previously, reset to previously selected format
-reset_format=yes
-
-# automatically fetch available formats when opening an url
-fetch_on_start=yes
-
-# show the video format menu after opening an url
-start_with_menu=no
-
-# include unknown formats in the list
-# Unfortunately choosing which formats are video or audio is not always perfect.
-# Set to true to make sure you don't miss any formats, but then the list
-# might also include formats that aren't actually video or audio.
-# Formats that are known to not be video or audio are still filtered out.
-include_unknown=no
-
-# hide columns that are identical for all formats
-hide_identical_columns=yes
-
-# which columns are shown in which order
-# comma separated list, prefix column with "-" to align left
-#
-# columns that might be useful are:
-# resolution, width, height, fps, dynamic_range, tbr, vbr, abr, asr,
-# filesize, filesize_approx, vcodec, acodec, ext, video_ext, audio_ext,
-# language, format, format_note, quality
-#
-# columns that are derived from the above, but with special treatment:
-# frame_rate, bitrate_total, bitrate_video, bitrate_audio,
-# codec_video, codec_audio, audio_sample_rate
-#
-# If those still aren't enough or you're just curious, run:
-# yt-dlp -j <url>
-# This outputs unformatted JSON.
-# Format it and look under "formats" to see what's available.
-#
-# Not all videos have all columns available.
-# Be careful, misspelled columns simply won't be displayed, there is no error.
-columns_video=-resolution,frame_rate,dynamic_range,language,bitrate_total,size,-codec_video,-codec_audio
-columns_audio=audio_sample_rate,bitrate_total,size,language,-codec_audio
-
-# columns used for sorting, see "columns_video" for available columns
-# comma separated list, prefix column with "-" to reverse sorting order
-# Leaving this empty keeps the order from yt-dlp/youtube-dl.
-# Be careful, misspelled columns won't result in an error,
-# but they might influence the result.
-sort_video=height,fps,tbr,size,format_id
-sort_audio=asr,tbr,size,format_id
diff --git a/mpv/script-opts/youtube-download.conf b/mpv/script-opts/youtube-download.conf
deleted file mode 100644
index 33630bf..0000000
--- a/mpv/script-opts/youtube-download.conf
+++ /dev/null
@@ -1,48 +0,0 @@
-# KEY BINDINGS
-download_video_binding=ctrl+d
-download_audio_binding=ctrl+a
-#download_subtitle_binding=ctrl+s
-#download_video_embed_subtitle_binding=ctrl+i
-#select_range_binding=ctrl+r
-
-# Specify audio format: "best", "aac","flac", "mp3", "m4a", "opus", "vorbis", or "wav"
-audio_format=best
-
-# Specify ffmpeg/avconv audio quality
-# insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K
-audio_quality=0
-
-# Same as youtube-dl --format FORMAT
-# see https://github.com/ytdl-org/youtube-dl/blob/master/README.md#format-selection
-# set to "current" to download the same quality that is currently playing
-video_format=best
-
-# Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm|mkv|avi)
-# recode_video="mp4"
-
-# Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames
-restrict_filenames=yes
-
-# Download the whole playlist (no) or only one video (yes)
-# Same as youtube-dl --no-playlist
-no_playlist=yes
-
-# Use an archive file, see youtube-dl --download-archive
-# You have these options:
-# * Set to empty string "" to not use an archive file
-# * Set an absolute path to use one archive for all downloads e.g. download_archive="/home/user/archive.txt"
-# * Set a relative path/only a filename to use one archive per directory e.g. download_archive="archive.txt"
-# * Use $PLAYLIST to create one archive per playlist e.g. download_archive="/home/user/archives/$PLAYLIST.txt"
-download_archive=~/Videos/archive/archive.txt
-
-# Filename or full path
-# Same youtube-dl -o
-# see https://github.com/ytdl-org/youtube-dl/blob/master/README.md#output-template
-filename=~/Videos/%(title)s.%(ext)s
-
-# Use a cookies file for youtube-dl
-# Same as youtube-dl --cookies
-#cookies=C:\Users\username\cookies.txt
-
-# Write download errors to a log file
-log_file=~/.config/mpv/download.log
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/mpv/scripts/quality-menu.lua b/mpv/scripts/quality-menu.lua
deleted file mode 100644
index c5da0d3..0000000
--- a/mpv/scripts/quality-menu.lua
+++ /dev/null
@@ -1,806 +0,0 @@
--- quality-menu.lua
---
--- Change the stream video and audio quality on the fly.
---
--- Usage:
--- add bindings to input.conf:
--- Ctrl+f script-message-to quality_menu video_formats_toggle
--- Alt+f script-message-to quality_menu audio_formats_toggle
---
--- Displays a menu that lets you switch to different ytdl-format settings while
--- you're in the middle of a video (just like you were using the web player).
-
-local mp = require 'mp'
-local utils = require 'mp.utils'
-local msg = require 'mp.msg'
-local assdraw = require 'mp.assdraw'
-local opt = require('mp.options')
-
-local opts = {
- --key bindings
- up_binding = "UP WHEEL_UP",
- down_binding = "DOWN WHEEL_DOWN",
- select_binding = "ENTER MBTN_LEFT",
- close_menu_binding = "ESC MBTN_RIGHT Ctrl+f Alt+f",
-
- --youtube-dl version(could be youtube-dl or yt-dlp, or something else)
- ytdl_ver = "yt-dlp",
-
- --formatting / cursors
- selected_and_active = "▶ - ",
- selected_and_inactive = "● - ",
- unselected_and_active = "▷ - ",
- unselected_and_inactive = "○ - ",
-
- --font size scales by window, if false requires larger font and padding sizes
- scale_playlist_by_window=true,
-
- --playlist ass style overrides inside curly brackets, \keyvalue is one field, extra \ for escape in lua
- --example {\\fnUbuntu\\fs10\\b0\\bord1} equals: font=Ubuntu, size=10, bold=no, border=1
- --read http://docs.aegisub.org/3.2/ASS_Tags/ for reference of tags
- --undeclared tags will use default osd settings
- --these styles will be used for the whole playlist. More specific styling will need to be hacked in
- --
- --(a monospaced font is recommended but not required)
- style_ass_tags = "{\\fnmonospace\\fs10\\bord1}",
-
- --paddings for top left corner
- text_padding_x = 5,
- text_padding_y = 5,
-
- --how many seconds until the quality menu times out
- --setting this to 0 deactivates the timeout
- menu_timeout = 6,
-
- --use youtube-dl to fetch a list of available formats (overrides quality_strings)
- fetch_formats = true,
-
- --default menu entries
- quality_strings=[[
- [
- {"4320p" : "bestvideo[height<=?4320p]+bestaudio/best"},
- {"2160p" : "bestvideo[height<=?2160]+bestaudio/best"},
- {"1440p" : "bestvideo[height<=?1440]+bestaudio/best"},
- {"1080p" : "bestvideo[height<=?1080]+bestaudio/best"},
- {"720p" : "bestvideo[height<=?720]+bestaudio/best"},
- {"480p" : "bestvideo[height<=?480]+bestaudio/best"},
- {"360p" : "bestvideo[height<=?360]+bestaudio/best"},
- {"240p" : "bestvideo[height<=?240]+bestaudio/best"},
- {"144p" : "bestvideo[height<=?144]+bestaudio/best"}
- ]
- ]],
-
- --reset ytdl-format to the original format string when changing files (e.g. going to the next playlist entry)
- --if file was opened previously, reset to previously selected format
- reset_format = true,
-
- --automatically fetch available formats when opening an url
- fetch_on_start = true,
-
- --show the video format menu after opening an url
- start_with_menu = false,
-
- --include unknown formats in the list
- --Unfortunately choosing which formats are video or audio is not always perfect.
- --Set to true to make sure you don't miss any formats, but then the list
- --might also include formats that aren't actually video or audio.
- --Formats that are known to not be video or audio are still filtered out.
- include_unknown = false,
-
- --hide columns that are identical for all formats
- hide_identical_columns = true,
-
- --which columns are shown in which order
- --comma separated list, prefix column with "-" to align left
- --
- --columns that might be useful are:
- --resolution, width, height, fps, dynamic_range, tbr, vbr, abr, asr,
- --filesize, filesize_approx, vcodec, acodec, ext, video_ext, audio_ext,
- --language, format, format_note, quality
- --
- --columns that are derived from the above, but with special treatment:
- --frame_rate, bitrate_total, bitrate_video, bitrate_audio,
- --codec_video, codec_audio, audio_sample_rate
- --
- --If those still aren't enough or you're just curious, run:
- --yt-dlp -j <url>
- --This outputs unformatted JSON.
- --Format it and look under "formats" to see what's available.
- --
- --Not all videos have all columns available.
- --Be careful, misspelled columns simply won't be displayed, there is no error.
- columns_video = '-resolution,frame_rate,dynamic_range,language,bitrate_total,size,-codec_video,-codec_audio',
- columns_audio = 'audio_sample_rate,bitrate_total,size,language,-codec_audio',
-
- --columns used for sorting, see "columns_video" for available columns
- --comma separated list, prefix column with "-" to reverse sorting order
- --Leaving this empty keeps the order from yt-dlp/youtube-dl.
- --Be careful, misspelled columns won't result in an error,
- --but they might influence the result.
- sort_video = 'height,fps,tbr,size,format_id',
- sort_audio = 'asr,tbr,size,format_id',
-}
-opt.read_options(opts, "quality-menu")
-opts.quality_strings = utils.parse_json(opts.quality_strings)
-
--- special thanks to reload.lua (https://github.com/4e6/mpv-reload/)
-local function reload_resume()
- local playlist_pos = mp.get_property_number("playlist-pos")
- local reload_duration = mp.get_property_native("duration")
- local time_pos = mp.get_property("time-pos")
-
- mp.set_property_number("playlist-pos", playlist_pos)
-
- -- Tries to determine live stream vs. pre-recorded VOD. VOD has non-zero
- -- duration property. When reloading VOD, to keep the current time position
- -- we should provide offset from the start. Stream doesn't have fixed start.
- -- Decent choice would be to reload stream from it's current 'live' position.
- -- That's the reason we don't pass the offset when reloading streams.
- if reload_duration and reload_duration > 0 then
- local function seeker()
- mp.commandv("seek", time_pos, "absolute")
- mp.unregister_event(seeker)
- end
- mp.register_event("file-loaded", seeker)
- end
-end
-
-local ytdl = {
- path = opts.ytdl_ver,
- searched = false,
- blacklisted = {}
-}
-
-local function process_json(json)
- local function is_video(format)
- -- "none" means it is not a video
- -- nil means it is unknown
- return (opts.include_unknown or format.vcodec) and format.vcodec ~= "none"
- end
-
- local function is_audio(format)
- return (opts.include_unknown or format.acodec) and format.acodec ~= "none"
- end
-
- local vfmt = nil
- local afmt = nil
- local requested_formats = json["requested_formats"] or json["requested_downloads"]
- for _, format in ipairs(requested_formats) do
- if is_video(format) then
- vfmt = format["format_id"]
- elseif is_audio(format) then
- afmt = format["format_id"]
- end
- end
-
- local video_formats = {}
- local audio_formats = {}
- local all_formats = {}
- for i = #json.formats, 1, -1 do
- local format = json.formats[i]
- if is_video(format) then
- video_formats[#video_formats+1] = format
- all_formats[#all_formats+1] = format
- elseif is_audio(format) then
- audio_formats[#audio_formats+1] = format
- all_formats[#all_formats+1] = format
- end
- end
-
- local function populate_special_fields(format)
- format.size = format.filesize or format.filesize_approx
- format.frame_rate = format.fps
- format.bitrate_total = format.tbr
- format.bitrate_video = format.vbr
- format.bitrate_audio = format.abr
- format.codec_video = format.vcodec
- format.codec_audio = format.acodec
- format.audio_sample_rate = format.asr
- end
-
- for _,format in ipairs(all_formats) do
- populate_special_fields(format)
- end
-
- local function strip_minus(list)
- local stripped_list = {}
- local had_minus = {}
- for i, val in ipairs(list) do
- if string.sub(val, 1, 1) == "-" then
- val = string.sub(val, 2)
- had_minus[val] = true
- end
- stripped_list[i] = val
- end
- return stripped_list, had_minus
- end
-
- local function string_split (inputstr, sep)
- if sep == nil then
- sep = "%s"
- end
- local t={}
- for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
- table.insert(t, str)
- end
- return t
- end
-
- local sort_video, reverse_video = strip_minus(string_split(opts.sort_video, ','))
- local sort_audio, reverse_audio = strip_minus(string_split(opts.sort_audio, ','))
-
- local function comp(properties, reverse)
- return function (a, b)
- for _,prop in ipairs(properties) do
- local a_val = a[prop]
- local b_val = b[prop]
- if a_val and b_val and type(a_val) ~= 'table' and a_val ~= b_val then
- if reverse[prop] then
- return a_val < b_val
- else
- return a_val > b_val
- end
- end
- end
- return false
- end
- end
-
- if #sort_video > 0 then
- table.sort(video_formats, comp(sort_video, reverse_video))
- end
- if #sort_audio > 0 then
- table.sort(audio_formats, comp(sort_audio, reverse_audio))
- end
-
- local function scale_filesize(size)
- if size == nil then
- return ""
- end
- size = tonumber(size)
-
- local counter = 0
- while size > 1024 do
- size = size / 1024
- counter = counter+1
- end
-
- if counter >= 3 then return string.format("%.1fGiB", size)
- elseif counter >= 2 then return string.format("%.1fMiB", size)
- elseif counter >= 1 then return string.format("%.1fKiB", size)
- else return string.format("%.1fB ", size)
- end
- end
-
- local function scale_bitrate(br)
- if br == nil then
- return ""
- end
- br = tonumber(br)
-
- local counter = 0
- while br > 1000 do
- br = br / 1000
- counter = counter+1
- end
-
- if counter >= 2 then return string.format("%.1fGbps", br)
- elseif counter >= 1 then return string.format("%.1fMbps", br)
- else return string.format("%.1fKbps", br)
- end
- end
-
- local function format_special_fields(format)
- local size_prefix = not format.filesize and format.filesize_approx and "~" or ""
- format.size = (size_prefix) .. scale_filesize(format.size)
- format.frame_rate = format.fps and format.fps.."fps" or ""
- format.bitrate_total = scale_bitrate(format.tbr)
- format.bitrate_video = scale_bitrate(format.vbr)
- format.bitrate_audio = scale_bitrate(format.abr)
- format.codec_video = format.vcodec == nil and "unknown" or format.vcodec == "none" and "" or format.vcodec
- format.codec_audio = format.acodec == nil and "unknown" or format.acodec == "none" and "" or format.acodec
- format.audio_sample_rate = format.asr and tostring(format.asr) .. "Hz" or ""
- end
-
- for _,format in ipairs(all_formats) do
- format_special_fields(format)
- end
-
- local function format_table(formats, columns)
- local function calc_shown_columns()
- local display_col = {}
- local column_widths = {}
- local column_values = {}
- local columns, column_align_left = strip_minus(columns)
-
- for _,format in pairs(formats) do
- for col, prop in ipairs(columns) do
- local label = tostring(format[prop] or "")
- format[prop] = label
-
- if not column_widths[col] or column_widths[col] < label:len() then
- column_widths[col] = label:len()
- end
-
- column_values[col] = column_values[col] or label
- display_col[col] = display_col[col] or (column_values[col] ~= label)
- end
- end
-
- local show_columns={}
- for i, width in ipairs(column_widths) do
- if width > 0 and not opts.hide_identical_columns or display_col[i] then
- local prop = columns[i]
- show_columns[#show_columns+1] = {
- prop=prop,
- width=width,
- align_left=column_align_left[prop]
- }
- end
- end
- return show_columns
- end
-
- local show_columns = calc_shown_columns()
-
- local spacing = 2
- local res = {}
- for _,f in ipairs(formats) do
- local row = ''
- for i,column in ipairs(show_columns) do
- -- lua errors out with width > 99 ("invalid conversion specification")
- local width = math.min(column.width * (column.align_left and -1 or 1), 99)
- row = row .. (i > 1 and string.format('%' .. spacing .. 's', '') or '')
- .. string.format('%' .. width .. 's', f[column.prop] or "")
- end
- res[#res+1] = {label=row, format=f.format_id}
- end
- return res
- end
-
- local columns_video = string_split(opts.columns_video, ',')
- local columns_audio = string_split(opts.columns_audio, ',')
- local vres = format_table(video_formats, columns_video)
- local ares = format_table(audio_formats, columns_audio)
- return vres, ares , vfmt, afmt
-end
-
-local function get_url()
- local path = mp.get_property("path")
- path = string.gsub(path, "ytdl://", "") -- Strip possible ytdl:// prefix.
-
- local function is_url(s)
- -- adapted the regex from https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url
- return nil ~= string.match(path, "^[%w]-://[-a-zA-Z0-9@:%._\\+~#=]+%.[a-zA-Z0-9()][a-zA-Z0-9()]?[a-zA-Z0-9()]?[a-zA-Z0-9()]?[a-zA-Z0-9()]?[a-zA-Z0-9()]?[-a-zA-Z0-9()@:%_\\+.~#?&/=]*")
- end
-
- return is_url(path) and path or nil
-end
-
-local uosc = false
-local url_data={}
-local function process_json_string(url, json)
- local json, err = utils.parse_json(json)
-
- if (json == nil) then
- mp.osd_message("fetching formats failed...", 2)
- msg.error("failed to parse JSON data: " .. err)
- return
- end
-
- if json.formats == nil then
- return
- end
-
- local vres, ares , vfmt, afmt = process_json(json)
- url_data[url] = {voptions=vres, aoptions=ares, vfmt=vfmt, afmt=afmt}
- if uosc and get_url() == url then
- mp.commandv('script-message-to', 'uosc', 'set', 'vformats', #vres)
- mp.commandv('script-message-to', 'uosc', 'set', 'aformats', #ares)
- end
- return vres, ares , vfmt, afmt
-end
-
-local function download_formats(url)
-
- mp.osd_message("fetching available formats with youtube-dl...", 60)
-
- if not (ytdl.searched) then
- local ytdl_mcd = mp.find_config_file(opts.ytdl_ver)
- if not (ytdl_mcd == nil) then
- msg.verbose("found youtube-dl at: " .. ytdl_mcd)
- ytdl.path = ytdl_mcd
- end
- ytdl.searched = true
- end
-
- local function exec(args)
- local res, err = mp.command_native({name = "subprocess", args = args, capture_stdout = true, capture_stderr = true})
- return res.status, res.stdout, res.stderr
- end
-
- local ytdl_format = mp.get_property("ytdl-format")
- local command = nil
- if (ytdl_format == nil or ytdl_format == "") then
- command = {ytdl.path, "--no-warnings", "--no-playlist", "-J", url}
- else
- command = {ytdl.path, "--no-warnings", "--no-playlist", "-J", "-f", ytdl_format, url}
- end
-
- msg.verbose("calling youtube-dl with command: " .. table.concat(command, " "))
-
- local es, stdout, stderr = exec(command)
-
- if (es < 0) or (stdout == nil) or (stdout == "") then
- mp.osd_message("fetching formats failed...", 2)
- msg.error("failed to get format list: " .. es)
- msg.error("stderr: " .. stderr)
- return
- end
-
- msg.verbose("youtube-dl succeeded!")
- mp.osd_message("", 0)
-
- local vres, ares , vfmt, afmt = process_json_string(url, stdout)
- return vres, ares , vfmt, afmt
-end
-
-local function send_formats_to(type, url, script_name, options, format_id)
- mp.commandv('script-message-to', script_name, type .. '_formats', url, utils.format_json(options or {}), format_id or '')
-end
-
-local queue_callback_video = {}
-local queue_callback_audio = {}
-local function get_formats()
-
- local url = get_url()
- if url == nil then
- return
- end
-
- if url_data[url] then
- local data = url_data[url]
- return data.voptions, data.aoptions, data.vfmt, data.afmt, url
- end
-
- if opts.fetch_formats == false then
- local vres = {}
- for i,v in ipairs(opts.quality_strings) do
- for k,v2 in pairs(v) do
- vres[i] = {label = k, format=v2}
- end
- end
- url_data[url] = {voptions=vres, aoptions={}, vfmt=nil, afmt=nil}
- return vres, {}, nil, nil, url
- end
-
- local vres, ares , vfmt, afmt = download_formats(url)
-
- for _, script_name in ipairs(queue_callback_video[url] or {}) do
- send_formats_to('video', url, script_name, vres, vfmt)
- end
- for _, script_name in ipairs(queue_callback_audio[url] or {}) do
- send_formats_to('audio', url, script_name, ares, afmt)
- end
-
- queue_callback_video[url] = nil
- queue_callback_audio[url] = nil
- return vres, ares , vfmt, afmt, url
-end
-
-local function format_string(vfmt, afmt)
- if vfmt and afmt then
- return vfmt.."+"..afmt
- elseif vfmt then
- return vfmt
- elseif afmt then
- return afmt
- else
- return ""
- end
-end
-
-local function set_format(url, vfmt, afmt)
- if (url_data[url].vfmt ~= vfmt or url_data[url].afmt ~= afmt) then
- url_data[url].afmt = afmt
- url_data[url].vfmt = vfmt
- if url == mp.get_property("path") then
- mp.set_property("ytdl-format", format_string(vfmt, afmt))
- reload_resume()
- end
- end
-end
-
-local destroyer = nil
-local function show_menu(isvideo)
-
- if destroyer then
- destroyer()
- end
-
- local voptions, aoptions, vfmt, afmt, url = get_formats()
-
- local options
- local fmt
- if isvideo then
- options = voptions
- fmt = vfmt
- else
- options = aoptions
- fmt = afmt
- end
-
- if options == nil then
- if uosc then
- if isvideo then
- mp.commandv('script-binding', 'uosc/video')
- else
- mp.commandv('script-binding', 'uosc/audio')
- end
- end
-
- return
- end
-
- msg.verbose("current ytdl-format: "..format_string(vfmt, afmt))
-
- local active = 0
- local selected = 1
- --set the cursor to the current format
- if fmt then
- for i,v in ipairs(options) do
- if v.format == fmt then
- active = i
- selected = active
- break
- end
- end
- else
- active = #options + 1
- selected = active
- end
-
- if uosc then
- local menu = {
- title = isvideo and 'Video Formats' or 'Audio Formats',
- items = {},
- type = (isvideo and 'video' or 'audio') .. '_formats',
- }
- for i, option in ipairs(options) do
- menu.items[i] = {
- title = option.label,
- active = i == active,
- value = {
- 'script-message-to',
- 'quality_menu',
- (isvideo and 'video' or 'audio') .. '-format-set',
- url,
- option.format}
- }
- end
- menu.items[#menu.items + 1] = {
- title = 'None',
- value = {
- 'script-message-to',
- 'quality_menu',
- (isvideo and 'video' or 'audio') .. '-format-set',
- url}
- }
- local json = utils.format_json(menu)
- mp.commandv('script-message-to', 'uosc', 'open-menu', json)
- return
- end
-
- local function choose_prefix(i)
- if i == selected and i == active then return opts.selected_and_active
- elseif i == selected then return opts.selected_and_inactive end
-
- if i ~= selected and i == active then return opts.unselected_and_active
- elseif i ~= selected then return opts.unselected_and_inactive end
- return "> " --shouldn't get here.
- end
-
- local function draw_menu()
- local ass = assdraw.ass_new()
-
- ass:pos(opts.text_padding_x, opts.text_padding_y)
- ass:append(opts.style_ass_tags)
-
- if #options > 0 then
- for i,v in ipairs(options) do
- ass:append(choose_prefix(i)..v.label.."\\N")
- end
- ass:append(choose_prefix(#options+1).."None")
- else
- ass:append("no formats found")
- end
-
- local w, h = mp.get_osd_size()
- if opts.scale_playlist_by_window then w,h = 0, 0 end
- mp.set_osd_ass(w, h, ass.text)
- end
-
- local num_options = #options + 1
- local timeout = nil
-
- local function selected_move(amt)
- selected = selected + amt
- if selected < 1 then selected = num_options
- elseif selected > num_options then selected = 1 end
- if timeout then
- timeout:kill()
- timeout:resume()
- end
- draw_menu()
- end
-
- local function bind_keys(keys, name, func, opts)
- if not keys then
- mp.add_forced_key_binding(keys, name, func, opts)
- return
- end
- local i = 1
- for key in keys:gmatch("[^%s]+") do
- local prefix = i == 1 and '' or i
- mp.add_forced_key_binding(key, name..prefix, func, opts)
- i = i + 1
- end
- end
-
- local function unbind_keys(keys, name)
- if not keys then
- mp.remove_key_binding(name)
- return
- end
- local i = 1
- for key in keys:gmatch("[^%s]+") do
- local prefix = i == 1 and '' or i
- mp.remove_key_binding(name..prefix)
- i = i + 1
- end
- end
-
- local function destroy()
- if timeout then
- timeout:kill()
- end
- mp.set_osd_ass(0,0,"")
- unbind_keys(opts.up_binding, "move_up")
- unbind_keys(opts.down_binding, "move_down")
- unbind_keys(opts.select_binding, "select")
- unbind_keys(opts.close_menu_binding, "close")
- destroyer = nil
- end
-
- if opts.menu_timeout > 0 then
- timeout = mp.add_periodic_timer(opts.menu_timeout, destroy)
- end
- destroyer = destroy
-
- bind_keys(opts.up_binding, "move_up", function() selected_move(-1) end, {repeatable=true})
- bind_keys(opts.down_binding, "move_down", function() selected_move(1) end, {repeatable=true})
- if #options > 0 then
- bind_keys(opts.select_binding, "select", function()
- destroy()
- if selected == active then return end
-
- fmt = options[selected] and options[selected].format or nil
- if isvideo then
- vfmt = fmt
- else
- afmt = fmt
- end
- set_format(url, vfmt, afmt)
- end)
- end
- bind_keys(opts.close_menu_binding, "close", destroy) --close menu using ESC
- mp.osd_message("", 0)
- draw_menu()
-end
-
-local ui_callback = {}
-
-local function video_formats_toggle()
- if #ui_callback > 0 then
- for _, name in ipairs(ui_callback) do
- mp.commandv('script-message-to', name, 'video-formats-menu')
- end
- else
- show_menu(true)
- end
-end
-
-local function audio_formats_toggle()
- if #ui_callback > 0 then
- for _, name in ipairs(ui_callback) do
- mp.commandv('script-message-to', name, 'audio-formats-menu')
- end
- else
- show_menu(false)
- end
-end
-
--- keybind to launch menu
-mp.add_key_binding(nil, "video_formats_toggle", video_formats_toggle)
-mp.add_key_binding(nil, "audio_formats_toggle", audio_formats_toggle)
-mp.add_key_binding(nil, "reload", reload_resume)
-
-local original_format = mp.get_property("ytdl-format")
-local path = nil
-local function file_start()
- local new_path = get_url()
- if not new_path then return end
-
- local data = url_data[new_path]
-
- if uosc then
- if data then
- mp.commandv('script-message-to', 'uosc', 'set', 'vformats', #data.voptions)
- mp.commandv('script-message-to', 'uosc', 'set', 'aformats', #data.aoptions)
- else
- mp.commandv('script-message-to', 'uosc', 'set', 'vformats', 0)
- mp.commandv('script-message-to', 'uosc', 'set', 'aformats', 0)
- end
- end
-
- if opts.reset_format and path and new_path ~= path then
- if data then
- msg.verbose("setting previously set format")
- mp.set_property("ytdl-format", format_string(data.vfmt, data.afmt))
- else
- msg.verbose("setting original format")
- mp.set_property("ytdl-format", original_format)
- end
- end
- if opts.start_with_menu and new_path ~= path then
- video_formats_toggle()
- elseif opts.fetch_on_start and not data then
- download_formats(new_path)
- end
- path = new_path
-end
-mp.register_event("start-file", file_start)
-
-mp.register_script_message('video-formats-get', function(url, script_name)
- local data = url_data[url]
- if data then
- send_formats_to('video', url, script_name, data.voptions, data.vfmt)
- else
- local queue = queue_callback_video[url] or {}
- queue[#queue + 1] = script_name
- queue_callback_video[url] = queue
- get_formats()
- end
-end)
-
-mp.register_script_message('audio-formats-get', function(url, script_name)
- local data = url_data[url]
- if data then
- send_formats_to('audio', url, script_name, data.aoptions, data.afmt)
- else
- local queue = queue_callback_audio[url] or {}
- queue[#queue + 1] = script_name
- queue_callback_audio[url] = queue
- get_formats()
- end
-end)
-
-mp.register_script_message('video-format-set', function(url, format_id)
- set_format(url, format_id, url_data[url].afmt)
-end)
-
-mp.register_script_message('audio-format-set', function(url, format_id)
- set_format(url, url_data[url].vfmt, format_id)
-end)
-
-mp.register_script_message('register-ui', function(script_name)
- ui_callback[#ui_callback + 1] = script_name
-end)
-
--- check if uosc is running
-mp.register_script_message('uosc-version', function(version)
- version = tonumber((version:gsub('%.', '')))
----@diagnostic disable-next-line: cast-local-type
- uosc = version and version >= 400
-end)
-mp.commandv('script-message-to', 'uosc', 'get-version', mp.get_script_name()) \ No newline at end of file
diff --git a/mpv/scripts/youtube-download.lua b/mpv/scripts/youtube-download.lua
deleted file mode 100644
index 3050b39..0000000
--- a/mpv/scripts/youtube-download.lua
+++ /dev/null
@@ -1,758 +0,0 @@
--- youtube-download.lua
---
--- Download video/audio from youtube via youtube-dl and ffmpeg/avconv
--- This is forked/based on https://github.com/jgreco/mpv-youtube-quality
---
--- Video download bound to ctrl-d by default.
--- Audio download bound to ctrl-a by default.
-
--- Requires youtube-dl in PATH for video download
--- Requires ffmpeg or avconv in PATH for audio download
-
-local mp = require 'mp'
-local utils = require 'mp.utils'
-local msg = require 'mp.msg'
-
-local opts = {
- -- Key bindings
- -- Set to empty string "" to disable
- download_video_binding = "ctrl+d",
- download_audio_binding = "ctrl+a",
- download_subtitle_binding = "ctrl+s",
- download_video_embed_subtitle_binding = "ctrl+i",
- select_range_binding = "ctrl+r",
-
- -- Specify audio format: "best", "aac","flac", "mp3", "m4a", "opus", "vorbis", or "wav"
- audio_format = "mp3",
-
- -- Specify ffmpeg/avconv audio quality
- -- insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K
- audio_quality = "0",
-
- -- Same as youtube-dl --format FORMAT
- -- see https://github.com/ytdl-org/youtube-dl/blob/master/README.md#format-selection
- -- set to "current" to download the same quality that is currently playing
- video_format = "",
-
- -- Encode the video to another format if necessary: "mp4", "flv", "ogg", "webm", "mkv", "avi"
- recode_video = "",
-
- -- Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames
- restrict_filenames = true,
-
- -- Download the whole playlist (false) or only one video (true)
- -- Same as youtube-dl --no-playlist
- no_playlist = true,
-
- -- Use an archive file, see youtube-dl --download-archive
- -- You have these options:
- -- * Set to empty string "" to not use an archive file
- -- * Set an absolute path to use one archive for all downloads e.g. download_archive="/home/user/archive.txt"
- -- * Set a relative path/only a filename to use one archive per directory e.g. download_archive="archive.txt"
- -- * Use $PLAYLIST to create one archive per playlist e.g. download_archive="/home/user/archives/$PLAYLIST.txt"
- download_archive = "",
-
- -- Use a cookies file for youtube-dl
- -- Same as youtube-dl --cookies
- -- On Windows you need to use a double blackslash or a single fordwardslash
- -- For example "C:\\Users\\Username\\cookies.txt"
- -- Or "C:/Users/Username/cookies.txt"
- cookies = "",
-
- -- Filename or full path
- -- Same as youtube-dl -o FILETEMPLATE
- -- see https://github.com/ytdl-org/youtube-dl/blob/master/README.md#output-template
- -- A relative path or a file name is relative to the path mpv was launched from
- -- On Windows you need to use a double blackslash or a single fordwardslash
- -- For example "C:\\Users\\Username\\Downloads\\%(title)s.%(ext)s"
- -- Or "C:/Users/Username/Downloads/%(title)s.%(ext)s"
- filename = "%(title)s.%(ext)s",
-
- -- Subtitle language
- -- Same as youtube-dl --sub-lang en
- sub_lang = "en",
-
- -- Subtitle format
- -- Same as youtube-dl --sub-format best
- sub_format = "best",
-
- -- Log file for download errors
- log_file = "",
-
-}
-
---Read configuration file
-(require 'mp.options').read_options(opts, "youtube-download")
-
---Read command line arguments
-local ytdl_raw_options = mp.get_property("ytdl-raw-options")
-if ytdl_raw_options ~= nil and ytdl_raw_options:find("cookies=") ~= nil then
- local cookie_file = ytdl_raw_options:match("cookies=([^,]+)")
- if cookie_file ~= nil then
- opts.cookies = cookie_file
- end
-end
-
-local function exec(args, capture_stdout, capture_stderr)
- local ret = mp.command_native({
- name = "subprocess",
- playback_only = false,
- capture_stdout = capture_stdout,
- capture_stderr = capture_stderr,
- args = args,
- })
- return ret.status, ret.stdout, ret.stderr, ret
-end
-
-local function trim(str)
- return str:gsub("^%s+", ""):gsub("%s+$", "")
-end
-
-local function not_empty(str)
- if str == nil or str == "" then
- return false
- end
- return trim(str) ~= ""
-end
-
-local function path_separator()
- return package.config:sub(1,1)
-end
-
-local function path_join(...)
- return table.concat({...}, path_separator())
-end
-
-local function get_current_format()
- -- get the current youtube-dl format or the default value
- local ytdl_format = mp.get_property("options/ytdl-format")
- if not_empty(ytdl_format) then
- return ytdl_format
- end
- ytdl_format = mp.get_property("ytdl-format")
- if not_empty(ytdl_format) then
- return ytdl_format
- end
- return "bestvideo+bestaudio/best"
-end
-
-local DOWNLOAD = {
- VIDEO=1,
- AUDIO=2,
- SUBTITLE=3,
- VIDEO_EMBED_SUBTITLE=4
-}
-local select_range_mode = 0
-local start_time_seconds = nil
-local start_time_formated = nil
-local end_time_seconds = nil
-local end_time_formated = nil
-
-local is_downloading = false
-
-local function disable_select_range()
- -- Disable range mode
- select_range_mode = 0
- -- Remove the arrow key key bindings
- mp.remove_key_binding("select-range-set-up")
- mp.remove_key_binding("select-range-set-down")
- mp.remove_key_binding("select-range-set-left")
- mp.remove_key_binding("select-range-set-right")
-end
-
-
-local function download(download_type)
- local start_time = os.date("%c")
- if is_downloading then
- return
- end
- is_downloading = true
-
- local ass0 = mp.get_property("osd-ass-cc/0")
- local ass1 = mp.get_property("osd-ass-cc/1")
- local url = mp.get_property("path")
-
- url = string.gsub(url, "ytdl://", "") -- Strip possible ytdl:// prefix.
-
- if string.find(url, "//youtu.be/") == nil
- and string.find(url, "//ww.youtu.be/") == nil
- and string.find(url, "//youtube.com/") == nil
- and string.find(url, "//www.youtube.com/") == nil
- then
- mp.osd_message("Not a youtube URL: " .. tostring(url), 10)
- is_downloading = false
- return
- end
-
- local list_match = url:match("list=(%w+)")
- local download_archive = opts.download_archive
- if list_match ~= nil and opts.download_archive ~= nil and opts.download_archive:find("$PLAYLIST", 1, true) then
- download_archive = opts.download_archive:gsub("$PLAYLIST", list_match)
- end
-
- if download_type == DOWNLOAD.AUDIO then
- mp.osd_message("Audio download started", 2)
- elseif download_type == DOWNLOAD.SUBTITLE then
- mp.osd_message("Subtitle download started", 2)
- elseif download_type == DOWNLOAD.VIDEO_EMBED_SUBTITLE then
- mp.osd_message("Video w/ subtitle download started", 2)
- else
- mp.osd_message("Video download started", 2)
- end
-
- -- Compose command line arguments
- local command = {}
-
- local range_mode_file_name = nil
- local range_mode_subtitle_file_name = nil
- local start_time_offset = 0
-
- if select_range_mode == 0 or (select_range_mode > 0 and (download_type == DOWNLOAD.AUDIO or download_type == DOWNLOAD.SUBTITLE)) then
- table.insert(command, "youtube-dl")
- table.insert(command, "--no-overwrites")
- if opts.restrict_filenames then
- table.insert(command, "--restrict-filenames")
- end
- if not_empty(opts.filename) then
- table.insert(command, "-o")
- table.insert(command, opts.filename)
- end
- if opts.no_playlist then
- table.insert(command, "--no-playlist")
- end
- if not_empty(download_archive) then
- table.insert(command, "--download-archive")
- table.insert(command, download_archive)
- end
-
- if download_type == DOWNLOAD.SUBTITLE then
- table.insert(command, "--sub-lang")
- table.insert(command, opts.sub_lang)
- table.insert(command, "--write-sub")
- table.insert(command, "--skip-download")
- if not_empty(opts.sub_format) then
- table.insert(command, "--sub-format")
- table.insert(command, opts.sub_format)
- end
- if select_range_mode > 0 then
- mp.osd_message("Range mode is not available for subtitle-only download", 10)
- is_downloading = false
- return
- end
- elseif download_type == DOWNLOAD.AUDIO then
- table.insert(command, "--extract-audio")
- if not_empty(opts.audio_format) then
- table.insert(command, "--audio-format")
- table.insert(command, opts.audio_format)
- end
- if not_empty(opts.audio_quality) then
- table.insert(command, "--audio-quality")
- table.insert(command, opts.audio_quality)
- end
- if select_range_mode > 0 then
- local start_time_str = tostring(start_time_seconds)
- local end_time_str = tostring(end_time_seconds)
- table.insert(command, "--external-downloader")
- table.insert(command, "ffmpeg")
- table.insert(command, "--external-downloader-args")
- table.insert(command, "-loglevel warning -nostats -hide_banner -ss ".. start_time_str .. " -to " .. end_time_str .. " -avoid_negative_ts make_zero")
- end
- else --DOWNLOAD.VIDEO or DOWNLOAD.VIDEO_EMBED_SUBTITLE
- if download_type == DOWNLOAD.VIDEO_EMBED_SUBTITLE then
- table.insert(command, "--all-subs")
- table.insert(command, "--write-sub")
- table.insert(command, "--embed-subs")
- if not_empty(opts.sub_format) then
- table.insert(command, "--sub-format")
- table.insert(command, opts.sub_format)
- end
- end
- if not_empty(opts.video_format) then
- table.insert(command, "--format")
- if opts.video_format == "current" then
- table.insert(command, get_current_format())
- else
- table.insert(command, opts.video_format)
- end
- end
- if not_empty(opts.recode_video) then
- table.insert(command, "--recode-video")
- table.insert(command, opts.recode_video)
- end
- end
- if not_empty(opts.cookies) then
- table.insert(command, "--cookies")
- table.insert(command, opts.cookies)
- end
- table.insert(command, url)
-
- elseif select_range_mode > 0 and
- (download_type == DOWNLOAD.VIDEO or download_type == DOWNLOAD.VIDEO_EMBED_SUBTITLE) then
-
- -- Show download indicator
- mp.set_osd_ass(0, 0, "{\\an9}{\\fs12}⌛🔗")
-
- start_time_seconds = math.floor(start_time_seconds)
- end_time_seconds = math.ceil(end_time_seconds)
-
- local start_time_str = tostring(start_time_seconds)
- local end_time_str = tostring(end_time_seconds)
-
- -- Add time to the file name of the video
- local filename_format
- -- Insert start time/end time
- if not_empty(opts.filename) then
- if opts.filename:find("%%%(start_time%)") ~= nil then
- -- Found "start_time" -> replace it
- filename_format = tostring(opts.filename:
- gsub("%%%(start_time%)[^diouxXeEfFgGcrs]*[diouxXeEfFgGcrs]", start_time_str):
- gsub("%%%(end_time%)[^diouxXeEfFgGcrs]*[diouxXeEfFgGcrs]", end_time_str))
- else
- local ext_pattern = "%(ext)s"
- if opts.filename:sub(-#ext_pattern) == ext_pattern then
- -- Insert before ext
- filename_format = opts.filename:sub(1, #(opts.filename) - #ext_pattern) ..
- start_time_str .. "-" ..
- end_time_str .. ".%(ext)s"
- else
- -- append at end
- filename_format = opts.filename .. start_time_str .. "-" .. end_time_str
- end
- end
- else
- -- default youtube-dl filename pattern
- filename_format = "%(title)s-%(id)s." .. start_time_str .. "-" .. end_time_str .. ".%(ext)s"
- end
-
- -- Find a suitable format
- local format = "bestvideo[ext*=mp4]+bestaudio/best[ext*=mp4]/best"
- local requested_format = opts.video_format
- if requested_format == "current" then
- requested_format = get_current_format()
- end
- if requested_format == nil or requested_format == "" then
- format = format
- elseif requested_format == "best" then
- -- "best" works, because its a single file stream
- format = "best"
- elseif requested_format:find("mp4") ~= nil then
- -- probably a mp4 format, so use it
- format = requested_format
- else
- -- custom format, no "mp4" found -> use default
- msg.warn("Select range mode requires a .mp4 format or \"best\", found " ..
- requested_format .. "\n(" .. opts.video_format .. ")" ..
- "\nUsing default format instead: " .. format)
- end
-
- -- Get the download url of the video file
- -- e.g.: youtube-dl -g -f bestvideo[ext*=mp4]+bestaudio/best[ext*=mp4]/best -s --get-filename https://www.youtube.com/watch?v=abcdefg
- command = {"youtube-dl"}
- if opts.restrict_filenames then
- table.insert(command, "--restrict-filenames")
- end
- if not_empty(opts.cookies) then
- table.insert(command, "--cookies")
- table.insert(command, opts.cookies)
- end
- table.insert(command, "-g")
- table.insert(command, "--no-playlist")
- table.insert(command, "-f")
- table.insert(command, format)
- table.insert(command, "-o")
- table.insert(command, filename_format)
- table.insert(command, "-s")
- table.insert(command, "--get-filename")
- table.insert(command, url)
-
- msg.debug("info exec: " .. table.concat(command, " "))
- local info_status, info_stdout, info_stderr = exec(command, true, true)
- if info_status ~= 0 then
- mp.set_osd_ass(0, 0, "")
- mp.osd_message("Could not retieve download stream url: status=" .. tostring(info_status) .. "\n" ..
- ass0 .. "{\\fs8} " .. info_stdout:gsub("\r", "") .."\n" .. info_stderr:gsub("\r", "") .. ass1, 20)
- msg.debug("info_stdout:\n" .. info_stdout)
- msg.debug("info_stderr:\n" .. info_stderr)
- mp.set_osd_ass(0, 0, "")
- is_downloading = false
- return
- end
-
- -- Split result into lines
- local info_lines = {}
- local last_index = 0
- local info_lines_N = 0
- while true do
- local start_i, end_i = info_stdout:find("\n", last_index, true)
- if start_i then
- local line = tostring(trim(info_stdout:sub(last_index, start_i)))
- if line ~= "" then
- table.insert(info_lines, line)
- info_lines_N = info_lines_N + 1
- end
- else
- break
- end
- last_index = end_i + 1
- end
-
- if info_lines_N < 2 then
- mp.set_osd_ass(0, 0, "")
- mp.osd_message("Could not extract download stream urls and filename from output\n" ..
- ass0 .. "{\\fs8} " .. info_stdout:gsub("\r", "") .."\n" .. info_stderr:gsub("\r", "") .. ass1, 20)
- msg.debug("info_stdout:\n" .. info_stdout)
- msg.debug("info_stderr:\n" .. info_stderr)
- mp.set_osd_ass(0, 0, "")
- is_downloading = false
- return
- end
- range_mode_file_name = info_lines[info_lines_N]
- table.remove(info_lines)
-
- if download_type == DOWNLOAD.VIDEO_EMBED_SUBTITLE then
- -- youtube-dl --write-sub --skip-download https://www.youtube.com/watch?v=abcdefg -o "temp.%(ext)s"
- command = {"youtube-dl", "--write-sub", "--skip-download", "--sub-lang", opts.sub_lang}
- if not_empty(opts.sub_format) then
- table.insert(command, "--sub-format")
- table.insert(command, opts.sub_format)
- end
- local randomName = "tmp_" .. tostring(math.random())
- table.insert(command, "-o")
- table.insert(command, randomName .. ".%(ext)s")
- table.insert(command, url)
-
- -- Start subtitle download
- msg.debug("exec: " .. table.concat(command, " "))
- local subtitle_status, subtitle_stdout, subtitle_stderr = exec(command, true, true)
- if subtitle_status == 0 and subtitle_stdout:find(randomName) then
- local i, j = subtitle_stdout:find(randomName .. "[^\n]+")
- range_mode_subtitle_file_name = trim(subtitle_stdout:sub(i, j))
- if range_mode_subtitle_file_name ~= "" then
- if range_mode_file_name:sub(-4) ~= ".mkv" then
- -- Only mkv supports all kinds of subtitle formats
- range_mode_file_name = range_mode_file_name:sub(1,-4) .. "mkv"
- end
- end
- else
- mp.osd_message("Could not find a suitable subtitle")
- msg.debug("subtitle_stdout:\n" .. subtitle_stdout)
- msg.debug("subtitle_stderr:\n" .. subtitle_stderr)
- end
-
- end
-
- -- Download earlier (cut off afterwards)
- start_time_offset = math.min(15, start_time_seconds)
- start_time_seconds = start_time_seconds - start_time_offset
-
- start_time_str = tostring(start_time_seconds)
- end_time_str = tostring(end_time_seconds)
-
- command = {"ffmpeg", "-loglevel", "warning", "-nostats", "-hide_banner", "-y"}
- for _, value in ipairs(info_lines) do
- table.insert(command, "-ss")
- table.insert(command, start_time_str)
- table.insert(command, "-to")
- table.insert(command, end_time_str)
- table.insert(command, "-i")
- table.insert(command, value)
- end
- if not_empty(range_mode_subtitle_file_name) then
- table.insert(command, "-ss")
- table.insert(command, start_time_str)
- table.insert(command, "-i")
- table.insert(command, range_mode_subtitle_file_name)
- table.insert(command, "-to") -- To must be after input for subtitle
- table.insert(command, end_time_str)
- end
- table.insert(command, "-c")
- table.insert(command, "copy")
- table.insert(command, range_mode_file_name)
-
- disable_select_range()
- end
-
- -- Show download indicator
- mp.set_osd_ass(0, 0, "{\\an9}{\\fs12}⌛💾")
-
- -- Start download
- msg.debug("exec: " .. table.concat(command, " "))
- local status, stdout, stderr = exec(command, true, true)
-
- if status == 0 and range_mode_file_name ~= nil then
- mp.set_osd_ass(0, 0, "{\\an9}{\\fs12}⌛🔨")
-
- -- Cut first few seconds to fix errors
- local start_time_offset_str = tostring(start_time_offset)
- if #start_time_offset_str == 1 then
- start_time_offset_str = "0" .. start_time_offset_str
- end
- local max_length = end_time_seconds - start_time_seconds + start_time_offset + 12
- local tmp_file_name = range_mode_file_name .. ".tmp." .. range_mode_file_name:sub(-3)
- command = {"ffmpeg", "-loglevel", "warning", "-nostats", "-hide_banner", "-y",
- "-i", range_mode_file_name, "-ss", "00:00:" .. start_time_offset_str,
- "-c", "copy", "-avoid_negative_ts", "make_zero", "-t", tostring(max_length), tmp_file_name}
- msg.debug("mux exec: " .. table.concat(command, " "))
- local muxstatus, muxstdout, muxstderr = exec(command, true, true)
- if muxstatus ~= 0 and not_empty(muxstderr) then
- msg.warn("Remux log:" .. tostring(muxstdout))
- msg.warn("Remux errorlog:" .. tostring(muxstderr))
- end
- if muxstatus == 0 then
- os.remove(range_mode_file_name)
- os.rename(tmp_file_name, range_mode_file_name)
- if not_empty(range_mode_subtitle_file_name) then
- os.remove(range_mode_subtitle_file_name)
- end
- end
-
- end
-
-
- is_downloading = false
-
- -- Hide download indicator
- mp.set_osd_ass(0, 0, "")
-
- local wrote_error_log = false
- if stderr ~= nil and not_empty(opts.log_file) and not_empty(stderr) then
- -- Write stderr to log file
- local title = mp.get_property("media-title")
- local file = io.open (opts.log_file , "a+")
- file:write("\n[")
- file:write(start_time)
- file:write("] ")
- file:write(url)
- file:write("\n[\"")
- file:write(title)
- file:write("\"]\n")
- file:write(stderr)
- file:close()
- wrote_error_log = true
- end
-
- if (status ~= 0) then
- mp.osd_message("download failed:\n" .. tostring(stderr), 10)
- msg.error("URL: " .. tostring(url))
- msg.error("Return status code: " .. tostring(status))
- msg.debug(tostring(stderr))
- msg.debug(tostring(stdout))
- return
- end
-
- if string.find(stdout, "has already been recorded in archive") ~=nil then
- mp.osd_message("Has already been recorded in archive", 5)
- return
- end
-
- -- Retrieve the file name
- local filename = nil
- if range_mode_file_name == nil and stdout then
- local i, j, last_i, start_index = 0
- while i ~= nil do
- last_i, start_index = i, j
- i, j = stdout:find ("Destination: ",j, true)
- end
-
- if last_i ~= nil then
- local end_index = stdout:find ("\n", start_index, true)
- if end_index ~= nil and start_index ~= nil then
- filename = trim(stdout:sub(start_index, end_index))
- end
- end
- elseif not_empty(range_mode_file_name) then
- filename = range_mode_file_name
- end
-
- local osd_text = "Download succeeded\n"
- local osd_time = 5
- -- Find filename or directory
- if filename then
- local filepath
- local basepath
- if filename:find("/") == nil and filename:find("\\") == nil then
- basepath = utils.getcwd()
- filepath = path_join(utils.getcwd(), filename)
- else
- basepath = ""
- filepath = filename
- end
-
- if filepath:len() < 100 then
- osd_text = osd_text .. ass0 .. "{\\fs12} " .. filepath .. " {\\fs20}" .. ass1
- elseif basepath == "" then
- osd_text = osd_text .. ass0 .. "{\\fs8} " .. filepath .. " {\\fs20}" .. ass1
- else
- osd_text = osd_text .. ass0 .. "{\\fs11} " .. basepath .. "\n" .. filename .. " {\\fs20}" .. ass1
- end
- if wrote_error_log then
- -- Write filename and end time to log file
- local file = io.open (opts.log_file , "a+")
- file:write("[" .. filepath .. "]\n")
- file:write(os.date("[end %c]\n"))
- file:close()
- end
- else
- if wrote_error_log then
- -- Write directory and end time to log file
- local file = io.open (opts.log_file , "a+")
- file:write("[" .. utils.getcwd() .. "]\n")
- file:write(os.date("[end %c]\n"))
- file:close()
- end
- osd_text = osd_text .. utils.getcwd()
- end
-
- -- Show warnings
- if not_empty(stderr) then
- msg.warn("Errorlog:" .. tostring(stderr))
- if stderr:find("incompatible for merge") == nil then
- local i = stderr:find("Input #")
- if i ~= nil then
- stderr = stderr:sub(i)
- end
- osd_text = osd_text .. "\n" .. ass0 .. "{\\fs8} " .. stderr:gsub("\r", "") .. ass1
- osd_time = osd_time + 5
- end
- end
-
- mp.osd_message(osd_text, osd_time)
-end
-
-local function select_range_show()
- local status
- if select_range_mode > 0 then
- if select_range_mode == 2 then
- status = "Download range: Fine tune\n← → start time\n↓ ↑ end time\n" ..
- tostring(opts.select_range_binding) .. " next mode"
- elseif select_range_mode == 1 then
- status = "Download range: Select interval\n← start here\n→ end here\n↓from beginning\n↑til end\n" ..
- tostring(opts.select_range_binding) .. " next mode"
- end
- mp.osd_message("Start: " .. start_time_formated .. "\nEnd: " .. end_time_formated .. "\n" .. status, 30)
- else
- status = "Download range: Disabled (download full length)"
- mp.osd_message(status, 3)
- end
-end
-
-local function select_range_set_left()
- if select_range_mode == 2 then
- start_time_seconds = math.max(0, start_time_seconds - 1)
- if start_time_seconds < 86400 then
- start_time_formated = os.date("!%H:%M:%S", start_time_seconds)
- else
- start_time_formated = tostring(start_time_seconds) .. "s"
- end
- elseif select_range_mode == 1 then
- start_time_seconds = mp.get_property_number("time-pos")
- start_time_formated = mp.command_native({"expand-text","${time-pos}"})
- end
- select_range_show()
-end
-
-local function select_range_set_start()
- if select_range_mode == 2 then
- end_time_seconds = math.max(1, end_time_seconds - 1)
- if end_time_seconds < 86400 then
- end_time_formated = os.date("!%H:%M:%S", end_time_seconds)
- else
- end_time_formated = tostring(end_time_seconds) .. "s"
- end
- elseif select_range_mode == 1 then
- start_time_seconds = 0
- start_time_formated = "00:00:00"
- end
- select_range_show()
-end
-
-local function select_range_set_end()
- if select_range_mode == 2 then
- end_time_seconds = math.min(mp.get_property_number("duration"), end_time_seconds + 1)
- if end_time_seconds < 86400 then
- end_time_formated = os.date("!%H:%M:%S", end_time_seconds)
- else
- end_time_formated = tostring(end_time_seconds) .. "s"
- end
- elseif select_range_mode == 1 then
- end_time_seconds = mp.get_property_number("duration")
- end_time_formated = mp.command_native({"expand-text","${duration}"})
- end
- select_range_show()
-end
-
-local function select_range_set_right()
- if select_range_mode == 2 then
- start_time_seconds = math.min(mp.get_property_number("duration") - 1, start_time_seconds + 1)
- if start_time_seconds < 86400 then
- start_time_formated = os.date("!%H:%M:%S", start_time_seconds)
- else
- start_time_formated = tostring(start_time_seconds) .. "s"
- end
- elseif select_range_mode == 1 then
- end_time_seconds = mp.get_property_number("time-pos")
- end_time_formated = mp.command_native({"expand-text","${time-pos}"})
- end
- select_range_show()
-end
-
-
-local function select_range()
- -- Cycle through modes
- if select_range_mode == 2 then
- -- Disable range mode
- disable_select_range()
- elseif select_range_mode == 1 then
- -- Switch to "fine tune" mode
- select_range_mode = 2
- else
- select_range_mode = 1
- -- Add keybinds for arrow keys
- mp.add_key_binding("up", "select-range-set-up", select_range_set_end)
- mp.add_key_binding("down", "select-range-set-down", select_range_set_start)
- mp.add_key_binding("left", "select-range-set-left", select_range_set_left)
- mp.add_key_binding("right", "select-range-set-right", select_range_set_right)
-
- -- Defaults
- if start_time_seconds == nil then
- start_time_seconds = mp.get_property_number("time-pos")
- start_time_formated = mp.command_native({"expand-text","${time-pos}"})
- end_time_seconds = mp.get_property_number("duration")
- end_time_formated = mp.command_native({"expand-text","${duration}"})
- end
- end
- select_range_show()
-end
-
-local function download_video()
- return download(DOWNLOAD.VIDEO)
-end
-
-local function download_audio()
- return download(DOWNLOAD.AUDIO)
-end
-
-local function download_subtitle()
- return download(DOWNLOAD.SUBTITLE)
-end
-
-local function download_embed_subtitle()
- return download(DOWNLOAD.VIDEO_EMBED_SUBTITLE)
-end
-
--- keybind
-if not_empty(opts.download_video_binding) then
- mp.add_key_binding(opts.download_video_binding, "download-video", download_video)
-end
-if not_empty(opts.download_audio_binding) then
- mp.add_key_binding(opts.download_audio_binding, "download-audio", download_audio)
-end
-if not_empty(opts.download_subtitle_binding) then
- mp.add_key_binding(opts.download_subtitle_binding, "download-subtitle", download_subtitle)
-end
-if not_empty(opts.download_video_embed_subtitle_binding) then
- mp.add_key_binding(opts.download_video_embed_subtitle_binding, "download-embed-subtitle", download_embed_subtitle)
-end
-if not_empty(opts.select_range_binding) then
- mp.add_key_binding(opts.select_range_binding, "select-range-start", select_range)
-end
diff --git a/nwg-bar/bar.json b/nwg-bar/bar.json
deleted file mode 100644
index 82bc6ed..0000000
--- a/nwg-bar/bar.json
+++ /dev/null
@@ -1,22 +0,0 @@
-[
- {
- "label": "Lock",
- "exec": "loginctl lock-session self",
- "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": "loginctl reboot",
- "icon": "/usr/share/nwg-bar/images/system-reboot.svg"
- },
- {
- "label": "Shutdown",
- "exec": "loginctl -i poweroff",
- "icon": "/usr/share/nwg-bar/images/system-shutdown.svg"
- }
-]
diff --git a/open/openrc b/open/openrc
deleted file mode 100644
index 2c5ebd0..0000000
--- a/open/openrc
+++ /dev/null
@@ -1,15 +0,0 @@
-[full]
-browser: ^https?://, www\., \.com, \.co\.uk, \.net
-#in_terminal yplay.pl: ^(http://)?(www\.)?youtube\.com/watch\?v=
-in_terminal $VISUAL: \.[^/]*rc$
-
-[suffix]
-soffice: odp, pptx?, docx?
-neovide: txt, c, cpp, nfo, pl, py, s, conf, md, yaml, toml, lua, h, lisp
-st -e less: log
-mpv: mp3, wav, mp4, wmv
-zathura: pdf, epub, ps
-browser: html?
-soffice: odt
-
-#xterm -e wget: http://.*.(tar|gz|bz2) - not called due to hash ordering
diff --git a/pipewire/filters-available/toharmantarget/akg271mkii.conf b/pipewire/filters-available/toharmantarget/akg271mkii.conf
deleted file mode 100644
index 883e52d..0000000
--- a/pipewire/filters-available/toharmantarget/akg271mkii.conf
+++ /dev/null
@@ -1,98 +0,0 @@
-# 6 band sink equalizer
-#
-# Copy this file into a conf.d/ directory such as
-# ~/.config/pipewire/filter-chain.conf.d/
-#
-context.modules = [
- { name = libpipewire-module-filter-chain
- args = {
- node.description = "AKG k271 mkii Match"
- media.name = "AKG k271 mkii Match"
- filter.graph = {
- nodes = [
- {
- type = builtin
- name = eq_band_1
- label = bq_lowshelf
- control = { "Freq" = 62.0 "Q" = 0.9 "Gain" = 7.0 }
- }
- {
- type = builtin
- name = eq_band_2
- label = bq_peaking
- control = { "Freq" = 140.0 "Q" = 2.5 "Gain" = 3.0 }
- }
- {
- type = builtin
- name = eq_band_3
- label = bq_highshelf
- control = { "Freq" = 200.0 "Q" = 1.2 "Gain" = -4.7 }
- }
- {
- type = builtin
- name = eq_band_4
- label = bq_peaking
- control = { "Freq" = 660.0 "Q" = 2.8 "Gain" = -6.6 }
- }
- {
- type = builtin
- name = eq_band_5
- label = bq_peaking
- control = { "Freq" = 745.0 "Q" = 2.5 "Gain" = 5.5 }
- }
- {
- type = builtin
- name = eq_band_6
- label = bq_peaking
- control = { "Freq" = 1820.0 "Q" = 1.5 "Gain" = -4.4 }
- }
- {
- type = builtin
- name = eq_band_7
- label = bq_peaking
- control = { "Freq" = 3000.0 "Q" = 1.8 "Gain" = 5.4 }
- }
- {
- type = builtin
- name = eq_band_8
- label = bq_peaking
- control = { "Freq" = 3200.0 "Q" = 5.0 "Gain" = -2.3 }
- }
- {
- type = builtin
- name = eq_band_9
- label = bq_peaking
- control = { "Freq" = 4800.0 "Q" = 2.0 "Gain" = 3.6 }
- }
- {
- type = builtin
- name = eq_band_10
- label = bq_highshelf
- control = { "Freq" = 6500.0 "Q" = 2.5 "Gain" = -1.5 }
- }
- ]
- links = [
- { output = "eq_band_1:Out" input = "eq_band_2:In" }
- { output = "eq_band_2:Out" input = "eq_band_3:In" }
- { output = "eq_band_3:Out" input = "eq_band_4:In" }
- { output = "eq_band_4:Out" input = "eq_band_5:In" }
- { output = "eq_band_5:Out" input = "eq_band_6:In" }
- { output = "eq_band_6:Out" input = "eq_band_7:In" }
- { output = "eq_band_7:Out" input = "eq_band_8:In" }
- { output = "eq_band_8:Out" input = "eq_band_9:In" }
- { output = "eq_band_9:Out" input = "eq_band_10:In" }
- ]
- }
- audio.channels = 2
- audio.position = [ FL FR ]
- capture.props = {
- node.name = "effect_input.k271ii"
- media.class = Audio/Sink
- }
- playback.props = {
- node.name = "effect_output.k271ii"
- node.passive = true
- }
- }
- }
-]
diff --git a/pipewire/filters-available/toharmantarget/atm50x.conf b/pipewire/filters-available/toharmantarget/atm50x.conf
deleted file mode 100644
index 7dced89..0000000
--- a/pipewire/filters-available/toharmantarget/atm50x.conf
+++ /dev/null
@@ -1,98 +0,0 @@
-# 6 band sink equalizer
-#
-# Copy this file into a conf.d/ directory such as
-# ~/.config/pipewire/filter-chain.conf.d/
-#
-context.modules = [
- { name = libpipewire-module-filter-chain
- args = {
- node.description = "AT m50x Match"
- media.name = "AT m50x Match"
- filter.graph = {
- nodes = [
- {
- type = builtin
- name = eq_band_1
- label = bq_peaking
- control = { "Freq" = 40.0 "Q" = 0.5 "Gain" = -4.9 }
- }
- {
- type = builtin
- name = eq_band_2
- label = bq_lowshelf
- control = { "Freq" = 105.0 "Q" = 0.71 "Gain" = 5.5 }
- }
- {
- type = builtin
- name = eq_band_3
- label = bq_peaking
- control = { "Freq" = 150.0 "Q" = 0.8 "Gain" = -4.0 }
- }
- {
- type = builtin
- name = eq_band_4
- label = bq_peaking
- control = { "Freq" = 335.0 "Q" = 1.3 "Gain" = 5.7 }
- }
- {
- type = builtin
- name = eq_band_5
- label = bq_peaking
- control = { "Freq" = 1550 "Q" = 1.2 "Gain" = 1.5 }
- }
- {
- type = builtin
- name = eq_band_6
- label = bq_peaking
- control = { "Freq" = 2600.0 "Q" = 1.6 "Gain" = -1.1 }
- }
- {
- type = builtin
- name = eq_band_7
- label = bq_peaking
- control = { "Freq" = 4350.0 "Q" = 4.0 "Gain" = -5.0 }
- }
- {
- type = builtin
- name = eq_band_8
- label = bq_peaking
- control = { "Freq" = 5300.0 "Q" = 1.0 "Gain" = 5.5 }
- }
- {
- type = builtin
- name = eq_band_9
- label = bq_peaking
- control = { "Freq" = 5700.0 "Q" = 4.0 "Gain" = -3.5 }
- }
- {
- type = builtin
- name = eq_band_10
- label = bq_highshelf
- control = { "Freq" = 10000.0 "Q" = 0.71 "Gain" = -1.0 }
- }
- ]
- links = [
- { output = "eq_band_1:Out" input = "eq_band_2:In" }
- { output = "eq_band_2:Out" input = "eq_band_3:In" }
- { output = "eq_band_3:Out" input = "eq_band_4:In" }
- { output = "eq_band_4:Out" input = "eq_band_5:In" }
- { output = "eq_band_5:Out" input = "eq_band_6:In" }
- { output = "eq_band_6:Out" input = "eq_band_7:In" }
- { output = "eq_band_7:Out" input = "eq_band_8:In" }
- { output = "eq_band_8:Out" input = "eq_band_9:In" }
- { output = "eq_band_9:Out" input = "eq_band_10:In" }
- ]
- }
- audio.channels = 2
- audio.position = [ FL FR ]
- capture.props = {
- node.name = "effect_input.atm50x"
- media.class = Audio/Sink
- }
- playback.props = {
- node.name = "effect_output.atm50x"
- node.passive = true
- }
- }
- }
-]
diff --git a/pipewire/filters-available/toharmantarget/jbudsair.conf b/pipewire/filters-available/toharmantarget/jbudsair.conf
deleted file mode 100644
index 9b21ab5..0000000
--- a/pipewire/filters-available/toharmantarget/jbudsair.conf
+++ /dev/null
@@ -1,98 +0,0 @@
-# 6 band sink equalizer
-#
-# Copy this file into a conf.d/ directory such as
-# ~/.config/pipewire/filter-chain.conf.d/
-#
-context.modules = [
- { name = libpipewire-module-filter-chain
- args = {
- node.description = "JBuds Air Match"
- media.name = "JBuds Air Match"
- filter.graph = {
- nodes = [
- {
- type = builtin
- name = eq_band_1
- label = bq_lowshelf
- control = { "Freq" = 105.0 "Q" = 0.7 "Gain" = -6.4 }
- }
- {
- type = builtin
- name = eq_band_2
- label = bq_peaking
- control = { "Freq" = 183.0 "Q" = 1.19 "Gain" = -4.7 }
- }
- {
- type = builtin
- name = eq_band_3
- label = bq_peaking
- control = { "Freq" = 769.0 "Q" = 0.65 "Gain" = 2.0 }
- }
- {
- type = builtin
- name = eq_band_4
- label = bq_peaking
- control = { "Freq" = 2724.0 "Q" = 1.58 "Gain" = 5.7 }
- }
- {
- type = builtin
- name = eq_band_5
- label = bq_peaking
- control = { "Freq" = 3849.0 "Q" = 3.9 "Gain" = -3.7 }
- }
- {
- type = builtin
- name = eq_band_6
- label = bq_peaking
- control = { "Freq" = 66.0 "Q" = 2.29 "Gain" = 1.4 }
- }
- {
- type = builtin
- name = eq_band_7
- label = bq_peaking
- control = { "Freq" = 122.0 "Q" = 2.76 "Gain" = -0.8 }
- }
- {
- type = builtin
- name = eq_band_8
- label = bq_peaking
- control = { "Freq" = 6673.0 "Q" = 4.97 "Gain" = -2.9 }
- }
- {
- type = builtin
- name = eq_band_9
- label = bq_peaking
- control = { "Freq" = 9784.0 "Q" = 2.89 "Gain" = -1.3 }
- }
- {
- type = builtin
- name = eq_band_10
- label = bq_highshelf
- control = { "Freq" = 10000.0 "Q" = 0.7 "Gain" = 0.6 }
- }
- ]
- links = [
- { output = "eq_band_1:Out" input = "eq_band_2:In" }
- { output = "eq_band_2:Out" input = "eq_band_3:In" }
- { output = "eq_band_3:Out" input = "eq_band_4:In" }
- { output = "eq_band_4:Out" input = "eq_band_5:In" }
- { output = "eq_band_5:Out" input = "eq_band_6:In" }
- { output = "eq_band_6:Out" input = "eq_band_7:In" }
- { output = "eq_band_7:Out" input = "eq_band_8:In" }
- { output = "eq_band_8:Out" input = "eq_band_9:In" }
- { output = "eq_band_9:Out" input = "eq_band_10:In" }
- ]
- }
- audio.channels = 2
- audio.position = [ FL FR ]
- capture.props = {
- node.name = "effect_input.jbudsair"
- media.class = Audio/Sink
- }
- playback.props = {
- node.name = "effect_output.jbudsair"
- node.passive = true
- }
- }
- }
-]
diff --git a/qutebrowser/bookmarks/urls b/qutebrowser/bookmarks/urls
deleted file mode 100644
index eeef6ee..0000000
--- a/qutebrowser/bookmarks/urls
+++ /dev/null
@@ -1 +0,0 @@
-https://wiki.archlinux.org/index.php/Qutebrowser#Keybindings qutebrowser - ArchWiki
diff --git a/qutebrowser/config.py b/qutebrowser/config.py
deleted file mode 100644
index e75f46c..0000000
--- a/qutebrowser/config.py
+++ /dev/null
@@ -1,275 +0,0 @@
-# Autogenerated config.py
-#
-# NOTE: config.py is intended for advanced users who are comfortable
-# with manually migrating the config file on qutebrowser upgrades. If
-# you prefer, you can also configure qutebrowser using the
-# :set/:bind/:config-* commands without having to write a config.py
-# file.
-#
-# Documentation:
-# qute://help/configuring.html
-# qute://help/settings.html
-
-import sys, os
-
-try:
- home = os.environ['XDG_CONFIG_HOME']
-except KeyError:
- home = os.environ['HOME'] + '/.config'
-
-sys.path.append(os.path.join(sys.path[0], 'jmatrix'))
-config.source(home + "/qutebrowser/jmatrix/jmatrix/integrations/qutebrowser.py")
-
-# Change the argument to True to still load settings configured via autoconfig.yml
-config.load_autoconfig(True)
-
-# Backend to use to display websites. qutebrowser supports two different
-# web rendering engines / backends, QtWebEngine and QtWebKit (not
-# recommended). QtWebEngine is Qt's official successor to QtWebKit, and
-# both the default/recommended backend. It's based on a stripped-down
-# Chromium and regularly updated with security fixes and new features by
-# the Qt project: https://wiki.qt.io/QtWebEngine QtWebKit was
-# qutebrowser's original backend when the project was started. However,
-# support for QtWebKit was discontinued by the Qt project with Qt 5.6 in
-# 2016. The development of QtWebKit was picked up in an official fork:
-# https://github.com/qtwebkit/qtwebkit - however, the project seems to
-# have stalled again. The latest release (5.212.0 Alpha 4) from March
-# 2020 is based on a WebKit version from 2016, with many known security
-# vulnerabilities. Additionally, there is no process isolation and
-# sandboxing. Due to all those issues, while support for QtWebKit is
-# still available in qutebrowser for now, using it is strongly
-# discouraged.
-# Type: String
-# Valid values:
-# - webengine: Use QtWebEngine (based on Chromium - recommended).
-# - webkit: Use QtWebKit (based on WebKit, similar to Safari - many known security issues!).
-c.backend = 'webengine'
-
-# Always restore open sites when qutebrowser is reopened. Without this
-# option set, `:wq` (`:quit --save`) needs to be used to save open tabs
-# (and restore them), while quitting qutebrowser in any other way will
-# not save/restore the session. By default, this will save to the
-# session which was last loaded. This behavior can be customized via the
-# `session.default_name` setting.
-# Type: Bool
-c.auto_save.session = False
-
-# Which cookies to accept. With QtWebEngine, this setting also controls
-# other features with tracking capabilities similar to those of cookies;
-# including IndexedDB, DOM storage, filesystem API, service workers, and
-# AppCache. Note that with QtWebKit, only `all` and `never` are
-# supported as per-domain values. Setting `no-3rdparty` or `no-
-# unknown-3rdparty` per-domain on QtWebKit will have the same effect as
-# `all`. If this setting is used with URL patterns, the pattern gets
-# applied to the origin/first party URL of the page making the request,
-# not the request URL. With QtWebEngine 5.15.0+, paths will be stripped
-# from URLs, so URL patterns using paths will not match. With
-# QtWebEngine 5.15.2+, subdomains are additionally stripped as well, so
-# you will typically need to set this setting for `example.com` when the
-# cookie is set on `somesubdomain.example.com` for it to work properly.
-# To debug issues with this setting, start qutebrowser with `--debug
-# --logfilter network --debug-flag log-cookies` which will show all
-# cookies being set.
-# Type: String
-# Valid values:
-# - all: Accept all cookies.
-# - no-3rdparty: Accept cookies from the same origin only. This is known to break some sites, such as GMail.
-# - no-unknown-3rdparty: Accept cookies from the same origin only, unless a cookie is already set for the domain. On QtWebEngine, this is the same as no-3rdparty.
-# - never: Don't accept cookies at all.
-config.set('content.cookies.accept', 'no-3rdparty')
-
-# Value to send in the `Accept-Language` header. Note that the value
-# read from JavaScript is always the global value.
-# Type: String
-config.set('content.headers.accept_language', '', 'https://matchmaker.krunker.io/*')
-
-# User agent to send. The following placeholders are defined: *
-# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
-# The underlying WebKit version (set to a fixed value with
-# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
-# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
-# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
-# QtWebEngine. * `{upstream_browser_version}`: The corresponding
-# Safari/Chrome version. * `{qutebrowser_version}`: The currently
-# running qutebrowser version. The default value is equal to the
-# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
-# read from JavaScript is always the global value. With QtWebEngine
-# between 5.12 and 5.14 (inclusive), changing the value exposed to
-# JavaScript requires a restart.
-# Type: FormatString
-config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/{webkit_version} (KHTML, like Gecko) {upstream_browser_key}/{upstream_browser_version} Safari/{webkit_version}', 'https://web.whatsapp.com/')
-
-# User agent to send. The following placeholders are defined: *
-# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
-# The underlying WebKit version (set to a fixed value with
-# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
-# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
-# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
-# QtWebEngine. * `{upstream_browser_version}`: The corresponding
-# Safari/Chrome version. * `{qutebrowser_version}`: The currently
-# running qutebrowser version. The default value is equal to the
-# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
-# read from JavaScript is always the global value. With QtWebEngine
-# between 5.12 and 5.14 (inclusive), changing the value exposed to
-# JavaScript requires a restart.
-# Type: FormatString
-config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}; rv:90.0) Gecko/20100101 Firefox/90.0', 'https://accounts.google.com/*')
-
-# User agent to send. The following placeholders are defined: *
-# `{os_info}`: Something like "X11; Linux x86_64". * `{webkit_version}`:
-# The underlying WebKit version (set to a fixed value with
-# QtWebEngine). * `{qt_key}`: "Qt" for QtWebKit, "QtWebEngine" for
-# QtWebEngine. * `{qt_version}`: The underlying Qt version. *
-# `{upstream_browser_key}`: "Version" for QtWebKit, "Chrome" for
-# QtWebEngine. * `{upstream_browser_version}`: The corresponding
-# Safari/Chrome version. * `{qutebrowser_version}`: The currently
-# running qutebrowser version. The default value is equal to the
-# unchanged user agent of QtWebKit/QtWebEngine. Note that the value
-# read from JavaScript is always the global value. With QtWebEngine
-# between 5.12 and 5.14 (inclusive), changing the value exposed to
-# JavaScript requires a restart.
-# Type: FormatString
-config.set('content.headers.user_agent', 'Mozilla/5.0 ({os_info}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99 Safari/537.36', 'https://*.slack.com/*')
-
-# Load images automatically in web pages.
-# Type: Bool
-config.set('content.images', True, 'chrome-devtools://*')
-
-# Load images automatically in web pages.
-# Type: Bool
-config.set('content.images', True, 'devtools://*')
-
-# Enable JavaScript.
-# Type: Bool
-config.set('content.javascript.enabled', True, 'chrome-devtools://*')
-
-# Enable JavaScript.
-# Type: Bool
-config.set('content.javascript.enabled', True, 'devtools://*')
-
-# Enable JavaScript.
-# Type: Bool
-config.set('content.javascript.enabled', True, 'chrome://*/*')
-
-# Enable JavaScript.
-# Type: Bool
-config.set('content.javascript.enabled', True, 'qute://*/*')
-
-# List of user stylesheet filenames to use.
-# Type: List of File, or File
-c.content.user_stylesheets = []
-
-# Editor (and arguments) to use for the `edit-*` commands. The following
-# placeholders are defined: * `{file}`: Filename of the file to be
-# edited. * `{line}`: Line in which the caret is found in the text. *
-# `{column}`: Column in which the caret is found in the text. *
-# `{line0}`: Same as `{line}`, but starting from index 0. * `{column0}`:
-# Same as `{column}`, but starting from index 0.
-# Type: ShellCommand
-c.editor.command = ['neovide', '{file}']
-
-# Page to open if :open -t/-b/-w is used without URL. Use `about:blank`
-# for a blank page.
-# Type: FuzzyUrl
-c.url.default_page = 'https://search.brave.com'
-
-# Search engines which can be used via the address bar. Maps a search
-# engine name (such as `DEFAULT`, or `ddg`) to a URL with a `{}`
-# placeholder. The placeholder will be replaced by the search term, use
-# `{{` and `}}` for literal `{`/`}` braces. The following further
-# placeholds are defined to configure how special characters in the
-# search terms are replaced by safe characters (called 'quoting'): *
-# `{}` and `{semiquoted}` quote everything except slashes; this is the
-# most sensible choice for almost all search engines (for the search
-# term `slash/and&amp` this placeholder expands to `slash/and%26amp`).
-# * `{quoted}` quotes all characters (for `slash/and&amp` this
-# placeholder expands to `slash%2Fand%26amp`). * `{unquoted}` quotes
-# nothing (for `slash/and&amp` this placeholder expands to
-# `slash/and&amp`). * `{0}` means the same as `{}`, but can be used
-# multiple times. The search engine named `DEFAULT` is used when
-# `url.auto_search` is turned on and something else than a URL was
-# entered to be opened. Other search engines can be used by prepending
-# the search engine name to the search term, e.g. `:open google
-# qutebrowser`.
-# Type: Dict
-c.url.searchengines = {'DEFAULT': 'https://search.brave.com/search?q={}', 'dg': 'https://duckduckgo.com/?q={}', 'aw': 'https://wiki.archlinux.org/?search={}', 'sp': 'https://startpage.com/sp/search?q={}', 'yt': 'https://yewtu.be/search?q={}', 'lv': 'https://videos.lukesmith.xyz/search?search={}&searchTarget=local'}
-
-# Page(s) to open at the start.
-# Type: List of FuzzyUrl, or FuzzyUrl
-c.url.start_pages = 'https://search.brave.com'
-
-# Background color for webpages if unset (or empty to use the theme's
-# color).
-# Type: QtColor
-c.colors.webpage.bg = 'black'
-
-# Render all web contents using a dark theme. Example configurations
-# from Chromium's `chrome://flags`: - "With simple HSL/CIELAB/RGB-based
-# inversion": Set `colors.webpage.darkmode.algorithm` accordingly. -
-# "With selective image inversion": Set
-# `colors.webpage.darkmode.policy.images` to `smart`. - "With selective
-# inversion of non-image elements": Set
-# `colors.webpage.darkmode.threshold.text` to 150 and
-# `colors.webpage.darkmode.threshold.background` to 205. - "With
-# selective inversion of everything": Combines the two variants above.
-# Type: Bool
-c.colors.webpage.darkmode.enabled = True
-
-# Which algorithm to use for modifying how colors are rendered with
-# darkmode. The `lightness-cielab` value was added with QtWebEngine 5.14
-# and is treated like `lightness-hsl` with older QtWebEngine versions.
-# Type: String
-# Valid values:
-# - lightness-cielab: Modify colors by converting them to CIELAB color space and inverting the L value. Not available with Qt < 5.14.
-# - lightness-hsl: Modify colors by converting them to the HSL color space and inverting the lightness (i.e. the "L" in HSL).
-# - brightness-rgb: Modify colors by subtracting each of r, g, and b from their maximum value.
-c.colors.webpage.darkmode.algorithm = 'lightness-cielab'
-
-# Which images to apply dark mode to. With QtWebEngine 5.15.0, this
-# setting can cause frequent renderer process crashes due to a
-# https://codereview.qt-project.org/c/qt/qtwebengine-
-# chromium/+/304211[bug in Qt].
-# Type: String
-# Valid values:
-# - always: Apply dark mode filter to all images.
-# - never: Never apply dark mode filter to any images.
-# - smart: Apply dark mode based on image content. Not available with Qt 5.15.0.
-c.colors.webpage.darkmode.policy.images = 'never'
-
-# Threshold for inverting background elements with dark mode. Background
-# elements with brightness above this threshold will be inverted, and
-# below it will be left as in the original, non-dark-mode page. Set to
-# 256 to never invert the color or to 0 to always invert it. Note: This
-# behavior is the opposite of `colors.webpage.darkmode.threshold.text`!
-# Type: Int
-c.colors.webpage.darkmode.threshold.background = 48
-
-# Map keys to other keys, so that they are equivalent in all modes. When
-# the key used as dictionary-key is pressed, the binding for the key
-# used as dictionary-value is invoked instead. This is useful for global
-# remappings of keys, for example to map <Ctrl-[> to <Escape>. NOTE:
-# This should only be used if two keys should always be equivalent, i.e.
-# for things like <Enter> (keypad) and <Return> (non-keypad). For normal
-# command bindings, qutebrowser works differently to vim: You always
-# bind keys to commands, usually via `:bind` or `config.bind()`. Instead
-# of using this setting, consider finding the command a key is bound to
-# (e.g. via `:bind gg`) and then binding the same command to the desired
-# key. Note that when a key is bound (via `bindings.default` or
-# `bindings.commands`), the mapping is ignored.
-# Type: Dict
-c.bindings.key_mappings = {'<Ctrl+6>': '<Ctrl+^>', '<Ctrl+Enter>': '<Ctrl+Return>', '<Ctrl+i>': '<Tab>', '<Ctrl+j>': '<Return>', '<Ctrl+m>': '<Return>', '<Ctrl+[>': '<Escape>', '<Enter>': '<Return>', '<Shift+Enter>': '<Return>', '<Shift+Return>': '<Return>'}
-
-# Bindings for normal mode
-config.bind('<Ctrl+0>', 'tab-select 10')
-config.bind('<Ctrl+1>', 'tab-select 1')
-config.bind('<Ctrl+2>', 'tab-select 2')
-config.bind('<Ctrl+3>', 'tab-select 3')
-config.bind('<Ctrl+4>', 'tab-select 4')
-config.bind('<Ctrl+5>', 'tab-select 5')
-config.bind('<Ctrl+6>', 'tab-select 6')
-config.bind('<Ctrl+7>', 'tab-select 7')
-config.bind('<Ctrl+8>', 'tab-select 8')
-config.bind('<Ctrl+9>', 'tab-select 9')
-config.bind('X', 'hint links spawn mpv {hint-url}')
-config.bind('ar', 'download-retry')
-config.bind('pa', 'spawn --userscript qute-pass')
diff --git a/qutebrowser/jmatrix b/qutebrowser/jmatrix
deleted file mode 160000
-Subproject b197ae15cafdeb9e864df24c6914192d07d2319
diff --git a/qutebrowser/quickmarks b/qutebrowser/quickmarks
deleted file mode 100644
index 93c8b7e..0000000
--- a/qutebrowser/quickmarks
+++ /dev/null
@@ -1 +0,0 @@
-lv https://videos.lukesmith.xyz
diff --git a/river/init b/river/init
deleted file mode 100755
index cfa8c39..0000000
--- a/river/init
+++ /dev/null
@@ -1,223 +0,0 @@
-#!/bin/sh
-
-# This is the example configuration file for river.
-#
-# If you wish to edit this, you will probably want to copy it to
-# $XDG_CONFIG_HOME/river/init or $HOME/.config/river/init first.
-#
-# See the river(1), riverctl(1), and rivertile(1) man pages for complete
-# documentation.
-
-# Note: the "$mod1" modifier is also known as Logo, GUI, Windows, Mod4, etc.
-
-mod1="Alt"
-mod2="Super"
-
-# $mod1+Shift+Return to start an instance of foot (https://codeberg.org/dnkl/foot)
-riverctl map normal $mod1 Return spawn foot
-
-# $mod1+Q to close the focused view
-riverctl map normal $mod1+Shift Q close
-
-# $mod1+Shift+E to exit river
-riverctl map normal $mod1+Shift E exit
-
-# $mod1+J and $mod1+K to focus the next/previous view in the layout stack
-riverctl map normal $mod1 J focus-view next
-riverctl map normal $mod1 K focus-view previous
-
-# $mod1+Shift+J and $mod1+Shift+K to swap the focused view with the next/previous
-# view in the layout stack
-riverctl map normal $mod1+Shift J swap next
-riverctl map normal $mod1+Shift K swap previous
-
-# $mod1+Period and $mod1+Comma to focus the next/previous output
-riverctl map normal $mod1 Period focus-output next
-riverctl map normal $mod1 Comma focus-output previous
-
-# $mod1+Shift+{Period,Comma} to send the focused view to the next/previous output
-riverctl map normal $mod1+Shift Period send-to-output next
-riverctl map normal $mod1+Shift Comma send-to-output previous
-
-# $mod1+Return to bump the focused view to the top of the layout stack
-riverctl map normal $mod1+Shift Return zoom
-
-# $mod1+H and $mod1+L to decrease/increase the main ratio of rivertile(1)
-riverctl map normal $mod1 H send-layout-cmd rivertile "main-ratio -0.05"
-riverctl map normal $mod1 L send-layout-cmd rivertile "main-ratio +0.05"
-
-# $mod1+Shift+H and $mod1+Shift+L to increment/decrement the main count of rivertile(1)
-riverctl map normal $mod1+Shift H send-layout-cmd rivertile "main-count +1"
-riverctl map normal $mod1+Shift L send-layout-cmd rivertile "main-count -1"
-
-# $mod1+$mod2+{H,J,K,L} to move views
-riverctl map normal $mod1+$mod2 H move left 100
-riverctl map normal $mod1+$mod2 J move down 100
-riverctl map normal $mod1+$mod2 K move up 100
-riverctl map normal $mod1+$mod2 L move right 100
-
-# $mod1+$mod2+Control+{H,J,K,L} to snap views to screen edges
-riverctl map normal $mod1+$mod2+Control H snap left
-riverctl map normal $mod1+$mod2+Control J snap down
-riverctl map normal $mod1+$mod2+Control K snap up
-riverctl map normal $mod1+$mod2+Control L snap right
-
-# $mod1+$mod2+Shift+{H,J,K,L} to resize views
-riverctl map normal $mod1+$mod2+Shift H resize horizontal -100
-riverctl map normal $mod1+$mod2+Shift J resize vertical 100
-riverctl map normal $mod1+$mod2+Shift K resize vertical -100
-riverctl map normal $mod1+$mod2+Shift L resize horizontal 100
-
-# $mod1 + Left Mouse Button to move views
-riverctl map-pointer normal $mod1 BTN_LEFT move-view
-
-# $mod1 + Right Mouse Button to resize views
-riverctl map-pointer normal $mod1 BTN_RIGHT resize-view
-
-# $mod1 + Middle Mouse Button to toggle float
-riverctl map-pointer normal $mod1 BTN_MIDDLE toggle-float
-
-# Mouse rules
-riverctl set-cursor-warp on-output-change
-riverctl focus-follors-cursor always
-
-for i in $(seq 1 9)
-do
- tags=$((1 << ($i - 1)))
-
- # $mod1+[1-9] to focus tag [0-8]
- riverctl map normal $mod1 $i set-focused-tags $tags
-
- # $mod1+Shift+[1-9] to tag focused view with tag [0-8]
- riverctl map normal $mod1+Shift $i set-view-tags $tags
-
- # $mod1+Ctrl+[1-9] to toggle focus of tag [0-8]
- riverctl map normal $mod1+Control $i toggle-focused-tags $tags
-
- # $mod1+Shift+Ctrl+[1-9] to toggle tag [0-8] of focused view
- riverctl map normal $mod1+Shift+Control $i toggle-view-tags $tags
-done
-
-# $mod1+0 to focus all tags
-# $mod1+Shift+0 to tag focused view with all tags
-all_tags=$(((1 << 9) - 1))
-riverctl map normal $mod1 0 set-focused-tags $all_tags
-riverctl map normal $mod1+Shift 0 set-view-tags $all_tags
-
-# scratchpad tags
-BINPATH="${XDG_CONFIG_HOME:-$HOME/.config}/river/sp"
-riverctl map normal $mod1+Control z spawn "$BINPATH/river_sp z"
-riverctl map normal $mod1+Control x spawn "$BINPATH/river_sp x"
-riverctl map normal $mod1+Control c spawn "$BINPATH/river_sp c"
-riverctl map normal $mod1+Control v spawn "$BINPATH/river_sp v"
-riverctl map normal $mod1+Control b spawn "$BINPATH/river_sp b"
-riverctl map normal $mod1+Control a spawn "$BINPATH/river_sp a"
-riverctl map normal $mod1+Control s spawn "$BINPATH/river_sp s"
-riverctl map normal $mod1+Control d spawn "$BINPATH/river_sp d"
-riverctl map normal $mod1+Control f spawn "$BINPATH/river_sp f"
-riverctl map normal $mod1+Control g spawn "$BINPATH/river_sp g"
-riverctl map normal $mod1+Control q spawn "$BINPATH/river_sp q"
-
-# $mod1+Space to toggle float
-riverctl map normal $mod1+Control Space toggle-float
-
-# $mod1+F to toggle fullscreen
-riverctl map normal $mod1 F toggle-fullscreen
-
-# $mod1+{Up,Right,Down,Left} to change layout orientation
-riverctl map normal $mod1 Up send-layout-cmd rivertile "main-location top"
-riverctl map normal $mod1 Right send-layout-cmd rivertile "main-location right"
-riverctl map normal $mod1 Down send-layout-cmd rivertile "main-location bottom"
-riverctl map normal $mod1 Left send-layout-cmd rivertile "main-location left"
-
-# Declare a passthrough mode. This mode has only a single mapping to return to
-# normal mode. This makes it useful for testing a nested wayland compositor
-riverctl declare-mode passthrough
-
-# $mod1+F11 to enter passthrough mode
-riverctl map normal $mod1 b enter-mode passthrough
-
-# $mod1+F11 to return to normal mode
-riverctl map passthrough $mod1 b enter-mode normal
-
-# Various media key mapping examples for both normal and locked mode which do
-# not have a modifier
-for mode in normal locked
-do
- # Eject the optical drive (well if you still have one that is)
- riverctl map $mode None XF86Eject spawn 'eject -T'
-
- # Control pulse audio volume with pamixer (https://github.com/cdemoulins/pamixer)
- riverctl map $mode None XF86AudioRaiseVolume spawn 'volsv -i'
- riverctl map $mode None XF86AudioLowerVolume spawn 'volsv -d'
- riverctl map $mode None XF86AudioMute spawn 'volsv -t'
- riverctl map $mode None XF86AudioMicMute spawn 'volsv -m'
-
- # Control MPRIS aware media players with playerctl (https://github.com/altdesktop/playerctl)
- riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
- riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause'
- riverctl map $mode None XF86AudioPrev spawn 'playerctl previous'
- riverctl map $mode None XF86AudioNext spawn 'playerctl next'
-
- # Control screen backlight brightness with light (https://github.com/haikarainen/light)
- riverctl map $mode None XF86MonBrightnessUp spawn 'bl -i 5'
- riverctl map $mode None XF86MonBrightnessDown spawn 'bl -d 5'
-done
-
-# add browser shortcuts
-riverctl map normal $mod1+$mod2 1 spawn "bm -w"
-riverctl map normal $mod1+$mod2 q spawn "qbc -w"
-riverctl map normal $mod1+$mod2 w spawn "lwc -w"
-riverctl map normal $mod1+$mod2 e spawn "ffc -w"
-
-# add other menu shortcuts
-riverctl map normal $mod1+$mod2 p spawn passmenu
-riverctl map normal $mod1 r spawn 'exec $(tofi-drun)'
-riverctl map normal $mod1 d spawn 'exec $(tofi-run)'
-riverctl map normal $mod1+$mod2+Control u spawn 'dmenuunicode -w'
-riverctl map normal $mod1+$mod2 Comma spawn 'dmenumount -w'
-riverctl map normal $mod1+$mod2 Period spawn 'dmenuumount -w'
-riverctl map normal $mod1+$mod2 b spawn 'dmenu_books -w'
-riverctl map normal $mod1+$mod2 u spawn 'mprisctl -w'
-
-# add other shortcuts
-riverctl map normal $mod1 q spawn 'loginctl lock-session self'
-riverctl map normal $mod1+$mod2 f spawn 'foot lf'
-riverctl map normal $mod1+$mod2 m spawn 'volsv -t'
-riverctl map normal $mod1+$mod2+Shift m spawn 'volsv -m'
-
-# secondary mod shortcuts
-riverctl map normal $mod2 p spawn 'playerctl play-pause'
-
-# Set background and border color
-riverctl background-color 0x000000
-riverctl border-color-focused 0x535d6c
-riverctl border-color-unfocused 0x000000
-
-# Set keyboard repeat rate
-riverctl set-repeat 50 300
-
-# Make certain views start floating
-riverctl float-filter-add app-id float
-riverctl float-filter-add app-id "sphtop"
-riverctl float-filter-add app-id "spterm"
-riverctl float-filter-add app-id "sppmxr"
-riverctl float-filter-add app-id "spblue"
-riverctl float-filter-add app-id "spncmp"
-riverctl float-filter-add app-id "spmutt"
-riverctl float-filter-add app-id "spprof"
-riverctl float-filter-add app-id "spirss"
-riverctl float-filter-add app-id "sptodo"
-riverctl float-filter-add app-id "sptrmc"
-riverctl float-filter-add app-id "qpwgraph"
-riverctl float-filter-add title "popup title with spaces"
-
-# Set app-ids and titles of views which should use client side decorations
-riverctl csd-filter-add app-id "gedit"
-
-# Set the default layout generator to be rivertile and start it.
-# River will send the process group of the init executable SIGTERM on exit.
-riverctl default-layout rivertile
-rivertile -view-padding 6 -outer-padding 6 &
-
-sh ~/.config/autostart.sh &
diff --git a/river/sp/river_sp b/river/sp/river_sp
deleted file mode 100755
index 9b1e1ad..0000000
--- a/river/sp/river_sp
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-
-#{{{ binpath
-BINPATH="${XDG_CONFIG_HOME:-$HOME/.config}/river/sp"
-#}}}
-
-#{{{ spawnwindow
-spawnwindow () {
- case "$1" in
- 1) pgrep -x sp_z || ${BINPATH}/sp_z ;;
- 2) pgrep -x sp_x || ${BINPATH}/sp_x ;;
- 3) pgrep -x sp_c || ${BINPATH}/sp_c ;;
- 4) pgrep -x sp_v || ${BINPATH}/sp_v ;;
- 5) pgrep -x sp_b || ${BINPATH}/sp_b ;;
- 6) pgrep -x sp_a || ${BINPATH}/sp_a ;;
- 7) pgrep -x sp_s || ${BINPATH}/sp_s ;;
- 8) pgrep -x sp_d || ${BINPATH}/sp_d ;;
- 9) pgrep -x sp_f || ${BINPATH}/sp_f ;;
- 10) pgrep -x sp_g || ${BINPATH}/sp_g ;;
- 11) pgrep -x sp_q || ${BINPATH}/sp_q ;;
- *) printf "Unknown scratchpad $1!\n" ; exit 1 ;;
- esac
-}
-#}}}
-
-#{{{ getopts
-for i in "$@"; do
- case "$i" in
- z) ARG=1 ;;
- x) ARG=2 ;;
- c) ARG=3 ;;
- v) ARG=4 ;;
- b) ARG=5 ;;
- a) ARG=6 ;;
- s) ARG=7 ;;
- d) ARG=8 ;;
- f) ARG=9 ;;
- g) ARG=10 ;;
- q) ARG=11 ;;
- *) printf "Unknown scratchpad $i!\n" ; exit 1 ;;
- esac
- if pgrep -x "sp_$i"; then
- riverctl toggle-focused-tags $((1 << ($ARG + 9)))
- else
- riverctl toggle-focused-tags $(( 1 << ($ARG + 9)))
- riverctl spawn-tagmask $(( 1 << ($ARG + 9)))
- spawnwindow "$ARG"
- riverctl spawn-tagmask $(( (1 << 9) - 1))
- fi
-done
-#}}}
diff --git a/river/sp/sp_a b/river/sp/sp_a
deleted file mode 100755
index d76f78e..0000000
--- a/river/sp/sp_a
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spmutt" neomutt
diff --git a/river/sp/sp_b b/river/sp/sp_b
deleted file mode 100755
index 208cf4c..0000000
--- a/river/sp/sp_b
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spncmp" ncmpcpp
diff --git a/river/sp/sp_c b/river/sp/sp_c
deleted file mode 100755
index 0201227..0000000
--- a/river/sp/sp_c
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "sppmxr" pulsemixer
diff --git a/river/sp/sp_d b/river/sp/sp_d
deleted file mode 100755
index 1545c87..0000000
--- a/river/sp/sp_d
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spirss" irssi
diff --git a/river/sp/sp_f b/river/sp/sp_f
deleted file mode 100755
index f2468ea..0000000
--- a/river/sp/sp_f
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "sptodo" todo
diff --git a/river/sp/sp_g b/river/sp/sp_g
deleted file mode 100755
index 7b3a393..0000000
--- a/river/sp/sp_g
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "sptrmc" tremc
diff --git a/river/sp/sp_q b/river/sp/sp_q
deleted file mode 100755
index 9202782..0000000
--- a/river/sp/sp_q
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-qpwgraph
diff --git a/river/sp/sp_s b/river/sp/sp_s
deleted file mode 100755
index 288373c..0000000
--- a/river/sp/sp_s
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spprof" profanity
diff --git a/river/sp/sp_v b/river/sp/sp_v
deleted file mode 100755
index 009e18d..0000000
--- a/river/sp/sp_v
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spblue" bluetoothctl
diff --git a/river/sp/sp_x b/river/sp/sp_x
deleted file mode 100755
index ef07b51..0000000
--- a/river/sp/sp_x
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "spterm"
diff --git a/river/sp/sp_z b/river/sp/sp_z
deleted file mode 100755
index c6414ed..0000000
--- a/river/sp/sp_z
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-foot -a "sphtop" htop
diff --git a/swayidle/config b/swayidle/config
deleted file mode 100644
index 210ff01..0000000
--- a/swayidle/config
+++ /dev/null
@@ -1,3 +0,0 @@
-timeout 600 swaylockd
-before-sleep swaylockd
-lock waylockd
diff --git a/swaylock/config b/swaylock/config
deleted file mode 100644
index 55ca360..0000000
--- a/swaylock/config
+++ /dev/null
@@ -1,2 +0,0 @@
-ignore-empty-password
-color=000000
diff --git a/tofi/config b/tofi/config
deleted file mode 120000
index 54cdd97..0000000
--- a/tofi/config
+++ /dev/null
@@ -1 +0,0 @@
-/home/zachir/.config/tofi/themes/dmenu \ No newline at end of file
diff --git a/tofi/themes/colors b/tofi/themes/colors
deleted file mode 100644
index a5f480c..0000000
--- a/tofi/themes/colors
+++ /dev/null
@@ -1,17 +0,0 @@
-background-color = #000000
-outline-color = #39c1ed
-border-color = #39c1ed
-text-color = #ffffff
-prompt-color = #39c1ed
-prompt-background = #000000
-placeholder-color = #39c1ed
-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 = #198844
-selection-background = #39c1ed
-
diff --git a/tofi/themes/dmenu b/tofi/themes/dmenu
deleted file mode 100644
index 6bf9074..0000000
--- a/tofi/themes/dmenu
+++ /dev/null
@@ -1,22 +0,0 @@
-include = "themes/colors"
-
-hidden-character = "*"
-anchor = top
-width = 100%
-height = 36
-horizontal = true
-font-size = 24
-prompt-text = ""
-font = mononoki 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/waybar/config b/waybar/config
deleted file mode 100644
index d762544..0000000
--- a/waybar/config
+++ /dev/null
@@ -1,157 +0,0 @@
-{
- "layer": "top",
- "position": "top",
- "height": 36,
- //"output": "%%DISPLAY%%",
- "spacing": 4,
- //"margin-top": 5,
- //"margin-bottom":5,
-
- // Choose the order of the modules
-
- "modules-left":[ "wlr/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 configuration
-
- "wlr/workspaces": {
- "format": "{name}",
- "active-only": false,
- "all-outputs": true,
- "on-scroll-up": "hyprctl dispatch workspace e+1",
- "on-scroll-down": "hyprctl dispatch workspace e-1",
- "on-click": "activate"
- },
- "hyprland/window": {
- "separate-outputs": true,
- "format": "{}"
- },
- "keyboard-state": {
- "numlock": true,
- "capslock": true,
- "format": " {name} {icon}",
- "format-icons": {
- "locked": "",
- "unlocked": ""
- }
- },
- "mpd": {
- "format": "{artist} - {title}",
- "format-stopped": "",
- "format-paused": "{artist} - {title}",
- "format-disconnected": "",
- "artist-len": 15,
- "title-len": 15,
- //"album-len": 15,
- //"max-length": 200,
- "on-click": "mpc toggle"
- },
- "idle_inhibitor": {
- "format": "{icon}",
- "format-icons": {
- "activated": "",
- "deactivated": ""
- }
- },
- "tray": {
- "icon-size": 20,
- "spacing": 10
- },
- "clock": {
- // "timezone": "America/New_York",
- "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
- "format-alt": "{:%Y-%m-%d}"
- },
- "cpu": {
- "format": "{usage}% ",
- "tooltip": false
- },
- "memory": {
- "format": "{}% "
- },
- "temperature#cpu": {
- // "thermal-zone": 2,
- "hwmon-path": "/sys/class/hwmon/hwmon3/temp1_input",
- "critical-threshold": 80,
- // "format-critical": "{temperatureC}°C {icon}",
- "format": "{temperatureC}°C",
- "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",
- "format-icons": ["", "", ""]
- },
- "backlight": {
- // "device": "acpi_video1",
- "format": "{percent}%"
- //"format-icons": ["", ""]
- },
- "battery": {
- "states": {
- // "good": 95,
- "warning": 30,
- "critical": 15
- },
- "format": "{capacity}%",
- "format-charging": "{capacity}% +",
- "format-plugged": "{capacity}% =",
- "format-alt": "{time}",
- // "format-good": "", // An empty format will hide the module
- // "format-full": "",
- //"format-icons": ["", "", "", "", ""]
- },
- "battery#bat0": {
- "bat": "BAT0"
- },
- "battery#bat1": {
- "bat": "BAT1"
- },
- "network": {
- // "interface": "wlp2*", // (Optional) To force the use of this interface
- "format-wifi": "{essid} ({signalStrength}%) ",
- "format-ethernet": "Connected  ",
- "tooltip-format": "{ifname} via {gwaddr} ",
- "format-linked": "{ifname} (No IP) ",
- "format-disconnected": "Disconnected ⚠",
- "format-alt": "{ifname}: {ipaddr}/{cidr}",
- "on-click-right": "bash ~/.config/rofi/wifi_menu/rofi_wifi_menu"
- },
- "pulseaudio": {
- // "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"
- },
- "custom/launcher":{
- "format": "",
- "on-click": "exec $(tofi-drun)",
- "on-click-right": "killall tofi"
- },
- "custom/power":{
- "format": " ",
- "on-click": "nwg-bar",
- "on-click-right": "killall nwg-bar"
- },
- "custom/snip":{
- "format": " ",
- "on-click": "grimshot --notify save area $HOME/Pictures/$(zenity --entry --text 'Set filename:' --entry-text '.png')"
- }
-}
diff --git a/waybar/style.css b/waybar/style.css
deleted file mode 100644
index f002c9b..0000000
--- a/waybar/style.css
+++ /dev/null
@@ -1,322 +0,0 @@
-* {
- border: 0px;
- margin: 0px;
- border-radius: 0px;
- /* `otf-font-awesome` is required to be installed for icons */
- font-family: mononoki Nerd Font Mono;
- font-size: 18px;
- min-height: 0px;
- min-width: 0px;
-}
-
-window#waybar {
- background-color: transparent;
- color: #ffffff;
- transition-property: background-color;
- transition-duration: .5s;
-}
-
-window#waybar.hidden {
- opacity: 0.2;
-}
-
-
-/*
-#workspaces button {
- background: #1f1f1f;
- color: #ffffff;
- border-radius: 20px;
-}
-*/
-
-/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
-
-#workspaces button {
- background: #333333;
- color: white;
- border-bottom: 3px solid #1b1d1c;
-}
-
-/*
-#workspaces button:hover {
- background: #39c1ed;
- color: black;
- border-bottom: 3px solid #ffffff;
-
-}
-*/
-
-#workspaces button.active {
- background: #198844;
-}
-
-/*
-#workspaces button.active:hover {
- background: #39c1ed;
- color: black;
- border-bottom: 3px solid #ffffff;
-}
-*/
-
-#workspaces button.urgent {
- background-color: #eb4d4b;
-}
-
-#mode {
- background-color: #64727D;
- border-bottom: 3px solid #ffffff;
-}
-
-#clock,
-#battery,
-#cpu,
-#memory,
-#disk,
-#temperature,
-#backlight,
-#network,
-#pulseaudio,
-#custom-media,
-#custom-launcher,
-#custom-power,
-#custom-layout,
-#custom-updater,
-#custom-snip,
-#custom-wallpaper,
-#tags,
-#taskbar,
-#tray,
-#mode,
-#idle_inhibitor,
-#mpd {
- padding: 0px 9px;
- margin: 0px;
- color: #ffffff;
-}
-
-#window,
-#workspaces {
- margin: 0px 4px;
-}
-
-/* If workspaces is the leftmost module, omit left margin */
-.modules-left > widget:first-child > #workspaces {
- margin-left: 0px;
-}
-
-/* If workspaces is the rightmost module, omit right margin */
-.modules-right > widget:last-child > #workspaces {
- margin-right: 0px;
-}
-
-#clock {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#battery {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#battery.charging, #battery.plugged {
- color: #26A65B;
- background-color: #1b1d1c;
-}
-
-@keyframes blink {
- to {
- background-color: #ffffff;
- color: #000000;
- }
-}
-
-#battery.critical:not(.charging) {
- background-color: #f53c3c;
- color: #ffffff;
- animation-name: blink;
- animation-duration: 0.5s;
- animation-timing-function: linear;
- animation-iteration-count: infinite;
- animation-direction: alternate;
-}
-
-label:focus {
- background-color: #000000;
-}
-
-#cpu {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#memory {
- background-color: #198844;
- color: #ffffff;
-}
-
-#disk {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#backlight {
- background-color: #198844;
- color: #ffffff;
-}
-
-#network {
- background-color: #198844;
- color: #ffffff;
-}
-
-#network.disconnected {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#pulseaudio {
- background-color: #198844;
- color: #ffffff;
-}
-
-#pulseaudio.muted {
- background-color: #1b1d1c;
- color: #198844;
-}
-
-#custom-media {
- background-color: #1b1d1c;
- color: white;
-}
-
-#custom-media.custom-spotify {
- background-color: #1b1d1c;
- color: white;
-
-}
-
-#custom-media.custom-vlc {
- background-color: #1b1d1c;
- color: white;
-}
-
-#custom-power{
- background-color: #1b1d1c;
- font-size: 18px;
- margin-right: 5px;
-
-}
-
-#custom-launcher{
- background-color: #1b1d1c;
- font-size: 20px;
- margin-left: 5px;
-
-}
-
-#custom-layout{
- background-color: #1b1d1c;
- color: white;
- font-size:20px;
-}
-
-#custom-updater {
- background-color: #1b1d1c;
- color: white;
-}
-
-#custom-snip {
- background-color: #1b1d1c;
- color: skyblue;
- font-size: 20px;
-}
-
-#custom-wallpaper {
- background-color: #1b1d1c;
- color: pink;
- font-size: 20px;
-}
-
-#tags{
- background-color: #1b1d1c;
- font-size: 20px;
-}
-
-#tags button.occupied {
- color: skyblue;
- background-color: #272727;
-}
-#tags button.focused {
- color: black;
- background-color: white;
-}
-#tags button.urgent{
- color: red;
- background-color:white;
-}
-
-
-#taskbar{
- background-color: #1b1d1c;
- border-radius: 0px 20px 20px 0px;
-}
-
-#temperature {
- background-color: #1b1d1c;
- color: #ffffff;
-}
-
-#temperature.critical {
- background-color: #eb4d4b;
-}
-
-#tray {
- background-color: #198844;
- color: #ffffff;
-}
-
-#tray > .passive {
- -gtk-icon-effect: dim;
- background-color: #198844;
- color: #ffffff;
-}
-
-#tray > .needs-attention {
- -gtk-icon-effect: highlight;
- background-color: #198844;
- color: #ffffff;
-}
-
-#idle_inhibitor {
- background-color: #1b1d1c;
- border-radius: 20px 0px 0px 20px;
-
-}
-
-#idle_inhibitor.activated {
- background-color: #198844;
- color: #ffffff;
- border-radius: 20px 0px 0px 20px;
-
-}
-
-#language {
- background-color: #1b1d1c;
- color: #ffffff;
- min-width: 16px;
-}
-
-#keyboard-state {
- background: #97e1ad;
- color: #000000;
- min-width: 16px;
-}
-
-#keyboard-state > label {
- padding: 0px 5px;
-}
-
-#keyboard-state > label.locked {
- background: rgba(0, 0, 0, 0.2);
-}
diff --git a/wireplumber/main.lua.d/51-custom.lua b/wireplumber/main.lua.d/51-custom.lua
deleted file mode 100644
index 2340e94..0000000
--- a/wireplumber/main.lua.d/51-custom.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-table.insert(alsa_monitor.rules,
- {
- -- Rules for matching a device or node. It is an array of
- -- properties that all need to match the regexp. If any of the
- -- matches work, the actions are executed for the object.
- matches = {
- {
- { "device.name", "matches", "alsa_card.usb-Audient_Audient_iD4-00" },
- },
- },
- -- Apply properties on the matched object.
- apply_properties = {
- -- Use UCM instead of profile when available. Can be
- -- disabled to skip trying to use the UCM profile.
- ["api.alsa.use-ucm"] = false,
-
- -- The default active profile. Is by default set to "Off".
- ["device.profile"] = "Pro Audio",
- },
- }
-)
-
diff --git a/ytfzf/conf.sh b/ytfzf/conf.sh
deleted file mode 100644
index d715a7e..0000000
--- a/ytfzf/conf.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-YTFZF_EXTMENU=' bemenu -i -l 30 -p "Search:" '
-
-YTFZF_PLAYER='mpv --save-position-on-quit'
-YTFZF_PLAYER_FORMAT='mpv --save-position-on-quit --ytdl-format='
-
-cache_dir="$XDG_CACHE_HOME/ytfzf"
-history_file="$cache_dir/ytfzf_hst"
-current_file="$cache_dir/ytfzf_cur"
-thumbnail_viewer="catimg"