Compare commits
69 Commits
3827de7d7c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c73a335b9 | |||
| fa4f7a322d | |||
| 561e478849 | |||
| ad539234f1 | |||
| b62db3a09d | |||
| 0513ab1abb | |||
| 84f51e8365 | |||
| 4b08df386f | |||
| 491f2b2765 | |||
| 5c29ef00f1 | |||
| 5b40c331b6 | |||
| 901cfeca0d | |||
| a1001e521e | |||
| aae8be4001 | |||
| 5dce5eb3b7 | |||
| 06b5aaa2d8 | |||
| 84c0bb23b8 | |||
| 3ec778781d | |||
| 30425fa1e4 | |||
| b55b45f25e | |||
| 6bb29b7539 | |||
| 3481125919 | |||
| 798ecf40a2 | |||
| eabcc3de6b | |||
| bf9d570ff3 | |||
| 2c3c58e92d | |||
| bc2c508969 | |||
| 8b12bc3a3b | |||
| e628456780 | |||
| 3c463300b5 | |||
| 984027efcb | |||
| 1c12506728 | |||
| 568a81a94d | |||
| 9ee3da3100 | |||
| fab1c53cb3 | |||
| f29cf5e920 | |||
| 3ef8420a21 | |||
| 7805b3c98d | |||
| ccb5b1ab96 | |||
| c65c286606 | |||
| 34ce514c75 | |||
| 6e6376eee9 | |||
| d3617c3866 | |||
| 378cc51cc3 | |||
| 1bd5bebcda | |||
| d96970bc8d | |||
| 4bf3764855 | |||
| af00cb8735 | |||
| 1ba46fb540 | |||
| 6796b1a28f | |||
| 88575db93b | |||
| c14d09c169 | |||
| 939e9fbc88 | |||
| 93f9c77ad3 | |||
| 337b2f1ffd | |||
| cd1126b2ea | |||
| 22e667051a | |||
| b1f76d6ac2 | |||
| f171fe16fb | |||
| dac5c77bed | |||
| 4b3fd8bfa6 | |||
| 0506b1fa6d | |||
| d91355f602 | |||
| d5ce4b4b19 | |||
| e36719997a | |||
| e972fa387d | |||
| d88f49732c | |||
| b1341b7920 | |||
| 9dcb1ac329 |
@@ -1,6 +0,0 @@
|
||||
# Floating
|
||||
windowrule = float 1, match:title Play Timer
|
||||
|
||||
# Opacity
|
||||
windowrule = opacity 0.9 0.75, match:class $terminal
|
||||
|
||||
31
.config/hypr/applications.lua
Normal file
31
.config/hypr/applications.lua
Normal file
@@ -0,0 +1,31 @@
|
||||
-- Opacity
|
||||
hl.window_rule({
|
||||
name = "opacity_0_75_0_6",
|
||||
match = {
|
||||
class = ".*" .. terminal .. ".*"
|
||||
},
|
||||
opacity = "0.75 0.6",
|
||||
})
|
||||
|
||||
-- Workspaces
|
||||
hl.window_rule({
|
||||
workspace = "1",
|
||||
match = {
|
||||
class = ".*[Mm]inecraft.*"
|
||||
}
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
workspace = "1",
|
||||
match = {
|
||||
class = ".*[Ss]team*."
|
||||
}
|
||||
})
|
||||
|
||||
hl.window_rule({
|
||||
name = "shrink-file-picker",
|
||||
match = { class = "^(xdg-desktop-portal-gtk)$" },
|
||||
float = true,
|
||||
size = {900, 900},
|
||||
move = {"(monitor_w - window_w) / 2", "(monitor_h - window_h) / 2"},
|
||||
})
|
||||
@@ -1,68 +0,0 @@
|
||||
general {
|
||||
# Gaps & borders – light and uncluttered
|
||||
gaps_in = 4
|
||||
gaps_out = 6
|
||||
gaps_workspaces = 32
|
||||
|
||||
border_size = 1
|
||||
col.active_border = rgba(0DB7D4FF)
|
||||
col.inactive_border = rgba(31313633)
|
||||
|
||||
no_focus_fallback = true
|
||||
allow_tearing = true
|
||||
|
||||
snap {
|
||||
enabled = true
|
||||
window_gap = 4
|
||||
monitor_gap = 6
|
||||
respect_gaps = true
|
||||
}
|
||||
}
|
||||
|
||||
dwindle {
|
||||
preserve_split = true
|
||||
smart_split = false
|
||||
smart_resizing = false
|
||||
}
|
||||
|
||||
decoration {
|
||||
rounding = 10
|
||||
|
||||
shadow {
|
||||
enabled = yes
|
||||
range = 16
|
||||
render_power = 2
|
||||
color = rgba(00000040)
|
||||
}
|
||||
|
||||
blur {
|
||||
enabled = yes
|
||||
size = 5
|
||||
passes = 2
|
||||
vibrancy = 0.14
|
||||
}
|
||||
}
|
||||
|
||||
animations {
|
||||
enabled = yes
|
||||
|
||||
# Light, fast easing — no bounce, no drag
|
||||
bezier = breeze, 0.22, 0.61, 0.36, 1.0
|
||||
|
||||
# Windows: quick, soft, intentional
|
||||
animation = windows, 1, 5, breeze, slidefade
|
||||
animation = windowsOut, 1, 4, breeze, slidefade
|
||||
|
||||
# Workspaces: airy glide, finishes fast
|
||||
animation = workspaces, 1, 5, breeze, slide
|
||||
|
||||
# Subtle polish
|
||||
animation = fade, 1, 4, breeze
|
||||
animation = windowsMove, 1, 3, breeze
|
||||
animation = border, 1, 3, breeze
|
||||
}
|
||||
|
||||
gesture = 3, horizontal, workspace
|
||||
|
||||
gesture = 3, down, fullscreen, 1
|
||||
|
||||
56
.config/hypr/decoration.lua
Normal file
56
.config/hypr/decoration.lua
Normal file
@@ -0,0 +1,56 @@
|
||||
hl.config({
|
||||
general = {
|
||||
-- Gaps & borders – light and uncluttered
|
||||
gaps_in = 4,
|
||||
gaps_out = 6,
|
||||
gaps_workspaces = 32,
|
||||
border_size = 1,
|
||||
no_focus_fallback = true,
|
||||
allow_tearing = true,
|
||||
snap = {
|
||||
enabled = true,
|
||||
window_gap = 4,
|
||||
monitor_gap = 6,
|
||||
respect_gaps = true,
|
||||
},
|
||||
col = {
|
||||
active_border = "rgba(E29A6EFF)",
|
||||
inactive_border = "rgba(2C252033)",
|
||||
},
|
||||
},
|
||||
})
|
||||
hl.config({
|
||||
dwindle = {
|
||||
preserve_split = true,
|
||||
smart_split = false,
|
||||
smart_resizing = false,
|
||||
},
|
||||
})
|
||||
hl.config({
|
||||
decoration = {
|
||||
rounding = 10,
|
||||
shadow = {
|
||||
enabled = true,
|
||||
range = 16,
|
||||
render_power = 2,
|
||||
color = "rgba(1A161340)",
|
||||
},
|
||||
blur = {
|
||||
enabled = true,
|
||||
size = 5,
|
||||
passes = 2,
|
||||
vibrancy = 0.14,
|
||||
},
|
||||
},
|
||||
})
|
||||
hl.config({
|
||||
animations = {
|
||||
enabled = true,
|
||||
},
|
||||
})
|
||||
hl.curve("myBezier", { type = "bezier", points = { {0.16, 1}, {0.3, 1} } })
|
||||
hl.animation({ leaf = "windows", enabled = true, speed = 1.8, bezier = "myBezier" })
|
||||
hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.6, bezier = "myBezier", style = "popin 90%" })
|
||||
hl.animation({ leaf = "border", enabled = true, speed = 2.5, bezier = "myBezier" })
|
||||
hl.animation({ leaf = "fade", enabled = true, speed = 1.8, bezier = "myBezier" })
|
||||
hl.animation({ leaf = "workspaces", enabled = true, speed = 1.8, bezier = "myBezier" })
|
||||
@@ -1,37 +0,0 @@
|
||||
source = ~/.config/hypr/monitors.conf
|
||||
|
||||
# Set programs that you use
|
||||
$terminal = kitty
|
||||
$fileManager = thunar
|
||||
$menu = wofi --show drun
|
||||
$browser = brave
|
||||
|
||||
exec-once = /usr/lib/xdg-desktop-portal-hyprland &
|
||||
exec-once = /usr/lib/xdg-desktop-portal &
|
||||
exec-once = hyprpaper
|
||||
exec = gsettings set org.gnome.desktop.interface color-scheme "prefer-dark" # for GTK4 apps
|
||||
exec = gsettings set org.gnome.desktop.interface gtk-theme "adw-gtk3-dark" # for GTK3 apps
|
||||
|
||||
misc:initial_workspace_tracking=1
|
||||
|
||||
#############################
|
||||
### ENVIRONMENT VARIABLES ###
|
||||
#############################
|
||||
|
||||
env = XCURSOR_SIZE,24
|
||||
env = HYPRCURSOR_SIZE,24
|
||||
env = LIBVA_DRIVER_NAME,nvidia
|
||||
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
|
||||
env = NVD_BACKEND,direct
|
||||
env = QT_QPA_PLATFORMTHEME,qt6ct # for Qt apps# Theme
|
||||
|
||||
exec-once = waybar
|
||||
exec-once = nextcloud
|
||||
exec-once = hyprctl setcursor Breeze 24
|
||||
|
||||
source = ~/.config/hypr/input.conf
|
||||
source = ~/.config/hypr/keybinds.conf
|
||||
source = ~/.config/hypr/applications.conf
|
||||
source = ~/.config/hypr/decoration.conf
|
||||
source = ~/.config/hypr/workspaces.conf
|
||||
source = ~/.config/hypr/hyprpaper.conf
|
||||
48
.config/hypr/hyprland.lua
Normal file
48
.config/hypr/hyprland.lua
Normal file
@@ -0,0 +1,48 @@
|
||||
local monitors = require("monitors")
|
||||
|
||||
-- Set programs that you use
|
||||
terminal = "kitty"
|
||||
fileManager = "thunar"
|
||||
menu = "wofi --show drun"
|
||||
browser = "brave"
|
||||
|
||||
hl.config({
|
||||
misc = {
|
||||
force_default_wallpaper = 0,
|
||||
disable_hyprland_logo = true,
|
||||
initial_workspace_tracking = 1,
|
||||
},
|
||||
})
|
||||
|
||||
-- Envs
|
||||
hl.env("XCURSOR_SIZE", 24)
|
||||
hl.env("XCUROSR_THEME", "breeze-dark")
|
||||
hl.env("HYPRCURSOR_SIZE", 24)
|
||||
hl.env("HYPRCURSOR_THEME", "breeze-dark")
|
||||
hl.env("LIBVA_DRIVER_NAME", "nvidia")
|
||||
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
|
||||
hl.env("NVD_BACKEND", "direct")
|
||||
hl.env("QT_QPA_PLATFORMTHEME", "qt6ct")
|
||||
|
||||
local keybinds = require("keybinds")
|
||||
local input = require("input")
|
||||
local applications = require("applications")
|
||||
local decorations = require("decoration")
|
||||
local workspaces = require("workspaces")
|
||||
|
||||
-- Autostart
|
||||
hl.on("hyprland.start", function()
|
||||
hl.exec_cmd("/usr/lib/xdg-desktop-portal-hyprland &")
|
||||
hl.exec_cmd("/usr/lib/xdg-desktop-portal &")
|
||||
hl.exec_cmd("hyprpaper")
|
||||
hl.exec_cmd("nextcloud")
|
||||
hl.exec_cmd("waybar")
|
||||
hl.exec_cmd("hyprctl setcursor breeze 24")
|
||||
hl.exec_cmd("xsettingsd")
|
||||
end)
|
||||
|
||||
-- Exec (run every reload)
|
||||
hl.on("config.reloaded", function()
|
||||
hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme prefer-dark")
|
||||
hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme adw-gtk3-dark")
|
||||
end)
|
||||
@@ -1 +1,4 @@
|
||||
ipc = on
|
||||
preload = /home/dylan/.wallpapers/monochrome.png
|
||||
wallpaper = ,/home/dylan/.wallpapers/monochrome.png
|
||||
splash = false
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
input {
|
||||
kb_layout = ie
|
||||
kb_variant =
|
||||
kb_model =
|
||||
kb_options =
|
||||
kb_rules =
|
||||
|
||||
follow_mouse = 1
|
||||
accel_profile = flat
|
||||
force_no_accel=2
|
||||
|
||||
sensitivity = 1
|
||||
|
||||
touchpad {
|
||||
natural_scroll = true
|
||||
scroll_factor = 0.2
|
||||
}
|
||||
}
|
||||
|
||||
device {
|
||||
name = logitech-usb-receiver
|
||||
sensitivity = 0
|
||||
}
|
||||
20
.config/hypr/input.lua
Normal file
20
.config/hypr/input.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
hl.config({
|
||||
input = {
|
||||
kb_layout = "ie",
|
||||
follow_mouse = 1,
|
||||
accel_profile = "flat",
|
||||
sensitivity = 0,
|
||||
touchpad = {
|
||||
natural_scroll = true,
|
||||
scroll_factor = 0.45,
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
hl.config({
|
||||
gestures = {
|
||||
workspace_swipe_cancel_ratio = 0,
|
||||
workspace_swipe_min_speed_to_force = 10,
|
||||
},
|
||||
})
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
$mainMod = SUPER # Sets "Windows" key as main modifier
|
||||
|
||||
bind = $mainMod, RETURN, exec, $terminal
|
||||
|
||||
# Move focus with mainMod + arrow keys
|
||||
bind = $mainMod, left, movefocus, l
|
||||
bind = $mainMod, right, movefocus, r
|
||||
bind = $mainMod, up, movefocus, u
|
||||
bind = $mainMod, down, movefocus, d
|
||||
|
||||
# Switch workspaces with mainMod + [0-9]
|
||||
bind = $mainMod, 1, workspace, 1
|
||||
bind = $mainMod, 2, workspace, 2
|
||||
bind = $mainMod, 3, workspace, 3
|
||||
bind = $mainMod, 4, workspace, 4
|
||||
bind = $mainMod, 5, workspace, 5
|
||||
bind = $mainMod, 6, workspace, 6
|
||||
bind = $mainMod, 7, workspace, 7
|
||||
bind = $mainMod, 8, workspace, 8
|
||||
bind = $mainMod, 9, workspace, 9
|
||||
bind = $mainMod, 0, workspace, 10
|
||||
|
||||
# Move active window to a workspace with mainMod + SHIFT + [0-9]
|
||||
bind = $mainMod SHIFT, 1, 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
|
||||
|
||||
# Scroll through existing workspaces with mainMod + scroll
|
||||
bind = $mainMod, mouse_down, workspace, e+1
|
||||
bind = $mainMod, mouse_up, workspace, e-1
|
||||
|
||||
# Move/resize windows with mainMod + LMB/RMB and dragging
|
||||
bindm = $mainMod, mouse:272, movewindow
|
||||
bindm = $mainMod, mouse:273, resizewindow
|
||||
|
||||
# Change wallpaper
|
||||
bind = $mainMod, W, exec, ~/.config/wofi/scripts/wallpaper.sh
|
||||
|
||||
bindel = $mainMod, L, exec, brightnessctl -e4 -n2 set 5%+
|
||||
bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%-
|
||||
|
||||
# Volume
|
||||
bindl = , F4, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
|
||||
bindl = , F5, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
|
||||
bindl = , F6, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
|
||||
bindl = , F7, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
|
||||
|
||||
# Playback (requires playerctl)
|
||||
bindl = , F2, exec, playerctl previous
|
||||
bindl = , F1, exec, playerctl play-pause
|
||||
bindl = , F3, exec, playerctl next
|
||||
|
||||
|
||||
bind = SUPER CTRL, left, swapwindow, l
|
||||
bind = SUPER CTRL, right, swapwindow, r
|
||||
bind = SUPER SHIFT, F, fullscreen
|
||||
bind = SUPER CTRL, F, fullscreen, 1
|
||||
bind = SUPER, Q, killactive
|
||||
bind = ALT, TAB, cyclenext
|
||||
|
||||
bind = SUPER, F, exec, $fileManager
|
||||
bind = SUPER, D, exec, $menu
|
||||
bind = SUPER, B, exec, $browser
|
||||
bind = SUPER SHIFT, S, exec, grim -g "$(slurp)" - | wl-copy
|
||||
74
.config/hypr/keybinds.lua
Normal file
74
.config/hypr/keybinds.lua
Normal file
@@ -0,0 +1,74 @@
|
||||
---@module 'hl'
|
||||
|
||||
local mainMod = "SUPER"
|
||||
|
||||
-- Sets "Windows" key as main modifier
|
||||
hl.bind(mainMod .. " + " .. "RETURN", hl.dsp.exec_cmd(terminal), { description = "Terminal" })
|
||||
|
||||
-- Move focus with mainMod + arrow keys
|
||||
hl.bind(mainMod .. " + " .. "up", hl.dsp.focus({ direction = "up" }), { description = "Focus up" })
|
||||
hl.bind(mainMod .. " + " .. "down", hl.dsp.focus({ direction = "down" }), { description = "Focus down" })
|
||||
|
||||
-- Switch workspaces with mainMod + [0-9]
|
||||
hl.bind(mainMod .. " + " .. 1, hl.dsp.focus({ workspace = 1 }), { description = "Workspace 1" })
|
||||
hl.bind(mainMod .. " + " .. 2, hl.dsp.focus({ workspace = 2 }), { description = "Workspace 2" })
|
||||
hl.bind(mainMod .. " + " .. 3, hl.dsp.focus({ workspace = 3 }), { description = "Workspace 3" })
|
||||
hl.bind(mainMod .. " + " .. 4, hl.dsp.focus({ workspace = 4 }), { description = "Workspace 4" })
|
||||
hl.bind(mainMod .. " + " .. 5, hl.dsp.focus({ workspace = 5 }), { description = "Workspace 5" })
|
||||
hl.bind(mainMod .. " + " .. 6, hl.dsp.focus({ workspace = 6 }), { description = "Workspace 6" })
|
||||
hl.bind(mainMod .. " + " .. 7, hl.dsp.focus({ workspace = 7 }), { description = "Workspace 7" })
|
||||
hl.bind(mainMod .. " + " .. 8, hl.dsp.focus({ workspace = 8 }), { description = "Workspace 8" })
|
||||
hl.bind(mainMod .. " + " .. 9, hl.dsp.focus({ workspace = 9 }), { description = "Workspace 9" })
|
||||
hl.bind(mainMod .. " + " .. 0, hl.dsp.focus({ workspace = 10 }), { description = "Workspace 10" })
|
||||
|
||||
-- Move active window to a workspace with mainMod + SHIFT + [0-9]
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 1, hl.dsp.window.move({ workspace = 1 }), { description = "Move window to workspace 1" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 2, hl.dsp.window.move({ workspace = 2 }), { description = "Move window to workspace 2" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 3, hl.dsp.window.move({ workspace = 3 }), { description = "Move window to workspace 3" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 4, hl.dsp.window.move({ workspace = 4 }), { description = "Move window to workspace 4" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 5, hl.dsp.window.move({ workspace = 5 }), { description = "Move window to workspace 5" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 6, hl.dsp.window.move({ workspace = 6 }), { description = "Move window to workspace 6" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 7, hl.dsp.window.move({ workspace = 7 }), { description = "Move window to workspace 7" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 8, hl.dsp.window.move({ workspace = 8 }), { description = "Move window to workspace 8" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 9, hl.dsp.window.move({ workspace = 9 }), { description = "Move window to workspace 9" })
|
||||
hl.bind(mainMod .. " + " .. "SHIFT" .. " + " .. 0, hl.dsp.window.move({ workspace = 10 }), { description = "Move window to workspace 10" })
|
||||
|
||||
-- Scroll through existing workspaces with mainMod + scroll
|
||||
hl.bind(mainMod .. " + " .. "right", hl.dsp.focus({ workspace = "+1" }), { description = "Next workspace" })
|
||||
hl.bind(mainMod .. " + " .. "left", hl.dsp.focus({ workspace = "-1" }), { description = "Previous workspace" })
|
||||
|
||||
-- Move/resize windows with mainMod + LMB/RMB and dragging
|
||||
hl.bind(mainMod .. " + " .. "mouse:272", hl.dsp.window.drag(), { mouse = true, description = "Move window" })
|
||||
hl.bind(mainMod .. " + " .. "mouse:273", hl.dsp.window.resize(), { mouse = true, description = "Resize window" })
|
||||
|
||||
-- Change wallpaper
|
||||
hl.bind(mainMod .. " + " .. "W", hl.dsp.exec_cmd("~/.config/wofi/scripts/wallpaper.sh"), { description = "Change wallpaper" })
|
||||
hl.bind(mainMod .. " + " .. "L", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%+"), { locked = true, description = "Brightness up" })
|
||||
hl.bind(mainMod .. " + " .. "K", hl.dsp.exec_cmd("brightnessctl -e4 -n2 set 5%-"), { locked = true, description = "Brightness down" })
|
||||
|
||||
-- Volume
|
||||
hl.bind("F7", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, description = "Volume down" })
|
||||
hl.bind("F8", hl.dsp.exec_cmd("wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, description = "Volume up" })
|
||||
hl.bind("F9", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), { locked = true, description = "Mute output" })
|
||||
hl.bind("F10", hl.dsp.exec_cmd("wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"), { locked = true, description = "Mute microphone" })
|
||||
|
||||
-- Playback (requires playerctl)
|
||||
hl.bind("F4", hl.dsp.exec_cmd("playerctl previous"), { locked = true, description = "Previous track" })
|
||||
hl.bind("F5", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true, description = "Play/pause" })
|
||||
hl.bind("F6", hl.dsp.exec_cmd("playerctl next"), { locked = true, description = "Next track" })
|
||||
|
||||
hl.bind("switch:on:Lid Switch", hl.dsp.exec_cmd("hyprctl dispatch dpms off"), { locked = true, description = "Displays off on lid close" })
|
||||
hl.bind("switch:off:Lid Switch", hl.dsp.exec_cmd("hyprctl dispatch dpms on"), { locked = true, description = "Displays on on lid open" })
|
||||
|
||||
-- My binds
|
||||
hl.bind("SUPER + CTRL" .. " + " .. "left", hl.dsp.window.swap({ direction = "left" }), { description = "Swap window left" })
|
||||
hl.bind("SUPER + CTRL" .. " + " .. "right", hl.dsp.window.swap({ direction = "right" }), { description = "Swap window right" })
|
||||
hl.bind("SUPER + SHIFT" .. " + " .. "F", hl.dsp.window.fullscreen(), { description = "Fullscreen" })
|
||||
hl.bind("SUPER + CTRL" .. " + " .. "F", hl.dsp.window.fullscreen({mode = "maximized"}), { description = "Maximize" })
|
||||
hl.bind("SUPER" .. " + " .. "Q", hl.dsp.window.close(), { description = "Close window" })
|
||||
hl.bind("ALT" .. " + " .. "TAB", hl.dsp.window.cycle_next(), { description = "Cycle windows" })
|
||||
hl.bind("SUPER" .. " + " .. "F", hl.dsp.exec_cmd(fileManager), { description = "File manager" })
|
||||
hl.bind("SUPER" .. " + " .. "D", hl.dsp.exec_cmd(menu), { description = "App launcher" })
|
||||
hl.bind("SUPER" .. " + " .. "B", hl.dsp.exec_cmd(browser), { description = "Browser" })
|
||||
hl.bind("SUPER + SHIFT + S", hl.dsp.exec_cmd('grim -g "$(slurp -d)" - | wl-copy'), { description = "Screenshot region to clipboard" })
|
||||
hl.bind(mainMod .. " + slash", hl.dsp.exec_cmd(os.getenv("HOME") .. "/.config/hypr/scripts/show-binds.sh"), { description = "Show keybind cheat sheet" })
|
||||
13
.config/hypr/monitors.lua
Normal file
13
.config/hypr/monitors.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
hl.monitor({
|
||||
output = "DP-3",
|
||||
mode = "1920x1080@270",
|
||||
position = "0x0",
|
||||
scale = 1,
|
||||
})
|
||||
|
||||
hl.monitor({
|
||||
output = "DP-1",
|
||||
mode = "1920x1080@144",
|
||||
position = "-1920x0",
|
||||
scale = 1,
|
||||
})
|
||||
26
.config/hypr/scripts/show-binds.sh
Executable file
26
.config/hypr/scripts/show-binds.sh
Executable file
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
DATA=$(hyprctl -j binds | jq -r '
|
||||
def mods(m):
|
||||
[ if m >= 64 then "SUPER" else empty end,
|
||||
if (m % 16) >= 8 then "ALT" else empty end,
|
||||
if (m % 8) >= 4 then "CTRL" else empty end,
|
||||
if (m % 2) >= 1 then "SHIFT" else empty end ] | join("+");
|
||||
[ .[] | select(.has_description)
|
||||
| { k: "\(if .modmask > 0 then mods(.modmask) + "+" else "" end)\(.key)",
|
||||
d: .description } ]
|
||||
| sort_by(.k)
|
||||
| (map(.k | length) | max) as $w
|
||||
| .[] | "\(.k + (" " * ($w - (.k | length)))) \(.d)"
|
||||
')
|
||||
|
||||
COLS=$(awk '{ if (length > m) m = length } END { print m }' <<< "$DATA")
|
||||
ROWS=$(wc -l <<< "$DATA")
|
||||
|
||||
PRW=$(( COLS * 2 + 4 ))
|
||||
PX=$(( PRW * 7 + 60 ))
|
||||
PY=$(( (ROWS / 2 + 2) * 18 + 60 ))
|
||||
|
||||
pr -2 -t -w "$PRW" <<< "$DATA" \
|
||||
| yad --text-info --title="Hyprland Keybinds" \
|
||||
--width="$PX" --height="$PY" --center \
|
||||
--fontname="monospace 10" --no-buttons --wrap=false
|
||||
@@ -1,14 +0,0 @@
|
||||
# Workspaces 1–5 on DP-3
|
||||
workspace = 1, monitor:DP-3, default:true
|
||||
workspace = 2, monitor:DP-3
|
||||
workspace = 3, monitor:DP-3
|
||||
workspace = 4, monitor:DP-3
|
||||
workspace = 5, monitor:DP-3
|
||||
|
||||
# Workspaces 6–10 on DP-1
|
||||
workspace = 6, monitor:DP-1, default:true
|
||||
workspace = 7, monitor:DP-1
|
||||
workspace = 8, monitor:DP-1
|
||||
workspace = 9, monitor:DP-1
|
||||
workspace = 10, monitor:DP-1
|
||||
|
||||
51
.config/hypr/workspaces.lua
Normal file
51
.config/hypr/workspaces.lua
Normal file
@@ -0,0 +1,51 @@
|
||||
-- Workspaces 1–5 on DP-3
|
||||
hl.workspace_rule({
|
||||
workspace = 1,
|
||||
monitor = "DP-3",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 2,
|
||||
monitor = "DP-3",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 3,
|
||||
monitor = "DP-3",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 4,
|
||||
monitor = "DP-3",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 5,
|
||||
monitor = "DP-3",
|
||||
})
|
||||
|
||||
-- Workspaces 6–10 on DP-1
|
||||
hl.workspace_rule({
|
||||
workspace = 6,
|
||||
monitor = "DP-1",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 7,
|
||||
monitor = "DP-1",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 8,
|
||||
monitor = "DP-1",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 9,
|
||||
monitor = "DP-1",
|
||||
})
|
||||
|
||||
hl.workspace_rule({
|
||||
workspace = 10,
|
||||
monitor = "DP-1",
|
||||
})
|
||||
@@ -16,6 +16,7 @@
|
||||
"modules-right": [
|
||||
"tray",
|
||||
"pulseaudio",
|
||||
"bluetooth",
|
||||
"custom/micmute",
|
||||
"battery",
|
||||
"custom/power"
|
||||
@@ -62,6 +63,16 @@
|
||||
"on-click-right": "pavucontrol"
|
||||
},
|
||||
|
||||
"bluetooth": {
|
||||
"format": " {num_connections}",
|
||||
"format-connected": " {num_connections}",
|
||||
"format-disabled": "",
|
||||
"tooltip-format-connected": "{device_enumerate}",
|
||||
"tooltip-format-enumerate-connected": " {device_alias} ({device_battery_percentage}%)",
|
||||
"on-click": "blueman-manager",
|
||||
"on-click-right": "bluectl power toggle"
|
||||
},
|
||||
|
||||
"battery": {
|
||||
"interval":2,
|
||||
"states": {
|
||||
|
||||
43
.config/waybar/scripts/mediaplayer.sh
Executable file
43
.config/waybar/scripts/mediaplayer.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# waybar custom module: shows currently playing media, mac-menu-bar style.
|
||||
# Outputs a single JSON line: {"text":..., "tooltip":..., "class":..., "alt":...}
|
||||
# waybar re-runs this on an interval (set in config.jsonc) and re-renders.
|
||||
|
||||
# --status-format lets us build one compact string per call instead of
|
||||
# separate playerctl invocations for title/artist/status (fewer subprocess
|
||||
# spawns = faster polling, matters since waybar calls this every ~1s).
|
||||
STATUS=$(playerctl -a metadata --format '{{status}}|{{artist}}|{{title}}|{{playerName}}' 2>/dev/null | head -n1)
|
||||
|
||||
if [ -z "$STATUS" ]; then
|
||||
# No MPRIS players running at all -> render nothing (empty text hides
|
||||
# the module if `"class": "hidden"` is styled to display:none, but
|
||||
# simplest is just an empty text with no tooltip).
|
||||
echo '{"text": "", "tooltip": "No media playing", "class": "hidden"}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# IFS='|' read splits our pipe-delimited format string into vars.
|
||||
IFS='|' read -r PSTATUS ARTIST TITLE PLAYER <<< "$STATUS"
|
||||
|
||||
# Playing vs Paused get different CSS classes so you can dim the paused state.
|
||||
case "$PSTATUS" in
|
||||
Playing) ICON="" ;; # nerd-font play glyph
|
||||
Paused) ICON="" ;; # nerd-font pause glyph
|
||||
*) ICON="" ;;
|
||||
esac
|
||||
|
||||
# Truncate long titles so the bar doesn't blow out — cut at 30 chars,
|
||||
# append an ellipsis. This is bash parameter expansion, not a subprocess.
|
||||
LABEL="${ARTIST} - ${TITLE}"
|
||||
if [ "${#LABEL}" -gt 32 ]; then
|
||||
LABEL="${LABEL:0:29}..."
|
||||
fi
|
||||
|
||||
# Escape double quotes so we don't break the JSON if a title contains one.
|
||||
LABEL_ESC=$(printf '%s' "$LABEL" | sed 's/"/\\"/g')
|
||||
TOOLTIP_ESC=$(printf '%s — %s\n(%s)' "$ARTIST" "$TITLE" "$PLAYER" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')
|
||||
|
||||
CLASS="media-${PSTATUS,,}" # bash ${var,,} lowercases -> "media-playing" / "media-paused"
|
||||
|
||||
echo "{\"text\": \"${ICON} ${LABEL_ESC}\", \"tooltip\": \"${TOOLTIP_ESC}\", \"class\": \"${CLASS}\", \"alt\": \"${PSTATUS}\"}"
|
||||
@@ -1,148 +1,227 @@
|
||||
@define-color Buttons #262522;
|
||||
@define-color Buttonshover #4d4a44;
|
||||
@define-color Text #A69F92;
|
||||
/* ============================================================
|
||||
WAYBAR STYLE — Cream Claude / Warm Minimal
|
||||
Palette: warm cream base, clay/terracotta accent, soft browns
|
||||
============================================================ */
|
||||
|
||||
|
||||
/* --- Global Styles --- */
|
||||
/* ── Root Variables ───────────────────────────────────────── */
|
||||
* {
|
||||
font-family: "JetBrainsMono Nerd Font Propo";
|
||||
font-size: 14px;
|
||||
min-height: 25px;
|
||||
padding-right: 0px;
|
||||
padding-left: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
/* --- Waybar Container --- */
|
||||
#waybar {
|
||||
background: transparent;
|
||||
color: #c6d0f5;
|
||||
margin: 0px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* --- Left Modules (Individual, Fully Rounded Blocks - With Horizontal Spacing & Simple Hover) --- */
|
||||
#workspaces,
|
||||
#cpu,
|
||||
#memory{
|
||||
background-color: @Buttons;
|
||||
padding: 0.3rem 0.7rem;
|
||||
margin: 5px 0px; /* 5px top/bottom margin, 0px left/right (base for individual control) */
|
||||
border-radius: 10px; /* These modules are always rounded */
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
min-width: 0;
|
||||
font-family: "Inter", "SF Pro Display", "Segoe UI", sans-serif;
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
border: none;
|
||||
/* Transition for background-color and color only */
|
||||
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/* ── Bar ──────────────────────────────────────────────────── */
|
||||
window#waybar {
|
||||
background: rgba(26, 22, 19, 0.55);
|
||||
color: #e8ddd0;
|
||||
}
|
||||
|
||||
/* ── Tooltip ──────────────────────────────────────────────── */
|
||||
tooltip {
|
||||
background: rgba(30, 25, 21, 0.92);
|
||||
border: 1px solid rgba(196, 108, 74, 0.4);
|
||||
color: #e8ddd0;
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
tooltip label {
|
||||
color: #e8ddd0;
|
||||
}
|
||||
|
||||
/* ── Shared Module Base ───────────────────────────────────── */
|
||||
#clock,
|
||||
#cpu,
|
||||
#memory,
|
||||
#pulseaudio,
|
||||
#bluetooth,
|
||||
#battery,
|
||||
#tray,
|
||||
#custom-micmute,
|
||||
#custom-power {
|
||||
padding: 6px 12px;
|
||||
margin: 5px 0;
|
||||
color: #e8ddd0;
|
||||
background: rgba(44, 37, 32, 0.5);
|
||||
transition: color 0.2s ease, background 0.2s ease;
|
||||
}
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
LEFT — System Info: Clock · CPU · Memory
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
#clock {
|
||||
font-weight: 500;
|
||||
font-size: 12.5px;
|
||||
color: #e29a6e;
|
||||
letter-spacing: 0.03em;
|
||||
padding-left: 0.4em;
|
||||
border-left: 3px solid rgba(226, 154, 110, 0.5);
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
#cpu {
|
||||
color: #c9baa8;
|
||||
}
|
||||
|
||||
#cpu:hover {
|
||||
color: #f0e6d8;
|
||||
background: rgba(226, 154, 110, 0.16);
|
||||
}
|
||||
|
||||
#memory {
|
||||
margin: 5px 10px;
|
||||
color: #c9baa8;
|
||||
}
|
||||
|
||||
#memory:hover {
|
||||
color: #f0e6d8;
|
||||
background: rgba(180, 156, 120, 0.2);
|
||||
}
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
CENTER — Workspaces
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
#workspaces {
|
||||
padding: 0px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
|
||||
/* Simple Hover effects for individual left modules - BRIGHTER COLOR */
|
||||
#cpu:hover, #memory:hover {
|
||||
background-color: @Buttonshover; /* Brighter highlight */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
color: @Text;
|
||||
border-radius: 10px; /* Workspaces buttons are always rounded */
|
||||
padding: 0.3rem 0.6rem;
|
||||
background: transparent;
|
||||
transition: all 0.2s ease-in-out;
|
||||
border: none;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#workspaces button.active {
|
||||
color: @Text;
|
||||
background-color: rgba(153, 209, 219, 0.1);
|
||||
font-size: 12px;
|
||||
padding: 2px 10px;
|
||||
margin: 4px 2px;
|
||||
color: #8a7a68;
|
||||
background: rgba(232, 221, 208, 0.08);
|
||||
border: 1px solid transparent;
|
||||
border-radius: 3px;
|
||||
transition: all 0.15s ease;
|
||||
min-width: 32px;
|
||||
}
|
||||
|
||||
#workspaces button:hover {
|
||||
background: @Buttonshover; /* Reference bright hover color */
|
||||
color: @Text;
|
||||
color: #e8ddd0;
|
||||
background: rgba(232, 221, 208, 0.14);
|
||||
border-color: rgba(232, 221, 208, 0.2);
|
||||
}
|
||||
|
||||
/* --- Center Module (Individual, Fully Rounded Block - With Simple Hover) --- */
|
||||
#clock {
|
||||
background-color: @Buttons;
|
||||
padding: 0.3rem 0.7rem;
|
||||
margin: 5px 0px;
|
||||
margin-left: 7px;
|
||||
margin-right: 10px;
|
||||
border-radius: 10px; /* This module is always rounded */
|
||||
min-width: 0;
|
||||
border: none;
|
||||
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
|
||||
#workspaces button.active {
|
||||
color: #e29a6e;
|
||||
background: rgba(226, 154, 110, 0.18);
|
||||
border-color: rgba(226, 154, 110, 0.55);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
#workspaces button.urgent {
|
||||
color: #d9695a;
|
||||
background: rgba(217, 105, 90, 0.18);
|
||||
border-color: rgba(217, 105, 90, 0.5);
|
||||
}
|
||||
|
||||
|
||||
/* Simple Hover effect for clock module - BRIGHTER COLOR */
|
||||
#clock:hover {
|
||||
background-color: @Buttonshover; /* Brighter highlight */
|
||||
/* ═══════════════════════════════════════════════════════════
|
||||
RIGHT — Audio · Bluetooth · Mic · Battery · Power
|
||||
═══════════════════════════════════════════════════════════ */
|
||||
|
||||
/* ── Tray ─────────────────────────────────────────────────── */
|
||||
#tray {
|
||||
padding: 2px 10px;
|
||||
}
|
||||
|
||||
#tray > .passive {
|
||||
-gtk-icon-effect: dim;
|
||||
}
|
||||
|
||||
#tray > .needs-attention {
|
||||
-gtk-icon-effect: highlight;
|
||||
background-color: rgba(196, 108, 74, 0.25);
|
||||
}
|
||||
|
||||
/* ── Audio ────────────────────────────────────────────────── */
|
||||
#pulseaudio {
|
||||
color: #c9a68c;
|
||||
}
|
||||
|
||||
#pulseaudio:hover {
|
||||
color: #f0e6d8;
|
||||
background: rgba(201, 166, 140, 0.16);
|
||||
}
|
||||
|
||||
/* ── Bluetooth ────────────────────────────────────────────── */
|
||||
#bluetooth {
|
||||
color: #9ab4c4;
|
||||
}
|
||||
|
||||
#bluetooth.connected {
|
||||
color: #a8c8dc;
|
||||
}
|
||||
|
||||
#bluetooth:hover {
|
||||
background: rgba(154, 180, 196, 0.16);
|
||||
}
|
||||
|
||||
/* ── Microphone Mute ──────────────────────────────────────── */
|
||||
#custom-micmute {
|
||||
color: #c9baa8;
|
||||
}
|
||||
|
||||
#custom-micmute.muted {
|
||||
color: #6e6055;
|
||||
}
|
||||
|
||||
/* --- Right Modules (Single, Seamless Bar ) --- */
|
||||
#custom-power:hover,
|
||||
#pulseaudio:hover,
|
||||
#battery:hover,
|
||||
#tray:hover,
|
||||
#custom-micmute:hover {
|
||||
background-color: @Buttonshover;
|
||||
}
|
||||
|
||||
#cpu, #memory {
|
||||
color: @Text;
|
||||
}
|
||||
|
||||
#clock {
|
||||
color: @Text;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
#tray, #battery, #pulseaudio, #custom-power, #custom-micmute {
|
||||
background-color: @Buttons;
|
||||
color: @Text;
|
||||
border-radius: 10px;
|
||||
padding: 0.7rem;
|
||||
margin: 0.35rem;
|
||||
transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
#custom-power {
|
||||
margin-right: 11px;
|
||||
background: rgba(201, 186, 168, 0.16);
|
||||
}
|
||||
|
||||
/* ── Battery ──────────────────────────────────────────────── */
|
||||
#battery {
|
||||
color: @Text;
|
||||
color: #a8bc90;
|
||||
}
|
||||
#battery.charging {
|
||||
color: @Text;
|
||||
|
||||
#battery.charging,
|
||||
#battery.plugged {
|
||||
color: #c0d4a0;
|
||||
}
|
||||
|
||||
#battery.warning:not(.charging) {
|
||||
color: @Text;
|
||||
color: #dcb06a;
|
||||
}
|
||||
|
||||
|
||||
/* --- Tooltip Styles --- */
|
||||
tooltip {
|
||||
background-color: #1a1b26;
|
||||
color: #dddddd;
|
||||
padding: 5px 12px;
|
||||
margin: 5px 0px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
||||
font-size: 12px;
|
||||
#battery.critical:not(.charging) {
|
||||
color: #e0796a;
|
||||
animation: battery-pulse 1.5s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes battery-pulse {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.4;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
#battery:hover {
|
||||
background: rgba(168, 188, 144, 0.16);
|
||||
}
|
||||
|
||||
/* ── Power Button ─────────────────────────────────────────── */
|
||||
#custom-power {
|
||||
color: #e29a6e;
|
||||
font-size: 14px;
|
||||
padding: 2px 14px 2px 12px;
|
||||
margin-right: 8px;
|
||||
border-right: 3px solid rgba(196, 108, 74, 0.4);
|
||||
}
|
||||
|
||||
#custom-power:hover {
|
||||
color: #c0392b;
|
||||
background: rgba(196, 108, 74, 0.2);
|
||||
}
|
||||
|
||||
36
.config/wlogout/layout
Normal file
36
.config/wlogout/layout
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"label" : "lock",
|
||||
"action" : "loginctl lock-session",
|
||||
"text" : "Lock",
|
||||
"keybind" : "l"
|
||||
}
|
||||
{
|
||||
"label" : "hibernate",
|
||||
"action" : "systemctl hibernate",
|
||||
"text" : "Hibernate",
|
||||
"keybind" : "h"
|
||||
}
|
||||
{
|
||||
"label" : "logout",
|
||||
"action" : "hyprctl dispatch 'hl.dsp.exit()'",
|
||||
"text" : "Logout",
|
||||
"keybind" : "e"
|
||||
}
|
||||
{
|
||||
"label" : "shutdown",
|
||||
"action" : "systemctl poweroff",
|
||||
"text" : "Shutdown",
|
||||
"keybind" : "s"
|
||||
}
|
||||
{
|
||||
"label" : "suspend",
|
||||
"action" : "systemctl suspend",
|
||||
"text" : "Suspend",
|
||||
"keybind" : "u"
|
||||
}
|
||||
{
|
||||
"label" : "reboot",
|
||||
"action" : "systemctl reboot",
|
||||
"text" : "Reboot",
|
||||
"keybind" : "r"
|
||||
}
|
||||
50
.config/wlogout/style.css
Normal file
50
.config/wlogout/style.css
Normal file
@@ -0,0 +1,50 @@
|
||||
* {
|
||||
background-image: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
window {
|
||||
background-color: rgba(12, 12, 12, 0.9);
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
border-color: black;
|
||||
text-decoration-color: #FFFFFF;
|
||||
color: #FFFFFF;
|
||||
background-color: #1E1E1E;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 25%;
|
||||
}
|
||||
|
||||
button:focus, button:active, button:hover {
|
||||
background-color: #3700B3;
|
||||
outline-style: none;
|
||||
}
|
||||
|
||||
#lock {
|
||||
background-image: image(url("/usr/share/wlogout/icons/lock.png"), url("/usr/local/share/wlogout/icons/lock.png"));
|
||||
}
|
||||
|
||||
#logout {
|
||||
background-image: image(url("/usr/share/wlogout/icons/logout.png"), url("/usr/local/share/wlogout/icons/logout.png"));
|
||||
}
|
||||
|
||||
#suspend {
|
||||
background-image: image(url("/usr/share/wlogout/icons/suspend.png"), url("/usr/local/share/wlogout/icons/suspend.png"));
|
||||
}
|
||||
|
||||
#hibernate {
|
||||
background-image: image(url("/usr/share/wlogout/icons/hibernate.png"), url("/usr/local/share/wlogout/icons/hibernate.png"));
|
||||
}
|
||||
|
||||
#shutdown {
|
||||
background-image: image(url("/usr/share/wlogout/icons/shutdown.png"), url("/usr/local/share/wlogout/icons/shutdown.png"));
|
||||
}
|
||||
|
||||
#reboot {
|
||||
background-image: image(url("/usr/share/wlogout/icons/reboot.png"), url("/usr/local/share/wlogout/icons/reboot.png"));
|
||||
}
|
||||
@@ -1,8 +1,11 @@
|
||||
mode=drun
|
||||
allow_images=true
|
||||
image_size=32
|
||||
term=kitty
|
||||
insensitive=true
|
||||
show=drun
|
||||
width=600
|
||||
height=420
|
||||
location=center
|
||||
no_actions=true
|
||||
prompt=Search
|
||||
allow_images=true
|
||||
image_size=28
|
||||
insensitive=true
|
||||
hide_scroll=true
|
||||
no_actions=true
|
||||
gtk_dark=true
|
||||
|
||||
@@ -1,91 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# Configuration
|
||||
WALLPAPER_DIR="$HOME/.wallpapers" # Change this to your wallpaper directory
|
||||
CACHE_DIR="$HOME/.cache/wallpaper-selector"
|
||||
THUMBNAIL_WIDTH="250" # Size of thumbnails in pixels (16:9)
|
||||
THUMBNAIL_HEIGHT="141"
|
||||
# Create cache directory if it doesn't exist
|
||||
mkdir -p "$CACHE_DIR"
|
||||
# wallpaper.sh — pick a wallpaper from ~/.wallpapers via wofi, apply with hyprpaper
|
||||
set -euo pipefail
|
||||
DIR="${HOME}/.wallpapers"
|
||||
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/wallpaper-thumbs"
|
||||
[[ -d "$DIR" ]] || { notify-send "wallpaper.sh" "No $DIR"; exit 1; }
|
||||
mkdir -p "$CACHE"
|
||||
|
||||
# Function to generate thumbnail
|
||||
generate_thumbnail() {
|
||||
local input="$1"
|
||||
local output="$2"
|
||||
magick "$input" -thumbnail "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}^" -gravity center -extent "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" "$output"
|
||||
}
|
||||
mapfile -t files < <(find -L "$DIR" -maxdepth 1 -type f \
|
||||
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' \) \
|
||||
-printf '%f\n' | LC_ALL=C sort)
|
||||
[[ ${#files[@]} -gt 0 ]] || { notify-send "wallpaper.sh" "No images found"; exit 1; }
|
||||
|
||||
# Create shuffle icon thumbnail on the fly
|
||||
SHUFFLE_ICON="$CACHE_DIR/shuffle_thumbnail.png"
|
||||
# Create a properly sized shuffle icon thumbnail
|
||||
# magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
|
||||
# "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "120x120" -gravity center -composite \
|
||||
# "$SHUFFLE_ICON"
|
||||
magick -size "${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" xc:#1e1e2e \
|
||||
\( "$HOME/Repos/wallpaper-selector/assets/shuffle.png" -resize "80x80" \) \
|
||||
-gravity center -composite "$SHUFFLE_ICON"
|
||||
# Build any missing/stale thumbnails, in parallel.
|
||||
for f in "${files[@]}"; do
|
||||
src="${DIR}/${f}"
|
||||
thumb="${CACHE}/${f%.*}.png"
|
||||
[[ -f "$thumb" && "$thumb" -nt "$src" ]] && continue
|
||||
magick "$src" -thumbnail 360x360^ -strip "$thumb" &
|
||||
done
|
||||
wait
|
||||
|
||||
# Generate thumbnails and create menu items
|
||||
generate_menu() {
|
||||
# Add random/shuffle option with a name that sorts first (using ! prefix)
|
||||
echo -en "img:$SHUFFLE_ICON\x00info:!Random Wallpaper\x1fRANDOM\n"
|
||||
|
||||
# Then add all wallpapers
|
||||
for img in "$WALLPAPER_DIR"/*.{jpg,jpeg,png}; do
|
||||
# Skip if no matches found
|
||||
[[ -f "$img" ]] || continue
|
||||
|
||||
# Generate thumbnail filename
|
||||
thumbnail="$CACHE_DIR/$(basename "${img%.*}").png"
|
||||
|
||||
# Generate thumbnail if it doesn't exist or is older than source
|
||||
if [[ ! -f "$thumbnail" ]] || [[ "$img" -nt "$thumbnail" ]]; then
|
||||
generate_thumbnail "$img" "$thumbnail"
|
||||
fi
|
||||
|
||||
# Output menu item (filename and path)
|
||||
echo -en "img:$thumbnail\x00info:$(basename "$img")\x1f$img\n"
|
||||
done
|
||||
}
|
||||
RANDOM_LABEL="🎲 Random"
|
||||
menu="img::text:${RANDOM_LABEL}\n"
|
||||
for f in "${files[@]}"; do
|
||||
menu+="img:${CACHE}/${f%.*}.png:text:${f}\n"
|
||||
done
|
||||
|
||||
# Use wofi to display grid of wallpapers - IMPORTANT: added --sort-order=default
|
||||
selected=$(generate_menu | wofi --show dmenu \
|
||||
--cache-file /dev/null \
|
||||
--define "image-size=${THUMBNAIL_WIDTH}x${THUMBNAIL_HEIGHT}" \
|
||||
--columns 3 \
|
||||
--allow-images \
|
||||
--insensitive \
|
||||
--sort-order=default \
|
||||
--prompt "Select Wallpaper" \
|
||||
--conf ~/.config/wofi/wallpaper.conf \
|
||||
)
|
||||
line=$(echo -en "$menu" | wofi \
|
||||
--dmenu --show dmenu --allow-images --insensitive \
|
||||
--define image_size=180 --columns 4 --prompt "Wallpaper" \
|
||||
--define sort_order=default --cache-file /dev/null \
|
||||
--style "${HOME}/.config/wofi/wallpaper.css" \
|
||||
--width 900 --height 620 --define halign=fill --define content_halign=fill)
|
||||
[[ -n "$line" ]] || exit 0
|
||||
|
||||
# Set wallpaper if one was selected
|
||||
if [ -n "$selected" ]; then
|
||||
# Remove the img: prefix to get the cached thumbnail path
|
||||
thumbnail_path="${selected#img:}"
|
||||
|
||||
# Check if random wallpaper was selected
|
||||
if [[ "$thumbnail_path" == "$SHUFFLE_ICON" ]]; then
|
||||
# Select a random wallpaper from the directory
|
||||
original_path=$(find "$WALLPAPER_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n 1)
|
||||
else
|
||||
# Get the original filename from the thumbnail path
|
||||
original_filename=$(basename "${thumbnail_path%.*}")
|
||||
|
||||
# Find the corresponding original file in the wallpaper directory
|
||||
original_path=$(find "$WALLPAPER_DIR" -type f -name "${original_filename}.*" | head -n1)
|
||||
fi
|
||||
|
||||
# Ensure a valid wallpaper was found before proceeding
|
||||
if [ -n "$original_path" ]; then
|
||||
hyprctl hyprpaper wallpaper ",$original_path"
|
||||
|
||||
# Save the selection for persistence
|
||||
echo "$original_path" > "$HOME/.cache/current_wallpaper"
|
||||
|
||||
# Optional: Notify user
|
||||
notify-send "Wallpaper" "Wallpaper has been updated" -i "$original_path"
|
||||
else
|
||||
notify-send "Wallpaper Error" "Could not find the original wallpaper file."
|
||||
fi
|
||||
if [[ "$line" == *"$RANDOM_LABEL"* ]]; then
|
||||
WALL="${DIR}/${files[RANDOM % ${#files[@]}]}"
|
||||
else
|
||||
choice="${line##*:text:}"
|
||||
WALL="${DIR}/${choice}"
|
||||
fi
|
||||
|
||||
hyprctl hyprpaper wallpaper ",${WALL}"
|
||||
|
||||
@@ -1,66 +1,70 @@
|
||||
/* ========================
|
||||
Wofi Lovely Theme
|
||||
======================== */
|
||||
/* ~/.config/wofi/style.css */
|
||||
@define-color base rgba(26, 22, 19, 0.75);
|
||||
@define-color mantle rgba(20, 17, 14, 0.7);
|
||||
@define-color surface rgba(232, 221, 208, 0.1);
|
||||
@define-color overlay #8a7a68;
|
||||
@define-color text #e8ddd0;
|
||||
@define-color subtext #c9baa8;
|
||||
@define-color accent #e29a6e;
|
||||
@define-color accent2 #c46c4a;
|
||||
|
||||
/* Window styling */
|
||||
window {
|
||||
background-color: #1e1e2e; /* Dark blue-ish background */
|
||||
border-radius: 12px;
|
||||
padding: 10px;
|
||||
border: 1px solid #44475a;
|
||||
background-color: transparent;
|
||||
font-family: "Inter", "SF Pro Display", "Segoe UI", sans-serif;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Entry box styling */
|
||||
entry {
|
||||
font-family: "JetBrains Mono", monospace;
|
||||
font-size: 16px;
|
||||
color: #f8f8f2; /* light text */
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
background-color: #2e2e3e; /* darker input box */
|
||||
border: 1px solid #6272a4;
|
||||
#outer-box {
|
||||
background-color: @base;
|
||||
border: 1px solid rgba(226, 154, 110, 0.35);
|
||||
border-radius: 14px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
/* Selected suggestion */
|
||||
row:selected {
|
||||
background-color: #6272a4;
|
||||
color: #f8f8f2;
|
||||
#input {
|
||||
background-color: @mantle;
|
||||
color: @text;
|
||||
border: 1px solid rgba(232, 221, 208, 0.12);
|
||||
border-radius: 10px;
|
||||
padding: 10px 14px;
|
||||
margin-bottom: 10px;
|
||||
caret-color: @accent;
|
||||
}
|
||||
|
||||
/* Suggestions list */
|
||||
row {
|
||||
padding: 6px 10px;
|
||||
border-radius: 6px;
|
||||
margin: 2px 0;
|
||||
transition: background 0.2s ease;
|
||||
#input:focus {
|
||||
border-color: @accent;
|
||||
}
|
||||
|
||||
/* Icon styling */
|
||||
image {
|
||||
width: 32px; /* smaller icons */
|
||||
height: 32px;
|
||||
margin-right: 10px;
|
||||
#scroll {
|
||||
margin: 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Scrollbar styling */
|
||||
scrollbar {
|
||||
background-color: #1e1e2e;
|
||||
width: 6px;
|
||||
border-radius: 3px;
|
||||
#inner-box {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
scrollbar slider {
|
||||
background-color: #6272a4;
|
||||
border-radius: 3px;
|
||||
#entry {
|
||||
padding: 8px 10px;
|
||||
border-radius: 8px;
|
||||
margin: 2px 0;
|
||||
color: @subtext;
|
||||
transition: background-color 120ms ease, color 120ms ease;
|
||||
}
|
||||
|
||||
/* Hint text */
|
||||
entry placeholder {
|
||||
color: #bfbfbf;
|
||||
#entry:selected,
|
||||
#entry:hover {
|
||||
background-color: @surface;
|
||||
color: @text;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* For accessibility: highlight keyboard navigation */
|
||||
row:focus {
|
||||
outline: 2px solid #ff79c6;
|
||||
#entry:selected {
|
||||
box-shadow: inset 3px 0 0 0 @accent;
|
||||
}
|
||||
/* node type `image`, not `img` — this is the one that actually moves the icon */
|
||||
#entry image {
|
||||
margin-right: 18px;
|
||||
-gtk-icon-transform: scale(0.9);
|
||||
}
|
||||
#entry #text {
|
||||
color: inherit;
|
||||
}
|
||||
#entry:selected #text {
|
||||
font-weight: 600;
|
||||
}
|
||||
#unselected {
|
||||
color: @subtext;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,47 +1,50 @@
|
||||
/* wallpaper.sh picker — dark glass, terracotta accent */
|
||||
window {
|
||||
background-color: #1e1e2e;
|
||||
border-radius: 8px;
|
||||
border: 2px solid #313244;
|
||||
background-color: rgba(26, 22, 19, 0.85);
|
||||
border: 1px solid rgba(226, 154, 110, 0.35);
|
||||
border-radius: 16px;
|
||||
font-family: "Inter", "SF Pro Display", "Segoe UI", sans-serif;
|
||||
}
|
||||
|
||||
#input {
|
||||
margin: 2px;
|
||||
padding: 4px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
background-color: #313244;
|
||||
color: #cdd6f4;
|
||||
margin: 12px;
|
||||
padding: 10px 14px;
|
||||
border: 1px solid rgba(226, 154, 110, 0.25);
|
||||
border-radius: 10px;
|
||||
background-color: rgba(20, 17, 14, 0.85);
|
||||
color: #e8ddd0;
|
||||
font-size: 15px;
|
||||
}
|
||||
#input:focus {
|
||||
border-color: rgba(226, 154, 110, 0.8);
|
||||
}
|
||||
|
||||
#inner-box {
|
||||
margin: 0px;
|
||||
margin: 6px 12px 12px 12px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#outer-box {
|
||||
margin: 0px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#scroll {
|
||||
margin: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#text {
|
||||
margin: 2px;
|
||||
color: #cdd6f4;
|
||||
}
|
||||
|
||||
#entry {
|
||||
padding: 2px;
|
||||
margin: 0px;
|
||||
border-radius: 4px;
|
||||
margin: 6px;
|
||||
padding: 6px;
|
||||
border: 2px solid transparent;
|
||||
border-radius: 12px;
|
||||
background-color: rgba(44, 37, 32, 0.5);
|
||||
}
|
||||
|
||||
#entry:selected {
|
||||
background-color: #313244;
|
||||
border-color: #e29a6e;
|
||||
background-color: rgba(226, 154, 110, 0.15);
|
||||
}
|
||||
|
||||
#img {
|
||||
margin: 2px;
|
||||
padding-left: 4px;
|
||||
border-radius: 4px;
|
||||
#entry image {
|
||||
border-radius: 8px;
|
||||
}
|
||||
#text {
|
||||
color: #c9baa8;
|
||||
margin: 0px 4px;
|
||||
}
|
||||
#entry:selected #text {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
[user]
|
||||
email = dylanseandefaoite@gmail.com
|
||||
name = Dylan De Faoite
|
||||
[filter "lfs"]
|
||||
clean = git-lfs clean -- %f
|
||||
smudge = git-lfs smudge -- %f
|
||||
process = git-lfs filter-process
|
||||
required = true
|
||||
[core]
|
||||
autocrlf = input
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 54 KiB |
38
.zshrc
38
.zshrc
@@ -1,24 +1,28 @@
|
||||
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
|
||||
# Initialization code that may require console input (password prompts, [y/n]
|
||||
# confirmations, etc.) must go above this block; everything else may go below.
|
||||
# INSTANT PROMPT
|
||||
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
|
||||
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
|
||||
fi
|
||||
|
||||
# Environment for apps
|
||||
export QT_QPA_PLATFORMTHEME=qt5ct # for Qt5
|
||||
export QT_QPA_PLATFORMTHEME=qt6ct # for Qt6
|
||||
# PATH
|
||||
export PATH="$HOME/.local/bin:$HOME/.opencode/bin:$PATH"
|
||||
|
||||
alias dotfiles="git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME"
|
||||
|
||||
source ~/powerlevel10k/powerlevel10k.zsh-theme
|
||||
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
|
||||
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
|
||||
|
||||
# Path updates
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
export PATH="$HOME/.opencode/bin:$PATH"
|
||||
|
||||
# Env Variables
|
||||
# ENVIRONMENT
|
||||
export EDITOR=nvim
|
||||
export VISUAL=nvim
|
||||
export QT_QPA_PLATFORMTHEME=qt6ct # Qt6 apps
|
||||
|
||||
# ALIASES
|
||||
alias dotfiles="git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME"
|
||||
alias pac="sudo pacman -S"
|
||||
alias update="sudo pacman -Syu"
|
||||
|
||||
# COMPLETION (before plugins that hook into it)
|
||||
autoload -Uz compinit && compinit
|
||||
|
||||
# PLUGINS
|
||||
source ~/powerlevel10k/powerlevel10k.zsh-theme
|
||||
source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
|
||||
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh # keep LAST
|
||||
|
||||
# THEME CONFIG (after theme is loaded)
|
||||
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
|
||||
|
||||
@@ -3,4 +3,11 @@
|
||||
2) Add `monitors.conf` in `~/.config/hypr/` for your specific monitor setup
|
||||
|
||||
# Packages
|
||||
- Used `pacman -Qqen > packages.txt` to get all explicit packages
|
||||
- Used `sudo pacman -Qqen` to get all explicit offical packages
|
||||
- Used `sudo pacman -Qqem` to get all explicit unofficial AUR packages
|
||||
## Meaning
|
||||
- `-Q`: Query local package database
|
||||
- `-q`: Quiet flag, print only package name
|
||||
- `-e`: Only show **explicitly** installed packages
|
||||
- `-n`: Native packages only
|
||||
- `-m`: Foreign packages only
|
||||
|
||||
234
bootstrap.sh
234
bootstrap.sh
@@ -1,5 +1,235 @@
|
||||
#!/usr/bin/env bash
|
||||
# =============================================================================
|
||||
# birch-dots bootstrap.sh
|
||||
# Goes from a bare Arch install to a fully configured Hyprland desktop.
|
||||
# Run as your normal user (with sudo access), NOT as root.
|
||||
# =============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PKG_DIR="$REPO_ROOT/packages"
|
||||
|
||||
# Colours
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
log() { echo -e "${GREEN}==>${NC} $*"; }
|
||||
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
|
||||
die() { echo -e "${RED}[✗]${NC} $*"; exit 1; }
|
||||
|
||||
# Guard: must not run as root
|
||||
[[ "$EUID" -ne 0 ]] || die "Run as your normal user, not root."
|
||||
|
||||
# =============================================================================
|
||||
# 1. SYSTEM SETUP
|
||||
# =============================================================================
|
||||
|
||||
log "Setting locale (en_IE.UTF-8)"
|
||||
sudo sed -i 's/^#en_IE.UTF-8 UTF-8/en_IE.UTF-8 UTF-8/' /etc/locale.gen
|
||||
sudo locale-gen
|
||||
echo "LANG=en_IE.UTF-8" | sudo tee /etc/locale.conf > /dev/null
|
||||
|
||||
log "Setting keymap (uk)"
|
||||
echo "KEYMAP=uk" | sudo tee /etc/vconsole.conf > /dev/null
|
||||
|
||||
log "Setting timezone (Europe/Dublin)"
|
||||
sudo ln -sf /usr/share/zoneinfo/Europe/Dublin /etc/localtime
|
||||
sudo hwclock --systohc
|
||||
|
||||
log "Setting hostname"
|
||||
read -rp " Enter hostname [dylanvm]: " HOSTNAME
|
||||
HOSTNAME="${HOSTNAME:-dylanvm}"
|
||||
echo "$HOSTNAME" | sudo tee /etc/hostname > /dev/null
|
||||
sudo tee /etc/hosts > /dev/null <<EOF
|
||||
127.0.0.1 localhost
|
||||
::1 localhost
|
||||
127.0.1.1 $HOSTNAME.localdomain $HOSTNAME
|
||||
EOF
|
||||
|
||||
# =============================================================================
|
||||
# 2. NETWORKING
|
||||
# =============================================================================
|
||||
|
||||
log "Enabling NetworkManager"
|
||||
sudo systemctl enable --now NetworkManager
|
||||
|
||||
# =============================================================================
|
||||
# 3. PACMAN SETUP
|
||||
# =============================================================================
|
||||
|
||||
log "Configuring pacman (colour + parallel downloads)"
|
||||
sudo sed -i 's/^#Color/Color/' /etc/pacman.conf
|
||||
sudo sed -i 's/^#ParallelDownloads.*/ParallelDownloads = 5/' /etc/pacman.conf
|
||||
|
||||
log "Enabling multilib repo"
|
||||
sudo sed -i '/\[multilib\]/,/Include/s/^#//' /etc/pacman.conf
|
||||
|
||||
log "Updating mirrors and syncing package database"
|
||||
sudo pacman -Sy --noconfirm reflector 2>/dev/null || true
|
||||
sudo reflector --country Ireland,Germany --age 12 --protocol https \
|
||||
--sort rate --save /etc/pacman.d/mirrorlist 2>/dev/null \
|
||||
|| warn "reflector failed, using existing mirrorlist"
|
||||
sudo pacman -Syyu --noconfirm
|
||||
|
||||
# =============================================================================
|
||||
# 4. PACMAN PACKAGES
|
||||
# =============================================================================
|
||||
|
||||
log "Installing pacman packages"
|
||||
for file in "$PKG_DIR"/pacman/*.txt; do
|
||||
log " → $(basename "$file")"
|
||||
while IFS= read -r pkg; do
|
||||
[[ -z "$pkg" || "$pkg" == \#* ]] && continue
|
||||
sudo pacman -S --needed --noconfirm "$pkg" \
|
||||
|| warn " Skipping pacman package not found: $pkg"
|
||||
done < "$file"
|
||||
done
|
||||
|
||||
# =============================================================================
|
||||
# 5. ZSH AS DEFAULT SHELL
|
||||
# =============================================================================
|
||||
|
||||
log "Setting zsh as default shell"
|
||||
chsh -s /bin/zsh
|
||||
|
||||
# =============================================================================
|
||||
# 6. YAY (AUR HELPER)
|
||||
# =============================================================================
|
||||
|
||||
log "Installing yay"
|
||||
if ! command -v yay &>/dev/null; then
|
||||
tmpdir=$(mktemp -d)
|
||||
git clone https://aur.archlinux.org/yay.git "$tmpdir/yay"
|
||||
pushd "$tmpdir/yay" > /dev/null
|
||||
makepkg -si --noconfirm
|
||||
popd > /dev/null
|
||||
rm -rf "$tmpdir"
|
||||
else
|
||||
log " yay already installed, skipping"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 7. AUR PACKAGES
|
||||
# =============================================================================
|
||||
|
||||
log "Installing AUR packages"
|
||||
for file in "$PKG_DIR"/aur/*.txt; do
|
||||
log " → $(basename "$file")"
|
||||
while IFS= read -r pkg; do
|
||||
[[ -z "$pkg" || "$pkg" == \#* ]] && continue
|
||||
yay -S --needed --noconfirm "$pkg" \
|
||||
|| warn " Skipping AUR package not found: $pkg"
|
||||
done < "$file"
|
||||
done
|
||||
|
||||
# =============================================================================
|
||||
# 8. POWERLEVEL10K
|
||||
# =============================================================================
|
||||
|
||||
log "Installing Powerlevel10k"
|
||||
if [[ ! -d "$HOME/powerlevel10k" ]]; then
|
||||
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
|
||||
"$HOME/powerlevel10k"
|
||||
else
|
||||
log " powerlevel10k already present, skipping"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 9. DOTFILES
|
||||
# =============================================================================
|
||||
|
||||
log "Deploying dotfiles from repo into HOME"
|
||||
# Copy everything except git internals, system/, packages/, bootstrap.sh
|
||||
rsync -av --exclude='.git' \
|
||||
--exclude='system/' \
|
||||
--exclude='packages/' \
|
||||
--exclude='bootstrap.sh' \
|
||||
--exclude='README.md' \
|
||||
--exclude='dotfiles_log.txt' \
|
||||
"$REPO_ROOT/" "$HOME/"
|
||||
|
||||
# Make scripts executable
|
||||
find "$HOME/.config" -name "*.sh" -exec chmod +x {} \;
|
||||
|
||||
# =============================================================================
|
||||
# 10. SYSTEM CONFIG FILES (SDDM etc.)
|
||||
# =============================================================================
|
||||
|
||||
log "Applying SDDM configuration"
|
||||
sudo mkdir -p /etc/sddm.conf.d
|
||||
sudo cp -a system/sddm.conf.d /etc/
|
||||
sudo cp -a system/sddm /etc/
|
||||
sudo cp -a "$REPO_ROOT/system/sddm.conf.d/." /etc/sddm.conf.d/
|
||||
sudo cp -a "$REPO_ROOT/system/sddm/." /etc/sddm/
|
||||
sudo chown -R root:root /etc/sddm.conf.d /etc/sddm
|
||||
sudo chmod 644 /etc/sddm.conf.d/*.conf
|
||||
sudo chmod +x /etc/sddm/scripts/Xsetup 2>/dev/null || true
|
||||
|
||||
log "Enabling SDDM"
|
||||
sudo systemctl enable sddm
|
||||
|
||||
# =============================================================================
|
||||
# 11. SERVICES
|
||||
# =============================================================================
|
||||
|
||||
log "Enabling system services"
|
||||
sudo systemctl enable bluetooth
|
||||
sudo systemctl enable docker
|
||||
sudo usermod -aG docker "$USER"
|
||||
sudo systemctl enable earlyoom 2>/dev/null || true
|
||||
|
||||
# =============================================================================
|
||||
# 12. MONITOR CONFIG (machine-specific)
|
||||
# =============================================================================
|
||||
|
||||
MONITORS_CONF="$HOME/.config/hypr/monitors.conf"
|
||||
if [[ ! -f "$MONITORS_CONF" ]]; then
|
||||
warn "No monitors.conf found — creating a safe default (single monitor)"
|
||||
cat > "$MONITORS_CONF" <<'EOF'
|
||||
# Auto-generated default — replace with your actual monitor config.
|
||||
# See: https://wiki.hyprland.org/Configuring/Monitors/
|
||||
monitor = , preferred, auto, 1
|
||||
EOF
|
||||
warn "Edit ~/.config/hypr/monitors.conf before starting Hyprland."
|
||||
else
|
||||
log "monitors.conf already exists, skipping"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 13. VSCODE EXTENSIONS
|
||||
# =============================================================================
|
||||
|
||||
EXTENSIONS_FILE="$HOME/.config/Code/User/extensions.txt"
|
||||
if command -v code &>/dev/null && [[ -f "$EXTENSIONS_FILE" ]]; then
|
||||
log "Installing VS Code extensions"
|
||||
while IFS= read -r ext; do
|
||||
code --install-extension "$ext" --force 2>/dev/null || true
|
||||
done < "$EXTENSIONS_FILE"
|
||||
else
|
||||
warn "VS Code not found or extensions.txt missing — skipping"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# 14. WALLPAPER DIRECTORY
|
||||
# =============================================================================
|
||||
|
||||
log "Creating wallpaper directory"
|
||||
mkdir -p "$HOME/.wallpapers"
|
||||
warn "Add wallpapers to ~/.wallpapers/ for hyprpaper + wofi selector to work."
|
||||
|
||||
# =============================================================================
|
||||
# DONE
|
||||
# =============================================================================
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo -e "${GREEN} Bootstrap complete!${NC}"
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo ""
|
||||
echo " Next steps:"
|
||||
echo " 1. Edit ~/.config/hypr/monitors.conf for your display layout"
|
||||
echo " 2. Add wallpapers to ~/.wallpapers/"
|
||||
echo " 3. Run p10k configure after first zsh launch"
|
||||
echo " 4. Reboot"
|
||||
echo ""
|
||||
|
||||
21
common-issues.md
Normal file
21
common-issues.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Creating a new user
|
||||
1) Login to root account
|
||||
2) Type `useradd -m -G wheel -s /bin/bash <NAME>`
|
||||
3) Install `sudo` and `nvim`
|
||||
4) Type `EDITOR=nvim visudo`
|
||||
5) Uncomment the line `# %wheel ALL=(ALL:ALL) ALL`
|
||||
- Towards the end of the file
|
||||
|
||||
# Broken Internet Access on VM
|
||||
- This works for a VM with `enp1s0` link.
|
||||
```
|
||||
ip addr add 192.168.122.100/24 dev enp1s0
|
||||
ip route add default via 192.168.122.1
|
||||
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||
ping 8.8.8.8
|
||||
```
|
||||
- Then install dhcpcd
|
||||
```
|
||||
pacman -S dhcpcd
|
||||
systemctl enable --now dhcpcd@enp1s0
|
||||
```
|
||||
3
packages/aur/apps.txt
Normal file
3
packages/aur/apps.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
brave-bin
|
||||
play-timer
|
||||
spotify
|
||||
2
packages/aur/desktop.txt
Normal file
2
packages/aur/desktop.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
sddm-sugar-candy-git
|
||||
wlogout
|
||||
4
packages/aur/dev.txt
Normal file
4
packages/aur/dev.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
visual-studio-code-bin
|
||||
intellij-idea-ultimate-edition
|
||||
bruno
|
||||
jre-openjdk
|
||||
1
packages/aur/fonts.txt
Normal file
1
packages/aur/fonts.txt
Normal file
@@ -0,0 +1 @@
|
||||
apple-fonts
|
||||
@@ -1,13 +1,7 @@
|
||||
firefox
|
||||
chromium
|
||||
discord
|
||||
obsidian
|
||||
anki
|
||||
libreoffice-fresh
|
||||
foliate
|
||||
file-roller
|
||||
kate
|
||||
xpad
|
||||
nextcloud-client
|
||||
cmatrix
|
||||
quickshell
|
||||
@@ -20,3 +20,4 @@ unzip
|
||||
zip
|
||||
zsh
|
||||
zsh-syntax-highlighting
|
||||
zsh-autosuggestions
|
||||
@@ -1,8 +1,5 @@
|
||||
hyprland
|
||||
hyprpaper
|
||||
hyprcursor
|
||||
hyprlang
|
||||
hyprutils
|
||||
waybar
|
||||
wofi
|
||||
mako
|
||||
@@ -19,26 +16,21 @@ pavucontrol
|
||||
pipewire-alsa
|
||||
pipewire-jack
|
||||
pipewire-pulse
|
||||
wireplumber
|
||||
xdg-desktop-portal-hyprland
|
||||
xdg-desktop-portal-wlr
|
||||
qt5ct
|
||||
qt6ct
|
||||
qt6-wayland
|
||||
adw-gtk-theme
|
||||
breeze
|
||||
inter-font
|
||||
ttf-0xproto-nerd
|
||||
ttf-jetbrains-mono-nerd
|
||||
ttf-noto-nerd
|
||||
woff2-font-awesome
|
||||
lxappearance
|
||||
kvantum-qt5
|
||||
sddm
|
||||
sddm-sugar-candy-git
|
||||
libva-nvidia-driver
|
||||
nvidia-open
|
||||
nvidia-settings
|
||||
nvidia-utils
|
||||
lib32-nvidia-utils
|
||||
sof-firmware
|
||||
alsa-utils
|
||||
blueman
|
||||
@@ -48,3 +40,5 @@ geoclue
|
||||
imagemagick
|
||||
webkit2gtk
|
||||
xorg-xrandr
|
||||
earlyoom
|
||||
yad
|
||||
@@ -1,6 +1,6 @@
|
||||
git
|
||||
git-lfs
|
||||
neovim
|
||||
vim
|
||||
tmux
|
||||
fzf
|
||||
btop
|
||||
@@ -13,6 +13,7 @@ python
|
||||
python-pip
|
||||
python-pipx
|
||||
python-pydbus
|
||||
python-virtualenv
|
||||
npm
|
||||
jdk21-openjdk
|
||||
maven
|
||||
@@ -21,8 +22,9 @@ docker
|
||||
docker-compose
|
||||
postgresql
|
||||
postgresql-libs
|
||||
libdwarf
|
||||
nmap
|
||||
ncdu
|
||||
ufw
|
||||
sshfs
|
||||
nvidia-container-toolkit
|
||||
rsync
|
||||
10
packages/pacman/fonts.txt
Normal file
10
packages/pacman/fonts.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
inter-font
|
||||
ttf-0xproto-nerd
|
||||
ttf-jetbrains-mono-nerd
|
||||
ttf-noto-nerd
|
||||
woff2-font-awesome
|
||||
noto-fonts
|
||||
noto-fonts-emoji
|
||||
noto-fonts-cjk
|
||||
ttf-dejavu
|
||||
ttf-liberation
|
||||
@@ -5,3 +5,4 @@ obs-studio
|
||||
gpu-screen-recorder
|
||||
gpu-screen-recorder-ui
|
||||
wf-recorder
|
||||
yt-dlp
|
||||
Reference in New Issue
Block a user