mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2025-12-05 02:53:38 -08:00
Compare commits
17 Commits
7378fe9826
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
a93761b042
|
|||
|
a1ec1a54ba
|
|||
|
|
7b7fae9b91 | ||
|
d8a0e95bb5
|
|||
|
154f9e3ea6
|
|||
|
4983623860
|
|||
|
3628e70b72
|
|||
|
31cfb8dd1c
|
|||
|
3fc0b32a9d
|
|||
|
4005e4650e
|
|||
|
3b87c06731
|
|||
|
099d5e8ba6
|
|||
|
21d6320cc1
|
|||
|
|
cb3641a9d9 | ||
|
b2cda94362
|
|||
|
36d458c378
|
|||
|
5ec72352b8
|
@@ -14,12 +14,34 @@
|
||||
################
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Monitors/
|
||||
monitor=DP-1,2560x1440@144,0x0,1
|
||||
monitor=DP-3,2560x1440@144,2560x0,1
|
||||
# monitor=DP-1,2560x1440@144,0x0,1
|
||||
# monitor=DP-3,2560x1440@144,2560x0,1
|
||||
# vrr 2 enables vrr if application is fullscreen
|
||||
# vrr 3 enables vrr if application is fullscreen and video or game content
|
||||
# monitor = DP-1, 3440x1440@240,0x0,1,vrr,3
|
||||
monitorv2 {
|
||||
output = DP-1
|
||||
mode = 3440x1440@240
|
||||
position = 0x0
|
||||
scale = 1
|
||||
vrr = 2
|
||||
cm = srgb
|
||||
# Optional HDR settings
|
||||
# cm = hdr
|
||||
# bitdepth = 10
|
||||
# sdr_min_luminance = 0.005
|
||||
# sdr_max_luminance = 200
|
||||
# min_luminance = 0
|
||||
# max_luminance = 1000
|
||||
# max_avg_luminance = 200
|
||||
# sdrbrightness = 1.2
|
||||
# sdrsaturation = 0.98
|
||||
}
|
||||
|
||||
source = ~/.config/hypr/keybindings.conf
|
||||
source = ~/.config/hypr/windowrules.conf
|
||||
source = ~/.config/hypr/macchiato.conf
|
||||
# source = ~/.config/hypr/env.conf
|
||||
|
||||
# unscale XWayland
|
||||
xwayland {
|
||||
force_zero_scaling = true
|
||||
@@ -46,8 +68,8 @@ $notification_daemon = uwsm app -- swaync -c ~/.config/swaync/config.json
|
||||
# Autostart necessary processes (like notifications daemons, status bars, etc.)
|
||||
# Or execute your favorite apps at launch like this:
|
||||
|
||||
exec-once = uwsm app -sb -- hyprpm update -nn
|
||||
exec-once = uwsm app -sb -- hyprpm reload -nn
|
||||
exec-once = uwsm app -sb -- hyprpm update -n
|
||||
exec-once = uwsm app -sb -- hyprpm reload -n
|
||||
exec-once = $notification_daemon
|
||||
exec-once = $terminal
|
||||
exec-once = uwsm app -sb -S both -t scope -- hyprpm update -nn
|
||||
@@ -166,10 +188,6 @@ animations {
|
||||
# uncomment all if you wish to use that.
|
||||
# workspace = w[tv1], gapsout:0, gapsin:0
|
||||
# workspace = f[1], gapsout:0, gapsin:0
|
||||
# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1]
|
||||
# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1]
|
||||
# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1]
|
||||
# windowrulev2 = rounding 0, floating:0, onworkspace:f[1]
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
|
||||
dwindle {
|
||||
@@ -230,7 +248,8 @@ misc {
|
||||
font_family = JetBrainsMono Nerd Font
|
||||
}
|
||||
|
||||
# {{{ WORKSPACES
|
||||
# {{{ WORKSPACES - HANDLED IN WAYBAR CONFIG
|
||||
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
|
||||
# workspace = name:,monitor:DP-1
|
||||
# workspace = 2,monitor:DP-1,defaultName:
|
||||
# workspace = 2,monitor:DP-1,persistent:false
|
||||
@@ -244,66 +263,9 @@ misc {
|
||||
# workspace = 10,monitor:DP-3,persistent:false
|
||||
# }}}
|
||||
|
||||
# windowrule = match:class my-window, border_size 10
|
||||
|
||||
##############################
|
||||
### WINDOWS AND WORKSPACES ###
|
||||
##############################
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more
|
||||
# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules
|
||||
|
||||
# Example windowrule v1
|
||||
# windowrulev2 = float, class:com.mitchellh.ghostty
|
||||
windowrule = float, class:discord
|
||||
windowrule = float, class:mpv
|
||||
windowrule = float, class:steam
|
||||
windowrule = float, class:anki
|
||||
windowrule = float, class:python, title:Import
|
||||
windowrule = workspace 10 silent, class:discord
|
||||
windowrule = workspace 9 silent, class:steam
|
||||
windowrule = size 2118 1182, class:anki
|
||||
windowrule = workspace 8 silent, class:anki
|
||||
# windowrule = opacity 0.88, class:.* fullscreen:0
|
||||
windowrule = opacity 1.0 override, class:mpv
|
||||
windowrule = opacity 1.0 override, title:(.*)asbplayer
|
||||
windowrule = tile, title:(.*)asbplayer
|
||||
windowrule = opacity 1.0 override, class:^(remote-viewer)$
|
||||
windowrule = opacity 1.0 override, class:com.obsproject.Studio
|
||||
windowrule = opacity 1.0 override, title:(.*)(- YouTube(.*))
|
||||
windowrule = opacity 1.0 override, class:zen, title:(.*)YouTube TV(.*)
|
||||
windowrule = opacity 1.0 override, class:anki
|
||||
|
||||
|
||||
# Example windowrule v2
|
||||
# windowrulev2 = float,class:^(kitty)$,title:^(kitty)$
|
||||
|
||||
# Ignore maximize requests from apps. You'll probably like this.
|
||||
windowrule = suppressevent maximize, class:.*
|
||||
|
||||
# Fix some dragging issues with XWayland
|
||||
windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
|
||||
|
||||
# https://github.com/hyprwm/Hyprland/issues/3835#issuecomment-2004448245
|
||||
windowrule = suppressevent maximize, class:^(zen)$
|
||||
exec-once = $HOME/.local/bin/bitwarden-nofloat.sh
|
||||
# ENABLE_HDR_WSI=1 mpv --vo=gpu-next --target-colorspace-hint --gpu-api=vulkan --gpu-context=waylandvk "filename"
|
||||
|
||||
# {{{ Screen sharing workaround: https://wiki.hyprland.org/Useful-Utilities/Screen-Sharing/#xwayland
|
||||
windowrule = opacity 0.0 override, class:^(xwaylandvideobridge)$
|
||||
windowrule = noanim, class:^(xwaylandvideobridge)$
|
||||
windowrule = noinitialfocus, class:^(xwaylandvideobridge)$
|
||||
windowrule = maxsize 1 1, class:^(xwaylandvideobridge)$
|
||||
windowrule = noblur, class:^(xwaylandvideobridge)$
|
||||
windowrule = nofocus, class:^(xwaylandvideobridge)$
|
||||
# }}}
|
||||
|
||||
|
||||
plugin {
|
||||
split-monitor-workspaces {
|
||||
count = 5
|
||||
keep_focused = 1
|
||||
enable_notifications = 1
|
||||
enable_persistent_workspaces = 1
|
||||
}
|
||||
debug {
|
||||
disable_logs = true
|
||||
enable_stdout_logs = false
|
||||
}
|
||||
|
||||
|
||||
@@ -40,28 +40,28 @@ bind = CTRL+ALT, j, focusmonitor, r
|
||||
bind = CTRL+ALT, k, focusmonitor, l
|
||||
|
||||
# Switch workspaces with mainMod + [0-9]
|
||||
bind = $mainMod, 1, split-workspace, 1
|
||||
bind = $mainMod, 2, split-workspace, 2
|
||||
bind = $mainMod, 3, split-workspace, 3
|
||||
bind = $mainMod, 4, split-workspace, 4
|
||||
bind = $mainMod, 5, split-workspace, 5
|
||||
bind = $mainMod, 6, split-workspace, 6
|
||||
bind = $mainMod, 7, split-workspace, 7
|
||||
bind = $mainMod, 8, split-workspace, 8
|
||||
bind = $mainMod, 9, split-workspace, 9
|
||||
bind = $mainMod, 0, split-workspace, 10
|
||||
bind = $mainMod, 1, workspace, 1
|
||||
bind = $mainMod, 2, workspace, 2
|
||||
bind = $mainMod, 3, workspace, 3
|
||||
bind = $mainMod, 4, workspace, 4
|
||||
bind = $mainMod, 5, workspace, 5
|
||||
bind = $mainMod, 6, workspace, 6
|
||||
bind = $mainMod, 7, workspace, 7
|
||||
bind = $mainMod, 8, workspace, 8
|
||||
bind = $mainMod, 9, workspace, 9
|
||||
bind = $mainMod, 0, workspace, 10
|
||||
|
||||
# Move active window to a workspace with mainMod + SHIFT + [0-9]
|
||||
bind = $mainMod SHIFT, 1, split-movetoworkspacesilent, 1
|
||||
bind = $mainMod SHIFT, 2, split-movetoworkspacesilent, 2
|
||||
bind = $mainMod SHIFT, 3, split-movetoworkspacesilent, 3
|
||||
bind = $mainMod SHIFT, 4, split-movetoworkspacesilent, 4
|
||||
bind = $mainMod SHIFT, 5, split-movetoworkspacesilent, 5
|
||||
bind = $mainMod SHIFT, 6, split-movetoworkspacesilent, 6
|
||||
bind = $mainMod SHIFT, 7, split-movetoworkspacesilent, 7
|
||||
bind = $mainMod SHIFT, 8, split-movetoworkspacesilent, 8
|
||||
bind = $mainMod SHIFT, 9, split-movetoworkspacesilent, 9
|
||||
bind = $mainMod SHIFT, 0, split-movetoworkspacesilent, 10
|
||||
bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1
|
||||
bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2
|
||||
bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3
|
||||
bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4
|
||||
bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5
|
||||
bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6
|
||||
bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7
|
||||
bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8
|
||||
bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9
|
||||
bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10
|
||||
|
||||
# Example special workspace (scratchpad)
|
||||
bind = SUPER, S, togglespecialworkspace, magic
|
||||
@@ -137,3 +137,5 @@ bind = $mainMod, code:117, submap, clean
|
||||
submap = clean
|
||||
bind = $mainMod, code:112, submap, reset
|
||||
submap = reset
|
||||
|
||||
bind = SUPER, l, exec, hyprlock
|
||||
|
||||
Submodule .config/mpv-modules/mpv-anilist-updater updated: a5851c4c0e...8c1630d8e6
Submodule .config/mpv-modules/mpvacious updated: 4a6700e182...9f9e9df06d
@@ -25,6 +25,7 @@ sub-fix-timing=yes
|
||||
sub-ass-override=scale
|
||||
sub-gauss=1.0
|
||||
sub-gray=yes
|
||||
sub-pos=100
|
||||
|
||||
# --- Audio chain ---
|
||||
volume=75
|
||||
@@ -152,11 +153,12 @@ ytdl-raw-options-append=cookies=/truenas/sudacode/japanese/cookies.Japanese.txt
|
||||
ytdl-raw-options-append=sponsorblock-mark=all
|
||||
ytdl-raw-options-append=sponsorblock-remove=sponsor,selfpromo,interaction
|
||||
ytdl-format=bestvideo+bestaudio/best
|
||||
# get subtitles for videos automatically
|
||||
sub-auto=fuzzy
|
||||
slang=ja,jpn,ja.hi,ja.*
|
||||
alang=ja,jpn
|
||||
alang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
|
||||
slang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
|
||||
vlang=ja,jpn
|
||||
subs-with-matching-audio=yes
|
||||
sub-font="Noto Sans CJK JP Regular"
|
||||
glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl"
|
||||
scale=ewa_lanczossharp
|
||||
dither=error-diffusion
|
||||
@@ -164,7 +166,7 @@ deband=yes # Crucial for anime gradients
|
||||
|
||||
[anime-subs]
|
||||
profile-cond=p["slang"] == "ja" or p["slang"] == "ja.hi"
|
||||
sub-font="Noto Sans CJK JP"
|
||||
sub-font="Noto Sans CJK JP Regular"
|
||||
sub-font-size=42
|
||||
sub-border-size=1.2
|
||||
sub-shadow-color=0.0/0.0/0.0/0.6
|
||||
|
||||
@@ -26,6 +26,7 @@ sub-fix-timing=yes
|
||||
sub-ass-override=scale
|
||||
sub-gauss=1.0
|
||||
sub-gray=yes
|
||||
sub-pos=90
|
||||
|
||||
# Networking & streaming
|
||||
ytdl-format=bestvideo+bestaudio/best
|
||||
@@ -185,14 +186,15 @@ ytdl-raw-options-append=sponsorblock-mark=all
|
||||
ytdl-raw-options-append=sponsorblock-remove=sponsor
|
||||
ytdl-format=bestvideo+bestaudio/best
|
||||
sub-auto=fuzzy
|
||||
slang=ja,jpn,ja.hi,ja.*
|
||||
alang=ja,jpn
|
||||
alang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
|
||||
slang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
|
||||
vlang=ja,jpn
|
||||
sub-font="Noto Sans CJK JP"
|
||||
sub-font-size=42
|
||||
sub-border-size=1.2
|
||||
sub-shadow-color=0.0/0.0/0.0/0.6
|
||||
sub-shadow-offset=3
|
||||
subs-with-matching-audio=yes
|
||||
sub-font="Noto Sans CJK JP Regular"
|
||||
glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl"
|
||||
scale=ewa_lanczossharp
|
||||
dither=error-diffusion
|
||||
deband=yes # Crucial for anime gradients
|
||||
|
||||
# Anime subtitles profile
|
||||
[anime-subs]
|
||||
|
||||
@@ -239,7 +239,9 @@ local code_companion_mappings = {
|
||||
{
|
||||
mode = "n",
|
||||
key = "<leader>Ci",
|
||||
cmd = ":CodeCompanion #{buffer} ",
|
||||
cmd = function()
|
||||
vim.api.nvim_feedkeys(":CodeCompanion #{buffer} ", "n", false)
|
||||
end,
|
||||
group = "Inline CodeCompanion",
|
||||
opts = nosilent,
|
||||
},
|
||||
@@ -249,7 +251,9 @@ local code_companion_mappings = {
|
||||
{
|
||||
mode = "v",
|
||||
key = "<leader>Ci",
|
||||
cmd = ":CodeCompanion #{buffer} ",
|
||||
cmd = function()
|
||||
vim.api.nvim_feedkeys(":CodeCompanion #{buffer} ", "n", false)
|
||||
end,
|
||||
group = "CodeCompanion Inline",
|
||||
opts = nosilent,
|
||||
},
|
||||
@@ -432,6 +436,14 @@ local misc_utilities_mappings = {
|
||||
end,
|
||||
group = "mkdir under cursor",
|
||||
},
|
||||
{
|
||||
mode = "v",
|
||||
key = "<leader>m",
|
||||
cmd = function()
|
||||
mkdir_under_cursor()
|
||||
end,
|
||||
group = "mkdir selection",
|
||||
},
|
||||
}
|
||||
-- }}}
|
||||
|
||||
|
||||
@@ -2,8 +2,20 @@ local M = {}
|
||||
vim.notify = require("notify")
|
||||
|
||||
function M.mkdir_under_cursor()
|
||||
-- Get the word under the cursor
|
||||
local word = vim.fn.expand("<cWORD>")
|
||||
local word
|
||||
|
||||
-- Check if in visual mode
|
||||
if vim.fn.mode():match("[vV]") then
|
||||
-- Get visual selection
|
||||
local start_pos = vim.fn.getpos("'<")
|
||||
local end_pos = vim.fn.getpos("'>")
|
||||
local line = vim.fn.getline(start_pos[2])
|
||||
word = line:sub(start_pos[3], end_pos[3])
|
||||
else
|
||||
-- Get word under cursor
|
||||
word = vim.fn.expand("<cWORD>")
|
||||
end
|
||||
|
||||
-- Remove quotes if present
|
||||
word = word:gsub("^[\"']", ""):gsub("[\"']$", "")
|
||||
-- Check if directory exists
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"theme": "catppuccin",
|
||||
"model": "github-copilot/gpt-4.1",
|
||||
"model": "github-copilot/gpt-5.1",
|
||||
"provider": {
|
||||
"openai": {
|
||||
"models": {
|
||||
@@ -19,7 +19,7 @@
|
||||
"agent": {
|
||||
"build": {
|
||||
"mode": "primary",
|
||||
"model": "github-copilot/gpt-4.1",
|
||||
"model": "github-copilot/gpt-5.1",
|
||||
"tools": {
|
||||
"write": true,
|
||||
"edit": true,
|
||||
@@ -28,7 +28,7 @@
|
||||
},
|
||||
"plan": {
|
||||
"mode": "primary",
|
||||
"model": "github-copilot/gpt-4.1",
|
||||
"model": "github-copilot/gpt-5.1-codex",
|
||||
"tools": {
|
||||
"write": false,
|
||||
"edit": false,
|
||||
@@ -38,7 +38,7 @@
|
||||
"code-reviewer": {
|
||||
"description": "Reviews code for best practices and potential issues",
|
||||
"mode": "subagent",
|
||||
"model": "github-copilot/gpt-4.1",
|
||||
"model": "github-copilot/gpt-5.1",
|
||||
"prompt": "You are a code reviewer. Focus on security, performance, and maintainability.",
|
||||
"tools": {
|
||||
"write": false,
|
||||
|
||||
@@ -10,8 +10,10 @@
|
||||
"Cloudflare - https://dash.cloudflare.com/",
|
||||
"CoinMarketCap - https://coinmarketcap.com/",
|
||||
"Deemix - http://pve-main:3358",
|
||||
"Ephemera - https://ephemera.suda.codes",
|
||||
"F1TV - https://f1tv.suda.codes",
|
||||
"Fidelity - https://login.fidelity.com/",
|
||||
"Ghstats - http://oracle-vm:3340",
|
||||
"Gitea - https://gitea.suda.codes",
|
||||
"Github - https://github.com",
|
||||
"Ghostfolio - http://pve-main:3334",
|
||||
@@ -23,7 +25,7 @@
|
||||
"Jellyfin (Vue) - http://pve-main:8098",
|
||||
"Karakeep - https://karakeep.suda.codes",
|
||||
"Komodo - https://komodo.suda.codes",
|
||||
"Komga - http://oracle-vm:3332",
|
||||
"Komga - http://pve-main:3332",
|
||||
"Lidarr - http://pve-main:3357",
|
||||
"MeTube - https://metube.suda.codes",
|
||||
"Navidrome - https://navidrome.suda.codes",
|
||||
@@ -32,7 +34,9 @@
|
||||
"Pihole - https://pihole.suda.codes/admin",
|
||||
"Pihole2 - https://pihole2.suda.codes/admin",
|
||||
"Proxmox - https://thebox.unicorn-ilish.ts.net",
|
||||
"qBittorrent - https://qbit.suda.codes",
|
||||
"qBittorrent - https://qbittorrent.suda.codes",
|
||||
"qui - https://qui.suda.codes",
|
||||
"Plausible - https://plausible.sudacode.com",
|
||||
"Paperless - https://paperless.suda.codes",
|
||||
"Prometheus - http://prometheus:9090",
|
||||
"Radarr - https://radarr.suda.codes",
|
||||
@@ -41,14 +45,16 @@
|
||||
"Sabnzbd - https://sabnzbd.suda.codes",
|
||||
"Sonarr - https://sonarr.suda.codes",
|
||||
"Sonarr Anime - http://pve-main:6969",
|
||||
"Speedtest Tracker - http://pve-main:8765",
|
||||
"Sudacode - https://sudacode.com",
|
||||
"Suwayomi - https://suwayomi.suda.codes",
|
||||
"Tailscale - https://login.tailscale.com/admin/machines",
|
||||
"Tranga - http://pve-main:9555",
|
||||
"Truenas - https://truenas.unicorn-ilish.ts.net",
|
||||
"Tdarr - https://tdarr.suda.codes",
|
||||
"Tubearchivist - https://tubearchivist.suda.codes",
|
||||
"T3Chat - https://t3.chat",
|
||||
"Umami - https://umami.sudacode.com",
|
||||
"Unifi - https://unifi.suda.codes",
|
||||
"Vaultwarden - https://vault.suda.codes",
|
||||
"Wallabag - https://wallabag.suda.codes",
|
||||
"Youtube - https://youtube.com",
|
||||
|
||||
@@ -37,7 +37,7 @@ window {
|
||||
location: center;
|
||||
anchor: center;
|
||||
fullscreen: false;
|
||||
width: 45%;
|
||||
width: 37%;
|
||||
x-offset: 0px;
|
||||
y-offset: 0px;
|
||||
|
||||
|
||||
@@ -1,20 +1,68 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
BROWSER=/usr/bin/zen-browser
|
||||
URLS=(
|
||||
OPTIONS=(
|
||||
"Arch Linux (btw)"
|
||||
"Hyprland"
|
||||
)
|
||||
ARCH=(
|
||||
"Archlinux Wiki|https://wiki.archlinux.org/title/Main_page"
|
||||
)
|
||||
HYPRLAND=(
|
||||
"Hyprland Docs|https://wiki.hypr.land/"
|
||||
"Hyprland Window Rules|https://wiki.hypr.land/Configuring/Window-Rules/"
|
||||
)
|
||||
|
||||
DISPLAY_URLS=()
|
||||
declare -A URL_MAP
|
||||
for url in "${URLS[@]}"; do
|
||||
DISPLAY_URLS+=("${url%%|*}")
|
||||
get_url() {
|
||||
urls=("$@")
|
||||
display_urls=()
|
||||
declare -A url_map
|
||||
for url in "${urls[@]}"; do
|
||||
display_urls+=("${url%%|*}")
|
||||
label="${url%%|*}"
|
||||
URL_MAP["$label"]="${url##*|}"
|
||||
done
|
||||
url_map["$label"]="${url##*|}"
|
||||
done
|
||||
display_urls+=("Back")
|
||||
url_map["Back"]="Back"
|
||||
|
||||
SELECTION="$(printf "%s\n" "${DISPLAY_URLS[@]}" | rofi -theme-str 'window {width: 25%;} listview {columns: 1; lines: 10;}' -theme ~/.config/rofi/launchers/type-2/style-2.rasi -dmenu -l 5 -i -p "Select Documentation")"
|
||||
URL="${URL_MAP[$SELECTION]}"
|
||||
$BROWSER "$URL" &>/dev/null &
|
||||
selection="$(printf "%s\n" "${display_urls[@]}" | rofi -theme-str 'window {width: 25%;} listview {columns: 1; lines: 10;}' -theme ~/.config/rofi/launchers/type-2/style-2.rasi -dmenu -l 5 -i -p "Select Documentation")"
|
||||
url="${url_map[$selection]}"
|
||||
|
||||
if [ -z "$url" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
printf "%s\n" "$url"
|
||||
}
|
||||
|
||||
get_docs_list() {
|
||||
selection="$(printf "%s\n" "${OPTIONS[@]}" | rofi -theme-str 'window {width: 25%;} listview {columns: 1; lines: 10;}' -theme ~/.config/rofi/launchers/type-2/style-2.rasi -dmenu -l 5 -i -p "Select Documentation Group")"
|
||||
case "$selection" in
|
||||
"Arch Linux (btw)")
|
||||
urls=("${ARCH[@]}")
|
||||
;;
|
||||
"Hyprland")
|
||||
urls=("${HYPRLAND[@]}")
|
||||
;;
|
||||
*)
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
printf "%s\n" "${urls[@]}"
|
||||
}
|
||||
|
||||
main() {
|
||||
mapfile -t urls < <(get_docs_list)
|
||||
url="$(get_url "${urls[@]}")"
|
||||
if [ -z "$url" ]; then
|
||||
printf "No URL selected.\n"
|
||||
exit 0
|
||||
elif [ "$url" == "Back" ]; then
|
||||
main
|
||||
exit 0
|
||||
fi
|
||||
$BROWSER "$url" &>/dev/null &
|
||||
}
|
||||
|
||||
main
|
||||
|
||||
@@ -7,5 +7,7 @@ DIR="$HOME/Pictures/wallpapers/favorites"
|
||||
SELECTED_WALL=$(cd "$DIR" && for a in *.jpg *.png; do echo -en "$a\0icon\x1f$a\n"; done | rofi -dmenu -i -no-custom -theme "$THEME" -p "Select a wallpaper" -theme-str 'configuration {icon-size: 128; dpi: 96;} window {width: 45%; height: 45%;}')
|
||||
PTH="$(printf "%s" "$DIR/$SELECTED_WALL" | tr -s '/')"
|
||||
notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH"
|
||||
hyprctl hyprpaper reload , "$DIR/$SELECTED_WALL"
|
||||
echo "$PTH" > "$HOME/.wallpaper"
|
||||
hyprctl hyprpaper preload "$PTH"
|
||||
hyprctl hyprpaper wallpaper "DP-1,$PTH"
|
||||
hyprctl hyprpaper unload "$(cat "$HOME/.wallpaper")"
|
||||
echo "$PTH" >"$HOME/.wallpaper"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"layer": "bottom",
|
||||
"position": "top",
|
||||
"height": 40,
|
||||
"width": 2545,
|
||||
"width": 3422,
|
||||
"spacing": 1,
|
||||
"reload_style_on_change": true,
|
||||
"fixed-center": true,
|
||||
@@ -232,8 +232,8 @@
|
||||
// "20": "十",
|
||||
},
|
||||
"persistent-workspaces": {
|
||||
// "*": 10,
|
||||
"*": 5,
|
||||
"*": 10,
|
||||
// "*": 5,
|
||||
},
|
||||
"sort-by": "number",
|
||||
"all-outputs": false,
|
||||
|
||||
@@ -175,7 +175,7 @@ func downloadRandomWallpaper(wallpaperPath string, r *rand.Rand, topics []string
|
||||
fmt.Fprintf(os.Stderr, "Searching for wallpapers related to: %s\n", displayName)
|
||||
|
||||
// Get wallpapers from Wallhaven API
|
||||
resp, err := http.Get(fmt.Sprintf("%s/search?q=%s&purity=100&categories=110&sorting=random", wallhavenAPI, query))
|
||||
resp, err := http.Get(fmt.Sprintf("%s/search?q=%s&purity=100&categories=110&sorting=random&atleast=3440x1440", wallhavenAPI, query))
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error fetching from Wallhaven: %v\n", err)
|
||||
return "", ""
|
||||
@@ -272,11 +272,26 @@ func ensureSized(wallpaperPath string) (string, error) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if src.Bounds().Dx() == targetWidth && src.Bounds().Dy() == targetHeight {
|
||||
srcWidth := float64(src.Bounds().Dx())
|
||||
srcHeight := float64(src.Bounds().Dy())
|
||||
targetW := float64(targetWidth)
|
||||
targetH := float64(targetHeight)
|
||||
|
||||
// Calculate scale factor to fit image within target while maintaining aspect ratio
|
||||
scaleW := targetW / srcWidth
|
||||
scaleH := targetH / srcHeight
|
||||
scale := min(scaleW, scaleH)
|
||||
|
||||
// If image already fits within target dimensions, no resize needed
|
||||
if scale >= 1.0 {
|
||||
return wallpaperPath, nil
|
||||
}
|
||||
|
||||
dst := image.NewRGBA(image.Rect(0, 0, targetWidth, targetHeight))
|
||||
// Calculate new dimensions maintaining aspect ratio (best fit)
|
||||
newWidth := int(srcWidth * scale)
|
||||
newHeight := int(srcHeight * scale)
|
||||
|
||||
dst := image.NewRGBA(image.Rect(0, 0, newWidth, newHeight))
|
||||
draw.CatmullRom.Scale(dst, dst.Bounds(), src, src.Bounds(), draw.Over, nil)
|
||||
|
||||
var ext string
|
||||
@@ -295,7 +310,7 @@ func ensureSized(wallpaperPath string) (string, error) {
|
||||
}
|
||||
|
||||
base := strings.TrimSuffix(filepath.Base(wallpaperPath), filepath.Ext(wallpaperPath))
|
||||
resizedPath := filepath.Join(filepath.Dir(wallpaperPath), fmt.Sprintf("%s-%dx%d%s", base, targetWidth, targetHeight, ext))
|
||||
resizedPath := filepath.Join(filepath.Dir(wallpaperPath), fmt.Sprintf("%s-%dx%d%s", base, newWidth, newHeight, ext))
|
||||
|
||||
outFile, err := os.Create(resizedPath)
|
||||
if err != nil {
|
||||
|
||||
@@ -31,6 +31,9 @@ generate_thumbnail() {
|
||||
local temp_thumb="/tmp/rmpv-thumbnail-$$.jpg"
|
||||
local thumbnail_file="${video_file%.*}.jpg"
|
||||
|
||||
# Clean up previous thumbnail
|
||||
rm -f "$THUMBNAIL_PATH"
|
||||
|
||||
# Validate input
|
||||
if [[ -z "$video_file" ]]; then
|
||||
echo "Error: No video file specified" >&2
|
||||
@@ -51,8 +54,20 @@ generate_thumbnail() {
|
||||
# Generate thumbnail if it doesn't exist
|
||||
if [[ ! -f "$thumbnail_file" ]]; then
|
||||
echo "Generating thumbnail for $(basename "$video_file")..."
|
||||
if ! ffmpeg -i "$video_file" \
|
||||
-vf "select='gt(scene,0.4)',scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \
|
||||
# Try generating thumbnail side-by-side
|
||||
if ! ffmpeg -ss 00:00:01 -i "$video_file" \
|
||||
-vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \
|
||||
-frames:v 1 \
|
||||
-q:v 4 \
|
||||
"$thumbnail_file" \
|
||||
-loglevel error -y 2>/dev/null; then
|
||||
|
||||
# Fallback to temp file if side-by-side fails (e.g. read-only fs)
|
||||
echo "Warning: Failed to write to $thumbnail_file, trying temp location" >&2
|
||||
thumbnail_file="$temp_thumb"
|
||||
|
||||
if ! ffmpeg -ss 00:00:01 -i "$video_file" \
|
||||
-vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \
|
||||
-frames:v 1 \
|
||||
-q:v 4 \
|
||||
"$thumbnail_file" \
|
||||
@@ -61,18 +76,17 @@ generate_thumbnail() {
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Copy to temporary location with error handling
|
||||
if ! cp "$thumbnail_file" "$temp_thumb" 2>/dev/null; then
|
||||
echo "Error: Failed to copy thumbnail to temporary location" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Create symlink for consistent access
|
||||
ln -sf "$temp_thumb" /tmp/rmpv-thumbnail.jpg 2>/dev/null
|
||||
sleep 0.1
|
||||
|
||||
echo "Thumbnail ready: $temp_thumb"
|
||||
# Copy to consistent location for notify-send
|
||||
# We use a fixed path so notify-send always finds it
|
||||
if cp "$thumbnail_file" "$THUMBNAIL_PATH" 2>/dev/null; then
|
||||
echo "Thumbnail ready at: $THUMBNAIL_PATH"
|
||||
ls -l "$THUMBNAIL_PATH"
|
||||
file "$THUMBNAIL_PATH"
|
||||
else
|
||||
echo "Error: Failed to copy thumbnail to $THUMBNAIL_PATH" >&2
|
||||
fi
|
||||
}
|
||||
|
||||
choice="$(find . -iname "*[.mkv|.mp4]" | sort -h | rofi -dmenu -i -theme "$THEME" -theme-str 'listview {columns: 1; lines: 15;} window {width: 88%;}' -p "Choose Video")"
|
||||
@@ -89,3 +103,4 @@ notify-send -i "$THUMBNAIL_PATH" "Playing Video" "$(basename "$choice")"
|
||||
$COMMAND "$choice" &
|
||||
|
||||
# vim: ft=sh
|
||||
|
||||
|
||||
Reference in New Issue
Block a user