Compare commits

85 Commits

Author SHA1 Message Date
9c73a335b9 feat(hypr): make animations smoother 2026-08-27 22:28:09 +01:00
fa4f7a322d feat(style): update css to claude-style theme 2026-08-27 22:22:29 +01:00
561e478849 feat(zshrc): add pacman -Syu alias 2026-08-27 21:51:32 +01:00
ad539234f1 feat(styling): update hyprland gtw icons & themes 2026-08-13 23:07:04 +01:00
b62db3a09d fix(binds): window not wrapping text 2026-07-23 20:15:51 +01:00
0513ab1abb feat(binds): add view keybinds script 2026-07-23 20:13:31 +01:00
84f51e8365 feat(packages): add yad package 2026-07-23 20:07:58 +01:00
4b08df386f feat(binds): add descriptions & change swap window bind 2026-07-23 20:00:58 +01:00
491f2b2765 feat(packages): add missing zsh package 2026-07-20 11:10:31 +01:00
5c29ef00f1 feat(zsh): add pacman install alias 2026-07-19 23:31:50 +01:00
5b40c331b6 feat(wofi): improve wofi program selection 2026-07-16 19:19:39 +01:00
901cfeca0d feat(wallpaper): add better wallpaper script 2026-07-16 19:12:02 +01:00
a1001e521e fix(wlogout): incorrect hyprland exit command 2026-07-16 18:42:19 +01:00
aae8be4001 style(hypr): cleanup lua configs 2026-07-16 10:20:11 +01:00
5dce5eb3b7 refactor(zsh): cleanup zshrc file 2026-07-14 19:46:20 +01:00
06b5aaa2d8 fix(hypr): incorrect mouse sens 2026-07-14 19:32:39 +01:00
84c0bb23b8 refactor!(hypr): switch to Lua config 2026-07-14 19:31:21 +01:00
3ec778781d fix(binds): update playerctl keybinds
Interfered with CS2 voting systems. Must find another way for it not to
override with other programs.
2026-04-06 20:47:36 +01:00
30425fa1e4 fix(hyprland): increase hyprland window animation speed
Was too slow, got really annoying
2026-04-06 20:44:33 +01:00
b55b45f25e fix(gitconfig): auto-lf 2026-04-06 20:43:50 +01:00
6bb29b7539 feat(vscode): update font size 2026-04-06 20:42:34 +01:00
3481125919 fix(hypr): fix minimum force speed 2026-03-16 22:51:08 +00:00
798ecf40a2 fix(hypr): adjust gesture settings for smoother workspace swaps
It turns out there are options for adjust the cancelling ratio and force
speed for workspace animations. This makes it much closer to real MacOS
animations.

This was tested against Jas's Macbook Air - M1 and they seem quite
closer.
2026-03-16 22:26:54 +00:00
eabcc3de6b feat(hyprland): add hypridle and lid close binds 2026-03-16 22:26:14 +00:00
bf9d570ff3 Merge branch 'main' of ssh://gitea/dylan/birch-dots 2026-03-14 13:21:03 +00:00
2c3c58e92d feat(packages): add yt-dlp 2026-03-14 00:34:20 +00:00
bc2c508969 fix(wlogout): broken logout button 2026-03-12 22:51:22 +00:00
8b12bc3a3b fix(mouse): incorrect sens 2026-03-12 22:46:17 +00:00
e628456780 Merge branch 'main' of ssh://gitea/dylan/birch-dots 2026-03-12 22:45:02 +00:00
3c463300b5 feat(gitconfig): add LFS config 2026-03-12 22:44:31 +00:00
984027efcb fix(hyprcursor): breeze mouse pointer uses lowercase "b"
Not really sure why it worked before, but after logging in this morning
the cursor was the default hyprland cursor. Fixed by reinstalling Breeze
and changing this.
2026-03-12 09:27:17 +00:00
1c12506728 chore(gitconfig): add LFS config 2026-03-12 08:56:16 +00:00
568a81a94d fix(hypr): increase scroll factor
Scrolling on certain apps is too slow with 0.2
2026-03-12 08:55:49 +00:00
9ee3da3100 feat(waybar): add bluetooth module 2026-03-12 08:55:28 +00:00
fab1c53cb3 fix(bootstrap): entire file skip upon one package fail
If one package in a file failed, the whole file was skipped.
2026-03-09 15:45:19 +00:00
f29cf5e920 fix(packages): update incorrect docker compose package 2026-03-09 15:40:21 +00:00
3ef8420a21 feat(packages): add rsync 2026-03-09 15:36:40 +00:00
7805b3c98d docs: add common issues markdown
These mostly pertain to the QEMU VM setup, so they might not be fully
relevant outside of VMs.
2026-03-09 15:24:19 +00:00
ccb5b1ab96 fix(bootstrap): missing NetworkManager install before enabling 2026-03-09 15:23:16 +00:00
c65c286606 fix(bootstrap): remove bluetooth service enabling
Bluetooth does not for now work reliably on my machines.
2026-03-09 15:10:58 +00:00
34ce514c75 fix(packages): remove zoom
Zoom is not a base package that I use on a base system. It can be
installed after the fact.
2026-03-09 14:53:20 +00:00
6e6376eee9 fix(bootstrap): missing system setups in bootstrap 2026-03-09 14:49:45 +00:00
d3617c3866 feat(bootstrap): update bootstrap script to install packages 2026-03-09 14:30:02 +00:00
378cc51cc3 feat(packages): add git-lfs 2026-03-08 15:45:18 +00:00
1bd5bebcda fix(hyprland): anime wallpaper accidentally added in default config
Cringe.
2026-03-08 00:22:25 +00:00
d96970bc8d fix(packages): remove redundant xdg-desktop-portal-wlr module
`xdg-desktop-portal-hyprland` is a fork of wlr that includes
Hyprland-specific features.
2026-03-08 00:00:16 +00:00
4bf3764855 fix(packages): remove qdirstat
ncdu (pacman/dev.txt) does everything that it does but as a CLI.
2026-03-07 23:56:35 +00:00
af00cb8735 feat(packages): remove libdwarf dev package
Not used by anything, not sure when or why it was installed.
2026-03-07 23:55:53 +00:00
1ba46fb540 feat(wlogout): add wlogout package settings 2026-03-07 19:45:16 +00:00
6796b1a28f feat(packages): add qdirstat package 2026-03-07 19:44:51 +00:00
88575db93b fix(waybar): missing left red bar on power button
Just for consistency with the left side of the bar, which has a nice
yellow bar indicating the end of the waybar.
2026-03-06 22:37:39 +00:00
c14d09c169 docs: update package retrival docs in README
These commands and flag descriptions are more for my own usage in the
future rather than any comprehensive or full documentation.
2026-03-06 22:15:29 +00:00
939e9fbc88 fix(packages): add missing wlogout to packages
I had wlogout used in my Waybar for ages but no wlogout specification
2026-03-06 21:40:02 +00:00
93f9c77ad3 refactor(packages): remove unnecessary packages & extract fonts
Fonts are now in their own file since they're awkward little packages to
manage and I hate them.
2026-03-06 19:50:48 +00:00
337b2f1ffd fix(packages): remove sddm-sugar-candy-git from pacman package list 2026-03-06 19:40:09 +00:00
cd1126b2ea refactor(packages): split packages into offical and foreign 2026-03-06 19:39:02 +00:00
22e667051a fix(waybar): transparency too high on bright backgrounds
After I logged into the main PC, the waybar icons were barely visible
due to the borderline transparent icons.

I increased the opaqueness of the widgets themselves while keeping the
rest of the bar transparent, so I can keep the clean look while still
being able to see what the hell is going on.
2026-03-06 19:26:22 +00:00
b1f76d6ac2 fix(hypr): increase length of workspace swap animation
Far too low before, originally done for the gesture speed, but affected
actually swapping between workspaces with the keyboard far more.
2026-03-05 16:52:42 +00:00
f171fe16fb feat(waybar): new waybar styling
Trying it out for now, might revert still since I'm not fully sold on it
yet. It's sleek but a bit "gamer-y" for my taste.
2026-03-05 16:46:16 +00:00
dac5c77bed feat(vscode): add vscode settings and extensions 2026-03-05 15:38:23 +00:00
4b3fd8bfa6 fix(wallpapers): remove unnecessary wallpaper 2026-03-05 14:45:40 +00:00
0506b1fa6d fix(hypr): separate two different animations
The overshoot animation applied to all windows and looked strange on
windows.
2026-03-05 11:01:27 +00:00
d91355f602 refactor(hypr): move gestures to input file
Gestures are not decorational, they are inputs.
2026-03-05 10:50:15 +00:00
d5ce4b4b19 feat(hypr): update beizer animation for smoother workspace swaps
Workspace swaps with no overshoot felt slightly clunky. Adding a small
overshoot makes it feel more smooth and Mac-like.
2026-03-05 10:29:20 +00:00
e36719997a fix(sddm): permissions and ownership of root-level SDDM confs
SDDM configs are at the system root level and are not user owned,
therefore they must be owned by the root and have special permissions.

`/etc/sddm.conf.d` and `/etc/sddm` *should* have permissions of 644.
Root can read/write, everyone else can read.
2026-03-05 09:57:40 +00:00
e972fa387d feat(packages): add earlyoom package
Prevents system freezing up when RAM runs out
2026-03-03 21:02:06 +00:00
d88f49732c feat: add nvidia-container-toolkit package 2026-03-03 14:14:57 +00:00
b1341b7920 feat: add discord settings 2026-03-02 21:43:08 +00:00
9dcb1ac329 fix: remove unused deps 2026-03-02 21:41:15 +00:00
3827de7d7c feat: update media keybinds to use f-keys 2026-03-01 18:42:46 +00:00
2a0c796952 fix: hardcoded PATH configs specific to a machine
Also removed neofetch
2026-03-01 18:23:29 +00:00
458b14ad5a feat: add .gitconfig 2026-03-01 18:15:28 +00:00
258702801e refactor(hypr): remove duplicated config from hyprland.conf 2026-03-01 11:26:59 +00:00
63d5d8bf85 feat: reduce scroll factor for smoother scrolling
Refactor input settings into it's own file
2026-02-28 19:43:57 +00:00
b6304c9430 docs: remove reqs from README
Reqs exist as package names in `packages`. Must still update
bootstrap.sh
2026-02-27 17:52:26 +00:00
1feae4fda9 chore: remove modelio alias
Use wofi menu option and edit .desktop launch file instead of launching
from terminal
2026-02-27 17:50:30 +00:00
7218365434 feat(sddm): add SDDM theme and config files 2026-02-26 22:09:11 +00:00
6267c5456c refactor: split packages by logical group 2026-02-26 21:02:37 +00:00
08c2929606 fix: remove unused and redundant packages 2026-02-26 20:59:01 +00:00
a55d8ec23b docs: update README for explict package command 2026-02-26 20:55:04 +00:00
ae12cf6332 feat: add packages.txt which lists all installed packages 2026-02-26 20:53:16 +00:00
1208b2cf10 fix(hyprland): fix per-device mouse sens 2026-02-26 20:45:43 +00:00
2227c87ab0 chore: clean up PATH envs
Prepending is generally recommended
2026-02-26 20:40:07 +00:00
9eb75b6306 fix: duplicate powerlevel10k setting & always-on neofetch
Running Neofetch on every shell spawn slows it down. Add check to ensure
it's only an interactive shell
2026-02-26 20:38:19 +00:00
6fe6528f9b feat(zshrc): add modelio with start envs to ensure functionality 2026-02-26 20:32:05 +00:00
43 changed files with 1238 additions and 590 deletions

View File

@@ -1,6 +0,0 @@
# Floating
windowrule = float 1, match:title Play Timer
# Opacity
windowrule = opacity 0.9 0.75, match:class $terminal

View 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"},
})

View File

@@ -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

View 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" })

View File

@@ -1,104 +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
###################
### PERMISSIONS ###
###################
general {
gaps_in = 5
gaps_out = 5
border_size = 2
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959aa)
# Set to true enable resizing windows by clicking and dragging on borders and gaps
resize_on_border = false
# Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on
allow_tearing = false
layout = dwindle
}
dwindle {
pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = true # You probably want this
}
# See https://wiki.hypr.land/Configuring/Master-Layout/ for more
master {
new_status = master
}
# https://wiki.hypr.land/Configuring/Variables/#misc
misc {
force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers
disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. :(
}
#############
### INPUT ###
#############
# https://wiki.hypr.land/Configuring/Variables/#input
input {
kb_layout = ie
kb_variant =
kb_model =
kb_options =
kb_rules =
follow_mouse = 1
accel_profile = flat
force_no_accel=2
sensitivity = 1 # -1.0 - 1.0, 0 means no modification.
touchpad {
natural_scroll = true
}
}
device {
name = epic-mouse-v1
sensitivity = -0.5
}
exec-once = waybar
exec-once = nextcloud
exec-once = hyprctl setcursor Breeze 24
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
View 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)

View File

@@ -1 +1,4 @@
ipc = on
preload = /home/dylan/.wallpapers/monochrome.png
wallpaper = ,/home/dylan/.wallpapers/monochrome.png
splash = false

20
.config/hypr/input.lua Normal file
View 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,
},
})

View File

@@ -1,72 +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
# Laptop multimedia keys for volume and LCD brightness
bindel = $mainMod, P, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+
bindel = $mainMod, O, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = $mainMod, N, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = $mainMod, M, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = $mainMod, L, exec, brightnessctl -e4 -n2 set 5%+
bindel = $mainMod, K, exec, brightnessctl -e4 -n2 set 5%-
# Requires playerctl
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
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
View 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
View 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,
})

View 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

View File

@@ -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

View 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",
})

View File

@@ -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": {

View 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}\"}"

View File

@@ -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
View 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
View 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"));
}

View File

@@ -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

View File

@@ -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}"

View File

@@ -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;
}

View File

@@ -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;
}

10
.gitconfig Normal file
View File

@@ -0,0 +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

40
.zshrc
View File

@@ -1,26 +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.
neofetch
# 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="$PATH:/home/dylan/.local/bin"
export PATH=/home/dylan/.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

View File

@@ -1,18 +1,13 @@
# Requirements
- hyprland (Desktop Env)
- hyprpaper (Wallpapers)
- kitty (Terminal)
- thunar (File Manager)
- wofi (Menus)
- adw-gtk-theme
- zsh-syntax-highlighting
- mako (Notifications)
- nvim (Text Editor)
## System Reqs
- wpctl (Audio config)
- imagemagick (Wallpaper caching)
# Setup
1) Ensure each requirement is installed
1) Run `bootstrap.sh` to configure system files and install packages
2) Add `monitors.conf` in `~/.config/hypr/` for your specific monitor setup
# 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

235
bootstrap.sh Normal file
View File

@@ -0,0 +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 "$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
View 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
View File

@@ -0,0 +1,3 @@
brave-bin
play-timer
spotify

2
packages/aur/desktop.txt Normal file
View File

@@ -0,0 +1,2 @@
sddm-sugar-candy-git
wlogout

4
packages/aur/dev.txt Normal file
View File

@@ -0,0 +1,4 @@
visual-studio-code-bin
intellij-idea-ultimate-edition
bruno
jre-openjdk

1
packages/aur/fonts.txt Normal file
View File

@@ -0,0 +1 @@
apple-fonts

7
packages/pacman/apps.txt Normal file
View File

@@ -0,0 +1,7 @@
discord
obsidian
anki
libreoffice-fresh
file-roller
kate
nextcloud-client

23
packages/pacman/base.txt Normal file
View File

@@ -0,0 +1,23 @@
base
base-devel
linux
linux-firmware
amd-ucode
grub
efibootmgr
os-prober
sudo
networkmanager
openssh
fuse3
man-db
bash-completion
pacman-contrib
curl
wget
less
unzip
zip
zsh
zsh-syntax-highlighting
zsh-autosuggestions

View File

@@ -0,0 +1,44 @@
hyprland
hyprpaper
waybar
wofi
mako
kitty
thunar
thunar-archive-plugin
tumbler
wl-clipboard
slurp
grim
swappy
brightnessctl
pavucontrol
pipewire-alsa
pipewire-jack
pipewire-pulse
wireplumber
xdg-desktop-portal-hyprland
qt5ct
qt6ct
qt6-wayland
adw-gtk-theme
breeze
lxappearance
kvantum-qt5
sddm
libva-nvidia-driver
nvidia-open
nvidia-settings
nvidia-utils
lib32-nvidia-utils
sof-firmware
alsa-utils
blueman
bluez
bluez-utils
geoclue
imagemagick
webkit2gtk
xorg-xrandr
earlyoom
yad

30
packages/pacman/dev.txt Normal file
View File

@@ -0,0 +1,30 @@
git
git-lfs
neovim
tmux
fzf
btop
ranger
gdb
lldb
ccache
rust
python
python-pip
python-pipx
python-pydbus
python-virtualenv
npm
jdk21-openjdk
maven
openmpi
docker
docker-compose
postgresql
postgresql-libs
nmap
ncdu
ufw
sshfs
nvidia-container-toolkit
rsync

10
packages/pacman/fonts.txt Normal file
View 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

View File

@@ -0,0 +1,2 @@
steam
prismlauncher

View File

@@ -0,0 +1,8 @@
vlc
vlc-plugin-ffmpeg
vlc-plugin-x264
obs-studio
gpu-screen-recorder
gpu-screen-recorder-ui
wf-recorder
yt-dlp

View File

@@ -0,0 +1,4 @@
[XDisplay]
# Xsetup script path
# A script to execute when starting the display server
DisplayCommand=/etc/sddm/scripts/Xsetup

2
system/sddm.conf.d/theme.conf Executable file
View File

@@ -0,0 +1,2 @@
[Theme]
Current=sugar-candy

5
system/sddm/scripts/Xsetup Executable file
View File

@@ -0,0 +1,5 @@
#!/bin/sh
xrandr \
--output DP-0 --mode 1920x1080 --pos 0x0 --rate 144 \
--output DP-4 --mode 1920x1080 --pos 1920x0 --rate 270 --primary