commit 168a02aebe47ae981777b09f3f709c02dcebfd61 Author: Yuzucchii Date: Sat Jun 14 17:17:10 2025 -0500 epic v2 diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..aafdeb4 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,96 @@ +[user] + name="Yuzucchii" + email="me@yuzucchii.xyz" + signinkey=EFF95B412FB129BB + signingkey = /home/yu/.ssh/id_ed25519.pub + +[core] + compression=9 + whitespace=error + preloadindex=true + +[commit] + gpgsign=true + signoff=true + verbose=false + allowEmpty=false + template=~/.config/git/template + +[advice] + addEmptyPathspec=false + pushNonFastForward=false + statusHints=false + +[url "ssh://git@sv.yuzucchii.xyz:2222/"] + insteadOf = "yu:" + port = 2222 + +[url "ssh://git@github.com:"] + insteadOf = "gh:" + +[status] + branch=true + showStash=true + showUntrackedFiles=all + +[diff] + context=3 + renames=copies + interHunkContext=10 + +[pager] + markEmptyLines=false + branch=false + tag=false + +[color "diff"] + meta=black bold + frag=magenta + context=white + new=green bold + whitespace=yellow reverse + old=red + +[interactive] + diffFilter=diff-so-fancy --patch + singlekey=true + +[push] + autoSetupRemote=true + default=current + followTags=true + +[pull] + default=true + rebase=true + +[rebase] + autostash=true + missingCommitsCheck=warn + +[log] + abbrevCommit=true + graphColors=blue,yellow,cyan,magenta,green,red + +[color "decorate"] + HEAD=red + branch=blue + tag=yellow + remoteBranch=magenta + +[color "branch"] + current=magenta + local=default + remote=yellow + upstream=green + plain=blue + +[branch] + sort=-committerdate + +[tag] + sort=-triggerdate + gpgSign=true + +[gpg] + format=ssh diff --git a/config b/config new file mode 100644 index 0000000..633e1f7 --- /dev/null +++ b/config @@ -0,0 +1,11 @@ +Host yuzu + HostName sv.yuzucchii.xyz + Port 22 # the container port + IdentityFile ~/.ssh/ssh-key-2025-05-02.key + User yuzucchii + +Host gitea + HostName git.yuzucchii.xyz + Port 2222 + IdentityFile ~/.ssh/id_ed25519 + diff --git a/dunst/assets/brightness.svg b/dunst/assets/brightness.svg new file mode 100644 index 0000000..365ea95 --- /dev/null +++ b/dunst/assets/brightness.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/dunst/assets/notification/fallback.png b/dunst/assets/notification/fallback.png new file mode 100644 index 0000000..204aeda Binary files /dev/null and b/dunst/assets/notification/fallback.png differ diff --git a/dunst/assets/notification/scrot.png b/dunst/assets/notification/scrot.png new file mode 100644 index 0000000..1e12f38 Binary files /dev/null and b/dunst/assets/notification/scrot.png differ diff --git a/dunst/assets/notification/speaker.png b/dunst/assets/notification/speaker.png new file mode 100644 index 0000000..579b34f Binary files /dev/null and b/dunst/assets/notification/speaker.png differ diff --git a/dunst/assets/ui/brightness-high.svg b/dunst/assets/ui/brightness-high.svg new file mode 100644 index 0000000..a1dddf1 --- /dev/null +++ b/dunst/assets/ui/brightness-high.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dunst/assets/ui/brightness-low.svg b/dunst/assets/ui/brightness-low.svg new file mode 100644 index 0000000..f585bd7 --- /dev/null +++ b/dunst/assets/ui/brightness-low.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dunst/assets/ui/brightness-medium.svg b/dunst/assets/ui/brightness-medium.svg new file mode 100644 index 0000000..16023cb --- /dev/null +++ b/dunst/assets/ui/brightness-medium.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dunst/assets/ui/brightness-off.svg b/dunst/assets/ui/brightness-off.svg new file mode 100644 index 0000000..73451c4 --- /dev/null +++ b/dunst/assets/ui/brightness-off.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dunst/assets/ui/volume_high.svg b/dunst/assets/ui/volume_high.svg new file mode 100644 index 0000000..38ae1e8 --- /dev/null +++ b/dunst/assets/ui/volume_high.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dunst/assets/ui/volume_low.svg b/dunst/assets/ui/volume_low.svg new file mode 100644 index 0000000..24f0497 --- /dev/null +++ b/dunst/assets/ui/volume_low.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dunst/assets/ui/volume_medium.svg b/dunst/assets/ui/volume_medium.svg new file mode 100644 index 0000000..1a564bb --- /dev/null +++ b/dunst/assets/ui/volume_medium.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dunst/assets/ui/volume_muted.svg b/dunst/assets/ui/volume_muted.svg new file mode 100644 index 0000000..34fad42 --- /dev/null +++ b/dunst/assets/ui/volume_muted.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dunst/assets/ui/volume_off.svg b/dunst/assets/ui/volume_off.svg new file mode 100644 index 0000000..54f33f4 --- /dev/null +++ b/dunst/assets/ui/volume_off.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/dunst/assets/volume-mute.svg b/dunst/assets/volume-mute.svg new file mode 100644 index 0000000..8448c77 --- /dev/null +++ b/dunst/assets/volume-mute.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dunst/assets/volume.svg b/dunst/assets/volume.svg new file mode 100644 index 0000000..2c4f49c --- /dev/null +++ b/dunst/assets/volume.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dunst/dunstrc b/dunst/dunstrc new file mode 100644 index 0000000..099f22b --- /dev/null +++ b/dunst/dunstrc @@ -0,0 +1,73 @@ +[global] + monitor = 0 + follow = none + width = 300 + height = (0, 145) + origin = top-right + alignment = "left" + vertical_alignment = "center" + ellipsize = "middle" + offset = (15, 15) + padding = 15 + horizontal_padding = 15 + text_icon_padding = 15 + icon_position = "left" + min_icon_size = 48 + max_icon_size = 64 + progress_bar = true + progress_bar_height = 8 + progress_bar_frame_width = 1 + progress_bar_min_width = 150 + progress_bar_max_width = 300 + separator_height = 2 + frame_width = 2 + frame_color = "#313244" + separator_color = "frame" + corner_radius = 8 + transparency = 0 + gap_size = 8 + line_height = 0 + notification_limit = 0 + idle_threshold = 120 + history_length = 20 + show_age_threshold = 60 + markup = "full" + font = "monospace 10" + format = "%s\n%b " + word_wrap = "yes" + sort = "yes" + shrink = "no" + indicate_hidden = "yes" + sticky_history = "yes" + ignore_newline = "no" + show_indicators = "no" + stack_duplicates = true + always_run_script = true + hide_duplicate_count = false + ignore_dbusclose = false + force_xwayland = false + force_xinerama = false + mouse_left_click = "do_action" + mouse_middle_click = "close_all" + mouse_right_click = "close_current" +[experimental] + per_monitor_dpi = false + + +[urgency_low] + background = "#1e1e2e" + foreground = "#cdd6f4" + highlight = "#cba6f7" + timeout = 4 + +[urgency_normal] + background = "#1e1e2e" + foreground = "#cdd6f4" + highlight = "#cba6f7" + timeout = 6 + +[urgency_critical] + background = "#1e1e2e" + foreground = "#cdd6f4" + highlight = "#cba6f7" + timeout = 0 diff --git a/dunst/scripts/openEwwPopup.sh b/dunst/scripts/openEwwPopup.sh new file mode 100755 index 0000000..2272baa --- /dev/null +++ b/dunst/scripts/openEwwPopup.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +DND_LOCK_FILE="$HOME/.cache/dnd-lock.lock" +LOCK_FILE="$HOME/.cache/eww-notif-popup.lock" +EWW_BIN="$HOME/.local/bin/eww" + +finish() { + ${EWW_BIN} update noti=false; sleep 0.075 + ${EWW_BIN} close notification-popup + rm -f ${LOCK_FILE} +} + +# Run eww daemon if not running +if [[ ! `pidof eww` ]]; then + ${EWW_BIN} daemon + sleep 1 +else + if [[ -f "$LOCK_FILE" ]]; then + sleep 0.275 && ${EWW_BIN} update has_another_notif=true && canberra-gtk-play -i message-new-instant + fi + + if [[ ! -f "$DND_LOCK_FILE" ]]; then + KILLED=false + for pid in $(pidof -x openEwwPopup.sh); do + if [ $pid != $$ ]; then + kill -9 $pid + KILLED=true + fi + done >/dev/null + + if ! $KILLED; then + sleep 0.5 + ${EWW_BIN} update noti=true + ${EWW_BIN} open notification-popup + canberra-gtk-play -i message + touch ${LOCK_FILE} + fi + + # ${EWW_BIN} update has_another_notif=true + sleep 5 + finish + unset KILLED + ${EWW_BIN} update has_another_notif=false + fi +fi diff --git a/dunst/scripts/playNotificationSound.sh b/dunst/scripts/playNotificationSound.sh new file mode 100755 index 0000000..993c548 --- /dev/null +++ b/dunst/scripts/playNotificationSound.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +canberra-gtk-play -i message \ No newline at end of file diff --git a/dunst/scripts/songArtLogger.sh b/dunst/scripts/songArtLogger.sh new file mode 100755 index 0000000..f73beb4 --- /dev/null +++ b/dunst/scripts/songArtLogger.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +TMP_DIR="$HOME/.cache/dunst" +TMP_COVER_PATH="$TMP_DIR/$DUNST_SUMMARY.png" +TMP_TEMP_PATH="$TMP_DIR/temp.png" + +if [ ! -d "$TMP_DIR" ]; then + mkdir -p "$TMP_DIR" +fi + +ART_FROM_SPOTIFY="$(playerctl -p %any,spotify metadata mpris:artUrl | sed -e 's/open.spotify.com/i.scdn.co/g')" + +if [[ $(playerctl -p spotify,%any,firefox,chromium,brave,mpd metadata mpris:artUrl) ]]; then + curl -s "$ART_FROM_SPOTIFY" --output "$TMP_COVER_PATH" +fi + +cp "$TMP_TEMP_PATH" "$TMP_COVER_PATH" \ No newline at end of file diff --git a/ghostty/config b/ghostty/config new file mode 100644 index 0000000..a7a0274 --- /dev/null +++ b/ghostty/config @@ -0,0 +1,16 @@ +# Config generated by Ghostty Config + +shell-integration = zsh +term = xterm-256color +#custom-shader = ~/.config/ghostty/shaders/bettercrt.glsl +#custom-shader-animation = true +window-decoration = true +background-opacity = 0.90 +theme = catppuccin-mocha +cursor-style = block +font-size = 14 +font-thicken = true +font-family = "FiraMono Nerd Font" +keybind = global:cmd+s=toggle_quick_terminal +mouse-hide-while-typing = true +class = "ghostty" diff --git a/ghostty/shaders b/ghostty/shaders new file mode 160000 index 0000000..a17573f --- /dev/null +++ b/ghostty/shaders @@ -0,0 +1 @@ +Subproject commit a17573fb254e618f92a75afe80faa31fd5e09d6f diff --git a/ghostty/themes/stardust b/ghostty/themes/stardust new file mode 100644 index 0000000..bddbcb7 --- /dev/null +++ b/ghostty/themes/stardust @@ -0,0 +1,31 @@ +# ------------------------------ +# stardust ghostty theme +# Save this as, for example, "~/.config/ghostty/themes/stardust" +# Then set in your Ghostty config: theme = stardust +# ------------------------------ +palette = 0=#18181b +palette = 1=#F44747 +palette = 2=#fcca7c +palette = 3=#f7a41d +palette = 4=#acd2ac +palette = 5=#fcca7c +palette = 6=#4EC9B0 +palette = 7=#dcdccc +palette = 8=#2b2b2b +palette = 9=#D16969 +palette = 10=#ffc1c1 +palette = 11=#fcca7c +palette = 12=#fcca7c +palette = 13=#C586C0 +palette = 14=#4EC9B0 +palette = 15=#ffffff + +background = #18181b +foreground = #dcdccc + +cursor-color = #8faf9f +cursor-text = #000d18 + +selection-background = #5e81ac +selection-foreground = #dcdccc + diff --git a/hypr/hypridle.conf b/hypr/hypridle.conf new file mode 100644 index 0000000..53986e2 --- /dev/null +++ b/hypr/hypridle.conf @@ -0,0 +1,23 @@ +$lock_cmd = pidof hyprlock || hyprlock +$suspend_cmd = pidof steam || loginctl suspend # fuck nvidia + +general { + lock_cmd = $lock_cmd + before_sleep_cmd = loginctl lock-session +} + +listener { + timeout = 180 # 3mins + on-timeout = loginctl lock-session +} + +listener { + timeout = 240 # 4mins + on-timeout = hyprctl dispatch dpms off + on-resume = hyprctl dispatch dpms on +} + +listener { + timeout = 540 # 9mins + on-timeout = $suspend_cmd +} diff --git a/hypr/hyprland.conf b/hypr/hyprland.conf new file mode 100644 index 0000000..2f1a9e4 --- /dev/null +++ b/hypr/hyprland.conf @@ -0,0 +1,263 @@ +monitor=,1360x768,auto,1,bitdepth,8 +monitor=,preferred,auto,1,mirror,eDP-1,bitdepth,8 +xwayland { + force_zero_scaling = true +} + +# apps +$terminal = ghostty +$browser = firefox +$fileManager = $terminal --command="lf" +$passwordManager = /usr/bin/keepassxc + +# yes I have Discord virtualised, don't judge me +$discord = /home/yu/.local/bin/distrobox-enter -n pkg -- /usr/bin/discord + +# menus and scripts +$emojipicker = ~/.config/wofi/scripts/emojis.sh +$menu = ~/scripts/menu +$powermenu = ~/.config/wofi/scripts/power.sh + +exec-once = $terminal +exec-once = pipewire & wireplumber & pipewire-pulse +exec-once = waybar & hyprpaper +exec-once = [ ! -s ~/.config/mpd/pid ] && mpd +exec-once = hyprctl dispatch exec playerctl start +exec-once = playerctld daemon +exec-once = dunst -conf .config/dunst/dunstrc +exec-once = wl-paste --watch cliphist store +exec-once = hypridle +exec-once = hyprctl setcursor Makise-Kurisu-Cursor 24 +exec-once = hyprctl hyprpaper reload ,~/Pictures/wallpaper/2246.png # default + +env = HYPRCURSOR_THEME,Makise-Kurisu-Cursor +env = HYPRCURSOR_SIZE,24 +# fix flickering cursor +env = LIBVA_DRIVER_NAME,nvidia +env = XDG_SESSION_TYPE,wayland +env = GBM_BACKEND,nvidia-drm +env = __GLX_VENDOR_LIBRARY_NAME,nvidia + +debug { + disable_logs = false + damage_tracking = 0 +} + +cursor { + inactive_timeout = 0 + no_hardware_cursors = true +} + +render { + explicit_sync = 2 + explicit_sync_kms = 2 +} + +opengl { + nvidia_anti_flicker = 0 +} +# end fix + +general { + gaps_in = 6 + gaps_out = 12 + border_size = 2 + col.active_border = rgba(66ccffee) rgba(99ffccff) 45deg + col.inactive_border = rgba(444444aa) + resize_on_border = false + allow_tearing = true + layout = master +} + +decoration { + rounding = 12 + active_opacity = 0.95; + inactive_opacity = 0.8; + + blur { + enabled = true + xray = false # Disable for softer edges (xray can look harsh) + special = true # Apply blur to "special" layers (dialogs, etc.) + new_optimizations = true # Keep this for performance + size = 10 # Slightly smaller for smoother performance + passes = 3 # Fewer passes = less GPU load (but still creamy) + brightness = 0.9 # Slightly dim to reduce glare + noise = 0.02 # Subtle grain for "film-like" texture + contrast = 1.1 # Slight boost for vibrancy + popups = true # Blur popups (essential for Aero) + popups_ignorealpha = 0.5 # Softer popup transparency + # Add these experimental tweaks: + vibrancy = 0.2 # If supported (enhances colors under blur) + vibrancy_darkness = 0.1 # Prevents oversaturation + } + + # Shadow + shadow { + enabled = true + ignore_window = true + range = 12 + offset = 0 2 + render_power = 3 + color = rgba(100, 180, 255, 0.6) + } + + # Dim + dim_inactive = false + dim_strength = 0.1 + dim_special = 0 +} + +animations { + enabled = yes + bezier = linear, 0, 0, 1, 1 + bezier = aero_gentle, 0.25, 0.1, 0.25, 1.0 + bezier = aero_bounce, 0.5, 1.5, 0.5, 0.9 + bezier = aero_snap, 0.4, 0, 0.2, 1 + bezier = aero_menu, 0.1, 1, 0, 1 + + animation = windows, 1, 3, aero_bounce, popin 70% + #this crap breaks slurp do not use it + #animation = windowsIn, 1, 3, aero_gentle, slideup 30% + #animation = windowsOut, 1, 3, aero_snap, slidedown 30% + animation = border, 1, 5, linear + + #animation = layersIn, 1, 3, aero_gentle, slideup 20% + #animation = layersOut, 1, 2, aero_snap, slidedown 20% + animation = fadeLayersIn, 1, 2, aero_gentle + animation = fadeLayersOut, 1, 1, aero_snap + + animation = workspaces, 1, 5, aero_menu, slidefadevert 15% + animation = specialWorkspace, 1, 4, aero_bounce, slidevert + + animation = fade, 1, 3, aero_gentle + animation = borderangle, 1, 10, linear, loop +} + +master { + new_status = master +} + +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( + vfr = 0 + + enable_swallow = true + swallow_regex = (allacritty|Alacritty|ghostty|Ghostty) +} + +input { + kb_layout = us + kb_variant = altgr-intl + kb_options = deadkeys + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +gestures { + workspace_swipe = false # this can be fun if I used a laptop +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +# idk??? +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + +# ==== Essentials ==== +$mainMod = SUPER +bind = $mainMod, RETURN, exec, $terminal # Enter to launch terminal (intuitive) +bind = $mainMod, Q, killactive # Q = "Quit window" (mnemonic) +bind = $mainMod SHIFT, Q, exec, $powermenu # Shift+Q for power menu +bind = $mainMod, SPACE, exec, $menu # Spacebar for app launcher (like Spotlight) + +# ==== Apps ==== +bind = $mainMod, E, exec, $fileManager # E = Explorer +bind = $mainMod, D, exec, $discord # D = Discord +bind = $mainMod, P, exec, $passwordManager # P = Password manager +bind = $mainMod, X, exec, $emojipicker # X = eXpression (emoji) +bind = $mainMod SHIFT, B, exec, kill $(pidof waybar) || waybar # toggle waybar, reloads waybar + +# ==== Window Management ==== +bind = CONTROL, TAB, workspace, previous # Normie feature +bind = $mainMod, F, fullscreen, 1 # F = Fullscreen +bind = $mainMod SHIFT, F, fullscreen, 0 # Shift+F = Fake fullscreen +bind = $mainMod, V, togglefloating # V = "levitate" window +bind = $mainMod SHIFT, M, exit # M = "Murder" Hyprland (emergency) +bind = $mainMod, i, centerwindow # C = Center window (new!) + +# ==== Navigation ==== +bind = $mainMod, J, layoutmsg, cyclenext noloop +bind = $mainMod, K, layoutmsg, cycleprev noloop +bind = $mainMod, Y, layoutmsg, toggledwindle +bind = $mainMod, T, togglegroup +bind = $mainMod, O, layoutmsg, focusmaster +bind = $mainMod SHIFT, O, layoutmsg, swapwithmaster + +# ==== Workspaces ==== +bind = $mainMod, 1-9, workspace, 1-9 # Numbers for workspaces +bind = $mainMod, 0, workspace, 10 +bind = $mainMod SHIFT, 1-9, movetoworkspace, 1-9 # Shift to move windows +bind = $mainMod SHIFT, 0, movetoworkspace, 10 +bind = $mainMod, mouse_down, workspace, e+1 # Scroll workspaces +bind = $mainMod, mouse_up, workspace, e-1 + +# ==== Media/System ==== +bind = , XF86AudioPlay, exec, playerctl play-pause +bind = , XF86AudioNext, exec, playerctl next +bind = , XF86AudioPrev, exec, playerctl previous +bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindel = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ +bindel = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindel = , XF86MonBrightnessUp, exec, brightnessctl s +10% +bindel = , XF86MonBrightnessDown, exec, brightnessctl s 10%- + +# ==== Screenshots ==== +bind = , PRINT, exec, grim -g "$(slurp)" - | wl-copy # Area → clipboard +bind = $mainMod, U, exec, grim - | wl-copy # Fullscreen → clipboard +bind = $mainMod SHIFT, U, exec, sh ~/scripts/upload # this is epic uploader to my selfhosted site + +# ==== Utilities ==== +bind = $mainMod, R, exec, hyprctl reload # R = Reload config +bind = $mainMod, S, togglespecialworkspace, magic # S = Scratchpad +bind = $mainMod SHIFT, S, movetoworkspace, special:magic +bind = $mainMod, W, exec, ~/.config/hypr/scripts/wallpaper.sh # W = Wallpaper cycler + +# ==== Mouse Controls ==== +bindm = $mainMod, mouse:272, movewindow # Left-click drag to move +bindm = $mainMod, mouse:273, resizewindow # Right-click drag to resize + +# ==== Workspaces ==== +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 + +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +windowrule = suppressevent maximize, class:.* + +windowrule = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 diff --git a/hypr/hyprlock.conf b/hypr/hyprlock.conf new file mode 100644 index 0000000..e6e9775 --- /dev/null +++ b/hypr/hyprlock.conf @@ -0,0 +1,83 @@ +$text_color = rgba(FFDAD6FF) +$entry_background_color = rgba(41000311) +$entry_border_color = rgba(896E6C55) +$entry_color = rgba(FFDAD6FF) +$font_family = Rubik Light +$font_family_clock = Rubik Light +$font_material_symbols = Material Symbols Rounded + +background { + color = rgba(181818FF) + # path = "~/Pictures/wallpaper/default.jpg" + + path = screenshot + blur_size = 15 + blur_passes = 4 +} +input-field { + monitor = + size = 250, 50 + outline_thickness = 2 + dots_size = 0.1 + dots_spacing = 0.3 + outer_color = $entry_border_color + inner_color = $entry_background_color + font_color = $entry_color + fade_on_empty = true + + position = 0, 20 + halign = center + valign = center +} + +label { # Clock + monitor = + text = $TIME + color = $text_color + font_size = 65 + font_family = $font_family_clock + + position = 0, 300 + halign = center + valign = center +} +label { # Date + monitor = + text = cmd[update:5000] date +"%A, %B %d" + color = $text_color + font_size = 17 + font_family = $font_family + + position = 0, 240 + halign = center + valign = center +} + +label { # User + monitor = + text =  $USER + color = $text_color + shadow_passes = 1 + shadow_boost = 0.35 + outline_thickness = 2 + dots_size = 0.2 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.2 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true + font_size = 20 + font_family = $font_family + position = 0, 50 + halign = center + valign = bottom +} + +label { # Status + monitor = + text = cmd[update:1000] echo "$(date)" + color = $text_color + font_size = 14 + font_family = $font_family + + position = 30, -30 + halign = left + valign = top +} diff --git a/hypr/hyprpaper.conf b/hypr/hyprpaper.conf new file mode 100644 index 0000000..5d1863d --- /dev/null +++ b/hypr/hyprpaper.conf @@ -0,0 +1,2 @@ +preload = /home/yu/Pictures/wallpaper/1.png +wallpaper = , /home/yu/Pictures/wallpaper/1.png diff --git a/hypr/scripts/wallpaper.sh b/hypr/scripts/wallpaper.sh new file mode 100755 index 0000000..36024dc --- /dev/null +++ b/hypr/scripts/wallpaper.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +WALLPAPER_DIR="$HOME/Pictures/wallpaper/" +CURRENT_WALL=$(hyprctl hyprpaper listloaded) +MONITOR="HDMI-A-1" + +# Get a random wallpaper that is not the current one +WALLPAPER=$(find "$WALLPAPER_DIR" -type f ! -name "$(basename "$CURRENT_WALL")" | shuf -n 1) + +# Ensure we unload them all +hyprctl hyprpaper unload all + +# Apply the selected wallpaper +hyprctl hyprpaper reload $MONITOR,"$WALLPAPER" diff --git a/mako/config b/mako/config new file mode 100644 index 0000000..cf8e480 --- /dev/null +++ b/mako/config @@ -0,0 +1,9 @@ +background-color=#f0f0f0e0 +text-color=#111111 +border-color=#aaaaaa +border-size=2 +border-radius=6 +padding=10 +default-timeout=5000 +font=JetBrainsMono Nerd Font 13 + diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..8c14b48 --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,650 @@ +local vim = vim +local Plug = vim.fn['plug#'] + +local o = vim.opt +local g = vim.g + +o.title = true +g.mapleader = ' ' +g.maplocalleader = ' ' +g.toggle_theme_icon = "  " +g.have_nerd_font = true + +-- Line numbers +o.number = true + +-- o.spell = true +o.spelllang="en_us,es" + +-- Configure how new splits should be opened +o.splitright = true +o.splitbelow = true +o.inccommand = 'split' + +-- Tabs +o.shiftwidth = 2 +o.tabstop = 2 + +o.undofile = true +o.undodir = vim.fn.stdpath("data") .. "/undo//" + +-- https://www.reddit.com/r/neovim/comments/wlkq0e/neovim_configuration_to_backup_files_with/ +o.backup = true +o.backupdir = vim.fn.stdpath("data") .. "/backup//" + +-- o.clipboard = "unnamedplus" +-- Statuscolumn + +-- Set sign column to be 4. +-- So, if I have a new diff, It'll not feel weird, by the signcolumn expanding +o.signcolumn = "yes:1" + +-- Statusline +o.cmdheight = 0 +o.laststatus = 3 + +-- Folds +o.foldcolumn = "1" +o.foldlevel = 99 +o.foldlevelstart = 99 +o.foldenable = true + +-- Enable break indent +o.breakindent = true + +o.list = true +o.listchars = { tab = '» ', trail = '·', nbsp = '␣' } + +-- Scrolloff +o.scrolloff = 15 + +-- Show which line your cursor is on +o.cursorline = true + +-- Searching +o.ignorecase = true +o.smartcase = true + +o.pumblend = 10 -- Popup blend +o.pumheight = 10 -- Maximum number of entries in a popup + +vim.opt.hlsearch = true +vim.keymap.set('n', '', 'nohlsearch') + +local map = vim.keymap.set + +map('v', "y", '"+y') + +map('n', '', ':Treewalker Down', { noremap = true }) +map('n', '', ':Treewalker Up', { noremap = true }) +map('n', '', ':Treewalker Left', { noremap = true }) +map('n', '', ':Treewalker Right', { noremap = true }) + +-- Diagnostic keymaps +map('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous [D]iagnostic message' }) +map('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next [D]iagnostic message' }) +map('n', 'e', vim.diagnostic.open_float, { desc = 'Show diagnostic [E]rror messages' }) +map('v', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostic [Q]uickfix list' }) + +-- Prevent CapsLock from interfering with movement keys +map('n', 'J', 'j', { noremap = true }) +map('n', 'K', 'k', { noremap = true }) +map('n', 'H', 'h', { noremap = true }) +map('n', 'L', 'l', { noremap = true }) +map('n', 'U', 'u', { noremap = true }) + +-- Better window navigation (works across splits) +map('n', '', 'h', { desc = 'Move to left window' }) +map('n', '', 'j', { desc = 'Move to lower window' }) +map('n', '', 'k', { desc = 'Move to upper window' }) +map('n', '', 'l', { desc = 'Move to right window' }) + +-- Keep cursor centered during searches and jumps +map('n', 'n', 'nzzzv', { desc = 'Next search result (centered)' }) +map('n', 'N', 'Nzzzv', { desc = 'Prev search result (centered)' }) +map('n', 'G', 'Gzz', { desc = 'Jump to line (centered)' }) + +-- Clear last search highlight +map('n', 'nh', ':nohlsearch', { desc = 'Clear search highlights' }) + +-- Half-page jumping with centered cursor +map('n', '', 'zz') +map('n', '', 'zz') + +-- Move lines up/down in visual mode +map('v', 'J', ":m '>+1gv=gv", { desc = 'Move selection down' }) +map('v', 'K', ":m '<-2gv=gv", { desc = 'Move selection up' }) + +-- Quick fix list navigation +map('n', '', ':cnext', { desc = 'Next quickfix item' }) +map('n', '', ':cprev', { desc = 'Previous quickfix item' }) + +-- System clipboard integration +map('n', 'p', '"+p', { desc = 'Paste from system clipboard' }) +map('n', 'P', '"+P', { desc = 'Paste from system clipboard (before)' }) + +-- Better indentation +map('v', '<', '', '>gv', { desc = 'Indent and stay in visual mode' }) + +-- Buffer navigation +map('n', 'bn', ':bnext', { desc = 'Next buffer' }) +map('n', 'bp', ':bprevious', { desc = 'Previous buffer' }) +map('n', 'bd', ':bdelete', { desc = 'Delete buffer' }) + +-- Replace current word +map('n', 's', [[:%s/\<\>//gI]], +{ desc = 'Replace current word' }) + +-- Keep search matches in middle +map('n', '*', '*zz', { desc = 'Search word under cursor (centered)' }) +map('n', '#', '#zz', { desc = 'Search backward word (centered)' }) + +-- Quick save/quit +map('n', 'w', ':w', { desc = 'Save file' }) +map('n', 'q', ':q', { desc = 'Quit window' }) + +-- Disable hell +map('n', 'Q', 'gq') + +-- Toggle terminal +map('n', 'tt', ':terminal', +{ desc = '[T]oggle [T]erminal' }) + +-- Escape terminal mode +map('t', '', '', +{ desc = 'Exit terminal mode' }) + +-- Open chad tree +map('n', '.', ':CHADopen', { noremap = true }) + +-- Quick escape from insert mode +map('i', 'jk', '', { desc = 'Exit insert mode' }) + +-- Clear search highlights +map('n', '', 'nohlsearch', +{ desc = 'Clear search highlights' }) + +-- Toggle spellcheck +map('n', 'ts', ':set spell!', +{ desc = '[T]oggle [S]pellcheck' }) + +-- Epic Golang JSON metadata macro, piss off pussies +map('n', 'j', '_ywApbeld$bguwciw"pA"F"ijson:bi`A`_j', { noremap = true }) +map('n', '_', 'ebcw_', { noremap = true, desc = 'Replace word with _ (to ignore variable)' }) + +vim.call('plug#begin') + +-- Style +Plug 'folke/tokyonight.nvim' +Plug 'olimorris/onedarkpro.nvim' +Plug 'xiyaowong/transparent.nvim' +Plug 'alexblackie/lunarised' +Plug 'starryleo/starry-vim-colorschemes' + +-- lsp +Plug('williamboman/mason.nvim') +Plug('williamboman/mason-lspconfig.nvim') + +-- more lsp +Plug('neovim/nvim-lspconfig') +Plug('L3MON4D3/LuaSnip', { + ['tag'] = 'v2.*', +}) +Plug 'marilari88/twoslash-queries.nvim' +Plug 'neovim/nvim-lspconfig' + +-- auto complete +Plug 'hrsh7th/cmp-nvim-lsp' +Plug 'hrsh7th/cmp-buffer' +Plug 'hrsh7th/cmp-path' +Plug 'hrsh7th/cmp-cmdline' +Plug 'hrsh7th/nvim-cmp' +Plug 'zbirenbaum/copilot-cmp' -- copilot +Plug 'L3MON4D3/LuaSnip' +Plug 'saadparwaiz1/cmp_luasnip' + +-- useful stuff +Plug 'echasnovski/mini.nvim' +Plug 'zbirenbaum/copilot.lua' +Plug 'ms-jpq/chadtree' +Plug 'ryanoasis/vim-devicons' +Plug 'kyazdani42/nvim-web-devicons' +Plug 'jetzig-framework/zmpl.vim' +Plug 'folke/which-key.nvim' + +-- Personalization +Plug 'nvim-lualine/lualine.nvim' +Plug 'goolord/alpha-nvim' +Plug 'lukas-reineke/indent-blankline.nvim' +Plug 'karb94/neoscroll.nvim' +Plug 'folke/noice.nvim' +Plug 'MunifTanjim/nui.nvim' + +-- More stuff +Plug 'SmiteshP/nvim-navic' +Plug 'kr40/nvim-macros' + +-- tree sitter +Plug 'nvim-treesitter/nvim-treesitter' +Plug('aaronik/treewalker.nvim', { + opts = { + highlight = true + } +}) +vim.call('plug#end') + +vim.cmd('set background=dark') + +-- Better Around/Inside textobjects +-- +-- Examples: +-- - va) - [V]isually select [A]round [)]paren +-- - yinq - [Y]ank [I]nside [N]ext [']quote +-- - ci' - [C]hange [I]nside [']quote +require('mini.ai').setup { n_lines = 500 } + +-- Add/delete/replace surroundings (brackets, quotes, etc.) +-- +-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren +-- - sd' - [S]urround [D]elete [']quotes +-- - sr)' - [S]urround [R]eplace [)] ['] +require('mini.surround').setup() + +-- Simple and easy statusline. +-- You could remove this setup call if you don't like it, +-- and try some other statusline plugin +local statusline = require 'mini.statusline' + +-- set use_icons to true if you have a Nerd Font +statusline.setup { use_icons = vim.g.have_nerd_font } + +-- You can configure sections in the statusline by overriding their +-- default behavior. For example, here we set the section for +-- cursor location to LINE:COLUMN +---@diagnostic disable-next-line: duplicate-set-field +statusline.section_location = function() + return '%2l:%-2v' +end + +-- ... and there is more! +-- Check out: https://github.com/echasnovski/mini.nvim +require('mini.pairs').setup() + +require('nvim-treesitter.configs').setup({ + -- A list of parser names, or "all" (the listed parsers MUST always be installed) + ensure_installed = {'bash', 'c', 'html', 'lua', 'luadoc', 'markdown', 'vim', 'vimdoc'}, + + sync_install = false, + + highlight = { + enable = true, + additional_vim_regex_highlighting = false, + }, +}) + +require("mason").setup() + +local lspconfig = require('lspconfig') + +lspconfig.zls.setup({ + {cmd = '~/.zig/zls'} +}) + +local lsp_cmds = vim.api.nvim_create_augroup('lsp_cmds', {clear = true}) + +vim.api.nvim_create_autocmd('LspAttach', { + group = lsp_cmds, + desc = 'LSP actions', + callback = function() + local bufmap = function(mode, lhs, rhs) + vim.keymap.set(mode, lhs, rhs, {buffer = true}) + end + bufmap('n', 'K', 'lua vim.lsp.buf.hover()') + bufmap('n', 'gd', 'lua vim.lsp.buf.definition()') + bufmap('n', 'gD', 'lua vim.lsp.buf.declaration()') + bufmap('n', 'gi', 'lua vim.lsp.buf.implementation()') + bufmap('n', 'go', 'lua vim.lsp.buf.type_definition()') + bufmap('n', 'gr', 'lua vim.lsp.buf.references()') + bufmap('n', 'gs', 'lua vim.lsp.buf.signature_help()') + bufmap('n', '', 'lua vim.lsp.buf.rename()') + bufmap({'n', 'x'}, '', 'lua vim.lsp.buf.format({async = true})') + bufmap('n', '', 'lua vim.lsp.buf.code_action()') + bufmap('n', 'gl', 'lua vim.diagnostic.open_float()') + bufmap('n', '[d', 'lua vim.diagnostic.goto_prev()') + bufmap('n', ']d', 'lua vim.diagnostic.goto_next()') + end +}) + +require('mason-lspconfig').setup({ + ensure_installed = {}, + handlers = { + function(server) + lspconfig[server].setup({ + capabilities = lsp_capabilities, + }) + end, + } +}) + +vim.opt.completeopt = {'menu', 'menuone', 'noselect'} + +require("copilot").setup({ + suggestion = { enabled = false }, + panel = { enabled = false }, +}) +require("copilot_cmp").setup() + +local cmp = require('cmp') +local luasnip = require('luasnip') + +local select_opts = {behavior = cmp.SelectBehavior.Select} +local has_words_before = function() + if vim.api.nvim_buf_get_option(0, "buftype") == "prompt" then return false end + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 and vim.api.nvim_buf_get_text(0, line-1, 0, line-1, col, {})[1]:match("^%s*$") == nil +end + + +-- See :help cmp-config +cmp.setup({ + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end + }, + sources = { + {name = 'path'}, + {name = 'nvim_lsp', keyword_length = 3}, + {name = 'buffer', keyword_length = 3}, + {name = 'luasnip', keyword_length = 2}, + {name = 'copilot', group_index = 2} + }, + window = { + documentation = cmp.config.window.bordered() + }, + formatting = { + fields = {'menu', 'abbr', 'kind'}, + format = function(entry, item) + local menu_icon = { + nvim_lsp = 'λ', + luasnip = '⋗', + buffer = 'Ω', + path = '🖫', + } + + item.menu = menu_icon[entry.source.name] + return item + end, + }, + -- See :help cmp-mapping + mapping = { + [''] = cmp.mapping.select_prev_item(select_opts), + [''] = cmp.mapping.select_next_item(select_opts), + + [''] = cmp.mapping.select_prev_item(select_opts), + [''] = cmp.mapping.select_next_item(select_opts), + + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + + [''] = cmp.mapping.abort(), + [''] = cmp.mapping.confirm({select = false}), + + [''] = cmp.mapping(function(fallback) + if luasnip.jumpable(1) then + luasnip.jump(1) + else + fallback() + end + end, {'i', 's'}), + + [''] = cmp.mapping(function(fallback) + if luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, {'i', 's'}), + + [''] = cmp.mapping(function(fallback) + local col = vim.fn.col('.') - 1 + if cmp.visible() and has_words_before() then + cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) + elseif cmp.visible() then + cmp.select_next_item(select_opts) + elseif col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') then + fallback() + else + cmp.complete() + end + end, {'i', 's'}), + + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item(select_opts) + else + fallback() + end + end, {'i', 's'}), + }, +}) + + +-- auto save + +vim.api.nvim_create_autocmd("BufWritePost", { + pattern = "hyprland.conf", + callback = function() + os.execute("hyprctl reload") + vim.cmd.edit() + end +}) + +vim.api.nvim_create_autocmd("BufWritePost", { + pattern = "init.lua", + callback = function() + -- Reload config without restarting Neovim + vim.cmd("source $MYVIMRC") + end +}) + +-- Execute go tidy on save because nico told me so +vim.api.nvim_create_autocmd("BufWritePost", { + pattern = "*.go", + callback = function() + vim.cmd("silent! !go mod tidy") + vim.cmd("silent! edit") + end +}) + +-- Format on save +vim.api.nvim_create_autocmd('BufWritePre', { + pattern = '*', + callback = function() vim.lsp.buf.format() end +}) + +-- Code actions menu +map('n', 'ca', vim.lsp.buf.code_action, +{ desc = '[C]ode [A]ctions' }) + +-- Find references +map('n', 'gr', vim.lsp.buf.references, +{ desc = '[G]oto [R]eferences' }) + +-- files to the right +local chadtree_settings = { + ['view.open_direction'] = "right", + ['view.width'] = 20 +} +vim.api.nvim_set_var("chadtree_settings", chadtree_settings) + + +-- Customization +require('lualine').setup { + options = { + theme = 'tokyonight', + component_separators = { left = '', right = ''}, + section_separators = { left = '', right = ''}, + globalstatus = true, + icons_enabled = true + }, + sections = { + lualine_a = {'mode'}, + lualine_b = {'branch', 'diff', 'diagnostics'}, + lualine_c = { + { + 'filename', + path = 1, -- Show relative path + symbols = { modified = '  ', readonly = '  ' } + } + }, + lualine_x = { + 'encoding', + { + 'fileformat', + symbols = { unix = ' LF' } + }, + { + 'filetype', + icons_enabled = true, + icon = { align = 'right' } + } + }, + lualine_y = {'progress'}, + lualine_z = {'location'} + }, + extensions = {'chadtree', 'fugitive'} +} + +local alpha = require'alpha' +local dashboard = require'alpha.themes.dashboard' + +dashboard.section.header.val = { + [[ __ __ __ __ ______ __ __ ______ __ __ ]], + [[/\ \_\ \ /\ \/\ \ /\___ \ /\ \/\ \ /\ == \ /\ \/\ \ ]], + [[\ \____ \\ \ \_\ \\/_/ /__\ \ \_\ \\ \ __- \ \ \_\ \ ]], + [[ \/\_____\\ \_____\ /\_____\\ \_____\\ \_\ \_\\ \_____\]], + [[ \/_____/ \/_____/ \/_____/ \/_____/ \/_/ /_/ \/_____/]] +} + +dashboard.section.buttons.val = { + dashboard.button("e", " New file", ":ene startinsert "), + dashboard.button("f", "󰈞 Find file", ":CHADopen"), + dashboard.button("c", " Config", ":e ~/.config/nvim/init.lua"), + dashboard.button("q", " Quit", ":qa"), +} + +alpha.setup(dashboard.config) + +local highlight = { + "CursorColumn", + -- "Whitespace", +} +-- Indent guides +require('ibl').setup { + indent = { highlight = highlight, char = "" }, + scope = { enabled = false }, +} + +-- Smooth scrolling +require('neoscroll').setup { + mappings = {'', '', 'zz', 'zt', 'zb'}, + hide_cursor = true, + stop_eof = true, + respect_scrolloff = false, +} + +require('nvim-navic').setup { + icons = { + File = "󰈙 ", + Module = " ", + Namespace = "󰌗 ", + Package = " ", + Class = "󰌗 ", + Method = "󰆧 ", + Property = " ", + Field = " ", + Constructor = " ", + Enum = "󰕘", + Interface = "󰕘", + Function = "󰊕 ", + Variable = "󰆧 ", + Constant = "󰏿 ", + String = "󰀬 ", + Number = "󰎠 ", + Boolean = "◩ ", + Array = "󰅪 ", + Object = "󰅩 ", + Key = "󰌋 ", + Null = "󰟢 ", + EnumMember = " ", + Struct = "󰌗 ", + Event = " ", + Operator = "󰆕 ", + TypeParameter = "󰊄 ", + } +} + +vim.o.winbar = "%{%v:lua.require'nvim-navic'.get_location()%}" + +map('n', 'tt', function() + local height = math.ceil(vim.o.lines * 0.3) + vim.api.nvim_command('botright split | resize ' .. height) + vim.api.nvim_command('terminal') +end, { desc = 'Open floating terminal' }) + +-- Better theme configuration +require('tokyonight').setup { + style = 'night', + transparent = true, + styles = { + floats = 'transparent', + sidebars = 'transparent' + }, + on_highlights = function(hl, c) + hl.TelescopeBorder = { fg = c.bg_dark, bg = c.bg_dark } + hl.TelescopePromptBorder = { fg = c.orange, bg = c.bg } + end +} +vim.cmd.colorscheme('tokyonight') + +-- Etc +require('noice').setup { + cmdline = { + view = 'cmdline_popup', + format = { + cmdline = { pattern = '^:', icon = '', lang = 'vim' }, + search_down = { kind = 'search', pattern = '^/', icon = ' ', lang = 'regex' }, + search_up = { kind = 'search', pattern = '^%?', icon = ' ', lang = 'regex' }, + } + }, + popupmenu = { + backend = 'nui', + }, + views = { + cmdline_popup = { + position = { row = 5, col = '50%' }, + size = { width = 60, height = 'auto' }, + } + } +} + +require('which-key').setup { + plugins = { + marks = true, + registers = true, + spelling = { enabled = true }, + presets = { + operators = true, + motions = true, + text_objects = true, + windows = true, + nav = true, + z = true, + g = true + } + }, +} + + diff --git a/rofi/config.rasi b/rofi/config.rasi new file mode 100644 index 0000000..d794d86 --- /dev/null +++ b/rofi/config.rasi @@ -0,0 +1,189 @@ +configuration { + font: "NerdFont JetBrains Mono 10"; + show-icons: true; + icon-theme: "Deepin2022-Dark"; + + drun-display-format: "{icon} {name}"; + display-drun: "Apps"; + + scroll-method: 0; +} + +* { + background: rgba ( 19, 19, 25, 50% ); + normal-background: none; + urgent-background: none; + active-background: none; + + alternate-normal-background: none; + alternate-urgent-background: none; + alternate-active-background: none; + selected-urgent-background: none; + selected-normal-background: none; + selected-active-background: none; + + foreground: rgba ( 255, 239, 222, 100% ); + urgent-foreground: @foreground; + normal-foreground: @foreground; + active-foreground: rgba ( 101, 172, 255, 100 % ); + + alternate-normal-foreground: @foreground; + alternate-urgent-foreground: @urgent-foreground; + alternate-active-foreground: @active-foreground; + selected-urgent-foreground: none; + selected-normal-foreground: none; + selected-active-foreground: none; + + alternate-normal-foreground: @foreground; + selected-normal-foreground: rgba ( 255, 200, 87, 100% ); + + spacing: 2; + separatorcolor: rgba ( 45, 48, 59, 1 % ); + background-color: rgba ( 0, 0, 0, 0 % ); +} + +window { + background-color: @background; + border: 0; + padding: 30; +} + +listview { + lines: 10; + columns: 3; +} + +mainbox { + border: 0; + padding: 0; +} + +message { + border: 2px 0px 0px ; + border-color: @separatorcolor; + padding: 1px ; +} + +textbox { + text-color: @foreground; +} + +listview { + fixed-height: 0; + border: 8px 0px 0px ; + border-color: @separatorcolor; + spacing: 8px ; + scrollbar: false; + padding: 2px 0px 0px ; +} + +element { + border: 0; + padding: 1px ; +} + +element-text { + background-color: inherit; + text-color: inherit; +} + +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +scrollbar { + width: 4px ; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px ; + padding: 0; +} + +mode-switcher { + border: 2px 0px 0px ; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px ; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em ; + text-color: @normal-foreground; +} + diff --git a/scripts/bloat b/scripts/bloat new file mode 100755 index 0000000..bf736c7 --- /dev/null +++ b/scripts/bloat @@ -0,0 +1,278 @@ +#!/bin/sh + +# ==== Desktop Environment Bloat Detector ==== +detect_de() { + # Hierarchy of shame + echo "🖥️ DESKTOP ENVIRONMENT ANALYSIS:" + + # ==== Tier 1: Chromium-Level Bloat ==== + if [ -n "$GNOME_DESKTOP_SESSION_ID" ] || pgrep -x "gnome-shell" >/dev/null; then + echo " ☢️ GNOME DETECTED:" + echo " - 1.2GB RAM just to display a clock" + echo " - Systemd-required for 'OK' button animations" + echo " - Your extensions are duct tape on a sinking blimp" + + elif [ -n "$KDE_FULL_SESSION" ] || pgrep -x "plasmashell" >/dev/null; then + echo " 🎪 KDE PLASMA DETECTED:" + echo " - 300 configuration options for your taskbar's tooltip delay" + echo " - Ships with 17 text editors (kate, kwrite, kedit...)" + echo " - 'Lightweight' like a neutron star" + + # ==== Tier 2: "Minimal" Bloat ==== + elif [ -n "$HYPRLAND_INSTANCE_SIGNATURE" ] || pgrep -x "Hyprland" >/dev/null; then + echo " 🐍 HYPRLAND DETECTED:" + echo " - Requires 200-line config just to open Firefox" + echo " - 'GPU accelerated' but stutters on 4K terminals" + echo " - Your animations are powered by copium" + + elif [ -n "$SWAYSOCK" ] || pgrep -x "sway" >/dev/null; then + echo " 🌊 SWAY DETECTED:" + echo " - 'i3 but Wayland' (somehow 3x heavier)" + echo " - Your config file has 15 binds just for workspace switching" + echo " - Still depends on systemd (lol)" + + elif pgrep -x "i3" >/dev/null; then + echo " 🧊 I3 DETECTED:" + echo " - Config file longer than your thesis" + echo " - 'Lightweight' but requires 5 daemons for notifications" + echo " - You manually patched gaps support and now it's slower than GNOME" + + # ==== Tier 3: Respectable Minimalism ==== + elif pgrep -x "lxqt-session" >/dev/null; then + echo " 🏗️ LXQT DETECTED:" + echo " - Basically Qt for people who miss 2010" + echo " - Somehow still depends on DBus" + echo " - The 'I almost switched to dwm' starter pack" + + elif pgrep -x "lxsession" >/dev/null; then + echo " 🚲 LXDE DETECTED:" + echo " - GTK2 in 2024 (retro computing vibe)" + echo " - Last updated when Bitcoin was $200" + echo " - Actually runs on a Raspberry Pi (points for honesty)" + + # ==== Tier 4: Ascended Basedness ==== + elif pgrep -x "dwm" >/dev/null; then + echo " 🚀 DWM DETECTED:" + echo " - Config? You mean editing config.h and recompiling?" + echo " - 2000 lines of C just to avoid a .config file" + echo " - You patched in systray support and now it's 0.0001% less based" + + elif pgrep -x "xmonad" >/dev/null; then + echo " λ XMONAD DETECTED:" + echo " - Haskell-powered tiling (because C wasn't obscure enough)" + echo " - Your xmobar config is a Turing-complete program" + echo " - 'Lightweight' but depends on 47 Haskell libraries" + + # ==== Tier 5: Terminal Purists ==== + elif [ "$TERM" = "linux" ] && [ -z "$DISPLAY" ]; then + echo " 🖴 TTY DETECTED:" + echo " - Real men use framebuffer terminals" + echo " - Your 'desktop environment' is tmux + ncurses" + echo " - 100% bloat-free (but you still miss mouse support)" + + else + echo " ❓ MYSTERY DE:" + echo " - Did you install Enlightenment by accident?" + echo " - Or are you lying about using CDE?" + fi +} + +# System info +init_system=$(ps -p 1 -o comm=) +libc=$(ldd /bin/sh 2>/dev/null | grep -q "musl" && echo "musl" || echo "glibc") +priv=$(command -v doas >/dev/null && echo "doas" || (command -v sudo >/dev/null && echo "sudo" || echo "none")) +dbus_status=$(pgrep -x dbus-daemon >/dev/null && echo "running" || (command -v dbus-daemon >/dev/null && echo "installed" || echo "absent")) +shell=$(basename "${SHELL:-$(grep "^$(id -u):" /etc/passwd | cut -d: -f7)}") + +# Coreutils detection +if readlink --version 2>&1 | grep -q 'GNU coreutils'; then + coreutils="GNU coreutils" + coreutils_shame="💀 CRIMES AGAINST MINIMALISM: Using GNU coreutils (bloated, 102 binaries, huge size). Use sbase/busybox." +elif readlink --help 2>&1 | head -n1 | grep -q 'BusyBox'; then + coreutils="BusyBox" + coreutils_shame="✅ Based: BusyBox user detected (1MB static binary)." +else + coreutils="Unknown" + coreutils_shame="❓ Mystery coreutils. Probably worse than GNU." +fi + +# ===== Package Manager Detection ===== +echo "System: $(source /etc/os-release; echo "$PRETTY_NAME")" + +if command -v xbps-query >/dev/null; then + # Void Linux + total=$(xbps-query -l | wc -l) + conscious=$(xbps-query -m | wc -l) + gnu=$(xbps-query -s gnu | wc -l) +elif command -v pacman >/dev/null; then + # Arch Linux + total=$(pacman -Qq | wc -l) + conscious=$(pacman -Qqen | wc -l) + gnu=$(pacman -Qqs gnu | wc -l) +elif command -v dpkg >/dev/null; then + # Debian/Ubuntu + total=$(dpkg -l | grep '^ii' | wc -l) + conscious=$(apt-mark showmanual | wc -l) + gnu=$(apt-mark showmanual | grep -i gnu | wc -l) +elif command -v rpm >/dev/null && command -v dnf >/dev/null; then + # Fedora/RHEL + total=$(rpm -qa | wc -l) + conscious=$(dnf history userinstalled | grep -v '^ID' | wc -l) + gnu=$(yum list --installed | wc -l) +else + echo "Error: Unsupported package manager" + return 1 +fi + +# ===== Application Shame Detection ===== +echo "🔴 SHAME LIST:" + +# 1. GNU Coreutils +[ "$coreutils" = "GNU coreutils" ] && echo " - $coreutils_shame" + +# 2. glibc +[ "$libc" = "glibc" ] && echo " - 💀 GLIBC DETECTED: Your binaries are fat with NSS+locale bloat. Use musl." + +# 3. systemd +[ "$init_system" = "systemd" ] && echo " - 💀 SYSTEMD: Your boot is slower than Windows 10. Use runit/openrc." + +# 4. dbus/elogind/pulseaudio +if [ "$dbus_status" != "absent" ]; then + echo " - 💀 DBUS: Your IPC is a Rube Goldberg machine. Try seatd+pipewire." +fi +command -v pulseaudio >/dev/null && echo " - 💀 PULSEAUDIO: Audio stack from 2007. PipeWire exists." + +# 5. Bash/Zsh +case "$shell" in + *bash*) echo " - 💀 BASH: 1.5MB shell for people who autocomplete 'sudo rm -rf'" ;; + *zsh*) echo " - 💀 ZSH: Your .zshrc is 200 lines to change the prompt" ;; + *dash*) echo " - ✅ Based: dash user (100KB POSIX shell)" ;; + *ash*) echo " - ✅ Based: ash/busybox shell enjoyer" ;; +esac + +# 6. Build systems +command -v cmake >/dev/null && echo " - 💀 CMAKE: Your build system generates Makefiles that generate Ninja files that run shell scripts" +command -v meson >/dev/null && echo " - 🐍 MESON: 'We replaced CMake with Python' (why?)" + +# 7. sudo vs doas +[ "$priv" = "sudo" ] && echo " - 💀 SUDO: 5MB config parser with CVEs. doas is 50KB." +[ "$priv" = "none" ] && echo " - ⚠️ No privilege escalator found. Are you root or reckless?" + +# ===== Flatpak/Snap/Distrobox Detection ===== +flatpak_bloat=0 +snap_bloat=0 + +if command -v flatpak >/dev/null; then + flatpak_bloat=$(flatpak list --columns=application | wc -l) + echo "🚀 Flatpak Detected:" + echo "Total Flatpaks : $flatpak_bloat" + echo "Top 5 Largest:" + flatpak list --columns=application,size | sort -k2 -hr | head -n5 | sed 's/^/ /' + [ $flatpak_bloat -gt 0 ] && echo " - 💀 FLATPAK: Your apps ship with their own copies of glibc (from 2018)" +fi + +if command -v snap >/dev/null; then + snap_bloat=$(snap list | wc -l) + echo "🐦 Snap Detected:" + echo "Total Snaps : ${snap_bloat}" + echo "Top 5 Largest:" + snap list --all | awk 'NR>1 {print $1,$5}' | sort -k2 -hr | head -n5 | sed 's/^/ /' + [ $snap_bloat -gt 0 ] && echo " - 💀 SNAP: Congratulations on your 20GB /var/lib/snapd" +fi + +# GIGACHAD Distrobox Bloat Inspector +# Checks your containers and roasts them appropriately + +# 100% POSIX-compliant Distrobox Bloat Inspector +# No numfmt, no bashisms, no weak dependencies + +bytes_to_human() { + bytes=$1 + if [ "$bytes" -ge 1073741824 ]; then + printf "%.1fGiB" "$(echo "$bytes / 1073741824" | bc -l)" + elif [ "$bytes" -ge 1048576 ]; then + printf "%.1fMiB" "$(echo "$bytes / 1048576" | bc -l)" + elif [ "$bytes" -ge 1024 ]; then + printf "%dKiB" "$((bytes / 1024))" + else + printf "%dB" "$bytes" + fi +} + +# Ultra-minimalist Distrobox Bloat Checker +# POSIX-compliant, dependency-free (except distrobox/docker) + +echo "📦 Distrobox Containers Found:" + +distrobox-list | tail -n +2 | while IFS='|' read -r id name status _; do + name=$(echo "$name" | xargs) + status=$(echo "$status" | xargs) + + case "$status" in + Up*) echo " 🚀 $name: RUNNING (stop wasting RAM)" ;; + Exited*) echo " 💀 $name: DEAD (but still wasting disk space)" ;; + *) echo " ❓ $name: WEIRD STATE ('$status')" ;; + esac +done + +# ===== Fedora Special Shame ===== +if [[ "$distro_name" == *"Fedora"* ]]; then + echo "🐄 FEDORA USER DETECTED:" + echo " - Enjoy your 300MB 'dnf' transactions" + echo " - SELinux is judging you right now" + echo " - OpenBSD is more secure LMAO" + echo " - Your /usr/bin is 60% Python wrappers" + rpm -q fedora-release | grep -q 38 && echo " - Still on F38? Even Red Hat gave up on you" +fi + +# Extra +echo "🔍 RUNNING APP SCAN:" +if pidof discord >/dev/null; then + discord_ram=$(ps -o rss= -p $(pidof discord) | awk '{print $1/1024}') + echo " - 💀 DISCORD: ${discord_ram%.*}MB RAM but now you can blame Activision Blizzard (use Revolt/Matrix)" +fi + +if pgrep -x "spotify" >/dev/null; then + echo " - 💀 SPOTIFY: Your music player phones home more than a CIA operative" + echo " >> Try 'spotifyd' + 'ncspot' for actual Linux vibes" +fi + +if pgrep -x "steam" >/dev/null; then + echo " - 💀 STEAM: Your gaming rig runs 3 copies of glibc (2012 edition)" +fi + +# Final inspection +detect_de + +# ===== Bloat Calculations ===== +non_gnu=$((conscious - gnu)) +[ "$conscious" -ne 0 ] || conscious=1 +gnu_ratio=$((gnu * 100 / conscious)) +total_bloat=$((gnu_ratio + flatpak_bloat + snap_bloat + (distrobox_bloat * 10))) + +# ===== Bloat Report ===== +echo "💣 THERMONUCLEAR BLOAT REPORT:" +echo "-------------------------------" +echo "Traditional Packages:" +echo " Total : $total" +echo " Conscious choices : $conscious" +echo " GNU ratio : ${gnu_ratio}%" +echo " Containerized Crimes:" +echo " Flatpaks : ${flatpak_bloat}" +echo " Snaps : ${snap_bloat}" +echo " Distrobox : ${distrobox_bloat} containers" +echo "-------------------------------" +echo "TOTAL BLOAT SCORE : ${total_bloat}/300" + +# ===== Final Verdict ===== +if [ $total_bloat -lt 50 ]; then + echo "Status: Alpine Linux would be proud 🏔️" +elif [ $total_bloat -lt 90 ]; then + echo "Status: Mild bloat (Debian netinstall tier) 🐖" +elif [ $total_bloat -lt 130 ]; then + echo "Status: Obese (Ubuntu desktop territory) 🐘" +else + echo "Status: GNOME-DE level catastrophe ☢️" + [ "$init_system" = "systemd" ] && echo " >> Your journalctl is a novel about failed starts" + [ $flatpak_bloat -gt 0 ] && echo " >> Flatpaks detected: Your ~/.var is a filesystem tumor" +fi diff --git a/scripts/circumspicio b/scripts/circumspicio new file mode 100755 index 0000000..11517f4 --- /dev/null +++ b/scripts/circumspicio @@ -0,0 +1,4 @@ +#!/bin/sh + +# circumspiciō: Latin for looking around, inspecting +du -a ~/my-repos/* | awk '{print $2}' | fzf | xargs -r $EDITOR diff --git a/scripts/img b/scripts/img new file mode 100755 index 0000000..12dd598 --- /dev/null +++ b/scripts/img @@ -0,0 +1,34 @@ +#!/bin/sh + +# GIGACHAD image viewer script +# Usage: img [directory] + +# Set default directory to current if none provided +dir="${1:-.}" + +# Check if sxiv is installed +if ! command -v sxiv >/dev/null 2>&1; then + echo "ERROR: sxiv not found. Install this gigachad viewer first!" >&2 + exit 1 +fi + +# Verify the directory exists +if [ ! -d "$dir" ]; then + echo "ERROR: Directory '$dir' not found" >&2 + exit 1 +fi + +# Find images (common extensions) and pass to sxiv +find "$dir" -maxdepth 1 -type f \( \ + -iname "*.jpg" -o \ + -iname "*.jpeg" -o \ + -iname "*.png" -o \ + -iname "*.gif" -o \ + -iname "*.bmp" -o \ + -iname "*.tif" -o \ + -iname "*.tiff" -o \ + -iname "*.svg" -o \ + -iname "*.webp" \ +\) | sort | sxiv -i -f - + +exit 0 diff --git a/scripts/killer b/scripts/killer new file mode 100755 index 0000000..7a12eb9 --- /dev/null +++ b/scripts/killer @@ -0,0 +1,9 @@ +#!/bin/sh +ps a | awk ' + NR > 1 { + pid = $1 + $1 = $2 = $3 = $4 = "" + sub(/^ */, "", $0) + print pid " " $0 + } + ' | (wofi --style ~/.config/wofi/style/style.css -dmenu -l 10 || exit 0) | awk '{print $1}' | xargs kill -9 diff --git a/scripts/lfub b/scripts/lfub new file mode 100755 index 0000000..f9bb2df --- /dev/null +++ b/scripts/lfub @@ -0,0 +1,24 @@ +#!/bin/sh + +# This is a wrapper script for lf that allows it to create image previews with +# ueberzug. This works in concert with the lf configuration file and the +# lf-cleaner script. + +set -e + +cleanup() { + exec 3>&- + rm "$FIFO_UEBERZUG" +} + +if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then + lf "$@" +else + [ ! -d "$HOME/.cache/lf" ] && mkdir -p "$HOME/.cache/lf" + export FIFO_UEBERZUG="$HOME/.cache/lf/ueberzug-$$" + mkfifo "$FIFO_UEBERZUG" + ueberzug layer -s <"$FIFO_UEBERZUG" -p json & + exec 3>"$FIFO_UEBERZUG" + trap cleanup HUP INT QUIT TERM PWR EXIT + lf "$@" 3>&- +fi diff --git a/scripts/menu b/scripts/menu new file mode 100755 index 0000000..20aeff8 --- /dev/null +++ b/scripts/menu @@ -0,0 +1,3 @@ +#!/bin/sh + +kill $(pidof wofi) || wofi --style ~/.config/wofi/style/style.css --show drun diff --git a/scripts/nekos b/scripts/nekos new file mode 100755 index 0000000..e9695d8 --- /dev/null +++ b/scripts/nekos @@ -0,0 +1,32 @@ +#!/bin/sh + +api="https://nekos.life/api/v2/img/wallpaper" + +MONITOR="HDMI-A-1" +TMPDIR=$(mktemp -d) || { echo "FAILED TO CREATE TMPDIR 🥀"; exit 1; } + +wallpaper_url=$(curl -sf "$api" | awk -F'"' '/url/{print $4; exit}') || { + echo "API request failed 🥀" + exit 1 +} + +extension=$(echo "$wallpaper_url" | sed -E 's/.*\.([a-zA-Z]+).*/\1/' | head -c 5) + +wallpaper="$TMPDIR/wallpaper.$extension" + +echo $wallpaper_url " into " $wallpaper +curl -sfL "$wallpaper_url" -o "$TMPDIR/wallpaper.$extension" || { + echo "Download failed 🥀" + exit 1 +} + +if [ ! -s "$wallpaper" ]; then + echo "Empty wallpaper file 🥀" + exit 1 +fi + +# Ensure we unload them all +hyprctl hyprpaper unload all&>/dev/null + +# Apply the selected wallpaper +hyprctl hyprpaper reload $MONITOR,"$wallpaper"&>/dev/null diff --git a/scripts/rimor b/scripts/rimor new file mode 100644 index 0000000..0f3ff00 --- /dev/null +++ b/scripts/rimor @@ -0,0 +1,2 @@ +#!/bin/sh +du -a ~/my-repos/* | awk '{print $2}' | fzf | xargs -r $EDITOR diff --git a/scripts/stay b/scripts/stay new file mode 100755 index 0000000..b7e61e0 --- /dev/null +++ b/scripts/stay @@ -0,0 +1,3 @@ +#!/bin/sh + +ghostty --command="$*; tput setaf 5 bold; read -p 'Press any key to exit' -s -n 1" >/dev/null 2>&1 diff --git a/scripts/steal b/scripts/steal new file mode 100755 index 0000000..38497ed --- /dev/null +++ b/scripts/steal @@ -0,0 +1,46 @@ +#!/bin/sh +# NO CUCKED ZSH OR BASH, JUST POSIX ASH/DASH +# BECAUSE THIS MUST RUN IN MY PC AND I USE VOID BTW + +# cucked auth for simonet's minio instance +MINIO_KEY="suiVHTeAr9N7cpvQYEmz" +MINIO_SECRET="fA8PDZiCGXQuDSARiIlRCdHu9in6MpRF2NNBJlau" + +# Usage: ./steal cunny "link to yuzu's website cuz it's full of cunny" +# EXPLANATION OF CUCKED VARIABLES +# $1 IS A STRING TO THE FOLDER NAME YOU WANT +# $2 IS A STRING TO THE URL YOU WANT TO STEAL FROM +# ALL WALLPAPERS WILL BE UPLOADED TO ENV VARIABLE 'BUCKET' (defaults to 'wallpapers') +# SET 'MINIO_KEY' TO YOUR KEY +# SET 'MINIO_SECRET' TO YOUR SECRET, CAREFUL, THIS MAY ONLY BE COPIED ONCE +# MATIAS IS A CUCKHOLD AND A FAGGOT LOL + +# HARDCODED CHAD CONFIG (NO PUSSY VARIABLES) +MINIO_HOST="simxnet.andremor.eu.org:9000" +BUCKET="wallpapers" + +sub_folder=$1 + +# CREATE TEMP DIR (GIGA CHAD STYLE) +TMPDIR=$(mktemp -d) || { echo "FAILED TO CREATE TMPDIR 🥀"; exit 1; } +trap 'rm -rf "$TMPDIR"' EXIT + +# STEAL IMAGES LIKE A TRUE GENTLEMAN +# CREDIT TO SIMONET FOR THIS SNIPPET SHE GOONED HARD FOR IT +echo "🕵️‍♂️ STEALING WALLPAPERS FROM $2..." +gallery-dl --filter "extension in ('jpg','jpeg','png','webp')" \ + --range 1-50 \ + --no-skip \ + -D "$TMPDIR" \ + "$2" || { echo "❌ STEALING FAILED LOL YOU ARE A CUCK"; exit 1; } + +# UPLOAD EACH FILE WITH MAXIMUM CHAD ENERGY +# THANKS TO INSPECT ELEMENT COPY AS VALUE/CURL + SOME TINKERING +find "$TMPDIR" -type f | while read -r file; do + echo "🚀 UPLOADING $(basename "$file")..." + sh -c 'curl -s -X PUT -T "$file" -H "Host: $MINIO_HOST" -H "Date: $(date -R)" -H "Content-Type: $(file -b --mime-type "$file" 2>/dev/null || echo 'application/octet-stream')" -H "Authorization: AWS $MINIO_KEY:$(echo -en "PUT\n\n$(file -b --mime-type "$file")\n$(date -R)\n/$BUCKET/$sub_folder/$(basename "$file")" | openssl sha1 -hmac "$MINIO_SECRET" -binary | base64)" "https://$MINIO_HOST/$BUCKET/$sub_folder/$(basename "$file")"' & +done + +wait # WAIT FOR ALL UPLOADS TO FINISH + +echo "✅ ALL WALLPAPERS STOLEN AND LOLLIES HIDDEN FROM THE FEDS" diff --git a/scripts/upload b/scripts/upload new file mode 100755 index 0000000..6c4b0ec --- /dev/null +++ b/scripts/upload @@ -0,0 +1,25 @@ +#!/bin/sh + +grim -g "$(slurp)" -o screenshot /tmp/screenshot.png || { + notify-send "Screenshot Failed" "Selection cancelled" + exit 1 +} + +response=$(curl -X POST \ + -H "Authorization: Bearer simxnet" \ + -F "file=@/tmp/screenshot.png;type=image/png" \ + https://simxnet.andremor.eu.org:8080/upload) || { + notify-send "Upload Failed" "Could not connect to server" + exit 1 +} + +path=$(echo "$response" | sed -E 's/.*"(\/file\/[a-f0-9-]+)".*/\1/') + +url="https://simxnet.andremor.eu.org:8080$path" + +wl-copy "$url" + +# works with dbus so check if you have it +notify-send "Screenshot Uploaded" "URL copied to clipboard!" --app-name="Chad Uploader" --icon=dialog-information + +rm -f /tmp/screenshot.png diff --git a/wallpaper.jpg b/wallpaper.jpg new file mode 100644 index 0000000..b32f123 Binary files /dev/null and b/wallpaper.jpg differ diff --git a/waybar/config b/waybar/config new file mode 100644 index 0000000..7f61694 --- /dev/null +++ b/waybar/config @@ -0,0 +1,134 @@ +{ + "layer": "top", + // Using margin-bottom with a negative value in order to reduce the space between Hyprland window and waybar + "margin-bottom": -10, + "modules-left": ["custom/launcher", "clock", "hyprland/workspaces"], + "modules-right": ["custom/clipboard", "pulseaudio", "bluetooth", "cpu", "memory", "tray", "custom/power"], + + "pulseaudio": { + "tooltip": false, + "scroll-step": 5, + "format": "{icon} {volume}%", + "format-muted": "{icon} {volume}%", + "on-click":"pactl set-sink-mute @DEFAULT_SINK@ toggle", + "format-icons": { + "default": ["", "", ""] + } + }, + "network": { + // "interface": "wlp2*", // (Optional) To force the use of this interface + "format-wifi": "", + "format-ethernet": "", + "tooltip-format": "{essid} ({signalStrength}%)", + "format-linked": "{ifname} (No IP) ", + "format-disconnected": "⚠", + "format-alt": "{ifname}: {ipaddr}/{cidr}" + }, + "tray":{ + "icon-size":18, + "spacing": 10 + }, + "clock": { + "format": " {:%H:%M:%S}", // 24h full scientific + "format-alt": " {:%Y-%m-%d}" + }, + "cpu": { + "interval": 15, + "format": " {}%", + "max-length": 10 + }, + "memory": { + "interval": 5, + "format": " {}%", + "max-length": 10 + }, + "custom/spotify": { + "interval": 1, + "return-type": "json", + "exec": "sh ~/.config/waybar/scripts/spotify.sh", + "exec-if": "pgrep spotify", + "escape": true + }, + "custom/launcher":{ + "format": " Run", + "on-click": "~/scripts/menu", + "on-click-right": "killall wofi" + }, + "custom/power":{ + "format": " Exit", + "on-click": "sh ~/.config/wofi/scripts/power.sh", + }, + "bluetooth": { + "format": " {status}", + "format-disabled": "", // an empty format will hide the module + "format-connected": " Devices: #{num_connections}", + "tooltip-format": "{device_alias}", + "tooltip-format-connected": " {device_enumerate}", + "tooltip-format-enumerate-connected": "{device_alias}", + "on-click": "sh ~/.config/wofi/scripts/bluetooth.sh" + }, + "temperature": { + "format": " {temperatureC}°C", + "format-critical": " {temperatureC}°C", + "interval": 1, + "critical-threshold": 80 + }, + "custom/clipboard":{ + "max-length": 10, + "format":"  ", + "on-click": "cliphist list | wofi --style ~/.config/wofi/style/style.css --show dmenu | cliphist decode | wl-copy", + "interval": 86400 + }, + "hyprland/workspaces": { + "persistent-workspaces": { + "*":[1,2,3,4,5,6], + }, + "all-output": true, + "on-scroll-up": "hyprctl dispatch workspace r+1", + "on-scroll-down": "hyprctl dispatch workspace r-1", + "on-click-forward": "hyprctl dispatch workspace r+1", + "on-click-backward": "hyprctl dispatch workspace r-1", + "format": "{icon} {windows}", + "format-icons": { + "1": "", + "2": "󰖟", + "3": "", + "4": "󰯄", + "5": "󰙯", + "6": "", + "urgent": "", + "active": "", + "default": "" + }, + "window-rewrite-default": "{title}", + "window-rewrite": { + "class": "Web", + "class": "Thunderbird", + // having set title in init.lua + // eg: vim.opt.title = true + "class title<.*nvim.*>": "Code", + "class": "Ghostty", + "class": "Video player", + "class": "Discord", + "class": "Session", + "class": "KeePassXC", + "title<.*MONERO.*>":"Monero", + "title<.*bluetooth.*>":"Bluetooth", + "title<.*searx.*>":"SearX", + "title<.*telegram.*>": "Telegram", + "title<.*discord.*>": "Cord", + "title<.*outlook.*>": "Outlook", + "title<.*youtube.*>": "Youtube", + "title<.*Gitea.*": "Gitea", + "title<.*Codeberg.*": "Codeberg", + "title<.*github.*>": "Github", + "title<.*gitlab.*>": "Gitlab", + "title<.*twitch.*>": "Twitch", + "title<.*reddit.*>": "Reddit", + "title<.*matrix.*>": "Matrix", + "title<.*signal.*>": "Signal", + "title<.*torrent.*>": "Torrent", + "title<.*yuzucchii.*>": "yuzucchii.xyz", + }, + } +} diff --git a/waybar/scripts/spotify.sh b/waybar/scripts/spotify.sh new file mode 100755 index 0000000..80c6876 --- /dev/null +++ b/waybar/scripts/spotify.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +class=$(playerctl metadata --player=spotify --format '{{lc(status)}}') +icon="" + +case "$class" in + "playing") + info=$(playerctl metadata --player=spotify --format '{{artist}} - {{title}}') + if [ "${#info}" -gt 40 ]; then + info=$(printf '%.40s...' "$info") + fi + text="$info $icon" + ;; + "paused") + text="$icon" + ;; + "stopped") + text="" + ;; + *) + text="" + ;; +esac + +printf '{"text":"%s", "class":"%s"}\n' "$text" "$class" diff --git a/waybar/style.css b/waybar/style.css new file mode 100644 index 0000000..47aeb1d --- /dev/null +++ b/waybar/style.css @@ -0,0 +1,182 @@ +@define-color glass-white rgba(255,255,255, 0.4); +@define-color glass-black rgba(0,0,0, 0.2); + +* { + border: none; + font-family: "JetBrainsMono Nerd Font"; + font-size: 13px; + min-height: 20px; +} + +/* +window#waybar { + background: + linear-gradient( + 160deg, + rgba(255, 255, 255, 0.95) 0%, + rgba(245, 240, 255, 0.85) 100% + ), + radial-gradient( + circle at 90% 50%, + rgba(255, 255, 255, 0.6) 0%, + rgba(255, 255, 255, 0) 70% + ); + box-shadow: + inset 0 4px 8px rgba(255, 255, 255, 0.6), + 0 6px 12px rgba(0, 0, 0, 0.15), + 0 0 0 1px rgba(255, 255, 255, 0.4); + border-bottom: 1px solid rgba(230, 225, 220, 0.8); + border-radius: 0 0 8px 8px; +}*/ +window#waybar { + background: + /* Base glass layer */ + linear-gradient( + 160deg, + rgba(255, 255, 255, 0.85) 0%, + rgba(245, 245, 245, 0.75) 100% + ), + /* Light streak */ + radial-gradient( + circle at 95% 50%, + rgba(255, 255, 255, 0.7) 0%, + rgba(255, 255, 255, 0) 80% + ), + /* Noise texture for frosted effect */ + url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg=="); + box-shadow: + inset 0 4px 8px rgba(255, 255, 255, 0.7), + inset 0 -2px 4px rgba(0, 0, 0, 0.1), + 0 8px 16px rgba(0, 0, 0, 0.2), + 0 0 0 1px rgba(255, 255, 255, 0.5); + border-bottom: 1px solid rgba(255, 255, 255, 0.4); + border-radius: 0 0 12px 12px; +} + +/* Monochrome Workspaces */ +#workspaces { + margin: 4px 10px; +} + +#workspaces button { + color: #555; + background: linear-gradient(145deg, + rgba(250, 250, 250, 0.9) 0%, + rgba(235, 235, 235, 0.9) 100%); + border: 1px solid rgba(200, 200, 200, 0.4); + min-width: 40px; + /* little fix */ + padding: 4px 8px 4px 10px; + border-radius: 6px; + margin: 2px 2px 2px; + transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + box-shadow: + 0 2px 4px rgba(0, 0, 0, 0.05), + inset 0 -1px 2px rgba(255, 255, 255, 0.5); + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5); +} + +#workspaces button.active { + color: #222; + background: linear-gradient(145deg, + rgba(235, 220, 255, 0.9) 0%, + rgba(220, 200, 255, 0.9) 100%); + box-shadow: + 0 3px 6px rgba(0, 0, 0, 0.1), + inset 0 -1px 2px rgba(255, 255, 255, 0.6); + text-shadow: + 0 1px 1px rgba(255, 255, 255, 0.8); +} + +#workspaces button:hover { + color: #0066cc; /* Dark blue text */ + background: linear-gradient(145deg, + rgba(245, 245, 245, 0.9) 0%, + rgba(225, 225, 225, 0.9) 100%); +} + +/* Monochrome Modules */ +#bluetooth, #pulseaudio, #clock, #tray, #custom-clipboard, #custom-launcher, #custom-power { + margin: 6px 2px 6px; + padding: 0px 16px 0px; + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.8) 0%, + rgba(245, 245, 245, 0.6) 100%); + border: 1px solid rgba(220, 220, 220, 0.4); + border-radius: 6px; + color: #444; + box-shadow: + 0 2px 6px rgba(0, 0, 0, 0.06), + inset 0 1px 2px rgba(255, 255, 255, 0.6); +} + + +/* Monochrome Modules */ +#network, #cpu, #memory { + background: none; + border: none; + padding: 0px 10px 0px; + color: #444; +} + +/* Special buttons */ +#custom-launcher { + margin-left: 6px; + padding: 2px 8px 2px; +} + +#custom-power { + margin-right: 6px; + background: linear-gradient(145deg, + rgba(255, 230, 230, 0.8) 0%, + rgba(255, 200, 200, 0.6) 100%); + padding: 2px 8px 2px; + box-shadow: + 0 2px 4px rgba(0, 0, 0, 0.08), + inset 0 1px 2px rgba(255, 255, 255, 0.6); + transition: all 0.2s ease; +} + +#custom-power:hover { + background: linear-gradient(145deg, + rgba(255, 200, 200, 0.8) 0%, + rgba(255, 150, 150, 0.6) 100%); +} + +/* Urgent in B&W */ +#workspaces button.urgent { + animation: monochrome-pulse 2s infinite; + color: #000; + background: linear-gradient(145deg, + rgba(200, 200, 200, 0.9) 0%, + rgba(180, 180, 180, 0.9) 100%); +} + +@keyframes monochrome-pulse { + 0% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1); } + 100% { box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1); } + 70% { box-shadow: 0 0 0 6px rgba(0, 0, 0, 0); } +} + +/* Tray Adjustments */ +#tray { + padding: 2px 8px 2px; + margin-right: 3px; + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.7) 0%, + rgba(245, 245, 245, 0.5) 100%); +} + +/* Hover States */ +#bluetooth:hover, +#pulseaudio:hover, +#clock:hover, +#tray:hover, +#custom-launcher:hover, +#custom-clipboard:hover { + background: linear-gradient(145deg, + rgba(255, 255, 255, 0.9) 0%, + rgba(250, 250, 250, 0.7) 100%); + color: #0066cc; /* Dark blue text */ +} + diff --git a/wofi/config b/wofi/config new file mode 100644 index 0000000..020cb09 --- /dev/null +++ b/wofi/config @@ -0,0 +1,16 @@ +width=600 +height=300 +location=center +show=drun +filter_rate=100 +allow_markup=true +no_actions=true +halign=fill +orientation=vertical +content_halign=fill +insensitive=true +allow_images=true +image_size=40 +gtk_dark=true +dynamic_lines=true +hide_search=true diff --git a/wofi/scripts/bluetooth.sh b/wofi/scripts/bluetooth.sh new file mode 100755 index 0000000..a6906d7 --- /dev/null +++ b/wofi/scripts/bluetooth.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +# List all paired devices and extract names and MAC addresses +bluetoothctl devices | while read -r _ mac name; do + printf '%s - %s\n' "$name" "$mac" +done > /tmp/bt_devices.$$ + +# Use wofi to display the list of devices and capture the selected one +selected_device=$(wofi --style ~/.config/wofi/style/style.css --show dmenu --prompt "Select Device" --width 300 --height 500 --lines 10 < /tmp/bt_devices.$$) + +# Clean up temp file +rm -f /tmp/bt_devices.$$ + +# If a device is selected, connect to it +if [ -n "$selected_device" ]; then + mac_address=$(echo "$selected_device" | awk '{print $NF}') + bluetoothctl connect "$mac_address" +fi diff --git a/wofi/scripts/emojis.sh b/wofi/scripts/emojis.sh new file mode 100755 index 0000000..fe3da77 --- /dev/null +++ b/wofi/scripts/emojis.sh @@ -0,0 +1,1877 @@ +#!/bin/sh +EMOJI_LIST=$(cat <