dotfiles

My collection of dotfiles.
git clone git://git.stellar-nexus.ru/dotfiles
Log | Files | Refs

commit 60e1cc703c2432455a294587cdc91ee9032b609c
Author: Plat <plat@stellar-nexus.ru>
Date:   Mon, 22 Jul 2024 22:28:45 +0300

Initial commit

Diffstat:
Abash_profile | 17+++++++++++++++++
Aconfig/discord/README | 2++
Aconfig/discord/autoconfig.yml | 10++++++++++
Aconfig/discord/bookmarks/urls | 0
Aconfig/discord/config.py | 213+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/discord/quickmarks | 1+
Aconfig/htop/htoprc | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/mpv/mpv.conf | 3+++
Aconfig/mpv/scripts/webm.lua | 3052+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/qutebrowser/autoconfig.yml | 10++++++++++
Aconfig/qutebrowser/bookmarks/urls | 20++++++++++++++++++++
Aconfig/qutebrowser/config.py | 242+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/qutebrowser/greasemonkey/pseudo-tran.js | 27+++++++++++++++++++++++++++
Aconfig/qutebrowser/greasemonkey/white-text.js.disabled | 25+++++++++++++++++++++++++
Aconfig/qutebrowser/qsettings/QtProject.conf | 17+++++++++++++++++
Aconfig/qutebrowser/quickmarks | 16++++++++++++++++
Aconfig/ranger/commands.py | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/ranger/commands_full.py | 1993+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/ranger/rc.conf | 759+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/ranger/rifle.conf | 285+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/ranger/scope.sh | 350+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aconfig/sc-im/scimrc | 5+++++
Ahosts | 41+++++++++++++++++++++++++++++++++++++++++
Amake.conf | 44++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-misc/dmenu/01-dmenu-highpriority-5.2.diff | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-terms/st/st-background-image-0.8.5.diff | 262+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/01-dwm-adjacenttag-6.2.diff | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/02-dwm-pertag-6.2.diff | 177+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/03-dwm-resetlayout-6.2_and_no-border.diff | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/04-dwm-fancybar-20220527-d3f93c7.diff | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/05-dwm-fullgaps-6.4.diff | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apatches/x11-wm/dwm/06-dwm-alttab-6.4.diff | 324+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asavedconfig/sys-kernel/linux-firmware-20240709-r1 | 3942+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asavedconfig/x11-misc/dmenu-5.2 | 24++++++++++++++++++++++++
Asavedconfig/x11-misc/dmenu-5.3 | 24++++++++++++++++++++++++
Asavedconfig/x11-terms/st-0.9 | 482+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asavedconfig/x11-wm/dwm-6.4 | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asavedconfig/x11-wm/dwm-6.5 | 158+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asinit/dtinit | 2++
Asinit/sound | 27+++++++++++++++++++++++++++
Avimrc | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
41 files changed, 13529 insertions(+), 0 deletions(-)

diff --git a/bash_profile b/bash_profile @@ -0,0 +1,17 @@ +# /etc/skel/.bash_profile + +# This file is sourced by bash for login shells. The following line +# runs your .bashrc and is recommended by the bash info pages. +if [[ -f ~/.bashrc ]] ; then + . ~/.bashrc +fi +[ -f $HOME/.bashrc ] && . $HOME/.bashrc +if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then + exec startx +fi +#if shopt -q login_shell; then +# [[ -f ~/.bashrc ]] && source ~/.bashrc +# [[ -t 0 && $(tty) == /dev/tty1 && ! $DISPLAY ]] && exec startx +#else +# exit 1 # Somehow this is a non-bash or non-login shell. +#fi diff --git a/config/discord/README b/config/discord/README @@ -0,0 +1,2 @@ +This folder goes into /local/share/discord/ +You need qutebrowser for it to work. Need a second profile too diff --git a/config/discord/autoconfig.yml b/config/discord/autoconfig.yml @@ -0,0 +1,10 @@ +# If a config.py file exists, this file is ignored unless it's explicitly loaded +# via config.load_autoconfig(). For more information, see: +# https://github.com/qutebrowser/qutebrowser/blob/main/doc/help/configuring.asciidoc#loading-autoconfigyml +# DO NOT edit this file by hand, qutebrowser will overwrite it. +# Instead, create a config.py - see :help for details. + +config_version: 2 +settings: + content.media.audio_capture: + https://discord.com: false diff --git a/config/discord/bookmarks/urls b/config/discord/bookmarks/urls diff --git a/config/discord/config.py b/config/discord/config.py @@ -0,0 +1,213 @@ +from qutebrowser.api import interceptor +# 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 + +# Change the argument to True to still load settings configured via autoconfig.yml +config.load_autoconfig(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', 'all', 'chrome-devtools://*') + +# Setting dark mode +config.set("colors.webpage.darkmode.enabled", 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', 'all', 'devtools://*') + +# 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/*') +#Ad/Tracker blocking +def filter_discord(info: interceptor.Request): + url=info.request_url + if ( + url.host()=="discord.com" + and url.path()=="/api/v9/science" + ): + info.block() + +interceptor.register(filter_discord) + +#Start pages +config.set('url.default_page', 'https://discord.com/channels/@me') +c.url.start_pages = ['https://discord.com/channels/@me'] + +#File manager +config.set("fileselect.handler", "external") +config.set("fileselect.single_file.command", ['st', '-e', 'ranger', '--choosefile', '{}']) +config.set("fileselect.multiple_files.command", ['st', '-e', 'ranger', '--choosefiles', '{}']) + +#Color scheme +config.set('colors.completion.category.bg', '#667bc4') +config.set('colors.completion.odd.bg', '#313338') +config.set('colors.completion.even.bg', '#1e1f22') +config.set('colors.completion.item.selected.bg', '#5b209a') +config.set('colors.completion.item.selected.fg', 'white') +config.set('colors.completion.item.selected.border.bottom', '#7e61ab') +config.set('colors.completion.item.selected.border.top', '#7e61ab') +config.set('colors.statusbar.normal.bg', '#313338') +config.set('colors.hints.bg', '#5b209a') +config.set('colors.hints.fg', 'white') +config.set('hints.border', '1px solid #cab2fb') +config.set('colors.tabs.bar.bg', '#313338') +config.set('colors.tabs.odd.bg', '#313338') +config.set('colors.tabs.even.bg', '#313338') +config.set('colors.tabs.selected.odd.bg', '#313338') +config.set('colors.tabs.selected.even.bg', '#313338') + +#Bindings for normal mode +config.bind('h', 'back') +config.bind('j', 'tab-prev') +config.bind('k', 'tab-next') +config.bind('l', 'forward') +config.bind('J', 'tab-prev') +config.bind('K', 'tab-next') +config.bind('m', 'hint links spawn -d /home/plat/scripts/append_music.sh') +config.bind('M', 'hint links spawn ./scripts/play_video.sh {hint-url}') +config.bind('I', 'hint links spawn mpv --loop=inf --pause {hint-url}') +config.bind('<', 'spawn ./scripts/discord_min.sh') +config.bind('>', 'spawn ./scripts/discord_big.sh') +config.bind('G', 'spawn ./scripts/discord_bottom.sh') +config.bind('D', 'spawn ./scripts/discord_recent.sh') +config.bind('s', 'click-element position 350,1030;; cmd-later 1 click-element id channel-attach-upload-file') +config.bind('/', 'spawn ./scripts/discord_search.sh') + +#Preferences +config.set('window.title_format', 'Discord') +config.set('statusbar.widgets', ["keypress", "search_match", "history", "tabs", "progress"]) +config.set('tabs.show', 'never') +config.set('completion.scrollbar.width', 0) +config.set('tabs.indicator.width', 0) +config.set('tabs.title.format', '{index}{audio}') +config.set('tabs.favicons.show', 'pinned') +config.set('tabs.title.alignment', 'center') +config.set('tabs.title.format_pinned', '{audio}{index}') + +config.set('content.unknown_url_scheme_policy', 'allow-all') + +#Search engines +c.url.searchengines = {'DEFAULT': 'https://searx.stellar-nexus.ru/searxng/search?q={}', +} +# 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://*/*') diff --git a/config/discord/quickmarks b/config/discord/quickmarks @@ -0,0 +1 @@ +v https://discord.com/channels/@me/1139169391997632612 diff --git a/config/htop/htoprc b/config/htop/htoprc @@ -0,0 +1,61 @@ +# Beware! This file is rewritten by htop when settings are changed in the interface. +# The parser is also very primitive, and not human-friendly. +htop_version=3.3.0 +config_reader_min_version=3 +fields=0 48 17 18 38 39 40 2 46 47 49 1 +hide_kernel_threads=1 +hide_userland_threads=0 +hide_running_in_container=0 +shadow_other_users=0 +show_thread_names=0 +show_program_path=1 +highlight_base_name=0 +highlight_deleted_exe=1 +shadow_distribution_path_prefix=0 +highlight_megabytes=1 +highlight_threads=1 +highlight_changes=0 +highlight_changes_delay_secs=5 +find_comm_in_cmdline=1 +strip_exe_from_cmdline=1 +show_merged_command=0 +header_margin=1 +screen_tabs=1 +detailed_cpu_time=0 +cpu_count_from_one=0 +show_cpu_usage=1 +show_cpu_frequency=0 +update_process_names=0 +account_guest_in_cpu_meter=0 +color_scheme=5 +enable_mouse=1 +delay=2 +hide_function_bar=0 +header_layout=two_50_50 +column_meters_0=LeftCPUs2 Memory Memory +column_meter_modes_0=1 1 1 +column_meters_1=RightCPUs2 NetworkIO Tasks +column_meter_modes_1=1 2 2 +tree_view=0 +sort_key=46 +tree_sort_key=0 +sort_direction=-1 +tree_sort_direction=1 +tree_view_always_by_pid=0 +all_branches_collapsed=0 +screen:Main=PID USER PRIORITY NICE M_VIRT M_RESIDENT M_SHARE STATE PERCENT_CPU PERCENT_MEM TIME Command +.sort_key=PERCENT_CPU +.tree_sort_key=PID +.tree_view_always_by_pid=0 +.tree_view=0 +.sort_direction=-1 +.tree_sort_direction=1 +.all_branches_collapsed=0 +screen:I/O=PID USER IO_PRIORITY IO_RATE IO_READ_RATE IO_WRITE_RATE Command +.sort_key=IO_RATE +.tree_sort_key=PID +.tree_view_always_by_pid=0 +.tree_view=0 +.sort_direction=-1 +.tree_sort_direction=1 +.all_branches_collapsed=0 diff --git a/config/mpv/mpv.conf b/config/mpv/mpv.conf @@ -0,0 +1,3 @@ +script-opts=ytdl_hook-ytdl_path=/bin/yt-dlp +demuxer-max-bytes=1024000KiB +title=mpv diff --git a/config/mpv/scripts/webm.lua b/config/mpv/scripts/webm.lua @@ -0,0 +1,3052 @@ +local mp = require("mp") +local assdraw = require("mp.assdraw") +local msg = require("mp.msg") +local utils = require("mp.utils") +local mpopts = require("mp.options") +local options = { + -- Defaults to shift+w + keybind = "W", + -- If empty, saves on the same directory of the playing video. + -- A starting "~" will be replaced by the home dir. + -- This field is delimited by double-square-brackets - [[ and ]] - instead of + -- quotes, because Windows users might run into a issue when using + -- backslashes as a path separator. Examples of valid inputs for this field + -- would be: [[]] (the default, empty value), [[C:\Users\John]] (on Windows), + -- and [[/home/john]] (on Unix-like systems eg. Linux). + -- The [[]] delimiter is not needed when using from a configuration file + -- in the script-opts folder. + output_directory = [[]], + run_detached = false, + -- Template string for the output file + -- %f - Filename, with extension + -- %F - Filename, without extension + -- %T - Media title, if it exists, or filename, with extension (useful for some streams, such as YouTube). + -- %s, %e - Start and end time, with milliseconds + -- %S, %E - Start and end time, without milliseconds + -- %M - "-audio", if audio is enabled, empty otherwise + -- %R - "-(height)p", where height is the video's height, or scale_height, if it's enabled. + -- More specifiers are supported, see https://mpv.io/manual/master/#options-screenshot-template + -- Property expansion is supported (with %{} at top level, ${} when nested), see https://mpv.io/manual/master/#property-expansion + output_template = "%F-[%s-%e]%M", + -- Scale video to a certain height, keeping the aspect ratio. -1 disables it. + scale_height = -1, + -- Change the FPS of the output video, dropping or duplicating frames as needed. + -- -1 means the FPS will be unchanged from the source. + fps = -1, + -- Target filesize, in kB. This will be used to calculate the bitrate + -- used on the encode. If this is set to <= 0, the video bitrate will be set + -- to 0, which might enable constant quality modes, depending on the + -- video codec that's used (VP8 and VP9, for example). + target_filesize = 2500, + -- If true, will use stricter flags to ensure the resulting file doesn't + -- overshoot the target filesize. Not recommended, as constrained quality + -- mode should work well, unless you're really having trouble hitting + -- the target size. + strict_filesize_constraint = false, + strict_bitrate_multiplier = 0.95, + -- In kilobits. + strict_audio_bitrate = 64, + -- Sets the output format, from a few predefined ones. + -- Currently we have: + -- av1 + -- hevc + -- webm-vp9 (libvpx-vp9/libopus) + -- avc (h264/AAC) + -- avc-nvenc (h264-NVENC/AAC) + -- webm-vp8 (libvpx/libvorbis) + -- gif + -- mp3 (libmp3lame) + -- and raw (rawvideo/pcm_s16le). + output_format = "webm-vp8", + twopass = true, + -- If set, applies the video filters currently used on the playback to the encode. + apply_current_filters = true, + -- If set, writes the video's filename to the "Title" field on the metadata. + write_filename_on_metadata = false, + -- Set the number of encoding threads, for codecs libvpx and libvpx-vp9 + threads = 4, + additional_flags = "", + -- Constant Rate Factor (CRF). The value meaning and limits may change, + -- from codec to codec. Set to -1 to disable. + crf = 10, + -- Useful for flags that may impact output filesize, such as qmin, qmax etc + -- Won't be applied when strict_filesize_constraint is on. + non_strict_additional_flags = "", + -- Display the encode progress, in %. Requires run_detached to be disabled. + -- On Windows, it shows a cmd popup. "auto" will display progress on non-Windows platforms. + display_progress = "auto", + -- The font size used in the menu. Isn't used for the notifications (started encode, finished encode etc) + font_size = 28, + margin = 10, + message_duration = 5, + -- gif dither mode, 0-5 for bayer w/ bayer_scale 0-5, 6 for paletteuse default (sierra2_4a) + gif_dither = 2, + -- Force square pixels on output video + -- Some players like recent Firefox versions display videos with non-square pixels with wrong aspect ratio + force_square_pixels = false, +} + +mpopts.read_options(options) +local base64_chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +-- encoding +function base64_encode(data) + return ((data:gsub('.', function(x) + local r,b='',x:byte() + for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end + return r; + end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) + if (#x < 6) then return '' end + local c=0 + for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end + return base64_chars:sub(c+1,c+1) + end)..({ '', '==', '=' })[#data%3+1]) +end + +-- decoding +function base64_decode(data) + data = string.gsub(data, '[^'..base64_chars..'=]', '') + return (data:gsub('.', function(x) + if (x == '=') then return '' end + local r,f='',(base64_chars:find(x)-1) + for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then return '' end + local c=0 + for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end + return string.char(c) + end)) +end +local emit_event +emit_event = function(event_name, ...) + return mp.commandv("script-message", "webm-" .. tostring(event_name), ...) +end +local test_set_options +test_set_options = function(new_options_json) + local new_options = utils.parse_json(new_options_json) + for k, v in pairs(new_options) do + options[k] = v + end +end +mp.register_script_message("mpv-webm-set-options", test_set_options) +local bold +bold = function(text) + return "{\\b1}" .. tostring(text) .. "{\\b0}" +end +local message +message = function(text, duration) + local ass = mp.get_property_osd("osd-ass-cc/0") + ass = ass .. text + return mp.osd_message(ass, duration or options.message_duration) +end +local append +append = function(a, b) + for _, val in ipairs(b) do + a[#a + 1] = val + end + return a +end +local seconds_to_time_string +seconds_to_time_string = function(seconds, no_ms, full) + if seconds < 0 then + return "unknown" + end + local ret = "" + if not (no_ms) then + ret = string.format(".%03d", seconds * 1000 % 1000) + end + ret = string.format("%02d:%02d%s", math.floor(seconds / 60) % 60, math.floor(seconds) % 60, ret) + if full or seconds > 3600 then + ret = string.format("%d:%s", math.floor(seconds / 3600), ret) + end + return ret +end +local seconds_to_path_element +seconds_to_path_element = function(seconds, no_ms, full) + local time_string = seconds_to_time_string(seconds, no_ms, full) + local _ + time_string, _ = time_string:gsub(":", ".") + return time_string +end +local file_exists +file_exists = function(name) + local info, err = utils.file_info(name) + if info ~= nil then + return true + end + return false +end +local expand_properties +expand_properties = function(text, magic) + if magic == nil then + magic = "$" + end + for prefix, raw, prop, colon, fallback, closing in text:gmatch("%" .. magic .. "{([?!]?)(=?)([^}:]*)(:?)([^}]*)(}*)}") do + local err + local prop_value + local compare_value + local original_prop = prop + local get_property = mp.get_property_osd + if raw == "=" then + get_property = mp.get_property + end + if prefix ~= "" then + for actual_prop, compare in prop:gmatch("(.-)==(.*)") do + prop = actual_prop + compare_value = compare + end + end + if colon == ":" then + prop_value, err = get_property(prop, fallback) + else + prop_value, err = get_property(prop, "(error)") + end + prop_value = tostring(prop_value) + if prefix == "?" then + if compare_value == nil then + prop_value = err == nil and fallback .. closing or "" + else + prop_value = prop_value == compare_value and fallback .. closing or "" + end + prefix = "%" .. prefix + elseif prefix == "!" then + if compare_value == nil then + prop_value = err ~= nil and fallback .. closing or "" + else + prop_value = prop_value ~= compare_value and fallback .. closing or "" + end + else + prop_value = prop_value .. closing + end + if colon == ":" then + local _ + text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. ":" .. fallback:gsub("%W", "%%%1") .. closing .. "}", expand_properties(prop_value)) + else + local _ + text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. closing .. "}", prop_value) + end + end + return text +end +local format_filename +format_filename = function(startTime, endTime, videoFormat) + local hasAudioCodec = videoFormat.audioCodec ~= "" + local replaceFirst = { + ["%%mp"] = "%%mH.%%mM.%%mS", + ["%%mP"] = "%%mH.%%mM.%%mS.%%mT", + ["%%p"] = "%%wH.%%wM.%%wS", + ["%%P"] = "%%wH.%%wM.%%wS.%%wT" + } + local replaceTable = { + ["%%wH"] = string.format("%02d", math.floor(startTime / (60 * 60))), + ["%%wh"] = string.format("%d", math.floor(startTime / (60 * 60))), + ["%%wM"] = string.format("%02d", math.floor(startTime / 60 % 60)), + ["%%wm"] = string.format("%d", math.floor(startTime / 60)), + ["%%wS"] = string.format("%02d", math.floor(startTime % 60)), + ["%%ws"] = string.format("%d", math.floor(startTime)), + ["%%wf"] = string.format("%s", startTime), + ["%%wT"] = string.sub(string.format("%.3f", startTime % 1), 3), + ["%%mH"] = string.format("%02d", math.floor(endTime / (60 * 60))), + ["%%mh"] = string.format("%d", math.floor(endTime / (60 * 60))), + ["%%mM"] = string.format("%02d", math.floor(endTime / 60 % 60)), + ["%%mm"] = string.format("%d", math.floor(endTime / 60)), + ["%%mS"] = string.format("%02d", math.floor(endTime % 60)), + ["%%ms"] = string.format("%d", math.floor(endTime)), + ["%%mf"] = string.format("%s", endTime), + ["%%mT"] = string.sub(string.format("%.3f", endTime % 1), 3), + ["%%f"] = mp.get_property("filename"), + ["%%F"] = mp.get_property("filename/no-ext"), + ["%%s"] = seconds_to_path_element(startTime), + ["%%S"] = seconds_to_path_element(startTime, true), + ["%%e"] = seconds_to_path_element(endTime), + ["%%E"] = seconds_to_path_element(endTime, true), + ["%%T"] = mp.get_property("media-title"), + ["%%M"] = (mp.get_property_native('aid') and not mp.get_property_native('mute') and hasAudioCodec) and '-audio' or '', + ["%%R"] = (options.scale_height ~= -1) and "-" .. tostring(options.scale_height) .. "p" or "-" .. tostring(mp.get_property_native('height')) .. "p", + ["%%mb"] = options.target_filesize / 1000, + ["%%t%%"] = "%%" + } + local filename = options.output_template + for format, value in pairs(replaceFirst) do + local _ + filename, _ = filename:gsub(format, value) + end + for format, value in pairs(replaceTable) do + local _ + filename, _ = filename:gsub(format, value) + end + if mp.get_property_bool("demuxer-via-network", false) then + local _ + filename, _ = filename:gsub("%%X{([^}]*)}", "%1") + filename, _ = filename:gsub("%%x", "") + else + local x = string.gsub(mp.get_property("stream-open-filename", ""), string.gsub(mp.get_property("filename", ""), "%W", "%%%1") .. "$", "") + local _ + filename, _ = filename:gsub("%%X{[^}]*}", x) + filename, _ = filename:gsub("%%x", x) + end + filename = expand_properties(filename, "%") + for format in filename:gmatch("%%t([aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ])") do + local _ + filename, _ = filename:gsub("%%t" .. format, os.date("%" .. format)) + end + local _ + filename, _ = filename:gsub("[<>:\"/\\|?*]", "") + return tostring(filename) .. "." .. tostring(videoFormat.outputExtension) +end +local parse_directory +parse_directory = function(dir) + local home_dir = os.getenv("HOME") + if not home_dir then + home_dir = os.getenv("USERPROFILE") + end + if not home_dir then + local drive = os.getenv("HOMEDRIVE") + local path = os.getenv("HOMEPATH") + if drive and path then + home_dir = utils.join_path(drive, path) + else + msg.warn("Couldn't find home dir.") + home_dir = "" + end + end + local _ + dir, _ = dir:gsub("^~", home_dir) + return dir +end +local is_windows = type(package) == "table" and type(package.config) == "string" and package.config:sub(1, 1) == "\\" +local trim +trim = function(s) + return s:match("^%s*(.-)%s*$") +end +local get_null_path +get_null_path = function() + if file_exists("/dev/null") then + return "/dev/null" + end + return "NUL" +end +local run_subprocess +run_subprocess = function(params) + local res = utils.subprocess(params) + msg.verbose("Command stdout: ") + msg.verbose(res.stdout) + if res.status ~= 0 then + msg.verbose("Command failed! Reason: ", res.error, " Killed by us? ", res.killed_by_us and "yes" or "no") + return false + end + return true +end +local shell_escape +shell_escape = function(args) + local ret = { } + for i, a in ipairs(args) do + local s = tostring(a) + if string.match(s, "[^A-Za-z0-9_/:=-]") then + if is_windows then + s = '"' .. string.gsub(s, '"', '"\\""') .. '"' + else + s = "'" .. string.gsub(s, "'", "'\\''") .. "'" + end + end + table.insert(ret, s) + end + local concat = table.concat(ret, " ") + if is_windows then + concat = '"' .. concat .. '"' + end + return concat +end +local run_subprocess_popen +run_subprocess_popen = function(command_line) + local command_line_string = shell_escape(command_line) + command_line_string = command_line_string .. " 2>&1" + msg.verbose("run_subprocess_popen: running " .. tostring(command_line_string)) + return io.popen(command_line_string) +end +local calculate_scale_factor +calculate_scale_factor = function() + local baseResY = 720 + local osd_w, osd_h = mp.get_osd_size() + return osd_h / baseResY +end +local should_display_progress +should_display_progress = function() + if options.display_progress == "auto" then + return not is_windows + end + return options.display_progress +end +local reverse +reverse = function(list) + local _accum_0 = { } + local _len_0 = 1 + local _max_0 = 1 + for _index_0 = #list, _max_0 < 0 and #list + _max_0 or _max_0, -1 do + local element = list[_index_0] + _accum_0[_len_0] = element + _len_0 = _len_0 + 1 + end + return _accum_0 +end +local get_pass_logfile_path +get_pass_logfile_path = function(encode_out_path) + return tostring(encode_out_path) .. "-video-pass1.log" +end +local dimensions_changed = true +local _video_dimensions = { } +local get_video_dimensions +get_video_dimensions = function() + if not (dimensions_changed) then + return _video_dimensions + end + local video_params = mp.get_property_native("video-out-params") + if not video_params then + return nil + end + dimensions_changed = false + local keep_aspect = mp.get_property_bool("keepaspect") + local w = video_params["w"] + local h = video_params["h"] + local dw = video_params["dw"] + local dh = video_params["dh"] + if mp.get_property_number("video-rotate") % 180 == 90 then + w, h = h, w + dw, dh = dh, dw + end + _video_dimensions = { + top_left = { }, + bottom_right = { }, + ratios = { } + } + local window_w, window_h = mp.get_osd_size() + if keep_aspect then + local unscaled = mp.get_property_native("video-unscaled") + local panscan = mp.get_property_number("panscan") + local fwidth = window_w + local fheight = math.floor(window_w / dw * dh) + if fheight > window_h or fheight < h then + local tmpw = math.floor(window_h / dh * dw) + if tmpw <= window_w then + fheight = window_h + fwidth = tmpw + end + end + local vo_panscan_area = window_h - fheight + local f_w = fwidth / fheight + local f_h = 1 + if vo_panscan_area == 0 then + vo_panscan_area = window_h - fwidth + f_w = 1 + f_h = fheight / fwidth + end + if unscaled or unscaled == "downscale-big" then + vo_panscan_area = 0 + if unscaled or (dw <= window_w and dh <= window_h) then + fwidth = dw + fheight = dh + end + end + local scaled_width = fwidth + math.floor(vo_panscan_area * panscan * f_w) + local scaled_height = fheight + math.floor(vo_panscan_area * panscan * f_h) + local split_scaling + split_scaling = function(dst_size, scaled_src_size, zoom, align, pan) + scaled_src_size = math.floor(scaled_src_size * 2 ^ zoom) + align = (align + 1) / 2 + local dst_start = math.floor((dst_size - scaled_src_size) * align + pan * scaled_src_size) + if dst_start < 0 then + dst_start = dst_start + 1 + end + local dst_end = dst_start + scaled_src_size + if dst_start >= dst_end then + dst_start = 0 + dst_end = 1 + end + return dst_start, dst_end + end + local zoom = mp.get_property_number("video-zoom") + local align_x = mp.get_property_number("video-align-x") + local pan_x = mp.get_property_number("video-pan-x") + _video_dimensions.top_left.x, _video_dimensions.bottom_right.x = split_scaling(window_w, scaled_width, zoom, align_x, pan_x) + local align_y = mp.get_property_number("video-align-y") + local pan_y = mp.get_property_number("video-pan-y") + _video_dimensions.top_left.y, _video_dimensions.bottom_right.y = split_scaling(window_h, scaled_height, zoom, align_y, pan_y) + else + _video_dimensions.top_left.x = 0 + _video_dimensions.bottom_right.x = window_w + _video_dimensions.top_left.y = 0 + _video_dimensions.bottom_right.y = window_h + end + _video_dimensions.ratios.w = w / (_video_dimensions.bottom_right.x - _video_dimensions.top_left.x) + _video_dimensions.ratios.h = h / (_video_dimensions.bottom_right.y - _video_dimensions.top_left.y) + return _video_dimensions +end +local set_dimensions_changed +set_dimensions_changed = function() + dimensions_changed = true +end +local monitor_dimensions +monitor_dimensions = function() + local properties = { + "keepaspect", + "video-out-params", + "video-unscaled", + "panscan", + "video-zoom", + "video-align-x", + "video-pan-x", + "video-align-y", + "video-pan-y", + "osd-width", + "osd-height" + } + for _, p in ipairs(properties) do + mp.observe_property(p, "native", set_dimensions_changed) + end +end +local clamp +clamp = function(min, val, max) + if val <= min then + return min + end + if val >= max then + return max + end + return val +end +local clamp_point +clamp_point = function(top_left, point, bottom_right) + return { + x = clamp(top_left.x, point.x, bottom_right.x), + y = clamp(top_left.y, point.y, bottom_right.y) + } +end +local VideoPoint +do + local _class_0 + local _base_0 = { + set_from_screen = function(self, sx, sy) + local d = get_video_dimensions() + local point = clamp_point(d.top_left, { + x = sx, + y = sy + }, d.bottom_right) + self.x = math.floor(d.ratios.w * (point.x - d.top_left.x) + 0.5) + self.y = math.floor(d.ratios.h * (point.y - d.top_left.y) + 0.5) + end, + to_screen = function(self) + local d = get_video_dimensions() + return { + x = math.floor(self.x / d.ratios.w + d.top_left.x + 0.5), + y = math.floor(self.y / d.ratios.h + d.top_left.y + 0.5) + } + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function(self) + self.x = -1 + self.y = -1 + end, + __base = _base_0, + __name = "VideoPoint" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + VideoPoint = _class_0 +end +local Region +do + local _class_0 + local _base_0 = { + is_valid = function(self) + return self.x > -1 and self.y > -1 and self.w > -1 and self.h > -1 + end, + set_from_points = function(self, p1, p2) + self.x = math.min(p1.x, p2.x) + self.y = math.min(p1.y, p2.y) + self.w = math.abs(p1.x - p2.x) + self.h = math.abs(p1.y - p2.y) + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function(self) + self.x = -1 + self.y = -1 + self.w = -1 + self.h = -1 + end, + __base = _base_0, + __name = "Region" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Region = _class_0 +end +local make_fullscreen_region +make_fullscreen_region = function() + local r = Region() + local d = get_video_dimensions() + local a = VideoPoint() + local b = VideoPoint() + local xa, ya + do + local _obj_0 = d.top_left + xa, ya = _obj_0.x, _obj_0.y + end + a:set_from_screen(xa, ya) + local xb, yb + do + local _obj_0 = d.bottom_right + xb, yb = _obj_0.x, _obj_0.y + end + b:set_from_screen(xb, yb) + r:set_from_points(a, b) + return r +end +local read_double +read_double = function(bytes) + local sign = 1 + local mantissa = bytes[2] % 2 ^ 4 + for i = 3, 8 do + mantissa = mantissa * 256 + bytes[i] + end + if bytes[1] > 127 then + sign = -1 + end + local exponent = (bytes[1] % 128) * 2 ^ 4 + math.floor(bytes[2] / 2 ^ 4) + if exponent == 0 then + return 0 + end + mantissa = (math.ldexp(mantissa, -52) + 1) * sign + return math.ldexp(mantissa, exponent - 1023) +end +local write_double +write_double = function(num) + local bytes = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + if num == 0 then + return bytes + end + local anum = math.abs(num) + local mantissa, exponent = math.frexp(anum) + exponent = exponent - 1 + mantissa = mantissa * 2 - 1 + local sign = num ~= anum and 128 or 0 + exponent = exponent + 1023 + bytes[1] = sign + math.floor(exponent / 2 ^ 4) + mantissa = mantissa * 2 ^ 4 + local currentmantissa = math.floor(mantissa) + mantissa = mantissa - currentmantissa + bytes[2] = (exponent % 2 ^ 4) * 2 ^ 4 + currentmantissa + for i = 3, 8 do + mantissa = mantissa * 2 ^ 8 + currentmantissa = math.floor(mantissa) + mantissa = mantissa - currentmantissa + bytes[i] = currentmantissa + end + return bytes +end +local FirstpassStats +do + local _class_0 + local duration_multiplier, fields_before_duration, fields_after_duration + local _base_0 = { + get_duration = function(self) + local big_endian_binary_duration = reverse(self.binary_duration) + return read_double(reversed_binary_duration) / duration_multiplier + end, + set_duration = function(self, duration) + local big_endian_binary_duration = write_double(duration * duration_multiplier) + self.binary_duration = reverse(big_endian_binary_duration) + end, + _bytes_to_string = function(self, bytes) + return string.char(unpack(bytes)) + end, + as_binary_string = function(self) + local before_duration_string = self:_bytes_to_string(self.binary_data_before_duration) + local duration_string = self:_bytes_to_string(self.binary_duration) + local after_duration_string = self:_bytes_to_string(self.binary_data_after_duration) + return before_duration_string .. duration_string .. after_duration_string + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function(self, before_duration, duration, after_duration) + self.binary_data_before_duration = before_duration + self.binary_duration = duration + self.binary_data_after_duration = after_duration + end, + __base = _base_0, + __name = "FirstpassStats" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + local self = _class_0 + duration_multiplier = 10000000.0 + fields_before_duration = 16 + fields_after_duration = 1 + self.data_before_duration_size = function(self) + return fields_before_duration * 8 + end + self.data_after_duration_size = function(self) + return fields_after_duration * 8 + end + self.size = function(self) + return (fields_before_duration + 1 + fields_after_duration) * 8 + end + self.from_bytes = function(self, bytes) + local before_duration + do + local _accum_0 = { } + local _len_0 = 1 + local _max_0 = self:data_before_duration_size() + for _index_0 = 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do + local b = bytes[_index_0] + _accum_0[_len_0] = b + _len_0 = _len_0 + 1 + end + before_duration = _accum_0 + end + local duration + do + local _accum_0 = { } + local _len_0 = 1 + local _max_0 = self:data_before_duration_size() + 8 + for _index_0 = self:data_before_duration_size() + 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do + local b = bytes[_index_0] + _accum_0[_len_0] = b + _len_0 = _len_0 + 1 + end + duration = _accum_0 + end + local after_duration + do + local _accum_0 = { } + local _len_0 = 1 + for _index_0 = self:data_before_duration_size() + 8 + 1, #bytes do + local b = bytes[_index_0] + _accum_0[_len_0] = b + _len_0 = _len_0 + 1 + end + after_duration = _accum_0 + end + return self(before_duration, duration, after_duration) + end + FirstpassStats = _class_0 +end +local read_logfile_into_stats_array +read_logfile_into_stats_array = function(logfile_path) + local file = assert(io.open(logfile_path, "rb")) + local logfile_string = base64_decode(file:read()) + file:close() + local stats_size = FirstpassStats:size() + assert(logfile_string:len() % stats_size == 0) + local stats = { } + for offset = 1, #logfile_string, stats_size do + local bytes = { + logfile_string:byte(offset, offset + stats_size - 1) + } + assert(#bytes == stats_size) + stats[#stats + 1] = FirstpassStats:from_bytes(bytes) + end + return stats +end +local write_stats_array_to_logfile +write_stats_array_to_logfile = function(stats_array, logfile_path) + local file = assert(io.open(logfile_path, "wb")) + local logfile_string = "" + for _index_0 = 1, #stats_array do + local stat = stats_array[_index_0] + logfile_string = logfile_string .. stat:as_binary_string() + end + file:write(base64_encode(logfile_string)) + return file:close() +end +local vp8_patch_logfile +vp8_patch_logfile = function(logfile_path, encode_total_duration) + local stats_array = read_logfile_into_stats_array(logfile_path) + local average_duration = encode_total_duration / (#stats_array - 1) + for i = 1, #stats_array - 1 do + stats_array[i]:set_duration(average_duration) + end + stats_array[#stats_array]:set_duration(encode_total_duration) + return write_stats_array_to_logfile(stats_array, logfile_path) +end +local formats = { } +local Format +do + local _class_0 + local _base_0 = { + getPreFilters = function(self) + return { } + end, + getPostFilters = function(self) + return { } + end, + getFlags = function(self) + return { } + end, + getCodecFlags = function(self) + local codecs = { } + if self.videoCodec ~= "" then + codecs[#codecs + 1] = "--ovc=" .. tostring(self.videoCodec) + end + if self.audioCodec ~= "" then + codecs[#codecs + 1] = "--oac=" .. tostring(self.audioCodec) + end + return codecs + end, + postCommandModifier = function(self, command, region, startTime, endTime) + return command + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "Basic" + self.supportsTwopass = true + self.videoCodec = "" + self.audioCodec = "" + self.outputExtension = "" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "Format" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Format = _class_0 +end +local RawVideo +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getColorspace = function(self) + local csp = mp.get_property("colormatrix") + local _exp_0 = csp + if "bt.601" == _exp_0 then + return "bt601" + elseif "bt.709" == _exp_0 then + return "bt709" + elseif "bt.2020" == _exp_0 then + return "bt2020" + elseif "smpte-240m" == _exp_0 then + return "smpte240m" + else + msg.info("Warning, unknown colorspace " .. tostring(csp) .. " detected, using bt.601.") + return "bt601" + end + end, + getPostFilters = function(self) + return { + "format=yuv444p16", + "lavfi-scale=in_color_matrix=" .. self:getColorspace(), + "format=bgr24" + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "Raw" + self.supportsTwopass = false + self.videoCodec = "rawvideo" + self.audioCodec = "pcm_s16le" + self.outputExtension = "avi" + self.acceptsBitrate = false + end, + __base = _base_0, + __name = "RawVideo", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + RawVideo = _class_0 +end +formats["raw"] = RawVideo() +local WebmVP8 +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getPreFilters = function(self) + local colormatrixFilter = { + ["bt.709"] = "bt709", + ["bt.2020"] = "bt2020", + ["smpte-240m"] = "smpte240m" + } + local ret = { } + local colormatrix = mp.get_property_native("video-params/colormatrix") + if colormatrixFilter[colormatrix] then + append(ret, { + "lavfi-colormatrix=" .. tostring(colormatrixFilter[colormatrix]) .. ":bt601" + }) + end + return ret + end, + getFlags = function(self) + return { + "--ovcopts-add=threads=" .. tostring(options.threads), + "--ovcopts-add=auto-alt-ref=1", + "--ovcopts-add=lag-in-frames=25", + "--ovcopts-add=quality=good", + "--ovcopts-add=cpu-used=0" + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "WebM" + self.supportsTwopass = true + self.videoCodec = "libvpx" + self.audioCodec = "libvorbis" + self.outputExtension = "webm" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "WebmVP8", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + WebmVP8 = _class_0 +end +formats["webm-vp8"] = WebmVP8() +local WebmVP9 +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getFlags = function(self) + return { + "--ovcopts-add=threads=" .. tostring(options.threads) + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "WebM (VP9)" + self.supportsTwopass = false + self.videoCodec = "libvpx-vp9" + self.audioCodec = "libopus" + self.outputExtension = "webm" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "WebmVP9", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + WebmVP9 = _class_0 +end +formats["webm-vp9"] = WebmVP9() +local AVC +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getFlags = function(self) + return { + "--ovcopts-add=threads=" .. tostring(options.threads) + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "AVC (h264/AAC)" + self.supportsTwopass = true + self.videoCodec = "libx264" + self.audioCodec = "aac" + self.outputExtension = "mp4" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "AVC", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + AVC = _class_0 +end +formats["avc"] = AVC() +local AVCNVENC +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getFlags = function(self) + return { + "--ovcopts-add=bf=0" + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "AVC (h264-NVENC/AAC)" + self.supportsTwopass = true + self.videoCodec = "h264_nvenc" + self.audioCodec = "aac" + self.outputExtension = "mp4" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "AVCNVENC", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + AVCNVENC = _class_0 +end +formats["avc-nvenc"] = AVCNVENC() +local AV1 +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getFlags = function(self) + return { + "--ovcopts-add=threads=" .. tostring(options.threads) + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "AV1" + self.supportsTwopass = true + self.videoCodec = "libaom-av1" + self.audioCodec = "aac" + self.outputExtension = "mp4" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "AV1", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + AV1 = _class_0 +end +formats["av1"] = AV1() +local HEVC +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + getFlags = function(self) + return { + "--ovcopts-add=threads=" .. tostring(options.threads) + } + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "HEVC" + self.supportsTwopass = true + self.videoCodec = "libx265" + self.audioCodec = "aac" + self.outputExtension = "mp4" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "HEVC", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + HEVC = _class_0 +end +formats["hevc"] = HEVC() +local MP3 +do + local _class_0 + local _parent_0 = Format + local _base_0 = { } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "MP3 (libmp3lame)" + self.supportsTwopass = false + self.videoCodec = "" + self.audioCodec = "libmp3lame" + self.outputExtension = "mp3" + self.acceptsBitrate = true + end, + __base = _base_0, + __name = "MP3", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + MP3 = _class_0 +end +formats["mp3"] = MP3() +local GIF +do + local _class_0 + local _parent_0 = Format + local _base_0 = { + postCommandModifier = function(self, command, region, startTime, endTime) + local new_command = { } + local start_ts = seconds_to_time_string(startTime, false, true) + local end_ts = seconds_to_time_string(endTime, false, true) + start_ts = start_ts:gsub(":", "\\\\:") + end_ts = end_ts:gsub(":", "\\\\:") + local cfilter = "[vid1]trim=start=" .. tostring(start_ts) .. ":end=" .. tostring(end_ts) .. "[vidtmp];" + if mp.get_property("deinterlace") == "yes" then + cfilter = cfilter .. "[vidtmp]yadif=mode=1[vidtmp];" + end + for _, v in ipairs(command) do + local _continue_0 = false + repeat + if v:match("^%-%-vf%-add=lavfi%-scale") or v:match("^%-%-vf%-add=lavfi%-crop") or v:match("^%-%-vf%-add=fps") or v:match("^%-%-vf%-add=lavfi%-eq") then + local n = v:gsub("^%-%-vf%-add=", ""):gsub("^lavfi%-", "") + cfilter = cfilter .. "[vidtmp]" .. tostring(n) .. "[vidtmp];" + else + if v:match("^%-%-video%-rotate=90") then + cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];" + else + if v:match("^%-%-video%-rotate=270") then + cfilter = cfilter .. "[vidtmp]transpose=2[vidtmp];" + else + if v:match("^%-%-video%-rotate=180") then + cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];[vidtmp]transpose=1[vidtmp];" + else + if v:match("^%-%-deinterlace=") then + _continue_0 = true + break + else + append(new_command, { + v + }) + _continue_0 = true + break + end + end + end + end + end + _continue_0 = true + until true + if not _continue_0 then + break + end + end + cfilter = cfilter .. "[vidtmp]split[topal][vidf];" + cfilter = cfilter .. "[topal]palettegen[pal];" + cfilter = cfilter .. "[vidf][pal]paletteuse=diff_mode=rectangle" + if options.gif_dither ~= 6 then + cfilter = cfilter .. ":dither=bayer:bayer_scale=" .. tostring(options.gif_dither) + end + cfilter = cfilter .. "[vo]" + append(new_command, { + "--lavfi-complex=" .. tostring(cfilter) + }) + return new_command + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.displayName = "GIF" + self.supportsTwopass = false + self.videoCodec = "gif" + self.audioCodec = "" + self.outputExtension = "gif" + self.acceptsBitrate = false + end, + __base = _base_0, + __name = "GIF", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + GIF = _class_0 +end +formats["gif"] = GIF() +local Page +do + local _class_0 + local _base_0 = { + add_keybinds = function(self) + if not self.keybinds then + return + end + for key, func in pairs(self.keybinds) do + mp.add_forced_key_binding(key, key, func, { + repeatable = true + }) + end + end, + remove_keybinds = function(self) + if not self.keybinds then + return + end + for key, _ in pairs(self.keybinds) do + mp.remove_key_binding(key) + end + end, + observe_properties = function(self) + self.sizeCallback = function() + return self:draw() + end + local properties = { + "keepaspect", + "video-out-params", + "video-unscaled", + "panscan", + "video-zoom", + "video-align-x", + "video-pan-x", + "video-align-y", + "video-pan-y", + "osd-width", + "osd-height" + } + for _index_0 = 1, #properties do + local p = properties[_index_0] + mp.observe_property(p, "native", self.sizeCallback) + end + end, + unobserve_properties = function(self) + if self.sizeCallback then + mp.unobserve_property(self.sizeCallback) + self.sizeCallback = nil + end + end, + clear = function(self) + local window_w, window_h = mp.get_osd_size() + mp.set_osd_ass(window_w, window_h, "") + return mp.osd_message("", 0) + end, + prepare = function(self) + return nil + end, + dispose = function(self) + return nil + end, + show = function(self) + if self.visible then + return + end + self.visible = true + self:observe_properties() + self:add_keybinds() + self:prepare() + self:clear() + return self:draw() + end, + hide = function(self) + if not self.visible then + return + end + self.visible = false + self:unobserve_properties() + self:remove_keybinds() + self:clear() + return self:dispose() + end, + setup_text = function(self, ass) + local scale = calculate_scale_factor() + local margin = options.margin * scale + ass:append("{\\an7}") + ass:pos(margin, margin) + return ass:append("{\\fs" .. tostring(options.font_size * scale) .. "}") + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function() end, + __base = _base_0, + __name = "Page" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Page = _class_0 +end +local EncodeWithProgress +do + local _class_0 + local _parent_0 = Page + local _base_0 = { + draw = function(self) + local progress = 100 * ((self.currentTime - self.startTime) / self.duration) + local progressText = string.format("%d%%", progress) + local window_w, window_h = mp.get_osd_size() + local ass = assdraw.ass_new() + ass:new_event() + self:setup_text(ass) + ass:append("Encoding (" .. tostring(bold(progressText)) .. ")\\N") + return mp.set_osd_ass(window_w, window_h, ass.text) + end, + parseLine = function(self, line) + local matchTime = string.match(line, "Encode time[-]pos: ([0-9.]+)") + local matchExit = string.match(line, "Exiting... [(]([%a ]+)[)]") + if matchTime == nil and matchExit == nil then + return + end + if matchTime ~= nil and tonumber(matchTime) > self.currentTime then + self.currentTime = tonumber(matchTime) + end + if matchExit ~= nil then + self.finished = true + self.finishedReason = matchExit + end + end, + startEncode = function(self, command_line) + local copy_command_line + do + local _accum_0 = { } + local _len_0 = 1 + for _index_0 = 1, #command_line do + local arg = command_line[_index_0] + _accum_0[_len_0] = arg + _len_0 = _len_0 + 1 + end + copy_command_line = _accum_0 + end + append(copy_command_line, { + '--term-status-msg=Encode time-pos: ${=time-pos}\\n' + }) + self:show() + local processFd = run_subprocess_popen(copy_command_line) + for line in processFd:lines() do + msg.verbose(string.format('%q', line)) + self:parseLine(line) + self:draw() + end + processFd:close() + self:hide() + if self.finishedReason == "End of file" then + return true + end + return false + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self, startTime, endTime) + self.startTime = startTime + self.endTime = endTime + self.duration = endTime - startTime + self.currentTime = startTime + end, + __base = _base_0, + __name = "EncodeWithProgress", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + EncodeWithProgress = _class_0 +end +local get_active_tracks +get_active_tracks = function() + local accepted = { + video = true, + audio = not mp.get_property_bool("mute"), + sub = mp.get_property_bool("sub-visibility") + } + local active = { + video = { }, + audio = { }, + sub = { } + } + for _, track in ipairs(mp.get_property_native("track-list")) do + if track["selected"] and accepted[track["type"]] then + local count = #active[track["type"]] + active[track["type"]][count + 1] = track + end + end + return active +end +local filter_tracks_supported_by_format +filter_tracks_supported_by_format = function(active_tracks, format) + local has_video_codec = format.videoCodec ~= "" + local has_audio_codec = format.audioCodec ~= "" + local supported = { + video = has_video_codec and active_tracks["video"] or { }, + audio = has_audio_codec and active_tracks["audio"] or { }, + sub = has_video_codec and active_tracks["sub"] or { } + } + return supported +end +local append_track +append_track = function(out, track) + local external_flag = { + ["audio"] = "audio-file", + ["sub"] = "sub-file" + } + local internal_flag = { + ["video"] = "vid", + ["audio"] = "aid", + ["sub"] = "sid" + } + if track['external'] and string.len(track['external-filename']) <= 2048 then + return append(out, { + "--" .. tostring(external_flag[track['type']]) .. "=" .. tostring(track['external-filename']) + }) + else + return append(out, { + "--" .. tostring(internal_flag[track['type']]) .. "=" .. tostring(track['id']) + }) + end +end +local append_audio_tracks +append_audio_tracks = function(out, tracks) + local internal_tracks = { } + for _index_0 = 1, #tracks do + local track = tracks[_index_0] + if track['external'] then + append_track(out, track) + else + append(internal_tracks, { + track + }) + end + end + if #internal_tracks > 1 then + local filter_string = "" + for _index_0 = 1, #internal_tracks do + local track = internal_tracks[_index_0] + filter_string = filter_string .. "[aid" .. tostring(track['id']) .. "]" + end + filter_string = filter_string .. "amix[ao]" + return append(out, { + "--lavfi-complex=" .. tostring(filter_string) + }) + else + if #internal_tracks == 1 then + return append_track(out, internal_tracks[1]) + end + end +end +local get_scale_filters +get_scale_filters = function() + local filters = { } + if options.force_square_pixels then + append(filters, { + "lavfi-scale=iw*sar:ih" + }) + end + if options.scale_height > 0 then + append(filters, { + "lavfi-scale=-2:" .. tostring(options.scale_height) + }) + end + return filters +end +local get_fps_filters +get_fps_filters = function() + if options.fps > 0 then + return { + "fps=" .. tostring(options.fps) + } + end + return { } +end +local get_contrast_brightness_and_saturation_filters +get_contrast_brightness_and_saturation_filters = function() + local mpv_brightness = mp.get_property("brightness") + local mpv_contrast = mp.get_property("contrast") + local mpv_saturation = mp.get_property("saturation") + if mpv_brightness == 0 and mpv_contrast == 0 and mpv_saturation == 0 then + return { } + end + local eq_saturation = (mpv_saturation + 100) / 100.0 + local eq_contrast = (mpv_contrast + 100) / 100.0 + local eq_brightness = (mpv_brightness / 50.0 + eq_contrast - 1) / 2.0 + return { + "lavfi-eq=contrast=" .. tostring(eq_contrast) .. ":saturation=" .. tostring(eq_saturation) .. ":brightness=" .. tostring(eq_brightness) + } +end +local append_property +append_property = function(out, property_name, option_name) + option_name = option_name or property_name + local prop = mp.get_property(property_name) + if prop and prop ~= "" then + return append(out, { + "--" .. tostring(option_name) .. "=" .. tostring(prop) + }) + end +end +local append_list_options +append_list_options = function(out, property_name, option_prefix) + option_prefix = option_prefix or property_name + local prop = mp.get_property_native(property_name) + if prop then + for _index_0 = 1, #prop do + local value = prop[_index_0] + append(out, { + "--" .. tostring(option_prefix) .. "-append=" .. tostring(value) + }) + end + end +end +local get_playback_options +get_playback_options = function() + local ret = { } + append_property(ret, "sub-ass-override") + append_property(ret, "sub-ass-force-style") + append_property(ret, "sub-ass-vsfilter-aspect-compat") + append_property(ret, "sub-auto") + append_property(ret, "sub-pos") + append_property(ret, "sub-delay") + append_property(ret, "video-rotate") + append_property(ret, "ytdl-format") + append_property(ret, "deinterlace") + return ret +end +local get_speed_flags +get_speed_flags = function() + local ret = { } + local speed = mp.get_property_native("speed") + if speed ~= 1 then + append(ret, { + "--vf-add=setpts=PTS/" .. tostring(speed), + "--af-add=atempo=" .. tostring(speed), + "--sub-speed=1/" .. tostring(speed) + }) + end + return ret +end +local get_metadata_flags +get_metadata_flags = function() + local title = mp.get_property("filename/no-ext") + return { + "--oset-metadata=title=%" .. tostring(string.len(title)) .. "%" .. tostring(title) + } +end +local apply_current_filters +apply_current_filters = function(filters) + local vf = mp.get_property_native("vf") + msg.verbose("apply_current_filters: got " .. tostring(#vf) .. " currently applied.") + for _index_0 = 1, #vf do + local _continue_0 = false + repeat + local filter = vf[_index_0] + msg.verbose("apply_current_filters: filter name: " .. tostring(filter['name'])) + if filter["enabled"] == false then + _continue_0 = true + break + end + local str = filter["name"] + local params = filter["params"] or { } + for k, v in pairs(params) do + str = str .. ":" .. tostring(k) .. "=%" .. tostring(string.len(v)) .. "%" .. tostring(v) + end + append(filters, { + str + }) + _continue_0 = true + until true + if not _continue_0 then + break + end + end +end +local get_video_filters +get_video_filters = function(format, region) + local filters = { } + append(filters, format:getPreFilters()) + if options.apply_current_filters then + apply_current_filters(filters) + end + if region and region:is_valid() then + append(filters, { + "lavfi-crop=" .. tostring(region.w) .. ":" .. tostring(region.h) .. ":" .. tostring(region.x) .. ":" .. tostring(region.y) + }) + end + append(filters, get_scale_filters()) + append(filters, get_fps_filters()) + append(filters, get_contrast_brightness_and_saturation_filters()) + append(filters, format:getPostFilters()) + return filters +end +local get_video_encode_flags +get_video_encode_flags = function(format, region) + local flags = { } + append(flags, get_playback_options()) + local filters = get_video_filters(format, region) + for _index_0 = 1, #filters do + local f = filters[_index_0] + append(flags, { + "--vf-add=" .. tostring(f) + }) + end + append(flags, get_speed_flags()) + return flags +end +local calculate_bitrate +calculate_bitrate = function(active_tracks, format, length) + if format.videoCodec == "" then + return nil, options.target_filesize * 8 / length + end + local video_kilobits = options.target_filesize * 8 + local audio_kilobits = nil + local has_audio_track = #active_tracks["audio"] > 0 + if options.strict_filesize_constraint and has_audio_track then + audio_kilobits = length * options.strict_audio_bitrate + video_kilobits = video_kilobits - audio_kilobits + end + local video_bitrate = math.floor(video_kilobits / length) + local audio_bitrate = audio_kilobits and math.floor(audio_kilobits / length) or nil + return video_bitrate, audio_bitrate +end +local find_path +find_path = function(startTime, endTime) + local path = mp.get_property('path') + if not path then + return nil, nil, nil, nil, nil + end + local is_stream = not file_exists(path) + local is_temporary = false + if is_stream then + if mp.get_property('file-format') == 'hls' then + path = utils.join_path(parse_directory('~'), 'cache_dump.ts') + mp.command_native({ + 'dump_cache', + seconds_to_time_string(startTime, false, true), + seconds_to_time_string(endTime + 5, false, true), + path + }) + endTime = endTime - startTime + startTime = 0 + is_temporary = true + end + end + return path, is_stream, is_temporary, startTime, endTime +end +local encode +encode = function(region, startTime, endTime) + local format = formats[options.output_format] + local originalStartTime = startTime + local originalEndTime = endTime + local path, is_stream, is_temporary + path, is_stream, is_temporary, startTime, endTime = find_path(startTime, endTime) + if not path then + message("No file is being played") + return + end + local command = { + "mpv", + path, + "--start=" .. seconds_to_time_string(startTime, false, true), + "--end=" .. seconds_to_time_string(endTime, false, true), + "--loop-file=no", + "--no-pause" + } + append(command, format:getCodecFlags()) + local active_tracks = get_active_tracks() + local supported_active_tracks = filter_tracks_supported_by_format(active_tracks, format) + for track_type, tracks in pairs(supported_active_tracks) do + if track_type == "audio" then + append_audio_tracks(command, tracks) + else + for _index_0 = 1, #tracks do + local track = tracks[_index_0] + append_track(command, track) + end + end + end + for track_type, tracks in pairs(supported_active_tracks) do + local _continue_0 = false + repeat + if #tracks > 0 then + _continue_0 = true + break + end + local _exp_0 = track_type + if "video" == _exp_0 then + append(command, { + "--vid=no" + }) + elseif "audio" == _exp_0 then + append(command, { + "--aid=no" + }) + elseif "sub" == _exp_0 then + append(command, { + "--sid=no" + }) + end + _continue_0 = true + until true + if not _continue_0 then + break + end + end + if format.videoCodec ~= "" then + append(command, get_video_encode_flags(format, region)) + end + append(command, format:getFlags()) + if options.write_filename_on_metadata then + append(command, get_metadata_flags()) + end + if format.acceptsBitrate then + if options.target_filesize > 0 then + local length = endTime - startTime + local video_bitrate, audio_bitrate = calculate_bitrate(supported_active_tracks, format, length) + if video_bitrate then + append(command, { + "--ovcopts-add=b=" .. tostring(video_bitrate) .. "k" + }) + end + if audio_bitrate then + append(command, { + "--oacopts-add=b=" .. tostring(audio_bitrate) .. "k" + }) + end + if options.strict_filesize_constraint then + local type = format.videoCodec ~= "" and "ovc" or "oac" + append(command, { + "--" .. tostring(type) .. "opts-add=minrate=" .. tostring(bitrate) .. "k", + "--" .. tostring(type) .. "opts-add=maxrate=" .. tostring(bitrate) .. "k" + }) + end + else + local type = format.videoCodec ~= "" and "ovc" or "oac" + append(command, { + "--" .. tostring(type) .. "opts-add=b=0" + }) + end + end + for token in string.gmatch(options.additional_flags, "[^%s]+") do + command[#command + 1] = token + end + if not options.strict_filesize_constraint then + for token in string.gmatch(options.non_strict_additional_flags, "[^%s]+") do + command[#command + 1] = token + end + if options.crf >= 0 then + append(command, { + "--ovcopts-add=crf=" .. tostring(options.crf) + }) + end + end + local dir = "" + if is_stream then + dir = parse_directory("~") + else + local _ + dir, _ = utils.split_path(path) + end + if options.output_directory ~= "" then + dir = parse_directory(options.output_directory) + end + local formatted_filename = format_filename(originalStartTime, originalEndTime, format) + local out_path = utils.join_path(dir, formatted_filename) + append(command, { + "--o=" .. tostring(out_path) + }) + emit_event("encode-started") + if options.twopass and format.supportsTwopass and not is_stream then + local first_pass_cmdline + do + local _accum_0 = { } + local _len_0 = 1 + for _index_0 = 1, #command do + local arg = command[_index_0] + _accum_0[_len_0] = arg + _len_0 = _len_0 + 1 + end + first_pass_cmdline = _accum_0 + end + append(first_pass_cmdline, { + "--ovcopts-add=flags=+pass1" + }) + message("Starting first pass...") + msg.verbose("First-pass command line: ", table.concat(first_pass_cmdline, " ")) + local res = run_subprocess({ + args = first_pass_cmdline, + cancellable = false + }) + if not res then + message("First pass failed! Check the logs for details.") + emit_event("encode-finished", "fail") + return + end + append(command, { + "--ovcopts-add=flags=+pass2" + }) + if format.videoCodec == "libvpx" then + msg.verbose("Patching libvpx pass log file...") + vp8_patch_logfile(get_pass_logfile_path(out_path), endTime - startTime) + end + end + command = format:postCommandModifier(command, region, startTime, endTime) + msg.info("Encoding to", out_path) + msg.verbose("Command line:", table.concat(command, " ")) + if options.run_detached then + message("Started encode, process was detached.") + return utils.subprocess_detached({ + args = command + }) + else + local res = false + if not should_display_progress() then + message("Started encode...") + res = run_subprocess({ + args = command, + cancellable = false + }) + else + local ewp = EncodeWithProgress(startTime, endTime) + res = ewp:startEncode(command) + end + if res then + message("Encoded successfully! Saved to\\N" .. tostring(bold(out_path))) + emit_event("encode-finished", "success") + else + message("Encode failed! Check the logs for details.") + emit_event("encode-finished", "fail") + end + os.remove(get_pass_logfile_path(out_path)) + if is_temporary then + return os.remove(path) + end + end +end +local CropPage +do + local _class_0 + local _parent_0 = Page + local _base_0 = { + reset = function(self) + local dimensions = get_video_dimensions() + local xa, ya + do + local _obj_0 = dimensions.top_left + xa, ya = _obj_0.x, _obj_0.y + end + self.pointA:set_from_screen(xa, ya) + local xb, yb + do + local _obj_0 = dimensions.bottom_right + xb, yb = _obj_0.x, _obj_0.y + end + self.pointB:set_from_screen(xb, yb) + if self.visible then + return self:draw() + end + end, + setPointA = function(self) + local posX, posY = mp.get_mouse_pos() + self.pointA:set_from_screen(posX, posY) + if self.visible then + return self:draw() + end + end, + setPointB = function(self) + local posX, posY = mp.get_mouse_pos() + self.pointB:set_from_screen(posX, posY) + if self.visible then + return self:draw() + end + end, + cancel = function(self) + self:hide() + return self.callback(false, nil) + end, + finish = function(self) + local region = Region() + region:set_from_points(self.pointA, self.pointB) + self:hide() + return self.callback(true, region) + end, + draw_box = function(self, ass) + local region = Region() + region:set_from_points(self.pointA:to_screen(), self.pointB:to_screen()) + local d = get_video_dimensions() + ass:new_event() + ass:append("{\\an7}") + ass:pos(0, 0) + ass:append('{\\bord0}') + ass:append('{\\shad0}') + ass:append('{\\c&H000000&}') + ass:append('{\\alpha&H77}') + ass:draw_start() + ass:rect_cw(d.top_left.x, d.top_left.y, region.x, region.y + region.h) + ass:rect_cw(region.x, d.top_left.y, d.bottom_right.x, region.y) + ass:rect_cw(d.top_left.x, region.y + region.h, region.x + region.w, d.bottom_right.y) + ass:rect_cw(region.x + region.w, region.y, d.bottom_right.x, d.bottom_right.y) + return ass:draw_stop() + end, + draw = function(self) + local window = { } + window.w, window.h = mp.get_osd_size() + local ass = assdraw.ass_new() + self:draw_box(ass) + ass:new_event() + self:setup_text(ass) + ass:append(tostring(bold('Crop:')) .. "\\N") + ass:append(tostring(bold('1:')) .. " change point A (" .. tostring(self.pointA.x) .. ", " .. tostring(self.pointA.y) .. ")\\N") + ass:append(tostring(bold('2:')) .. " change point B (" .. tostring(self.pointB.x) .. ", " .. tostring(self.pointB.y) .. ")\\N") + ass:append(tostring(bold('r:')) .. " reset to whole screen\\N") + ass:append(tostring(bold('ESC:')) .. " cancel crop\\N") + local width, height = math.abs(self.pointA.x - self.pointB.x), math.abs(self.pointA.y - self.pointB.y) + ass:append(tostring(bold('ENTER:')) .. " confirm crop (" .. tostring(width) .. "x" .. tostring(height) .. ")\\N") + return mp.set_osd_ass(window.w, window.h, ass.text) + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self, callback, region) + self.pointA = VideoPoint() + self.pointB = VideoPoint() + self.keybinds = { + ["1"] = (function() + local _base_1 = self + local _fn_0 = _base_1.setPointA + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["2"] = (function() + local _base_1 = self + local _fn_0 = _base_1.setPointB + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["r"] = (function() + local _base_1 = self + local _fn_0 = _base_1.reset + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["ESC"] = (function() + local _base_1 = self + local _fn_0 = _base_1.cancel + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["ENTER"] = (function() + local _base_1 = self + local _fn_0 = _base_1.finish + return function(...) + return _fn_0(_base_1, ...) + end + end)() + } + self:reset() + self.callback = callback + if region and region:is_valid() then + self.pointA.x = region.x + self.pointA.y = region.y + self.pointB.x = region.x + region.w + self.pointB.y = region.y + region.h + end + end, + __base = _base_0, + __name = "CropPage", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + CropPage = _class_0 +end +local Option +do + local _class_0 + local _base_0 = { + hasPrevious = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + return true + elseif "int" == _exp_0 then + if self.opts.min then + return self.value > self.opts.min + else + return true + end + elseif "list" == _exp_0 then + return self.value > 1 + end + end, + hasNext = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + return true + elseif "int" == _exp_0 then + if self.opts.max then + return self.value < self.opts.max + else + return true + end + elseif "list" == _exp_0 then + return self.value < #self.opts.possibleValues + end + end, + leftKey = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + self.value = not self.value + elseif "int" == _exp_0 then + self.value = self.value - self.opts.step + if self.opts.min and self.opts.min > self.value then + self.value = self.opts.min + end + elseif "list" == _exp_0 then + if self.value > 1 then + self.value = self.value - 1 + end + end + end, + rightKey = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + self.value = not self.value + elseif "int" == _exp_0 then + self.value = self.value + self.opts.step + if self.opts.max and self.opts.max < self.value then + self.value = self.opts.max + end + elseif "list" == _exp_0 then + if self.value < #self.opts.possibleValues then + self.value = self.value + 1 + end + end + end, + getValue = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + return self.value + elseif "int" == _exp_0 then + return self.value + elseif "list" == _exp_0 then + local value, _ + do + local _obj_0 = self.opts.possibleValues[self.value] + value, _ = _obj_0[1], _obj_0[2] + end + return value + end + end, + setValue = function(self, value) + local _exp_0 = self.optType + if "bool" == _exp_0 then + self.value = value + elseif "int" == _exp_0 then + self.value = value + elseif "list" == _exp_0 then + local set = false + for i, possiblePair in ipairs(self.opts.possibleValues) do + local possibleValue, _ + possibleValue, _ = possiblePair[1], possiblePair[2] + if possibleValue == value then + set = true + self.value = i + break + end + end + if not set then + return msg.warn("Tried to set invalid value " .. tostring(value) .. " to " .. tostring(self.displayText) .. " option.") + end + end + end, + getDisplayValue = function(self) + local _exp_0 = self.optType + if "bool" == _exp_0 then + return self.value and "yes" or "no" + elseif "int" == _exp_0 then + if self.opts.altDisplayNames and self.opts.altDisplayNames[self.value] then + return self.opts.altDisplayNames[self.value] + else + return tostring(self.value) + end + elseif "list" == _exp_0 then + local value, displayValue + do + local _obj_0 = self.opts.possibleValues[self.value] + value, displayValue = _obj_0[1], _obj_0[2] + end + return displayValue or value + end + end, + draw = function(self, ass, selected) + if selected then + ass:append(tostring(bold(self.displayText)) .. ": ") + else + ass:append(tostring(self.displayText) .. ": ") + end + if self:hasPrevious() then + ass:append("◀ ") + end + ass:append(self:getDisplayValue()) + if self:hasNext() then + ass:append(" ▶") + end + return ass:append("\\N") + end, + optVisible = function(self) + if self.visibleCheckFn == nil then + return true + else + return self.visibleCheckFn() + end + end + } + _base_0.__index = _base_0 + _class_0 = setmetatable({ + __init = function(self, optType, displayText, value, opts, visibleCheckFn) + self.optType = optType + self.displayText = displayText + self.opts = opts + self.value = 1 + self.visibleCheckFn = visibleCheckFn + return self:setValue(value) + end, + __base = _base_0, + __name = "Option" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Option = _class_0 +end +local EncodeOptionsPage +do + local _class_0 + local _parent_0 = Page + local _base_0 = { + getCurrentOption = function(self) + return self.options[self.currentOption][2] + end, + leftKey = function(self) + (self:getCurrentOption()):leftKey() + return self:draw() + end, + rightKey = function(self) + (self:getCurrentOption()):rightKey() + return self:draw() + end, + prevOpt = function(self) + for i = self.currentOption - 1, 1, -1 do + if self.options[i][2]:optVisible() then + self.currentOption = i + break + end + end + return self:draw() + end, + nextOpt = function(self) + for i = self.currentOption + 1, #self.options do + if self.options[i][2]:optVisible() then + self.currentOption = i + break + end + end + return self:draw() + end, + confirmOpts = function(self) + for _, optPair in ipairs(self.options) do + local optName, opt + optName, opt = optPair[1], optPair[2] + options[optName] = opt:getValue() + end + self:hide() + return self.callback(true) + end, + cancelOpts = function(self) + self:hide() + return self.callback(false) + end, + draw = function(self) + local window_w, window_h = mp.get_osd_size() + local ass = assdraw.ass_new() + ass:new_event() + self:setup_text(ass) + ass:append(tostring(bold('Options:')) .. "\\N\\N") + for i, optPair in ipairs(self.options) do + local opt = optPair[2] + if opt:optVisible() then + opt:draw(ass, self.currentOption == i) + end + end + ass:append("\\N▲ / ▼: navigate\\N") + ass:append(tostring(bold('ENTER:')) .. " confirm options\\N") + ass:append(tostring(bold('ESC:')) .. " cancel\\N") + return mp.set_osd_ass(window_w, window_h, ass.text) + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self, callback) + self.callback = callback + self.currentOption = 1 + local scaleHeightOpts = { + possibleValues = { + { + -1, + "no" + }, + { + 144 + }, + { + 240 + }, + { + 360 + }, + { + 480 + }, + { + 540 + }, + { + 720 + }, + { + 1080 + }, + { + 1440 + }, + { + 2160 + } + } + } + local filesizeOpts = { + step = 250, + min = 0, + altDisplayNames = { + [0] = "0 (constant quality)" + } + } + local crfOpts = { + step = 1, + min = -1, + altDisplayNames = { + [-1] = "disabled" + } + } + local fpsOpts = { + possibleValues = { + { + -1, + "source" + }, + { + 15 + }, + { + 24 + }, + { + 30 + }, + { + 48 + }, + { + 50 + }, + { + 60 + }, + { + 120 + }, + { + 240 + } + } + } + local formatIds = { + "av1", + "hevc", + "webm-vp9", + "avc", + "avc-nvenc", + "webm-vp8", + "gif", + "mp3", + "raw" + } + local formatOpts = { + possibleValues = (function() + local _accum_0 = { } + local _len_0 = 1 + for _index_0 = 1, #formatIds do + local fId = formatIds[_index_0] + _accum_0[_len_0] = { + fId, + formats[fId].displayName + } + _len_0 = _len_0 + 1 + end + return _accum_0 + end)() + } + local gifDitherOpts = { + possibleValues = { + { + 0, + "bayer_scale 0" + }, + { + 1, + "bayer_scale 1" + }, + { + 2, + "bayer_scale 2" + }, + { + 3, + "bayer_scale 3" + }, + { + 4, + "bayer_scale 4" + }, + { + 5, + "bayer_scale 5" + }, + { + 6, + "sierra2_4a" + } + } + } + self.options = { + { + "output_format", + Option("list", "Output Format", options.output_format, formatOpts) + }, + { + "twopass", + Option("bool", "Two Pass", options.twopass) + }, + { + "apply_current_filters", + Option("bool", "Apply Current Video Filters", options.apply_current_filters) + }, + { + "scale_height", + Option("list", "Scale Height", options.scale_height, scaleHeightOpts) + }, + { + "strict_filesize_constraint", + Option("bool", "Strict Filesize Constraint", options.strict_filesize_constraint) + }, + { + "write_filename_on_metadata", + Option("bool", "Write Filename on Metadata", options.write_filename_on_metadata) + }, + { + "target_filesize", + Option("int", "Target Filesize", options.target_filesize, filesizeOpts) + }, + { + "crf", + Option("int", "CRF", options.crf, crfOpts) + }, + { + "fps", + Option("list", "FPS", options.fps, fpsOpts) + }, + { + "gif_dither", + Option("list", "GIF Dither Type", options.gif_dither, gifDitherOpts, function() + return self.options[1][2]:getValue() == "gif" + end) + }, + { + "force_square_pixels", + Option("bool", "Force Square Pixels", options.force_square_pixels) + } + } + self.keybinds = { + ["LEFT"] = (function() + local _base_1 = self + local _fn_0 = _base_1.leftKey + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["RIGHT"] = (function() + local _base_1 = self + local _fn_0 = _base_1.rightKey + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["UP"] = (function() + local _base_1 = self + local _fn_0 = _base_1.prevOpt + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["DOWN"] = (function() + local _base_1 = self + local _fn_0 = _base_1.nextOpt + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["ENTER"] = (function() + local _base_1 = self + local _fn_0 = _base_1.confirmOpts + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["ESC"] = (function() + local _base_1 = self + local _fn_0 = _base_1.cancelOpts + return function(...) + return _fn_0(_base_1, ...) + end + end)() + } + end, + __base = _base_0, + __name = "EncodeOptionsPage", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + EncodeOptionsPage = _class_0 +end +local PreviewPage +do + local _class_0 + local _parent_0 = Page + local _base_0 = { + prepare = function(self) + local vf = mp.get_property_native("vf") + vf[#vf + 1] = { + name = "sub" + } + if self.region:is_valid() then + vf[#vf + 1] = { + name = "crop", + params = { + w = tostring(self.region.w), + h = tostring(self.region.h), + x = tostring(self.region.x), + y = tostring(self.region.y) + } + } + end + mp.set_property_native("vf", vf) + if self.startTime > -1 and self.endTime > -1 then + mp.set_property_native("ab-loop-a", self.startTime) + mp.set_property_native("ab-loop-b", self.endTime) + mp.set_property_native("time-pos", self.startTime) + end + return mp.set_property_native("pause", false) + end, + dispose = function(self) + mp.set_property("ab-loop-a", "no") + mp.set_property("ab-loop-b", "no") + for prop, value in pairs(self.originalProperties) do + mp.set_property_native(prop, value) + end + end, + draw = function(self) + local window_w, window_h = mp.get_osd_size() + local ass = assdraw.ass_new() + ass:new_event() + self:setup_text(ass) + ass:append("Press " .. tostring(bold('ESC')) .. " to exit preview.\\N") + return mp.set_osd_ass(window_w, window_h, ass.text) + end, + cancel = function(self) + self:hide() + return self.callback() + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self, callback, region, startTime, endTime) + self.callback = callback + self.originalProperties = { + ["vf"] = mp.get_property_native("vf"), + ["time-pos"] = mp.get_property_native("time-pos"), + ["pause"] = mp.get_property_native("pause") + } + self.keybinds = { + ["ESC"] = (function() + local _base_1 = self + local _fn_0 = _base_1.cancel + return function(...) + return _fn_0(_base_1, ...) + end + end)() + } + self.region = region + self.startTime = startTime + self.endTime = endTime + self.isLoop = false + end, + __base = _base_0, + __name = "PreviewPage", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + PreviewPage = _class_0 +end +local MainPage +do + local _class_0 + local _parent_0 = Page + local _base_0 = { + setStartTime = function(self) + self.startTime = mp.get_property_number("time-pos") + if self.visible then + self:clear() + return self:draw() + end + end, + setEndTime = function(self) + self.endTime = mp.get_property_number("time-pos") + if self.visible then + self:clear() + return self:draw() + end + end, + jumpToStartTime = function(self) + return mp.set_property("time-pos", self.startTime) + end, + jumpToEndTime = function(self) + return mp.set_property("time-pos", self.endTime) + end, + setupStartAndEndTimes = function(self) + if mp.get_property_native("duration") then + self.startTime = 0 + self.endTime = mp.get_property_native("duration") + else + self.startTime = -1 + self.endTime = -1 + end + if self.visible then + self:clear() + return self:draw() + end + end, + draw = function(self) + local window_w, window_h = mp.get_osd_size() + local ass = assdraw.ass_new() + ass:new_event() + self:setup_text(ass) + ass:append(tostring(bold('WebM maker')) .. "\\N\\N") + ass:append(tostring(bold('c:')) .. " crop\\N") + ass:append(tostring(bold('1:')) .. " set start time (current is " .. tostring(seconds_to_time_string(self.startTime)) .. ")\\N") + ass:append(tostring(bold('2:')) .. " set end time (current is " .. tostring(seconds_to_time_string(self.endTime)) .. ")\\N") + ass:append(tostring(bold('!:')) .. " jump to start time\\N") + ass:append(tostring(bold('@:')) .. " jump to end time\\N") + ass:append(tostring(bold('o:')) .. " change encode options\\N") + ass:append(tostring(bold('p:')) .. " preview\\N") + ass:append(tostring(bold('e:')) .. " encode\\N\\N") + ass:append(tostring(bold('ESC:')) .. " close\\N") + return mp.set_osd_ass(window_w, window_h, ass.text) + end, + show = function(self) + _class_0.__parent.show(self) + return emit_event("show-main-page") + end, + onUpdateCropRegion = function(self, updated, newRegion) + if updated then + self.region = newRegion + end + return self:show() + end, + crop = function(self) + self:hide() + local cropPage = CropPage((function() + local _base_1 = self + local _fn_0 = _base_1.onUpdateCropRegion + return function(...) + return _fn_0(_base_1, ...) + end + end)(), self.region) + return cropPage:show() + end, + onOptionsChanged = function(self, updated) + return self:show() + end, + changeOptions = function(self) + self:hide() + local encodeOptsPage = EncodeOptionsPage((function() + local _base_1 = self + local _fn_0 = _base_1.onOptionsChanged + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + return encodeOptsPage:show() + end, + onPreviewEnded = function(self) + return self:show() + end, + preview = function(self) + self:hide() + local previewPage = PreviewPage((function() + local _base_1 = self + local _fn_0 = _base_1.onPreviewEnded + return function(...) + return _fn_0(_base_1, ...) + end + end)(), self.region, self.startTime, self.endTime) + return previewPage:show() + end, + encode = function(self) + self:hide() + if self.startTime < 0 then + message("No start time, aborting") + return + end + if self.endTime < 0 then + message("No end time, aborting") + return + end + if self.startTime >= self.endTime then + message("Start time is ahead of end time, aborting") + return + end + return encode(self.region, self.startTime, self.endTime) + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + _class_0 = setmetatable({ + __init = function(self) + self.keybinds = { + ["c"] = (function() + local _base_1 = self + local _fn_0 = _base_1.crop + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["1"] = (function() + local _base_1 = self + local _fn_0 = _base_1.setStartTime + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["2"] = (function() + local _base_1 = self + local _fn_0 = _base_1.setEndTime + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["!"] = (function() + local _base_1 = self + local _fn_0 = _base_1.jumpToStartTime + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["@"] = (function() + local _base_1 = self + local _fn_0 = _base_1.jumpToEndTime + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["o"] = (function() + local _base_1 = self + local _fn_0 = _base_1.changeOptions + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["p"] = (function() + local _base_1 = self + local _fn_0 = _base_1.preview + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["e"] = (function() + local _base_1 = self + local _fn_0 = _base_1.encode + return function(...) + return _fn_0(_base_1, ...) + end + end)(), + ["ESC"] = (function() + local _base_1 = self + local _fn_0 = _base_1.hide + return function(...) + return _fn_0(_base_1, ...) + end + end)() + } + self.startTime = -1 + self.endTime = -1 + self.region = Region() + end, + __base = _base_0, + __name = "MainPage", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + local parent = rawget(cls, "__parent") + if parent then + return parent[name] + end + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + MainPage = _class_0 +end +monitor_dimensions() +local mainPage = MainPage() +mp.add_key_binding(options.keybind, "display-webm-encoder", (function() + local _base_0 = mainPage + local _fn_0 = _base_0.show + return function(...) + return _fn_0(_base_0, ...) + end +end)(), { + repeatable = false +}) +mp.register_event("file-loaded", (function() + local _base_0 = mainPage + local _fn_0 = _base_0.setupStartAndEndTimes + return function(...) + return _fn_0(_base_0, ...) + end +end)()) +msg.verbose("Loaded mpv-webm script!") +return emit_event("script-loaded") diff --git a/config/qutebrowser/autoconfig.yml b/config/qutebrowser/autoconfig.yml @@ -0,0 +1,10 @@ +# If a config.py file exists, this file is ignored unless it's explicitly loaded +# via config.load_autoconfig(). For more information, see: +# https://github.com/qutebrowser/qutebrowser/blob/main/doc/help/configuring.asciidoc#loading-autoconfigyml +# DO NOT edit this file by hand, qutebrowser will overwrite it. +# Instead, create a config.py - see :help for details. + +config_version: 2 +settings: + content.desktop_capture: + https://screensy.marijn.it: true diff --git a/config/qutebrowser/bookmarks/urls b/config/qutebrowser/bookmarks/urls @@ -0,0 +1,20 @@ +https://github.com/Jacksaur/Gorgeous-GRUB GitHub - Jacksaur/Gorgeous-GRUB: Collection of decent Community-made GRUB themes. Contributions welcome! +https://wallhaven.cc/ Awesome Wallpapers - wallhaven.cc +https://wiki.gentoo.org/wiki/LTO#cite_note-1 LTO - Gentoo wiki +https://wiki.gentoo.org/wiki/Installation_on_libreboot Installation on libreboot - Gentoo wiki +https://libreboot.org/ Libreboot – Libreboot project +http://192.168.1.62:8000/ Directory listing for / +https://screensy.marijn.it/#TheH screensy +https://suckless.org/ software that sucks less | suckless.org software that sucks less +https://github.com/runlikeforrestgump/dwm GitHub - runlikeforrestgump/dwm: Patches for dwm (dynamic window manager from suckless) +https://github.com/mpv-player/mpv/blob/master/TOOLS/umpv mpv/TOOLS/umpv at master · mpv-player/mpv · GitHub +https://github.com/qutebrowser/qutebrowser/blob/main/scripts/open_url_in_instance.sh qutebrowser/scripts/open_url_in_instance.sh at main · qutebrowser/qutebrowser · GitHub +https://dwm.suckless.org/patches/statuscolors/ dwm - dynamic window manager | suckless.org software that sucks less +https://www.antixforum.com/forums/topic/no-logind-no-dbus-no-esysusers-no-udev-nldev-smdev-mdevd-libudev-zero/ no logind, no dbus, no esysusers, no …. udev?? nldev smdev mdevd libudev-zero – antiX-forum +https://github.com/illiliti/libudev-zero GitHub - illiliti/libudev-zero: Daemonless replacement for libudev +https://www.rhymezone.com/ RhymeZone rhyming dictionary and thesaurus +https://thonkpeasant.xyz/guides/other/theming.html Libreboot Theming +https://github.com/corna/me_cleaner GitHub - corna/me_cleaner: Tool for partial deblobbing of Intel ME/TXE firmware images +https://read.easypeasymethod.org/ EasyPeasy +https://dzen.ru/a/XkYi_7rsjzZfH6ib Распаковка и правка BIOS на примере HP dv6-6b56er. | Bill Vates | Дзен +https://git.codemadness.org/stagit/file/README.html README - stagit - static git page generator diff --git a/config/qutebrowser/config.py b/config/qutebrowser/config.py @@ -0,0 +1,242 @@ +from qutebrowser.api import interceptor +# 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 + +# Change the argument to True to still load settings configured via autoconfig.yml +config.load_autoconfig(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', 'all', 'chrome-devtools://*') + +# Setting dark mode +config.set("colors.webpage.darkmode.enabled", 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', 'all', 'devtools://*') + +# 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/*') + +#Ad/Tracker blocking +def perish_evil(info: interceptor.Request): + url=info.request_url + if (( + url.host()=="mos.ru" + and url.path()=="/logs" + ) or ( + url.host()=="www.mos.ru" + and (url.path()=="/api/analytics-forwarder/v1/events" or url.path()=="/stproxy/services/") + ) or ( + url.host()=="school.mos.ru" + and (url.path()=="/v1/roles/allGlobal/" or url.path()=="/v1/allSubsystems/" or url.path()=="/v1/oauth/userinfo" or url.path()=="/api/ej/chat/family/v1/messages/count_unread_and_important" or url.path()=="/api/news/v2/banners/instance" or url.path()=="/api/ej/core/family/v1/banners" or url.path()=="/api/additional_education/v1/ae_groups" or url.path()=="/api/ej/core/family/v1/emias_medical_recommendations" or url.path()=="/v2/external-partners/check-for-vk-user") + ) or ( + url.host()=="dnevnik.mos.ru" + and url.path()=="/diary/schedules/undefined" + ) or ( + url.host()=="yastatic.net" + and url.path()=="/s3/distribution/yanalytics/v7/yanalytics.js" + ) or ( + url.host()=="apis.google.com" + and url.path()=="/js/googleapis.proxy.js" + ) or ( + url.host()=="drive.google.com" + and (url.path()=="/drivesharing" or url.path()=="/viewer2/prod-01/presspage") + ) or ( + url.host()=="ssl.gstatic.com" + and url.path()=="/docs/common/cleardot.gif" + ) + ): + info.block() + +interceptor.register(perish_evil) + +#Start pages +config.set('url.default_page', 'https://stellar-nexus.ru/en') +c.url.start_pages = ['https://stellar-nexus.ru/en'] + +#File manager +config.set("fileselect.handler", "external") +config.set("fileselect.single_file.command", ['st', '-e', 'ranger', '--choosefile', '{}']) +config.set("fileselect.multiple_files.command", ['st', '-e', 'ranger', '--choosefiles', '{}']) + +#Color scheme +config.set('colors.webpage.preferred_color_scheme', 'dark') +config.set('colors.completion.odd.bg', '#333333') +config.set('colors.completion.even.bg', '#222222') +config.set('colors.hints.bg', 'black') +config.set('colors.hints.fg', 'white') +config.set('hints.border', '1px solid #ce4404') +config.set('colors.completion.category.bg', '#ce4404') +config.set('colors.tabs.bar.bg', '#222222') +config.set('colors.tabs.odd.bg', '#222222') +config.set('colors.tabs.even.bg', '#222222') +config.set('colors.tabs.selected.odd.bg', '#ce4404') +config.set('colors.tabs.selected.even.bg', '#ce4404') +config.set('colors.tabs.pinned.odd.bg', '#444444') +config.set('colors.tabs.pinned.even.bg', '#444444') +config.set('colors.tabs.pinned.selected.odd.bg', '#ce4404') +config.set('colors.tabs.pinned.selected.even.bg', '#ce4404') + +#Bindings for normal mode +config.bind('h', 'back') +config.bind('j', 'tab-prev') +config.bind('k', 'tab-next') +config.bind('l', 'forward') +config.bind('H', 'tab-clone;; back;; tab-move -') +config.bind('J', 'tab-move -') +config.bind('K', 'tab-move +') +config.bind('L', 'tab-clone;; forward') +config.bind('d', 'tab-move -;; tab-close') +config.bind('D', 'tab-close') +config.bind('cc', 'tab-clone') +config.bind('to', 'tab-only') +config.bind('R', 'spawn /home/plat/scripts/qutebrowser-redraw.sh') +config.bind('m', 'hint links spawn -d /home/plat/scripts/append_music.sh {hint-url}') +config.bind('M', 'hint links spawn -d /home/plat/scripts/play_video.sh {hint-url}') +config.bind('I', 'hint images download') +config.bind('sm', 'hint links spawn -d /home/plat/scripts/send_music.sh {hint-url}') +config.bind('W', 'spawn /home/plat/scripts/qutebrowser-pseudo-tran-switch.sh') + +#Preferences +config.set('window.title_format', 'qutebrowser') +config.set('statusbar.show', 'never') +config.set('tabs.show', 'multiple') +config.set('tabs.position', 'bottom') +config.set('tabs.indicator.width', 0) +config.set('scrolling.bar', 'when-searching') +config.set('completion.scrollbar.width', 0) +config.set('tabs.title.format_pinned', '{audio}{index}') +config.set('fonts.tabs.unselected', '12pt default_family') +config.set('fonts.tabs.selected', '12pt default_family') + +config.set('content.unknown_url_scheme_policy', 'allow-all') + +#Search engines +c.url.searchengines = {'DEFAULT': 'https://searx.stellar-nexus.ru/searxng/search?q={}', +} + + +# 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://*/*') diff --git a/config/qutebrowser/greasemonkey/pseudo-tran.js b/config/qutebrowser/greasemonkey/pseudo-tran.js @@ -0,0 +1,27 @@ +// ==UserScript== +// @name Pseudo transparency +// @description Allows you to set a background image to all pages +// @include * +// @run-at document-start +// @version 2 +// @author Plat +// ==/UserScript== + +(function IIFE() { + 'use strict'; + + document.addEventListener('readystatechange', function onReadyStateChange() { + if (document.readyState == 'interactive') { + const style = document.createElement('style'); + document.head.appendChild(style); + style.innerHTML = ` + +body { + background-image: url("https://stellar-nexus.ru/wall.png") !important; + background-repeat: no-repeat !important; + background-attachment: fixed !important; +} + `; + } + }); +})(); diff --git a/config/qutebrowser/greasemonkey/white-text.js.disabled b/config/qutebrowser/greasemonkey/white-text.js.disabled @@ -0,0 +1,25 @@ +// ==UserScript== +// @name White text +// @description Allows you to set white text to all pages +// @include * +// @run-at document-start +// @version 2 +// @author Plat +// ==/UserScript== + +(function IIFE() { + 'use strict'; + + document.addEventListener('readystatechange', function onReadyStateChange() { + if (document.readyState == 'interactive') { + const style = document.createElement('style'); + document.head.appendChild(style); + style.innerHTML = ` + +body { + color: white !important; +} + `; + } + }); +})(); diff --git a/config/qutebrowser/qsettings/QtProject.conf b/config/qutebrowser/qsettings/QtProject.conf @@ -0,0 +1,17 @@ +[Qt] +customColors\0=4291707908 +customColors\1=4294967295 +customColors\10=4294967295 +customColors\11=4294967295 +customColors\12=4294967295 +customColors\13=4294967295 +customColors\14=4294967295 +customColors\15=4294967295 +customColors\2=4294967295 +customColors\3=4294967295 +customColors\4=4294967295 +customColors\5=4294967295 +customColors\6=4294967295 +customColors\7=4294967295 +customColors\8=4294967295 +customColors\9=4294967295 diff --git a/config/qutebrowser/quickmarks b/config/qutebrowser/quickmarks @@ -0,0 +1,16 @@ +use https://www.gentoo.org/support/use-flags/ +ea https://stellar-nexus.ru/en/articles/ +ep https://stellar-nexus.ru/en/poems/ +ed https://stellar-nexus.ru/en/diaries/ +ef https://stellar-nexus.ru/en/files/ +ev https://stellar-nexus.ru/en/videos/ +ru https://stellar-nexus.ru/ru/ +rp https://stellar-nexus.ru/ru/poems +rd https://stellar-nexus.ru/ru/diaries/ +d https://stellar-nexus.ru/ru/diaries/ITeng/ +rs https://stellar-nexus.ru/ru/school +rv https://stellar-nexus.ru/ru/videos/ +ra https://stellar-nexus.ru/ru/articles/ +ei https://stellar-nexus.ru/en/images/ +ri https://stellar-nexus.ru/ru/images/ +en https://stellar-nexus.ru/en/ diff --git a/config/ranger/commands.py b/config/ranger/commands.py @@ -0,0 +1,62 @@ +# This is a sample commands.py. You can add your own commands here. +# +# Please refer to commands_full.py for all the default commands and a complete +# documentation. Do NOT add them all here, or you may end up with defunct +# commands when upgrading ranger. + +# A simple command for demonstration purposes follows. +# ----------------------------------------------------------------------------- + +from __future__ import (absolute_import, division, print_function) + +# You can import any python module as needed. +import os + +# You always need to import ranger.api.commands here to get the Command class: +from ranger.api.commands import Command + + +# Any class that is a subclass of "Command" will be integrated into ranger as a +# command. Try typing ":my_edit<ENTER>" in ranger! +class my_edit(Command): + # The so-called doc-string of the class will be visible in the built-in + # help that is accessible by typing "?c" inside ranger. + """:my_edit <filename> + + A sample command for demonstration purposes that opens a file in an editor. + """ + + # The execute method is called when you run this command in ranger. + def execute(self): + # self.arg(1) is the first (space-separated) argument to the function. + # This way you can write ":my_edit somefilename<ENTER>". + if self.arg(1): + # self.rest(1) contains self.arg(1) and everything that follows + target_filename = self.rest(1) + else: + # self.fm is a ranger.core.filemanager.FileManager object and gives + # you access to internals of ranger. + # self.fm.thisfile is a ranger.container.file.File object and is a + # reference to the currently selected file. + target_filename = self.fm.thisfile.path + + # This is a generic function to print text in ranger. + self.fm.notify("Let's edit the file " + target_filename + "!") + + # Using bad=True in fm.notify allows you to print error messages: + if not os.path.exists(target_filename): + self.fm.notify("The given file does not exist!", bad=True) + return + + # This executes a function from ranger.core.acitons, a module with a + # variety of subroutines that can help you construct commands. + # Check out the source, or run "pydoc ranger.core.actions" for a list. + self.fm.edit_file(target_filename) + + # The tab method is called when you press tab, and should return a list of + # suggestions that the user will tab through. + # tabnum is 1 for <TAB> and -1 for <S-TAB> by default + def tab(self, tabnum): + # This is a generic tab-completion function that iterates through the + # content of the current directory. + return self._tab_directory_content() diff --git a/config/ranger/commands_full.py b/config/ranger/commands_full.py @@ -0,0 +1,1993 @@ +# -*- coding: utf-8 -*- +# This file is part of ranger, the console file manager. +# This configuration file is licensed under the same terms as ranger. +# =================================================================== +# +# NOTE: If you copied this file to /etc/ranger/commands_full.py or +# ~/.config/ranger/commands_full.py, then it will NOT be loaded by ranger, +# and only serve as a reference. +# +# =================================================================== +# This file contains ranger's commands. +# It's all in python; lines beginning with # are comments. +# +# Note that additional commands are automatically generated from the methods +# of the class ranger.core.actions.Actions. +# +# You can customize commands in the files /etc/ranger/commands.py (system-wide) +# and ~/.config/ranger/commands.py (per user). +# They have the same syntax as this file. In fact, you can just copy this +# file to ~/.config/ranger/commands_full.py with +# `ranger --copy-config=commands_full' and make your modifications, don't +# forget to rename it to commands.py. You can also use +# `ranger --copy-config=commands' to copy a short sample commands.py that +# has everything you need to get started. +# But make sure you update your configs when you update ranger. +# +# =================================================================== +# Every class defined here which is a subclass of `Command' will be used as a +# command in ranger. Several methods are defined to interface with ranger: +# execute(): called when the command is executed. +# cancel(): called when closing the console. +# tab(tabnum): called when <TAB> is pressed. +# quick(): called after each keypress. +# +# tab() argument tabnum is 1 for <TAB> and -1 for <S-TAB> by default +# +# The return values for tab() can be either: +# None: There is no tab completion +# A string: Change the console to this string +# A list/tuple/generator: cycle through every item in it +# +# The return value for quick() can be: +# False: Nothing happens +# True: Execute the command afterwards +# +# The return value for execute() and cancel() doesn't matter. +# +# =================================================================== +# Commands have certain attributes and methods that facilitate parsing of +# the arguments: +# +# self.line: The whole line that was written in the console. +# self.args: A list of all (space-separated) arguments to the command. +# self.quantifier: If this command was mapped to the key "X" and +# the user pressed 6X, self.quantifier will be 6. +# self.arg(n): The n-th argument, or an empty string if it doesn't exist. +# self.rest(n): The n-th argument plus everything that followed. For example, +# if the command was "search foo bar a b c", rest(2) will be "bar a b c" +# self.start(n): Anything before the n-th argument. For example, if the +# command was "search foo bar a b c", start(2) will be "search foo" +# +# =================================================================== +# And this is a little reference for common ranger functions and objects: +# +# self.fm: A reference to the "fm" object which contains most information +# about ranger. +# self.fm.notify(string): Print the given string on the screen. +# self.fm.notify(string, bad=True): Print the given string in RED. +# self.fm.reload_cwd(): Reload the current working directory. +# self.fm.thisdir: The current working directory. (A File object.) +# self.fm.thisfile: The current file. (A File object too.) +# self.fm.thistab.get_selection(): A list of all selected files. +# self.fm.execute_console(string): Execute the string as a ranger command. +# self.fm.open_console(string): Open the console with the given string +# already typed in for you. +# self.fm.move(direction): Moves the cursor in the given direction, which +# can be something like down=3, up=5, right=1, left=1, to=6, ... +# +# File objects (for example self.fm.thisfile) have these useful attributes and +# methods: +# +# tfile.path: The path to the file. +# tfile.basename: The base name only. +# tfile.load_content(): Force a loading of the directories content (which +# obviously works with directories only) +# tfile.is_directory: True/False depending on whether it's a directory. +# +# For advanced commands it is unavoidable to dive a bit into the source code +# of ranger. +# =================================================================== + +from __future__ import (absolute_import, division, print_function) + +from collections import deque +import os +import re + +from ranger.api.commands import Command + + +class alias(Command): + """:alias <newcommand> <oldcommand> + + Copies the oldcommand as newcommand. + """ + + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify('Syntax: alias <newcommand> <oldcommand>', bad=True) + return + + self.fm.commands.alias(self.arg(1), self.rest(2)) + + +class echo(Command): + """:echo <text> + + Display the text in the statusbar. + """ + + def execute(self): + self.fm.notify(self.rest(1)) + + +class cd(Command): + """:cd [-r] <path> + + The cd command changes the directory. + If the path is a file, selects that file. + The command 'cd -' is equivalent to typing ``. + Using the option "-r" will get you to the real path. + """ + + def execute(self): + if self.arg(1) == '-r': + self.shift() + destination = os.path.realpath(self.rest(1)) + if os.path.isfile(destination): + self.fm.select_file(destination) + return + else: + destination = self.rest(1) + + if not destination: + destination = '~' + + if destination == '-': + self.fm.enter_bookmark('`') + else: + self.fm.cd(destination) + + def _tab_args(self): + # dest must be rest because path could contain spaces + if self.arg(1) == '-r': + start = self.start(2) + dest = self.rest(2) + else: + start = self.start(1) + dest = self.rest(1) + + if dest: + head, tail = os.path.split(os.path.expanduser(dest)) + if head: + dest_exp = os.path.join(os.path.normpath(head), tail) + else: + dest_exp = tail + else: + dest_exp = '' + return (start, dest_exp, os.path.join(self.fm.thisdir.path, dest_exp), + dest.endswith(os.path.sep)) + + @staticmethod + def _tab_paths(dest, dest_abs, ends_with_sep): + if not dest: + try: + return next(os.walk(dest_abs))[1], dest_abs + except (OSError, StopIteration): + return [], '' + + if ends_with_sep: + try: + return [os.path.join(dest, path) for path in next(os.walk(dest_abs))[1]], '' + except (OSError, StopIteration): + return [], '' + + return None, None + + def _tab_match(self, path_user, path_file): + if self.fm.settings.cd_tab_case == 'insensitive': + path_user = path_user.lower() + path_file = path_file.lower() + elif self.fm.settings.cd_tab_case == 'smart' and path_user.islower(): + path_file = path_file.lower() + return path_file.startswith(path_user) + + def _tab_normal(self, dest, dest_abs): + dest_dir = os.path.dirname(dest) + dest_base = os.path.basename(dest) + + try: + dirnames = next(os.walk(os.path.dirname(dest_abs)))[1] + except (OSError, StopIteration): + return [], '' + + return [os.path.join(dest_dir, d) for d in dirnames if self._tab_match(dest_base, d)], '' + + def _tab_fuzzy_match(self, basepath, tokens): + """ Find directories matching tokens recursively """ + if not tokens: + tokens = [''] + paths = [basepath] + while True: + token = tokens.pop() + matches = [] + for path in paths: + try: + directories = next(os.walk(path))[1] + except (OSError, StopIteration): + continue + matches += [os.path.join(path, d) for d in directories + if self._tab_match(token, d)] + if not tokens or not matches: + return matches + paths = matches + + return None + + def _tab_fuzzy(self, dest, dest_abs): + tokens = [] + basepath = dest_abs + while True: + basepath_old = basepath + basepath, token = os.path.split(basepath) + if basepath == basepath_old: + break + if os.path.isdir(basepath_old) and not token.startswith('.'): + basepath = basepath_old + break + tokens.append(token) + + paths = self._tab_fuzzy_match(basepath, tokens) + if not os.path.isabs(dest): + paths_rel = self.fm.thisdir.path + paths = [os.path.relpath(os.path.join(basepath, path), paths_rel) + for path in paths] + else: + paths_rel = '' + return paths, paths_rel + + def tab(self, tabnum): + from os.path import sep + + start, dest, dest_abs, ends_with_sep = self._tab_args() + + paths, paths_rel = self._tab_paths(dest, dest_abs, ends_with_sep) + if paths is None: + if self.fm.settings.cd_tab_fuzzy: + paths, paths_rel = self._tab_fuzzy(dest, dest_abs) + else: + paths, paths_rel = self._tab_normal(dest, dest_abs) + + paths.sort() + + if self.fm.settings.cd_bookmarks: + paths[0:0] = [ + os.path.relpath(v.path, paths_rel) if paths_rel else v.path + for v in self.fm.bookmarks.dct.values() for path in paths + if v.path.startswith(os.path.join(paths_rel, path) + sep) + ] + + if not paths: + return None + if len(paths) == 1: + return start + paths[0] + sep + return [start + dirname + sep for dirname in paths] + + +class chain(Command): + """:chain <command1>; <command2>; ... + + Calls multiple commands at once, separated by semicolons. + """ + resolve_macros = False + + def execute(self): + if not self.rest(1).strip(): + self.fm.notify('Syntax: chain <command1>; <command2>; ...', bad=True) + return + for command in [s.strip() for s in self.rest(1).split(";")]: + self.fm.execute_console(command) + + +class shell(Command): + escape_macros_for_shell = True + + def execute(self): + if self.arg(1) and self.arg(1)[0] == '-': + flags = self.arg(1)[1:] + command = self.rest(2) + else: + flags = '' + command = self.rest(1) + + if command: + self.fm.execute_command(command, flags=flags) + + def tab(self, tabnum): + from ranger.ext.get_executables import get_executables + if self.arg(1) and self.arg(1)[0] == '-': + command = self.rest(2) + else: + command = self.rest(1) + start = self.line[0:len(self.line) - len(command)] + + try: + position_of_last_space = command.rindex(" ") + except ValueError: + return (start + program + ' ' for program + in get_executables() if program.startswith(command)) + if position_of_last_space == len(command) - 1: + selection = self.fm.thistab.get_selection() + if len(selection) == 1: + return self.line + selection[0].shell_escaped_basename + ' ' + return self.line + '%s ' + + before_word, start_of_word = self.line.rsplit(' ', 1) + return (before_word + ' ' + file.shell_escaped_basename + for file in self.fm.thisdir.files or [] + if file.shell_escaped_basename.startswith(start_of_word)) + + +class open_with(Command): + + def execute(self): + app, flags, mode = self._get_app_flags_mode(self.rest(1)) + self.fm.execute_file( + files=[f for f in self.fm.thistab.get_selection()], + app=app, + flags=flags, + mode=mode) + + def tab(self, tabnum): + return self._tab_through_executables() + + def _get_app_flags_mode(self, string): # pylint: disable=too-many-branches,too-many-statements + """Extracts the application, flags and mode from a string. + + examples: + "mplayer f 1" => ("mplayer", "f", 1) + "atool 4" => ("atool", "", 4) + "p" => ("", "p", 0) + "" => None + """ + + app = '' + flags = '' + mode = 0 + split = string.split() + + if len(split) == 1: + part = split[0] + if self._is_app(part): + app = part + elif self._is_flags(part): + flags = part + elif self._is_mode(part): + mode = part + + elif len(split) == 2: + part0 = split[0] + part1 = split[1] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + elif self._is_mode(part1): + mode = part1 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + elif len(split) >= 3: + part0 = split[0] + part1 = split[1] + part2 = split[2] + + if self._is_app(part0): + app = part0 + if self._is_flags(part1): + flags = part1 + if self._is_mode(part2): + mode = part2 + elif self._is_mode(part1): + mode = part1 + if self._is_flags(part2): + flags = part2 + elif self._is_flags(part0): + flags = part0 + if self._is_mode(part1): + mode = part1 + elif self._is_mode(part0): + mode = part0 + if self._is_flags(part1): + flags = part1 + + return app, flags, int(mode) + + def _is_app(self, arg): + return not self._is_flags(arg) and not arg.isdigit() + + @staticmethod + def _is_flags(arg): + from ranger.core.runner import ALLOWED_FLAGS + return all(x in ALLOWED_FLAGS for x in arg) + + @staticmethod + def _is_mode(arg): + return all(x in '0123456789' for x in arg) + + +class set_(Command): + """:set <option name>=<python expression> + + Gives an option a new value. + + Use `:set <option>!` to toggle or cycle it, e.g. `:set flush_input!` + """ + name = 'set' # don't override the builtin set class + + def execute(self): + name = self.arg(1) + name, value, _, toggle = self.parse_setting_line_v2() + if toggle: + self.fm.toggle_option(name) + else: + self.fm.set_option_from_string(name, value) + + def tab(self, tabnum): # pylint: disable=too-many-return-statements + from ranger.gui.colorscheme import get_all_colorschemes + name, value, name_done = self.parse_setting_line() + settings = self.fm.settings + if not name: + return sorted(self.firstpart + setting for setting in settings) + if not value and not name_done: + return sorted(self.firstpart + setting for setting in settings + if setting.startswith(name)) + if not value: + value_completers = { + "colorscheme": + # Cycle through colorschemes when name, but no value is specified + lambda: sorted(self.firstpart + colorscheme for colorscheme + in get_all_colorschemes(self.fm)), + + "column_ratios": + lambda: self.firstpart + ",".join(map(str, settings[name])), + } + + def default_value_completer(): + return self.firstpart + str(settings[name]) + + return value_completers.get(name, default_value_completer)() + if bool in settings.types_of(name): + if 'true'.startswith(value.lower()): + return self.firstpart + 'True' + if 'false'.startswith(value.lower()): + return self.firstpart + 'False' + # Tab complete colorscheme values if incomplete value is present + if name == "colorscheme": + return sorted(self.firstpart + colorscheme for colorscheme + in get_all_colorschemes(self.fm) if colorscheme.startswith(value)) + return None + + +class setlocal(set_): + """:setlocal path=<regular expression> <option name>=<python expression> + + Gives an option a new value. + """ + PATH_RE_DQUOTED = re.compile(r'^setlocal\s+path="(.*?)"') + PATH_RE_SQUOTED = re.compile(r"^setlocal\s+path='(.*?)'") + PATH_RE_UNQUOTED = re.compile(r'^path=(.*?)$') + + def _re_shift(self, match): + if not match: + return None + path = os.path.expanduser(match.group(1)) + for _ in range(len(path.split())): + self.shift() + return path + + def execute(self): + path = self._re_shift(self.PATH_RE_DQUOTED.match(self.line)) + if path is None: + path = self._re_shift(self.PATH_RE_SQUOTED.match(self.line)) + if path is None: + path = self._re_shift(self.PATH_RE_UNQUOTED.match(self.arg(1))) + if path is None and self.fm.thisdir: + path = self.fm.thisdir.path + if not path: + return + + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, localpath=path) + + +class setintag(set_): + """:setintag <tag or tags> <option name>=<option value> + + Sets an option for directories that are tagged with a specific tag. + """ + + def execute(self): + tags = self.arg(1) + self.shift() + name, value, _ = self.parse_setting_line() + self.fm.set_option_from_string(name, value, tags=tags) + + +class default_linemode(Command): + + def execute(self): + from ranger.container.fsobject import FileSystemObject + + if len(self.args) < 2: + self.fm.notify( + "Usage: default_linemode [path=<regexp> | tag=<tag(s)>] <linemode>", bad=True) + + # Extract options like "path=..." or "tag=..." from the command line + arg1 = self.arg(1) + method = "always" + argument = None + if arg1.startswith("path="): + method = "path" + argument = re.compile(arg1[5:]) + self.shift() + elif arg1.startswith("tag="): + method = "tag" + argument = arg1[4:] + self.shift() + + # Extract and validate the line mode from the command line + lmode = self.rest(1) + if lmode not in FileSystemObject.linemode_dict: + self.fm.notify( + "Invalid linemode: %s; should be %s" % ( + lmode, "/".join(FileSystemObject.linemode_dict)), + bad=True, + ) + + # Add the prepared entry to the fm.default_linemodes + entry = [method, argument, lmode] + self.fm.default_linemodes.appendleft(entry) + + # Redraw the columns + if self.fm.ui.browser: + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + def tab(self, tabnum): + return (self.arg(0) + " " + lmode + for lmode in self.fm.thisfile.linemode_dict.keys() + if lmode.startswith(self.arg(1))) + + +class quit(Command): # pylint: disable=redefined-builtin + """:quit + + Closes the current tab, if there's more than one tab. + Otherwise quits if there are no tasks in progress. + """ + def _exit_no_work(self): + if self.fm.loader.has_work(): + self.fm.notify('Not quitting: Tasks in progress: Use `quit!` to force quit') + else: + self.fm.exit() + + def execute(self): + if len(self.fm.tabs) >= 2: + self.fm.tab_close() + else: + self._exit_no_work() + + +class quit_bang(Command): + """:quit! + + Closes the current tab, if there's more than one tab. + Otherwise force quits immediately. + """ + name = 'quit!' + allow_abbrev = False + + def execute(self): + if len(self.fm.tabs) >= 2: + self.fm.tab_close() + else: + self.fm.exit() + + +class quitall(Command): + """:quitall + + Quits if there are no tasks in progress. + """ + def _exit_no_work(self): + if self.fm.loader.has_work(): + self.fm.notify('Not quitting: Tasks in progress: Use `quitall!` to force quit') + else: + self.fm.exit() + + def execute(self): + self._exit_no_work() + + +class quitall_bang(Command): + """:quitall! + + Force quits immediately. + """ + name = 'quitall!' + allow_abbrev = False + + def execute(self): + self.fm.exit() + + +class terminal(Command): + """:terminal + + Spawns an "x-terminal-emulator" starting in the current directory. + """ + + def execute(self): + from ranger.ext.get_executables import get_term + self.fm.run(get_term(), flags='f') + + +class delete(Command): + """:delete + + Tries to delete the selection or the files passed in arguments (if any). + The arguments use a shell-like escaping. + + "Selection" is defined as all the "marked files" (by default, you + can mark files with space or v). If there are no marked files, + use the "current file" (where the cursor is) + + When attempting to delete non-empty directories or multiple + marked files, it will require a confirmation. + """ + + allow_abbrev = False + escape_macros_for_shell = True + + def execute(self): + import shlex + from functools import partial + + def is_directory_with_files(path): + return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0 + + if self.rest(1): + files = shlex.split(self.rest(1)) + many_files = (len(files) > 1 or is_directory_with_files(files[0])) + else: + cwd = self.fm.thisdir + tfile = self.fm.thisfile + if not cwd or not tfile: + self.fm.notify("Error: no file selected for deletion!", bad=True) + return + + # relative_path used for a user-friendly output in the confirmation. + files = [f.relative_path for f in self.fm.thistab.get_selection()] + many_files = (cwd.marked_items or is_directory_with_files(tfile.path)) + + confirm = self.fm.settings.confirm_on_delete + if confirm != 'never' and (confirm != 'multiple' or many_files): + self.fm.ui.console.ask( + "Confirm deletion of: %s (y/N)" % ', '.join(files), + partial(self._question_callback, files), + ('n', 'N', 'y', 'Y'), + ) + else: + # no need for a confirmation, just delete + self.fm.delete(files) + + def tab(self, tabnum): + return self._tab_directory_content() + + def _question_callback(self, files, answer): + if answer == 'y' or answer == 'Y': + self.fm.delete(files) + + +class trash(Command): + """:trash + + Tries to move the selection or the files passed in arguments (if any) to + the trash, using rifle rules with label "trash". + The arguments use a shell-like escaping. + + "Selection" is defined as all the "marked files" (by default, you + can mark files with space or v). If there are no marked files, + use the "current file" (where the cursor is) + + When attempting to trash non-empty directories or multiple + marked files, it will require a confirmation. + """ + + allow_abbrev = False + escape_macros_for_shell = True + + def execute(self): + import shlex + from functools import partial + + def is_directory_with_files(path): + return os.path.isdir(path) and not os.path.islink(path) and len(os.listdir(path)) > 0 + + if self.rest(1): + files = shlex.split(self.rest(1)) + many_files = (len(files) > 1 or is_directory_with_files(files[0])) + else: + cwd = self.fm.thisdir + tfile = self.fm.thisfile + if not cwd or not tfile: + self.fm.notify("Error: no file selected for deletion!", bad=True) + return + + # relative_path used for a user-friendly output in the confirmation. + files = [f.relative_path for f in self.fm.thistab.get_selection()] + many_files = (cwd.marked_items or is_directory_with_files(tfile.path)) + + confirm = self.fm.settings.confirm_on_delete + if confirm != 'never' and (confirm != 'multiple' or many_files): + self.fm.ui.console.ask( + "Confirm deletion of: %s (y/N)" % ', '.join(files), + partial(self._question_callback, files), + ('n', 'N', 'y', 'Y'), + ) + else: + # no need for a confirmation, just delete + self.fm.execute_file(files, label='trash') + + def tab(self, tabnum): + return self._tab_directory_content() + + def _question_callback(self, files, answer): + if answer == 'y' or answer == 'Y': + self.fm.execute_file(files, label='trash') + + +class jump_non(Command): + """:jump_non [-FLAGS...] + + Jumps to first non-directory if highlighted file is a directory and vice versa. + + Flags: + -r Jump in reverse order + -w Wrap around if reaching end of filelist + """ + def __init__(self, *args, **kwargs): + super(jump_non, self).__init__(*args, **kwargs) + + flags, _ = self.parse_flags() + self._flag_reverse = 'r' in flags + self._flag_wrap = 'w' in flags + + @staticmethod + def _non(fobj, is_directory): + return fobj.is_directory if not is_directory else not fobj.is_directory + + def execute(self): + tfile = self.fm.thisfile + passed = False + found_before = None + found_after = None + for fobj in self.fm.thisdir.files[::-1] if self._flag_reverse else self.fm.thisdir.files: + if fobj.path == tfile.path: + passed = True + continue + + if passed: + if self._non(fobj, tfile.is_directory): + found_after = fobj.path + break + elif not found_before and self._non(fobj, tfile.is_directory): + found_before = fobj.path + + if found_after: + self.fm.select_file(found_after) + elif self._flag_wrap and found_before: + self.fm.select_file(found_before) + + +class mark_tag(Command): + """:mark_tag [<tags>] + + Mark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are marked. + """ + do_mark = True + + def execute(self): + cwd = self.fm.thisdir + tags = self.rest(1).replace(" ", "") + if not self.fm.tags or not cwd.files: + return + for fileobj in cwd.files: + try: + tag = self.fm.tags.tags[fileobj.realpath] + except KeyError: + continue + if not tags or tag in tags: + cwd.mark_item(fileobj, val=self.do_mark) + self.fm.ui.status.need_redraw = True + self.fm.ui.need_redraw = True + + +class console(Command): + """:console <command> + + Open the console with the given command. + """ + + def execute(self): + position = None + if self.arg(1)[0:2] == '-p': + try: + position = int(self.arg(1)[2:]) + except ValueError: + pass + else: + self.shift() + self.fm.open_console(self.rest(1), position=position) + + +class load_copy_buffer(Command): + """:load_copy_buffer + + Load the copy buffer from datadir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + + def execute(self): + import sys + from ranger.container.file import File + from os.path import exists + fname = self.fm.datapath(self.copy_buffer_filename) + unreadable = IOError if sys.version_info[0] < 3 else OSError + try: + fobj = open(fname, 'r') + except unreadable: + return self.fm.notify( + "Cannot open %s" % (fname or self.copy_buffer_filename), bad=True) + + self.fm.copy_buffer = set(File(g) + for g in fobj.read().split("\n") if exists(g)) + fobj.close() + self.fm.ui.redraw_main_column() + return None + + +class save_copy_buffer(Command): + """:save_copy_buffer + + Save the copy buffer to datadir/copy_buffer + """ + copy_buffer_filename = 'copy_buffer' + + def execute(self): + import sys + fname = None + fname = self.fm.datapath(self.copy_buffer_filename) + unwritable = IOError if sys.version_info[0] < 3 else OSError + try: + fobj = open(fname, 'w') + except unwritable: + return self.fm.notify("Cannot open %s" % + (fname or self.copy_buffer_filename), bad=True) + fobj.write("\n".join(fobj.path for fobj in self.fm.copy_buffer)) + fobj.close() + return None + + +class unmark_tag(mark_tag): + """:unmark_tag [<tags>] + + Unmark all tags that are tagged with either of the given tags. + When leaving out the tag argument, all tagged files are unmarked. + """ + do_mark = False + + +class mkdir(Command): + """:mkdir <dirname> + + Creates a directory with the name <dirname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + from os import makedirs + + dirname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(dirname): + makedirs(dirname) + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class touch(Command): + """:touch <fname> + + Creates a file with the name <fname>. + """ + + def execute(self): + from os.path import join, expanduser, lexists + + fname = join(self.fm.thisdir.path, expanduser(self.rest(1))) + if not lexists(fname): + open(fname, 'a').close() + else: + self.fm.notify("file/directory exists!", bad=True) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class edit(Command): + """:edit <filename> + + Opens the specified file in vim + """ + + def execute(self): + if not self.arg(1): + self.fm.edit_file(self.fm.thisfile.path) + else: + self.fm.edit_file(self.rest(1)) + + def tab(self, tabnum): + return self._tab_directory_content() + + +class eval_(Command): + """:eval [-q] <python code> + + Evaluates the python code. + `fm' is a reference to the FM instance. + To display text, use the function `p'. + + Examples: + :eval fm + :eval len(fm.directories) + :eval p("Hello World!") + """ + name = 'eval' + resolve_macros = False + + def execute(self): + # The import is needed so eval() can access the ranger module + import ranger # NOQA pylint: disable=unused-import,unused-variable + if self.arg(1) == '-q': + code = self.rest(2) + quiet = True + else: + code = self.rest(1) + quiet = False + global cmd, fm, p, quantifier # pylint: disable=invalid-name,global-variable-undefined + fm = self.fm + cmd = self.fm.execute_console + p = fm.notify + quantifier = self.quantifier + try: + try: + result = eval(code) # pylint: disable=eval-used + except SyntaxError: + exec(code) # pylint: disable=exec-used + else: + if result and not quiet: + p(result) + except Exception as err: # pylint: disable=broad-except + fm.notify("The error `%s` was caused by evaluating the " + "following code: `%s`" % (err, code), bad=True) + + +class rename(Command): + """:rename <newname> + + Changes the name of the currently highlighted file to <newname> + """ + + def execute(self): + from ranger.container.file import File + from os import access + + new_name = self.rest(1) + + if not new_name: + return self.fm.notify('Syntax: rename <newname>', bad=True) + + if new_name == self.fm.thisfile.relative_path: + return None + + if access(new_name, os.F_OK): + return self.fm.notify("Can't rename: file already exists!", bad=True) + + if self.fm.rename(self.fm.thisfile, new_name): + file_new = File(new_name) + self.fm.bookmarks.update_path(self.fm.thisfile.path, file_new) + self.fm.tags.update_path(self.fm.thisfile.path, file_new.path) + self.fm.thisdir.pointed_obj = file_new + self.fm.thisfile = file_new + + return None + + def tab(self, tabnum): + return self._tab_directory_content() + + +class rename_append(Command): + """:rename_append [-FLAGS...] + + Opens the console with ":rename <current file>" with the cursor positioned + before the file extension. + + Flags: + -a Position before all extensions + -r Remove everything before extensions + """ + def __init__(self, *args, **kwargs): + super(rename_append, self).__init__(*args, **kwargs) + + flags, _ = self.parse_flags() + self._flag_ext_all = 'a' in flags + self._flag_remove = 'r' in flags + + def execute(self): + from ranger import MACRO_DELIMITER, MACRO_DELIMITER_ESC + + tfile = self.fm.thisfile + relpath = tfile.relative_path.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC) + basename = tfile.basename.replace(MACRO_DELIMITER, MACRO_DELIMITER_ESC) + + if basename.find('.') <= 0 or os.path.isdir(relpath): + self.fm.open_console('rename ' + relpath) + return + + if self._flag_ext_all: + pos_ext = re.search(r'[^.]+', basename).end(0) + else: + pos_ext = basename.rindex('.') + pos = len(relpath) - len(basename) + pos_ext + + if self._flag_remove: + relpath = relpath[:-len(basename)] + basename[pos_ext:] + pos -= pos_ext + + self.fm.open_console('rename ' + relpath, position=(7 + pos)) + + +class chmod(Command): + """:chmod <octal number> + + Sets the permissions of the selection to the octal number. + + The octal number is between 0 and 777. The digits specify the + permissions for the user, the group and others. + + A 1 permits execution, a 2 permits writing, a 4 permits reading. + Add those numbers to combine them. So a 7 permits everything. + """ + + def execute(self): + mode_str = self.rest(1) + if not mode_str: + if self.quantifier is None: + self.fm.notify("Syntax: chmod <octal number> " + "or specify a quantifier", bad=True) + return + mode_str = str(self.quantifier) + + try: + mode = int(mode_str, 8) + if mode < 0 or mode > 0o777: + raise ValueError + except ValueError: + self.fm.notify("Need an octal number between 0 and 777!", bad=True) + return + + for fobj in self.fm.thistab.get_selection(): + try: + os.chmod(fobj.path, mode) + except OSError as ex: + self.fm.notify(ex) + + # reloading directory. maybe its better to reload the selected + # files only. + self.fm.thisdir.content_outdated = True + + +class bulkrename(Command): + """:bulkrename + + This command opens a list of selected files in an external editor. + After you edit and save the file, it will generate a shell script + which does bulk renaming according to the changes you did in the file. + + This shell script is opened in an editor for you to review. + After you close it, it will be executed. + """ + + def execute(self): + # pylint: disable=too-many-locals,too-many-statements,too-many-branches + import sys + import tempfile + from ranger.container.file import File + from ranger.ext.shell_escape import shell_escape as esc + py3 = sys.version_info[0] >= 3 + + # Create and edit the file list + filenames = [f.relative_path for f in self.fm.thistab.get_selection()] + with tempfile.NamedTemporaryFile(delete=False) as listfile: + listpath = listfile.name + if py3: + listfile.write("\n".join(filenames).encode( + encoding="utf-8", errors="surrogateescape")) + else: + listfile.write("\n".join(filenames)) + self.fm.execute_file([File(listpath)], app='editor') + with (open(listpath, 'r', encoding="utf-8", errors="surrogateescape") if + py3 else open(listpath, 'r')) as listfile: + new_filenames = listfile.read().split("\n") + os.unlink(listpath) + if all(a == b for a, b in zip(filenames, new_filenames)): + self.fm.notify("No renaming to be done!") + return + + # Generate script + with tempfile.NamedTemporaryFile() as cmdfile: + script_lines = [] + script_lines.append("# This file will be executed when you close" + " the editor.") + script_lines.append("# Please double-check everything, clear the" + " file to abort.") + new_dirs = [] + for old, new in zip(filenames, new_filenames): + if old != new: + basepath, _ = os.path.split(new) + if (basepath and basepath not in new_dirs + and not os.path.isdir(basepath)): + script_lines.append("mkdir -vp -- {dir}".format( + dir=esc(basepath))) + new_dirs.append(basepath) + script_lines.append("mv -vi -- {old} {new}".format( + old=esc(old), new=esc(new))) + # Make sure not to forget the ending newline + script_content = "\n".join(script_lines) + "\n" + if py3: + cmdfile.write(script_content.encode(encoding="utf-8", + errors="surrogateescape")) + else: + cmdfile.write(script_content) + cmdfile.flush() + + # Open the script and let the user review it, then check if the + # script was modified by the user + self.fm.execute_file([File(cmdfile.name)], app='editor') + cmdfile.seek(0) + script_was_edited = (script_content != cmdfile.read()) + + # Do the renaming + self.fm.run(['/bin/sh', cmdfile.name], flags='w') + + # Retag the files, but only if the script wasn't changed during review, + # because only then we know which are the source and destination files. + if not script_was_edited: + tags_changed = False + for old, new in zip(filenames, new_filenames): + if old != new: + oldpath = self.fm.thisdir.path + '/' + old + newpath = self.fm.thisdir.path + '/' + new + if oldpath in self.fm.tags: + old_tag = self.fm.tags.tags[oldpath] + self.fm.tags.remove(oldpath) + self.fm.tags.tags[newpath] = old_tag + tags_changed = True + if tags_changed: + self.fm.tags.dump() + else: + fm.notify("files have not been retagged") + + +class relink(Command): + """:relink <newpath> + + Changes the linked path of the currently highlighted symlink to <newpath> + """ + + def execute(self): + new_path = self.rest(1) + tfile = self.fm.thisfile + + if not new_path: + return self.fm.notify('Syntax: relink <newpath>', bad=True) + + if not tfile.is_link: + return self.fm.notify('%s is not a symlink!' % tfile.relative_path, bad=True) + + if new_path == os.readlink(tfile.path): + return None + + try: + os.remove(tfile.path) + os.symlink(new_path, tfile.path) + except OSError as err: + self.fm.notify(err) + + self.fm.reset() + self.fm.thisdir.pointed_obj = tfile + self.fm.thisfile = tfile + + return None + + def tab(self, tabnum): + if not self.rest(1): + return self.line + os.readlink(self.fm.thisfile.path) + return self._tab_directory_content() + + +class help_(Command): + """:help + + Display ranger's manual page. + """ + name = 'help' + + def execute(self): + def callback(answer): + if answer == "q": + return + elif answer == "m": + self.fm.display_help() + elif answer == "c": + self.fm.dump_commands() + elif answer == "k": + self.fm.dump_keybindings() + elif answer == "s": + self.fm.dump_settings() + + self.fm.ui.console.ask( + "View [m]an page, [k]ey bindings, [c]ommands or [s]ettings? (press q to abort)", + callback, + list("mqkcs") + ) + + +class copymap(Command): + """:copymap <keys> <newkeys1> [<newkeys2>...] + + Copies a "browser" keybinding from <keys> to <newkeys> + """ + context = 'browser' + + def execute(self): + if not self.arg(1) or not self.arg(2): + return self.fm.notify("Not enough arguments", bad=True) + + for arg in self.args[2:]: + self.fm.ui.keymaps.copy(self.context, self.arg(1), arg) + + return None + + +class copypmap(copymap): + """:copypmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "pager" keybinding from <keys> to <newkeys> + """ + context = 'pager' + + +class copycmap(copymap): + """:copycmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "console" keybinding from <keys> to <newkeys> + """ + context = 'console' + + +class copytmap(copymap): + """:copytmap <keys> <newkeys1> [<newkeys2>...] + + Copies a "taskview" keybinding from <keys> to <newkeys> + """ + context = 'taskview' + + +class unmap(Command): + """:unmap <keys> [<keys2>, ...] + + Remove the given "browser" mappings + """ + context = 'browser' + + def execute(self): + for arg in self.args[1:]: + self.fm.ui.keymaps.unbind(self.context, arg) + + +class uncmap(unmap): + """:uncmap <keys> [<keys2>, ...] + + Remove the given "console" mappings + """ + context = 'console' + + +class cunmap(uncmap): + """:cunmap <keys> [<keys2>, ...] + + Remove the given "console" mappings + + DEPRECATED in favor of uncmap. + """ + + def execute(self): + self.fm.notify("cunmap is deprecated in favor of uncmap!") + super(cunmap, self).execute() + + +class unpmap(unmap): + """:unpmap <keys> [<keys2>, ...] + + Remove the given "pager" mappings + """ + context = 'pager' + + +class punmap(unpmap): + """:punmap <keys> [<keys2>, ...] + + Remove the given "pager" mappings + + DEPRECATED in favor of unpmap. + """ + + def execute(self): + self.fm.notify("punmap is deprecated in favor of unpmap!") + super(punmap, self).execute() + + +class untmap(unmap): + """:untmap <keys> [<keys2>, ...] + + Remove the given "taskview" mappings + """ + context = 'taskview' + + +class tunmap(untmap): + """:tunmap <keys> [<keys2>, ...] + + Remove the given "taskview" mappings + + DEPRECATED in favor of untmap. + """ + + def execute(self): + self.fm.notify("tunmap is deprecated in favor of untmap!") + super(tunmap, self).execute() + + +class map_(Command): + """:map <keysequence> <command> + + Maps a command to a keysequence in the "browser" context. + + Example: + map j move down + map J move down 10 + """ + name = 'map' + context = 'browser' + resolve_macros = False + + def execute(self): + if not self.arg(1) or not self.arg(2): + self.fm.notify("Syntax: {0} <keysequence> <command>".format(self.get_name()), bad=True) + return + + self.fm.ui.keymaps.bind(self.context, self.arg(1), self.rest(2)) + + +class cmap(map_): + """:cmap <keysequence> <command> + + Maps a command to a keysequence in the "console" context. + + Example: + cmap <ESC> console_close + cmap <C-x> console_type test + """ + context = 'console' + + +class tmap(map_): + """:tmap <keysequence> <command> + + Maps a command to a keysequence in the "taskview" context. + """ + context = 'taskview' + + +class pmap(map_): + """:pmap <keysequence> <command> + + Maps a command to a keysequence in the "pager" context. + """ + context = 'pager' + + +class scout(Command): + """:scout [-FLAGS...] <pattern> + + Swiss army knife command for searching, traveling and filtering files. + + Flags: + -a Automatically open a file on unambiguous match + -e Open the selected file when pressing enter + -f Filter files that match the current search pattern + -g Interpret pattern as a glob pattern + -i Ignore the letter case of the files + -k Keep the console open when changing a directory with the command + -l Letter skipping; e.g. allow "rdme" to match the file "readme" + -m Mark the matching files after pressing enter + -M Unmark the matching files after pressing enter + -p Permanent filter: hide non-matching files after pressing enter + -r Interpret pattern as a regular expression pattern + -s Smart case; like -i unless pattern contains upper case letters + -t Apply filter and search pattern as you type + -v Inverts the match + + Multiple flags can be combined. For example, ":scout -gpt" would create + a :filter-like command using globbing. + """ + # pylint: disable=bad-whitespace + AUTO_OPEN = 'a' + OPEN_ON_ENTER = 'e' + FILTER = 'f' + SM_GLOB = 'g' + IGNORE_CASE = 'i' + KEEP_OPEN = 'k' + SM_LETTERSKIP = 'l' + MARK = 'm' + UNMARK = 'M' + PERM_FILTER = 'p' + SM_REGEX = 'r' + SMART_CASE = 's' + AS_YOU_TYPE = 't' + INVERT = 'v' + # pylint: enable=bad-whitespace + + def __init__(self, *args, **kwargs): + super(scout, self).__init__(*args, **kwargs) + self._regex = None + self.flags, self.pattern = self.parse_flags() + + def execute(self): # pylint: disable=too-many-branches + thisdir = self.fm.thisdir + flags = self.flags + pattern = self.pattern + regex = self._build_regex() + count = self._count(move=True) + + self.fm.thistab.last_search = regex + self.fm.set_search_method(order="search") + + if (self.MARK in flags or self.UNMARK in flags) and thisdir.files: + value = flags.find(self.MARK) > flags.find(self.UNMARK) + if self.FILTER in flags: + for fobj in thisdir.files: + thisdir.mark_item(fobj, value) + else: + for fobj in thisdir.files: + if regex.search(fobj.relative_path): + thisdir.mark_item(fobj, value) + + if self.PERM_FILTER in flags: + thisdir.filter = regex if pattern else None + + # clean up: + self.cancel() + + if self.OPEN_ON_ENTER in flags or \ + (self.AUTO_OPEN in flags and count == 1): + if pattern == '..': + self.fm.cd(pattern) + else: + self.fm.move(right=1) + if self.quickly_executed: + self.fm.block_input(0.5) + + if self.KEEP_OPEN in flags and thisdir != self.fm.thisdir: + # reopen the console: + if not pattern: + self.fm.open_console(self.line) + else: + self.fm.open_console(self.line[0:-len(pattern)]) + + if self.quickly_executed and thisdir != self.fm.thisdir and pattern != "..": + self.fm.block_input(0.5) + + def cancel(self): + self.fm.thisdir.temporary_filter = None + self.fm.thisdir.refilter() + + def quick(self): + asyoutype = self.AS_YOU_TYPE in self.flags + if self.FILTER in self.flags: + self.fm.thisdir.temporary_filter = self._build_regex() + if self.PERM_FILTER in self.flags and asyoutype: + self.fm.thisdir.filter = self._build_regex() + if self.FILTER in self.flags or self.PERM_FILTER in self.flags: + self.fm.thisdir.refilter() + if self._count(move=asyoutype) == 1 and self.AUTO_OPEN in self.flags: + return True + return False + + def tab(self, tabnum): + self._count(move=True, offset=tabnum) + + def _build_regex(self): + if self._regex is not None: + return self._regex + + frmat = "%s" + flags = self.flags + pattern = self.pattern + + if pattern == ".": + return re.compile("") + + # Handle carets at start and dollar signs at end separately + if pattern.startswith('^'): + pattern = pattern[1:] + frmat = "^" + frmat + if pattern.endswith('$'): + pattern = pattern[:-1] + frmat += "$" + + # Apply one of the search methods + if self.SM_REGEX in flags: + regex = pattern + elif self.SM_GLOB in flags: + regex = re.escape(pattern).replace("\\*", ".*").replace("\\?", ".") + elif self.SM_LETTERSKIP in flags: + regex = ".*".join(re.escape(c) for c in pattern) + else: + regex = re.escape(pattern) + + regex = frmat % regex + + # Invert regular expression if necessary + if self.INVERT in flags: + regex = "^(?:(?!%s).)*$" % regex + + # Compile Regular Expression + # pylint: disable=no-member + options = re.UNICODE + if self.IGNORE_CASE in flags or self.SMART_CASE in flags and \ + pattern.islower(): + options |= re.IGNORECASE + # pylint: enable=no-member + try: + self._regex = re.compile(regex, options) + except re.error: + self._regex = re.compile("") + return self._regex + + def _count(self, move=False, offset=0): + count = 0 + cwd = self.fm.thisdir + pattern = self.pattern + + if not pattern or not cwd.files: + return 0 + if pattern == '.': + return 0 + if pattern == '..': + return 1 + + deq = deque(cwd.files) + deq.rotate(-cwd.pointer - offset) + i = offset + regex = self._build_regex() + for fsobj in deq: + if regex.search(fsobj.relative_path): + count += 1 + if move and count == 1: + cwd.move(to=(cwd.pointer + i) % len(cwd.files)) + self.fm.thisfile = cwd.pointed_obj + if count > 1: + return count + i += 1 + + return count == 1 + + +class narrow(Command): + """ + :narrow + + Show only the files selected right now. If no files are selected, + disable narrowing. + """ + def execute(self): + if self.fm.thisdir.marked_items: + selection = [f.basename for f in self.fm.thistab.get_selection()] + self.fm.thisdir.narrow_filter = selection + else: + self.fm.thisdir.narrow_filter = None + self.fm.thisdir.refilter() + + +class filter_inode_type(Command): + """ + :filter_inode_type [dfl] + + Displays only the files of specified inode type. Parameters + can be combined. + + d display directories + f display files + l display links + """ + + def execute(self): + if not self.arg(1): + self.fm.thisdir.inode_type_filter = "" + else: + self.fm.thisdir.inode_type_filter = self.arg(1) + self.fm.thisdir.refilter() + + +class filter_stack(Command): + """ + :filter_stack ... + + Manages the filter stack. + + filter_stack add FILTER_TYPE ARGS... + filter_stack pop + filter_stack decompose + filter_stack rotate [N=1] + filter_stack clear + filter_stack show + """ + def execute(self): + from ranger.core.filter_stack import SIMPLE_FILTERS, FILTER_COMBINATORS + + subcommand = self.arg(1) + + if subcommand == "add": + try: + self.fm.thisdir.filter_stack.append( + SIMPLE_FILTERS[self.arg(2)](self.rest(3)) + ) + except KeyError: + FILTER_COMBINATORS[self.arg(2)](self.fm.thisdir.filter_stack) + elif subcommand == "pop": + self.fm.thisdir.filter_stack.pop() + elif subcommand == "decompose": + inner_filters = self.fm.thisdir.filter_stack.pop().decompose() + if inner_filters: + self.fm.thisdir.filter_stack.extend(inner_filters) + elif subcommand == "clear": + self.fm.thisdir.filter_stack = [] + elif subcommand == "rotate": + rotate_by = int(self.arg(2) or self.quantifier or 1) + self.fm.thisdir.filter_stack = ( + self.fm.thisdir.filter_stack[-rotate_by:] + + self.fm.thisdir.filter_stack[:-rotate_by] + ) + elif subcommand == "show": + stack = list(map(str, self.fm.thisdir.filter_stack)) + pager = self.fm.ui.open_pager() + pager.set_source(["Filter stack: "] + stack) + pager.move(to=100, percentage=True) + return + else: + self.fm.notify( + "Unknown subcommand: {}".format(subcommand), + bad=True + ) + return + + self.fm.thisdir.refilter() + + +class grep(Command): + """:grep <string> + + Looks for a string in all marked files or directories + """ + + def execute(self): + if self.rest(1): + action = ['grep', '--line-number'] + action.extend(['-e', self.rest(1), '-r']) + action.extend(f.path for f in self.fm.thistab.get_selection()) + self.fm.execute_command(action, flags='p') + + +class flat(Command): + """ + :flat <level> + + Flattens the directory view up to the specified level. + + -1 fully flattened + 0 remove flattened view + """ + + def execute(self): + try: + level_str = self.rest(1) + level = int(level_str) + except ValueError: + level = self.quantifier + if level is None: + self.fm.notify("Syntax: flat <level>", bad=True) + return + if level < -1: + self.fm.notify("Need an integer number (-1, 0, 1, ...)", bad=True) + self.fm.thisdir.unload() + self.fm.thisdir.flat = level + self.fm.thisdir.load_content() + + +class reset_previews(Command): + """:reset_previews + + Reset the file previews. + """ + def execute(self): + self.fm.previews = {} + self.fm.ui.need_redraw = True + + +# Version control commands +# -------------------------------- + + +class stage(Command): + """ + :stage + + Stage selected files for the corresponding version control system + """ + + def execute(self): + from ranger.ext.vcs import VcsError + + if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track: + filelist = [f.path for f in self.fm.thistab.get_selection()] + try: + self.fm.thisdir.vcs.action_add(filelist) + except VcsError as ex: + self.fm.notify('Unable to stage files: {0}'.format(ex)) + self.fm.ui.vcsthread.process(self.fm.thisdir) + else: + self.fm.notify('Unable to stage files: Not in repository') + + +class unstage(Command): + """ + :unstage + + Unstage selected files for the corresponding version control system + """ + + def execute(self): + from ranger.ext.vcs import VcsError + + if self.fm.thisdir.vcs and self.fm.thisdir.vcs.track: + filelist = [f.path for f in self.fm.thistab.get_selection()] + try: + self.fm.thisdir.vcs.action_reset(filelist) + except VcsError as ex: + self.fm.notify('Unable to unstage files: {0}'.format(ex)) + self.fm.ui.vcsthread.process(self.fm.thisdir) + else: + self.fm.notify('Unable to unstage files: Not in repository') + +# Metadata commands +# -------------------------------- + + +class prompt_metadata(Command): + """ + :prompt_metadata <key1> [<key2> [<key3> ...]] + + Prompt the user to input metadata for multiple keys in a row. + """ + + _command_name = "meta" + _console_chain = None + + def execute(self): + prompt_metadata._console_chain = self.args[1:] + self._process_command_stack() + + def _process_command_stack(self): + if prompt_metadata._console_chain: + key = prompt_metadata._console_chain.pop() + self._fill_console(key) + else: + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + def _fill_console(self, key): + metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path) + if key in metadata and metadata[key]: + existing_value = metadata[key] + else: + existing_value = "" + text = "%s %s %s" % (self._command_name, key, existing_value) + self.fm.open_console(text, position=len(text)) + + +class meta(prompt_metadata): + """ + :meta <key> [<value>] + + Change metadata of a file. Deletes the key if value is empty. + """ + + def execute(self): + key = self.arg(1) + update_dict = dict() + update_dict[key] = self.rest(2) + selection = self.fm.thistab.get_selection() + for fobj in selection: + self.fm.metadata.set_metadata(fobj.path, update_dict) + self._process_command_stack() + + def tab(self, tabnum): + key = self.arg(1) + metadata = self.fm.metadata.get_metadata(self.fm.thisfile.path) + if key in metadata and metadata[key]: + return [" ".join([self.arg(0), self.arg(1), metadata[key]])] + return [self.arg(0) + " " + k for k in sorted(metadata) + if k.startswith(self.arg(1))] + + +class linemode(default_linemode): + """ + :linemode <mode> + + Change what is displayed as a filename. + + - "mode" may be any of the defined linemodes (see: ranger.core.linemode). + "normal" is mapped to "filename". + """ + + def execute(self): + mode = self.arg(1) + + if mode == "normal": + from ranger.core.linemode import DEFAULT_LINEMODE + mode = DEFAULT_LINEMODE + + if mode not in self.fm.thisfile.linemode_dict: + self.fm.notify("Unhandled linemode: `%s'" % mode, bad=True) + return + + self.fm.thisdir.set_linemode_of_children(mode) + + # Ask the browsercolumns to redraw + for col in self.fm.ui.browser.columns: + col.need_redraw = True + + +class yank(Command): + """:yank [name|dir|path] + + Copies the file's name (default), directory or path into both the primary X + selection and the clipboard. + """ + + modes = { + '': 'basename', + 'name_without_extension': 'basename_without_extension', + 'name': 'basename', + 'dir': 'dirname', + 'path': 'path', + } + + def execute(self): + import subprocess + + def clipboards(): + from ranger.ext.get_executables import get_executables + clipboard_managers = { + 'xclip': [ + ['xclip'], + ['xclip', '-selection', 'clipboard'], + ], + 'xsel': [ + ['xsel'], + ['xsel', '-b'], + ], + 'wl-copy': [ + ['wl-copy'], + ], + 'pbcopy': [ + ['pbcopy'], + ], + } + ordered_managers = ['pbcopy', 'wl-copy', 'xclip', 'xsel'] + executables = get_executables() + for manager in ordered_managers: + if manager in executables: + return clipboard_managers[manager] + return [] + + clipboard_commands = clipboards() + + mode = self.modes[self.arg(1)] + selection = self.get_selection_attr(mode) + + new_clipboard_contents = "\n".join(selection) + for command in clipboard_commands: + process = subprocess.Popen(command, universal_newlines=True, + stdin=subprocess.PIPE) + process.communicate(input=new_clipboard_contents) + + def get_selection_attr(self, attr): + return [getattr(item, attr) for item in + self.fm.thistab.get_selection()] + + def tab(self, tabnum): + return ( + self.start(1) + mode for mode + in sorted(self.modes.keys()) + if mode + ) + + +class paste_ext(Command): + """ + :paste_ext + + Like paste but tries to rename conflicting files so that the + file extension stays intact (e.g. file_.ext). + """ + + @staticmethod + def make_safe_path(dst): + if not os.path.exists(dst): + return dst + + dst_name, dst_ext = os.path.splitext(dst) + + if not dst_name.endswith("_"): + dst_name += "_" + if not os.path.exists(dst_name + dst_ext): + return dst_name + dst_ext + n = 0 + test_dst = dst_name + str(n) + while os.path.exists(test_dst + dst_ext): + n += 1 + test_dst = dst_name + str(n) + + return test_dst + dst_ext + + def execute(self): + return self.fm.paste(make_safe_path=paste_ext.make_safe_path) diff --git a/config/ranger/rc.conf b/config/ranger/rc.conf @@ -0,0 +1,759 @@ +# =================================================================== +# This file contains the default startup commands for ranger. +# To change them, it is recommended to create either /etc/ranger/rc.conf +# (system-wide) or ~/.config/ranger/rc.conf (per user) and add your custom +# commands there. +# +# If you copy this whole file there, you may want to set the environment +# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice. +# +# The purpose of this file is mainly to define keybindings and settings. +# For running more complex python code, please create a plugin in "plugins/" or +# a command in "commands.py". +# +# Each line is a command that will be run before the user interface +# is initialized. As a result, you can not use commands which rely +# on the UI such as :delete or :mark. +# =================================================================== + +# =================================================================== +# == Options +# =================================================================== + +# Which viewmode should be used? Possible values are: +# miller: Use miller columns which show multiple levels of the hierarchy +# multipane: Midnight-commander like multipane view showing all tabs next +# to each other +set viewmode miller +#set viewmode multipane + +# How many columns are there, and what are their relative widths? +set column_ratios 1,3,4 + +# Which files should be hidden? (regular expression) +set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$ + +# Show hidden files? You can toggle this by typing 'zh' +set show_hidden false + +# Ask for a confirmation when running the "delete" command? +# Valid values are "always", "never", "multiple" (default) +# With "multiple", ranger will ask only if you delete multiple files at once. +set confirm_on_delete multiple + +# Use non-default path for file preview script? +# ranger ships with scope.sh, a script that calls external programs (see +# README.md for dependencies) to preview images, archives, etc. +#set preview_script ~/.config/ranger/scope.sh + +# Use the external preview script or display simple plain text or image previews? +set use_preview_script true + +# Automatically count files in the directory, even before entering them? +set automatically_count_files true + +# Open all images in this directory when running certain image viewers +# like feh or sxiv? You can still open selected files by marking them. +set open_all_images true + +# Be aware of version control systems and display information. +set vcs_aware false + +# State of the four backends git, hg, bzr, svn. The possible states are +# disabled, local (only show local info), enabled (show local and remote +# information). +set vcs_backend_git enabled +set vcs_backend_hg disabled +set vcs_backend_bzr disabled +set vcs_backend_svn disabled + +# Truncate the long commit messages to this length when shown in the statusbar. +set vcs_msg_length 50 + +# Use one of the supported image preview protocols +set preview_images false + +# Set the preview image method. Supported methods: +# +# * w3m (default): +# Preview images in full color with the external command "w3mimgpreview"? +# This requires the console web browser "w3m" and a supported terminal. +# It has been successfully tested with "xterm" and "urxvt" without tmux. +# +# * iterm2: +# Preview images in full color using iTerm2 image previews +# (http://iterm2.com/images.html). This requires using iTerm2 compiled +# with image preview support. +# +# This feature relies on the dimensions of the terminal's font. By default, a +# width of 8 and height of 11 are used. To use other values, set the options +# iterm2_font_width and iterm2_font_height to the desired values. +# +# * terminology: +# Previews images in full color in the terminology terminal emulator. +# Supports a wide variety of formats, even vector graphics like svg. +# +# * urxvt: +# Preview images in full color using urxvt image backgrounds. This +# requires using urxvt compiled with pixbuf support. +# +# * urxvt-full: +# The same as urxvt but utilizing not only the preview pane but the +# whole terminal window. +# +# * kitty: +# Preview images in full color using kitty image protocol. +# Requires python PIL or pillow library. +# If ranger does not share the local filesystem with kitty +# the transfer method is changed to encode the whole image; +# while slower, this allows remote previews, +# for example during an ssh session. +# Tmux is unsupported. +# +# * ueberzug: +# Preview images in full color with the external command "ueberzug". +# Images are shown by using a child window. +# Only for users who run X11 in GNU/Linux. +set preview_images_method w3m + +# Delay in seconds before displaying an image with the w3m method. +# Increase it in case of experiencing display corruption. +set w3m_delay 0.02 + +# Manually adjust the w3mimg offset when using a terminal which needs this +set w3m_offset 0 + +# Default iTerm2 font size (see: preview_images_method: iterm2) +set iterm2_font_width 8 +set iterm2_font_height 11 + +# Use a unicode "..." character to mark cut-off filenames? +set unicode_ellipsis false + +# BIDI support - try to properly display file names in RTL languages (Hebrew, Arabic). +# Requires the python-bidi pip package +set bidi_support false + +# Show dotfiles in the bookmark preview box? +set show_hidden_bookmarks true + +# Which colorscheme to use? These colorschemes are available by default: +# default, jungle, snow, solarized +set colorscheme default + +# Preview files on the rightmost column? +# And collapse (shrink) the last column if there is nothing to preview? +set preview_files true +set preview_directories true +set collapse_preview true + +# Wrap long lines in plain text previews? +set wrap_plaintext_previews false + +# Save the console history on exit? +set save_console_history true + +# Draw the status bar on top of the browser window (default: bottom) +set status_bar_on_top false + +# Draw a progress bar in the status bar which displays the average state of all +# currently running tasks which support progress bars? +set draw_progress_bar_in_status_bar true + +# Draw borders around columns? (separators, outline, both, or none) +# Separators are vertical lines between columns. +# Outline draws a box around all the columns. +# Both combines the two. +set draw_borders none + +# Display the directory name in tabs? +set dirname_in_tabs false + +# Enable the mouse support? +set mouse_enabled true + +# Display the file size in the main column or status bar? +set display_size_in_main_column true +set display_size_in_status_bar true + +# Display the free disk space in the status bar? +set display_free_space_in_status_bar true + +# Display files tags in all columns or only in main column? +set display_tags_in_all_columns true + +# Set a title for the window? Updates both `WM_NAME` and `WM_ICON_NAME` +set update_title false + +# Set the tmux/screen window-name to "ranger"? +set update_tmux_title true + +# Shorten the title if it gets long? The number defines how many +# directories are displayed at once, 0 turns off this feature. +set shorten_title 3 + +# Show hostname in titlebar? +set hostname_in_titlebar true + +# Abbreviate $HOME with ~ in the titlebar (first line) of ranger? +set tilde_in_titlebar false + +# How many directory-changes or console-commands should be kept in history? +set max_history_size 20 +set max_console_history_size 50 + +# Try to keep so much space between the top/bottom border when scrolling: +set scroll_offset 8 + +# Flush the input after each key hit? (Noticeable when ranger lags) +set flushinput true + +# Padding on the right when there's no preview? +# This allows you to click into the space to run the file. +set padding_right true + +# Save bookmarks (used with mX and `X) instantly? +# This helps to synchronize bookmarks between multiple ranger +# instances but leads to *slight* performance loss. +# When false, bookmarks are saved when ranger is exited. +set autosave_bookmarks true + +# Save the "`" bookmark to disk. This can be used to switch to the last +# directory by typing "``". +set save_backtick_bookmark true + +# You can display the "real" cumulative size of directories by using the +# command :get_cumulative_size or typing "dc". The size is expensive to +# calculate and will not be updated automatically. You can choose +# to update it automatically though by turning on this option: +set autoupdate_cumulative_size false + +# Turning this on makes sense for screen readers: +set show_cursor false + +# One of: size, natural, basename, atime, ctime, mtime, type, random +set sort natural + +# Additional sorting options +set sort_reverse false +set sort_case_insensitive true +set sort_directories_first true +set sort_unicode false + +# Enable this if key combinations with the Alt Key don't work for you. +# (Especially on xterm) +set xterm_alt_key false + +# Whether to include bookmarks in cd command +set cd_bookmarks true + +# Changes case sensitivity for the cd command tab completion +set cd_tab_case sensitive + +# Use fuzzy tab completion with the "cd" command. For example, +# ":cd /u/lo/b<tab>" expands to ":cd /usr/local/bin". +set cd_tab_fuzzy false + +# Avoid previewing files larger than this size, in bytes. Use a value of 0 to +# disable this feature. +set preview_max_size 0 + +# The key hint lists up to this size have their sublists expanded. +# Otherwise the submaps are replaced with "...". +set hint_collapse_threshold 10 + +# Add the highlighted file to the path in the titlebar +set show_selection_in_titlebar true + +# The delay that ranger idly waits for user input, in milliseconds, with a +# resolution of 100ms. Lower delay reduces lag between directory updates but +# increases CPU load. +set idle_delay 2000 + +# When the metadata manager module looks for metadata, should it only look for +# a ".metadata.json" file in the current directory, or do a deep search and +# check all directories above the current one as well? +set metadata_deep_search false + +# Clear all existing filters when leaving a directory +set clear_filters_on_dir_change false + +# Disable displaying line numbers in main column. +# Possible values: false, absolute, relative. +set line_numbers false + +# When line_numbers=relative show the absolute line number in the +# current line. +set relative_current_zero false + +# Start line numbers from 1 instead of 0 +set one_indexed false + +# Save tabs on exit +set save_tabs_on_exit false + +# Enable scroll wrapping - moving down while on the last item will wrap around to +# the top and vice versa. +set wrap_scroll false + +# Set the global_inode_type_filter to nothing. Possible options: d, f and l for +# directories, files and symlinks respectively. +set global_inode_type_filter + +# This setting allows to freeze the list of files to save I/O bandwidth. It +# should be 'false' during start-up, but you can toggle it by pressing F. +set freeze_files false + +# Print file sizes in bytes instead of the default human-readable format. +set size_in_bytes false + +# Warn at startup if RANGER_LEVEL env var is greater than 0, in other words +# give a warning when you nest ranger in a subshell started by ranger. +# Special value "error" makes the warning more visible. +set nested_ranger_warning true + +# =================================================================== +# == Local Options +# =================================================================== +# You can set local options that only affect a single directory. + +# Examples: +# setlocal path=~/downloads sort mtime + +# =================================================================== +# == Command Aliases in the Console +# =================================================================== + +alias e edit +alias q quit +alias q! quit! +alias qa quitall +alias qa! quitall! +alias qall quitall +alias qall! quitall! +alias setl setlocal + +alias filter scout -prts +alias find scout -aets +alias mark scout -mr +alias unmark scout -Mr +alias search scout -rs +alias search_inc scout -rts +alias travel scout -aefklst + +# =================================================================== +# == Define keys for the browser +# =================================================================== + +# Basic +map Q quitall +map q quit +copymap q ZZ ZQ + +map R reload_cwd +map F set freeze_files! +map <C-r> reset +map <C-l> redraw_window +map <C-c> abort +map <esc> change_mode normal +map ~ set viewmode! + +map i display_file +map <A-j> scroll_preview 1 +map <A-k> scroll_preview -1 +map ? help +map W display_log +map w taskview_open +map S shell $SHELL + +map : console +map ; console +map ! console shell%space +map @ console -p6 shell %%s +map # console shell -p%space +map s console shell%space +map r chain draw_possible_programs; console open_with%space +map f console find%space +map cd console cd%space + +map <C-p> chain console; eval fm.ui.console.history_move(-1) + +# Change the line mode +map Mf linemode filename +map Mi linemode fileinfo +map Mm linemode mtime +map Mh linemode humanreadablemtime +map Mp linemode permissions +map Ms linemode sizemtime +map MH linemode sizehumanreadablemtime +map Mt linemode metatitle + +# Tagging / Marking +map t tag_toggle +map ut tag_remove +map "<any> tag_toggle tag=%any +map <Space> mark_files toggle=True +map v mark_files all=True toggle=True +map uv mark_files all=True val=False +map V toggle_visual_mode +map uV toggle_visual_mode reverse=True + +# For the nostalgics: Midnight Commander bindings +map <F1> help +map <F2> rename_append +map <F3> display_file +map <F4> edit +map <F5> copy +map <F6> cut +map <F7> console mkdir%space +map <F8> console delete +#map <F8> console trash +map <F10> exit + +# In case you work on a keyboard with dvorak layout +map <UP> move up=1 +map <DOWN> move down=1 +map <LEFT> move left=1 +map <RIGHT> move right=1 +map <HOME> move to=0 +map <END> move to=-1 +map <PAGEDOWN> move down=1 pages=True +map <PAGEUP> move up=1 pages=True +map <CR> move right=1 +#map <DELETE> console delete +map <INSERT> console touch%space + +# VIM-like +copymap <UP> k +copymap <DOWN> j +copymap <LEFT> h +copymap <RIGHT> l +copymap <HOME> gg +copymap <END> G +copymap <PAGEDOWN> <C-F> +copymap <PAGEUP> <C-B> + +map J move down=0.5 pages=True +map K move up=0.5 pages=True +copymap J <C-D> +copymap K <C-U> + +# Jumping around +map H history_go -1 +map L history_go 1 +map ] move_parent 1 +map [ move_parent -1 +map } traverse +map { traverse_backwards +map ) jump_non + +map gh cd ~ +map ge cd /etc +map gu cd /usr +map gd cd /dev +map gl cd -r . +map gL cd -r %f +map go cd /opt +map gv cd /var +map gm cd /media +map gi eval fm.cd('/run/media/' + os.getenv('USER')) +map gM cd /mnt +map gs cd /srv +map gp cd /tmp +map gr cd / +map gR eval fm.cd(ranger.RANGERDIR) +map g/ cd / +map g? cd /usr/share/doc/ranger + +# External Programs +map E edit +map du shell -p du --max-depth=1 -h --apparent-size +map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh +map yp yank path +map yd yank dir +map yn yank name +map y. yank name_without_extension + +# Filesystem Operations +map = chmod + +map cw console rename%space +map a rename_append +map A eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%")) +map I eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7) + +map pp paste +map po paste overwrite=True +map pP paste append=True +map pO paste overwrite=True append=True +map pl paste_symlink relative=False +map pL paste_symlink relative=True +map phl paste_hardlink +map pht paste_hardlinked_subtree +map pd console paste dest= +map p`<any> paste dest=%any_path +map p'<any> paste dest=%any_path + +map dD console delete +map dT console trash + +map dd cut +map ud uncut +map da cut mode=add +map dr cut mode=remove +map dt cut mode=toggle + +map yy copy +map uy uncut +map ya copy mode=add +map yr copy mode=remove +map yt copy mode=toggle + +# Temporary workarounds +map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier) +map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier) +map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier) +map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier) +map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier) +map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier) +map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier) +map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier) + +# Searching +map / console search%space +map n search_next +map N search_next forward=False +map ct search_next order=tag +map cs search_next order=size +map ci search_next order=mimetype +map cc search_next order=ctime +map cm search_next order=mtime +map ca search_next order=atime + +# Tabs +map <C-n> tab_new +map <C-w> tab_close +map <TAB> tab_move 1 +map <S-TAB> tab_move -1 +map <A-Right> tab_move 1 +map <A-Left> tab_move -1 +map gt tab_move 1 +map gT tab_move -1 +map gn tab_new +map gc tab_close +map uq tab_restore +map <a-1> tab_open 1 +map <a-2> tab_open 2 +map <a-3> tab_open 3 +map <a-4> tab_open 4 +map <a-5> tab_open 5 +map <a-6> tab_open 6 +map <a-7> tab_open 7 +map <a-8> tab_open 8 +map <a-9> tab_open 9 +map <a-r> tab_shift 1 +map <a-l> tab_shift -1 + +# Sorting +map or set sort_reverse! +map oz set sort=random +map os chain set sort=size; set sort_reverse=False +map ob chain set sort=basename; set sort_reverse=False +map on chain set sort=natural; set sort_reverse=False +map om chain set sort=mtime; set sort_reverse=False +map oc chain set sort=ctime; set sort_reverse=False +map oa chain set sort=atime; set sort_reverse=False +map ot chain set sort=type; set sort_reverse=False +map oe chain set sort=extension; set sort_reverse=False + +map oS chain set sort=size; set sort_reverse=True +map oB chain set sort=basename; set sort_reverse=True +map oN chain set sort=natural; set sort_reverse=True +map oM chain set sort=mtime; set sort_reverse=True +map oC chain set sort=ctime; set sort_reverse=True +map oA chain set sort=atime; set sort_reverse=True +map oT chain set sort=type; set sort_reverse=True +map oE chain set sort=extension; set sort_reverse=True + +map dc get_cumulative_size + +# Settings +map zc set collapse_preview! +map zd set sort_directories_first! +map zh set show_hidden! +map <C-h> set show_hidden! +copymap <C-h> <backspace> +copymap <backspace> <backspace2> +map zI set flushinput! +map zi set preview_images! +map zm set mouse_enabled! +map zp set preview_files! +map zP set preview_directories! +map zs set sort_case_insensitive! +map zu set autoupdate_cumulative_size! +map zv set use_preview_script! +map zf console filter%space +copymap zf zz + +# Filter stack +map .d filter_stack add type d +map .f filter_stack add type f +map .l filter_stack add type l +map .m console filter_stack add mime%space +map .n console filter_stack add name%space +map .# console filter_stack add hash%space +map ." filter_stack add duplicate +map .' filter_stack add unique +map .| filter_stack add or +map .& filter_stack add and +map .! filter_stack add not +map .r filter_stack rotate +map .c filter_stack clear +map .* filter_stack decompose +map .p filter_stack pop +map .. filter_stack show + +# Bookmarks +map `<any> enter_bookmark %any +map '<any> enter_bookmark %any +map m<any> set_bookmark %any +map um<any> unset_bookmark %any + +map m<bg> draw_bookmarks +copymap m<bg> um<bg> `<bg> '<bg> + +# Generate all the chmod bindings with some python help: +eval for arg in "rwxXst": cmd("map +u{0} shell -f chmod u+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +g{0} shell -f chmod g+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +o{0} shell -f chmod o+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +a{0} shell -f chmod a+{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map +{0} shell -f chmod u+{0} %s".format(arg)) + +eval for arg in "rwxXst": cmd("map -u{0} shell -f chmod u-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -g{0} shell -f chmod g-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -o{0} shell -f chmod o-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -a{0} shell -f chmod a-{0} %s".format(arg)) +eval for arg in "rwxXst": cmd("map -{0} shell -f chmod u-{0} %s".format(arg)) + +# =================================================================== +# == Define keys for the console +# =================================================================== +# Note: Unmapped keys are passed directly to the console. + +# Basic +cmap <tab> eval fm.ui.console.tab() +cmap <s-tab> eval fm.ui.console.tab(-1) +cmap <ESC> eval fm.ui.console.close() +cmap <CR> eval fm.ui.console.execute() +cmap <C-l> redraw_window + +copycmap <ESC> <C-c> +copycmap <CR> <C-j> + +# Move around +cmap <up> eval fm.ui.console.history_move(-1) +cmap <down> eval fm.ui.console.history_move(1) +cmap <left> eval fm.ui.console.move(left=1) +cmap <right> eval fm.ui.console.move(right=1) +cmap <home> eval fm.ui.console.move(right=0, absolute=True) +cmap <end> eval fm.ui.console.move(right=-1, absolute=True) +cmap <a-b> eval fm.ui.console.move_word(left=1) +cmap <a-f> eval fm.ui.console.move_word(right=1) + +copycmap <a-b> <a-left> +copycmap <a-f> <a-right> + +# Line Editing +cmap <backspace> eval fm.ui.console.delete(-1) +cmap <delete> eval fm.ui.console.delete(0) +cmap <C-w> eval fm.ui.console.delete_word() +cmap <A-d> eval fm.ui.console.delete_word(backward=False) +cmap <C-k> eval fm.ui.console.delete_rest(1) +cmap <C-u> eval fm.ui.console.delete_rest(-1) +cmap <C-y> eval fm.ui.console.paste() + +# And of course the emacs way +copycmap <ESC> <C-g> +copycmap <up> <C-p> +copycmap <down> <C-n> +copycmap <left> <C-b> +copycmap <right> <C-f> +copycmap <home> <C-a> +copycmap <end> <C-e> +copycmap <delete> <C-d> +copycmap <backspace> <C-h> + +# Note: There are multiple ways to express backspaces. <backspace> (code 263) +# and <backspace2> (code 127). To be sure, use both. +copycmap <backspace> <backspace2> + +# This special expression allows typing in numerals: +cmap <allow_quantifiers> false + +# =================================================================== +# == Pager Keybindings +# =================================================================== + +# Movement +pmap <down> pager_move down=1 +pmap <up> pager_move up=1 +pmap <left> pager_move left=4 +pmap <right> pager_move right=4 +pmap <home> pager_move to=0 +pmap <end> pager_move to=-1 +pmap <pagedown> pager_move down=1.0 pages=True +pmap <pageup> pager_move up=1.0 pages=True +pmap <C-d> pager_move down=0.5 pages=True +pmap <C-u> pager_move up=0.5 pages=True + +copypmap <UP> k <C-p> +copypmap <DOWN> j <C-n> <CR> +copypmap <LEFT> h +copypmap <RIGHT> l +copypmap <HOME> g +copypmap <END> G +copypmap <C-d> d +copypmap <C-u> u +copypmap <PAGEDOWN> n f <C-F> <Space> +copypmap <PAGEUP> p b <C-B> + +# Basic +pmap <C-l> redraw_window +pmap <ESC> pager_close +copypmap <ESC> q Q i <F3> +pmap E edit_file + +# =================================================================== +# == Taskview Keybindings +# =================================================================== + +# Movement +tmap <up> taskview_move up=1 +tmap <down> taskview_move down=1 +tmap <home> taskview_move to=0 +tmap <end> taskview_move to=-1 +tmap <pagedown> taskview_move down=1.0 pages=True +tmap <pageup> taskview_move up=1.0 pages=True +tmap <C-d> taskview_move down=0.5 pages=True +tmap <C-u> taskview_move up=0.5 pages=True + +copytmap <UP> k <C-p> +copytmap <DOWN> j <C-n> <CR> +copytmap <HOME> g +copytmap <END> G +copytmap <C-u> u +copytmap <PAGEDOWN> n f <C-F> <Space> +copytmap <PAGEUP> p b <C-B> + +# Changing priority and deleting tasks +tmap J eval -q fm.ui.taskview.task_move(-1) +tmap K eval -q fm.ui.taskview.task_move(0) +tmap dd eval -q fm.ui.taskview.task_remove() +tmap <pagedown> eval -q fm.ui.taskview.task_move(-1) +tmap <pageup> eval -q fm.ui.taskview.task_move(0) +tmap <delete> eval -q fm.ui.taskview.task_remove() + +# Basic +tmap <C-l> redraw_window +tmap <ESC> taskview_close +copytmap <ESC> q Q w <C-c> diff --git a/config/ranger/rifle.conf b/config/ranger/rifle.conf @@ -0,0 +1,285 @@ +# vim: ft=cfg +# +# This is the configuration file of "rifle", ranger's file executor/opener. +# Each line consists of conditions and a command. For each line the conditions +# are checked and if they are met, the respective command is run. +# +# Syntax: +# <condition1> , <condition2> , ... = command +# +# The command can contain these environment variables: +# $1-$9 | The n-th selected file +# $@ | All selected files +# +# If you use the special command "ask", rifle will ask you what program to run. +# +# Prefixing a condition with "!" will negate its result. +# These conditions are currently supported: +# match <regexp> | The regexp matches $1 +# ext <regexp> | The regexp matches the extension of $1 +# mime <regexp> | The regexp matches the mime type of $1 +# name <regexp> | The regexp matches the basename of $1 +# path <regexp> | The regexp matches the absolute path of $1 +# has <program> | The program is installed (i.e. located in $PATH) +# env <variable> | The environment variable "variable" is non-empty +# file | $1 is a file +# directory | $1 is a directory +# number <n> | change the number of this command to n +# terminal | stdin, stderr and stdout are connected to a terminal +# X | A graphical environment is available (darwin, Xorg, or Wayland) +# +# There are also pseudo-conditions which have a "side effect": +# flag <flags> | Change how the program is run. See below. +# label <label> | Assign a label or name to the command so it can +# | be started with :open_with <label> in ranger +# | or `rifle -p <label>` in the standalone executable. +# else | Always true. +# +# Flags are single characters which slightly transform the command: +# f | Fork the program, make it run in the background. +# | New command = setsid $command >& /dev/null & +# r | Execute the command with root permissions +# | New command = sudo $command +# t | Run the program in a new terminal. If $TERMCMD is not defined, +# | rifle will attempt to extract it from $TERM. +# | New command = $TERMCMD -e $command +# Note: The "New command" serves only as an illustration, the exact +# implementation may differ. +# Note: When using rifle in ranger, there is an additional flag "c" for +# only running the current file even if you have marked multiple files. + +#------------------------------------------- +# Websites +#------------------------------------------- +# Rarely installed browsers get higher priority; It is assumed that if you +# install a rare browser, you probably use it. Firefox/konqueror/w3m on the +# other hand are often only installed as fallback browsers. +ext x?html?, has surf, X, flag f = surf -- file://"$1" +ext x?html?, has vimprobable, X, flag f = vimprobable -- "$@" +ext x?html?, has vimprobable2, X, flag f = vimprobable2 -- "$@" +ext x?html?, has qutebrowser, X, flag f = qutebrowser -- "$@" +ext x?html?, has dwb, X, flag f = dwb -- "$@" +ext x?html?, has jumanji, X, flag f = jumanji -- "$@" +ext x?html?, has luakit, X, flag f = luakit -- "$@" +ext x?html?, has uzbl, X, flag f = uzbl -- "$@" +ext x?html?, has uzbl-tabbed, X, flag f = uzbl-tabbed -- "$@" +ext x?html?, has uzbl-browser, X, flag f = uzbl-browser -- "$@" +ext x?html?, has uzbl-core, X, flag f = uzbl-core -- "$@" +ext x?html?, has midori, X, flag f = midori -- "$@" +ext x?html?, has opera, X, flag f = opera -- "$@" +ext x?html?, has firefox, X, flag f = firefox -- "$@" +ext x?html?, has seamonkey, X, flag f = seamonkey -- "$@" +ext x?html?, has iceweasel, X, flag f = iceweasel -- "$@" +ext x?html?, has chromium-browser, X, flag f = chromium-browser -- "$@" +ext x?html?, has chromium, X, flag f = chromium -- "$@" +ext x?html?, has google-chrome, X, flag f = google-chrome -- "$@" +ext x?html?, has epiphany, X, flag f = epiphany -- "$@" +ext x?html?, has konqueror, X, flag f = konqueror -- "$@" +ext x?html?, has elinks, terminal = elinks "$@" +ext x?html?, has links2, terminal = links2 "$@" +ext x?html?, has links, terminal = links "$@" +ext x?html?, has lynx, terminal = lynx -- "$@" +ext x?html?, has w3m, terminal = w3m "$@" + +#------------------------------------------- +# Misc +#------------------------------------------- +# Define the "editor" for text files as first action +mime ^text, label editor = ${VISUAL:-$EDITOR} -- "$@" +mime ^text, label pager = "$PAGER" -- "$@" +!mime ^text, label editor, ext xml|json|csv|tex|py|pl|rb|js|sh|php = ${VISUAL:-$EDITOR} -- "$@" +!mime ^text, label pager, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@" + +ext 1 = man "$1" +ext s[wmf]c, has zsnes, X = zsnes "$1" +ext s[wmf]c, has snes9x-gtk,X = snes9x-gtk "$1" +ext nes, has fceux, X = fceux "$1" +ext exe = wine "$1" +name ^[mM]akefile$ = make + +#-------------------------------------------- +# Scripts +#------------------------------------------- +ext py = python -- "$1" +ext pl = perl -- "$1" +ext rb = ruby -- "$1" +ext js = node -- "$1" +ext sh = sh -- "$1" +ext php = php -- "$1" + +#-------------------------------------------- +# Audio without X +#------------------------------------------- +mime ^audio|ogg$, terminal, has mpv = mpv -- "$@" +mime ^audio|ogg$, terminal, has mplayer2 = mplayer2 -- "$@" +mime ^audio|ogg$, terminal, has mplayer = mplayer -- "$@" +ext midi?, terminal, has wildmidi = wildmidi -- "$@" + +#-------------------------------------------- +# Video/Audio with a GUI +#------------------------------------------- +mime ^video|audio, has gmplayer, X, flag f = gmplayer -- "$@" +mime ^video|audio, has smplayer, X, flag f = smplayer "$@" +mime ^video, has mpv, X, flag f = mpv -- "$@" +mime ^video, has mpv, X, flag f = mpv --fs -- "$@" +mime ^video, has mplayer2, X, flag f = mplayer2 -- "$@" +mime ^video, has mplayer2, X, flag f = mplayer2 -fs -- "$@" +mime ^video, has mplayer, X, flag f = mplayer -- "$@" +mime ^video, has mplayer, X, flag f = mplayer -fs -- "$@" +mime ^video|audio, has vlc, X, flag f = vlc -- "$@" +mime ^video|audio, has totem, X, flag f = totem -- "$@" +mime ^video|audio, has totem, X, flag f = totem --fullscreen -- "$@" + +#-------------------------------------------- +# Video without X +#------------------------------------------- +mime ^video, terminal, !X, has mpv = mpv -- "$@" +mime ^video, terminal, !X, has mplayer2 = mplayer2 -- "$@" +mime ^video, terminal, !X, has mplayer = mplayer -- "$@" + +#------------------------------------------- +# Documents +#------------------------------------------- +ext pdf, has llpp, X, flag f = llpp "$@" +ext pdf, has zathura, X, flag f = zathura -- "$@" +ext pdf, has mupdf, X, flag f = mupdf "$@" +ext pdf, has mupdf-x11,X, flag f = mupdf-x11 "$@" +ext pdf, has apvlv, X, flag f = apvlv -- "$@" +ext pdf, has xpdf, X, flag f = xpdf -- "$@" +ext pdf, has evince, X, flag f = evince -- "$@" +ext pdf, has atril, X, flag f = atril -- "$@" +ext pdf, has okular, X, flag f = okular -- "$@" +ext pdf, has epdfview, X, flag f = epdfview -- "$@" +ext pdf, has qpdfview, X, flag f = qpdfview "$@" +ext pdf, has open, X, flag f = open "$@" + +ext docx?, has catdoc, terminal = catdoc -- "$@" | "$PAGER" + +ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has gnumeric, X, flag f = gnumeric -- "$@" +ext sxc|xlsx?|xlt|xlw|gnm|gnumeric, has kspread, X, flag f = kspread -- "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f = libreoffice "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has soffice, X, flag f = soffice "$@" +ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has ooffice, X, flag f = ooffice "$@" + +ext djvu, has zathura,X, flag f = zathura -- "$@" +ext djvu, has evince, X, flag f = evince -- "$@" +ext djvu, has atril, X, flag f = atril -- "$@" +ext djvu, has djview, X, flag f = djview -- "$@" + +ext epub, has ebook-viewer, X, flag f = ebook-viewer -- "$@" +ext epub, has zathura, X, flag f = zathura -- "$@" +ext epub, has mupdf, X, flag f = mupdf -- "$@" +ext mobi, has ebook-viewer, X, flag f = ebook-viewer -- "$@" + +ext cbr, has zathura, X, flag f = zathura -- "$@" +ext cbz, has zathura, X, flag f = zathura -- "$@" + +#------------------------------------------- +# Images +#------------------------------------------- +mime ^image/svg, has inkscape, X, flag f = inkscape -- "$@" +mime ^image/svg, has display, X, flag f = display -- "$@" + +mime ^image, has mpv, X, flag f = mpv --pause -- "$@" +mime ^image, has imv, X, flag f = imv -- "$@" +mime ^image, has pqiv, X, flag f = pqiv -- "$@" +mime ^image, has sxiv, X, flag f = sxiv -- "$@" +mime ^image, has feh, X, flag f = feh -- "$@" +mime ^image, has mirage, X, flag f = mirage -- "$@" +mime ^image, has ristretto, X, flag f = ristretto "$@" +mime ^image, has eog, X, flag f = eog -- "$@" +mime ^image, has eom, X, flag f = eom -- "$@" +mime ^image, has nomacs, X, flag f = nomacs -- "$@" +mime ^image, has geeqie, X, flag f = geeqie -- "$@" +mime ^image, has gpicview, X, flag f = gpicview -- "$@" +mime ^image, has gwenview, X, flag f = gwenview -- "$@" +mime ^image, has gimp, X, flag f = gimp -- "$@" +ext xcf, X, flag f = gimp -- "$@" + +#------------------------------------------- +# Archives +#------------------------------------------- + +# avoid password prompt by providing empty password +ext 7z, has 7z = 7z -p l "$@" | "$PAGER" +# This requires atool +ext ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --list --each -- "$@" | "$PAGER" +ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --list --each -- "$@" | "$PAGER" +ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has atool = atool --extract --each -- "$@" +ext iso|jar|msi|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has atool = atool --extract --each -- "$@" + +# Listing and extracting archives without atool: +ext tar|gz|bz2|xz, has tar = tar vvtf "$1" | "$PAGER" +ext tar|gz|bz2|xz, has tar = for file in "$@"; do tar vvxf "$file"; done +ext bz2, has bzip2 = for file in "$@"; do bzip2 -dk "$file"; done +ext zip, has unzip = unzip -l "$1" | less +ext zip, has unzip = for file in "$@"; do unzip -d "${file%.*}" "$file"; done +ext ace, has unace = unace l "$1" | less +ext ace, has unace = for file in "$@"; do unace e "$file"; done +ext rar, has unrar = unrar l "$1" | less +ext rar, has unrar = for file in "$@"; do unrar x "$file"; done + +#------------------------------------------- +# Fonts +#------------------------------------------- +mime ^font, has fontforge, X, flag f = fontforge "$@" + +#------------------------------------------- +# Flag t fallback terminals +#------------------------------------------- +# Rarely installed terminal emulators get higher priority; It is assumed that +# if you install a rare terminal emulator, you probably use it. +# gnome-terminal/konsole/xterm on the other hand are often installed as part of +# a desktop environment or as fallback terminal emulators. +mime ^ranger/x-terminal-emulator, has terminology = terminology -e "$@" +mime ^ranger/x-terminal-emulator, has kitty = kitty -- "$@" +mime ^ranger/x-terminal-emulator, has alacritty = alacritty -e "$@" +mime ^ranger/x-terminal-emulator, has sakura = sakura -e "$@" +mime ^ranger/x-terminal-emulator, has lilyterm = lilyterm -e "$@" +#mime ^ranger/x-terminal-emulator, has cool-retro-term = cool-retro-term -e "$@" +mime ^ranger/x-terminal-emulator, has termite = termite -x '"$@"' +#mime ^ranger/x-terminal-emulator, has yakuake = yakuake -e "$@" +mime ^ranger/x-terminal-emulator, has guake = guake -ne "$@" +mime ^ranger/x-terminal-emulator, has tilda = tilda -c "$@" +mime ^ranger/x-terminal-emulator, has st = st -e "$@" +mime ^ranger/x-terminal-emulator, has terminator = terminator -x "$@" +mime ^ranger/x-terminal-emulator, has urxvt = urxvt -e "$@" +mime ^ranger/x-terminal-emulator, has pantheon-terminal = pantheon-terminal -e "$@" +mime ^ranger/x-terminal-emulator, has lxterminal = lxterminal -e "$@" +mime ^ranger/x-terminal-emulator, has mate-terminal = mate-terminal -x "$@" +mime ^ranger/x-terminal-emulator, has xfce4-terminal = xfce4-terminal -x "$@" +mime ^ranger/x-terminal-emulator, has konsole = konsole -e "$@" +mime ^ranger/x-terminal-emulator, has gnome-terminal = gnome-terminal -- "$@" +mime ^ranger/x-terminal-emulator, has xterm = xterm -e "$@" + +#------------------------------------------- +# Misc +#------------------------------------------- +label wallpaper, number 11, mime ^image, has feh, X = feh --bg-scale "$1" +label wallpaper, number 12, mime ^image, has feh, X = feh --bg-tile "$1" +label wallpaper, number 13, mime ^image, has feh, X = feh --bg-center "$1" +label wallpaper, number 14, mime ^image, has feh, X = feh --bg-fill "$1" + +#------------------------------------------- +# Generic file openers +#------------------------------------------- +label open, has xdg-open = xdg-open -- "$@" +label open, has open = open -- "$@" + +# Define the editor for non-text files + pager as last action + !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = vim +label editor, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = vim -- "$@" +label pager, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@" + + +###################################################################### +# The actions below are left so low down in this file on purpose, so # +# they are never triggered accidentally. # +###################################################################### + +# Execute a file as program/script. +mime application/x-executable = "$1" + +# Move the file to trash using trash-cli. +label trash, has trash-put = trash-put -- "$@" +label trash = mkdir -p -- ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash; mv -- "$@" ${XDG_DATA_DIR:-$HOME/.ranger}/ranger-trash diff --git a/config/ranger/scope.sh b/config/ranger/scope.sh @@ -0,0 +1,350 @@ +#!/usr/bin/env bash + +set -o noclobber -o noglob -o nounset -o pipefail +IFS=$'\n' + +## If the option `use_preview_script` is set to `true`, +## then this script will be called and its output will be displayed in ranger. +## ANSI color codes are supported. +## STDIN is disabled, so interactive scripts won't work properly + +## This script is considered a configuration file and must be updated manually. +## It will be left untouched if you upgrade ranger. + +## Because of some automated testing we do on the script #'s for comments need +## to be doubled up. Code that is commented out, because it's an alternative for +## example, gets only one #. + +## Meanings of exit codes: +## code | meaning | action of ranger +## -----+------------+------------------------------------------- +## 0 | success | Display stdout as preview +## 1 | no preview | Display no preview at all +## 2 | plain text | Display the plain content of the file +## 3 | fix width | Don't reload when width changes +## 4 | fix height | Don't reload when height changes +## 5 | fix both | Don't ever reload +## 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview +## 7 | image | Display the file directly as an image + +## Script arguments +FILE_PATH="${1}" # Full path of the highlighted file +PV_WIDTH="${2}" # Width of the preview pane (number of fitting characters) +## shellcheck disable=SC2034 # PV_HEIGHT is provided for convenience and unused +PV_HEIGHT="${3}" # Height of the preview pane (number of fitting characters) +IMAGE_CACHE_PATH="${4}" # Full path that should be used to cache image preview +PV_IMAGE_ENABLED="${5}" # 'True' if image previews are enabled, 'False' otherwise. + +FILE_EXTENSION="${FILE_PATH##*.}" +FILE_EXTENSION_LOWER="$(printf "%s" "${FILE_EXTENSION}" | tr '[:upper:]' '[:lower:]')" + +## Settings +HIGHLIGHT_SIZE_MAX=262143 # 256KiB +HIGHLIGHT_TABWIDTH=${HIGHLIGHT_TABWIDTH:-8} +HIGHLIGHT_STYLE=${HIGHLIGHT_STYLE:-pablo} +HIGHLIGHT_OPTIONS="--replace-tabs=${HIGHLIGHT_TABWIDTH} --style=${HIGHLIGHT_STYLE} ${HIGHLIGHT_OPTIONS:-}" +PYGMENTIZE_STYLE=${PYGMENTIZE_STYLE:-autumn} +OPENSCAD_IMGSIZE=${RNGR_OPENSCAD_IMGSIZE:-1000,1000} +OPENSCAD_COLORSCHEME=${RNGR_OPENSCAD_COLORSCHEME:-Tomorrow Night} + +handle_extension() { + case "${FILE_EXTENSION_LOWER}" in + ## Archive + a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ + rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) + atool --list -- "${FILE_PATH}" && exit 5 + bsdtar --list --file "${FILE_PATH}" && exit 5 + exit 1;; + rar) + ## Avoid password prompt by providing empty password + unrar lt -p- -- "${FILE_PATH}" && exit 5 + exit 1;; + 7z) + ## Avoid password prompt by providing empty password + 7z l -p -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## PDF + pdf) + ## Preview as text conversion + pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - | \ + fmt -w "${PV_WIDTH}" && exit 5 + mutool draw -F txt -i -- "${FILE_PATH}" 1-10 | \ + fmt -w "${PV_WIDTH}" && exit 5 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + + ## BitTorrent + torrent) + transmission-show -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## OpenDocument + odt|ods|odp|sxw) + ## Preview as text conversion + odt2txt "${FILE_PATH}" && exit 5 + ## Preview as markdown conversion + pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## XLSX + xlsx) + ## Preview as csv conversion + ## Uses: https://github.com/dilshod/xlsx2csv + xlsx2csv -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## HTML + htm|html|xhtml) + ## Preview as text conversion + w3m -dump "${FILE_PATH}" && exit 5 + lynx -dump -- "${FILE_PATH}" && exit 5 + elinks -dump "${FILE_PATH}" && exit 5 + pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + ;; + + ## JSON + json) + jq --color-output . "${FILE_PATH}" && exit 5 + python -m json.tool -- "${FILE_PATH}" && exit 5 + ;; + + ## Direct Stream Digital/Transfer (DSDIFF) and wavpack aren't detected + ## by file(1). + dff|dsf|wv|wvc) + mediainfo "${FILE_PATH}" && exit 5 + exiftool "${FILE_PATH}" && exit 5 + ;; # Continue with next handler on failure + esac +} + +handle_image() { + ## Size of the preview if there are multiple options or it has to be + ## rendered from vector graphics. If the conversion program allows + ## specifying only one dimension while keeping the aspect ratio, the width + ## will be used. + local DEFAULT_SIZE="1920x1080" + + local mimetype="${1}" + case "${mimetype}" in + ## SVG + # image/svg+xml|image/svg) + # convert -- "${FILE_PATH}" "${IMAGE_CACHE_PATH}" && exit 6 + # exit 1;; + + ## DjVu + # image/vnd.djvu) + # ddjvu -format=tiff -quality=90 -page=1 -size="${DEFAULT_SIZE}" \ + # - "${IMAGE_CACHE_PATH}" < "${FILE_PATH}" \ + # && exit 6 || exit 1;; + + ## Image + image/*) + local orientation + orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )" + ## If orientation data is present and the image actually + ## needs rotating ("1" means no rotation)... + if [[ -n "$orientation" && "$orientation" != 1 ]]; then + ## ...auto-rotate the image according to the EXIF data. + convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6 + fi + + ## `w3mimgdisplay` will be called for all images (unless overriden + ## as above), but might fail for unsupported types. + exit 7;; + + ## Video + # video/*) + # # Thumbnail + # ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6 + # exit 1;; + + ## PDF + # application/pdf) + # pdftoppm -f 1 -l 1 \ + # -scale-to-x "${DEFAULT_SIZE%x*}" \ + # -scale-to-y -1 \ + # -singlefile \ + # -jpeg -tiffcompression jpeg \ + # -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \ + # && exit 6 || exit 1;; + + + ## ePub, MOBI, FB2 (using Calibre) + # application/epub+zip|application/x-mobipocket-ebook|\ + # application/x-fictionbook+xml) + # # ePub (using https://github.com/marianosimone/epub-thumbnailer) + # epub-thumbnailer "${FILE_PATH}" "${IMAGE_CACHE_PATH}" \ + # "${DEFAULT_SIZE%x*}" && exit 6 + # ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FILE_PATH}" \ + # >/dev/null && exit 6 + # exit 1;; + + ## Font + application/font*|application/*opentype) + preview_png="/tmp/$(basename "${IMAGE_CACHE_PATH%.*}").png" + if fontimage -o "${preview_png}" \ + --pixelsize "120" \ + --fontname \ + --pixelsize "80" \ + --text " ABCDEFGHIJKLMNOPQRSTUVWXYZ " \ + --text " abcdefghijklmnopqrstuvwxyz " \ + --text " 0123456789.:,;(*!?') ff fl fi ffi ffl " \ + --text " The quick brown fox jumps over the lazy dog. " \ + "${FILE_PATH}"; + then + convert -- "${preview_png}" "${IMAGE_CACHE_PATH}" \ + && rm "${preview_png}" \ + && exit 6 + else + exit 1 + fi + ;; + + ## Preview archives using the first image inside. + ## (Very useful for comic book collections for example.) + # application/zip|application/x-rar|application/x-7z-compressed|\ + # application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar) + # local fn=""; local fe="" + # local zip=""; local rar=""; local tar=""; local bsd="" + # case "${mimetype}" in + # application/zip) zip=1 ;; + # application/x-rar) rar=1 ;; + # application/x-7z-compressed) ;; + # *) tar=1 ;; + # esac + # { [ "$tar" ] && fn=$(tar --list --file "${FILE_PATH}"); } || \ + # { fn=$(bsdtar --list --file "${FILE_PATH}") && bsd=1 && tar=""; } || \ + # { [ "$rar" ] && fn=$(unrar lb -p- -- "${FILE_PATH}"); } || \ + # { [ "$zip" ] && fn=$(zipinfo -1 -- "${FILE_PATH}"); } || return + # + # fn=$(echo "$fn" | python -c "import sys; import mimetypes as m; \ + # [ print(l, end='') for l in sys.stdin if \ + # (m.guess_type(l[:-1])[0] or '').startswith('image/') ]" |\ + # sort -V | head -n 1) + # [ "$fn" = "" ] && return + # [ "$bsd" ] && fn=$(printf '%b' "$fn") + # + # [ "$tar" ] && tar --extract --to-stdout \ + # --file "${FILE_PATH}" -- "$fn" > "${IMAGE_CACHE_PATH}" && exit 6 + # fe=$(echo -n "$fn" | sed 's/[][*?\]/\\\0/g') + # [ "$bsd" ] && bsdtar --extract --to-stdout \ + # --file "${FILE_PATH}" -- "$fe" > "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$bsd" ] || [ "$tar" ] && rm -- "${IMAGE_CACHE_PATH}" + # [ "$rar" ] && unrar p -p- -inul -- "${FILE_PATH}" "$fn" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$zip" ] && unzip -pP "" -- "${FILE_PATH}" "$fe" > \ + # "${IMAGE_CACHE_PATH}" && exit 6 + # [ "$rar" ] || [ "$zip" ] && rm -- "${IMAGE_CACHE_PATH}" + # ;; + esac + + # openscad_image() { + # TMPPNG="$(mktemp -t XXXXXX.png)" + # openscad --colorscheme="${OPENSCAD_COLORSCHEME}" \ + # --imgsize="${OPENSCAD_IMGSIZE/x/,}" \ + # -o "${TMPPNG}" "${1}" + # mv "${TMPPNG}" "${IMAGE_CACHE_PATH}" + # } + + # case "${FILE_EXTENSION_LOWER}" in + # ## 3D models + # ## OpenSCAD only supports png image output, and ${IMAGE_CACHE_PATH} + # ## is hardcoded as jpeg. So we make a tempfile.png and just + # ## move/rename it to jpg. This works because image libraries are + # ## smart enough to handle it. + # csg|scad) + # openscad_image "${FILE_PATH}" && exit 6 + # ;; + # 3mf|amf|dxf|off|stl) + # openscad_image <(echo "import(\"${FILE_PATH}\");") && exit 6 + # ;; + # esac +} + +handle_mime() { + local mimetype="${1}" + case "${mimetype}" in + ## RTF and DOC + text/rtf|*msword) + ## Preview as text conversion + ## note: catdoc does not always work for .doc files + ## catdoc: http://www.wagner.pp.ru/~vitus/software/catdoc/ + catdoc -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## DOCX, ePub, FB2 (using markdown) + ## You might want to remove "|epub" and/or "|fb2" below if you have + ## uncommented other methods to preview those formats + *wordprocessingml.document|*/epub+zip|*/x-fictionbook+xml) + ## Preview as markdown conversion + pandoc -s -t markdown -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## XLS + *ms-excel) + ## Preview as csv conversion + ## xls2csv comes with catdoc: + ## http://www.wagner.pp.ru/~vitus/software/catdoc/ + xls2csv -- "${FILE_PATH}" && exit 5 + exit 1;; + + ## Text + text/* | */xml) + ## Syntax highlight + if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then + exit 2 + fi + if [[ "$( tput colors )" -ge 256 ]]; then + local pygmentize_format='terminal256' + local highlight_format='xterm256' + else + local pygmentize_format='terminal' + local highlight_format='ansi' + fi + env HIGHLIGHT_OPTIONS="${HIGHLIGHT_OPTIONS}" highlight \ + --out-format="${highlight_format}" \ + --force -- "${FILE_PATH}" && exit 5 + env COLORTERM=8bit bat --color=always --style="plain" \ + -- "${FILE_PATH}" && exit 5 + pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}"\ + -- "${FILE_PATH}" && exit 5 + exit 2;; + + ## DjVu + image/vnd.djvu) + ## Preview as text conversion (requires djvulibre) + djvutxt "${FILE_PATH}" | fmt -w "${PV_WIDTH}" && exit 5 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + + ## Image + image/*) + ## Preview as text conversion + # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + + ## Video and audio + video/* | audio/*) + mediainfo "${FILE_PATH}" && exit 5 + exiftool "${FILE_PATH}" && exit 5 + exit 1;; + esac +} + +handle_fallback() { + echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" && exit 5 + exit 1 +} + + +MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )" +if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then + handle_image "${MIMETYPE}" +fi +handle_extension +handle_mime "${MIMETYPE}" +handle_fallback + +exit 1 diff --git a/config/sc-im/scimrc b/config/sc-im/scimrc @@ -0,0 +1,5 @@ +set autowrap +set xlsx_readformulas +set autobackup=30 + +REDEFINE_COLOR "YELLOW" 206 68 4 diff --git a/hosts b/hosts @@ -0,0 +1,41 @@ +# Use with StevenBlack + +#Google +0.0.0.0 blobcomments-pa.clients6.google.com + +#Yandex +0.0.0.0 dzen.ru +0.0.0.0 log.dzen.ru +0.0.0.0 clck.dzen.ru +0.0.0.0 suggest.sso.dzen.ru +0.0.0.0 531111.ms.dzen.ru +0.0.0.0 541111.ms.dzen.ru +0.0.0.0 dzeninfra.ru +0.0.0.0 avatars.dzeninfra.ru +0.0.0.0 s3.dzeninfra.ru +0.0.0.0 static.dzeninfra.ru +0.0.0.0 suggest.sso.dzeninfra.ru +0.0.0.0 yandex.ru +0.0.0.0 an.yandex.ru +0.0.0.0 mc.yandex.ru +0.0.0.0 market.yandex.ru +0.0.0.0 adfstat.yandex.ru +0.0.0.0 market-click2.yandex.ru +0.0.0.0 media-adv.market.yandex.ru +0.0.0.0 bank.yandex.ru +0.0.0.0 yabs.yandex.ru +0.0.0.0 api.passport.yandex.ru +0.0.0.0 yandex.com +0.0.0.0 yastatic.net +0.0.0.0 yandex.net +0.0.0.0 captcha-backgrounds.s3.yandex.net +0.0.0.0 ext.captcha.yandex.net +0.0.0.0 favicon.yandex.net +0.0.0.0 csp.yandex.net +0.0.0.0 csp.yandex.net +0.0.0.0 avatars.mds.yandex.net +0.0.0.0 uxfeedback-cdn.s3.yandex.net +0.0.0.0 ya.ru +0.0.0.0 yandex-bank.net +0.0.0.0 cdn-ext.prod.yandex-bank.net +0.0.0.0 education.yandex.ru diff --git a/make.conf b/make.conf @@ -0,0 +1,44 @@ +# These settings were set by the catalyst build script that automatically +# built this stage. +# Please consult /usr/share/portage/config/make.conf.example for a more +# detailed example. + +# These warnings indicate likely runtime problems with LTO, so promote them +# to errors. If a package fails to build with these, LTO should not be used there. +WARNING_FLAGS="-Werror=odr -Werror=lto-type-mismatch -Werror=strict-aliasing" + +COMMON_FLAGS="-march=native -O3 -pipe -flto ${WARNING_FLAGS}" +#COMMON_FLAGS="-march=native -O2 -pipe" +CFLAGS="${COMMON_FLAGS}" +CXXFLAGS="${COMMON_FLAGS}" +FCFLAGS="${COMMON_FLAGS}" +FFLAGS="${COMMON_FLAGS}" +MAKEOPTS="-j12 -l12" +EMERGE_DEFAULT_OPTS="--jobs 8 --load-average 8" +FEATURES="parallel-fetch parallel-install" +VIDEO_CARDS="radeon radeonsi amdgpu" +PORTAGE_COMPRESS_EXCLUDE_SUFFIXES="[1-9] n [013]p [1357]ssl" + +#You gotta have abi_x86_32 to play video games. Don't build it in on your laptop +USE="X pgo lto xorg system-man -dbus -udev -abi_x86_32 -vulkan -gles1 -gles2 -gles2-only -sqlite system-icu alsa grub savedconfig -usb -pulseaudio -emacs -xemacs -gnome -ios -ipod -nvidia -smartcard -wayland -systemd -aqua -bidi -bluetooth -clamav -colord -coreaudio -elogind -gimp -geolocation -gnome-keyring -gps -gstreamer -ibm -scanner -screencast -syslog -telemetry -gtk -kde -nls -linguisti -sql mpv vaapi -egrep-fgrep -arping -cramfs -qmanifest -qtegrity -desktop-portal -dialogs -joystick -haptic -ui-m64py" + +# NOTE: This stage was built with the bindist Use flag enabled +PORTDIR="/var/db/repos/gentoo" +DISTDIR="/var/cache/distfiles" +PKGDIR="/var/cache/binpkgs" +# This sets the language of build output to English. +# Please keep this setting intact when reporting bugs. +LC_MESSAGES=C.utf8 +#Use free license for laptop +ACCEPT_LICENSE="*" + +GENTOO_MIRRORS="https://gentoo-mirror.alexxy.name/ \ + http://gentoo-mirror.alexxy.name/ \ + http://mirror.mephi.ru/gentoo-distfiles/ \ + ftp://mirror.mephi.ru/gentoo-distfiles/ \ + rsync://mirror.mephi.ru/gentoo-distfiles/ \ + https://mirror.yandex.ru/gentoo-distfiles/ \ + http://mirror.yandex.ru/gentoo-distfiles/ \ + ftp://mirror.yandex.ru/gentoo-distfiles/" + +GRUB_PLATFORMS="efi-64" diff --git a/patches/x11-misc/dmenu/01-dmenu-highpriority-5.2.diff b/patches/x11-misc/dmenu/01-dmenu-highpriority-5.2.diff @@ -0,0 +1,174 @@ +diff --git a/config.def.h b/config.def.h +index 1edb647..47b616d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -12,6 +12,7 @@ static const char *colors[SchemeLast][2] = { + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, ++ [SchemeHp] = { "#bbbbbb", "#333333" } + }; + /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ + static unsigned int lines = 0; +diff --git a/dmenu.c b/dmenu.c +index 7cf253b..283a009 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -26,14 +26,16 @@ + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + + /* enums */ +-enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ ++enum { SchemeNorm, SchemeSel, SchemeHp, SchemeOut, SchemeLast }; /* color schemes */ + + struct item { + char *text; + struct item *left, *right; +- int out; ++ int out, hp; + }; + ++static const char **hpitems = NULL; ++static int hplength = 0; + static char text[BUFSIZ] = ""; + static char *embed; + static int bh, mw, mh; +@@ -65,6 +67,29 @@ textw_clamp(const char *str, unsigned int n) + return MIN(w, n); + } + ++static int ++str_compar(const void *s0_in, const void *s1_in) ++{ ++ const char *s0 = *(const char **)s0_in; ++ const char *s1 = *(const char **)s1_in; ++ return fstrncmp == strncasecmp ? strcasecmp(s0, s1) : strcmp(s0, s1); ++} ++ ++static void ++parse_hpitems(char *src) ++{ ++ int n = 0; ++ char *t; ++ ++ for (t = strtok(src, ","); t; t = strtok(NULL, ",")) { ++ if (hplength + 1 >= n) { ++ if (!(hpitems = realloc(hpitems, (n += 8) * sizeof *hpitems))) ++ die("Unable to realloc %zu bytes\n", n * sizeof *hpitems); ++ } ++ hpitems[hplength++] = t; ++ } ++} ++ + static void + appenditem(struct item *item, struct item **list, struct item **last) + { +@@ -107,6 +132,7 @@ cleanup(void) + for (i = 0; items && items[i].text; ++i) + free(items[i].text); + free(items); ++ free(hpitems); + drw_free(drw); + XSync(dpy, False); + XCloseDisplay(dpy); +@@ -135,6 +161,8 @@ drawitem(struct item *item, int x, int y, int w) + { + if (item == sel) + drw_setscheme(drw, scheme[SchemeSel]); ++ else if (item->hp) ++ drw_setscheme(drw, scheme[SchemeHp]); + else if (item->out) + drw_setscheme(drw, scheme[SchemeOut]); + else +@@ -236,7 +264,7 @@ match(void) + char buf[sizeof text], *s; + int i, tokc = 0; + size_t len, textsize; +- struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; ++ struct item *item, *lhpprefix, *lprefix, *lsubstr, *hpprefixend, *prefixend, *substrend; + + strcpy(buf, text); + /* separate input text into tokens to be matched individually */ +@@ -245,7 +273,7 @@ match(void) + die("cannot realloc %zu bytes:", tokn * sizeof *tokv); + len = tokc ? strlen(tokv[0]) : 0; + +- matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; ++ matches = lhpprefix = lprefix = lsubstr = matchend = hpprefixend = prefixend = substrend = NULL; + textsize = strlen(text) + 1; + for (item = items; item && item->text; item++) { + for (i = 0; i < tokc; i++) +@@ -253,14 +281,24 @@ match(void) + break; + if (i != tokc) /* not all tokens match */ + continue; +- /* exact matches go first, then prefixes, then substrings */ ++ /* exact matches go first, then prefixes with high priority, then prefixes, then substrings */ + if (!tokc || !fstrncmp(text, item->text, textsize)) + appenditem(item, &matches, &matchend); ++ else if (item->hp && !fstrncmp(tokv[0], item->text, len)) ++ appenditem(item, &lhpprefix, &hpprefixend); + else if (!fstrncmp(tokv[0], item->text, len)) + appenditem(item, &lprefix, &prefixend); + else + appenditem(item, &lsubstr, &substrend); + } ++ if (lhpprefix) { ++ if (matches) { ++ matchend->right = lhpprefix; ++ lhpprefix->left = matchend; ++ } else ++ matches = lhpprefix; ++ matchend = hpprefixend; ++ } + if (lprefix) { + if (matches) { + matchend->right = lprefix; +@@ -552,6 +590,10 @@ readstdin(void) + char *line = NULL; + size_t i, junk, size = 0; + ssize_t len; ++ char **p; ++ ++ if (hpitems && hplength > 0) ++ qsort(hpitems, hplength, sizeof *hpitems, str_compar); + + /* read each line from stdin and add it to the item list */ + for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) { +@@ -562,6 +604,11 @@ readstdin(void) + line[len - 1] = '\0'; + items[i].text = line; + items[i].out = 0; ++ p = hpitems == NULL ? NULL : bsearch( ++ &items[i].text, hpitems, hplength, sizeof *hpitems, ++ str_compar ++ ); ++ items[i].hp = p != NULL; + } + if (items) + items[i].text = NULL; +@@ -711,7 +758,8 @@ static void + usage(void) + { + die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" +- " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); ++ " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n" ++ " [-hb color] [-hf color] [-hp items]"); + } + + int +@@ -751,8 +799,14 @@ main(int argc, char *argv[]) + colors[SchemeSel][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ + colors[SchemeSel][ColFg] = argv[++i]; ++ else if (!strcmp(argv[i], "-hb")) /* high priority background color */ ++ colors[SchemeHp][ColBg] = argv[++i]; ++ else if (!strcmp(argv[i], "-hf")) /* low priority background color */ ++ colors[SchemeHp][ColFg] = argv[++i]; + else if (!strcmp(argv[i], "-w")) /* embedding window id */ + embed = argv[++i]; ++ else if (!strcmp(argv[i], "-hp")) ++ parse_hpitems(argv[++i]); + else + usage(); + diff --git a/patches/x11-terms/st/st-background-image-0.8.5.diff b/patches/x11-terms/st/st-background-image-0.8.5.diff @@ -0,0 +1,262 @@ +From 4ce17bbc340ca1f93f9be686f4a796797f9ca6d5 Mon Sep 17 00:00:00 2001 +From: Matthias Schoth <mschoth@gmail.com> +Date: Sat, 16 Apr 2022 14:21:22 +0200 +Subject: [PATCH] Implements background image and pseudo transparancy support. + +--- + config.def.h | 8 +++ + x.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++---- + 2 files changed, 139 insertions(+), 10 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 91ab8ca..ad19e3d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -8,6 +8,14 @@ + static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; + static int borderpx = 2; + ++/* ++ * background image ++ * expects farbfeld format ++ * pseudo transparency fixes coordinates to the screen origin ++ */ ++static const char *bgfile = "/path/to/image.ff"; ++static const int pseudotransparency = 0; ++ + /* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e +diff --git a/x.c b/x.c +index 8a16faa..fedef53 100644 +--- a/x.c ++++ b/x.c +@@ -14,6 +14,7 @@ + #include <X11/keysym.h> + #include <X11/Xft/Xft.h> + #include <X11/XKBlib.h> ++#include <arpa/inet.h> + + char *argv0; + #include "arg.h" +@@ -81,6 +82,7 @@ typedef XftGlyphFontSpec GlyphFontSpec; + typedef struct { + int tw, th; /* tty width and height */ + int w, h; /* window width and height */ ++ int x, y; /* window location */ + int ch; /* char height */ + int cw; /* char width */ + int mode; /* window state/mode flags */ +@@ -101,6 +103,7 @@ typedef struct { + XVaNestedList spotlist; + } ime; + Draw draw; ++ GC bggc; /* Graphics Context for background */ + Visual *vis; + XSetWindowAttributes attrs; + int scr; +@@ -151,6 +154,9 @@ static void ximinstantiate(Display *, XPointer, XPointer); + static void ximdestroy(XIM, XPointer, XPointer); + static int xicdestroy(XIC, XPointer, XPointer); + static void xinit(int, int); ++static void updatexy(void); ++static XImage *loadff(const char *); ++static void bginit(); + static void cresize(int, int); + static void xresize(int, int); + static void xhints(void); +@@ -504,6 +510,12 @@ propnotify(XEvent *e) + xpev->atom == clipboard)) { + selnotify(e); + } ++ ++ if (pseudotransparency && ++ !strncmp(XGetAtomName(xw.dpy, e->xproperty.atom), "_NET_WM_STATE", 13)) { ++ updatexy(); ++ redraw(); ++ } + } + + void +@@ -534,7 +546,8 @@ selnotify(XEvent *e) + return; + } + +- if (e->type == PropertyNotify && nitems == 0 && rem == 0) { ++ if (e->type == PropertyNotify && nitems == 0 && rem == 0 && ++ !pseudotransparency) { + /* + * If there is some PropertyNotify with no data, then + * this is the signal of the selection owner that all +@@ -552,9 +565,11 @@ selnotify(XEvent *e) + * when the selection owner does send us the next + * chunk of data. + */ +- MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); +- XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, ++ if (!pseudotransparency) { ++ MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); ++ XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, + &xw.attrs); ++ } + + /* + * Deleting the property is the transfer start signal. +@@ -835,9 +850,9 @@ xsetcolorname(int x, const char *name) + void + xclear(int x1, int y1, int x2, int y2) + { +- XftDrawRect(xw.draw, +- &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], +- x1, y1, x2-x1, y2-y1); ++ if (pseudotransparency) ++ XSetTSOrigin(xw.dpy, xw.bggc, -win.x, -win.y); ++ XFillRectangle(xw.dpy, xw.buf, xw.bggc, x1, y1, x2-x1, y2-y1); + } + + void +@@ -1223,6 +1238,100 @@ xinit(int cols, int rows) + xsel.xtarget = XA_STRING; + } + ++void ++updatexy() ++{ ++ Window child; ++ XTranslateCoordinates(xw.dpy, xw.win, DefaultRootWindow(xw.dpy), 0, 0, ++ &win.x, &win.y, &child); ++} ++ ++/* ++ * load farbfeld file to XImage ++ */ ++XImage* ++loadff(const char *filename) ++{ ++ uint32_t i, hdr[4], w, h, size; ++ uint64_t *data; ++ FILE *f = fopen(filename, "rb"); ++ ++ if (f == NULL) { ++ fprintf(stderr, "Can not open background image file\n"); ++ return NULL; ++ } ++ ++ if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr)) ++ if (ferror(f)) { ++ fprintf(stderr, "fread:"); ++ return NULL; ++ } ++ else { ++ fprintf(stderr, "fread: Unexpected end of file\n"); ++ return NULL; ++ } ++ ++ if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { ++ fprintf(stderr, "Invalid magic value\n"); ++ return NULL; ++ } ++ ++ w = ntohl(hdr[2]); ++ h = ntohl(hdr[3]); ++ size = w * h; ++ data = malloc(size * sizeof(uint64_t)); ++ ++ if (fread(data, sizeof(uint64_t), size, f) != size) ++ if (ferror(f)) { ++ fprintf(stderr, "fread:"); ++ return NULL; ++ } ++ else { ++ fprintf(stderr, "fread: Unexpected end of file\n"); ++ return NULL; ++ } ++ ++ fclose(f); ++ ++ for (i = 0; i < size; i++) ++ data[i] = (data[i] & 0x00000000000000FF) << 16 | ++ (data[i] & 0x0000000000FF0000) >> 8 | ++ (data[i] & 0x000000FF00000000) >> 32; ++ ++ XImage *xi = XCreateImage(xw.dpy, DefaultVisual(xw.dpy, xw.scr), ++ DefaultDepth(xw.dpy, xw.scr), ZPixmap, 0, ++ (char *)data, w, h, 32, w * 8); ++ xi->bits_per_pixel = 64; ++ return xi; ++} ++ ++/* ++ * initialize background image ++ */ ++void ++bginit() ++{ ++ XGCValues gcvalues; ++ Drawable bgimg; ++ XImage *bgxi = loadff(bgfile); ++ ++ memset(&gcvalues, 0, sizeof(gcvalues)); ++ xw.bggc = XCreateGC(xw.dpy, xw.win, 0, &gcvalues); ++ if (!bgxi) return; ++ bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height, ++ DefaultDepth(xw.dpy, xw.scr)); ++ XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width, ++ bgxi->height); ++ XDestroyImage(bgxi); ++ XSetTile(xw.dpy, xw.bggc, bgimg); ++ XSetFillStyle(xw.dpy, xw.bggc, FillTiled); ++ if (pseudotransparency) { ++ updatexy(); ++ MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); ++ XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); ++ } ++} ++ + int + xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) + { +@@ -1463,7 +1572,10 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i + xclear(winx, winy + win.ch, winx + width, win.h); + + /* Clean up the region we want to draw to. */ +- XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); ++ if (bg == &dc.col[defaultbg]) ++ xclear(winx, winy, winx + width, winy + win.ch); ++ else ++ XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); + + /* Set the clip region because Xft is sometimes dirty. */ + r.x = 0; +@@ -1886,9 +1998,17 @@ cmessage(XEvent *e) + void + resize(XEvent *e) + { +- if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) +- return; +- ++ if (pseudotransparency) { ++ if (e->xconfigure.width == win.w && ++ e->xconfigure.height == win.h && ++ e->xconfigure.x == win.x && e->xconfigure.y == win.y) ++ return; ++ updatexy(); ++ } else { ++ if (e->xconfigure.width == win.w && ++ e->xconfigure.height == win.h) ++ return; ++ } + cresize(e->xconfigure.width, e->xconfigure.height); + } + +@@ -2072,6 +2192,7 @@ run: + rows = MAX(rows, 1); + tnew(cols, rows); + xinit(cols, rows); ++ bginit(); + xsetenv(); + selinit(); + run(); +-- +2.35.1 + diff --git a/patches/x11-wm/dwm/01-dwm-adjacenttag-6.2.diff b/patches/x11-wm/dwm/01-dwm-adjacenttag-6.2.diff @@ -0,0 +1,112 @@ +diff -up a/dwm.c b/dwm.c +--- a/dwm.c 2021-10-02 13:57:18.011307099 +0100 ++++ b/dwm.c 2021-10-02 14:21:17.063622953 +0100 +@@ -183,8 +183,10 @@ static void maprequest(XEvent *e); + static void monocle(Monitor *m); + static void motionnotify(XEvent *e); + static void movemouse(const Arg *arg); ++static unsigned int nexttag(void); + static Client *nexttiled(Client *c); + static void pop(Client *c); ++static unsigned int prevtag(void); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); +@@ -208,6 +210,8 @@ static void sigchld(int unused); + static void spawn(const Arg *arg); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); ++static void tagtonext(const Arg *arg); ++static void tagtoprev(const Arg *arg); + static void tile(Monitor *m); + static void togglebar(const Arg *arg); + static void togglefloating(const Arg *arg); +@@ -227,6 +231,8 @@ static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); ++static void viewnext(const Arg *arg); ++static void viewprev(const Arg *arg); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); +@@ -1192,6 +1198,13 @@ movemouse(const Arg *arg) + } + } + ++unsigned int ++nexttag(void) ++{ ++ unsigned int seltag = selmon->tagset[selmon->seltags]; ++ return seltag == (1 << (LENGTH(tags) - 1)) ? 1 : seltag << 1; ++} ++ + Client * + nexttiled(Client *c) + { +@@ -1208,6 +1221,13 @@ pop(Client *c) + arrange(c->mon); + } + ++unsigned int ++prevtag(void) ++{ ++ unsigned int seltag = selmon->tagset[selmon->seltags]; ++ return seltag == 1 ? (1 << (LENGTH(tags) - 1)) : seltag >> 1; ++} ++ + void + propertynotify(XEvent *e) + { +@@ -1671,6 +1691,32 @@ tagmon(const Arg *arg) + } + + void ++tagtonext(const Arg *arg) ++{ ++ unsigned int tmp; ++ ++ if (selmon->sel == NULL) ++ return; ++ ++ tmp = nexttag(); ++ tag(&(const Arg){.ui = tmp }); ++ view(&(const Arg){.ui = tmp }); ++} ++ ++void ++tagtoprev(const Arg *arg) ++{ ++ unsigned int tmp; ++ ++ if (selmon->sel == NULL) ++ return; ++ ++ tmp = prevtag(); ++ tag(&(const Arg){.ui = tmp }); ++ view(&(const Arg){.ui = tmp }); ++} ++ ++void + tile(Monitor *m) + { + unsigned int i, n, h, mw, my, ty; +@@ -2044,6 +2090,18 @@ view(const Arg *arg) + arrange(selmon); + } + ++void ++viewnext(const Arg *arg) ++{ ++ view(&(const Arg){.ui = nexttag()}); ++} ++ ++void ++viewprev(const Arg *arg) ++{ ++ view(&(const Arg){.ui = prevtag()}); ++} ++ + Client * + wintoclient(Window w) + { diff --git a/patches/x11-wm/dwm/02-dwm-pertag-6.2.diff b/patches/x11-wm/dwm/02-dwm-pertag-6.2.diff @@ -0,0 +1,177 @@ +diff --git a/dwm.c b/dwm.c +index 4465af1..6474055 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -111,6 +111,7 @@ typedef struct { + void (*arrange)(Monitor *); + } Layout; + ++typedef struct Pertag Pertag; + struct Monitor { + char ltsymbol[16]; + float mfact; +@@ -130,6 +131,7 @@ struct Monitor { + Monitor *next; + Window barwin; + const Layout *lt[2]; ++ Pertag *pertag; + }; + + typedef struct { +@@ -271,6 +273,15 @@ static Window root, wmcheckwin; + /* configuration, allows nested code to access above variables */ + #include "config.h" + ++struct Pertag { ++ unsigned int curtag, prevtag; /* current and previous tag */ ++ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ ++ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ ++ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ ++ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ ++ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ ++}; ++ + /* compile-time check if all tags fit into an unsigned int bit array. */ + struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +@@ -631,6 +642,7 @@ Monitor * + createmon(void) + { + Monitor *m; ++ unsigned int i; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; +@@ -641,6 +653,20 @@ createmon(void) + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); ++ m->pertag = ecalloc(1, sizeof(Pertag)); ++ m->pertag->curtag = m->pertag->prevtag = 1; ++ ++ for (i = 0; i <= LENGTH(tags); i++) { ++ m->pertag->nmasters[i] = m->nmaster; ++ m->pertag->mfacts[i] = m->mfact; ++ ++ m->pertag->ltidxs[i][0] = m->lt[0]; ++ m->pertag->ltidxs[i][1] = m->lt[1]; ++ m->pertag->sellts[i] = m->sellt; ++ ++ m->pertag->showbars[i] = m->showbar; ++ } ++ + return m; + } + +@@ -966,7 +992,7 @@ grabkeys(void) + void + incnmaster(const Arg *arg) + { +- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); + } + +@@ -1501,9 +1527,9 @@ void + setlayout(const Arg *arg) + { + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) +- selmon->sellt ^= 1; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; + if (arg && arg->v) +- selmon->lt[selmon->sellt] = (Layout *)arg->v; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); +@@ -1522,7 +1548,7 @@ setmfact(const Arg *arg) + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.1 || f > 0.9) + return; +- selmon->mfact = f; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; + arrange(selmon); + } + +@@ -1699,7 +1725,7 @@ tile(Monitor *m) + void + togglebar(const Arg *arg) + { +- selmon->showbar = !selmon->showbar; ++ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +@@ -1738,9 +1764,33 @@ void + toggleview(const Arg *arg) + { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); ++ int i; + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; ++ ++ if (newtagset == ~0) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = 0; ++ } ++ ++ /* test if the user did not select the same tag */ ++ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ for (i = 0; !(newtagset & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } ++ ++ /* apply settings for this view */ ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; ++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; ++ ++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) ++ togglebar(NULL); ++ + focus(NULL); + arrange(selmon); + } +@@ -2035,11 +2085,37 @@ updatewmhints(Client *c) + void + view(const Arg *arg) + { ++ int i; ++ unsigned int tmptag; ++ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ +- if (arg->ui & TAGMASK) ++ if (arg->ui & TAGMASK) { + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ ++ if (arg->ui == ~0) ++ selmon->pertag->curtag = 0; ++ else { ++ for (i = 0; !(arg->ui & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } ++ } else { ++ tmptag = selmon->pertag->prevtag; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = tmptag; ++ } ++ ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; ++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; ++ ++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) ++ togglebar(NULL); ++ + focus(NULL); + arrange(selmon); + } diff --git a/patches/x11-wm/dwm/03-dwm-resetlayout-6.2_and_no-border.diff b/patches/x11-wm/dwm/03-dwm-resetlayout-6.2_and_no-border.diff @@ -0,0 +1,73 @@ +From 4df827a2ec7820f41bdb8576cc39b55fbf35be44 Mon Sep 17 00:00:00 2001 +From: Jack Bird <jack.bird@durham.ac.uk> +Date: Mon, 16 Aug 2021 23:25:16 +0100 +Subject: [PATCH] Patch applies cleanly + +--- + config.def.h | 1 + + dwm.c | 15 +++++++++++++++ + 2 files changed, 16 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..5d118cf 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -70,6 +70,7 @@ static Key keys[] = { + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, ++ { MODKEY, XK_r, resetlayout, {0} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, +diff --git a/dwm.c b/dwm.c +index 4465af1..77727ea 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -188,6 +188,7 @@ static void pop(Client *); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); ++static void resetlayout(const Arg *arg); + static void resize(Client *c, int x, int y, int w, int h, int interact); + static void resizeclient(Client *c, int x, int y, int w, int h); + static void resizemouse(const Arg *arg); +@@ -1265,6 +1266,16 @@ recttomon(int x, int y, int w, int h) + return r; + } + ++void ++resetlayout(const Arg *arg) ++{ ++ Arg default_layout = {.v = &layouts[0]}; ++ Arg default_mfact = {.f = mfact + 1}; ++ ++ setlayout(&default_layout); ++ setmfact(&default_mfact); ++} ++ + void + resize(Client *c, int x, int y, int w, int h, int interact) + { +@@ -1282,6 +1293,18 @@ resizeclient(Client *c, int x, int y, int w, int h) + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ ++ if ((nexttiled(c->mon->clients) == c) && !(nexttiled(c->next))) ++ resetlayout(NULL); ++ ++ if (((nexttiled(c->mon->clients) == c && !nexttiled(c->next)) ++ || &monocle == c->mon->lt[c->mon->sellt]->arrange) ++ && !c->isfullscreen && !c->isfloating ++ && NULL != c->mon->lt[c->mon->sellt]->arrange) { ++ c->w = wc.width += c->bw * 2; ++ c->h = wc.height += c->bw *2; ++ wc.border_width = 0; ++ } + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +-- +2.32.0 + diff --git a/patches/x11-wm/dwm/04-dwm-fancybar-20220527-d3f93c7.diff b/patches/x11-wm/dwm/04-dwm-fancybar-20220527-d3f93c7.diff @@ -0,0 +1,73 @@ +diff --git a/dwm.c b/dwm.c +--- a/dwm.c ++++ b/dwm.c +@@ -699,10 +699,10 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, mw, ew = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; +- unsigned int i, occ = 0, urg = 0; ++ unsigned int i, occ = 0, urg = 0, n = 0; + Client *c; + + if (!m->showbar) +@@ -716,6 +716,8 @@ drawbar(Monitor *m) + } + + for (c = m->clients; c; c = c->next) { ++ if (ISVISIBLE(c)) ++ n++; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -736,15 +738,39 @@ drawbar(Monitor *m) + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + + if ((w = m->ww - tw - x) > bh) { +- if (m->sel) { +- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +- if (m->sel->isfloating) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); +- } else { +- drw_setscheme(drw, scheme[SchemeNorm]); +- drw_rect(drw, x, 0, w, bh, 1, 1); ++ if (n > 0) { ++ tw = TEXTW(m->sel->name) + lrpad; ++ mw = (tw >= w || n == 1) ? 0 : (w - tw) / (n - 1); ++ ++ i = 0; ++ for (c = m->clients; c; c = c->next) { ++ if (!ISVISIBLE(c) || c == m->sel) ++ continue; ++ tw = TEXTW(c->name); ++ if(tw < mw) ++ ew += (mw - tw); ++ else ++ i++; ++ } ++ if (i > 0) ++ mw += ew / i; ++ ++ for (c = m->clients; c; c = c->next) { ++ if (!ISVISIBLE(c)) ++ continue; ++ tw = MIN(m->sel == c ? w : mw, TEXTW(c->name)); ++ ++ drw_setscheme(drw, scheme[m == selmon && m->sel == c ? SchemeSel : SchemeNorm]); ++ if (tw > lrpad / 2) ++ drw_text(drw, x, 0, tw, bh, lrpad / 2, c->name, 0); ++ if (c->isfloating) ++ drw_rect(drw, x + boxs, boxs, boxw, boxw, c->isfixed, 0); ++ x += tw; ++ w -= tw; ++ } + } ++ drw_setscheme(drw, scheme[SchemeNorm]); ++ drw_rect(drw, x, 0, w, bh, 1, 1); + } + drw_map(drw, m->barwin, 0, 0, m->ww, bh); + } diff --git a/patches/x11-wm/dwm/05-dwm-fullgaps-6.4.diff b/patches/x11-wm/dwm/05-dwm-fullgaps-6.4.diff @@ -0,0 +1,68 @@ +diff -up a/config.def.h b/config.def.h +--- a/config.def.h ++++ b/config.def.h +@@ -2,6 +2,7 @@ + + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ ++static const unsigned int gappx = 5; /* gaps between windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ +diff -up a/dwm.c b/dwm.c +--- a/dwm.c 2023-04-30 ++++ b/dwm.c 2023-04-30 +@@ -200,6 +201,7 @@ static void sendmon(Client *c, Monitor * + static void setclientstate(Client *c, long state); + static void setfocus(Client *c); + static void setfullscreen(Client *c, int fullscreen); ++static void setgaps(const Arg *arg); + static void setlayout(const Arg *arg); + static void setmfact(const Arg *arg); + static void setup(void); +@@ -1508,6 +1511,16 @@ setfullscreen(Client *c, int fullscreen) + } + + void ++setgaps(const Arg *arg) ++{ ++ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) ++ selmon->gappx = 0; ++ else ++ selmon->gappx += arg->i; ++ arrange(selmon); ++} ++ ++void + setlayout(const Arg *arg) + { + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) +@@ -1697,18 +1710,18 @@ tile(Monitor *m) + if (n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else +- mw = m->ww; +- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) +- if (i < m->nmaster) { +- h = (m->wh - my) / (MIN(n, m->nmaster) - i); +- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); +- if (my + HEIGHT(c) < m->wh) +- my += HEIGHT(c); ++ mw = m->ww - m->gappx; ++ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) ++ if (i < m->nmaster) { ++ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; ++ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); ++ if (my + HEIGHT(c) + m->gappx < m->wh) ++ my += HEIGHT(c) + m->gappx; + } else { +- h = (m->wh - ty) / (n - i); +- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); +- if (ty + HEIGHT(c) < m->wh) +- ty += HEIGHT(c); ++ h = (m->wh - ty) / (n - i) - m->gappx; ++ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0); ++ if (ty + HEIGHT(c) + m->gappx < m->wh) ++ ty += HEIGHT(c) + m->gappx; + } + } diff --git a/patches/x11-wm/dwm/06-dwm-alttab-6.4.diff b/patches/x11-wm/dwm/06-dwm-alttab-6.4.diff @@ -0,0 +1,324 @@ +From 8b1d33db9cbc03bf12df398bb14e62389efc70a3 Mon Sep 17 00:00:00 2001 +From: ViliamKovac1223 <viliamkovac1223@gmail.com> +Date: Sun, 9 Oct 2022 16:29:28 -0400 +Subject: [PATCH] add alt-tab functionality + +Co-authored-by: Daniel Gerblick <daniel.gerblick@gmail.com> +--- + config.def.h | 11 ++- + dwm.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 228 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index 061ad66..7a9e3b1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -1,5 +1,13 @@ + /* See LICENSE file for copyright and license details. */ + ++/* alt-tab configuration */ ++static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/ ++static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */ ++static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */ ++static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */ ++static const unsigned int maxWTab = 600; /* tab menu width */ ++static const unsigned int maxHTab = 200; /* tab menu height */ ++ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ +@@ -71,7 +79,7 @@ static const Key keys[] = { + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, +- { MODKEY, XK_Tab, view, {0} }, ++ { MODKEY, XK_q, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, +@@ -84,6 +92,7 @@ static const Key keys[] = { + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, ++ { Mod1Mask, XK_Tab, altTabStart, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +diff --git a/dwm.c b/dwm.c +index e5efb6a..f606311 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -40,6 +40,7 @@ + #include <X11/extensions/Xinerama.h> + #endif /* XINERAMA */ + #include <X11/Xft/Xft.h> ++#include <time.h> + + #include "drw.h" + #include "util.h" +@@ -119,6 +120,12 @@ struct Monitor { + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ ++ int altTabN; /* move that many clients forward */ ++ int nTabs; /* number of active clients in tag */ ++ int isAlt; /* 1,0 */ ++ int maxWTab; ++ int maxHTab; ++ int gappx; /* gaps between windows */ + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; +@@ -127,8 +133,10 @@ struct Monitor { + Client *clients; + Client *sel; + Client *stack; ++ Client ** altsnext; /* array of all clients in the tag */ + Monitor *next; + Window barwin; ++ Window tabwin; + const Layout *lt[2]; + }; + +@@ -234,6 +242,9 @@ static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); ++void drawTab(int nwins, int first, Monitor *m); ++void altTabStart(const Arg *arg); ++static void altTabEnd(); + + /* variables */ + static const char broken[] = "broken"; +@@ -477,6 +488,7 @@ cleanup(void) + Monitor *m; + size_t i; + ++ altTabEnd(); + view(&a); + selmon->lt[selmon->sellt] = &foo; + for (m = mons; m; m = m->next) +@@ -644,6 +656,8 @@ createmon(void) + m->topbar = topbar; ++ m->gappx = gappx; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; ++ m->nTabs = 0; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + return m; + } +@@ -1649,6 +1662,211 @@ spawn(const Arg *arg) + } + } + ++void ++altTab() ++{ ++ /* move to next window */ ++ if (selmon->sel != NULL && selmon->sel->snext != NULL) { ++ selmon->altTabN++; ++ if (selmon->altTabN >= selmon->nTabs) ++ selmon->altTabN = 0; /* reset altTabN */ ++ ++ focus(selmon->altsnext[selmon->altTabN]); ++ restack(selmon); ++ } ++ ++ /* redraw tab */ ++ XRaiseWindow(dpy, selmon->tabwin); ++ drawTab(selmon->nTabs, 0, selmon); ++} ++ ++void ++altTabEnd() ++{ ++ if (selmon->isAlt == 0) ++ return; ++ ++ /* ++ * move all clients between 1st and choosen position, ++ * one down in stack and put choosen client to the first position ++ * so they remain in right order for the next time that alt-tab is used ++ */ ++ if (selmon->nTabs > 1) { ++ if (selmon->altTabN != 0) { /* if user picked original client do nothing */ ++ Client *buff = selmon->altsnext[selmon->altTabN]; ++ if (selmon->altTabN > 1) ++ for (int i = selmon->altTabN;i > 0;i--) ++ selmon->altsnext[i] = selmon->altsnext[i - 1]; ++ else /* swap them if there are just 2 clients */ ++ selmon->altsnext[selmon->altTabN] = selmon->altsnext[0]; ++ selmon->altsnext[0] = buff; ++ } ++ ++ /* restack clients */ ++ for (int i = selmon->nTabs - 1;i >= 0;i--) { ++ focus(selmon->altsnext[i]); ++ restack(selmon); ++ } ++ ++ free(selmon->altsnext); /* free list of clients */ ++ } ++ ++ /* turn off/destroy the window */ ++ selmon->isAlt = 0; ++ selmon->nTabs = 0; ++ XUnmapWindow(dpy, selmon->tabwin); ++ XDestroyWindow(dpy, selmon->tabwin); ++} ++ ++void ++drawTab(int nwins, int first, Monitor *m) ++{ ++ /* little documentation of functions */ ++ /* void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); */ ++ /* int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); */ ++ /* void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); */ ++ ++ Client *c; ++ int h; ++ ++ if (first) { ++ Monitor *m = selmon; ++ XSetWindowAttributes wa = { ++ .override_redirect = True, ++ .background_pixmap = ParentRelative, ++ .event_mask = ButtonPressMask|ExposureMask ++ }; ++ ++ selmon->maxWTab = maxWTab; ++ selmon->maxHTab = maxHTab; ++ ++ /* decide position of tabwin */ ++ int posX = selmon->mx; ++ int posY = selmon->my; ++ if (tabPosX == 0) ++ posX += 0; ++ if (tabPosX == 1) ++ posX += (selmon->mw / 2) - (maxWTab / 2); ++ if (tabPosX == 2) ++ posX += selmon->mw - maxWTab; ++ ++ if (tabPosY == 0) ++ posY += selmon->mh - maxHTab; ++ if (tabPosY == 1) ++ posY += (selmon->mh / 2) - (maxHTab / 2); ++ if (tabPosY == 2) ++ posY += 0; ++ ++ h = selmon->maxHTab; ++ /* XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valuemask, attributes); just reference */ ++ m->tabwin = XCreateWindow(dpy, root, posX, posY, selmon->maxWTab, selmon->maxHTab, 2, DefaultDepth(dpy, screen), ++ CopyFromParent, DefaultVisual(dpy, screen), ++ CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); /* create tabwin */ ++ ++ XDefineCursor(dpy, m->tabwin, cursor[CurNormal]->cursor); ++ XMapRaised(dpy, m->tabwin); ++ ++ } ++ ++ h = selmon->maxHTab / m->nTabs; ++ ++ int y = 0; ++ int n = 0; ++ for (int i = 0;i < m->nTabs;i++) { /* draw all clients into tabwin */ ++ c = m->altsnext[i]; ++ if(!ISVISIBLE(c)) continue; ++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */ ++ ++ n++; ++ drw_setscheme(drw, scheme[(c == m->sel) ? SchemeSel : SchemeNorm]); ++ drw_text(drw, 0, y, selmon->maxWTab, h, 0, c->name, 0); ++ y += h; ++ } ++ ++ drw_setscheme(drw, scheme[SchemeNorm]); ++ drw_map(drw, m->tabwin, 0, 0, selmon->maxWTab, selmon->maxHTab); ++} ++ ++void ++altTabStart(const Arg *arg) ++{ ++ selmon->altsnext = NULL; ++ if (selmon->tabwin) ++ altTabEnd(); ++ ++ if (selmon->isAlt == 1) { ++ altTabEnd(); ++ } else { ++ selmon->isAlt = 1; ++ selmon->altTabN = 0; ++ ++ Client *c; ++ Monitor *m = selmon; ++ ++ m->nTabs = 0; ++ for(c = m->clients; c; c = c->next) { /* count clients */ ++ if(!ISVISIBLE(c)) continue; ++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */ ++ ++ ++m->nTabs; ++ } ++ ++ if (m->nTabs > 0) { ++ m->altsnext = (Client **) malloc(m->nTabs * sizeof(Client *)); ++ ++ int listIndex = 0; ++ for(c = m->stack; c; c = c->snext) { /* add clients to the list */ ++ if(!ISVISIBLE(c)) continue; ++ /* if (HIDDEN(c)) continue; uncomment if you're using awesomebar patch */ ++ ++ m->altsnext[listIndex++] = c; ++ } ++ ++ drawTab(m->nTabs, 1, m); ++ ++ struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; ++ ++ /* grab keyboard (take all input from keyboard) */ ++ int grabbed = 1; ++ for (int i = 0;i < 1000;i++) { ++ if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) ++ break; ++ nanosleep(&ts, NULL); ++ if (i == 1000 - 1) ++ grabbed = 0; ++ } ++ ++ XEvent event; ++ altTab(); ++ if (grabbed == 0) { ++ altTabEnd(); ++ } else { ++ while (grabbed) { ++ XNextEvent(dpy, &event); ++ if (event.type == KeyPress || event.type == KeyRelease) { ++ if (event.type == KeyRelease && event.xkey.keycode == tabModKey) { /* if super key is released break cycle */ ++ break; ++ } else if (event.type == KeyPress) { ++ if (event.xkey.keycode == tabCycleKey) {/* if XK_s is pressed move to the next window */ ++ altTab(); ++ } ++ } ++ } ++ } ++ ++ c = selmon->sel; ++ altTabEnd(); /* end the alt-tab functionality */ ++ /* XUngrabKeyboard(display, time); just a reference */ ++ XUngrabKeyboard(dpy, CurrentTime); /* stop taking all input from keyboard */ ++ focus(c); ++ restack(selmon); ++ } ++ } else { ++ altTabEnd(); /* end the alt-tab functionality */ ++ } ++ } ++} ++ + void + tag(const Arg *arg) + { +-- +2.37.3 + diff --git a/savedconfig/sys-kernel/linux-firmware-20240709-r1 b/savedconfig/sys-kernel/linux-firmware-20240709-r1 @@ -0,0 +1,3942 @@ +# Remove files that shall not be installed from this list. +3com/typhoon.bin +INT8866RCA2.bin +TAS2XXX2234.bin +TAS2XXX3870.bin +TAS2XXX387D.bin +TAS2XXX387E.bin +TAS2XXX387F.bin +TAS2XXX3880.bin +TAS2XXX3881.bin +TAS2XXX3882.bin +TAS2XXX3884.bin +TAS2XXX3886.bin +TAS2XXX38A5.bin +TAS2XXX38A7.bin +TAS2XXX38A8.bin +TAS2XXX38B8.bin +TAS2XXX38B9.bin +TAS2XXX38BA.bin +TAS2XXX38BB.bin +TAS2XXX38BE.bin +TAS2XXX38BF.bin +TAS2XXX38C3.bin +TAS2XXX38CB.bin +TAS2XXX38CD.bin +TAS2XXX38D3.bin +TAS2XXX38D4.bin +TAS2XXX38D5.bin +TAS2XXX38D6.bin +TAS2XXX38DF.bin +TAS2XXX38E0.bin +TIAS2781RCA2.bin +TIAS2781RCA4.bin +a300_pfp.fw +a300_pm4.fw +advansys/38C0800.bin +advansys/mcode.bin +advansys/38C1600.bin +advansys/3550.bin +agere_ap_fw.bin +agere_sta_fw.bin +airoha/EthMD32.dm.bin +airoha/EthMD32.DSP.bin +amd/amd_sev_fam19h_model1xh.sbin +amd/amd_sev_fam19h_model0xh.sbin +amd/amd_sev_fam17h_model3xh.sbin +amd/amd_sev_fam17h_model0xh.sbin +amd-ucode/microcode_amd_fam15h.bin +amd-ucode/microcode_amd.bin +amd-ucode/microcode_amd_fam17h.bin +amd-ucode/microcode_amd_fam19h.bin +amd-ucode/microcode_amd_fam16h.bin +amd-ucode/README +amdgpu/polaris10_ce_2.bin +amdgpu/fiji_pfp.bin +amdgpu/fiji_mc.bin +amdgpu/vegam_vce.bin +amdgpu/yellow_carp_pfp.bin +amdgpu/beige_goby_rlc.bin +amdgpu/vega12_sdma1.bin +amdgpu/vega12_mec2.bin +amdgpu/sdma_6_0_2.bin +amdgpu/oland_smc.bin +amdgpu/gc_10_3_6_mec2.bin +amdgpu/bonaire_sdma1.bin +amdgpu/sienna_cichlid_mec2.bin +amdgpu/pitcairn_mc.bin +amdgpu/vcn_4_0_4.bin +amdgpu/mullins_pfp.bin +amdgpu/gc_11_0_0_rlc.bin +amdgpu/pitcairn_me.bin +amdgpu/sienna_cichlid_me.bin +amdgpu/vega20_rlc.bin +amdgpu/gc_10_3_6_rlc.bin +amdgpu/navi12_vcn.bin +amdgpu/sienna_cichlid_rlc.bin +amdgpu/renoir_me.bin +amdgpu/vangogh_ce.bin +amdgpu/polaris11_vce.bin +amdgpu/bonaire_uvd.bin +amdgpu/polaris10_sdma1.bin +amdgpu/vangogh_me.bin +amdgpu/raven2_ce.bin +amdgpu/aldebaran_sos.bin +amdgpu/smu_13_0_0.bin +amdgpu/hawaii_ce.bin +amdgpu/gc_9_4_3_rlc.bin +amdgpu/kabini_sdma1.bin +amdgpu/beige_goby_sdma.bin +amdgpu/gc_10_3_7_me.bin +amdgpu/aldebaran_sjt_mec.bin +amdgpu/dcn_3_2_0_dmcub.bin +amdgpu/verde_ce.bin +amdgpu/vegam_mec.bin +amdgpu/gc_11_0_3_mec.bin +amdgpu/smu_13_0_6.bin +amdgpu/polaris10_k_mc.bin +amdgpu/navi12_mec.bin +amdgpu/navi10_sdma1.bin +amdgpu/bonaire_pfp.bin +amdgpu/navy_flounder_me.bin +amdgpu/polaris11_sdma.bin +amdgpu/renoir_vcn.bin +amdgpu/picasso_gpu_info.bin +amdgpu/polaris12_mec2.bin +amdgpu/gc_10_3_7_ce.bin +amdgpu/psp_13_0_0_ta.bin +amdgpu/hainan_ce.bin +amdgpu/kabini_mec.bin +amdgpu/raven2_pfp.bin +amdgpu/navi14_pfp.bin +amdgpu/stoney_uvd.bin +amdgpu/vegam_mec2.bin +amdgpu/tahiti_mc.bin +amdgpu/polaris11_me_2.bin +amdgpu/aldebaran_rlc.bin +amdgpu/vega10_sos.bin +amdgpu/gc_11_0_2_mes.bin +amdgpu/polaris12_32_mc.bin +amdgpu/vega10_ce.bin +amdgpu/green_sardine_pfp.bin +amdgpu/kaveri_ce.bin +amdgpu/polaris10_mc.bin +amdgpu/carrizo_vce.bin +amdgpu/fiji_smc.bin +amdgpu/navi12_smc.bin +amdgpu/gc_11_0_2_mec.bin +amdgpu/gc_11_0_0_pfp.bin +amdgpu/polaris12_mc.bin +amdgpu/gc_11_0_2_mes_2.bin +amdgpu/gc_10_3_6_me.bin +amdgpu/vega20_uvd.bin +amdgpu/dcn_3_1_6_dmcub.bin +amdgpu/fiji_sdma1.bin +amdgpu/tonga_rlc.bin +amdgpu/stoney_ce.bin +amdgpu/tahiti_me.bin +amdgpu/green_sardine_asd.bin +amdgpu/gc_11_5_1_me.bin +amdgpu/polaris10_vce.bin +amdgpu/vcn_4_0_2.bin +amdgpu/sdma_6_1_0.bin +amdgpu/cyan_skillfish2_ce.bin +amdgpu/mullins_vce.bin +amdgpu/hawaii_me.bin +amdgpu/gc_11_0_0_imu.bin +amdgpu/kabini_ce.bin +amdgpu/kabini_rlc.bin +amdgpu/polaris10_mec.bin +amdgpu/vega10_mec.bin +amdgpu/navi14_vcn.bin +amdgpu/topaz_me.bin +amdgpu/renoir_mec.bin +amdgpu/navy_flounder_sos.bin +amdgpu/yellow_carp_dmcub.bin +amdgpu/gc_11_0_0_mes.bin +amdgpu/raven_mec.bin +amdgpu/navi14_mec.bin +amdgpu/vangogh_rlc.bin +amdgpu/psp_13_0_6_ta.bin +amdgpu/dimgrey_cavefish_rlc.bin +amdgpu/carrizo_ce.bin +amdgpu/navi14_sdma1.bin +amdgpu/cyan_skillfish2_sdma.bin +amdgpu/polaris10_smc_sk.bin +amdgpu/vangogh_toc.bin +amdgpu/verde_rlc.bin +amdgpu/dimgrey_cavefish_ta.bin +amdgpu/polaris11_smc_sk.bin +amdgpu/pitcairn_smc.bin +amdgpu/hawaii_pfp.bin +amdgpu/sienna_cichlid_ta.bin +amdgpu/kaveri_pfp.bin +amdgpu/topaz_ce.bin +amdgpu/gc_11_5_0_mes1.bin +amdgpu/topaz_mec.bin +amdgpu/oland_rlc.bin +amdgpu/yellow_carp_rlc.bin +amdgpu/polaris10_me.bin +amdgpu/yellow_carp_ta.bin +amdgpu/vega10_uvd.bin +amdgpu/vega20_pfp.bin +amdgpu/navi14_smc.bin +amdgpu/polaris11_k_smc.bin +amdgpu/bonaire_rlc.bin +amdgpu/vega12_pfp.bin +amdgpu/verde_k_smc.bin +amdgpu/gc_11_0_2_mes1.bin +amdgpu/sienna_cichlid_smc.bin +amdgpu/navi10_sdma.bin +amdgpu/polaris11_sdma1.bin +amdgpu/oland_me.bin +amdgpu/navi10_asd.bin +amdgpu/navy_flounder_dmcub.bin +amdgpu/raven_me.bin +amdgpu/yellow_carp_me.bin +amdgpu/carrizo_sdma.bin +amdgpu/pitcairn_ce.bin +amdgpu/tonga_me.bin +amdgpu/gc_11_0_0_mec.bin +amdgpu/navi10_gpu_info.bin +amdgpu/stoney_sdma.bin +amdgpu/raven_pfp.bin +amdgpu/raven_ta.bin +amdgpu/yellow_carp_mec.bin +amdgpu/sienna_cichlid_vcn.bin +amdgpu/polaris10_pfp_2.bin +amdgpu/vega20_mec.bin +amdgpu/gc_11_5_1_mec.bin +amdgpu/vega20_ce.bin +amdgpu/vega10_gpu_info.bin +amdgpu/tahiti_rlc.bin +amdgpu/gc_11_0_4_me.bin +amdgpu/beige_goby_dmcub.bin +amdgpu/sienna_cichlid_dmcub.bin +amdgpu/arcturus_mec.bin +amdgpu/tonga_k_smc.bin +amdgpu/kaveri_rlc.bin +amdgpu/gc_11_0_1_me.bin +amdgpu/navi14_ce_wks.bin +amdgpu/polaris11_me.bin +amdgpu/navi12_me.bin +amdgpu/bonaire_smc.bin +amdgpu/vega12_asd.bin +amdgpu/gc_10_3_7_pfp.bin +amdgpu/sdma_4_4_2.bin +amdgpu/renoir_rlc.bin +amdgpu/gc_11_0_1_mec.bin +amdgpu/tonga_sdma1.bin +amdgpu/navi10_me.bin +amdgpu/polaris11_rlc.bin +amdgpu/vcn_3_1_2.bin +amdgpu/vega12_smc.bin +amdgpu/vega12_me.bin +amdgpu/pitcairn_k_smc.bin +amdgpu/fiji_me.bin +amdgpu/tahiti_pfp.bin +amdgpu/sienna_cichlid_ce.bin +amdgpu/pitcairn_pfp.bin +amdgpu/arcturus_sos.bin +amdgpu/renoir_sdma.bin +amdgpu/hawaii_uvd.bin +amdgpu/psp_14_0_0_ta.bin +amdgpu/psp_13_0_5_asd.bin +amdgpu/navi10_mec2.bin +amdgpu/carrizo_rlc.bin +amdgpu/topaz_mc.bin +amdgpu/polaris12_uvd.bin +amdgpu/hainan_smc.bin +amdgpu/tonga_uvd.bin +amdgpu/carrizo_pfp.bin +amdgpu/vegam_sdma1.bin +amdgpu/dimgrey_cavefish_mec2.bin +amdgpu/navi10_ta.bin +amdgpu/vcn_4_0_6.bin +amdgpu/renoir_dmcub.bin +amdgpu/yellow_carp_vcn.bin +amdgpu/fiji_sdma.bin +amdgpu/green_sardine_vcn.bin +amdgpu/vega10_pfp.bin +amdgpu/raven2_asd.bin +amdgpu/mullins_mec.bin +amdgpu/arcturus_asd.bin +amdgpu/vega10_mec2.bin +amdgpu/kabini_vce.bin +amdgpu/polaris11_mec_2.bin +amdgpu/vega12_uvd.bin +amdgpu/polaris12_me_2.bin +amdgpu/carrizo_mec2.bin +amdgpu/gc_11_5_1_pfp.bin +amdgpu/gc_11_0_4_mes1.bin +amdgpu/hawaii_k_smc.bin +amdgpu/kaveri_mec.bin +amdgpu/vega10_asd.bin +amdgpu/sienna_cichlid_sos.bin +amdgpu/topaz_sdma.bin +amdgpu/sienna_cichlid_sdma.bin +amdgpu/polaris11_mc.bin +amdgpu/psp_13_0_7_ta.bin +amdgpu/sdma_6_0_1.bin +amdgpu/topaz_pfp.bin +amdgpu/vegam_rlc.bin +amdgpu/bonaire_me.bin +amdgpu/vega20_asd.bin +amdgpu/vega10_smc.bin +amdgpu/tonga_smc.bin +amdgpu/polaris12_mec_2.bin +amdgpu/raven_asd.bin +amdgpu/gc_11_0_4_mes.bin +amdgpu/navi14_sdma.bin +amdgpu/hawaii_sdma1.bin +amdgpu/tonga_vce.bin +amdgpu/navi12_sdma.bin +amdgpu/gc_11_0_1_mes1.bin +amdgpu/psp_13_0_6_sos.bin +amdgpu/dcn_3_1_5_dmcub.bin +amdgpu/vega12_rlc.bin +amdgpu/aldebaran_smc.bin +amdgpu/pitcairn_rlc.bin +amdgpu/gc_11_0_4_mec.bin +amdgpu/green_sardine_ta.bin +amdgpu/polaris12_rlc.bin +amdgpu/sdma_6_1_1.bin +amdgpu/raven_gpu_info.bin +amdgpu/vangogh_mec.bin +amdgpu/vangogh_vcn.bin +amdgpu/bonaire_vce.bin +amdgpu/carrizo_uvd.bin +amdgpu/topaz_k_smc.bin +amdgpu/umsch_mm_4_0_0.bin +amdgpu/vcn_4_0_3.bin +amdgpu/topaz_rlc.bin +amdgpu/sienna_cichlid_mec.bin +amdgpu/smu_13_0_7.bin +amdgpu/vegam_ce.bin +amdgpu/bonaire_mec.bin +amdgpu/navi12_mec2.bin +amdgpu/dimgrey_cavefish_sos.bin +amdgpu/tonga_mc.bin +amdgpu/polaris10_rlc.bin +amdgpu/picasso_mec.bin +amdgpu/beige_goby_pfp.bin +amdgpu/sdma_5_2_6.bin +amdgpu/navi12_gpu_info.bin +amdgpu/polaris11_mec2.bin +amdgpu/polaris12_ce.bin +amdgpu/gc_11_0_1_rlc.bin +amdgpu/yellow_carp_ce.bin +amdgpu/aldebaran_sdma.bin +amdgpu/stoney_rlc.bin +amdgpu/gc_11_5_0_pfp.bin +amdgpu/polaris12_mec2_2.bin +amdgpu/green_sardine_dmcub.bin +amdgpu/bonaire_sdma.bin +amdgpu/vega10_rlc.bin +amdgpu/yellow_carp_toc.bin +amdgpu/beige_goby_mec.bin +amdgpu/raven_sdma.bin +amdgpu/dimgrey_cavefish_me.bin +amdgpu/navi14_rlc.bin +amdgpu/navi12_sdma1.bin +amdgpu/picasso_ce.bin +amdgpu/polaris12_sdma.bin +amdgpu/raven_rlc.bin +amdgpu/picasso_vcn.bin +amdgpu/sdma_5_2_7.bin +amdgpu/navy_flounder_sdma.bin +amdgpu/gc_11_0_4_pfp.bin +amdgpu/vega20_smc.bin +amdgpu/navy_flounder_mec.bin +amdgpu/dimgrey_cavefish_dmcub.bin +amdgpu/stoney_me.bin +amdgpu/raven2_rlc.bin +amdgpu/kabini_sdma.bin +amdgpu/dcn_3_5_1_dmcub.bin +amdgpu/green_sardine_rlc.bin +amdgpu/psp_13_0_11_ta.bin +amdgpu/picasso_rlc_am4.bin +amdgpu/kaveri_uvd.bin +amdgpu/dimgrey_cavefish_vcn.bin +amdgpu/navi12_dmcu.bin +amdgpu/arcturus_vcn.bin +amdgpu/gc_11_0_0_mes1.bin +amdgpu/beige_goby_smc.bin +amdgpu/verde_uvd.bin +amdgpu/stoney_vce.bin +amdgpu/psp_13_0_7_sos.bin +amdgpu/gc_11_0_4_imu.bin +amdgpu/gc_11_5_0_me.bin +amdgpu/navi12_asd.bin +amdgpu/verde_pfp.bin +amdgpu/vangogh_pfp.bin +amdgpu/navi12_pfp.bin +amdgpu/vega10_sdma1.bin +amdgpu/psp_13_0_4_toc.bin +amdgpu/dimgrey_cavefish_ce.bin +amdgpu/hawaii_smc.bin +amdgpu/mullins_me.bin +amdgpu/mullins_sdma1.bin +amdgpu/dcn_3_1_4_dmcub.bin +amdgpu/polaris10_smc.bin +amdgpu/kaveri_mec2.bin +amdgpu/gc_10_3_6_mec.bin +amdgpu/oland_pfp.bin +amdgpu/polaris11_uvd.bin +amdgpu/vega12_gpu_info.bin +amdgpu/cyan_skillfish2_sdma1.bin +amdgpu/polaris11_k2_smc.bin +amdgpu/vega10_vce.bin +amdgpu/navy_flounder_ta.bin +amdgpu/vpe_6_1_0.bin +amdgpu/gc_11_0_2_imu.bin +amdgpu/polaris10_uvd.bin +amdgpu/vcn_4_0_5.bin +amdgpu/hainan_me.bin +amdgpu/polaris11_pfp_2.bin +amdgpu/polaris12_pfp_2.bin +amdgpu/picasso_asd.bin +amdgpu/vega12_vce.bin +amdgpu/polaris10_mec_2.bin +amdgpu/navi12_rlc.bin +amdgpu/raven2_mec.bin +amdgpu/psp_13_0_10_sos.bin +amdgpu/vega20_sdma.bin +amdgpu/fiji_uvd.bin +amdgpu/gc_10_3_7_mec2.bin +amdgpu/polaris12_mec.bin +amdgpu/verde_mc.bin +amdgpu/polaris12_vce.bin +amdgpu/psp_13_0_8_toc.bin +amdgpu/beige_goby_mec2.bin +amdgpu/kaveri_sdma.bin +amdgpu/gc_10_3_6_pfp.bin +amdgpu/kaveri_vce.bin +amdgpu/vega20_ta.bin +amdgpu/psp_14_0_1_toc.bin +amdgpu/psp_13_0_10_ta.bin +amdgpu/gc_10_3_6_ce.bin +amdgpu/navi10_ce.bin +amdgpu/arcturus_mec2.bin +amdgpu/dimgrey_cavefish_pfp.bin +amdgpu/navi14_me.bin +amdgpu/gc_9_4_3_mec.bin +amdgpu/yellow_carp_asd.bin +amdgpu/dcn_3_5_dmcub.bin +amdgpu/beige_goby_sos.bin +amdgpu/polaris11_ce_2.bin +amdgpu/polaris10_k_smc.bin +amdgpu/navi10_vcn.bin +amdgpu/bonaire_mc.bin +amdgpu/gc_11_5_0_mes_2.bin +amdgpu/pitcairn_uvd.bin +amdgpu/dcn_3_2_1_dmcub.bin +amdgpu/psp_13_0_5_toc.bin +amdgpu/polaris10_k2_smc.bin +amdgpu/gc_11_0_3_mes1.bin +amdgpu/kaveri_sdma1.bin +amdgpu/kabini_uvd.bin +amdgpu/raven2_mec2.bin +amdgpu/arcturus_rlc.bin +amdgpu/gc_11_0_2_me.bin +amdgpu/polaris11_ce.bin +amdgpu/polaris10_mec2_2.bin +amdgpu/raven2_sdma.bin +amdgpu/vpe_6_1_1.bin +amdgpu/raven_vcn.bin +amdgpu/arcturus_gpu_info.bin +amdgpu/raven_ce.bin +amdgpu/polaris12_k_mc.bin +amdgpu/kaveri_me.bin +amdgpu/navy_flounder_smc.bin +amdgpu/tahiti_ce.bin +amdgpu/cyan_skillfish2_pfp.bin +amdgpu/tonga_mec.bin +amdgpu/gc_11_5_1_mes_2.bin +amdgpu/cyan_skillfish2_rlc.bin +amdgpu/gc_11_0_0_rlc_1.bin +amdgpu/renoir_asd.bin +amdgpu/navi14_pfp_wks.bin +amdgpu/vega12_mec.bin +amdgpu/stoney_mec.bin +amdgpu/polaris12_k_smc.bin +amdgpu/arcturus_smc.bin +amdgpu/psp_14_0_1_ta.bin +amdgpu/vega20_me.bin +amdgpu/gc_11_5_0_imu.bin +amdgpu/picasso_me.bin +amdgpu/fiji_mec.bin +amdgpu/polaris10_sdma.bin +amdgpu/navi14_ce.bin +amdgpu/gc_11_0_3_imu.bin +amdgpu/hainan_k_smc.bin +amdgpu/topaz_sdma1.bin +amdgpu/beige_goby_vcn.bin +amdgpu/navi10_smc.bin +amdgpu/gc_11_5_0_mec.bin +amdgpu/raven_mec2.bin +amdgpu/renoir_pfp.bin +amdgpu/polaris12_smc.bin +amdgpu/polaris12_pfp.bin +amdgpu/aldebaran_vcn.bin +amdgpu/navi10_pfp.bin +amdgpu/vega10_sdma.bin +amdgpu/topaz_mec2.bin +amdgpu/picasso_pfp.bin +amdgpu/tonga_sdma.bin +amdgpu/polaris11_pfp.bin +amdgpu/vcn_4_0_0.bin +amdgpu/navy_flounder_rlc.bin +amdgpu/aldebaran_ta.bin +amdgpu/cyan_skillfish2_mec.bin +amdgpu/gc_11_0_2_rlc.bin +amdgpu/cyan_skillfish2_me.bin +amdgpu/navi14_asd.bin +amdgpu/navi14_mec_wks.bin +amdgpu/beige_goby_ta.bin +amdgpu/vega20_sos.bin +amdgpu/hawaii_mec.bin +amdgpu/navy_flounder_pfp.bin +amdgpu/gc_11_0_3_pfp.bin +amdgpu/aldebaran_sjt_mec2.bin +amdgpu/topaz_smc.bin +amdgpu/gc_11_0_1_pfp.bin +amdgpu/stoney_pfp.bin +amdgpu/vega10_me.bin +amdgpu/carrizo_sdma1.bin +amdgpu/vega12_ce.bin +amdgpu/green_sardine_me.bin +amdgpu/psp_14_0_0_toc.bin +amdgpu/vega20_vce.bin +amdgpu/beige_goby_me.bin +amdgpu/raven2_gpu_info.bin +amdgpu/fiji_vce.bin +amdgpu/gc_11_5_1_rlc.bin +amdgpu/vegam_uvd.bin +amdgpu/si58_mc.bin +amdgpu/gc_10_3_7_mec.bin +amdgpu/gc_11_0_0_me.bin +amdgpu/psp_13_0_8_ta.bin +amdgpu/arcturus_ta.bin +amdgpu/hainan_mc.bin +amdgpu/green_sardine_sdma.bin +amdgpu/renoir_ce.bin +amdgpu/bonaire_ce.bin +amdgpu/gc_11_0_4_mes_2.bin +amdgpu/gc_11_0_1_mes_2.bin +amdgpu/oland_ce.bin +amdgpu/polaris12_sdma1.bin +amdgpu/gc_11_5_1_mes1.bin +amdgpu/polaris11_mec2_2.bin +amdgpu/renoir_mec2.bin +amdgpu/arcturus_sdma.bin +amdgpu/vega20_mec2.bin +amdgpu/verde_smc.bin +amdgpu/gc_11_0_4_rlc.bin +amdgpu/polaris11_k_mc.bin +amdgpu/sienna_cichlid_pfp.bin +amdgpu/navi14_mec2.bin +amdgpu/vega12_sos.bin +amdgpu/navi10_mec.bin +amdgpu/hawaii_mc.bin +amdgpu/green_sardine_ce.bin +amdgpu/navi14_gpu_info.bin +amdgpu/tonga_ce.bin +amdgpu/renoir_gpu_info.bin +amdgpu/vegam_sdma.bin +amdgpu/aldebaran_mec2.bin +amdgpu/beige_goby_ce.bin +amdgpu/psp_13_0_5_ta.bin +amdgpu/oland_k_smc.bin +amdgpu/tonga_pfp.bin +amdgpu/yellow_carp_mec2.bin +amdgpu/raven_kicker_rlc.bin +amdgpu/raven_dmcu.bin +amdgpu/renoir_ta.bin +amdgpu/gc_11_0_3_rlc.bin +amdgpu/gc_11_0_2_pfp.bin +amdgpu/hawaii_sdma.bin +amdgpu/tahiti_k_smc.bin +amdgpu/mullins_rlc.bin +amdgpu/navi14_me_wks.bin +amdgpu/dimgrey_cavefish_smc.bin +amdgpu/polaris10_mec2.bin +amdgpu/navi14_sos.bin +amdgpu/sdma_6_0_0.bin +amdgpu/polaris10_pfp.bin +amdgpu/vangogh_sdma.bin +amdgpu/gc_10_3_7_rlc.bin +amdgpu/mullins_uvd.bin +amdgpu/cyan_skillfish2_mec2.bin +amdgpu/navi14_mec2_wks.bin +amdgpu/polaris11_mec.bin +amdgpu/isp_4_1_1.bin +amdgpu/vegam_pfp.bin +amdgpu/fiji_ce.bin +amdgpu/vangogh_dmcub.bin +amdgpu/vega12_sdma.bin +amdgpu/psp_13_0_11_toc.bin +amdgpu/oland_mc.bin +amdgpu/vegam_smc.bin +amdgpu/polaris12_ce_2.bin +amdgpu/picasso_ta.bin +amdgpu/navi12_ce.bin +amdgpu/vcn_4_0_6_1.bin +amdgpu/tahiti_smc.bin +amdgpu/picasso_mec2.bin +amdgpu/gc_11_0_1_mes.bin +amdgpu/hainan_pfp.bin +amdgpu/smu_13_0_10.bin +amdgpu/picasso_sdma.bin +amdgpu/hainan_rlc.bin +amdgpu/mullins_sdma.bin +amdgpu/navi12_ta.bin +amdgpu/psp_13_0_8_asd.bin +amdgpu/green_sardine_mec.bin +amdgpu/psp_13_0_4_ta.bin +amdgpu/raven2_vcn.bin +amdgpu/vangogh_asd.bin +amdgpu/polaris10_me_2.bin +amdgpu/carrizo_mec.bin +amdgpu/picasso_rlc.bin +amdgpu/navy_flounder_vcn.bin +amdgpu/navi14_ta.bin +amdgpu/dimgrey_cavefish_mec.bin +amdgpu/psp_13_0_0_sos.bin +amdgpu/navy_flounder_ce.bin +amdgpu/raven2_ta.bin +amdgpu/fiji_rlc.bin +amdgpu/vangogh_mec2.bin +amdgpu/bonaire_k_smc.bin +amdgpu/vegam_me.bin +amdgpu/fiji_mec2.bin +amdgpu/hawaii_rlc.bin +amdgpu/gc_11_0_3_mes_2.bin +amdgpu/verde_me.bin +amdgpu/hawaii_vce.bin +amdgpu/navy_flounder_mec2.bin +amdgpu/tonga_mec2.bin +amdgpu/navi10_rlc.bin +amdgpu/sdma_6_0_3.bin +amdgpu/carrizo_me.bin +amdgpu/gc_11_0_3_me.bin +amdgpu/kabini_me.bin +amdgpu/gc_11_0_1_imu.bin +amdgpu/aldebaran_mec.bin +amdgpu/polaris10_ce.bin +amdgpu/oland_uvd.bin +amdgpu/tahiti_uvd.bin +amdgpu/polaris11_smc.bin +amdgpu/navi10_sos.bin +amdgpu/raven2_me.bin +amdgpu/vega20_sdma1.bin +amdgpu/banks_k_2_smc.bin +amdgpu/gc_11_5_1_imu.bin +amdgpu/polaris12_me.bin +amdgpu/mullins_ce.bin +amdgpu/gc_11_5_0_rlc.bin +amdgpu/yellow_carp_sdma.bin +amdgpu/navi12_sos.bin +amdgpu/green_sardine_mec2.bin +amdgpu/dimgrey_cavefish_sdma.bin +amdgpu/vega10_acg_smc.bin +amdgpu/kabini_pfp.bin +amdgpu/gc_11_0_0_mes_2.bin +amdtee/773bd96f-b83f-4d52-b12dc529b13d8543.bin +amdtee/amd_pmf_v3.bin +amlogic/aml_w155s2_bt_uart.bin +amlogic/aml_w265s1_bt_uart.bin +amlogic/aml_w265s2_bt_uart.bin +amphion/vpu/vpu_fw_imx8_enc.bin +amphion/vpu/vpu_fw_imx8_dec.bin +ar3k/ramps_0x41020000_40.dfu +ar3k/ramps_0x01020001_26.dfu +ar3k/1020201/RamPatch.txt +ar3k/1020201/PS_ASIC.pst +ar3k/AthrBT_0x41020000.dfu +ar3k/ramps_0x11020100_40.dfu +ar3k/AthrBT_0x11020100.dfu +ar3k/ramps_0x01020201_26.dfu +ar3k/AthrBT_0x01020001.dfu +ar3k/ramps_0x01020200_26.dfu +ar3k/AthrBT_0x31010100.dfu +ar3k/1020201coex/ramps_0x01020201_26_HighPriority.dfu +ar3k/30000/RamPatch.txt +ar3k/30000/ar3kbdaddr.pst +ar3k/30000/PS_ASIC.pst +ar3k/1020200/RamPatch.txt +ar3k/1020200/ar3kbdaddr.pst +ar3k/1020200/PS_ASIC.pst +ar3k/AthrBT_0x01020201.dfu +ar3k/ramps_0x31010000_40.dfu +ar3k/ramps_0x01020201_40.dfu +ar3k/30101coex/RamPatch.txt +ar3k/30101coex/PS_ASIC_aclLowPri.pst +ar3k/30101coex/ar3kbdaddr.pst +ar3k/30101coex/PS_ASIC.pst +ar3k/30101coex/PS_ASIC_aclHighPri.pst +ar3k/AthrBT_0x11020000.dfu +ar3k/30101/RamPatch.txt +ar3k/30101/ar3kbdaddr.pst +ar3k/30101/PS_ASIC.pst +ar3k/ramps_0x01020200_40.dfu +ar3k/AthrBT_0x01020200.dfu +ar3k/ramps_0x11020000_40.dfu +ar3k/AthrBT_0x31010000.dfu +ar3k/ramps_0x31010100_40.dfu +ar5523.bin +ar7010.fw +ar7010_1_1.fw +ar9170-1.fw +ar9170-2.fw +ar9271.fw +arm/mali/arch10.8/mali_csffw.bin +as102_data1_st.hex +as102_data2_st.hex +ath10k/QCA6174/hw3.0/notice_ath10k_firmware-sdio-6.txt +ath10k/QCA6174/hw3.0/board-2.bin +ath10k/QCA6174/hw3.0/notice_ath10k_firmware-4.txt +ath10k/QCA6174/hw3.0/firmware-4.bin +ath10k/QCA6174/hw3.0/firmware-6.bin +ath10k/QCA6174/hw3.0/notice_ath10k_firmware-6.txt +ath10k/QCA6174/hw3.0/board.bin +ath10k/QCA6174/hw3.0/firmware-sdio-6.bin +ath10k/QCA6174/hw2.1/board-2.bin +ath10k/QCA6174/hw2.1/board.bin +ath10k/QCA6174/hw2.1/firmware-5.bin +ath10k/QCA6174/hw2.1/notice_ath10k_firmware-5.txt +ath10k/WCN3990/hw1.0/board-2.bin +ath10k/WCN3990/hw1.0/qrb4210/wlanmdsp.mbn +ath10k/WCN3990/hw1.0/qrb4210/firmware-5.bin +ath10k/WCN3990/hw1.0/notice.txt_wlanmdsp +ath10k/WCN3990/hw1.0/qcm2290/wlanmdsp.mbn +ath10k/WCN3990/hw1.0/qcm2290/firmware-5.bin +ath10k/WCN3990/hw1.0/wlanmdsp.mbn +ath10k/WCN3990/hw1.0/firmware-5.bin +ath10k/QCA988X/hw2.0/notice_ath10k_firmware-4.txt +ath10k/QCA988X/hw2.0/firmware-4.bin +ath10k/QCA988X/hw2.0/board.bin +ath10k/QCA988X/hw2.0/firmware-5.bin +ath10k/QCA988X/hw2.0/notice_ath10k_firmware-5.txt +ath10k/QCA4019/hw1.0/board-2.bin +ath10k/QCA4019/hw1.0/firmware-5.bin +ath10k/QCA4019/hw1.0/notice_ath10k_firmware-5.txt +ath10k/QCA9887/hw1.0/board.bin +ath10k/QCA9887/hw1.0/firmware-5.bin +ath10k/QCA9887/hw1.0/notice_ath10k_firmware-5.txt +ath10k/QCA9888/hw2.0/board-2.bin +ath10k/QCA9888/hw2.0/firmware-5.bin +ath10k/QCA9888/hw2.0/notice_ath10k_firmware-5.txt +ath10k/QCA9377/hw1.0/board-2.bin +ath10k/QCA9377/hw1.0/firmware-sdio-5.bin +ath10k/QCA9377/hw1.0/firmware-6.bin +ath10k/QCA9377/hw1.0/notice_ath10k_firmware-6.txt +ath10k/QCA9377/hw1.0/notice_ath10k_firmware-sdio-5.txt +ath10k/QCA9377/hw1.0/board.bin +ath10k/QCA9377/hw1.0/firmware-5.bin +ath10k/QCA9377/hw1.0/notice_ath10k_firmware-5.txt +ath10k/QCA99X0/hw2.0/board-2.bin +ath10k/QCA99X0/hw2.0/firmware-5.bin +ath10k/QCA99X0/hw2.0/notice_ath10k_firmware-5.txt +ath10k/QCA9984/hw1.0/board-2.bin +ath10k/QCA9984/hw1.0/firmware-5.bin +ath10k/QCA9984/hw1.0/notice_ath10k_firmware-5.txt +ath11k/QCN9074/hw1.0/amss.bin +ath11k/QCN9074/hw1.0/board-2.bin +ath11k/QCN9074/hw1.0/Notice.txt +ath11k/QCN9074/hw1.0/m3.bin +ath11k/IPQ8074/hw2.0/q6_fw.b01 +ath11k/IPQ8074/hw2.0/q6_fw.b03 +ath11k/IPQ8074/hw2.0/q6_fw.b04 +ath11k/IPQ8074/hw2.0/board-2.bin +ath11k/IPQ8074/hw2.0/q6_fw.b08 +ath11k/IPQ8074/hw2.0/m3_fw.b02 +ath11k/IPQ8074/hw2.0/m3_fw.b01 +ath11k/IPQ8074/hw2.0/q6_fw.b02 +ath11k/IPQ8074/hw2.0/m3_fw.mdt +ath11k/IPQ8074/hw2.0/m3_fw.flist +ath11k/IPQ8074/hw2.0/q6_fw.b00 +ath11k/IPQ8074/hw2.0/Notice.txt +ath11k/IPQ8074/hw2.0/q6_fw.b07 +ath11k/IPQ8074/hw2.0/m3_fw.b00 +ath11k/IPQ8074/hw2.0/q6_fw.mdt +ath11k/IPQ8074/hw2.0/q6_fw.b05 +ath11k/IPQ8074/hw2.0/q6_fw.flist +ath11k/WCN6750/hw1.0/board-2.bin +ath11k/WCN6750/hw1.0/wpss.b06 +ath11k/WCN6750/hw1.0/wpss.b02 +ath11k/WCN6750/hw1.0/wpss.b07 +ath11k/WCN6750/hw1.0/wpss.b01 +ath11k/WCN6750/hw1.0/Notice.txt +ath11k/WCN6750/hw1.0/wpss.b04 +ath11k/WCN6750/hw1.0/wpss.b08 +ath11k/WCN6750/hw1.0/wpss.b05 +ath11k/WCN6750/hw1.0/wpss.b03 +ath11k/WCN6750/hw1.0/wpss.mdt +ath11k/WCN6750/hw1.0/wpss.b00 +ath11k/IPQ6018/hw1.0/q6_fw.b01 +ath11k/IPQ6018/hw1.0/q6_fw.b03 +ath11k/IPQ6018/hw1.0/q6_fw.b04 +ath11k/IPQ6018/hw1.0/board-2.bin +ath11k/IPQ6018/hw1.0/q6_fw.b08 +ath11k/IPQ6018/hw1.0/m3_fw.b02 +ath11k/IPQ6018/hw1.0/m3_fw.b01 +ath11k/IPQ6018/hw1.0/q6_fw.b02 +ath11k/IPQ6018/hw1.0/m3_fw.mdt +ath11k/IPQ6018/hw1.0/m3_fw.flist +ath11k/IPQ6018/hw1.0/q6_fw.b00 +ath11k/IPQ6018/hw1.0/Notice.txt +ath11k/IPQ6018/hw1.0/q6_fw.b07 +ath11k/IPQ6018/hw1.0/m3_fw.b00 +ath11k/IPQ6018/hw1.0/q6_fw.mdt +ath11k/IPQ6018/hw1.0/q6_fw.b05 +ath11k/IPQ6018/hw1.0/q6_fw.flist +ath11k/IPQ5018/hw1.0/q6_fw.b01 +ath11k/IPQ5018/hw1.0/q6_fw.b03 +ath11k/IPQ5018/hw1.0/q6_fw.b04 +ath11k/IPQ5018/hw1.0/board-2.bin +ath11k/IPQ5018/hw1.0/q6_fw.b08 +ath11k/IPQ5018/hw1.0/m3_fw.b02 +ath11k/IPQ5018/hw1.0/m3_fw.b01 +ath11k/IPQ5018/hw1.0/q6_fw.b09 +ath11k/IPQ5018/hw1.0/q6_fw.b02 +ath11k/IPQ5018/hw1.0/m3_fw.mdt +ath11k/IPQ5018/hw1.0/q6_fw.b10 +ath11k/IPQ5018/hw1.0/m3_fw.flist +ath11k/IPQ5018/hw1.0/q6_fw.b14 +ath11k/IPQ5018/hw1.0/q6_fw.b00 +ath11k/IPQ5018/hw1.0/Notice.txt +ath11k/IPQ5018/hw1.0/q6_fw.b07 +ath11k/IPQ5018/hw1.0/m3_fw.b00 +ath11k/IPQ5018/hw1.0/q6_fw.b11 +ath11k/IPQ5018/hw1.0/q6_fw.mdt +ath11k/IPQ5018/hw1.0/q6_fw.b05 +ath11k/IPQ5018/hw1.0/q6_fw.flist +ath11k/IPQ5018/hw1.0/q6_fw.b13 +ath11k/WCN6855/hw2.0/amss.bin +ath11k/WCN6855/hw2.0/board-2.bin +ath11k/WCN6855/hw2.0/regdb.bin +ath11k/WCN6855/hw2.0/Notice.txt +ath11k/WCN6855/hw2.0/m3.bin +ath11k/WCN6855/hw2.1/amss.bin +ath11k/WCN6855/hw2.1/board-2.bin +ath11k/WCN6855/hw2.1/regdb.bin +ath11k/WCN6855/hw2.1/m3.bin +ath11k/QCA6390/hw2.0/amss.bin +ath11k/QCA6390/hw2.0/board-2.bin +ath11k/QCA6390/hw2.0/Notice.txt +ath11k/QCA6390/hw2.0/m3.bin +ath12k/WCN7850/hw2.0/amss.bin +ath12k/WCN7850/hw2.0/board-2.bin +ath12k/WCN7850/hw2.0/Notice.txt +ath12k/WCN7850/hw2.0/m3.bin +ath3k-1.fw +ath6k/AR6004/hw1.2/fw-2.bin +ath6k/AR6004/hw1.2/bdata.bin +ath6k/AR6004/hw1.3/bdata.bin +ath6k/AR6004/hw1.3/fw-3.bin +ath6k/AR6003/hw2.1.1/bdata.WB31.bin +ath6k/AR6003/hw2.1.1/fw-2.bin +ath6k/AR6003/hw2.1.1/endpointping.bin +ath6k/AR6003/hw2.1.1/otp.bin +ath6k/AR6003/hw2.1.1/athwlan.bin +ath6k/AR6003/hw2.1.1/bdata.SD31.bin +ath6k/AR6003/hw2.1.1/data.patch.bin +ath6k/AR6003/hw2.1.1/fw-3.bin +ath6k/AR6003/hw2.1.1/bdata.SD32.bin +ath6k/AR6003/hw2.0/bdata.WB31.bin +ath6k/AR6003/hw2.0/otp.bin.z77 +ath6k/AR6003/hw2.0/bdata.SD31.bin +ath6k/AR6003/hw2.0/athwlan.bin.z77 +ath6k/AR6003/hw2.0/data.patch.bin +ath6k/AR6003/hw2.0/bdata.SD32.bin +ath6k/AR6003/hw1.0/bdata.WB31.bin +ath6k/AR6003/hw1.0/otp.bin.z77 +ath6k/AR6003/hw1.0/bdata.SD31.bin +ath6k/AR6003/hw1.0/athwlan.bin.z77 +ath6k/AR6003/hw1.0/data.patch.bin +ath6k/AR6003/hw1.0/bdata.SD32.bin +ath6k/AR6003.1/hw2.1.1/bdata.WB31.bin +ath6k/AR6003.1/hw2.1.1/endpointping.bin +ath6k/AR6003.1/hw2.1.1/otp.bin +ath6k/AR6003.1/hw2.1.1/athwlan.bin +ath6k/AR6003.1/hw2.1.1/bdata.SD31.bin +ath6k/AR6003.1/hw2.1.1/data.patch.bin +ath6k/AR6003.1/hw2.1.1/bdata.SD32.bin +ath6k/AR6002/eeprom.bin +ath6k/AR6002/data.patch.hw2_0.bin +ath6k/AR6002/eeprom.data +ath6k/AR6002/athwlan.bin.z77 +ath9k_htc/htc_7010-1.4.0.fw +ath9k_htc/htc_9271-1.4.0.fw +atmel/wilc1000_ap_fw.bin +atmel/wilc1000_wifi_firmware-1.bin +atmel/wilc1000_fw.bin +atmel/wilc1000_wifi_firmware.bin +atmel/wilc1000_p2p_fw.bin +atusb/atusb-0.2.dfu +atusb/rzusb-0.3.bin +atusb/atusb-0.3.dfu +av7110/bootcode.bin +bnx2/bnx2-mips-06-6.2.3.fw +bnx2/bnx2-rv2p-09-6.0.17.fw +bnx2/bnx2-mips-09-6.2.1b.fw +bnx2/bnx2-rv2p-09ax-6.0.17.fw +bnx2/bnx2-rv2p-06-6.0.15.fw +bnx2x/bnx2x-e1h-7.13.1.0.fw +bnx2x/bnx2x-e1h-7.13.11.0.fw +bnx2x/bnx2x-e1h-7.13.21.0.fw +bnx2x/bnx2x-e1-7.13.15.0.fw +bnx2x/bnx2x-e2-7.13.21.0.fw +bnx2x/bnx2x-e2-7.13.11.0.fw +bnx2x/bnx2x-e1-7.13.1.0.fw +bnx2x/bnx2x-e1h-7.13.15.0.fw +bnx2x/bnx2x-e2-7.13.1.0.fw +bnx2x/bnx2x-e2-7.13.15.0.fw +bnx2x/bnx2x-e1-7.13.11.0.fw +bnx2x/bnx2x-e1-7.13.21.0.fw +brcm/brcmfmac43455-sdio.pine64,pinenote-v1.1.txt +brcm/BCM-0a5c-6410.hcd +brcm/brcmfmac43362-sdio.cubietech,cubietruck.txt +brcm/brcmfmac43430a0-sdio.bin +brcm/brcmfmac43430-sdio.starfive,visionfive-v1.txt +brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-plus.txt +brcm/bcm43xx-0.fw +brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi 4 Model B.txt +brcm/brcmfmac4354-sdio.clm_blob +brcm/brcmfmac43455-sdio.clm_blob +brcm/brcmfmac43340-sdio.Insyde-VESPA2.txt +brcm/brcmfmac43012-sdio.bin +brcm/brcmfmac43012-sdio.clm_blob +brcm/brcmfmac43430-sdio.sinovoip,bananapi-m64.txt +brcm/brcmfmac4350c2-pcie.bin +brcm/brcmfmac43455-sdio.Raspberry Pi Foundation-Raspberry Pi Compute Module 4.txt +brcm/brcmfmac4356-pcie.Intel Corporation-CHERRYVIEW D1 PLATFORM.txt +brcm/brcmfmac43241b5-sdio.bin +brcm/brcmfmac43362-sdio.WC121.txt +brcm/brcmfmac43455-sdio.pine64,pinebook-pro.txt +brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-a1.txt +brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.0.txt +brcm/brcmfmac43430-sdio.AP6212.txt +brcm/brcmfmac43455-sdio.acepc-t8.txt +brcm/bcm43xx_hdr-0.fw +brcm/brcmfmac4329-sdio.bin +brcm/brcmfmac43430-sdio.sinovoip,bpi-m3.txt +brcm/brcmfmac43362-sdio.lemaker,bananapro.txt +brcm/brcmfmac4366c-pcie.bin +brcm/brcmfmac4356-sdio.bin +brcm/brcmfmac43430-sdio.bin +brcm/brcmfmac43602-pcie.ap.bin +brcm/brcmfmac43455-sdio.raspberrypi,3-model-a-plus.txt +brcm/brcmfmac43455-sdio.MINIX-NEO Z83-4.txt +brcm/brcmfmac54591-pcie.bin +brcm/brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt +brcm/brcmfmac43455-sdio.raspberrypi,5-model-b.txt +brcm/brcmfmac4339-sdio.bin +brcm/brcmfmac43430a0-sdio.jumper-ezpad-mini3.txt +brcm/brcmfmac43570-pcie.clm_blob +brcm/brcmfmac4371-pcie.bin +brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt +brcm/brcmfmac4356-pcie.Xiaomi Inc-Mipad2.txt +brcm/brcmfmac43340-sdio.ASUSTeK COMPUTER INC.-TF103CE.txt +brcm/brcmfmac43430-sdio.raspberrypi,model-zero-2-w.txt +brcm/brcmfmac43455-sdio.pine64,rockpro64-v2.1.txt +brcm/brcmfmac4334-sdio.bin +brcm/brcmfmac4356-pcie.bin +brcm/brcmfmac43430-sdio.ilife-S806.txt +brcm/brcmfmac43455-sdio.pine64,quartz64-a.txt +brcm/brcmfmac43241b0-sdio.bin +brcm/brcmfmac43340-sdio.bin +brcm/brcmfmac43340-sdio.meegopad-t08.txt +brcm/brcmfmac43430-sdio.clm_blob +brcm/brcmfmac43602-pcie.bin +brcm/brcmfmac43241b4-sdio.bin +brcm/brcmfmac43430-sdio.MUR1DX.txt +brcm/brcmfmac43455-sdio.pine64,pinephone-pro.txt +brcm/brcmfmac43340-sdio.pov-tab-p1006w-data.txt +brcm/brcmfmac4356-sdio.vamrs,rock960.txt +brcm/brcmfmac43241b4-sdio.Advantech-MICA-071.txt +brcm/brcmfmac43455-sdio.pine64,soquartz-blade.txt +brcm/brcmfmac4373.bin +brcm/brcmfmac4356-sdio.clm_blob +brcm/brcmfmac4330-sdio.Prowise-PT301.txt +brcm/brcmfmac4356-sdio.AP6356S.txt +brcm/brcmfmac4356-sdio.khadas,vim2.txt +brcm/brcmfmac43455-sdio.pine64,pinenote-v1.2.txt +brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-ultra.txt +brcm/brcmfmac4330-sdio.bin +brcm/brcmfmac4356-pcie.gpd-win-pocket.txt +brcm/brcmfmac43430-sdio.Hampoo-D2D3_Vi8A1.txt +brcm/brcmfmac43455-sdio.pine64,soquartz-model-a.txt +brcm/brcmfmac43570-pcie.bin +brcm/brcmfmac43362-sdio.kobo,aura.txt +brcm/brcmfmac43362-sdio.ASUSTeK COMPUTER INC.-ME176C.txt +brcm/brcmfmac43242a.bin +brcm/brcmfmac4350-pcie.bin +brcm/brcmfmac4354-sdio.bin +brcm/brcmfmac43430-sdio.sinovoip,bpi-m2-zero.txt +brcm/brcmfmac43236b.bin +brcm/brcmfmac43362-sdio.kobo,tolino-shine2hd.txt +brcm/bcm4329-fullmac-4.bin +brcm/brcmfmac43362-sdio.bin +brcm/brcmfmac43455-sdio.pine64,soquartz-cm4io.txt +brcm/brcmfmac4373-sdio.clm_blob +brcm/brcmfmac43143-sdio.bin +brcm/brcmfmac4366b-pcie.bin +brcm/brcmfmac43569.bin +brcm/brcmfmac43143.bin +brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt +brcm/brcmfmac4356-sdio.firefly,firefly-rk3399.txt +brcm/brcmfmac4335-sdio.bin +brcm/brcmfmac43455-sdio.beagle,am5729-beagleboneai.txt +brcm/brcmfmac4358-pcie.bin +brcm/brcmfmac43430-sdio.beagle,beaglev-starlight-jh7100-r0.txt +brcm/brcmfmac43455-sdio.pine64,quartz64-b.txt +brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt +brcm/brcmfmac43455-sdio.bin +brcm/brcmfmac43241b4-sdio.Intel Corp.-VALLEYVIEW C0 PLATFORM.txt +brcm/brcmfmac4356-pcie.clm_blob +brcm/brcmfmac43430a0-sdio.ONDA-V80 PLUS.txt +brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.txt +brcm/brcmfmac43430a0-sdio.ilife-S806.txt +brcm/brcmfmac43455-sdio.AW-CM256SM.txt +brcm/BCM-0bb4-0306.hcd +brcm/brcmfmac43340-sdio.predia-basic.txt +brcm/brcmfmac43430-sdio.friendlyarm,nanopi-r1.txt +brcm/brcmfmac54591-pcie.clm_blob +brcm/brcmfmac4373-sdio.bin +cadence/mhdp8546.bin +carl9170-1.fw +cavium/cnn55xx_ae.fw +cavium/cnn55xx_se.fw +cbfw-3.2.5.1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b47.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431493.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8ad8.wmfw +cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp1.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c53.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c898f.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431b93.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ed3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8975.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b44.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b74.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8ca7.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c49.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8994.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b63-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431caf.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f12.wmfw +cirrus/cs35l41-dsp1-spk-prot-104318d3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a30-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b70.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b45.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431473.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa2319.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cbf.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdd.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a83.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c33.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38fa.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431df3-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-103c8995.bin +cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431da2.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431493-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c3-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8972.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c896e-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3866-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b63.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c50.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a6e.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b43.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c70.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c896e-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89e7.wmfw +cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c898e.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc2.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431473-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b63-l1.bin +cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a50.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-10431e02.wmfw +cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8973.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280beb.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8bdf.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c17.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-104316d3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a63.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c47.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be6.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c6-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b72.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2b-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c26.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431ee2.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be0.wmfw +cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid1.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a40.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l1.bin +cirrus/cs35l41-dsp1-spk-prot-10431e12.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bin +cirrus/cs35l56/CS35L56_Rev3.11.11.wmfw +cirrus/cs35l56/CS35L56_Rev3.11.16.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l1.bin +cirrus/cs35l41-dsp1-spk-prot-10431f62.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cdf.wmfw +cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431ee2-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a20-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2d.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431df3-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be7-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cdd-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-104316a3.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c72.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp2.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3878-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b3a.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431483-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bde.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2318-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431683-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431463-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c33-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c46.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c51.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc1-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c43.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8994.bin +cirrus/cs35l41-dsp1-spk-prot-10431533-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc4.wmfw +cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b8f.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3877.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b77.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104312af-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280beb-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c52.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bincfg +cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-10431f1f-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a28-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b5.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b4.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431503-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a31.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431683.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be9.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8ad8.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c49.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431663.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3865.wmfw +cirrus/cs35l41-dsp1-spk-prot-10280cc2-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b28.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3847.wmfw +cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3865-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3878-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c66.wmfw +cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431caf-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b72.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3866-r0.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c53-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c72.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8971.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b44.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b74.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431ee2-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8981-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c68.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314d3.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa22f3-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f3.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8cf5-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8991.bin +cirrus/cs35l41-dsp1-spk-prot-103c8991.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431483-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2316-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be1-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2317-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-r1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2b.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431663-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc1.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c89c3-r1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3866.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8cde.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c47.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8be8-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431463.wmfw +cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c3-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c66-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8b8f-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10431503-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3865-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431df3-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cf5-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c48.bin +cirrus/cs35l41-dsp1-spk-prot-10431483.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c7.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c9f.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ccf.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b63-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2317.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38b7-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-103c89e7-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8ca4.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b92.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280cbd-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-10280beb-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c6a.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a6e-l1.bin +cirrus/cs35l41-dsp1-spk-prot-10280b28-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431863-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b8f-l1.bin +cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2318.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431573.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b63-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bde-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280c4d-spkid1-l1.bin +cirrus/cs35l41-dsp1-spk-prot-104312af.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c898f.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431df3-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2316.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa22f3-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431d1f.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431663-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a30-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431503.wmfw +cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cbd.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be1.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b42.bin +cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4f-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38ab.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a8f.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431f62-spkid1-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10431df3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431533.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be2.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8a2a.wmfw +cirrus/cs35l41-dsp1-spk-prot-10280cc3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431b93-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104318d3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-l1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8975-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c6-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8a30.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3878.wmfw +cirrus/cs35l41-dsp1-spk-prot-10280b27.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-l1.bin +cirrus/cs35l41-dsp1-spk-prot.bin +cirrus/cs35l41-dsp1-spk-prot-10431c43-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a30.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431f1f.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c89c6.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8ca4.bin +cirrus/cs35l41-dsp1-spk-prot-10431433.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c26.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c70.bin +cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c3-l1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c8995.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c48.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b43.bin +cirrus/cs35l41-dsp1-spk-prot-10431ccf-spkid0-r0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be2-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cbe.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38a9.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8981-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c51-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38a9-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386f.wmfw +cirrus/cs35l41-dsp1-spk-prot-10280cbe-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3855-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b42.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2e.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431863-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104314e3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386f-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be6-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386f-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c15.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid0-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a60-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f1.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c8.wmfw +cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c15-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104314d3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be9-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp1.bin +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-10431a83-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a20.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2c.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c89e7-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa231a-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b77.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3855.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8a28.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2d-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a29.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431ed3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be0-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c46.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431473-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a29-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104316d3-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431573-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa38c7-spkid0-r1.bin +cirrus/cs35l41-dsp1-spk-prot-10431463-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdf-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c6b-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8975-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a8f-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb3-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10280cc3-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3847-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431683-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cde-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b4-spkid1-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b92.wmfw +cirrus/cs35l41/v6.39.0/halo_cspl_RAM_revB2_29.41.0.wmfw +cirrus/cs35l41/v6.63.0/halo_cspl_RAM_revB2_29.65.0.wmfw +cirrus/cs35l41/v6.68.0/halo_cspl_RAM_revB2_29.70.0.wmfw +cirrus/cs35l41/v6.80.0/halo_cspl_RAM_revB2_29.82.0.wmfw +cirrus/cs35l41/v6.83.0/halo_cspl_RAM_revB2_29.85.0.wmfw +cirrus/cs35l41/v6.78.0/halo_cspl_RAM_revB2_29.80.0.wmfw +cirrus/cs35l41/v6.61.1/halo_cspl_RAM_revB2_29.63.1.wmfw +cirrus/cs35l41/bincfgs/cs35l41-dsp1-19_5dB.bincfg +cirrus/cs35l41/bincfgs/cs35l41-dsp1-14_5dB.bincfg +cirrus/cs35l41/bincfgs/cs35l41-dsp1-16_5dB.bincfg +cirrus/cs35l41/v6.47.0/halo_cspl_RAM_revB2_29.49.0.wmfw +cirrus/cs35l41/v6.56.0/halo_cspl_RAM_revB2_29.58.0.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8be5.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431da2-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431493-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104316f3.wmfw +cirrus/cs35l41-dsp1-spk-prot-104317f3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid1.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-17aa386e.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp4.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f2.wmfw +cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid1.bin +cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38ab-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b46.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be5-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38fa-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431d1f-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8974.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104312af-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f2-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c17-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be7.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa3877-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa231a-r0.bin +cirrus/cs35l41-dsp1-spk-prot-104316a3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bdd-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c71.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38f9-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b45.bin +cirrus/cs35l56-b0-dsp1-misc-10431c63-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c68-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid0-l0.bin +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b47.wmfw +cirrus/cs35l56-b0-dsp1-misc-103c8c52-amp2.bin +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid0-amp3.bin +cirrus/cs35l41-dsp1-spk-prot-10431533-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bincfg +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-10280cbf-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a6e-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8be8.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid1-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa2319-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280b27-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c71.bin +cirrus/cs35l56-b0-dsp1-misc-10280c63-spkid0.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa22f1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431a63-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8c16.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c67-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-17aa2318-r0.bin +cirrus/cs35l41-dsp1-spk-prot.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10280cc4-spkid0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8cf5.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa2319-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c89c3.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431f12-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431c03-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b7.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa38c8-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431a60.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa386e-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c898e.wmfw +cirrus/cs35l56-b0-dsp1-misc-10280c62-spkid1-amp4.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a40-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b6.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2c-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f2-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cef-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8981-r1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8981-l1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8a2e-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431573-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b5-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38f9.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a31-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa3877-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cef.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c4f.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8971.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8a2a-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8974.wmfw +cirrus/cs35l41-dsp1-spk-prot-17aa231a.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431c9f-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-10431433-spkid1-r0.bincfg +cirrus/cs35l56-b0-dsp1-misc-10431e63-spkid1.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b70.bin +cirrus/cs35l56-b0-dsp1-misc-10431b13-spkid0-amp2.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid1-r0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8bb4-spkid1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-103c8cdd.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c6a-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c16-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431e02-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c896e.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b46.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c50-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8973.bin +cirrus/cs35l41-dsp1-spk-prot-103c8972.wmfw +cirrus/cs35l41-dsp1-spk-prot-104314e3.wmfw +cirrus/cs35l56-b0-dsp1-misc-10431e83-spkid1-amp1.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4d-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10433a50-spkid0-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa22f1-l0.bincfg +cirrus/cs35l41-dsp1-spk-prot-10431863.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8992.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8c67.wmfw +cirrus/cs35l41-dsp1-spk-prot-10431e12-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431cdf-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8c4e-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-10431f1f-r0.bin +cirrus/cs35l41-dsp1-spk-prot-17aa38b6-spkid1-l0.bin +cirrus/cs35l41-dsp1-spk-prot-104316f3-spkid1-r0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8981.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8ca7.wmfw +cirrus/cs35l41-dsp1-spk-prot-103c8b3a-spkid0-l0.bin +cirrus/cs35l41-dsp1-spk-prot-103c8992.bin +cis/SW_555_SER.cis +cis/3CCFEM556.cis +cis/NE2K.cis +cis/SW_8xx_SER.cis +cis/MT5634ZLX.cis +cis/PE-200.cis +cis/RS-COM-2P.cis +cis/COMpad2.cis +cis/tamarack.cis +cis/LA-PCM.cis +cis/SW_7xx_SER.cis +cis/PCMLM28.cis +cis/COMpad4.cis +cis/3CXEM556.cis +cis/DP83903.cis +cis/PE520.cis +cmmb_vega_12mhz.inp +cmmb_venice_12mhz.inp +cnm/wave521c_k3_codec_fw.bin +cs42l43.bin +ct2fw-3.2.5.1.bin +ctefx.bin +ctfw-3.2.5.1.bin +ctspeq.bin +cxgb3/ael2005_twx_edc.bin +cxgb3/t3fw-7.12.0.bin +cxgb3/t3b_psram-1.1.0.bin +cxgb3/t3fw-7.10.0.bin +cxgb3/t3c_psram-1.1.0.bin +cxgb3/t3fw-7.0.0.bin +cxgb3/t3fw-7.1.0.bin +cxgb3/t3fw-7.4.0.bin +cxgb3/ael2020_twx_edc.bin +cxgb3/ael2005_opt_edc.bin +cxgb4/t6fw-1.27.5.0.bin +cxgb4/t5fw-1.15.37.0.bin +cxgb4/bcm8483.bin +cxgb4/aq1202_fw.cld +cxgb4/t5fw.bin +cxgb4/t4fw-1.15.37.0.bin +cxgb4/t4fw.bin +cxgb4/t6fw.bin +cxgb4/t6-config.txt +cxgb4/t5-config.txt +cxgb4/configs/t5-config-default.txt +cxgb4/configs/t4-config-default.txt +cxgb4/configs/t5-config-hashfilter.txt +cxgb4/configs/t6-config-hashfilter.txt +cxgb4/configs/t6-config-default.txt +cxgb4/t4fw-1.27.5.0.bin +cxgb4/t4fw-1.14.4.0.bin +cxgb4/t5fw-1.27.5.0.bin +cxgb4/t5fw-1.14.4.0.bin +cxgb4/t4-config.txt +cypress/cyfmac43455-sdio.bin +cypress/cyfmac4356-sdio.clm_blob +cypress/cyfmac4373-sdio.bin +cypress/cyfmac4354-sdio.bin +cypress/cyfmac4354-sdio.clm_blob +cypress/cyfmac43012-sdio.bin +cypress/cyfmac43570-pcie.bin +cypress/cyfmac43012-sdio.clm_blob +cypress/cyfmac43455-sdio.clm_blob +cypress/cyfmac4356-sdio.bin +cypress/cyfmac54591-pcie.clm_blob +cypress/cyfmac4356-pcie.bin +cypress/cyfmac43340-sdio.bin +cypress/cyfmac4356-pcie.clm_blob +cypress/cyfmac43362-sdio.bin +cypress/cyfmac43430-sdio.bin +cypress/cyfmac54591-pcie.bin +cypress/cyfmac4373-sdio.clm_blob +cypress/cyfmac4339-sdio.bin +cypress/cyfmac43570-pcie.clm_blob +cypress/cyfmac43430-sdio.clm_blob +dabusb/firmware.fw +dabusb/bitstream.bin +dpaa2/mc/mc_10.10.0_lx2160a.itb +dpaa2/mc/mc_10.14.3_lx2160a.itb +dpaa2/mc/mc_10.10.0_ls2088a.itb +dpaa2/mc/mc_10.16.2_lx2160a.itb +dpaa2/mc/mc_10.16.2_ls1088a.itb +dpaa2/mc/mc_10.14.3_ls1088a.itb +dpaa2/mc/mc_10.28.1_lx2160a.itb +dpaa2/mc/mc_10.14.3_ls2088a.itb +dpaa2/mc/mc_10.28.1_ls2088a.itb +dpaa2/mc/mc_10.18.0_lx2160a.itb +dpaa2/mc/mc_10.28.1_ls1088a.itb +dpaa2/mc/mc_10.18.0_ls2088a.itb +dpaa2/mc/mc_10.16.2_ls2088a.itb +dpaa2/mc/mc_10.18.0_ls1088a.itb +dpaa2/mc/mc_10.10.0_ls1088a.itb +dsp56k/bootstrap.bin +dvb-fe-xc4000-1.4.1.fw +dvb-fe-xc5000-1.6.114.fw +dvb-fe-xc5000c-4.1.30.7.fw +dvb-usb-dib0700-1.20.fw +dvb-usb-it9135-01.fw +dvb-usb-it9135-02.fw +dvb-usb-terratec-h5-drxk.fw +dvb_nova_12mhz.inp +dvb_nova_12mhz_b0.inp +e100/d101s_ucode.bin +e100/d101m_ucode.bin +e100/d102e_ucode.bin +emi26/firmware.fw +emi26/bitstream.fw +emi26/loader.fw +ene-ub6250/ms_init.bin +ene-ub6250/sd_init1.bin +ene-ub6250/msp_rdwr.bin +ene-ub6250/ms_rdwr.bin +ene-ub6250/sd_rdwr.bin +ene-ub6250/sd_init2.bin +f2255usb.bin +go7007/wis-startrek.fw +go7007/go7007fw.bin +go7007/go7007tv.bin +go7007/px-tv402u.fw +go7007/lr192.fw +go7007/s2250-2.fw +go7007/s2250-1.fw +go7007/px-m402u.fw +hfi1_dc8051.fw +hfi1_fabric.fw +hfi1_pcie.fw +hfi1_sbus.fw +htc_7010.fw +htc_9271.fw +i915/dg2_guc_70.1.2.bin +i915/cml_guc_62.0.0.bin +i915/glk_huc_ver03_01_2893.bin +i915/icl_guc_49.0.1.bin +i915/tgl_huc_7.9.3.bin +i915/cml_guc_33.0.0.bin +i915/adlp_guc_69.0.3.bin +i915/skl_guc_32.0.3.bin +i915/icl_huc_9.0.0.bin +i915/cml_guc_49.0.1.bin +i915/tgl_huc_7.5.0.bin +i915/ehl_huc_9.0.0.bin +i915/kbl_huc_ver02_00_1810.bin +i915/bxt_guc_ver8_7.bin +i915/glk_guc_49.0.1.bin +i915/kbl_guc_ver9_39.bin +i915/glk_guc_32.0.3.bin +i915/cml_guc_69.0.3.bin +i915/kbl_guc_70.1.1.bin +i915/dg2_dmc_ver2_06.bin +i915/bmg_dmc.bin +i915/glk_guc_62.0.0.bin +i915/glk_huc_4.0.0.bin +i915/adlp_guc_70.bin +i915/icl_guc_69.0.3.bin +i915/kbl_dmc_ver1.bin +i915/mtl_dmc_ver2_10.bin +i915/skl_guc_ver6_1.bin +i915/skl_guc_ver1.bin +i915/dg1_guc_70.bin +i915/dg1_guc_69.0.3.bin +i915/tgl_dmc_ver2_06.bin +i915/skl_guc_49.0.1.bin +i915/skl_guc_69.0.3.bin +i915/dg2_dmc_ver2_08.bin +i915/dg2_dmc_ver2_07.bin +i915/bxt_guc_32.0.3.bin +i915/skl_guc_ver9_33.bin +i915/adlp_dmc_ver2_09.bin +i915/glk_guc_69.0.3.bin +i915/adlp_dmc_ver2_14.bin +i915/skl_dmc_ver1_26.bin +i915/glk_guc_33.0.0.bin +i915/dg1_huc_7.9.3.bin +i915/ehl_guc_70.1.1.bin +i915/bxt_dmc_ver1_07.bin +i915/tgl_dmc_ver2_04.bin +i915/bxt_guc_ver9_29.bin +i915/skl_dmc_ver1_23.bin +i915/adlp_dmc_ver2_10.bin +i915/bxt_guc_70.1.1.bin +i915/skl_guc_ver6.bin +i915/adls_dmc_ver2_01.bin +i915/tgl_huc_7.0.12.bin +i915/ehl_guc_62.0.0.bin +i915/glk_guc_70.1.1.bin +i915/dg2_guc_70.4.1.bin +i915/bxt_dmc_ver1.bin +i915/kbl_dmc_ver1_04.bin +i915/glk_dmc_ver1_04.bin +i915/xe2lpd_dmc.bin +i915/kbl_guc_ver9_14.bin +i915/icl_huc_ver8_4_3238.bin +i915/cnl_dmc_ver1_07.bin +i915/bxt_huc_ver01_07_1398.bin +i915/kbl_guc_62.0.0.bin +i915/icl_guc_70.1.1.bin +i915/icl_dmc_ver1_07.bin +i915/icl_guc_32.0.3.bin +i915/dg1_huc_7.7.1.bin +i915/icl_guc_33.0.0.bin +i915/dg1_guc_70.1.1.bin +i915/dg2_huc_gsc.bin +i915/mtl_gsc_1.bin +i915/bxt_guc_49.0.1.bin +i915/dg1_guc_49.0.1.bin +i915/skl_huc_2.0.0.bin +i915/ehl_guc_33.0.4.bin +i915/bxt_huc_2.0.0.bin +i915/bxt_huc_ver01_8_2893.bin +i915/adlp_dmc.bin +i915/kbl_guc_32.0.3.bin +i915/dg1_dmc_ver2_02.bin +i915/ehl_guc_49.0.1.bin +i915/skl_dmc_ver1.bin +i915/adlp_guc_62.0.3.bin +i915/tgl_guc_69.0.3.bin +i915/cml_huc_4.0.0.bin +i915/bxt_guc_62.0.0.bin +i915/adlp_dmc_ver2_16.bin +i915/dg2_guc_70.bin +i915/skl_dmc_ver1_27.bin +i915/tgl_dmc_ver2_12.bin +i915/rkl_dmc_ver2_03.bin +i915/skl_guc_62.0.0.bin +i915/icl_dmc_ver1_09.bin +i915/bxt_guc_33.0.0.bin +i915/skl_guc_70.1.1.bin +i915/kbl_huc_4.0.0.bin +i915/tgl_guc_70.bin +i915/skl_guc_33.0.0.bin +i915/mtl_guc_70.bin +i915/skl_huc_ver01_07_1398.bin +i915/kbl_guc_33.0.0.bin +i915/cnl_dmc_ver1_06.bin +i915/rkl_dmc_ver2_02.bin +i915/tgl_guc_49.0.1.bin +i915/tgl_guc_35.2.0.bin +i915/dg1_guc_62.0.0.bin +i915/cml_guc_70.1.1.bin +i915/kbl_dmc_ver1_01.bin +i915/kbl_guc_69.0.3.bin +i915/tgl_dmc_ver2_08.bin +i915/tgl_huc_7.0.3.bin +i915/dg1_huc.bin +i915/icl_guc_62.0.0.bin +i915/tgl_guc_62.0.0.bin +i915/skl_guc_ver4.bin +i915/tgl_guc_70.1.1.bin +i915/bxt_guc_69.0.3.bin +i915/mtl_huc_gsc.bin +i915/tgl_huc.bin +i915/mtl_dmc.bin +i915/ehl_guc_69.0.3.bin +i915/adlp_dmc_ver2_12.bin +i915/kbl_guc_49.0.1.bin +i915/adlp_guc_70.1.1.bin +imx/sdma/sdma-imx6q.bin +imx/sdma/sdma-imx7d.bin +inside-secure/eip197_minifw/ipue.bin +inside-secure/eip197_minifw/ifpp.bin +intel/ibt-0180-0041.sfi +intel/ibt-0180-4150.ddc +intel/dsp_fw_kbl.bin +intel/ibt-12-16.ddc +intel/ibt-19-0-4.sfi +intel/fw_sst_22a8.bin +intel/dsp_fw_kbl_v1037.bin +intel/dsp_fw_kbl_v701.bin +intel/ibt-0040-0041.ddc +intel/ibt-19-0-4.ddc +intel/dsp_fw_glk_v2880.bin +intel/fw_sst_0f28_ssp0.bin +intel/ibt-19-240-1.sfi +intel/ibt-1040-1020.ddc +intel/ibt-hw-37.8.10-fw-22.50.19.14.f.bseq +intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq +intel/ibt-19-16-4.sfi +intel/dsp_fw_release_v969.bin +intel/ibt-0291-0291.sfi +intel/ibt-19-0-1.ddc +intel/ibt-0291-0291.ddc +intel/ibt-11-5.ddc +intel/fw_sst_0f28.bin-48kHz_i2s_master +intel/dsp_fw_glk_v2768.bin +intel/ibt-0040-0041.sfi +intel/ibt-1040-1020.sfi +intel/ibt-0040-1020.sfi +intel/ibt-0040-2120.ddc +intel/ish/ish_lnlm.bin +intel/ibt-18-2.ddc +intel/ibt-18-2.sfi +intel/ibt-20-0-3.ddc +intel/dsp_fw_bxtn_v3366.bin +intel/ibt-hw-37.8.10-fw-1.10.3.11.e.bseq +intel/dsp_fw_release_v3402.bin +intel/ibt-19-16-4.ddc +intel/ibt-1040-2120.ddc +intel/vsc/ivsc_skucfg_ovti9738_0_1.bin +intel/vsc/ivsc_skucfg_ovti02c1_0_1.bin +intel/vsc/ivsc_skucfg_ovti2740_0_1.bin +intel/vsc/ivsc_skucfg_int3537_0_1.bin +intel/vsc/ivsc_pkg_himx2170_0.bin +intel/vsc/ivsc_skucfg_himx2170_0_1.bin +intel/vsc/ivsc_skucfg_ovti01a0_0_1.bin +intel/vsc/ivsc_skucfg_himx11b1_0_1.bin +intel/vsc/ivsc_skucfg_ovti9734_0_1.bin +intel/vsc/ivsc_skucfg_ovti01af_0_1.bin +intel/vsc/ivsc_fw.bin +intel/vsc/ivsc_skucfg_ovti01as_0_1.bin +intel/vsc/ivsc_skucfg_ovti02e1_0_1.bin +intel/vsc/ivsc_pkg_ovti01af_0.bin +intel/vsc/ivsc_skucfg_himx2172_0_1.bin +intel/vsc/ivsc_pkg_ovti9734_0.bin +intel/vsc/ivsc_pkg_himx11b1_0.bin +intel/vsc/ivsc_pkg_ovti02e1_0.bin +intel/vsc/ivsc_pkg_ovti01a0_0.bin +intel/vsc/ivsc_pkg_ovti01as_0.bin +intel/vsc/ivsc_pkg_ovti9738_0.bin +intel/vsc/ivsc_pkg_himx2172_0.bin +intel/vsc/ivsc_pkg_ovti2740_0.bin +intel/vsc/ivsc_skucfg_ovti5678_0_1.bin +intel/vsc/ivsc_pkg_int3537_0.bin +intel/vsc/ivsc_skucfg_hi556_0_1.bin +intel/vsc/ivsc_pkg_ovti5678_0.bin +intel/vsc/ivsc_pkg_hi556_0.bin +intel/vsc/ivsc_pkg_ovti02c1_0.bin +intel/ibt-18-16-1.sfi +intel/ibt-20-0-3.sfi +intel/ibt-0040-1050.ddc +intel/ibt-hw-37.7.bseq +intel/ipu/ipu6_fw.bin +intel/ipu/ipu6ep_fw.bin +intel/ipu/ipu6epadln_fw.bin +intel/ipu/ipu6se_fw.bin +intel/ipu/ipu6epmtl_fw.bin +intel/ipu/shisp_2400b0_v21.bin +intel/ipu/irci_irci_ecr-master_20161208_0213_20170112_1500.bin +intel/ipu/shisp_2401a0_v21.bin +intel/ibt-18-16-1.ddc +intel/ibt-1040-2120.sfi +intel/ibt-1040-0041.ddc +intel/ibt-0041-0041.ddc +intel/ibt-19-240-1.ddc +intel/ibt-0040-2120.sfi +intel/ibt-18-1.ddc +intel/ibt-0180-1050.ddc +intel/ibt-20-1-3.sfi +intel/dsp_fw_cnl.bin +intel/ibt-19-0-0.ddc +intel/ibt-19-32-1.sfi +intel/avs/skl/dsp_basefw.bin +intel/avs/skl/dsp_mod_7CAD0808-AB10-CD23-EF45-12AB34CD56EF.bin +intel/avs/cnl/dsp_basefw.bin +intel/avs/apl/dsp_basefw.bin +intel/ibt-0041-0041.sfi +intel/ibt-19-240-4.ddc +intel/ibt-0180-4150.sfi +intel/ibt-20-1-4.sfi +intel/ibt-17-16-1.ddc +intel/ibt-1040-1050.sfi +intel/ibt-17-1.sfi +intel/ibt-17-2.ddc +intel/dsp_fw_kbl_v2630.bin +intel/ibt-17-0-1.ddc +intel/ibt-18-1.sfi +intel/ibt-19-0-3.sfi +intel/dsp_fw_glk_v3366.bin +intel/ibt-18-0-1.sfi +intel/ibt-hw-37.7.10-fw-1.0.2.3.d.bseq +intel/ibt-17-2.sfi +intel/ibt-18-0-1.ddc +intel/dsp_fw_release.bin +intel/ibt-0180-0041.ddc +intel/ibt-hw-37.7.10-fw-1.0.1.2d.d.bseq +intel/ibt-19-32-4.sfi +intel/fw_sst_0f28.bin +intel/ibt-hw-37.7.10-fw-1.80.1.2d.d.bseq +intel/ibt-20-1-3.ddc +intel/ibt-19-240-4.sfi +intel/ibt-0180-1050.sfi +intel/dsp_fw_kbl_v3420.bin +intel/ibt-20-1-4.ddc +intel/ibt-19-32-4.ddc +intel/ibt-19-32-0.sfi +intel/dsp_fw_cnl_v1191.bin +intel/ibt-19-32-0.ddc +intel/dsp_fw_kbl_v2042.bin +intel/ibt-0040-4150.ddc +intel/ibt-0040-1020.ddc +intel/catpt/bdw/dsp_basefw.bin +intel/ibt-17-1.ddc +intel/dsp_fw_cnl_v1858.bin +intel/dsp_fw_kbl_v3402.bin +intel/dsp_fw_kbl_v3266.bin +intel/ibt-1040-0041.sfi +intel/ibt-0040-4150.sfi +intel/ibt-12-16.sfi +intel/dsp_fw_bxtn.bin +intel/ipu3-fw.bin +intel/dsp_fw_glk.bin +intel/ibt-1040-1050.ddc +intel/ibt-19-0-0.sfi +intel/ice/ddp-lag/ice_lag-1.3.1.0.pkg +intel/ice/ddp-comms/ice_comms-1.3.45.0.pkg +intel/ice/ddp-wireless_edge/ice_wireless_edge-1.3.13.0.pkg +intel/ice/ddp/ice-1.3.36.0.pkg +intel/ice/ddp/ice.pkg +intel/ibt-1040-4150.sfi +intel/ibt-0040-1050.sfi +intel/ibt-17-16-1.sfi +intel/ibt-hw-37.7.10-fw-1.80.2.3.d.bseq +intel/dsp_fw_glk_v1814.bin +intel/ibt-11-5.sfi +intel/irci_irci_ecr-master_20161208_0213_20170112_1500.bin +intel/IntcSST2.bin +intel/ibt-19-32-1.ddc +intel/dsp_fw_bxtn_v2219.bin +intel/ibt-19-0-3.ddc +intel/ibt-19-0-1.sfi +intel/ibt-1040-4150.ddc +intel/ibt-17-0-1.sfi +intel/ibt-hw-37.8.bseq +isci/isci_firmware.bin +isdbt_nova_12mhz.inp +isdbt_nova_12mhz_b0.inp +isdbt_rio.inp +iwlwifi-100-5.ucode +iwlwifi-1000-5.ucode +iwlwifi-105-6.ucode +iwlwifi-135-6.ucode +iwlwifi-2000-6.ucode +iwlwifi-2030-6.ucode +iwlwifi-3160-17.ucode +iwlwifi-3168-29.ucode +iwlwifi-3945-2.ucode +iwlwifi-4965-2.ucode +iwlwifi-5000-5.ucode +iwlwifi-5150-2.ucode +iwlwifi-6000-4.ucode +iwlwifi-6000g2a-6.ucode +iwlwifi-6000g2b-6.ucode +iwlwifi-6050-5.ucode +iwlwifi-7260-17.ucode +iwlwifi-7265-17.ucode +iwlwifi-7265D-29.ucode +iwlwifi-8000C-34.ucode +iwlwifi-8000C-36.ucode +iwlwifi-8265-34.ucode +iwlwifi-8265-36.ucode +iwlwifi-9000-pu-b0-jf-b0-34.ucode +iwlwifi-9000-pu-b0-jf-b0-38.ucode +iwlwifi-9000-pu-b0-jf-b0-46.ucode +iwlwifi-9260-th-b0-jf-b0-34.ucode +iwlwifi-9260-th-b0-jf-b0-38.ucode +iwlwifi-9260-th-b0-jf-b0-46.ucode +iwlwifi-Qu-b0-hr-b0-50.ucode +iwlwifi-Qu-b0-hr-b0-59.ucode +iwlwifi-Qu-b0-hr-b0-66.ucode +iwlwifi-Qu-b0-hr-b0-72.ucode +iwlwifi-Qu-b0-hr-b0-73.ucode +iwlwifi-Qu-b0-hr-b0-74.ucode +iwlwifi-Qu-b0-hr-b0-77.ucode +iwlwifi-Qu-b0-jf-b0-50.ucode +iwlwifi-Qu-b0-jf-b0-59.ucode +iwlwifi-Qu-b0-jf-b0-66.ucode +iwlwifi-Qu-b0-jf-b0-72.ucode +iwlwifi-Qu-b0-jf-b0-73.ucode +iwlwifi-Qu-b0-jf-b0-74.ucode +iwlwifi-Qu-b0-jf-b0-77.ucode +iwlwifi-Qu-c0-hr-b0-50.ucode +iwlwifi-Qu-c0-hr-b0-59.ucode +iwlwifi-Qu-c0-hr-b0-66.ucode +iwlwifi-Qu-c0-hr-b0-72.ucode +iwlwifi-Qu-c0-hr-b0-73.ucode +iwlwifi-Qu-c0-hr-b0-74.ucode +iwlwifi-Qu-c0-hr-b0-77.ucode +iwlwifi-Qu-c0-jf-b0-50.ucode +iwlwifi-Qu-c0-jf-b0-59.ucode +iwlwifi-Qu-c0-jf-b0-66.ucode +iwlwifi-Qu-c0-jf-b0-72.ucode +iwlwifi-Qu-c0-jf-b0-73.ucode +iwlwifi-Qu-c0-jf-b0-74.ucode +iwlwifi-Qu-c0-jf-b0-77.ucode +iwlwifi-QuZ-a0-hr-b0-50.ucode +iwlwifi-QuZ-a0-hr-b0-59.ucode +iwlwifi-QuZ-a0-hr-b0-66.ucode +iwlwifi-QuZ-a0-hr-b0-72.ucode +iwlwifi-QuZ-a0-hr-b0-73.ucode +iwlwifi-QuZ-a0-hr-b0-74.ucode +iwlwifi-QuZ-a0-hr-b0-77.ucode +iwlwifi-QuZ-a0-jf-b0-50.ucode +iwlwifi-QuZ-a0-jf-b0-59.ucode +iwlwifi-QuZ-a0-jf-b0-66.ucode +iwlwifi-QuZ-a0-jf-b0-72.ucode +iwlwifi-QuZ-a0-jf-b0-73.ucode +iwlwifi-QuZ-a0-jf-b0-74.ucode +iwlwifi-QuZ-a0-jf-b0-77.ucode +iwlwifi-cc-a0-50.ucode +iwlwifi-cc-a0-59.ucode +iwlwifi-cc-a0-66.ucode +iwlwifi-cc-a0-72.ucode +iwlwifi-cc-a0-73.ucode +iwlwifi-cc-a0-74.ucode +iwlwifi-cc-a0-77.ucode +iwlwifi-gl-c0-fm-c0-83.ucode +iwlwifi-gl-c0-fm-c0-86.ucode +iwlwifi-gl-c0-fm-c0-90.ucode +iwlwifi-gl-c0-fm-c0.pnvm +iwlwifi-ma-b0-gf-a0-83.ucode +iwlwifi-ma-b0-gf-a0-86.ucode +iwlwifi-ma-b0-gf-a0-89.ucode +iwlwifi-ma-b0-gf-a0.pnvm +iwlwifi-ma-b0-gf4-a0-83.ucode +iwlwifi-ma-b0-gf4-a0-86.ucode +iwlwifi-ma-b0-gf4-a0-89.ucode +iwlwifi-ma-b0-gf4-a0.pnvm +iwlwifi-ma-b0-hr-b0-83.ucode +iwlwifi-ma-b0-hr-b0-86.ucode +iwlwifi-ma-b0-hr-b0-89.ucode +iwlwifi-so-a0-gf-a0-72.ucode +iwlwifi-so-a0-gf-a0-73.ucode +iwlwifi-so-a0-gf-a0-74.ucode +iwlwifi-so-a0-gf-a0-77.ucode +iwlwifi-so-a0-gf-a0-78.ucode +iwlwifi-so-a0-gf-a0-79.ucode +iwlwifi-so-a0-gf-a0-81.ucode +iwlwifi-so-a0-gf-a0-83.ucode +iwlwifi-so-a0-gf-a0-84.ucode +iwlwifi-so-a0-gf-a0-86.ucode +iwlwifi-so-a0-gf-a0-89.ucode +iwlwifi-so-a0-gf-a0.pnvm +iwlwifi-so-a0-gf4-a0-72.ucode +iwlwifi-so-a0-gf4-a0-73.ucode +iwlwifi-so-a0-gf4-a0-74.ucode +iwlwifi-so-a0-gf4-a0-77.ucode +iwlwifi-so-a0-gf4-a0-78.ucode +iwlwifi-so-a0-gf4-a0-79.ucode +iwlwifi-so-a0-gf4-a0-81.ucode +iwlwifi-so-a0-gf4-a0-83.ucode +iwlwifi-so-a0-gf4-a0-84.ucode +iwlwifi-so-a0-gf4-a0-86.ucode +iwlwifi-so-a0-gf4-a0-89.ucode +iwlwifi-so-a0-gf4-a0.pnvm +iwlwifi-so-a0-hr-b0-72.ucode +iwlwifi-so-a0-hr-b0-73.ucode +iwlwifi-so-a0-hr-b0-74.ucode +iwlwifi-so-a0-hr-b0-77.ucode +iwlwifi-so-a0-hr-b0-79.ucode +iwlwifi-so-a0-hr-b0-81.ucode +iwlwifi-so-a0-hr-b0-83.ucode +iwlwifi-so-a0-hr-b0-84.ucode +iwlwifi-so-a0-hr-b0-86.ucode +iwlwifi-so-a0-hr-b0-89.ucode +iwlwifi-so-a0-jf-b0-72.ucode +iwlwifi-so-a0-jf-b0-73.ucode +iwlwifi-so-a0-jf-b0-74.ucode +iwlwifi-so-a0-jf-b0-77.ucode +iwlwifi-ty-a0-gf-a0-59.ucode +iwlwifi-ty-a0-gf-a0-66.ucode +iwlwifi-ty-a0-gf-a0-72.ucode +iwlwifi-ty-a0-gf-a0-73.ucode +iwlwifi-ty-a0-gf-a0-74.ucode +iwlwifi-ty-a0-gf-a0-77.ucode +iwlwifi-ty-a0-gf-a0-78.ucode +iwlwifi-ty-a0-gf-a0-79.ucode +iwlwifi-ty-a0-gf-a0-81.ucode +iwlwifi-ty-a0-gf-a0-83.ucode +iwlwifi-ty-a0-gf-a0-84.ucode +iwlwifi-ty-a0-gf-a0-86.ucode +iwlwifi-ty-a0-gf-a0-89.ucode +iwlwifi-ty-a0-gf-a0.pnvm +ixp4xx/NPE-A +ixp4xx/NPE-B +ixp4xx/NPE-C +ixp4xx/NPE-A-HSS +kaweth/new_code_fix.bin +kaweth/trigger_code.bin +kaweth/new_code.bin +kaweth/trigger_code_fix.bin +keyspan/usa28x.fw +keyspan/usa28.fw +keyspan/usa49w.fw +keyspan/usa19w.fw +keyspan/mpr.fw +keyspan/usa28xa.fw +keyspan/usa19qi.fw +keyspan/usa19.fw +keyspan/usa19qw.fw +keyspan/usa49wlc.fw +keyspan/usa28xb.fw +keyspan/usa18x.fw +keyspan_pda/keyspan_pda.fw +keyspan_pda/xircom_pgs.fw +lbtf_usb.bin +libertas/cf8385.bin +libertas/sd8686_v9.bin +libertas/usb8388_v9.bin +libertas/sd8688.bin +libertas/usb8388_v5.bin +libertas/gspi8688_helper.bin +libertas/usb8682.bin +libertas/cf8381_helper.bin +libertas/sd8686_v9_helper.bin +libertas/cf8381.bin +libertas/gspi8682.bin +libertas/lbtf_sdio.bin +libertas/gspi8686_v9.bin +libertas/sd8682_helper.bin +libertas/usb8388_olpc.bin +libertas/cf8385_helper.bin +libertas/sd8686_v8.bin +libertas/sd8385.bin +libertas/sd8682.bin +libertas/sd8385_helper.bin +libertas/sd8686_v8_helper.bin +libertas/gspi8688.bin +libertas/gspi8682_helper.bin +libertas/gspi8686_v9_helper.bin +libertas/sd8688_helper.bin +liquidio/lio_23xx_nic.bin +liquidio/lio_210nv_nic.bin +liquidio/lio_410nv_nic.bin +liquidio/lio_210sv_nic.bin +lt9611uxc_fw.bin +matrox/g200_warp.fw +matrox/g400_warp.fw +mediatek/mt7610u.bin +mediatek/mt7915_wa.bin +mediatek/mt7915_rom_patch.bin +mediatek/mt7615_rom_patch.bin +mediatek/mt8186/scp.img +mediatek/mt8192/scp.img +mediatek/mt7662u_rom_patch.bin +mediatek/mt7915_eeprom_dbdc.bin +mediatek/mt7986_rom_patch.bin +mediatek/mt7915_wm.bin +mediatek/mt7663_n9_v3.bin +mediatek/sof/sof-mt8186.ldc +mediatek/sof/sof-mt8186.ri +mediatek/sof/sof-mt8195.ldc +mediatek/sof/sof-mt8195.ri +mediatek/mt7601u.bin +mediatek/mt7996/mt7996_eeprom.bin +mediatek/mt7996/mt7996_wm.bin +mediatek/mt7996/mt7996_wa.bin +mediatek/mt7996/mt7996_rom_patch.bin +mediatek/mt7996/mt7996_dsp.bin +mediatek/mt8195/scp.img +mediatek/mt7925/WIFI_MT7925_PATCH_MCU_1_1_hdr.bin +mediatek/mt7925/WIFI_RAM_CODE_MT7925_1_1.bin +mediatek/mt7925/BT_RAM_CODE_MT7925_1_1_hdr.bin +mediatek/mt7981_wo.bin +mediatek/mt7986_eeprom_mt7976_dbdc.bin +mediatek/mt7981_wa.bin +mediatek/WIFI_RAM_CODE_MT7961_1.bin +mediatek/mt7986_wa.bin +mediatek/mt7986_wo_1.bin +mediatek/mt7622_rom_patch.bin +mediatek/mt7610e.bin +mediatek/sof-tplg/sof-mt8186.tplg +mediatek/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682-dts.tplg +mediatek/sof-tplg/sof-mt8195-mt6359-rt1019-rt5682.tplg +mediatek/mt7662.bin +mediatek/mt7916_eeprom.bin +mediatek/mt7986_wo_0.bin +mediatek/mt7986_eeprom_mt7976.bin +mediatek/mt7981_rom_patch.bin +mediatek/mt7650.bin +mediatek/mt7615_n9.bin +mediatek/mt7916_wm.bin +mediatek/mt7916_wa.bin +mediatek/mt7986_eeprom_mt7976_dual.bin +mediatek/mt7650e.bin +mediatek/WIFI_RAM_CODE_MT7922_1.bin +mediatek/mt7662_rom_patch.bin +mediatek/mt7915_eeprom.bin +mediatek/mt7668pr2h.bin +mediatek/mt8173/vpu_d.bin +mediatek/mt8173/vpu_p.bin +mediatek/mt7916_rom_patch.bin +mediatek/mt7663pr2h.bin +mediatek/mt7662u.bin +mediatek/BT_RAM_CODE_MT7961_1_2_hdr.bin +mediatek/mt7622_n9.bin +mediatek/mt7622pr2h.bin +mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin +mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin +mediatek/mt7663_n9_rebb.bin +mediatek/mt8183/scp.img +mediatek/mt7988/i2p5ge-phy-pmb.bin +mediatek/mt7986_eeprom_mt7975_dual.bin +mediatek/mt7663pr2h_rebb.bin +mediatek/mt7986_wm.bin +mediatek/mt7615_cr4.bin +mediatek/mt7986_wm_mt7975.bin +mediatek/BT_RAM_CODE_MT7922_1_1_hdr.bin +mediatek/mt7986_rom_patch_mt7975.bin +mediatek/mt7981_wm.bin +mellanox/lc_ini_bundle_2010_1502.bin +mellanox/mlxsw_spectrum2-29.2010.1406.mfa2 +mellanox/mlxsw_spectrum2-29.2010.1502.mfa2 +mellanox/mlxsw_spectrum2-29.2008.2304.mfa2 +mellanox/mlxsw_spectrum2-29.2008.1312.mfa2 +mellanox/mlxsw_spectrum-13.1703.4.mfa2 +mellanox/mlxsw_spectrum2-29.2008.2946.mfa2 +mellanox/mlxsw_spectrum3-30.2010.3020.mfa2 +mellanox/mlxsw_spectrum-13.2010.1406.mfa2 +mellanox/mlxsw_spectrum2-29.2010.3020.mfa2 +mellanox/mlxsw_spectrum2-29.2008.3326.mfa2 +mellanox/mlxsw_spectrum3-30.2008.3326.mfa2 +mellanox/mlxsw_spectrum-13.2008.2018.mfa2 +mellanox/mlxsw_spectrum3-30.2008.2406.mfa2 +mellanox/mlxsw_spectrum3-30.2010.1006.mfa2 +mellanox/mlxsw_spectrum3-30.2007.1168.mfa2 +mellanox/mlxsw_spectrum2-29.2008.2438.mfa2 +mellanox/mlxsw_spectrum-13.2008.2946.mfa2 +mellanox/mlxsw_spectrum-13.2008.1036.mfa2 +mellanox/mlxsw_spectrum2-29.2000.2714.mfa2 +mellanox/lc_ini_bundle_2010_3020.bin +mellanox/mlxsw_spectrum-13.1420.122.mfa2 +mellanox/mlxsw_spectrum2-29.2010.3146.mfa2 +mellanox/mlxsw_spectrum-13.2008.1310.mfa2 +mellanox/mlxsw_spectrum-13.2007.1168.mfa2 +mellanox/mlxsw_spectrum-13.2008.2304.mfa2 +mellanox/mlxsw_spectrum-13.2000.1122.mfa2 +mellanox/mlxsw_spectrum3-30.2012.1012.mfa2 +mellanox/mlxsw_spectrum-13.2010.1006.mfa2 +mellanox/mlxsw_spectrum-13.2010.1232.mfa2 +mellanox/mlxsw_spectrum3-30.2008.2018.mfa2 +mellanox/mlxsw_spectrum-13.2008.2406.mfa2 +mellanox/mlxsw_spectrum2-29.2000.2308.mfa2 +mellanox/mlxsw_spectrum3-30.2010.1232.mfa2 +mellanox/mlxsw_spectrum-13.2008.1312.mfa2 +mellanox/mlxsw_spectrum-13.2010.3020.mfa2 +mellanox/mlxsw_spectrum-13.2000.1886.mfa2 +mellanox/mlxsw_spectrum2-29.2008.2018.mfa2 +mellanox/mlxsw_spectrum2-29.2008.2406.mfa2 +mellanox/mlxsw_spectrum2-29.2010.1232.mfa2 +mellanox/mlxsw_spectrum2-29.2010.1006.mfa2 +mellanox/mlxsw_spectrum3-30.2010.1406.mfa2 +mellanox/mlxsw_spectrum3-30.2008.1312.mfa2 +mellanox/mlxsw_spectrum-13.1702.6.mfa2 +mellanox/mlxsw_spectrum3-30.2010.3146.mfa2 +mellanox/mlxsw_spectrum-13.2012.1012.mfa2 +mellanox/mlxsw_spectrum3-30.2008.2946.mfa2 +mellanox/mlxsw_spectrum2-29.2008.1036.mfa2 +mellanox/mlxsw_spectrum3-30.2010.1502.mfa2 +mellanox/mlxsw_spectrum3-30.2008.2438.mfa2 +mellanox/lc_ini_bundle_2010_1006.bin +mellanox/mlxsw_spectrum2-29.2008.1310.mfa2 +mellanox/mlxsw_spectrum3-30.2008.2304.mfa2 +mellanox/mlxsw_spectrum4-34.2012.1012.mfa2 +mellanox/mlxsw_spectrum-13.2000.2308.mfa2 +mellanox/mlxsw_spectrum-13.1530.152.mfa2 +mellanox/mlxsw_spectrum-13.1620.192.mfa2 +mellanox/mlxsw_spectrum-13.2010.3146.mfa2 +mellanox/lc_ini_bundle_2010_3146.bin +mellanox/mlxsw_spectrum-13.2008.2438.mfa2 +mellanox/mlxsw_spectrum-13.2000.2714.mfa2 +mellanox/mlxsw_spectrum-13.2010.1502.mfa2 +mellanox/mlxsw_spectrum-13.2008.3326.mfa2 +mellanox/mlxsw_spectrum3-30.2008.1036.mfa2 +mellanox/mlxsw_spectrum2-29.2012.1012.mfa2 +mellanox/mlxsw_spectrum3-30.2008.1310.mfa2 +mellanox/mlxsw_spectrum2-29.2007.1168.mfa2 +mellanox/mlxsw_spectrum-13.1910.622.mfa2 +meson/vdec/sm1_hevc_mmu.bin +meson/vdec/gxl_mjpeg.bin +meson/vdec/g12a_vp9.bin +meson/vdec/sm1_vp9_mmu.bin +meson/vdec/g12a_h264.bin +meson/vdec/gxm_h264.bin +meson/vdec/g12a_hevc_mmu.bin +meson/vdec/gxl_mpeg12.bin +meson/vdec/gxbb_h264.bin +meson/vdec/gxl_hevc_mmu.bin +meson/vdec/gxl_vp9.bin +meson/vdec/gxl_h264.bin +meson/vdec/gxl_h263.bin +meson/vdec/gxl_mpeg4_5.bin +meson/vdec/gxl_hevc.bin +microchip/mscc_vsc8574_revb_int8051_29e8.bin +microchip/mscc_vsc8584_revb_int8051_fb48.bin +moxa/moxa-1450.fw +moxa/moxa-1251.fw +moxa/moxa-1150.fw +moxa/moxa-1410.fw +moxa/moxa-1658.fw +moxa/moxa-1653.fw +moxa/moxa-1618.fw +moxa/moxa-1250.fw +moxa/moxa-1130.fw +moxa/moxa-1613.fw +moxa/moxa-1110.fw +moxa/moxa-1131.fw +moxa/moxa-1451.fw +moxa/moxa-1151.fw +mrvl/usb8766_uapsta.bin +mrvl/prestera/mvsw_prestera_fw-v2.0.img +mrvl/prestera/mvsw_prestera_fw-v4.0.img +mrvl/prestera/mvsw_prestera_fw-v3.0.img +mrvl/prestera/mvsw_prestera_fw-v4.1.img +mrvl/prestera/mvsw_prestera_fw_arm64-v4.1.img +mrvl/usb8797_uapsta.bin +mrvl/sd8897_uapsta.bin +mrvl/usb8801_uapsta.bin +mrvl/sd8688.bin +mrvl/pcie8997_wlan_v4.bin +mrvl/cpt01/ae.out +mrvl/cpt01/se.out +mrvl/cpt01/ie.out +mrvl/cpt04/ae.out +mrvl/cpt04/se.out +mrvl/cpt04/ie.out +mrvl/pcie8897_uapsta.bin +mrvl/cpt02/ae.out +mrvl/cpt02/se.out +mrvl/cpt02/ie.out +mrvl/cpt03/ae.out +mrvl/cpt03/se.out +mrvl/cpt03/ie.out +mrvl/sd8887_uapsta.bin +mrvl/sdsd8977_combo_v2.bin +mrvl/sd8801_uapsta.bin +mrvl/sd8797_uapsta.bin +mrvl/sdsd8997_combo_v4.bin +mrvl/usbusb8997_combo_v4.bin +mrvl/pcieuart8997_combo_v4.bin +mrvl/sd8688_helper.bin +mrvl/sd8787_uapsta.bin +mrvl/pcieusb8997_combo_v4.bin +mrvl/usb8897_uapsta.bin +mt7601u.bin +mt7650.bin +mt7662.bin +mt7662_rom_patch.bin +mts_cdma.fw +mts_edge.fw +mts_gsm.fw +mwl8k/fmimage_8366.fw +mwl8k/fmimage_8764_ap-1.fw +mwl8k/fmimage_8366_ap-1.fw +mwl8k/fmimage_8687.fw +mwl8k/fmimage_8366_ap-2.fw +mwl8k/fmimage_8366_ap-3.fw +mwl8k/helper_8687.fw +mwl8k/helper_8366.fw +mwlwifi/88W8864.bin +mwlwifi/88W8897.bin +myri10ge_eth_big_z8e.dat +myri10ge_eth_z8e.dat +myri10ge_ethp_big_z8e.dat +myri10ge_ethp_z8e.dat +myri10ge_rss_eth_big_z8e.dat +myri10ge_rss_eth_z8e.dat +myri10ge_rss_ethp_big_z8e.dat +myri10ge_rss_ethp_z8e.dat +netronome/nic_AMDA0096-0001_2x10.nffw +netronome/nic/nic_AMDA0096-0001_2x10.nffw +netronome/nic/nic_AMDA0058-0012_2x40.nffw +netronome/nic/nic_AMDA0099-0001_1x10_1x25.nffw +netronome/nic/nic_AMDA0097-0001_8x10.nffw +netronome/nic/nic_AMDA0081-0001_1x40.nffw +netronome/nic/nic_AMDA0097-0001_2x40.nffw +netronome/nic/nic_AMDA0078-0011_1x100.nffw +netronome/nic/nic_AMDA0081-0001_4x10.nffw +netronome/nic/nic_AMDA0097-0001_4x10_1x40.nffw +netronome/nic/nic_AMDA0058-0011_2x40.nffw +netronome/nic/nic_AMDA0099-0001_2x25.nffw +netronome/nic/nic_AMDA0099-0001_2x10.nffw +netronome/nic_AMDA0058-0012_2x40.nffw +netronome/nic_AMDA0099-0001_1x10_1x25.nffw +netronome/nic_AMDA0097-0001_8x10.nffw +netronome/nic_AMDA0081-0001_1x40.nffw +netronome/nic_AMDA0097-0001_2x40.nffw +netronome/bpf/nic_AMDA0096-0001_2x10.nffw +netronome/bpf/nic_AMDA0058-0012_2x40.nffw +netronome/bpf/nic_AMDA0099-0001_1x10_1x25.nffw +netronome/bpf/nic_AMDA0097-0001_8x10.nffw +netronome/bpf/nic_AMDA0081-0001_1x40.nffw +netronome/bpf/nic_AMDA0097-0001_2x40.nffw +netronome/bpf/nic_AMDA0078-0011_1x100.nffw +netronome/bpf/nic_AMDA0081-0001_4x10.nffw +netronome/bpf/nic_AMDA0097-0001_4x10_1x40.nffw +netronome/bpf/nic_AMDA0058-0011_2x40.nffw +netronome/bpf/nic_AMDA0099-0001_2x25.nffw +netronome/bpf/nic_AMDA0099-0001_2x10.nffw +netronome/nic_AMDA0078-0011_1x100.nffw +netronome/nic-sriov/nic_AMDA0096-0001_2x10.nffw +netronome/nic-sriov/nic_AMDA0058-0012_2x40.nffw +netronome/nic-sriov/nic_AMDA0099-0001_1x10_1x25.nffw +netronome/nic-sriov/nic_AMDA0097-0001_8x10.nffw +netronome/nic-sriov/nic_AMDA0081-0001_1x40.nffw +netronome/nic-sriov/nic_AMDA0097-0001_2x40.nffw +netronome/nic-sriov/nic_AMDA0078-0011_1x100.nffw +netronome/nic-sriov/nic_AMDA0081-0001_4x10.nffw +netronome/nic-sriov/nic_AMDA0097-0001_4x10_1x40.nffw +netronome/nic-sriov/nic_AMDA0058-0011_2x40.nffw +netronome/nic-sriov/nic_AMDA0099-0001_2x25.nffw +netronome/nic-sriov/nic_AMDA0099-0001_2x10.nffw +netronome/flower/nic_AMDA0096-0001_2x10.nffw +netronome/flower/nic_AMDA0058-0011_4x10_1x40.nffw +netronome/flower/nic_AMDA0096.nffw +netronome/flower/nic_AMDA0058-0012_4x10_1x40.nffw +netronome/flower/nic_AMDA0058-0012_2x40.nffw +netronome/flower/nic_AMDA0099-0001_1x10_1x25.nffw +netronome/flower/nic_AMDA0097-0001_8x10.nffw +netronome/flower/nic_AMDA0078-0012_8x10.nffw +netronome/flower/nic_AMDA0097.nffw +netronome/flower/nic_AMDA0058-0012_8x10.nffw +netronome/flower/nic_AMDA0081-0001_1x40.nffw +netronome/flower/nic_AMDA0097-0001_2x40.nffw +netronome/flower/nic_AMDA0078-0012_2x40.nffw +netronome/flower/nic_AMDA0078-0011_1x100.nffw +netronome/flower/nic_AMDA0058-0012_1x100.nffw +netronome/flower/nic_AMDA0078-0012_1x100.nffw +netronome/flower/nic_AMDA0081.nffw +netronome/flower/nic_AMDA0078-0012_4x10_1x40.nffw +netronome/flower/nic_AMDA0058-0011_1x100.nffw +netronome/flower/nic_AMDA0099.nffw +netronome/flower/nic_AMDA0058-0011_8x10.nffw +netronome/flower/nic_AMDA0078-0011_4x10_1x40.nffw +netronome/flower/nic_AMDA0081-0001_4x10.nffw +netronome/flower/nic_AMDA0097-0001_4x10_1x40.nffw +netronome/flower/nic_AMDA0058.nffw +netronome/flower/nic_AMDA0058-0011_2x40.nffw +netronome/flower/nic_AMDA0078-0011_8x10.nffw +netronome/flower/nic_AMDA0099-0001_2x25.nffw +netronome/flower/nic_AMDA0099-0001_2x10.nffw +netronome/flower/nic_AMDA0078-0011_2x40.nffw +netronome/nic_AMDA0081-0001_4x10.nffw +netronome/nic_AMDA0097-0001_4x10_1x40.nffw +netronome/nic_AMDA0058-0011_2x40.nffw +netronome/nic_AMDA0099-0001_2x25.nffw +netronome/nic_AMDA0099-0001_2x10.nffw +nvidia/gp104/nvdec/scrubber.bin +nvidia/gp104/gr/fecs_inst.bin +nvidia/gp104/gr/fecs_sig.bin +nvidia/gp104/gr/sw_bundle_init.bin +nvidia/gp104/gr/gpccs_inst.bin +nvidia/gp104/gr/fecs_data.bin +nvidia/gp104/gr/gpccs_sig.bin +nvidia/gp104/gr/gpccs_bl.bin +nvidia/gp104/gr/fecs_bl.bin +nvidia/gp104/gr/gpccs_data.bin +nvidia/gp104/gr/sw_method_init.bin +nvidia/gp104/gr/sw_ctx.bin +nvidia/gp104/gr/sw_nonctx.bin +nvidia/gp104/acr/ucode_load.bin +nvidia/gp104/acr/ucode_unload.bin +nvidia/gp104/acr/unload_bl.bin +nvidia/gp104/acr/bl.bin +nvidia/gp104/sec2/desc-1.bin +nvidia/gp104/sec2/image.bin +nvidia/gp104/sec2/desc.bin +nvidia/gp104/sec2/image-1.bin +nvidia/gp104/sec2/sig-1.bin +nvidia/gp104/sec2/sig.bin +nvidia/gv100/nvdec/scrubber.bin +nvidia/gv100/gr/fecs_inst.bin +nvidia/gv100/gr/fecs_sig.bin +nvidia/gv100/gr/sw_bundle_init.bin +nvidia/gv100/gr/gpccs_inst.bin +nvidia/gv100/gr/fecs_data.bin +nvidia/gv100/gr/gpccs_sig.bin +nvidia/gv100/gr/gpccs_bl.bin +nvidia/gv100/gr/fecs_bl.bin +nvidia/gv100/gr/gpccs_data.bin +nvidia/gv100/gr/sw_method_init.bin +nvidia/gv100/gr/sw_ctx.bin +nvidia/gv100/gr/sw_nonctx.bin +nvidia/gv100/acr/ucode_load.bin +nvidia/gv100/acr/ucode_unload.bin +nvidia/gv100/acr/unload_bl.bin +nvidia/gv100/acr/bl.bin +nvidia/gv100/sec2/image.bin +nvidia/gv100/sec2/desc.bin +nvidia/gv100/sec2/sig.bin +nvidia/ad104/gsp +nvidia/ga102/nvdec/scrubber.bin +nvidia/ga102/gr/fecs_sig.bin +nvidia/ga102/gr/gpccs_sig.bin +nvidia/ga102/gr/gpccs_bl.bin +nvidia/ga102/gr/fecs_bl.bin +nvidia/ga102/gr/NET_img.bin +nvidia/ga102/acr/ucode_unload.bin +nvidia/ga102/acr/ucode_ahesasc.bin +nvidia/ga102/acr/ucode_asb.bin +nvidia/ga102/gsp/gsp-535.113.01.bin +nvidia/ga102/gsp/booter_unload-535.113.01.bin +nvidia/ga102/gsp/bootloader-535.113.01.bin +nvidia/ga102/gsp/booter_load-535.113.01.bin +nvidia/ga102/sec2/hs_bl_sig.bin +nvidia/ga102/sec2/image.bin +nvidia/ga102/sec2/desc.bin +nvidia/ga102/sec2/sig.bin +nvidia/tu117/nvdec/scrubber.bin +nvidia/tu117/gr/fecs_inst.bin +nvidia/tu117/gr/fecs_sig.bin +nvidia/tu117/gr/sw_bundle_init.bin +nvidia/tu117/gr/gpccs_inst.bin +nvidia/tu117/gr/fecs_data.bin +nvidia/tu117/gr/gpccs_sig.bin +nvidia/tu117/gr/gpccs_bl.bin +nvidia/tu117/gr/fecs_bl.bin +nvidia/tu117/gr/gpccs_data.bin +nvidia/tu117/gr/sw_method_init.bin +nvidia/tu117/gr/sw_ctx.bin +nvidia/tu117/gr/sw_nonctx.bin +nvidia/tu117/gr/sw_veid_bundle_init.bin +nvidia/tu117/acr/ucode_unload.bin +nvidia/tu117/acr/ucode_ahesasc.bin +nvidia/tu117/acr/unload_bl.bin +nvidia/tu117/acr/ucode_asb.bin +nvidia/tu117/acr/bl.bin +nvidia/tu117/gsp +nvidia/tu117/sec2/image.bin +nvidia/tu117/sec2/desc.bin +nvidia/tu117/sec2/sig.bin +nvidia/gp102/nvdec/scrubber.bin +nvidia/gp102/gr/fecs_inst.bin +nvidia/gp102/gr/fecs_sig.bin +nvidia/gp102/gr/sw_bundle_init.bin +nvidia/gp102/gr/gpccs_inst.bin +nvidia/gp102/gr/fecs_data.bin +nvidia/gp102/gr/gpccs_sig.bin +nvidia/gp102/gr/gpccs_bl.bin +nvidia/gp102/gr/fecs_bl.bin +nvidia/gp102/gr/gpccs_data.bin +nvidia/gp102/gr/sw_method_init.bin +nvidia/gp102/gr/sw_ctx.bin +nvidia/gp102/gr/sw_nonctx.bin +nvidia/gp102/acr/ucode_load.bin +nvidia/gp102/acr/ucode_unload.bin +nvidia/gp102/acr/unload_bl.bin +nvidia/gp102/acr/bl.bin +nvidia/gp102/sec2/desc-1.bin +nvidia/gp102/sec2/image.bin +nvidia/gp102/sec2/desc.bin +nvidia/gp102/sec2/image-1.bin +nvidia/gp102/sec2/sig-1.bin +nvidia/gp102/sec2/sig.bin +nvidia/gp106/nvdec/scrubber.bin +nvidia/gp106/gr/fecs_inst.bin +nvidia/gp106/gr/fecs_sig.bin +nvidia/gp106/gr/sw_bundle_init.bin +nvidia/gp106/gr/gpccs_inst.bin +nvidia/gp106/gr/fecs_data.bin +nvidia/gp106/gr/gpccs_sig.bin +nvidia/gp106/gr/gpccs_bl.bin +nvidia/gp106/gr/fecs_bl.bin +nvidia/gp106/gr/gpccs_data.bin +nvidia/gp106/gr/sw_method_init.bin +nvidia/gp106/gr/sw_ctx.bin +nvidia/gp106/gr/sw_nonctx.bin +nvidia/gp106/acr/ucode_load.bin +nvidia/gp106/acr/ucode_unload.bin +nvidia/gp106/acr/unload_bl.bin +nvidia/gp106/acr/bl.bin +nvidia/gp106/sec2/desc-1.bin +nvidia/gp106/sec2/image.bin +nvidia/gp106/sec2/desc.bin +nvidia/gp106/sec2/image-1.bin +nvidia/gp106/sec2/sig-1.bin +nvidia/gp106/sec2/sig.bin +nvidia/ad102/gsp/gsp-535.113.01.bin +nvidia/ad102/gsp/booter_unload-535.113.01.bin +nvidia/ad102/gsp/bootloader-535.113.01.bin +nvidia/ad102/gsp/booter_load-535.113.01.bin +nvidia/tegra210/vic.bin +nvidia/tegra210/xusb.bin +nvidia/tegra210/vic04_ucode.bin +nvidia/gm204/gr/fecs_inst.bin +nvidia/gm204/gr/fecs_sig.bin +nvidia/gm204/gr/sw_bundle_init.bin +nvidia/gm204/gr/gpccs_inst.bin +nvidia/gm204/gr/fecs_data.bin +nvidia/gm204/gr/gpccs_sig.bin +nvidia/gm204/gr/gpccs_bl.bin +nvidia/gm204/gr/fecs_bl.bin +nvidia/gm204/gr/gpccs_data.bin +nvidia/gm204/gr/sw_method_init.bin +nvidia/gm204/gr/sw_ctx.bin +nvidia/gm204/gr/sw_nonctx.bin +nvidia/gm204/acr/ucode_load.bin +nvidia/gm204/acr/ucode_unload.bin +nvidia/gm204/acr/bl.bin +nvidia/ad107/gsp +nvidia/ad106/gsp +nvidia/tu104/nvdec/scrubber.bin +nvidia/tu104/gr/fecs_inst.bin +nvidia/tu104/gr/fecs_sig.bin +nvidia/tu104/gr/sw_bundle_init.bin +nvidia/tu104/gr/gpccs_inst.bin +nvidia/tu104/gr/fecs_data.bin +nvidia/tu104/gr/gpccs_sig.bin +nvidia/tu104/gr/gpccs_bl.bin +nvidia/tu104/gr/fecs_bl.bin +nvidia/tu104/gr/gpccs_data.bin +nvidia/tu104/gr/sw_method_init.bin +nvidia/tu104/gr/sw_ctx.bin +nvidia/tu104/gr/sw_nonctx.bin +nvidia/tu104/gr/sw_veid_bundle_init.bin +nvidia/tu104/acr/ucode_unload.bin +nvidia/tu104/acr/ucode_ahesasc.bin +nvidia/tu104/acr/unload_bl.bin +nvidia/tu104/acr/ucode_asb.bin +nvidia/tu104/acr/bl.bin +nvidia/tu104/gsp +nvidia/tu104/sec2/image.bin +nvidia/tu104/sec2/desc.bin +nvidia/tu104/sec2/sig.bin +nvidia/ga106/nvdec/scrubber.bin +nvidia/ga106/gr/fecs_sig.bin +nvidia/ga106/gr/gpccs_sig.bin +nvidia/ga106/gr/gpccs_bl.bin +nvidia/ga106/gr/fecs_bl.bin +nvidia/ga106/gr/NET_img.bin +nvidia/ga106/acr/ucode_unload.bin +nvidia/ga106/acr/ucode_ahesasc.bin +nvidia/ga106/acr/ucode_asb.bin +nvidia/ga106/gsp +nvidia/ga106/sec2/hs_bl_sig.bin +nvidia/ga106/sec2/image.bin +nvidia/ga106/sec2/desc.bin +nvidia/ga106/sec2/sig.bin +nvidia/ga103/nvdec/scrubber.bin +nvidia/ga103/gr/fecs_sig.bin +nvidia/ga103/gr/gpccs_sig.bin +nvidia/ga103/gr/gpccs_bl.bin +nvidia/ga103/gr/fecs_bl.bin +nvidia/ga103/gr/NET_img.bin +nvidia/ga103/acr/ucode_unload.bin +nvidia/ga103/acr/ucode_ahesasc.bin +nvidia/ga103/acr/ucode_asb.bin +nvidia/ga103/gsp +nvidia/ga103/sec2/hs_bl_sig.bin +nvidia/ga103/sec2/image.bin +nvidia/ga103/sec2/desc.bin +nvidia/ga103/sec2/sig.bin +nvidia/gm20b/gr/fecs_inst.bin +nvidia/gm20b/gr/fecs_sig.bin +nvidia/gm20b/gr/sw_bundle_init.bin +nvidia/gm20b/gr/gpccs_inst.bin +nvidia/gm20b/gr/fecs_data.bin +nvidia/gm20b/gr/fecs_bl.bin +nvidia/gm20b/gr/gpccs_data.bin +nvidia/gm20b/gr/sw_method_init.bin +nvidia/gm20b/gr/sw_ctx.bin +nvidia/gm20b/gr/sw_nonctx.bin +nvidia/gm20b/pmu/image.bin +nvidia/gm20b/pmu/desc.bin +nvidia/gm20b/pmu/sig.bin +nvidia/gm20b/acr/ucode_load.bin +nvidia/gm20b/acr/bl.bin +nvidia/ga107/nvdec/scrubber.bin +nvidia/ga107/gr/fecs_sig.bin +nvidia/ga107/gr/gpccs_sig.bin +nvidia/ga107/gr/gpccs_bl.bin +nvidia/ga107/gr/fecs_bl.bin +nvidia/ga107/gr/NET_img.bin +nvidia/ga107/acr/ucode_unload.bin +nvidia/ga107/acr/ucode_ahesasc.bin +nvidia/ga107/acr/ucode_asb.bin +nvidia/ga107/gsp +nvidia/ga107/sec2/hs_bl_sig.bin +nvidia/ga107/sec2/image.bin +nvidia/ga107/sec2/desc.bin +nvidia/ga107/sec2/sig.bin +nvidia/ga104/nvdec/scrubber.bin +nvidia/ga104/gr/fecs_sig.bin +nvidia/ga104/gr/gpccs_sig.bin +nvidia/ga104/gr/gpccs_bl.bin +nvidia/ga104/gr/fecs_bl.bin +nvidia/ga104/gr/NET_img.bin +nvidia/ga104/acr/ucode_unload.bin +nvidia/ga104/acr/ucode_ahesasc.bin +nvidia/ga104/acr/ucode_asb.bin +nvidia/ga104/gsp +nvidia/ga104/sec2/hs_bl_sig.bin +nvidia/ga104/sec2/image.bin +nvidia/ga104/sec2/desc.bin +nvidia/ga104/sec2/sig.bin +nvidia/tu10x/typec/ccg_secondary.cyacd +nvidia/tu10x/typec/ccg_primary.cyacd +nvidia/tu10x/typec/ccg_boot.cyacd +nvidia/ad103/gsp +nvidia/gm206/gr/fecs_inst.bin +nvidia/gm206/gr/fecs_sig.bin +nvidia/gm206/gr/sw_bundle_init.bin +nvidia/gm206/gr/gpccs_inst.bin +nvidia/gm206/gr/fecs_data.bin +nvidia/gm206/gr/gpccs_sig.bin +nvidia/gm206/gr/gpccs_bl.bin +nvidia/gm206/gr/fecs_bl.bin +nvidia/gm206/gr/gpccs_data.bin +nvidia/gm206/gr/sw_method_init.bin +nvidia/gm206/gr/sw_ctx.bin +nvidia/gm206/gr/sw_nonctx.bin +nvidia/gm206/acr/ucode_load.bin +nvidia/gm206/acr/ucode_unload.bin +nvidia/gm206/acr/bl.bin +nvidia/gk20a/fecs_inst.bin +nvidia/gk20a/sw_bundle_init.bin +nvidia/gk20a/gpccs_inst.bin +nvidia/gk20a/fecs_data.bin +nvidia/gk20a/gpccs_data.bin +nvidia/gk20a/sw_method_init.bin +nvidia/gk20a/sw_ctx.bin +nvidia/gk20a/sw_nonctx.bin +nvidia/tu106/nvdec/scrubber.bin +nvidia/tu106/gr/fecs_inst.bin +nvidia/tu106/gr/fecs_sig.bin +nvidia/tu106/gr/sw_bundle_init.bin +nvidia/tu106/gr/gpccs_inst.bin +nvidia/tu106/gr/fecs_data.bin +nvidia/tu106/gr/gpccs_sig.bin +nvidia/tu106/gr/gpccs_bl.bin +nvidia/tu106/gr/fecs_bl.bin +nvidia/tu106/gr/gpccs_data.bin +nvidia/tu106/gr/sw_method_init.bin +nvidia/tu106/gr/sw_ctx.bin +nvidia/tu106/gr/sw_nonctx.bin +nvidia/tu106/gr/sw_veid_bundle_init.bin +nvidia/tu106/acr/ucode_unload.bin +nvidia/tu106/acr/ucode_ahesasc.bin +nvidia/tu106/acr/unload_bl.bin +nvidia/tu106/acr/ucode_asb.bin +nvidia/tu106/acr/bl.bin +nvidia/tu106/gsp +nvidia/tu106/sec2/image.bin +nvidia/tu106/sec2/desc.bin +nvidia/tu106/sec2/sig.bin +nvidia/gp108/nvdec/scrubber.bin +nvidia/gp108/gr/fecs_inst.bin +nvidia/gp108/gr/fecs_sig.bin +nvidia/gp108/gr/sw_bundle_init.bin +nvidia/gp108/gr/gpccs_inst.bin +nvidia/gp108/gr/fecs_data.bin +nvidia/gp108/gr/gpccs_sig.bin +nvidia/gp108/gr/gpccs_bl.bin +nvidia/gp108/gr/fecs_bl.bin +nvidia/gp108/gr/gpccs_data.bin +nvidia/gp108/gr/sw_method_init.bin +nvidia/gp108/gr/sw_ctx.bin +nvidia/gp108/gr/sw_nonctx.bin +nvidia/gp108/acr/ucode_load.bin +nvidia/gp108/acr/ucode_unload.bin +nvidia/gp108/acr/unload_bl.bin +nvidia/gp108/acr/bl.bin +nvidia/gp108/sec2/image.bin +nvidia/gp108/sec2/desc.bin +nvidia/gp108/sec2/sig.bin +nvidia/gm200/gr/fecs_inst.bin +nvidia/gm200/gr/fecs_sig.bin +nvidia/gm200/gr/sw_bundle_init.bin +nvidia/gm200/gr/gpccs_inst.bin +nvidia/gm200/gr/fecs_data.bin +nvidia/gm200/gr/gpccs_sig.bin +nvidia/gm200/gr/gpccs_bl.bin +nvidia/gm200/gr/fecs_bl.bin +nvidia/gm200/gr/gpccs_data.bin +nvidia/gm200/gr/sw_method_init.bin +nvidia/gm200/gr/sw_ctx.bin +nvidia/gm200/gr/sw_nonctx.bin +nvidia/gm200/acr/ucode_load.bin +nvidia/gm200/acr/ucode_unload.bin +nvidia/gm200/acr/bl.bin +nvidia/tu102/nvdec/scrubber.bin +nvidia/tu102/gr/fecs_inst.bin +nvidia/tu102/gr/fecs_sig.bin +nvidia/tu102/gr/sw_bundle_init.bin +nvidia/tu102/gr/gpccs_inst.bin +nvidia/tu102/gr/fecs_data.bin +nvidia/tu102/gr/gpccs_sig.bin +nvidia/tu102/gr/gpccs_bl.bin +nvidia/tu102/gr/fecs_bl.bin +nvidia/tu102/gr/gpccs_data.bin +nvidia/tu102/gr/sw_method_init.bin +nvidia/tu102/gr/sw_ctx.bin +nvidia/tu102/gr/sw_nonctx.bin +nvidia/tu102/gr/sw_veid_bundle_init.bin +nvidia/tu102/acr/ucode_unload.bin +nvidia/tu102/acr/ucode_ahesasc.bin +nvidia/tu102/acr/unload_bl.bin +nvidia/tu102/acr/ucode_asb.bin +nvidia/tu102/acr/bl.bin +nvidia/tu102/gsp/gsp-535.113.01.bin +nvidia/tu102/gsp/booter_unload-535.113.01.bin +nvidia/tu102/gsp/bootloader-535.113.01.bin +nvidia/tu102/gsp/booter_load-535.113.01.bin +nvidia/tu102/sec2/image.bin +nvidia/tu102/sec2/desc.bin +nvidia/tu102/sec2/sig.bin +nvidia/tu116/nvdec/scrubber.bin +nvidia/tu116/gr/fecs_inst.bin +nvidia/tu116/gr/fecs_sig.bin +nvidia/tu116/gr/sw_bundle_init.bin +nvidia/tu116/gr/gpccs_inst.bin +nvidia/tu116/gr/fecs_data.bin +nvidia/tu116/gr/gpccs_sig.bin +nvidia/tu116/gr/gpccs_bl.bin +nvidia/tu116/gr/fecs_bl.bin +nvidia/tu116/gr/gpccs_data.bin +nvidia/tu116/gr/sw_method_init.bin +nvidia/tu116/gr/sw_ctx.bin +nvidia/tu116/gr/sw_nonctx.bin +nvidia/tu116/gr/sw_veid_bundle_init.bin +nvidia/tu116/acr/ucode_unload.bin +nvidia/tu116/acr/ucode_ahesasc.bin +nvidia/tu116/acr/unload_bl.bin +nvidia/tu116/acr/ucode_asb.bin +nvidia/tu116/acr/bl.bin +nvidia/tu116/gsp/gsp-535.113.01.bin +nvidia/tu116/gsp/booter_unload-535.113.01.bin +nvidia/tu116/gsp/bootloader-535.113.01.bin +nvidia/tu116/gsp/booter_load-535.113.01.bin +nvidia/tu116/sec2/image.bin +nvidia/tu116/sec2/desc.bin +nvidia/tu116/sec2/sig.bin +nvidia/tegra124/vic.bin +nvidia/tegra124/xusb.bin +nvidia/tegra124/vic03_ucode.bin +nvidia/gp100/gr/fecs_inst.bin +nvidia/gp100/gr/fecs_sig.bin +nvidia/gp100/gr/sw_bundle_init.bin +nvidia/gp100/gr/gpccs_inst.bin +nvidia/gp100/gr/fecs_data.bin +nvidia/gp100/gr/gpccs_sig.bin +nvidia/gp100/gr/gpccs_bl.bin +nvidia/gp100/gr/fecs_bl.bin +nvidia/gp100/gr/gpccs_data.bin +nvidia/gp100/gr/sw_method_init.bin +nvidia/gp100/gr/sw_ctx.bin +nvidia/gp100/gr/sw_nonctx.bin +nvidia/gp100/acr/ucode_load.bin +nvidia/gp100/acr/ucode_unload.bin +nvidia/gp100/acr/bl.bin +nvidia/tegra186/vic.bin +nvidia/tegra186/xusb.bin +nvidia/tegra186/vic04_ucode.bin +nvidia/ga100/gsp/gsp-535.113.01.bin +nvidia/ga100/gsp/booter_unload-535.113.01.bin +nvidia/ga100/gsp/bootloader-535.113.01.bin +nvidia/ga100/gsp/booter_load-535.113.01.bin +nvidia/gp107/nvdec/scrubber.bin +nvidia/gp107/gr/fecs_inst.bin +nvidia/gp107/gr/fecs_sig.bin +nvidia/gp107/gr/sw_bundle_init.bin +nvidia/gp107/gr/gpccs_inst.bin +nvidia/gp107/gr/fecs_data.bin +nvidia/gp107/gr/gpccs_sig.bin +nvidia/gp107/gr/gpccs_bl.bin +nvidia/gp107/gr/fecs_bl.bin +nvidia/gp107/gr/gpccs_data.bin +nvidia/gp107/gr/sw_method_init.bin +nvidia/gp107/gr/sw_ctx.bin +nvidia/gp107/gr/sw_nonctx.bin +nvidia/gp107/acr/ucode_load.bin +nvidia/gp107/acr/ucode_unload.bin +nvidia/gp107/acr/unload_bl.bin +nvidia/gp107/acr/bl.bin +nvidia/gp107/sec2/desc-1.bin +nvidia/gp107/sec2/image.bin +nvidia/gp107/sec2/desc.bin +nvidia/gp107/sec2/image-1.bin +nvidia/gp107/sec2/sig-1.bin +nvidia/gp107/sec2/sig.bin +nvidia/tegra194/vic.bin +nvidia/tegra194/xusb.bin +nvidia/gp10b/gr/fecs_inst.bin +nvidia/gp10b/gr/fecs_sig.bin +nvidia/gp10b/gr/sw_bundle_init.bin +nvidia/gp10b/gr/gpccs_inst.bin +nvidia/gp10b/gr/fecs_data.bin +nvidia/gp10b/gr/gpccs_sig.bin +nvidia/gp10b/gr/gpccs_bl.bin +nvidia/gp10b/gr/fecs_bl.bin +nvidia/gp10b/gr/gpccs_data.bin +nvidia/gp10b/gr/sw_method_init.bin +nvidia/gp10b/gr/sw_ctx.bin +nvidia/gp10b/gr/sw_nonctx.bin +nvidia/gp10b/pmu/image.bin +nvidia/gp10b/pmu/desc.bin +nvidia/gp10b/pmu/sig.bin +nvidia/gp10b/acr/ucode_load.bin +nvidia/gp10b/acr/bl.bin +nxp/uartuart9098_bt_v1.bin +nxp/uartuart8987_bt.bin +nxp/uartuart8997_bt_v4.bin +nxp/sr150_fw.bin +nxp/helper_uart_3000000.bin +nxp/uartiw416_bt_v0.bin +nxp/uartspi_n61x_v1.bin.se +phanfw.bin +powervr/rogue_33.15.11.3_v1.fw +qat_4xxx.bin +qat_4xxx_mmp.bin +qat_895xcc.bin +qat_895xcc_mmp.bin +qat_c3xxx.bin +qat_c3xxx_mmp.bin +qat_c62x.bin +qat_c62x_mmp.bin +qat_mmp.bin +qca/crnv32u.bin +qca/hpnv21.302 +qca/rampatch_usb_00000302.bin +qca/hpnv21.301 +qca/msbtfw11.tlv +qca/msnv11.bin +qca/hpnv21g.301 +qca/apbtfw11.tlv +qca/rampatch_00130300.bin +qca/nvm_usb_00130201_010b.bin +qca/rampatch_usb_00000200.bin +qca/nvm_usb_00000200.bin +qca/hpnv21.bin +qca/nvm_usb_00000302_eu.bin +qca/nvm_00130302.bin +qca/hpbtfw21.tlv +qca/apnv11.bin +qca/nvm_00230302.bin +qca/rampatch_usb_00190200.bin +qca/rampatch_00230302.bin +qca/crnv21.bin +qca/nvm_usb_00130201_010a.bin +qca/htnv20.bin +qca/nvm_usb_00130200.bin +qca/apbtfw10.tlv +qca/nvm_00130300.bin +qca/nvm_usb_00130200_0107.bin +qca/nvm_usb_00000201.bin +qca/msbtfw11.mbn +qca/crbtfw21.tlv +qca/crbtfw32.tlv +qca/hpnv21g.302 +qca/hpnv21g.309 +qca/apnv10.bin +qca/rampatch_00130302.bin +qca/rampatch_usb_00130200.bin +qca/nvm_00440302_eu.bin +qca/nvm_usb_00130201_0303.bin +qca/hpnv21.309 +qca/rampatch_00440302.bin +qca/htbtfw20.tlv +qca/nvm_usb_00130201_gf_010b.bin +qca/nvm_usb_00130201.bin +qca/nvm_usb_00130200_0109.bin +qca/rampatch_usb_00000300.bin +qca/nvm_00440302_i2s_eu.bin +qca/rampatch_usb_00000201.bin +qca/nvm_usb_00000302.bin +qca/nvm_usb_00190200.bin +qca/nvm_usb_00130200_0105.bin +qca/msnv11.b09 +qca/hpnv21g.bin +qca/rampatch_usb_00130201.bin +qca/crnv32.bin +qca/nvm_usb_00130200_0110.bin +qca/nvm_usb_00130200_0104.bin +qca/nvm_usb_00130201_gf_0303.bin +qca/nvm_usb_00130200_0106.bin +qca/nvm_usb_00000300.bin +qca/nvm_00440302.bin +qca/nvm_usb_00130201_gf_010a.bin +qca/nvm_usb_00130201_gf.bin +qca/msnv11.b0a +qcom/a420_pm4.fw +qcom/a530v3_gpmu.fw2 +qcom/venus-5.4/venus.mbn +qcom/venus-5.4/venus.mdt +qcom/a660_sqe.fw +qcom/apq8016/mba.mbn +qcom/apq8016/WCNSS_qcom_wlan_nv_sbc.bin +qcom/apq8016/wcnss.mbn +qcom/apq8016/modem.mbn +qcom/apq8096/mba.mbn +qcom/apq8096/a530_zap.mbn +qcom/apq8096/modemr.jsn +qcom/apq8096/adsp.mbn +qcom/apq8096/adspr.jsn +qcom/apq8096/modem.mbn +qcom/apq8096/adspua.jsn +qcom/a650_sqe.fw +qcom/venus-5.2/venus.mbn +qcom/venus-5.2/venus.mdt +qcom/yamato_pfp.fw +qcom/a650_gmu.bin +qcom/yamato_pm4.fw +qcom/a300_pfp.fw +qcom/qrb4210/cdspr.jsn +qcom/qrb4210/cdsp.mbn +qcom/qrb4210/modemuw.jsn +qcom/qrb4210/modemr.jsn +qcom/qrb4210/adsp.mbn +qcom/qrb4210/adspr.jsn +qcom/qrb4210/adsps.jsn +qcom/qrb4210/modem.mbn +qcom/qrb4210/wlanmdsp.mbn +qcom/qrb4210/adspua.jsn +qcom/qrb4210/a610_zap.mbn +qcom/venus-4.2/venus.mbn +qcom/venus-4.2/venus.mdt +qcom/leia_pm4_470.fw +qcom/sc8280xp/LENOVO/21BX/audioreach-tplg.bin +qcom/sc8280xp/LENOVO/21BX/cdspr.jsn +qcom/sc8280xp/LENOVO/21BX/qcdxkmsuc8280.mbn +qcom/sc8280xp/LENOVO/21BX/qcadsp8280.mbn +qcom/sc8280xp/LENOVO/21BX/adspr.jsn +qcom/sc8280xp/LENOVO/21BX/qccdsp8280.mbn +qcom/sc8280xp/LENOVO/21BX/qcslpi8280.mbn +qcom/sc8280xp/LENOVO/21BX/battmgr.jsn +qcom/sc8280xp/LENOVO/21BX/adspua.jsn +qcom/sc8280xp/SC8280XP-LENOVO-X13S-tplg.bin +qcom/a330_pfp.fw +qcom/a530_pfp.fw +qcom/sm8250/cdspr.jsn +qcom/sm8250/cdsp.mbn +qcom/sm8250/adsp.mbn +qcom/sm8250/adspr.jsn +qcom/sm8250/adspua.jsn +qcom/sm8250/a650_zap.mbn +qcom/sm8250/Thundercomm/RB5/slpi.mbn +qcom/sm8250/Thundercomm/RB5/slpius.jsn +qcom/sm8250/Thundercomm/RB5/slpir.jsn +qcom/venus-6.0/venus.mbn +qcom/a530_zap.mdt +qcom/a660_gmu.bin +qcom/a530_pm4.fw +qcom/sm8550/SM8550-HDK-tplg.bin +qcom/sm8550/SM8550-QRD-tplg.bin +qcom/a630_sqe.fw +qcom/leia_pfp_470.fw +qcom/a630_gmu.bin +qcom/a330_pm4.fw +qcom/qcm2290/a702_zap.mbn +qcom/qcm2290/modemuw.jsn +qcom/qcm2290/modemr.jsn +qcom/qcm2290/adsp.mbn +qcom/qcm2290/adspr.jsn +qcom/qcm2290/adsps.jsn +qcom/qcm2290/modem.mbn +qcom/qcm2290/wlanmdsp.mbn +qcom/qcm2290/adspua.jsn +qcom/sdm845/mba.mbn +qcom/sdm845/cdspr.jsn +qcom/sdm845/cdsp.mbn +qcom/sdm845/modemuw.jsn +qcom/sdm845/adsp.mbn +qcom/sdm845/adspr.jsn +qcom/sdm845/modem.mbn +qcom/sdm845/modem_nm.mbn +qcom/sdm845/wlanmdsp.mbn +qcom/sdm845/adspua.jsn +qcom/sdm845/a630_zap.mbn +qcom/sdm845/Thundercomm/db845c/slpi.mbn +qcom/sdm845/Thundercomm/db845c/slpius.jsn +qcom/sdm845/Thundercomm/db845c/slpir.jsn +qcom/venus-1.8/venus.mbn +qcom/venus-1.8/venus.mdt +qcom/vpu-2.0/venus.mbn +qcom/sm8650/SM8650-MTP-tplg.bin +qcom/sm8650/SM8650-QRD-tplg.bin +qcom/a702_sqe.fw +qcom/a420_pfp.fw +qcom/a300_pm4.fw +qcom/vpu-1.0/venus.mbn +qcom/vpu-1.0/venus.mdt +qcom/aic100/fw5.bin +qcom/aic100/fw9.bin +qcom/aic100/sbl.bin +qcom/aic100/fw1.bin +qcom/aic100/fw10.bin +qcom/aic100/fw2.bin +qed/qed_init_values-8.33.12.0.bin +qed/qed_init_values_zipped-8.10.5.0.bin +qed/qed_init_values_zipped-8.20.0.0.bin +qed/qed_init_values-8.18.9.0.bin +qed/qed_init_values-8.20.0.0.bin +qed/qed_init_values_zipped-8.33.1.0.bin +qed/qed_init_values-8.37.7.0.bin +qed/qed_init_values-8.40.33.0.bin +qed/qed_init_values-8.10.9.0.bin +qed/qed_init_values_zipped-8.7.3.0.bin +qed/qed_init_values_zipped-8.33.11.0.bin +qed/qed_init_values_zipped-8.10.10.0.bin +qed/qed_init_values-8.14.6.0.bin +qed/qed_init_values_zipped-8.42.2.0.bin +qed/qed_init_values_zipped-8.4.2.0.bin +qed/qed_init_values_zipped-8.59.1.0.bin +qed/qed_init_values_zipped-8.15.3.0.bin +qed/qed_init_values-8.30.12.0.bin +qed/qed_init_values_zipped-8.37.7.0.bin +qed/qed_init_values_zipped-8.37.2.0.bin +ql2100_fw.bin +ql2200_fw.bin +ql2300_fw.bin +ql2322_fw.bin +ql2400_fw.bin +ql2500_fw.bin +qlogic/sd7220.fw +qlogic/1040.bin +qlogic/1280.bin +qlogic/12160.bin +r128/r128_cce.bin +r8a779x_usb3_v1.dlmem +r8a779x_usb3_v2.dlmem +r8a779x_usb3_v3.dlmem +radeon/RV730_pfp.bin +radeon/RV710_me.bin +radeon/oland_smc.bin +radeon/bonaire_sdma1.bin +radeon/OLAND_me.bin +radeon/pitcairn_mc.bin +radeon/HAINAN_me.bin +radeon/mullins_pfp.bin +radeon/KAVERI_mec.bin +radeon/RS690_cp.bin +radeon/RV620_pfp.bin +radeon/HAINAN_smc.bin +radeon/pitcairn_me.bin +radeon/CEDAR_pfp.bin +radeon/SUMO_rlc.bin +radeon/RV770_pfp.bin +radeon/JUNIPER_me.bin +radeon/ARUBA_rlc.bin +radeon/HAWAII_mc2.bin +radeon/bonaire_uvd.bin +radeon/MULLINS_pfp.bin +radeon/hawaii_ce.bin +radeon/VERDE_mc.bin +radeon/kabini_sdma1.bin +radeon/VERDE_pfp.bin +radeon/RS780_uvd.bin +radeon/SUMO2_me.bin +radeon/verde_ce.bin +radeon/RV630_me.bin +radeon/OLAND_pfp.bin +radeon/bonaire_pfp.bin +radeon/BONAIRE_mc2.bin +radeon/hainan_ce.bin +radeon/R600_pfp.bin +radeon/kabini_mec.bin +radeon/KABINI_rlc.bin +radeon/tahiti_mc.bin +radeon/PITCAIRN_mc2.bin +radeon/HAWAII_rlc.bin +radeon/kaveri_ce.bin +radeon/SUMO_uvd.bin +radeon/CYPRESS_smc.bin +radeon/HAWAII_smc.bin +radeon/RV635_me.bin +radeon/HAWAII_mec.bin +radeon/tahiti_me.bin +radeon/OLAND_rlc.bin +radeon/KABINI_mec.bin +radeon/TURKS_mc.bin +radeon/KAVERI_me.bin +radeon/mullins_vce.bin +radeon/MULLINS_rlc.bin +radeon/VERDE_ce.bin +radeon/hawaii_me.bin +radeon/kabini_ce.bin +radeon/kabini_rlc.bin +radeon/CEDAR_rlc.bin +radeon/CEDAR_me.bin +radeon/HAINAN_rlc.bin +radeon/REDWOOD_pfp.bin +radeon/verde_rlc.bin +radeon/RV770_me.bin +radeon/pitcairn_smc.bin +radeon/hawaii_pfp.bin +radeon/kaveri_pfp.bin +radeon/R600_uvd.bin +radeon/VERDE_rlc.bin +radeon/KABINI_ce.bin +radeon/oland_rlc.bin +radeon/CAYMAN_pfp.bin +radeon/TAHITI_vce.bin +radeon/BARTS_me.bin +radeon/TAHITI_pfp.bin +radeon/BONAIRE_pfp.bin +radeon/JUNIPER_rlc.bin +radeon/bonaire_rlc.bin +radeon/verde_k_smc.bin +radeon/REDWOOD_rlc.bin +radeon/oland_me.bin +radeon/R200_cp.bin +radeon/pitcairn_ce.bin +radeon/BARTS_pfp.bin +radeon/MULLINS_mec.bin +radeon/tahiti_rlc.bin +radeon/PITCAIRN_smc.bin +radeon/PITCAIRN_pfp.bin +radeon/kaveri_rlc.bin +radeon/BONAIRE_uvd.bin +radeon/REDWOOD_smc.bin +radeon/R300_cp.bin +radeon/bonaire_smc.bin +radeon/TAHITI_mc.bin +radeon/RV730_smc.bin +radeon/pitcairn_k_smc.bin +radeon/RV610_me.bin +radeon/tahiti_pfp.bin +radeon/pitcairn_pfp.bin +radeon/hawaii_uvd.bin +radeon/CEDAR_smc.bin +radeon/hainan_smc.bin +radeon/PITCAIRN_mc.bin +radeon/mullins_mec.bin +radeon/REDWOOD_me.bin +radeon/VERDE_me.bin +radeon/kabini_vce.bin +radeon/BTC_rlc.bin +radeon/PALM_pfp.bin +radeon/hawaii_k_smc.bin +radeon/kaveri_mec.bin +radeon/CAICOS_pfp.bin +radeon/SUMO_me.bin +radeon/bonaire_me.bin +radeon/TAHITI_ce.bin +radeon/BARTS_mc.bin +radeon/hawaii_sdma1.bin +radeon/VERDE_smc.bin +radeon/pitcairn_rlc.bin +radeon/KABINI_me.bin +radeon/OLAND_mc2.bin +radeon/JUNIPER_pfp.bin +radeon/bonaire_vce.bin +radeon/R700_rlc.bin +radeon/CAICOS_mc.bin +radeon/bonaire_mec.bin +radeon/HAWAII_mc.bin +radeon/RV630_pfp.bin +radeon/ARUBA_me.bin +radeon/bonaire_sdma.bin +radeon/BONAIRE_ce.bin +radeon/RV610_pfp.bin +radeon/KABINI_pfp.bin +radeon/kabini_sdma.bin +radeon/RV770_smc.bin +radeon/MULLINS_ce.bin +radeon/kaveri_uvd.bin +radeon/CYPRESS_uvd.bin +radeon/verde_pfp.bin +radeon/BONAIRE_mc.bin +radeon/hawaii_smc.bin +radeon/BONAIRE_vce.bin +radeon/mullins_me.bin +radeon/mullins_sdma1.bin +radeon/kaveri_mec2.bin +radeon/CAYMAN_rlc.bin +radeon/oland_pfp.bin +radeon/R100_cp.bin +radeon/OLAND_mc.bin +radeon/TURKS_smc.bin +radeon/hainan_me.bin +radeon/RV710_pfp.bin +radeon/R420_cp.bin +radeon/KAVERI_ce.bin +radeon/R600_rlc.bin +radeon/verde_mc.bin +radeon/kaveri_sdma.bin +radeon/kaveri_vce.bin +radeon/OLAND_ce.bin +radeon/RV710_uvd.bin +radeon/HAWAII_sdma.bin +radeon/SUMO_pfp.bin +radeon/JUNIPER_smc.bin +radeon/RV710_smc.bin +radeon/bonaire_mc.bin +radeon/R520_cp.bin +radeon/kaveri_sdma1.bin +radeon/kabini_uvd.bin +radeon/CYPRESS_rlc.bin +radeon/HAWAII_pfp.bin +radeon/kaveri_me.bin +radeon/tahiti_ce.bin +radeon/BONAIRE_sdma.bin +radeon/CAYMAN_me.bin +radeon/BONAIRE_mec.bin +radeon/R600_me.bin +radeon/HAWAII_me.bin +radeon/CAICOS_smc.bin +radeon/hainan_k_smc.bin +radeon/HAINAN_mc.bin +radeon/TAHITI_smc.bin +radeon/hawaii_mec.bin +radeon/PITCAIRN_me.bin +radeon/RV620_me.bin +radeon/RV670_pfp.bin +radeon/RV770_uvd.bin +radeon/KABINI_sdma.bin +radeon/CYPRESS_me.bin +radeon/si58_mc.bin +radeon/OLAND_smc.bin +radeon/hainan_mc.bin +radeon/bonaire_ce.bin +radeon/PALM_me.bin +radeon/oland_ce.bin +radeon/RV670_me.bin +radeon/SUMO2_pfp.bin +radeon/verde_smc.bin +radeon/BARTS_smc.bin +radeon/hawaii_mc.bin +radeon/CAYMAN_smc.bin +radeon/CYPRESS_pfp.bin +radeon/RV635_pfp.bin +radeon/oland_k_smc.bin +radeon/VERDE_mc2.bin +radeon/BONAIRE_me.bin +radeon/hawaii_sdma.bin +radeon/RS780_pfp.bin +radeon/TURKS_pfp.bin +radeon/RS780_me.bin +radeon/HAINAN_pfp.bin +radeon/tahiti_k_smc.bin +radeon/mullins_rlc.bin +radeon/TAHITI_mc2.bin +radeon/CAYMAN_mc.bin +radeon/MULLINS_sdma.bin +radeon/mullins_uvd.bin +radeon/RV740_smc.bin +radeon/TAHITI_rlc.bin +radeon/HAWAII_ce.bin +radeon/oland_mc.bin +radeon/PITCAIRN_ce.bin +radeon/tahiti_smc.bin +radeon/hainan_pfp.bin +radeon/hainan_rlc.bin +radeon/TAHITI_uvd.bin +radeon/KAVERI_sdma.bin +radeon/mullins_sdma.bin +radeon/HAINAN_mc2.bin +radeon/KAVERI_rlc.bin +radeon/CAICOS_me.bin +radeon/KAVERI_pfp.bin +radeon/bonaire_k_smc.bin +radeon/BONAIRE_smc.bin +radeon/RS600_cp.bin +radeon/hawaii_rlc.bin +radeon/TAHITI_me.bin +radeon/verde_me.bin +radeon/hawaii_vce.bin +radeon/MULLINS_me.bin +radeon/kabini_me.bin +radeon/TURKS_me.bin +radeon/RV730_me.bin +radeon/BONAIRE_rlc.bin +radeon/banks_k_2_smc.bin +radeon/mullins_ce.bin +radeon/HAINAN_ce.bin +radeon/PITCAIRN_rlc.bin +radeon/ARUBA_pfp.bin +radeon/kabini_pfp.bin +rockchip/dptx.bin +rp2.fw +rsi/rs9113_wlan_bt_dual_mode.rps +rsi/rs9116_wlan_bt_classic.rps +rsi/rs9113_ap_bt_dual_mode.rps +rsi/rs9113_wlan_qspi.rps +rsi/rs9116_wlan.rps +rsi_91x.fw +rt2561.bin +rt2561s.bin +rt2661.bin +rt2860.bin +rt2870.bin +rt3070.bin +rt3071.bin +rt3090.bin +rt3290.bin +rt73.bin +rtl_bt/rtl8723bs_config-OBDA8723.bin +rtl_bt/rtl8852bu_config.bin +rtl_bt/rtl8852au_config.bin +rtl_bt/rtl8761b_config.bin +rtl_bt/rtl8852btu_config.bin +rtl_bt/rtl8821c_fw.bin +rtl_bt/rtl8761b_fw.bin +rtl_bt/rtl8822cs_fw.bin +rtl_bt/rtl8812ae_fw.bin +rtl_bt/rtl8852cu_fw.bin +rtl_bt/rtl8852btu_fw.bin +rtl_bt/rtl8822cu_config.bin +rtl_bt/rtl8723bs_fw.bin +rtl_bt/rtl8821a_fw.bin +rtl_bt/rtl8192eu_fw.bin +rtl_bt/rtl8723a_fw.bin +rtl_bt/rtl8822cs_config.bin +rtl_bt/rtl8723bs_config-OBDA0623.bin +rtl_bt/rtl8821cs_config.bin +rtl_bt/rtl8821a_config.bin +rtl_bt/rtl8761bu_config.bin +rtl_bt/rtl8851bu_config.bin +rtl_bt/rtl8723d_config.bin +rtl_bt/rtl8851bu_fw.bin +rtl_bt/rtl8192ee_fw.bin +rtl_bt/rtl8852cu_fw_v2.bin +rtl_bt/rtl8761a_fw.bin +rtl_bt/rtl8822b_config.bin +rtl_bt/rtl8821c_config.bin +rtl_bt/rtl8822cu_fw.bin +rtl_bt/rtl8822b_fw.bin +rtl_bt/rtl8761bu_fw.bin +rtl_bt/rtl8723d_fw.bin +rtl_bt/rtl8852au_fw.bin +rtl_bt/rtl8821cs_fw.bin +rtl_bt/rtl8852bu_fw.bin +rtl_bt/rtl8852cu_config.bin +rtl_bt/rtl8723b_fw.bin +rtl_nic/rtl8168g-1.fw +rtl_nic/rtl8106e-1.fw +rtl_nic/rtl8402-1.fw +rtl_nic/rtl8153a-2.fw +rtl_nic/rtl8156a-2.fw +rtl_nic/rtl8153b-2.fw +rtl_nic/rtl8153a-3.fw +rtl_nic/rtl8106e-2.fw +rtl_nic/rtl8168f-1.fw +rtl_nic/rtl8105e-1.fw +rtl_nic/rtl8107e-2.fw +rtl_nic/rtl8153c-1.fw +rtl_nic/rtl8153a-4.fw +rtl_nic/rtl8107e-1.fw +rtl_nic/rtl8156b-2.fw +rtl_nic/rtl8125b-1.fw +rtl_nic/rtl8168g-3.fw +rtl_nic/rtl8168h-2.fw +rtl_nic/rtl8125a-3.fw +rtl_nic/rtl8168d-1.fw +rtl_nic/rtl8168e-2.fw +rtl_nic/rtl8168e-3.fw +rtl_nic/rtl8125b-2.fw +rtl_nic/rtl8126a-2.fw +rtl_nic/rtl8168fp-3.fw +rtl_nic/rtl8168e-1.fw +rtl_nic/rtl8168f-2.fw +rtl_nic/rtl8168d-2.fw +rtl_nic/rtl8168h-1.fw +rtl_nic/rtl8411-1.fw +rtl_nic/rtl8411-2.fw +rtl_nic/rtl8168g-2.fw +rtlwifi/rtl8192cfw.bin +rtlwifi/rtl8822befw.bin +rtlwifi/rtl8723bu_nic.bin +rtlwifi/rtl8192defw.bin +rtlwifi/rtl8723fw.bin +rtlwifi/rtl8723aufw_A.bin +rtlwifi/rtl8723aufw_B_NoBT.bin +rtlwifi/rtl8192fufw.bin +rtlwifi/rtl8723befw_36.bin +rtlwifi/rtl8821aefw.bin +rtlwifi/rtl8188fufw.bin +rtlwifi/rtl8192eu_nic.bin +rtlwifi/rtl8821aefw_wowlan.bin +rtlwifi/rtl8723fw_B.bin +rtlwifi/rtl8192cfwU.bin +rtlwifi/rtl8192cufw.bin +rtlwifi/rtl8192cfwU_B.bin +rtlwifi/rtl8192eu_wowlan.bin +rtlwifi/rtl8710bufw_SMIC.bin +rtlwifi/rtl8723bu_ap_wowlan.bin +rtlwifi/rtl8812aefw_wowlan.bin +rtlwifi/rtl8821aefw_29.bin +rtlwifi/rtl8712u.bin +rtlwifi/rtl8723bs_nic.bin +rtlwifi/rtl8710bufw_UMC.bin +rtlwifi/rtl8192sefw.bin +rtlwifi/rtl8188eufw.bin +rtlwifi/rtl8188efw.bin +rtlwifi/rtl8723defw.bin +rtlwifi/rtl8723bs_ap_wowlan.bin +rtlwifi/rtl8192eefw.bin +rtlwifi/rtl8723bu_wowlan.bin +rtlwifi/rtl8192cufw_A.bin +rtlwifi/rtl8723bs_wowlan.bin +rtlwifi/rtl8192eu_ap_wowlan.bin +rtlwifi/rtl8723befw.bin +rtlwifi/rtl8723bs_bt.bin +rtlwifi/rtl8192cufw_TMSC.bin +rtlwifi/rtl8812aefw.bin +rtlwifi/rtl8192cufw_B.bin +rtlwifi/rtl8723aufw_B.bin +rtw88/rtw8822b_fw.bin +rtw88/rtw8821c_fw.bin +rtw88/rtw8821a_fw.bin +rtw88/rtw8703b_fw.bin +rtw88/rtw8703b_wow_fw.bin +rtw88/rtw8723d_fw.bin +rtw88/rtw8822c_fw.bin +rtw88/rtw8822c_wow_fw.bin +rtw88/README +rtw89/rtw8851b_fw.bin +rtw89/rtw8922a_fw.bin +rtw89/rtw8852b_fw.bin +rtw89/rtw8852c_fw.bin +rtw89/rtw8852a_fw.bin +rtw89/rtw8852b_fw-1.bin +s2250.fw +s2250_loader.fw +s5p-mfc-v12.fw +s5p-mfc-v6-v2.fw +s5p-mfc-v6.fw +s5p-mfc-v7.fw +s5p-mfc-v8.fw +s5p-mfc.fw +sdd_sagrad_1091_1098.bin +slicoss/oasisdownload.sys +slicoss/gbdownload.sys +slicoss/oasisdbgdownload.sys +slicoss/gbrcvucode.sys +slicoss/oasisrcvucode.sys +sms1xxx-hcw-55xxx-dvbt-02.fw +sms1xxx-hcw-55xxx-isdbt-02.fw +sms1xxx-nova-a-dvbt-01.fw +sms1xxx-nova-b-dvbt-01.fw +sms1xxx-stellar-dvbt-01.fw +sxg/saharadownloadB.sys +sxg/saharadbgdownloadB.sys +tdmb_nova_12mhz.inp +tehuti/bdx.bin +ti/vpdma-1b8.bin +ti/tas2563/TAS2XXX3870.bin +ti/tas2563/INT8866RCA2.bin +ti/tas2781/TAS2XXX38B9.bin +ti/tas2781/TAS2XXX38D3.bin +ti/tas2781/TAS2XXX38A5.bin +ti/tas2781/TIAS2781RCA2.bin +ti/tas2781/TAS2XXX38DF.bin +ti/tas2781/TAS2XXX38A8.bin +ti/tas2781/TAS2XXX3886.bin +ti/tas2781/TAS2XXX38BE.bin +ti/tas2781/TAS2XXX3884.bin +ti/tas2781/TAS2XXX38BB.bin +ti/tas2781/TAS2XXX38D6.bin +ti/tas2781/TAS2XXX3880.bin +ti/tas2781/TAS2XXX387F.bin +ti/tas2781/TAS2XXX38D5.bin +ti/tas2781/TAS2XXX38D4.bin +ti/tas2781/TAS2XXX3881.bin +ti/tas2781/TAS2XXX38E0.bin +ti/tas2781/TAS2XXX38C3.bin +ti/tas2781/TAS2XXX38BF.bin +ti/tas2781/TAS2XXX3882.bin +ti/tas2781/TAS2XXX387D.bin +ti/tas2781/TAS2XXX387E.bin +ti/tas2781/TAS2XXX38CB.bin +ti/tas2781/TAS2XXX38B8.bin +ti/tas2781/TAS2XXX38BA.bin +ti/tas2781/TIAS2781RCA4.bin +ti/tas2781/TAS2XXX38A7.bin +ti/tas2781/TAS2XXX38CD.bin +ti/tas2781/TAS2XXX2234.bin +ti-connectivity/TIInit_7.2.31.bts +ti-connectivity/wl128x-fw-4-sr.bin +ti-connectivity/TIInit_6.6.15.bts +ti-connectivity/wl1271-fw-ap.bin +ti-connectivity/wl128x-fw-ap.bin +ti-connectivity/wl127x-fw-5-sr.bin +ti-connectivity/cc33xx_2nd_loader.bin +ti-connectivity/wl128x-fw-4-plt.bin +ti-connectivity/cc33xx_fw.bin +ti-connectivity/cc33xx-conf.bin +ti-connectivity/wl127x-nvs.bin +ti-connectivity/wl127x-fw-4-plt.bin +ti-connectivity/wl1251-fw.bin +ti-connectivity/wl128x-nvs.bin +ti-connectivity/wl12xx-nvs.bin +ti-connectivity/wl128x-fw.bin +ti-connectivity/wl127x-fw-4-sr.bin +ti-connectivity/wl18xx-fw.bin +ti-connectivity/wl1271-nvs.bin +ti-connectivity/wl128x-fw-3.bin +ti-connectivity/wl128x-fw-plt-3.bin +ti-connectivity/wl127x-fw-5-plt.bin +ti-connectivity/wl128x-fw-5-plt.bin +ti-connectivity/wl128x-fw-5-sr.bin +ti-connectivity/wl1251-nvs.bin +ti-connectivity/wl1271-fw-2.bin +ti-connectivity/wl128x-fw-5-mr.bin +ti-connectivity/wl18xx-fw-4.bin +ti-connectivity/wl127x-fw-5-mr.bin +ti-connectivity/wl18xx-fw-3.bin +ti-connectivity/wl127x-fw-3.bin +ti-connectivity/wl18xx-fw-2.bin +ti-connectivity/wl127x-fw-4-mr.bin +ti-connectivity/TIInit_6.2.31.bts +ti-connectivity/wl127x-fw-plt-3.bin +ti-connectivity/wl128x-fw-4-mr.bin +ti-connectivity/wl1271-fw.bin +ti-keystone/ks2_qmss_pdsp_acc48_k2_le_1_0_0_9.bin +tigon/tg3.bin +tigon/tg3_tso.bin +tigon/tg3_tso5.bin +tigon/tg357766.bin +tlg2300_firmware.bin +tsse_firmware.bin +ueagle-atm/DSPei.bin +ueagle-atm/DSPep.bin +ueagle-atm/CMVepIT.bin +ueagle-atm/DSP9p.bin +ueagle-atm/CMVei.bin +ueagle-atm/eagleIII.fw +ueagle-atm/CMV4p.bin.v2 +ueagle-atm/eagleII.fw +ueagle-atm/DSP9i.bin +ueagle-atm/DSP4p.bin +ueagle-atm/CMVepES.bin +ueagle-atm/CMVepFR04.bin +ueagle-atm/CMVeiWO.bin +ueagle-atm/adi930.fw +ueagle-atm/CMV9p.bin +ueagle-atm/CMVep.bin +ueagle-atm/930-fpga.bin +ueagle-atm/CMV9i.bin +ueagle-atm/CMVepES03.bin +ueagle-atm/eagleI.fw +ueagle-atm/eagleIV.fw +ueagle-atm/CMVepWO.bin +ueagle-atm/CMVepFR10.bin +ueagle-atm/CMVepFR.bin +usbdux_firmware.bin +usbduxfast_firmware.bin +usbduxsigma_firmware.bin +v4l-cx231xx-avcore-01.fw +v4l-cx23418-apu.fw +v4l-cx23418-cpu.fw +v4l-cx23418-dig.fw +v4l-cx23885-avcore-01.fw +v4l-cx25840.fw +vntwusb.fw +vpu_d.bin +vpu_p.bin +vxge/X3fw-pxe.ncf +vxge/X3fw.ncf +wfx/wfm_wf200_C0.sec +wfx/brd8023a.pds +wfx/brd8022a.pds +wfx/brd4001a.pds +wil6210.brd +wil6210.fw +wsm_22.bin +xe/lnl_guc_70.bin diff --git a/savedconfig/x11-misc/dmenu-5.2 b/savedconfig/x11-misc/dmenu-5.2 @@ -0,0 +1,24 @@ +/* See LICENSE file for copyright and license details. */ +/* Default settings; can be overriden by command line. */ + +static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ +/* -fn option overrides fonts[0]; default X11 font or font set */ +static const char *fonts[] = { + "monospace:size=10" +}; +static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *colors[SchemeLast][2] = { + /* fg bg */ + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, + [SchemeHp] = { "#bbbbbb", "#333333" }, +}; +/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ +static unsigned int lines = 0; + +/* + * Characters not considered part of a word while deleting words + * for example: " /?\"&[]" + */ +static const char worddelimiters[] = " "; diff --git a/savedconfig/x11-misc/dmenu-5.3 b/savedconfig/x11-misc/dmenu-5.3 @@ -0,0 +1,24 @@ +/* See LICENSE file for copyright and license details. */ +/* Default settings; can be overriden by command line. */ + +static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ +/* -fn option overrides fonts[0]; default X11 font or font set */ +static const char *fonts[] = { + "monospace:size=10" +}; +static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *colors[SchemeLast][2] = { + /* fg bg */ + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, + [SchemeHp] = { "#bbbbbb", "#333333" } +}; +/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ +static unsigned int lines = 0; + +/* + * Characters not considered part of a word while deleting words + * for example: " /?\"&[]" + */ +static const char worddelimiters[] = " "; diff --git a/savedconfig/x11-terms/st-0.9 b/savedconfig/x11-terms/st-0.9 @@ -0,0 +1,482 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=14:antialias=true:autohint=true"; +static int borderpx = 2; + +/* + * background image + * expects farbfeld format + * pseudo transparency fixes coordinates to the screen origin + */ +static const char *bgfile = "/home/plat/st_wall.ff"; +static const int pseudotransparency = 1; + +/* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e + * 2: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = NULL; +char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; + +/* identification sequence returned in DA and DECID */ +char *vtiden = "\033[?6c"; + +/* Kerning / character bounding-box multipliers */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * near minlatency, but it waits longer for slow updates to avoid partial draw. + * low minlatency will tear/flicker more, as it can "detect" idle too early. + */ +static double minlatency = 8; +static double maxlatency = 33; + +/* + * blinking timeout (set to 0 to disable blinking) for the terminal blinking + * attribute. + */ +static unsigned int blinktimeout = 800; + +/* + * thickness of underline and bar cursors + */ +static unsigned int cursorthickness = 2; + +/* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it + */ +static int bellvolume = 0; + +/* default TERM value */ +char *termname = "st-256color"; + +/* + * spaces per tab + * + * When you are changing this value, don't forget to adapt the »it« value in + * the st.info and appropriately install the st.info in the environment where + * you use this st version. + * + * it#$tabspaces, + * + * Secondly make sure your kernel is not expanding tabs. When running `stty + * -a` »tab0« should appear. You can tell the terminal to not expand tabs by + * running following command: + * + * stty tabs + */ +unsigned int tabspaces = 8; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#cccccc", + "#555555", + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 258; +unsigned int defaultbg = 259; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * Default columns and rows numbers + */ + +static unsigned int cols = 80; +static unsigned int rows = 24; + +/* + * Default colour and shape of the mouse cursor + */ +static unsigned int mouseshape = XC_xterm; +static unsigned int mousefg = 7; +static unsigned int mousebg = 0; + +/* + * Color used to display font attributes when fontconfig selected a font which + * doesn't match the ones requested. + */ +static unsigned int defaultattr = 11; + +/* + * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). + * Note that if you want to use ShiftMask with selmasks, set this to an other + * modifier, set to 0 to not use it. + */ +static uint forcemousemod = ShiftMask; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +static Shortcut shortcuts[] = { + /* mask keysym function argument */ + { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, + { ControlMask, XK_Print, toggleprinter, {.i = 0} }, + { ShiftMask, XK_Print, printscreen, {.i = 0} }, + { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, + { TERMMOD, XK_Prior, zoom, {.f = +1} }, + { TERMMOD, XK_Next, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, +}; + +/* + * Special keys (change & recompile st.info accordingly) + * + * Mask value: + * * Use XK_ANY_MOD to match the key no matter modifiers state + * * Use XK_NO_MOD to match the key alone (no modifiers) + * appkey value: + * * 0: no value + * * > 0: keypad application mode enabled + * * = 2: term.numlock = 1 + * * < 0: keypad application mode disabled + * appcursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * + * Be careful with the order of the definitions because st searches in + * this table sequentially, so any XK_ANY_MOD must be in the last + * position for a key. + */ + +/* + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +static KeySym mappedkeys[] = { -1 }; + +/* + * State bits to ignore when matching key or button events. By default, + * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. + */ +static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; + +/* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ +static Key key[] = { + /* keysym mask string appkey appcursor */ + { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, + { XK_KP_End, ControlMask, "\033[J", -1, 0}, + { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_KP_End, ShiftMask, "\033[K", -1, 0}, + { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, + { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, + { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, + { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, + { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, + { XK_Up, ControlMask, "\033[1;5A", 0, 0}, + { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, + { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, + { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, + { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, + { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, + { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, + { XK_Down, ControlMask, "\033[1;5B", 0, 0}, + { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, + { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, + { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, + { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, + { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, + { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, + { XK_Left, ControlMask, "\033[1;5D", 0, 0}, + { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, + { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, + { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, + { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, + { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, + { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, + { XK_Right, ControlMask, "\033[1;5C", 0, 0}, + { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, + { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, + { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, + { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, + { XK_Return, Mod1Mask, "\033\r", 0, 0}, + { XK_Return, XK_ANY_MOD, "\r", 0, 0}, + { XK_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_Insert, ControlMask, "\033[L", -1, 0}, + { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_Delete, ControlMask, "\033[M", -1, 0}, + { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, + { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, + { XK_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_End, ControlMask, "\033[J", -1, 0}, + { XK_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_End, ShiftMask, "\033[K", -1, 0}, + { XK_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, + { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_Next, ControlMask, "\033[6;5~", 0, 0}, + { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, + { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, + { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, + { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, + { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, + { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, + { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, + { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, + { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, + { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, + { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, + { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, + { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, + { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, + { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, + { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, + { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, + { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, + { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, + { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, + { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, + { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, + { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, + { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, + { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, + { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, + { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, + { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, + { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, + { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, + { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, + { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, + { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, + { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, + { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, + { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, + { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, + { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, + { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, + { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, + { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, + { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, + { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, + { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, + { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, + { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, + { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, + { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, + { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, + { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, + { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, + { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, + { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, + { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, + { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, + { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, + { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, + { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, + { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, + { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, + { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, + { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, + { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, + { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, + { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, + { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, + { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, + { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, + { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, + { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, + { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, + { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, + { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, + { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, + { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, + { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, + { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, + { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, + { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, + { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, + { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, + { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, + { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, + { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, + { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, + { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, +}; + +/* + * Selection types' masks. + * Use the same masks as usual. + * Button1Mask is always unset, to make masks match between ButtonPress. + * ButtonRelease and MotionNotify. + * If no match is found, regular selection is used. + */ +static uint selmasks[] = { + [SEL_RECTANGULAR] = Mod1Mask, +}; + +/* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/savedconfig/x11-wm/dwm-6.4 b/savedconfig/x11-wm/dwm-6.4 @@ -0,0 +1,124 @@ +/* See LICENSE file for copyright and license details. */ + +/* alt-tab configuration */ +static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/ +static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */ +static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */ +static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */ +static const unsigned int maxWTab = 600; /* tab menu width */ +static const unsigned int maxHTab = 200; /* tab menu height */ + +/* appearance */ +static const unsigned int borderpx = 0; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 0; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#ce4404"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[M]", monocle }, + { "><>", NULL }, /* no layout function means floating behavior */ + { "[]=", tile }, /* first entry is default */ +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; + +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY, XK_space, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_q, view, {0} }, + { MODKEY, XK_c, killclient, {0} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { Mod1Mask, XK_Tab, altTabStart, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/savedconfig/x11-wm/dwm-6.5 b/savedconfig/x11-wm/dwm-6.5 @@ -0,0 +1,158 @@ +/* See LICENSE file for copyright and license details. */ + +#define ICONSIZE 20 /* icon size in pixels */ +#define ICONSPACING 5 /* space (pixels) between icon and title */ + +/* alt-tab configuration */ +static const unsigned int tabModKey = 0x40; /* if this key is hold the alt-tab functionality stays acitve. This key must be the same as key that is used to active functin altTabStart `*/ +static const unsigned int tabCycleKey = 0x17; /* if this key is hit the alt-tab program moves one position forward in clients stack. This key must be the same as key that is used to active functin altTabStart */ +static const unsigned int tabPosY = 1; /* tab position on Y axis, 0 = bottom, 1 = center, 2 = top */ +static const unsigned int tabPosX = 1; /* tab position on X axis, 0 = left, 1 = center, 2 = right */ +static const unsigned int maxWTab = 600; /* tab menu width */ +static const unsigned int maxHTab = 200; /* tab menu height */ + +/* appearance */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int gappx = 5; /* gaps between windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=12", "fontawesome:size=12" }; +static const char dmenufont[] = "monospace:size=12"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#ce4404"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "₁", "₂", "₃", "₄", "₅", "₆", "₇", "₈", "₉" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "st", NULL, "MP3", 1 << 5, 0, -1 }, + { "mpv", NULL, "MPV", 1 << 6, 0, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[M]", monocle }, + { "><>", NULL }, /* no layout function means floating behavior */ + { "[]=", tile }, /* first entry is default */ +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, "-hp", "qutebrowser,discord,steam", NULL }; +static const char *termcmd[] = { "st", NULL }; +static const char *sc[] = { "sc", NULL }; +static const char *vimator[] = { "vimator", NULL }; +static const char *altl[] = { "altl", NULL }; +static const char *musplus[] = { "musplus", NULL }; +static const char *musminus[] = { "musminus", NULL }; +static const char *altspace[] = { "altspace", NULL }; +static const char *altnine[] = { "altnine", NULL }; +static const char *altzero[] = { "altzero", NULL }; +static const char *altq[] = { "altq", NULL }; +static const char *altb[] = { "altb", NULL }; +static const char *alts[] = { "alts", NULL }; +static const char *alto[] = { "alto", NULL }; + + +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY, XK_space, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_q, view, {0} }, + { MODKEY, XK_c, killclient, {0} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_s, spawn, {.v = sc } }, + { MODKEY, XK_a, spawn, {.v = vimator } }, + { Mod1Mask, XK_l, spawn, {.v = altl } }, + { Mod1Mask, XK_period, spawn, {.v = musplus } }, + { Mod1Mask, XK_comma, spawn, {.v = musminus } }, + { Mod1Mask, XK_space, spawn, {.v = altspace } }, + { Mod1Mask, XK_9, spawn, {.v = altnine } }, + { Mod1Mask, XK_0, spawn, {.v = altzero } }, + { Mod1Mask, XK_q, spawn, {.v = altq } }, + { Mod1Mask|ShiftMask, XK_period, spawn, {.v = altb } }, + { Mod1Mask|ShiftMask, XK_comma, spawn, {.v = alts } }, + { Mod1Mask, XK_o, spawn, {.v = alto } }, + { Mod1Mask, XK_Tab, altTabStart, {0} }, + { MODKEY, XK_Right, viewnext, {0} }, + { MODKEY, XK_Left, viewprev, {0} }, + { MODKEY|ShiftMask, XK_Right, tagtonext, {0} }, + { MODKEY|ShiftMask, XK_Left, tagtoprev, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/sinit/dtinit b/sinit/dtinit @@ -0,0 +1,2 @@ +#!/bin/sh +exec /var/rc/dtinit/dtinit.sh diff --git a/sinit/sound b/sinit/sound @@ -0,0 +1,27 @@ +#!/bin/sh +alsastatedir=/var/lib/alsa +alsascrdir=/etc/alsa.d +alsahomedir=/run/alsasound +cards="$(sed -n -e 's/^ *\([[:digit:]]*\) .*/\1/p' /proc/asound/cards)" +for cardnum in $cards; do + [ -e /dev/snd/controlC$cardnum ] || sleep 2 + [ -e /dev/snd/controlC$cardnum ] || sleep 2 + [ -e /dev/snd/controlC$cardnum ] || sleep 2 + [ -e /dev/snd/controlC$cardnum ] || sleep 2 + alsactl -E HOME="$alsahomedir" -I -f "$alsastatedir/asound.state" restore $cardnum +done + +for ossfile in "$alsastatedir"/oss/card*_pcm* ; do + [ -e "$ossfile" ] || continue + # We use cat because I'm not sure if cp works properly on /proc + procfile=$ossfile$alsastatedir/oss + procfile="$(echo "$procfile" | sed -e 's,_,/,g')" + if [ -e /proc/asound/"$procfile"/oss ] ; then + cat "$ossfile" > /proc/asound/"$procfile"/oss + fi +done +sleep 3 +chown root:audio /dev/snd/* +chown root:audio /dev/snd +chmod -R a+rw /dev/snd +lk_forever 3600 diff --git a/vimrc b/vimrc @@ -0,0 +1,228 @@ +scriptencoding utf-8 +" ^^ Please leave the above line at the start of the file. + +" Default configuration file for Vim + +" Written by Aron Griffis <agriffis@gentoo.org> +" Modified by Ryan Phillips <rphillips@gentoo.org> +" Modified some more by Ciaran McCreesh <ciaranm@gentoo.org> +" Added Redhat's vimrc info by Seemant Kulleen <seemant@gentoo.org> + +" You can override any of these settings on a global basis via the +" "/etc/vim/vimrc.local" file, and on a per-user basis via "~/.vimrc". You may +" need to create these. + +" {{{ General settings +" The following are some sensible defaults for Vim for most users. +" We attempt to change as little as possible from Vim's defaults, +" deviating only where it makes sense +set nocompatible " Use Vim defaults (much better!) +set bs=2 " Allow backspacing over everything in insert mode +set ai " Always set auto-indenting on +set history=50 " keep 50 lines of command history +set ruler " Show the cursor position all the time + +set viminfo='20,\"500 " Keep a .viminfo file. + +" Don't use Ex mode, use Q for formatting +map Q gq + +" When doing tab completion, give the following files lower priority. You may +" wish to set 'wildignore' to completely ignore files, and 'wildmenu' to enable +" enhanced tab completion. These can be done in the user vimrc file. +set suffixes+=.info,.aux,.log,.dvi,.bbl,.out,.o,.lo + +" When displaying line numbers, don't use an annoyingly wide number column. This +" doesn't enable line numbers -- :set number will do that. The value given is a +" minimum width to use for the number column, not a fixed size. +if v:version >= 700 + set numberwidth=3 +endif +" }}} + +" {{{ Modeline settings +" We don't allow modelines by default. See bug #14088 and bug #73715. +" If you're not concerned about these, you can enable them on a per-user +" basis by adding "set modeline" to your ~/.vimrc file. +set nomodeline +" }}} + +" {{{ Locale settings +" Try to come up with some nice sane GUI fonts. Also try to set a sensible +" value for fileencodings based upon locale. These can all be overridden in +" the user vimrc file. +if v:lang =~? "^ko" + set fileencodings=euc-kr + set guifontset=-*-*-medium-r-normal--16-*-*-*-*-*-*-* +elseif v:lang =~? "^ja_JP" + set fileencodings=euc-jp + set guifontset=-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-* +elseif v:lang =~? "^zh_TW" + set fileencodings=big5 + set guifontset=-sony-fixed-medium-r-normal--16-150-75-75-c-80-iso8859-1,-taipei-fixed-medium-r-normal--16-150-75-75-c-160-big5-0 +elseif v:lang =~? "^zh_CN" + set fileencodings=gb2312 + set guifontset=*-r-* +endif + +" If we have a BOM, always honour that rather than trying to guess. +if &fileencodings !~? "ucs-bom" + set fileencodings^=ucs-bom +endif + +" Always check for UTF-8 when trying to determine encodings. +if &fileencodings !~? "utf-8" + " If we have to add this, the default encoding is not Unicode. + " We use this fact later to revert to the default encoding in plaintext/empty + " files. + let g:added_fenc_utf8 = 1 + set fileencodings+=utf-8 +endif + +" Make sure we have a sane fallback for encoding detection +if &fileencodings !~? "default" + set fileencodings+=default +endif +" }}} + +" {{{ Syntax highlighting settings +" Switch syntax highlighting on, when the terminal has colors +" Also switch on highlighting the last used search pattern. +if &t_Co > 2 || has("gui_running") + syntax on + set hlsearch +endif +" }}} + +" {{{ Terminal fixes +if &term ==? "xterm" + set t_Sb=^[4%dm + set t_Sf=^[3%dm + set ttymouse=xterm2 +endif + +if &term ==? "gnome" && has("eval") + " Set useful keys that vim doesn't discover via termcap but are in the + " builtin xterm termcap. See bug #122562. We use exec to avoid having to + " include raw escapes in the file. + exec "set <C-Left>=\eO5D" + exec "set <C-Right>=\eO5C" +endif +" }}} + +" {{{ Filetype plugin settings +" Enable plugin-provided filetype settings, but only if the ftplugin +" directory exists (which it won't on livecds, for example). +if isdirectory(expand("$VIMRUNTIME/ftplugin")) + filetype plugin on + + " Uncomment the next line (or copy to your ~/.vimrc) for plugin-provided + " indent settings. Some people don't like these, so we won't turn them on by + " default. + " filetype indent on +endif +" }}} + +" {{{ Fix &shell, see bug #101665. +if "" == &shell + if executable("/bin/bash") + set shell=/bin/bash + elseif executable("/bin/sh") + set shell=/bin/sh + endif +endif +"}}} + +" {{{ Our default /bin/sh is bash, not ksh, so syntax highlighting for .sh +" files should default to bash. See :help sh-syntax and bug #101819. +if has("eval") + let is_bash=1 +endif +" }}} + +" {{{ Autocommands +if has("autocmd") + +" let @b='ggVG:norm$bd2bhhda]hx' + +let @a='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/alp:open!ndi(h2xik!!/home/plat/scripts/vima.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g' +let @s='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/smol:open!ndi(h2xik!!/home/plat/scripts/vims.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g' +let @b='S(v%:norm A i 26to33? )lv%:s/ //g$?( :wlvggd/ )vG$da ):w! /tmp/beeg:open!ndi(h2xik!!/home/plat/scripts/vimb.shinoNvjdi 26to3326to3 3:%s/26to33//g:%s/26to3 3//g' +let @c='y:wGopk$dgg:w! /tmp/vimclip:!xclip -sel c /tmp/vimclip:open!' + +augroup gentoo + au! + + " Gentoo-specific settings for ebuilds. These are the federally-mandated + " required tab settings. See the following for more information: + " http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml + " Note that the rules below are very minimal and don't cover everything. + " Better to emerge app-vim/gentoo-syntax, which provides full syntax, + " filetype and indent settings for all things Gentoo. + au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh + au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab + + " In text files, limit the width of text to 78 characters, but be careful + " that we don't override the user's setting. + autocmd BufNewFile,BufRead *.txt + \ if &tw == 0 && ! exists("g:leave_my_textwidth_alone") | + \ setlocal textwidth=78 | + \ endif + + " When editing a file, always jump to the last cursor position + autocmd BufReadPost * + \ if ! exists("g:leave_my_cursor_position_alone") | + \ if line("'\"") > 0 && line ("'\"") <= line("$") | + \ exe "normal! g'\"" | + \ endif | + \ endif + + " When editing a crontab file, set backupcopy to yes rather than auto. See + " :help crontab and bug #53437. + autocmd FileType crontab set backupcopy=yes + + " If we previously detected that the default encoding is not UTF-8 + " (g:added_fenc_utf8), assume that a file with only ASCII characters (or no + " characters at all) isn't a Unicode file, but is in the default encoding. + " Except of course if a byte-order mark is in effect. + autocmd BufReadPost * + \ if exists("g:added_fenc_utf8") && &fileencoding == "utf-8" && + \ ! &bomb && search('[\x80-\xFF]','nw') == 0 && &modifiable | + \ set fileencoding= | + \ endif + +augroup END + +endif " has("autocmd") +" }}} + +" We don't want VIM to load their own built-in defaults, preferring ours here +" instead. This option cannot apply to minimal builds, so it is guarded by a +" test that's guaranteed to fail for those, owing to the lack of +eval. +if 1 + let g:skip_defaults_vim = 1 +endif + +" Enable Omni completion when opening a file only if a specific plugin does +" not already exist for that filetype. This allows Omni completion +" (Ctrl-x/Ctrl-o) to work with any programming language if and only if a syntax +" file exists for the said language. +if exists("+omnifunc") + autocmd Filetype * + \ if &omnifunc == "" | + \ setlocal omnifunc=syntaxcomplete#Complete | + \ endif +endif + +" {{{ vimrc.local +if filereadable("/etc/vim/vimrc.local") + source /etc/vim/vimrc.local +endif +" }}} + +" vim: set fenc=utf-8 tw=80 sw=2 sts=2 et foldmethod=marker : + +let &t_BE = "\[?2004h" +let &t_BD = "\[?2004l" +let &t_PS = "\[200~" +let &t_PE = "\[201~"