Compare commits

...

17 Commits

Author SHA1 Message Date
a93761b042 update 2025-12-04 22:42:27 -08:00
a1ec1a54ba update 2025-12-03 22:49:24 -08:00
kyasuda
7b7fae9b91 update 2025-12-03 14:12:00 -08:00
d8a0e95bb5 bump versions 2025-12-02 18:49:10 -08:00
154f9e3ea6 update 2025-12-02 18:48:58 -08:00
4983623860 update mpv config 2025-12-02 18:48:51 -08:00
3628e70b72 update 2025-12-01 18:40:58 -08:00
31cfb8dd1c fux docs script 2025-12-01 18:09:32 -08:00
3fc0b32a9d update 2025-11-30 22:58:47 -08:00
4005e4650e move float center window rule down 2025-11-30 22:58:39 -08:00
3b87c06731 update rofi scripts 2025-11-30 22:57:56 -08:00
099d5e8ba6 update 2025-11-30 12:25:38 -08:00
21d6320cc1 update to new monitor 2025-11-30 12:25:25 -08:00
kyasuda
cb3641a9d9 send input directly to codecompanion inline command 2025-11-25 09:32:26 -08:00
b2cda94362 update window rules to new format 2025-11-20 12:26:07 -08:00
36d458c378 set sub-pos 2025-11-18 23:48:27 -08:00
5ec72352b8 update 2025-11-18 22:36:38 -08:00
16 changed files with 230 additions and 152 deletions

View File

@@ -14,12 +14,34 @@
################ ################
# See https://wiki.hyprland.org/Configuring/Monitors/ # See https://wiki.hyprland.org/Configuring/Monitors/
monitor=DP-1,2560x1440@144,0x0,1 # monitor=DP-1,2560x1440@144,0x0,1
monitor=DP-3,2560x1440@144,2560x0,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/keybindings.conf
source = ~/.config/hypr/windowrules.conf
source = ~/.config/hypr/macchiato.conf source = ~/.config/hypr/macchiato.conf
# source = ~/.config/hypr/env.conf
# unscale XWayland # unscale XWayland
xwayland { xwayland {
force_zero_scaling = true 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.) # Autostart necessary processes (like notifications daemons, status bars, etc.)
# Or execute your favorite apps at launch like this: # Or execute your favorite apps at launch like this:
exec-once = uwsm app -sb -- hyprpm update -nn exec-once = uwsm app -sb -- hyprpm update -n
exec-once = uwsm app -sb -- hyprpm reload -nn exec-once = uwsm app -sb -- hyprpm reload -n
exec-once = $notification_daemon exec-once = $notification_daemon
exec-once = $terminal exec-once = $terminal
exec-once = uwsm app -sb -S both -t scope -- hyprpm update -nn 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. # uncomment all if you wish to use that.
# workspace = w[tv1], gapsout:0, gapsin:0 # workspace = w[tv1], gapsout:0, gapsin:0
# workspace = f[1], 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 # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
dwindle { dwindle {
@@ -230,7 +248,8 @@ misc {
font_family = JetBrainsMono Nerd Font 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 = name:,monitor:DP-1
# workspace = 2,monitor:DP-1,defaultName: # workspace = 2,monitor:DP-1,defaultName:
# workspace = 2,monitor:DP-1,persistent:false # workspace = 2,monitor:DP-1,persistent:false
@@ -244,66 +263,9 @@ misc {
# workspace = 10,monitor:DP-3,persistent:false # workspace = 10,monitor:DP-3,persistent:false
# }}} # }}}
# windowrule = match:class my-window, border_size 10
############################## debug {
### WINDOWS AND WORKSPACES ### disable_logs = true
############################## enable_stdout_logs = false
# 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
}
} }

View File

@@ -40,28 +40,28 @@ bind = CTRL+ALT, j, focusmonitor, r
bind = CTRL+ALT, k, focusmonitor, l bind = CTRL+ALT, k, focusmonitor, l
# Switch workspaces with mainMod + [0-9] # Switch workspaces with mainMod + [0-9]
bind = $mainMod, 1, split-workspace, 1 bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, split-workspace, 2 bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, split-workspace, 3 bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, split-workspace, 4 bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, split-workspace, 5 bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, split-workspace, 6 bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, split-workspace, 7 bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, split-workspace, 8 bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, split-workspace, 9 bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, split-workspace, 10 bind = $mainMod, 0, workspace, 10
# Move active window to a workspace with mainMod + SHIFT + [0-9] # Move active window to a workspace with mainMod + SHIFT + [0-9]
bind = $mainMod SHIFT, 1, split-movetoworkspacesilent, 1 bind = $mainMod SHIFT, 1, movetoworkspacesilent, 1
bind = $mainMod SHIFT, 2, split-movetoworkspacesilent, 2 bind = $mainMod SHIFT, 2, movetoworkspacesilent, 2
bind = $mainMod SHIFT, 3, split-movetoworkspacesilent, 3 bind = $mainMod SHIFT, 3, movetoworkspacesilent, 3
bind = $mainMod SHIFT, 4, split-movetoworkspacesilent, 4 bind = $mainMod SHIFT, 4, movetoworkspacesilent, 4
bind = $mainMod SHIFT, 5, split-movetoworkspacesilent, 5 bind = $mainMod SHIFT, 5, movetoworkspacesilent, 5
bind = $mainMod SHIFT, 6, split-movetoworkspacesilent, 6 bind = $mainMod SHIFT, 6, movetoworkspacesilent, 6
bind = $mainMod SHIFT, 7, split-movetoworkspacesilent, 7 bind = $mainMod SHIFT, 7, movetoworkspacesilent, 7
bind = $mainMod SHIFT, 8, split-movetoworkspacesilent, 8 bind = $mainMod SHIFT, 8, movetoworkspacesilent, 8
bind = $mainMod SHIFT, 9, split-movetoworkspacesilent, 9 bind = $mainMod SHIFT, 9, movetoworkspacesilent, 9
bind = $mainMod SHIFT, 0, split-movetoworkspacesilent, 10 bind = $mainMod SHIFT, 0, movetoworkspacesilent, 10
# Example special workspace (scratchpad) # Example special workspace (scratchpad)
bind = SUPER, S, togglespecialworkspace, magic bind = SUPER, S, togglespecialworkspace, magic
@@ -137,3 +137,5 @@ bind = $mainMod, code:117, submap, clean
submap = clean submap = clean
bind = $mainMod, code:112, submap, reset bind = $mainMod, code:112, submap, reset
submap = reset submap = reset
bind = SUPER, l, exec, hyprlock

View File

@@ -25,6 +25,7 @@ sub-fix-timing=yes
sub-ass-override=scale sub-ass-override=scale
sub-gauss=1.0 sub-gauss=1.0
sub-gray=yes sub-gray=yes
sub-pos=100
# --- Audio chain --- # --- Audio chain ---
volume=75 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-mark=all
ytdl-raw-options-append=sponsorblock-remove=sponsor,selfpromo,interaction ytdl-raw-options-append=sponsorblock-remove=sponsor,selfpromo,interaction
ytdl-format=bestvideo+bestaudio/best ytdl-format=bestvideo+bestaudio/best
# get subtitles for videos automatically
sub-auto=fuzzy sub-auto=fuzzy
slang=ja,jpn,ja.hi,ja.* alang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
alang=ja,jpn slang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
vlang=ja,jpn vlang=ja,jpn
subs-with-matching-audio=yes
sub-font="Noto Sans CJK JP Regular"
glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl" glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl"
scale=ewa_lanczossharp scale=ewa_lanczossharp
dither=error-diffusion dither=error-diffusion
@@ -164,7 +166,7 @@ deband=yes # Crucial for anime gradients
[anime-subs] [anime-subs]
profile-cond=p["slang"] == "ja" or p["slang"] == "ja.hi" 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-font-size=42
sub-border-size=1.2 sub-border-size=1.2
sub-shadow-color=0.0/0.0/0.0/0.6 sub-shadow-color=0.0/0.0/0.0/0.6

View File

@@ -26,6 +26,7 @@ sub-fix-timing=yes
sub-ass-override=scale sub-ass-override=scale
sub-gauss=1.0 sub-gauss=1.0
sub-gray=yes sub-gray=yes
sub-pos=90
# Networking & streaming # Networking & streaming
ytdl-format=bestvideo+bestaudio/best ytdl-format=bestvideo+bestaudio/best
@@ -185,14 +186,15 @@ ytdl-raw-options-append=sponsorblock-mark=all
ytdl-raw-options-append=sponsorblock-remove=sponsor ytdl-raw-options-append=sponsorblock-remove=sponsor
ytdl-format=bestvideo+bestaudio/best ytdl-format=bestvideo+bestaudio/best
sub-auto=fuzzy sub-auto=fuzzy
slang=ja,jpn,ja.hi,ja.* alang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
alang=ja,jpn slang=ja,jp,jpn,japanese,en,eng,english,English,enUS,en-US
vlang=ja,jpn vlang=ja,jpn
sub-font="Noto Sans CJK JP" subs-with-matching-audio=yes
sub-font-size=42 sub-font="Noto Sans CJK JP Regular"
sub-border-size=1.2 glsl-shaders="~~/shaders/ArtCNN_C4F32.glsl"
sub-shadow-color=0.0/0.0/0.0/0.6 scale=ewa_lanczossharp
sub-shadow-offset=3 dither=error-diffusion
deband=yes # Crucial for anime gradients
# Anime subtitles profile # Anime subtitles profile
[anime-subs] [anime-subs]

View File

@@ -239,7 +239,9 @@ local code_companion_mappings = {
{ {
mode = "n", mode = "n",
key = "<leader>Ci", key = "<leader>Ci",
cmd = ":CodeCompanion #{buffer} ", cmd = function()
vim.api.nvim_feedkeys(":CodeCompanion #{buffer} ", "n", false)
end,
group = "Inline CodeCompanion", group = "Inline CodeCompanion",
opts = nosilent, opts = nosilent,
}, },
@@ -249,7 +251,9 @@ local code_companion_mappings = {
{ {
mode = "v", mode = "v",
key = "<leader>Ci", key = "<leader>Ci",
cmd = ":CodeCompanion #{buffer} ", cmd = function()
vim.api.nvim_feedkeys(":CodeCompanion #{buffer} ", "n", false)
end,
group = "CodeCompanion Inline", group = "CodeCompanion Inline",
opts = nosilent, opts = nosilent,
}, },
@@ -432,6 +436,14 @@ local misc_utilities_mappings = {
end, end,
group = "mkdir under cursor", group = "mkdir under cursor",
}, },
{
mode = "v",
key = "<leader>m",
cmd = function()
mkdir_under_cursor()
end,
group = "mkdir selection",
},
} }
-- }}} -- }}}

View File

@@ -2,8 +2,20 @@ local M = {}
vim.notify = require("notify") vim.notify = require("notify")
function M.mkdir_under_cursor() function M.mkdir_under_cursor()
-- Get the word under the cursor local word
local word = vim.fn.expand("<cWORD>")
-- 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 -- Remove quotes if present
word = word:gsub("^[\"']", ""):gsub("[\"']$", "") word = word:gsub("^[\"']", ""):gsub("[\"']$", "")
-- Check if directory exists -- Check if directory exists

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "https://opencode.ai/config.json", "$schema": "https://opencode.ai/config.json",
"theme": "catppuccin", "theme": "catppuccin",
"model": "github-copilot/gpt-4.1", "model": "github-copilot/gpt-5.1",
"provider": { "provider": {
"openai": { "openai": {
"models": { "models": {
@@ -19,7 +19,7 @@
"agent": { "agent": {
"build": { "build": {
"mode": "primary", "mode": "primary",
"model": "github-copilot/gpt-4.1", "model": "github-copilot/gpt-5.1",
"tools": { "tools": {
"write": true, "write": true,
"edit": true, "edit": true,
@@ -28,7 +28,7 @@
}, },
"plan": { "plan": {
"mode": "primary", "mode": "primary",
"model": "github-copilot/gpt-4.1", "model": "github-copilot/gpt-5.1-codex",
"tools": { "tools": {
"write": false, "write": false,
"edit": false, "edit": false,
@@ -38,7 +38,7 @@
"code-reviewer": { "code-reviewer": {
"description": "Reviews code for best practices and potential issues", "description": "Reviews code for best practices and potential issues",
"mode": "subagent", "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.", "prompt": "You are a code reviewer. Focus on security, performance, and maintainability.",
"tools": { "tools": {
"write": false, "write": false,

View File

@@ -10,8 +10,10 @@
"Cloudflare - https://dash.cloudflare.com/", "Cloudflare - https://dash.cloudflare.com/",
"CoinMarketCap - https://coinmarketcap.com/", "CoinMarketCap - https://coinmarketcap.com/",
"Deemix - http://pve-main:3358", "Deemix - http://pve-main:3358",
"Ephemera - https://ephemera.suda.codes",
"F1TV - https://f1tv.suda.codes", "F1TV - https://f1tv.suda.codes",
"Fidelity - https://login.fidelity.com/", "Fidelity - https://login.fidelity.com/",
"Ghstats - http://oracle-vm:3340",
"Gitea - https://gitea.suda.codes", "Gitea - https://gitea.suda.codes",
"Github - https://github.com", "Github - https://github.com",
"Ghostfolio - http://pve-main:3334", "Ghostfolio - http://pve-main:3334",
@@ -23,7 +25,7 @@
"Jellyfin (Vue) - http://pve-main:8098", "Jellyfin (Vue) - http://pve-main:8098",
"Karakeep - https://karakeep.suda.codes", "Karakeep - https://karakeep.suda.codes",
"Komodo - https://komodo.suda.codes", "Komodo - https://komodo.suda.codes",
"Komga - http://oracle-vm:3332", "Komga - http://pve-main:3332",
"Lidarr - http://pve-main:3357", "Lidarr - http://pve-main:3357",
"MeTube - https://metube.suda.codes", "MeTube - https://metube.suda.codes",
"Navidrome - https://navidrome.suda.codes", "Navidrome - https://navidrome.suda.codes",
@@ -32,7 +34,9 @@
"Pihole - https://pihole.suda.codes/admin", "Pihole - https://pihole.suda.codes/admin",
"Pihole2 - https://pihole2.suda.codes/admin", "Pihole2 - https://pihole2.suda.codes/admin",
"Proxmox - https://thebox.unicorn-ilish.ts.net", "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", "Paperless - https://paperless.suda.codes",
"Prometheus - http://prometheus:9090", "Prometheus - http://prometheus:9090",
"Radarr - https://radarr.suda.codes", "Radarr - https://radarr.suda.codes",
@@ -41,14 +45,16 @@
"Sabnzbd - https://sabnzbd.suda.codes", "Sabnzbd - https://sabnzbd.suda.codes",
"Sonarr - https://sonarr.suda.codes", "Sonarr - https://sonarr.suda.codes",
"Sonarr Anime - http://pve-main:6969", "Sonarr Anime - http://pve-main:6969",
"Speedtest Tracker - http://pve-main:8765",
"Sudacode - https://sudacode.com", "Sudacode - https://sudacode.com",
"Suwayomi - https://suwayomi.suda.codes", "Suwayomi - https://suwayomi.suda.codes",
"Tailscale - https://login.tailscale.com/admin/machines", "Tailscale - https://login.tailscale.com/admin/machines",
"Tranga - http://pve-main:9555", "Tranga - http://pve-main:9555",
"Truenas - https://truenas.unicorn-ilish.ts.net", "Truenas - https://truenas.unicorn-ilish.ts.net",
"Tdarr - https://tdarr.suda.codes", "Tdarr - https://tdarr.suda.codes",
"Tubearchivist - https://tubearchivist.suda.codes",
"T3Chat - https://t3.chat", "T3Chat - https://t3.chat",
"Umami - https://umami.sudacode.com", "Unifi - https://unifi.suda.codes",
"Vaultwarden - https://vault.suda.codes", "Vaultwarden - https://vault.suda.codes",
"Wallabag - https://wallabag.suda.codes", "Wallabag - https://wallabag.suda.codes",
"Youtube - https://youtube.com", "Youtube - https://youtube.com",

View File

@@ -37,7 +37,7 @@ window {
location: center; location: center;
anchor: center; anchor: center;
fullscreen: false; fullscreen: false;
width: 45%; width: 37%;
x-offset: 0px; x-offset: 0px;
y-offset: 0px; y-offset: 0px;

View File

@@ -1,20 +1,68 @@
#!/usr/bin/env bash #!/usr/bin/env bash
BROWSER=/usr/bin/zen-browser BROWSER=/usr/bin/zen-browser
URLS=( OPTIONS=(
"Arch Linux (btw)"
"Hyprland"
)
ARCH=(
"Archlinux Wiki|https://wiki.archlinux.org/title/Main_page" "Archlinux Wiki|https://wiki.archlinux.org/title/Main_page"
)
HYPRLAND=(
"Hyprland Docs|https://wiki.hypr.land/" "Hyprland Docs|https://wiki.hypr.land/"
"Hyprland Window Rules|https://wiki.hypr.land/Configuring/Window-Rules/" "Hyprland Window Rules|https://wiki.hypr.land/Configuring/Window-Rules/"
) )
DISPLAY_URLS=() get_url() {
declare -A URL_MAP urls=("$@")
for url in "${URLS[@]}"; do display_urls=()
DISPLAY_URLS+=("${url%%|*}") declare -A url_map
label="${url%%|*}" for url in "${urls[@]}"; do
URL_MAP["$label"]="${url##*|}" display_urls+=("${url%%|*}")
done label="${url%%|*}"
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")" 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]}" url="${url_map[$selection]}"
$BROWSER "$URL" &>/dev/null &
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

View File

@@ -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%;}') 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 '/')" PTH="$(printf "%s" "$DIR/$SELECTED_WALL" | tr -s '/')"
notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH" notify-send -a "rofi-wallpaper" "Wallpaper set to" -i "$PTH" "$PTH"
hyprctl hyprpaper reload , "$DIR/$SELECTED_WALL" hyprctl hyprpaper preload "$PTH"
echo "$PTH" > "$HOME/.wallpaper" hyprctl hyprpaper wallpaper "DP-1,$PTH"
hyprctl hyprpaper unload "$(cat "$HOME/.wallpaper")"
echo "$PTH" >"$HOME/.wallpaper"

View File

@@ -2,7 +2,7 @@
"layer": "bottom", "layer": "bottom",
"position": "top", "position": "top",
"height": 40, "height": 40,
"width": 2545, "width": 3422,
"spacing": 1, "spacing": 1,
"reload_style_on_change": true, "reload_style_on_change": true,
"fixed-center": true, "fixed-center": true,
@@ -232,8 +232,8 @@
// "20": "十", // "20": "十",
}, },
"persistent-workspaces": { "persistent-workspaces": {
// "*": 10, "*": 10,
"*": 5, // "*": 5,
}, },
"sort-by": "number", "sort-by": "number",
"all-outputs": false, "all-outputs": false,

View File

@@ -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) fmt.Fprintf(os.Stderr, "Searching for wallpapers related to: %s\n", displayName)
// Get wallpapers from Wallhaven API // 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 { if err != nil {
fmt.Fprintf(os.Stderr, "Error fetching from Wallhaven: %v\n", err) fmt.Fprintf(os.Stderr, "Error fetching from Wallhaven: %v\n", err)
return "", "" return "", ""
@@ -272,11 +272,26 @@ func ensureSized(wallpaperPath string) (string, error) {
return "", err 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 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) draw.CatmullRom.Scale(dst, dst.Bounds(), src, src.Bounds(), draw.Over, nil)
var ext string var ext string
@@ -295,7 +310,7 @@ func ensureSized(wallpaperPath string) (string, error) {
} }
base := strings.TrimSuffix(filepath.Base(wallpaperPath), filepath.Ext(wallpaperPath)) 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) outFile, err := os.Create(resizedPath)
if err != nil { if err != nil {

View File

@@ -31,6 +31,9 @@ generate_thumbnail() {
local temp_thumb="/tmp/rmpv-thumbnail-$$.jpg" local temp_thumb="/tmp/rmpv-thumbnail-$$.jpg"
local thumbnail_file="${video_file%.*}.jpg" local thumbnail_file="${video_file%.*}.jpg"
# Clean up previous thumbnail
rm -f "$THUMBNAIL_PATH"
# Validate input # Validate input
if [[ -z "$video_file" ]]; then if [[ -z "$video_file" ]]; then
echo "Error: No video file specified" >&2 echo "Error: No video file specified" >&2
@@ -51,28 +54,39 @@ generate_thumbnail() {
# Generate thumbnail if it doesn't exist # Generate thumbnail if it doesn't exist
if [[ ! -f "$thumbnail_file" ]]; then if [[ ! -f "$thumbnail_file" ]]; then
echo "Generating thumbnail for $(basename "$video_file")..." echo "Generating thumbnail for $(basename "$video_file")..."
if ! ffmpeg -i "$video_file" \ # Try generating thumbnail side-by-side
-vf "select='gt(scene,0.4)',scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \ 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 \ -frames:v 1 \
-q:v 4 \ -q:v 4 \
"$thumbnail_file" \ "$thumbnail_file" \
-loglevel error -y 2>/dev/null; then -loglevel error -y 2>/dev/null; then
echo "Error: Failed to generate thumbnail" >&2
return 1 # 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" \
-loglevel error -y 2>/dev/null; then
echo "Error: Failed to generate thumbnail" >&2
return 1
fi
fi fi
fi fi
# Copy to temporary location with error handling # Copy to consistent location for notify-send
if ! cp "$thumbnail_file" "$temp_thumb" 2>/dev/null; then # We use a fixed path so notify-send always finds it
echo "Error: Failed to copy thumbnail to temporary location" >&2 if cp "$thumbnail_file" "$THUMBNAIL_PATH" 2>/dev/null; then
return 1 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 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"
} }
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")" 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" & $COMMAND "$choice" &
# vim: ft=sh # vim: ft=sh