diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 428d01b4..17bba8a7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,7 +29,9 @@ hypercube/ │ ├── gtk-3.0/ # GTK3 settings │ ├── gtk-4.0/ # GTK4 settings │ ├── hypr/ # Hyprland configs -│ │ ├── hyprland.conf # Main compositor config +│ │ ├── hyprland.lua # Main compositor config (Lua, 0.55+) +│ │ ├── hyprland-kiosk.lua # Kiosk-mode compositor config +│ │ ├── .luarc.json # Lua LSP config for editing hyprland.lua │ │ ├── hyprlock.conf # Lock screen │ │ ├── hypridle.conf # Idle management │ │ └── hyprpaper.conf # Wallpaper diff --git a/build_files/hypercube/03-hypercube-configs.sh b/build_files/hypercube/03-hypercube-configs.sh index b6a53886..860efa91 100755 --- a/build_files/hypercube/03-hypercube-configs.sh +++ b/build_files/hypercube/03-hypercube-configs.sh @@ -60,21 +60,25 @@ import = ["/usr/share/hypercube/config/alacritty/alacritty.toml"] # Your customizations below: EOF -### Hyprland - stub that sources system config -# Users can customize by adding settings after the source line -# Hyprland parses linearly: system config first, then user customizations +### Hyprland - stub that requires system config +# Since Hyprland 0.55 the config is Lua (~/.config/hypr/hyprland.lua). +# Users can customize by adding settings after the require line. +# Hyprland evaluates linearly: system config first, then user customizations +# (later hl.config() calls override earlier values). mkdir -p /etc/skel/.config/hypr -cat > /etc/skel/.config/hypr/hyprland.conf << 'EOF' -# Hypercube Hyprland Configuration -# System defaults are sourced below. Add your customizations after this line. -# Settings defined after source will override the defaults. -# To replace defaults entirely, remove or comment out the source line. +cat > /etc/skel/.config/hypr/hyprland.lua << 'EOF' +-- Hypercube Hyprland Configuration +-- System defaults are required below. Add your customizations after this line. +-- Settings defined after the require will override the defaults. +-- To replace defaults entirely, remove or comment out the require line. -source = /usr/share/hypercube/config/hypr/hyprland.conf +require("/usr/share/hypercube/config/hypr/hyprland.lua") -# Your customizations below: +-- Your customizations below: EOF +# LuaLS config so editors pick up the hl API stubs in ~/.config/hypr +install -Dm644 "${CONFIG_DIR}/hypr/.luarc.json" /etc/skel/.config/hypr/.luarc.json ### Neovim - devcube sandbox overrides # The editor config + AI agents ship baked into the devcube podman image diff --git a/dot_files/hypr/.luarc.json b/dot_files/hypr/.luarc.json new file mode 100644 index 00000000..98686dfd --- /dev/null +++ b/dot_files/hypr/.luarc.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", + "workspace": { + "library": [ + "/usr/share/hypr/stubs" + ] + }, + "runtime": { + "version": "Lua 5.4" + }, + "diagnostics": { + "globals": [ + "hl" + ] + } +} diff --git a/dot_files/hypr/hypridle.conf b/dot_files/hypr/hypridle.conf index c28d1679..b86c92c5 100644 --- a/dot_files/hypr/hypridle.conf +++ b/dot_files/hypr/hypridle.conf @@ -4,7 +4,7 @@ general { lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances before_sleep_cmd = loginctl lock-session # lock before suspend - after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display + after_sleep_cmd = hyprctl dispatch 'hl.dsp.dpms({ action = "on" })' # to avoid having to press a key twice to turn on the display } # Dim screen after 2.5 minutes of inactivity @@ -30,8 +30,8 @@ listener { # Turn off screen after 5.5 minutes of inactivity (30 seconds after lock) listener { timeout = 330 # 5.5 minutes - on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed - on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired + on-timeout = hyprctl dispatch 'hl.dsp.dpms({ action = "off" })' # screen off when timeout has passed + on-resume = hyprctl dispatch 'hl.dsp.dpms({ action = "on" })' # screen on when activity is detected after timeout has fired } # Suspend system after 30 minutes of inactivity diff --git a/dot_files/hypr/hyprland-kiosk.conf b/dot_files/hypr/hyprland-kiosk.conf deleted file mode 100644 index 0395b461..00000000 --- a/dot_files/hypr/hyprland-kiosk.conf +++ /dev/null @@ -1,106 +0,0 @@ -# Hyprland Kiosk Mode Configuration -# Used for desktop kiosk mode applications -# - No keybindings (locked down) -# - Single fullscreen application -# - Exits when the application closes -# -# Usage: Set KIOSK_CMD environment variable before launching -# KIOSK_CMD="your-app" Hyprland -c /path/to/hyprland-kiosk.conf - -################ -### MONITORS ### -################ - -# Enable all monitors - kiosk app shows on primary, others show wallpaper -monitor=,preferred,auto,auto - -################# -### AUTOSTART ### -################# - -# Wallpaper on all monitors -exec-once = hyprpaper -c /usr/share/hypercube/config/hypr/hyprpaper.conf - -# Launch the kiosk application from environment variable -exec-once = $KIOSK_CMD - -# Exit Hyprland when the last window closes -exec-once = handle=$(hyprctl -j clients | jq -r '.[0].address // empty'); while [ -n "$handle" ]; do sleep 0.5; handle=$(hyprctl -j clients | jq -r '.[0].address // empty'); done; hyprctl dispatch exit - -############################# -### ENVIRONMENT VARIABLES ### -############################# - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 - -##################### -### LOOK AND FEEL ### -##################### - -general { - gaps_in = 0 - gaps_out = 0 - border_size = 0 - col.active_border = rgba(00000000) - col.inactive_border = rgba(00000000) - resize_on_border = false - allow_tearing = false - layout = dwindle -} - -decoration { - rounding = 0 - active_opacity = 1.0 - inactive_opacity = 1.0 - shadow { - enabled = false - } - blur { - enabled = false - } -} - -animations { - enabled = false -} - -dwindle { - preserve_split = true -} - -misc { - force_default_wallpaper = 0 - disable_hyprland_logo = true -} - -############# -### INPUT ### -############# - -input { - kb_layout = us - kb_variant = - kb_model = - kb_options = - kb_rules = - follow_mouse = 1 - sensitivity = 0 - touchpad { - natural_scroll = false - } -} - -################### -### KEYBINDINGS ### -################### - -# No keybindings - kiosk mode is locked down - -############################## -### WINDOWS AND WORKSPACES ### -############################## - -# Force all windows to fullscreen -windowrule = fullscreen, match:class .* -windowrule = nofocus, match:class ^$, match:title ^$ diff --git a/dot_files/hypr/hyprland-kiosk.lua b/dot_files/hypr/hyprland-kiosk.lua new file mode 100644 index 00000000..23197fed --- /dev/null +++ b/dot_files/hypr/hyprland-kiosk.lua @@ -0,0 +1,117 @@ +-- Hyprland Kiosk Mode Configuration +-- Used for desktop kiosk mode applications +-- - No keybindings (locked down) +-- - Single fullscreen application +-- - Exits when the application closes +-- +-- Since Hyprland 0.55, hyprlang (.conf) is deprecated in favor of Lua. +-- +-- Usage: Set KIOSK_CMD environment variable before launching +-- KIOSK_CMD="your-app" Hyprland -c /path/to/hyprland-kiosk.lua + +------------------ +---- MONITORS ---- +------------------ + +-- Enable all monitors - kiosk app shows on primary, others show wallpaper +hl.monitor({ output = "", mode = "preferred", position = "auto", scale = "auto" }) + +------------------- +---- AUTOSTART ---- +------------------- + +hl.on("hyprland.start", function() + -- Wallpaper on all monitors + hl.exec_cmd("hyprpaper -c /usr/share/hypercube/config/hypr/hyprpaper.conf") + + -- Launch the kiosk application from the KIOSK_CMD environment variable + -- (exec_cmd runs via `sh -c`, so the variable is expanded by the shell) + hl.exec_cmd("$KIOSK_CMD") + + -- Exit Hyprland when the last window closes + hl.exec_cmd([[handle=$(hyprctl -j clients | jq -r '.[0].address // empty'); while [ -n "$handle" ]; do sleep 0.5; handle=$(hyprctl -j clients | jq -r '.[0].address // empty'); done; hyprctl dispatch 'hl.dsp.exit()']]) +end) + +------------------------------- +---- ENVIRONMENT VARIABLES ---- +------------------------------- + +hl.env("XCURSOR_SIZE", "24") +hl.env("HYPRCURSOR_SIZE", "24") + +----------------------- +---- LOOK AND FEEL ---- +----------------------- + +hl.config({ + general = { + gaps_in = 0, + gaps_out = 0, + border_size = 0, + col = { + active_border = "rgba(00000000)", + inactive_border = "rgba(00000000)", + }, + resize_on_border = false, + allow_tearing = false, + layout = "dwindle", + }, + + decoration = { + rounding = 0, + active_opacity = 1.0, + inactive_opacity = 1.0, + shadow = { + enabled = false, + }, + blur = { + enabled = false, + }, + }, + + animations = { + enabled = false, + }, + + dwindle = { + preserve_split = true, + }, + + misc = { + force_default_wallpaper = 0, + disable_hyprland_logo = true, + }, +}) + +--------------- +---- INPUT ---- +--------------- + +hl.config({ + input = { + kb_layout = "us", + kb_variant = "", + kb_model = "", + kb_options = "", + kb_rules = "", + follow_mouse = 1, + sensitivity = 0, + touchpad = { + natural_scroll = false, + }, + }, +}) + +--------------------- +---- KEYBINDINGS ---- +--------------------- + +-- No keybindings - kiosk mode is locked down + +-------------------------------- +---- WINDOWS AND WORKSPACES ---- +-------------------------------- + +-- Force all windows to fullscreen +hl.window_rule({ name = "kiosk-fullscreen", match = { class = ".*" }, fullscreen = true }) +hl.window_rule({ match = { class = "^$", title = "^$" }, no_focus = true }) diff --git a/dot_files/hypr/hyprland.conf b/dot_files/hypr/hyprland.conf deleted file mode 100644 index b135552a..00000000 --- a/dot_files/hypr/hyprland.conf +++ /dev/null @@ -1,382 +0,0 @@ - -# ####################################################################################### -# HYPRLAND CONFIG - Tokyo Night Theme with Vim-like Keybindings -# ####################################################################################### -# -# Tokyo Night Color Palette: -# - Background: #1a1b26 -# - Foreground: #c0caf5 -# - Blue (accent): #7aa2f7 -# - Purple (accent): #bb9af7 -# - Cyan: #7dcfff -# - Green: #9ece6a -# - Red: #f7768e -# - Border inactive: #414868 -# -# Keybindings: -# - Vim-like navigation: SUPER + h/j/k/l (left/down/up/right) -# - Move windows: SUPER + SHIFT + h/j/k/l -# - Resize windows: SUPER + CTRL + h/j/k/l -# - App launcher: SUPER + R (opens left sidebar with search) -# - Quick settings: SUPER + N (opens right sidebar) -# -# ####################################################################################### - -# Refer to the wiki for more information. -# https://wiki.hypr.land/Configuring/ - - -################ -### MONITORS ### -################ - -# See https://wiki.hypr.land/Configuring/Monitors/ -monitor=,preferred,auto,auto - - -################### -### MY PROGRAMS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ - -# Set programs that you use -$terminal = ghostty -$fileManager = files -$menu = qs ipc call shell toggleSidebarLeft - -################# -### AUTOSTART ### -################# - -# Export the Wayland session environment to the systemd user manager and the -# D-Bus activation environment. Without this, D-Bus-activated services such as -# xdg-desktop-portal fail to start when Hyprland is launched directly (i.e. not -# via uwsm), breaking dark-mode detection, file pickers, and screen sharing. -# Runs first so the services started below inherit a populated environment. -exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE HYPRLAND_INSTANCE_SIGNATURE - -# Quickshell - Launcher, Notifications, OSD -exec-once = quickshell - -# Wallpaper -exec-once = hyprpaper -c /usr/share/hypercube/config/hypr/hyprpaper.conf - -# Idle / Lock -exec-once = hypridle -c /usr/share/hypercube/config/hypr/hypridle.conf - -# Hyprland Polkit Authentication Agent (for privilege escalation) -exec-once = systemctl --user start hyprpolkitagent - -# GNOME Keyring (for secrets management, SSH keys, and certificates) -exec-once = gnome-keyring-daemon --start - -############################# -### ENVIRONMENT VARIABLES ### -############################# - -# See https://wiki.hypr.land/Configuring/Environment-variables/ - -# Desktop identity - lets xdg-desktop-portal select the Hyprland backend -# (hyprland-portals.conf) and route the Settings/color-scheme interface. -env = XDG_CURRENT_DESKTOP,Hyprland - -# XDG directories - required for quickshell and other apps to find Hypercube configs -env = XDG_CONFIG_DIRS,/etc/xdg:/usr/share/hypercube/config -env = XDG_DATA_DIRS,/usr/local/share:/usr/share:/usr/share/hypercube/data - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 - -# SSH agent socket from GNOME Keyring -env = SSH_AUTH_SOCK,$XDG_RUNTIME_DIR/keyring/ssh - - -################### -### PERMISSIONS ### -################### - -# See https://wiki.hypr.land/Configuring/Permissions/ -# Please note permission changes here require a Hyprland restart and are not applied on-the-fly -# for security reasons - -# ecosystem { -# enforce_permissions = 1 -# } - -# permission = /usr/(bin|local/bin)/grim, screencopy, allow -# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow -# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow - - -##################### -### LOOK AND FEEL ### -##################### - -# Refer to https://wiki.hypr.land/Configuring/Variables/ - -# https://wiki.hypr.land/Configuring/Variables/#general -# Tokyo Night Theme Colors -general { - gaps_in = 5 - gaps_out = 5 - - border_size = 2 - - # Tokyo Night colors - active border uses accent blue/purple gradient - col.active_border = rgba(7aa2f7ee) rgba(bb9af7ee) 45deg - col.inactive_border = rgba(414868aa) - - # 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 -} - -# https://wiki.hypr.land/Configuring/Variables/#decoration -decoration { - rounding = 0 - rounding_power = 2 - - # Change transparency of focused and unfocused windows - active_opacity = 1.0 - inactive_opacity = 1.0 - - shadow { - enabled = true - range = 4 - render_power = 3 - color = rgba(1a1b26ee) # Tokyo Night background - } - - # https://wiki.hypr.land/Configuring/Variables/#blur - blur { - enabled = true - size = 3 - passes = 1 - - vibrancy = 0.1696 - } -} - -# https://wiki.hypr.land/Configuring/Variables/#animations -animations { - enabled = yes, please :) - - # Default curves, see https://wiki.hypr.land/Configuring/Animations/#curves - # NAME, X0, Y0, X1, Y1 - bezier = easeOutQuint, 0.23, 1, 0.32, 1 - bezier = easeInOutCubic, 0.65, 0.05, 0.36, 1 - bezier = linear, 0, 0, 1, 1 - bezier = almostLinear, 0.5, 0.5, 0.75, 1 - bezier = quick, 0.15, 0, 0.1, 1 - - # Default animations, see https://wiki.hypr.land/Configuring/Animations/ - # NAME, ONOFF, SPEED, CURVE, [STYLE] - animation = global, 1, 10, default - animation = border, 1, 5.39, easeOutQuint - animation = windows, 1, 4.79, easeOutQuint - animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% - animation = windowsOut, 1, 1.49, linear, popin 87% - animation = fadeIn, 1, 1.73, almostLinear - animation = fadeOut, 1, 1.46, almostLinear - animation = fade, 1, 3.03, quick - animation = layers, 1, 3.81, easeOutQuint - animation = layersIn, 1, 4, easeOutQuint, fade - animation = layersOut, 1, 1.5, linear, fade - animation = fadeLayersIn, 1, 1.79, almostLinear - animation = fadeLayersOut, 1, 1.39, almostLinear - animation = workspaces, 1, 1.94, almostLinear, fade - animation = workspacesIn, 1, 1.21, almostLinear, fade - animation = workspacesOut, 1, 1.94, almostLinear, fade - animation = zoomFactor, 1, 7, quick -} - -# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ -# "Smart gaps" / "No gaps when only" -# uncomment all if you wish to use that. -# workspace = w[tv1], gapsout:0, gapsin:0 -# workspace = f[1], gapsout:0, gapsin:0 -# windowrule = bordersize 0, floating:0, onworkspace:w[tv1] -# windowrule = rounding 0, floating:0, onworkspace:w[tv1] -# windowrule = bordersize 0, floating:0, onworkspace:f[1] -# windowrule = rounding 0, floating:0, onworkspace:f[1] - -# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more -dwindle { - 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 = 0 # 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 = us - kb_variant = - kb_model = - # caps:ctrl_modifier - Caps Lock acts as Ctrl - kb_options = caps:ctrl_modifier - kb_rules = - follow_mouse = 1 - sensitivity = 0 # -1.0 - 1.0, 0 means no modification. - touchpad { - natural_scroll = false - } -} - -# See https://wiki.hypr.land/Configuring/Gestures -gesture = 3, horizontal, workspace - -# Example per-device config -# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more -device { - name = epic-mouse-v1 - sensitivity = -0.5 -} - - -################### -### KEYBINDINGS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ -$mainMod = SUPER # Sets "Windows" key as main modifier - -# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more -bind = $mainMod, Q, exec, $terminal -bind = $mainMod, C, killactive, -bind = $mainMod, E, exec, $fileManager -bind = $mainMod, V, togglefloating, -bind = $mainMod, F, fullscreen, 0 # Fullscreen -bind = $mainMod, R, exec, $menu -# bind = $mainMod, A, exec, qs ipc call shell toggleSidebarLeft # Removed - use SUPER+R instead -bind = $mainMod, N, exec, qs ipc call shell toggleSidebarRight # Notifications/quick settings -bind = $mainMod, Escape, exec, qs ipc call shell closeAll # Close all panels -bind = $mainMod, P, pseudo, # dwindle -bind = $mainMod, S, layoutmsg, togglesplit # dwindle -bind = $mainMod CTRL, Escape, exec, hyprlock # Lock screen - -# Move focus with mainMod + vim keys (h/j/k/l) -bind = $mainMod, H, movefocus, l -bind = $mainMod, L, movefocus, r -bind = $mainMod, K, movefocus, u -bind = $mainMod, J, movefocus, d - -# Move focus with mainMod + arrow keys (alternative) -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 - -# Move windows with vim keys (mainMod + SHIFT + h/j/k/l) -bind = $mainMod SHIFT, H, movewindow, l -bind = $mainMod SHIFT, L, movewindow, r -bind = $mainMod SHIFT, K, movewindow, u -bind = $mainMod SHIFT, J, movewindow, d - -# Resize windows with vim keys (mainMod + CTRL + h/j/k/l) -bind = $mainMod CTRL, H, resizeactive, -50 0 -bind = $mainMod CTRL, L, resizeactive, 50 0 -bind = $mainMod CTRL, K, resizeactive, 0 -50 -bind = $mainMod CTRL, J, resizeactive, 0 50 - -# Example special workspace (scratchpad) -bind = $mainMod, T, togglespecialworkspace, magic -bind = $mainMod SHIFT, T, movetoworkspace, special:magic - -# 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 - -# Laptop multimedia keys for volume and LCD brightness -# Volume control with OSD -bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')" -bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%- && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')" -bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')" -bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle && qs ipc call shell showOsdMic "$(wpctl get-volume @DEFAULT_AUDIO_SOURCE@ | grep -q MUTED && echo true || echo false)" - -# Brightness control with OSD -bindel = ,XF86MonBrightnessUp, exec, brightnessctl set 5%+ && qs ipc call shell showOsdBrightness "$(brightnessctl -m | cut -d, -f4 | tr -d '%' | awk '{print $1/100}')" -bindel = ,XF86MonBrightnessDown, exec, brightnessctl set 5%- && qs ipc call shell showOsdBrightness "$(brightnessctl -m | cut -d, -f4 | tr -d '%' | awk '{print $1/100}')" - -# Requires playerctl -bindl = , XF86AudioNext, exec, playerctl next -bindl = , XF86AudioPause, exec, playerctl play-pause -bindl = , XF86AudioPlay, exec, playerctl play-pause -bindl = , XF86AudioPrev, exec, playerctl previous - -# Screenshot with Gradia (Print Screen key) -bind = , Print, exec, flatpak run be.alexandervanhee.gradia --screenshot=INTERACTIVE - -# App Switcher (Super+Tab to switch between windows across all workspaces) -bind = $mainMod, Tab, exec, qs ipc call shell nextWindow -bind = $mainMod SHIFT, Tab, exec, qs ipc call shell prevWindow - -############################## -### WINDOWS AND WORKSPACES ### -############################## - -# See https://wiki.hypr.land/Configuring/Window-Rules/ for more -# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules - -# Example windowrule -# windowrule = float,class:^(kitty)$,title:^(kitty)$ - -# Ignore maximize requests from apps. You'll probably like this. -windowrule = suppress_event maximize, match:class .* - -# Fix some dragging issues with XWayland -windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland true, match:float true, match:fullscreen false, match:pin false - -# Quickshell launcher layer rules -layerrule = blur on, match:namespace quickshell -layerrule = ignore_alpha 0, match:namespace quickshell -layerrule = animation slide, match:namespace quickshell - -# App switcher layer rules -layerrule = animation fade, match:namespace appswitcher diff --git a/dot_files/hypr/hyprland.lua b/dot_files/hypr/hyprland.lua new file mode 100644 index 00000000..9c5234d5 --- /dev/null +++ b/dot_files/hypr/hyprland.lua @@ -0,0 +1,399 @@ +-- ####################################################################################### +-- HYPRLAND CONFIG - Tokyo Night Theme with Vim-like Keybindings +-- ####################################################################################### +-- +-- Tokyo Night Color Palette: +-- - Background: #1a1b26 +-- - Foreground: #c0caf5 +-- - Blue (accent): #7aa2f7 +-- - Purple (accent): #bb9af7 +-- - Cyan: #7dcfff +-- - Green: #9ece6a +-- - Red: #f7768e +-- - Border inactive: #414868 +-- +-- Keybindings: +-- - Vim-like navigation: SUPER + h/j/k/l (left/down/up/right) +-- - Move windows: SUPER + SHIFT + h/j/k/l +-- - Resize windows: SUPER + CTRL + h/j/k/l +-- - App launcher: SUPER + R (opens left sidebar with search) +-- - Quick settings: SUPER + N (opens right sidebar) +-- +-- ####################################################################################### + +-- Since Hyprland 0.55, hyprlang (.conf) is deprecated in favor of Lua. +-- Refer to the wiki for more information. +-- https://wiki.hypr.land/Configuring/ + + +------------------ +---- MONITORS ---- +------------------ + +-- See https://wiki.hypr.land/Configuring/Basics/Monitors/ +hl.monitor({ output = "", mode = "preferred", position = "auto", scale = "auto" }) + + +--------------------- +---- MY PROGRAMS ---- +--------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Variables/ + +-- Set programs that you use +local terminal = "ghostty" +local fileManager = "files" +local menu = "qs ipc call shell toggleSidebarLeft" + + +------------------- +---- AUTOSTART ---- +------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Autostart/ +hl.on("hyprland.start", function() + -- Export the Wayland session environment to the systemd user manager and the + -- D-Bus activation environment. Without this, D-Bus-activated services such as + -- xdg-desktop-portal fail to start when Hyprland is launched directly (i.e. not + -- via uwsm), breaking dark-mode detection, file pickers, and screen sharing. + -- Runs first so the services started below inherit a populated environment. + hl.exec_cmd("dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE HYPRLAND_INSTANCE_SIGNATURE") + + -- Quickshell - Launcher, Notifications, OSD + hl.exec_cmd("quickshell") + + -- Wallpaper + hl.exec_cmd("hyprpaper -c /usr/share/hypercube/config/hypr/hyprpaper.conf") + + -- Idle / Lock + hl.exec_cmd("hypridle -c /usr/share/hypercube/config/hypr/hypridle.conf") + + -- Hyprland Polkit Authentication Agent (for privilege escalation) + hl.exec_cmd("systemctl --user start hyprpolkitagent") + + -- GNOME Keyring (for secrets management, SSH keys, and certificates) + hl.exec_cmd("gnome-keyring-daemon --start") +end) + + +------------------------------- +---- ENVIRONMENT VARIABLES ---- +------------------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Environment-variables/ + +-- Desktop identity - lets xdg-desktop-portal select the Hyprland backend +-- (hyprland-portals.conf) and route the Settings/color-scheme interface. +hl.env("XDG_CURRENT_DESKTOP", "Hyprland") + +-- XDG directories - required for quickshell and other apps to find Hypercube configs +hl.env("XDG_CONFIG_DIRS", "/etc/xdg:/usr/share/hypercube/config") +hl.env("XDG_DATA_DIRS", "/usr/local/share:/usr/share:/usr/share/hypercube/data") + +hl.env("XCURSOR_SIZE", "24") +hl.env("HYPRCURSOR_SIZE", "24") + +-- SSH agent socket from GNOME Keyring +hl.env("SSH_AUTH_SOCK", os.getenv("XDG_RUNTIME_DIR") .. "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/keyring/ssh") + + +----------------------- +----- PERMISSIONS ----- +----------------------- + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Permissions/ +-- Please note permission changes here require a Hyprland restart and are not applied on-the-fly +-- for security reasons + +-- hl.config({ +-- ecosystem = { +-- enforce_permissions = true, +-- }, +-- }) + +-- hl.permission("/usr/(bin|local/bin)/grim", "screencopy", "allow") +-- hl.permission("/usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland", "screencopy", "allow") +-- hl.permission("/usr/(bin|local/bin)/hyprpm", "plugin", "allow") + + +----------------------- +---- LOOK AND FEEL ---- +----------------------- + +-- Refer to https://wiki.hypr.land/Configuring/Basics/Variables/ +-- Tokyo Night Theme Colors +hl.config({ + -- https://wiki.hypr.land/Configuring/Basics/Variables/#general + general = { + gaps_in = 5, + gaps_out = 5, + + border_size = 2, + + col = { + -- Tokyo Night colors - active border uses accent blue/purple gradient + active_border = { colors = { "rgba(7aa2f7ee)", "rgba(bb9af7ee)" }, angle = 45 }, + inactive_border = "rgba(414868aa)", + }, + + -- Set to true to enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false, + + -- Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on + allow_tearing = false, + + layout = "dwindle", + }, + + -- https://wiki.hypr.land/Configuring/Basics/Variables/#decoration + decoration = { + rounding = 0, + rounding_power = 2, + + -- Change transparency of focused and unfocused windows + active_opacity = 1.0, + inactive_opacity = 1.0, + + shadow = { + enabled = true, + range = 4, + render_power = 3, + color = "rgba(1a1b26ee)", -- Tokyo Night background + }, + + -- https://wiki.hypr.land/Configuring/Basics/Variables/#blur + blur = { + enabled = true, + size = 3, + passes = 1, + vibrancy = 0.1696, + }, + }, + + -- https://wiki.hypr.land/Configuring/Basics/Variables/#animations + animations = { + enabled = true, + }, +}) + +-- Default curves, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/#curves +hl.curve("easeOutQuint", { type = "bezier", points = { { 0.23, 1 }, { 0.32, 1 } } }) +hl.curve("easeInOutCubic", { type = "bezier", points = { { 0.65, 0.05 }, { 0.36, 1 } } }) +hl.curve("linear", { type = "bezier", points = { { 0, 0 }, { 1, 1 } } }) +hl.curve("almostLinear", { type = "bezier", points = { { 0.5, 0.5 }, { 0.75, 1 } } }) +hl.curve("quick", { type = "bezier", points = { { 0.15, 0 }, { 0.1, 1 } } }) + +-- Default animations, see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ +hl.animation({ leaf = "global", enabled = true, speed = 10, bezier = "default" }) +hl.animation({ leaf = "border", enabled = true, speed = 5.39, bezier = "easeOutQuint" }) +hl.animation({ leaf = "windows", enabled = true, speed = 4.79, bezier = "easeOutQuint" }) +hl.animation({ leaf = "windowsIn", enabled = true, speed = 4.1, bezier = "easeOutQuint", style = "popin 87%" }) +hl.animation({ leaf = "windowsOut", enabled = true, speed = 1.49, bezier = "linear", style = "popin 87%" }) +hl.animation({ leaf = "fadeIn", enabled = true, speed = 1.73, bezier = "almostLinear" }) +hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.46, bezier = "almostLinear" }) +hl.animation({ leaf = "fade", enabled = true, speed = 3.03, bezier = "quick" }) +hl.animation({ leaf = "layers", enabled = true, speed = 3.81, bezier = "easeOutQuint" }) +hl.animation({ leaf = "layersIn", enabled = true, speed = 4, bezier = "easeOutQuint", style = "fade" }) +hl.animation({ leaf = "layersOut", enabled = true, speed = 1.5, bezier = "linear", style = "fade" }) +hl.animation({ leaf = "fadeLayersIn", enabled = true, speed = 1.79, bezier = "almostLinear" }) +hl.animation({ leaf = "fadeLayersOut", enabled = true, speed = 1.39, bezier = "almostLinear" }) +hl.animation({ leaf = "workspaces", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "workspacesIn", enabled = true, speed = 1.21, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "workspacesOut", enabled = true, speed = 1.94, bezier = "almostLinear", style = "fade" }) +hl.animation({ leaf = "zoomFactor", enabled = true, speed = 7, bezier = "quick" }) + +-- Ref https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ +-- "Smart gaps" / "No gaps when only" +-- uncomment all if you wish to use that. +-- hl.workspace_rule({ workspace = "w[tv1]", gaps_out = 0, gaps_in = 0 }) +-- hl.workspace_rule({ workspace = "f[1]", gaps_out = 0, gaps_in = 0 }) +-- hl.window_rule({ match = { float = false, workspace = "w[tv1]" }, border_size = 0 }) +-- hl.window_rule({ match = { float = false, workspace = "w[tv1]" }, rounding = 0 }) +-- hl.window_rule({ match = { float = false, workspace = "f[1]" }, border_size = 0 }) +-- hl.window_rule({ match = { float = false, workspace = "f[1]" }, rounding = 0 }) + +-- See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ for more +hl.config({ + dwindle = { + preserve_split = true, -- You probably want this + }, +}) + +-- See https://wiki.hypr.land/Configuring/Layouts/Master-Layout/ for more +hl.config({ + master = { + new_status = "master", + }, +}) + +-- https://wiki.hypr.land/Configuring/Basics/Variables/#misc +hl.config({ + misc = { + force_default_wallpaper = 0, -- 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/Basics/Variables/#input +hl.config({ + input = { + kb_layout = "us", + kb_variant = "", + kb_model = "", + -- caps:ctrl_modifier - Caps Lock acts as Ctrl + kb_options = "caps:ctrl_modifier", + kb_rules = "", + + follow_mouse = 1, + + sensitivity = 0, -- -1.0 - 1.0, 0 means no modification. + + touchpad = { + natural_scroll = false, + }, + }, +}) + +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Gestures/ +hl.gesture({ fingers = 3, direction = "horizontal", action = "workspace" }) + +-- Example per-device config +-- See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Devices/ for more +hl.device({ + name = "epic-mouse-v1", + sensitivity = -0.5, +}) + + +--------------------- +---- KEYBINDINGS ---- +--------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Binds/ +local mainMod = "SUPER" -- Sets "Windows" key as main modifier + +hl.bind(mainMod .. " + Q", hl.dsp.exec_cmd(terminal)) +hl.bind(mainMod .. " + C", hl.dsp.window.close()) +hl.bind(mainMod .. " + E", hl.dsp.exec_cmd(fileManager)) +hl.bind(mainMod .. " + V", hl.dsp.window.float({ action = "toggle" })) +hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen({ mode = "fullscreen" })) -- Fullscreen +hl.bind(mainMod .. " + R", hl.dsp.exec_cmd(menu)) +-- hl.bind(mainMod .. " + A", hl.dsp.exec_cmd("qs ipc call shell toggleSidebarLeft")) -- Removed - use SUPER+R instead +hl.bind(mainMod .. " + N", hl.dsp.exec_cmd("qs ipc call shell toggleSidebarRight")) -- Notifications/quick settings +hl.bind(mainMod .. " + Escape", hl.dsp.exec_cmd("qs ipc call shell closeAll")) -- Close all panels +hl.bind(mainMod .. " + P", hl.dsp.window.pseudo()) -- dwindle +hl.bind(mainMod .. " + S", hl.dsp.layout("togglesplit")) -- dwindle +hl.bind(mainMod .. " + CTRL + Escape", hl.dsp.exec_cmd("hyprlock")) -- Lock screen + +-- Move focus with mainMod + vim keys (h/j/k/l) +hl.bind(mainMod .. " + H", hl.dsp.focus({ direction = "left" })) +hl.bind(mainMod .. " + L", hl.dsp.focus({ direction = "right" })) +hl.bind(mainMod .. " + K", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. " + J", hl.dsp.focus({ direction = "down" })) + +-- Move focus with mainMod + arrow keys (alternative) +hl.bind(mainMod .. " + left", hl.dsp.focus({ direction = "left" })) +hl.bind(mainMod .. " + right", hl.dsp.focus({ direction = "right" })) +hl.bind(mainMod .. " + up", hl.dsp.focus({ direction = "up" })) +hl.bind(mainMod .. " + down", hl.dsp.focus({ direction = "down" })) + +-- Switch workspaces with mainMod + [0-9] +-- Move active window to a workspace with mainMod + SHIFT + [0-9] +for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i })) + hl.bind(mainMod .. " + SHIFT + " .. key, hl.dsp.window.move({ workspace = i })) +end + +-- Move windows with vim keys (mainMod + SHIFT + h/j/k/l) +hl.bind(mainMod .. " + SHIFT + H", hl.dsp.window.move({ direction = "left" })) +hl.bind(mainMod .. " + SHIFT + L", hl.dsp.window.move({ direction = "right" })) +hl.bind(mainMod .. " + SHIFT + K", hl.dsp.window.move({ direction = "up" })) +hl.bind(mainMod .. " + SHIFT + J", hl.dsp.window.move({ direction = "down" })) + +-- Resize windows with vim keys (mainMod + CTRL + h/j/k/l) +hl.bind(mainMod .. " + CTRL + H", hl.dsp.window.resize({ x = -50, y = 0, relative = true })) +hl.bind(mainMod .. " + CTRL + L", hl.dsp.window.resize({ x = 50, y = 0, relative = true })) +hl.bind(mainMod .. " + CTRL + K", hl.dsp.window.resize({ x = 0, y = -50, relative = true })) +hl.bind(mainMod .. " + CTRL + J", hl.dsp.window.resize({ x = 0, y = 50, relative = true })) + +-- Example special workspace (scratchpad) +hl.bind(mainMod .. " + T", hl.dsp.workspace.toggle_special("magic")) +hl.bind(mainMod .. " + SHIFT + T", hl.dsp.window.move({ workspace = "special:magic" })) + +-- Scroll through existing workspaces with mainMod + scroll +hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" })) +hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" })) + +-- Move/resize windows with mainMod + LMB/RMB and dragging +hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true }) +hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true }) + +-- Laptop multimedia keys for volume and LCD brightness +-- Volume control with OSD +hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd([[wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')"]]), { locked = true, repeating = true }) +hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd([[wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%- && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')"]]), { locked = true, repeating = true }) +hl.bind("XF86AudioMute", hl.dsp.exec_cmd([[wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && qs ipc call shell showOsdVolume "$(wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{print $2}')"]]), { locked = true, repeating = true }) +hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd([[wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle && qs ipc call shell showOsdMic "$(wpctl get-volume @DEFAULT_AUDIO_SOURCE@ | grep -q MUTED && echo true || echo false)"]]), { locked = true, repeating = true }) + +-- Brightness control with OSD +hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd([[brightnessctl set 5%+ && qs ipc call shell showOsdBrightness "$(brightnessctl -m | cut -d, -f4 | tr -d '%' | awk '{print $1/100}')"]]), { locked = true, repeating = true }) +hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd([[brightnessctl set 5%- && qs ipc call shell showOsdBrightness "$(brightnessctl -m | cut -d, -f4 | tr -d '%' | awk '{print $1/100}')"]]), { locked = true, repeating = true }) + +-- Requires playerctl +hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true }) +hl.bind("XF86AudioPause", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) +hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true }) +hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true }) + +-- Screenshot with Gradia (Print Screen key) +hl.bind("Print", hl.dsp.exec_cmd("flatpak run be.alexandervanhee.gradia --screenshot=INTERACTIVE")) + +-- App Switcher (Super+Tab to switch between windows across all workspaces) +hl.bind(mainMod .. " + Tab", hl.dsp.exec_cmd("qs ipc call shell nextWindow")) +hl.bind(mainMod .. " + SHIFT + Tab", hl.dsp.exec_cmd("qs ipc call shell prevWindow")) + + +-------------------------------- +---- WINDOWS AND WORKSPACES ---- +-------------------------------- + +-- See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ for more +-- See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ for workspace rules + +-- Example windowrule +-- hl.window_rule({ match = { class = "^(kitty)$", title = "^(kitty)$" }, float = true }) + +-- Ignore maximize requests from apps. You'll probably like this. +hl.window_rule({ + name = "suppress-maximize-events", + match = { class = ".*" }, + suppress_event = "maximize", +}) + +-- Fix some dragging issues with XWayland +hl.window_rule({ + name = "fix-xwayland-drags", + match = { + class = "^$", + title = "^$", + xwayland = true, + float = true, + fullscreen = false, + pin = false, + }, + no_focus = true, +}) + +-- Quickshell launcher layer rules +hl.layer_rule({ match = { namespace = "quickshell" }, blur = true }) +hl.layer_rule({ match = { namespace = "quickshell" }, ignore_alpha = 0 }) +hl.layer_rule({ match = { namespace = "quickshell" }, animation = "slide" }) + +-- App switcher layer rules +hl.layer_rule({ match = { namespace = "appswitcher" }, animation = "fade" }) diff --git a/dot_files/quickshell/services/Power.qml b/dot_files/quickshell/services/Power.qml index 23136c75..a540c288 100644 --- a/dot_files/quickshell/services/Power.qml +++ b/dot_files/quickshell/services/Power.qml @@ -93,7 +93,7 @@ Singleton { Process { id: logoutProcess - command: ["sh", "-c", "hyprctl dispatch exit || loginctl terminate-session $XDG_SESSION_ID"] + command: ["sh", "-c", "hyprctl dispatch 'hl.dsp.exit()' || loginctl terminate-session $XDG_SESSION_ID"] } function lock() { diff --git a/dot_files/quickshell/services/Windows.qml b/dot_files/quickshell/services/Windows.qml index 360a86d3..4304c9f8 100644 --- a/dot_files/quickshell/services/Windows.qml +++ b/dot_files/quickshell/services/Windows.qml @@ -52,7 +52,7 @@ Singleton { Process { id: focusProcess - command: ["hyprctl", "dispatch", "focuswindow", "address:0x0"] + command: ["hyprctl", "dispatch", "hl.dsp.focus({ window = \"address:0x0\" })"] } function refresh() { @@ -82,7 +82,7 @@ Singleton { } const window = windows[currentIndex] - focusProcess.command = ["hyprctl", "dispatch", "focuswindow", "address:" + window.address] + focusProcess.command = ["hyprctl", "dispatch", "hl.dsp.focus({ window = \"address:" + window.address + "\" })"] focusProcess.running = true switcherActive = false } diff --git a/iso_files/hook-post-rootfs.sh b/iso_files/hook-post-rootfs.sh index fc1bbc06..900d3cd9 100644 --- a/iso_files/hook-post-rootfs.sh +++ b/iso_files/hook-post-rootfs.sh @@ -86,24 +86,27 @@ if [[ -d /usr/share/hypercube/config/hypr ]]; then cp /usr/share/hypercube/config/hypr/* /usr/share/hypr/config.live.d/ # Add live environment configuration - cat >> /usr/share/hypr/config.live.d/hyprland.conf << 'EOF' - -# Live ISO - Environment variables for XDG config discovery -# These are normally set by systemd user session but greetd skips that -env = XDG_CONFIG_DIRS,/etc/xdg:/usr/share/hypercube/config -env = XDG_DATA_DIRS,/usr/local/share:/usr/share:/usr/share/hypercube/data -env = GTK_THEME,Tokyonight-Dark -env = QT_QPA_PLATFORMTHEME,qt6ct - -# Live ISO - Window rules for Anaconda installer -# Prevent fullscreen, keep as tiled window so user can access terminal -windowrule = tile, class:^(anaconda)$ -windowrule = tile, class:^(liveinst)$ -windowrule = noinitialfocus, class:^(anaconda)$ -windowrule = noinitialfocus, class:^(liveinst)$ - -# Live ISO - Auto-launch installer -exec-once = liveinst + # Since Hyprland 0.55 the config is Lua, so append Lua to hyprland.lua. + cat >> /usr/share/hypr/config.live.d/hyprland.lua << 'EOF' + +-- Live ISO - Environment variables for XDG config discovery +-- These are normally set by systemd user session but greetd skips that +hl.env("XDG_CONFIG_DIRS", "/etc/xdg:/usr/share/hypercube/config") +hl.env("XDG_DATA_DIRS", "/usr/local/share:/usr/share:/usr/share/hypercube/data") +hl.env("GTK_THEME", "Tokyonight-Dark") +hl.env("QT_QPA_PLATFORMTHEME", "qt6ct") + +-- Live ISO - Window rules for Anaconda installer +-- Prevent fullscreen, keep as tiled window so user can access terminal +hl.window_rule({ match = { class = "^(anaconda)$" }, tile = true }) +hl.window_rule({ match = { class = "^(liveinst)$" }, tile = true }) +hl.window_rule({ match = { class = "^(anaconda)$" }, no_initial_focus = true }) +hl.window_rule({ match = { class = "^(liveinst)$" }, no_initial_focus = true }) + +-- Live ISO - Auto-launch installer +hl.on("hyprland.start", function() + hl.exec_cmd("liveinst") +end) EOF fi diff --git a/packages/aquamarine/aquamarine.spec b/packages/aquamarine/aquamarine.spec index d0786eca..0fa6c415 100644 --- a/packages/aquamarine/aquamarine.spec +++ b/packages/aquamarine/aquamarine.spec @@ -1,5 +1,5 @@ Name: aquamarine -Version: 0.14.0 +Version: 0.15.1 Release: 1%{?dist} Summary: A very light linux rendering backend library @@ -49,7 +49,7 @@ Development files for %{name}. %license LICENSE %doc README.md %{_libdir}/lib%{name}.so.%{version} -%{_libdir}/lib%{name}.so.13 +%{_libdir}/lib%{name}.so.14 %files devel %{_includedir}/%{name}/ @@ -57,6 +57,9 @@ Development files for %{name}. %{_libdir}/pkgconfig/%{name}.pc %changelog +* Fri Oct 23 2026 Hypercube - 0.15.1-1 +- Update to 0.15.1 +- libaquamarine SONAME 13 -> 14 * Tue Jul 28 2026 Hypercube - 0.14.0-1 - Update to 0.14.0 - Bump SONAME from 12 to 13 to match 0.14.0 diff --git a/packages/bluetui/bluetui.spec b/packages/bluetui/bluetui.spec index 6b4aa17f..21f0dbdd 100644 --- a/packages/bluetui/bluetui.spec +++ b/packages/bluetui/bluetui.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: bluetui -Version: 0.8.1 +Version: 0.8.2 Release: 1%{?dist} Summary: TUI for managing Bluetooth devices @@ -39,5 +39,7 @@ install -Dpm 0755 target/release/bluetui %{buildroot}%{_bindir}/bluetui %{_bindir}/bluetui %changelog +* Thu Oct 08 2026 Hypercube - 0.8.2-1 +- Update to 0.8.2 * Thu Jan 30 2026 Hypercube - 0.8.1-1 - Initial package for Hypercube diff --git a/packages/hyprland-guiutils/hyprland-guiutils.spec b/packages/hyprland-guiutils/hyprland-guiutils.spec index 469b680b..285f667a 100644 --- a/packages/hyprland-guiutils/hyprland-guiutils.spec +++ b/packages/hyprland-guiutils/hyprland-guiutils.spec @@ -1,6 +1,6 @@ Name: hyprland-guiutils Version: 0.2.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Hyprland GUI utilities (successor to hyprland-qtutils) License: BSD-3-Clause @@ -55,6 +55,8 @@ and welcome. %{_bindir}/hyprland-welcome %changelog +* Mon Oct 26 2026 Hypercube - 0.2.2-3 +- Rebuild against aquamarine 0.15.1 (SONAME 13 -> 14) and hyprtoolkit 0.6.0 (SONAME 5 -> 6) * Sun Aug 23 2026 Hypercube - 0.2.2-2 - Rebuild against hyprtoolkit 0.5.4-2 / hyprutils 0.14.1 / aquamarine 0.14.0 * Tue Jul 21 2026 Hypercube - 0.2.2-1 diff --git a/packages/hyprland-protocols/hyprland-protocols.spec b/packages/hyprland-protocols/hyprland-protocols.spec index 4aa901f8..5773b621 100644 --- a/packages/hyprland-protocols/hyprland-protocols.spec +++ b/packages/hyprland-protocols/hyprland-protocols.spec @@ -1,5 +1,5 @@ Name: hyprland-protocols -Version: 0.7.0 +Version: 0.8.0 Release: 1%{?dist} Summary: Wayland protocol extensions for Hyprland BuildArch: noarch @@ -8,7 +8,8 @@ License: BSD-3-Clause URL: https://github.com/hyprwm/hyprland-protocols Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: meson +BuildRequires: cmake +BuildRequires: gcc %description %{summary}. @@ -23,11 +24,11 @@ Summary: Wayland protocol extensions for Hyprland %autosetup -p1 %build -%meson -%meson_build +%cmake +%cmake_build %install -%meson_install +%cmake_install %files devel %license LICENSE @@ -36,5 +37,8 @@ Summary: Wayland protocol extensions for Hyprland %{_datadir}/%{name}/ %changelog +* Sat Oct 17 2026 Hypercube - 0.8.0-1 +- Update to 0.8.0 +- Upstream switched from meson to CMake * Mon Dec 16 2024 Hypercube - 0.7.0-1 - Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprland/hyprland.spec b/packages/hyprland/hyprland.spec index 39d52c28..d622fe79 100644 --- a/packages/hyprland/hyprland.spec +++ b/packages/hyprland/hyprland.spec @@ -1,5 +1,5 @@ Name: hyprland -Version: 0.56.1 +Version: 0.56.2 Release: 1%{?dist} Summary: Dynamic tiling Wayland compositor that doesn't sacrifice on its looks @@ -158,6 +158,8 @@ cp -p subprojects/udis86/LICENSE LICENSE-udis86 %{_includedir}/hyprland/ %changelog +* Fri Oct 23 2026 Hypercube - 0.56.2-1 +- Update to 0.56.2 * Tue Jul 28 2026 Hypercube - 0.56.1-1 - Update to 0.56.1 * Tue Jul 21 2026 Hypercube - 0.56.0-1 diff --git a/packages/hyprpaper/hyprpaper.spec b/packages/hyprpaper/hyprpaper.spec index c9f83c7e..294ca19e 100644 --- a/packages/hyprpaper/hyprpaper.spec +++ b/packages/hyprpaper/hyprpaper.spec @@ -1,6 +1,6 @@ Name: hyprpaper Version: 0.8.4 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Blazing fast wayland wallpaper utility with IPC controls License: BSD-3-Clause AND HPND-sell-variant @@ -56,6 +56,8 @@ wlroots-based compositors, though. %{_userunitdir}/%{name}.service %changelog +* Mon Oct 26 2026 Hypercube - 0.8.4-4 +- Rebuild against aquamarine 0.15.1 (SONAME 13 -> 14) and hyprtoolkit 0.6.0 (SONAME 5 -> 6) * Sun Aug 23 2026 Hypercube - 0.8.4-3 - Rebuild against hyprtoolkit 0.5.4-2 / hyprutils 0.14.1 / aquamarine 0.14.0 * Tue Jul 21 2026 Hypercube - 0.8.4-2 diff --git a/packages/hyprpolkitagent/hyprpolkitagent.spec b/packages/hyprpolkitagent/hyprpolkitagent.spec index 07667882..8a1f6874 100644 --- a/packages/hyprpolkitagent/hyprpolkitagent.spec +++ b/packages/hyprpolkitagent/hyprpolkitagent.spec @@ -1,34 +1,51 @@ +%global sdbus_version 2.1.0 + Name: hyprpolkitagent -Version: 0.1.3 +Version: 0.2.0 Release: 1%{?dist} Summary: A simple polkit authentication agent for Hyprland License: BSD-3-Clause URL: https://github.com/hyprwm/hyprpolkitagent -Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source1: https://github.com/Kistler-Group/sdbus-cpp/archive/v%{sdbus_version}/sdbus-%{sdbus_version}.tar.gz ExcludeArch: %{ix86} BuildRequires: cmake -BuildRequires: desktop-file-utils BuildRequires: gcc-c++ BuildRequires: systemd-rpm-macros -BuildRequires: cmake(Qt6Quick) -BuildRequires: cmake(Qt6QuickControls2) -BuildRequires: cmake(Qt6Widgets) +BuildRequires: pkgconfig(hyprgraphics) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprtoolkit) >= 0.6.0 BuildRequires: pkgconfig(hyprutils) -BuildRequires: pkgconfig(polkit-agent-1) -BuildRequires: pkgconfig(polkit-qt6-1) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(xkbcommon) + +Requires: polkit -Requires: hyprland-qt-support%{?_isa} +Provides: bundled(sdbus-cpp) = %{sdbus_version} %description -A simple polkit authentication agent for Hyprland, written in QT/QML. +A simple polkit authentication agent for Hyprland, written in C++ with +hyprtoolkit. %prep -%autosetup -p1 +%autosetup -p1 -a1 %build +pushd sdbus-cpp-%{sdbus_version} +%cmake \ + -DCMAKE_INSTALL_PREFIX=%{_builddir}/sdbus \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF +%cmake_build +cmake --install %{__cmake_builddir} +popd +export PKG_CONFIG_PATH=%{_builddir}/sdbus/%{_lib}/pkgconfig + %cmake %cmake_build @@ -41,6 +58,9 @@ A simple polkit authentication agent for Hyprland, written in QT/QML. %preun %systemd_user_preun %{name}.service +%postun +%systemd_user_postun %{name}.service + %files %license LICENSE %doc README.md @@ -49,5 +69,8 @@ A simple polkit authentication agent for Hyprland, written in QT/QML. %{_userunitdir}/%{name}.service %changelog +* Mon Oct 26 2026 Hypercube - 0.2.0-1 +- Update to 0.2.0 (rewritten on hyprtoolkit; drops Qt/hyprland-qt-support) +- Talks to polkit over D-Bus via a bundled static sdbus-cpp, like hypridle * Mon Dec 16 2024 Hypercube - 0.1.3-1 - Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprtoolkit/hyprtoolkit.spec b/packages/hyprtoolkit/hyprtoolkit.spec index 36dd2ee0..dee88e49 100644 --- a/packages/hyprtoolkit/hyprtoolkit.spec +++ b/packages/hyprtoolkit/hyprtoolkit.spec @@ -1,6 +1,6 @@ Name: hyprtoolkit -Version: 0.5.4 -Release: 2%{?dist} +Version: 0.6.0 +Release: 1%{?dist} Summary: A modern C++ Wayland-native GUI toolkit License: BSD-3-Clause @@ -12,13 +12,14 @@ ExcludeArch: %{ix86} BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: mesa-libGLES-devel +BuildRequires: pkgconfig(absl_flat_hash_map) BuildRequires: pkgconfig(aquamarine) BuildRequires: pkgconfig(cairo) BuildRequires: pkgconfig(egl) BuildRequires: pkgconfig(gbm) BuildRequires: pkgconfig(hyprgraphics) BuildRequires: pkgconfig(hyprlang) -BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprutils) >= 0.14.2 BuildRequires: pkgconfig(hyprwayland-scanner) BuildRequires: pkgconfig(iniparser) BuildRequires: pkgconfig(libdrm) @@ -52,7 +53,7 @@ Development files for %{name}. %files %license LICENSE %doc README.md -%{_libdir}/lib%{name}.so.5 +%{_libdir}/lib%{name}.so.6 %{_libdir}/lib%{name}.so.%{version} %files devel @@ -61,6 +62,9 @@ Development files for %{name}. %{_libdir}/pkgconfig/%{name}.pc %changelog +* Fri Oct 23 2026 Hypercube - 0.6.0-1 +- Update to 0.6.0 +- libhyprtoolkit SONAME 5 -> 6; new BuildRequires on abseil (absl_flat_hash_map) * Sun Aug 23 2026 Hypercube - 0.5.4-2 - Rebuild against hyprutils 0.14.1 (SONAME 12 -> 13) and aquamarine 0.14.0 * Mon May 11 2026 Hypercube - 0.5.4-1 diff --git a/packages/hyprutils/hyprutils.spec b/packages/hyprutils/hyprutils.spec index 510ec121..6b04d57b 100644 --- a/packages/hyprutils/hyprutils.spec +++ b/packages/hyprutils/hyprutils.spec @@ -1,5 +1,5 @@ Name: hyprutils -Version: 0.14.0 +Version: 0.14.3 Release: 1%{?dist} Summary: Hyprland utilities library used across the ecosystem @@ -48,6 +48,8 @@ Development files for %{name}. %{_libdir}/pkgconfig/%{name}.pc %changelog +* Fri Oct 23 2026 Hypercube - 0.14.3-1 +- Update to 0.14.3 * Tue Jul 21 2026 Hypercube - 0.14.0-1 - Update to 0.14.0 - Bump SONAME from 12 to 13 to match 0.14.0 diff --git a/packages/iamb/iamb.spec b/packages/iamb/iamb.spec index 20b0dfe2..2026d923 100644 --- a/packages/iamb/iamb.spec +++ b/packages/iamb/iamb.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: iamb -Version: 0.0.11 +Version: 0.13.1 Release: 1%{?dist} Summary: Matrix chat client with Vim-like keybindings @@ -12,8 +12,8 @@ License: Apache-2.0 URL: https://github.com/ulyssa/iamb Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: cargo >= 1.83 -BuildRequires: rust >= 1.83 +BuildRequires: cargo >= 1.96 +BuildRequires: rust >= 1.96 BuildRequires: gcc %description @@ -41,5 +41,7 @@ install -Dpm 0755 target/release/iamb %{buildroot}%{_bindir}/iamb %{_bindir}/iamb %changelog +* Thu Oct 22 2026 Hypercube - 0.13.1-1 +- Update to 0.13.1 * Fri Jan 30 2026 Hypercube - 0.0.11-1 - Initial package for Hypercube diff --git a/packages/lazygit/lazygit.spec b/packages/lazygit/lazygit.spec index 92771769..6e0434bb 100644 --- a/packages/lazygit/lazygit.spec +++ b/packages/lazygit/lazygit.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: lazygit -Version: 0.63.1 +Version: 0.66.2 Release: 1%{?dist} Summary: Simple terminal UI for git commands @@ -35,6 +35,8 @@ install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name} %{_bindir}/%{name} %changelog +* Sat Oct 17 2026 Hypercube - 0.66.2-1 +- Update to 0.66.2 * Thu Jul 16 2026 Hypercube - 0.63.1-1 - Update to 0.63.1 * Sun Jul 05 2026 Hypercube - 0.63.0-1 diff --git a/packages/lazysql/lazysql.spec b/packages/lazysql/lazysql.spec index b002494f..f36fa2bb 100644 --- a/packages/lazysql/lazysql.spec +++ b/packages/lazysql/lazysql.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: lazysql -Version: 0.5.5 +Version: 0.7.0 Release: 1%{?dist} Summary: TUI database management client @@ -37,6 +37,8 @@ install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name} %{_bindir}/%{name} %changelog +* Tue Oct 13 2026 Hypercube - 0.7.0-1 +- Update to 0.7.0 * Tue Jun 30 2026 Hypercube - 0.5.5-1 - Update to 0.5.5 * Tue Jun 09 2026 Hypercube - 0.5.4-1 diff --git a/packages/lua55/lua-5.5.0-bug1.patch b/packages/lua55/lua-5.5.0-bug1.patch deleted file mode 100644 index ed7b7c1b..00000000 --- a/packages/lua55/lua-5.5.0-bug1.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up lua-5.5.0/src/lapi.c.bug1 lua-5.5.0/src/lapi.c ---- lua-5.5.0/src/lapi.c.bug1 2026-01-06 10:46:04.363172258 -0500 -+++ lua-5.5.0/src/lapi.c 2026-01-06 10:47:24.415699829 -0500 -@@ -1205,6 +1205,8 @@ LUA_API int lua_gc (lua_State *L, int wh - g->gcstp = 0; /* allow GC to run (other bits must be zero here) */ - if (n <= 0) - n = g->GCdebt; /* force to run one basic step */ -+ else if (g->GCdebt < n - MAX_LMEM) /* overflow? */ -+ n = MAX_LMEM + g->GCdebt; /* trim 'n' (debt must be negative) */ - luaE_setdebt(g, g->GCdebt - n); - luaC_condGC(L, (void)0, work = 1); - if (work && g->gcstate == GCSpause) /* end of cycle? */ diff --git a/packages/lua55/lua-5.5.0-bug2.patch b/packages/lua55/lua-5.5.0-bug2.patch deleted file mode 100644 index 38485945..00000000 --- a/packages/lua55/lua-5.5.0-bug2.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up lua-5.5.0/src/lstrlib.c.bug2 lua-5.5.0/src/lstrlib.c ---- lua-5.5.0/src/lstrlib.c.bug2 2026-01-14 16:33:13.073440361 -0500 -+++ lua-5.5.0/src/lstrlib.c 2026-01-14 16:33:41.019926479 -0500 -@@ -1726,7 +1726,7 @@ static int str_packsize (lua_State *L) { - luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, - "variable-length format"); - size += ntoalign; /* total space used by option */ -- luaL_argcheck(L, totalsize <= LUA_MAXINTEGER - size, -+ luaL_argcheck(L, totalsize <= MAX_SIZE - size, - 1, "format result too large"); - totalsize += size; - } diff --git a/packages/lua55/lua55.spec b/packages/lua55/lua55.spec index 46e217f8..02c26929 100644 --- a/packages/lua55/lua55.spec +++ b/packages/lua55/lua55.spec @@ -13,7 +13,7 @@ Name: lua55 -Version: %{major_version}.0 +Version: 5.5.1 Release: 1%{?dist} Summary: Powerful light-weight programming language (version %{major_version}) License: MIT @@ -40,9 +40,6 @@ Patch7: lua-5.4.8-bug1.patch Patch8: lua-5.4.8-bug2.patch Patch9: lua-5.4.8-bug3.patch %endif -# https://www.lua.org/bugs.html -Patch10: lua-5.5.0-bug1.patch -Patch11: lua-5.5.0-bug2.patch BuildRequires: automake autoconf libtool readline-devel ncurses-devel BuildRequires: make @@ -105,10 +102,6 @@ mv src/luaconf.h src/luaconf.h.template.in #%% patch -P2 -p1 -z .luac-shared %patch -P3 -p1 -z .configure-linux -# Bug patches here -%patch -P10 -p1 -b .bug1 -%patch -P11 -p1 -b .bug2 - # Put proper version in configure.ac, patch0 hardcodes 5.5.0 sed -i 's|5.5.0|%{version}|g' configure.ac autoreconf -ifv @@ -253,6 +246,9 @@ LD_LIBRARY_PATH=$RPM_BUILD_ROOT/%{_libdir} $RPM_BUILD_ROOT/%{_bindir}/lua%{major %{_libdir}/liblua-%{major_version}.a %changelog +* Thu Sep 10 2026 Hypercube - 5.5.1-1 +- Update to 5.5.1 +- Drop lua-5.5.0-bug1/bug2 patches (fixed upstream in 5.5.1) * Fri Jun 06 2026 Hypercube - 5.5.0-1 - Rename to lua55 for parallel installation alongside system lua 5.4 - Version all installed paths: headers, pkg-config, binaries, man pages diff --git a/packages/quickshell/quickshell.spec b/packages/quickshell/quickshell.spec index f14c9126..4843b9b7 100644 --- a/packages/quickshell/quickshell.spec +++ b/packages/quickshell/quickshell.spec @@ -1,6 +1,6 @@ Name: quickshell -Version: 0.3.0 -Release: 2%{?dist} +Version: 0.3.2 +Release: 1%{?dist} Summary: Flexible QtQuick based desktop shell toolkit License: LGPL-3.0-or-later @@ -78,6 +78,8 @@ managers. It supports Hyprland, Sway, and other Wayland compositors. %{_datadir}/icons/hicolor/scalable/apps/org.quickshell.svg %changelog +* Fri Oct 09 2026 Hypercube - 0.3.2-1 +- Update to 0.3.2 * Sat Jun 06 2026 Hypercube - 0.3.0-2 - Rename CRASH_REPORTER cmake option to CRASH_HANDLER for 0.3.0 * Wed May 06 2026 Hypercube - 0.3.0-1 diff --git a/packages/resterm/resterm.spec b/packages/resterm/resterm.spec index e6680e04..1dd30993 100644 --- a/packages/resterm/resterm.spec +++ b/packages/resterm/resterm.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: resterm -Version: 0.49.3 +Version: 1.16.1 Release: 1%{?dist} Summary: TUI REST, gRPC, and WebSocket API client @@ -35,6 +35,8 @@ install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name} %{_bindir}/%{name} %changelog +* Fri Oct 23 2026 Hypercube - 1.16.1-1 +- Update to 1.16.1 * Sat Aug 01 2026 Hypercube - 0.49.3-1 - Update to 0.49.3 * Tue Jul 21 2026 Hypercube - 0.47.3-1 diff --git a/packages/resvg/resvg.spec b/packages/resvg/resvg.spec index 11713505..dd861fb3 100644 --- a/packages/resvg/resvg.spec +++ b/packages/resvg/resvg.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: resvg -Version: 0.47.0 +Version: 0.49.0 Release: 1%{?dist} Summary: SVG rendering library and CLI tool @@ -35,6 +35,8 @@ install -Dpm 0755 target/release/resvg %{buildroot}%{_bindir}/resvg %{_bindir}/resvg %changelog +* Sun Oct 25 2026 Hypercube - 0.49.0-1 +- Update to 0.49.0 * Wed Feb 11 2026 Hypercube - 0.47.0-1 - Update to 0.47.0 * Thu Jan 30 2026 Hypercube - 0.46.0-1 diff --git a/packages/starship/starship.spec b/packages/starship/starship.spec index 358b5a08..8871521f 100644 --- a/packages/starship/starship.spec +++ b/packages/starship/starship.spec @@ -1,7 +1,7 @@ %global debug_package %{nil} Name: starship -Version: 1.26.0 +Version: 1.27.0 Release: 1%{?dist} Summary: Minimal, blazing-fast, and infinitely customizable prompt for any shell @@ -9,8 +9,8 @@ License: ISC URL: https://github.com/starship/starship Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: cargo >= 1.80 -BuildRequires: rust >= 1.80 +BuildRequires: cargo >= 1.95 +BuildRequires: rust >= 1.95 BuildRequires: gcc BuildRequires: cmake BuildRequires: pkgconfig(openssl) @@ -54,6 +54,8 @@ rm -f %{buildroot}%{_prefix}/.crates2.json %{_datadir}/fish/vendor_completions.d/%{name}.fish %changelog +* Sun Oct 18 2026 Hypercube - 1.27.0-1 +- Update to 1.27.0 * Mon Jun 29 2026 Hypercube - 1.26.0-1 - Update to 1.26.0 * Fri May 01 2026 Hypercube - 1.25.1-1 diff --git a/packages/uwsm/uwsm.spec b/packages/uwsm/uwsm.spec index 3812593f..5da32748 100644 --- a/packages/uwsm/uwsm.spec +++ b/packages/uwsm/uwsm.spec @@ -1,5 +1,5 @@ Name: uwsm -Version: 0.26.6 +Version: 0.27.1 Release: 1%{?dist} Summary: Universal Wayland Session Manager @@ -81,6 +81,8 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop %{_userunitdir}/wayland-*.target %changelog +* Fri Oct 16 2026 Hypercube - 0.27.1-1 +- Update to 0.27.1 * Mon Jun 29 2026 Hypercube - 0.26.6-1 - Update to 0.26.6 * Sun Jun 14 2026 Hypercube - 0.26.5-1 diff --git a/packages/yazi/yazi.spec b/packages/yazi/yazi.spec index 59dacdb2..38adfd2c 100644 --- a/packages/yazi/yazi.spec +++ b/packages/yazi/yazi.spec @@ -4,7 +4,7 @@ %global debug_package %{nil} Name: yazi -Version: 26.5.6 +Version: 26.9.1 Release: 1%{?dist} Summary: Blazing fast terminal file manager written in Rust @@ -12,8 +12,8 @@ License: MIT URL: https://github.com/sxyazi/yazi Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: cargo >= 1.80 -BuildRequires: rust >= 1.80 +BuildRequires: cargo >= 1.95 +BuildRequires: rust >= 1.95 BuildRequires: gcc BuildRequires: make BuildRequires: git @@ -73,6 +73,8 @@ rm -f %{buildroot}%{_prefix}/.crates2.json %{_datadir}/zsh/site-functions/_ya %changelog +* Wed Sep 02 2026 Hypercube - 26.9.1-1 +- Update to 26.9.1 * Wed May 06 2026 Hypercube - 26.5.6-1 - Update to 26.5.6 * Thu Jan 30 2026 Hypercube - 26.1.22-1 diff --git a/packages/zellij/zellij.spec b/packages/zellij/zellij.spec index 63f30899..dc58820f 100644 --- a/packages/zellij/zellij.spec +++ b/packages/zellij/zellij.spec @@ -4,8 +4,8 @@ %global debug_package %{nil} Name: zellij -Version: 0.44.3 -Release: 2%{?dist} +Version: 0.45.1 +Release: 1%{?dist} Summary: A terminal workspace and multiplexer License: MIT @@ -83,6 +83,8 @@ mkdir -p %{buildroot}%{_datadir}/fish/vendor_completions.d %{_datadir}/fish/vendor_completions.d/%{name}.fish %changelog +* Sat Aug 29 2026 Hypercube - 0.45.1-1 +- Update to 0.45.1 * Sun Jun 28 2026 Hypercube - 0.44.3-2 - Set OPENSSL_NO_VENDOR=1 so openssl-sys links the chroot's system OpenSSL instead of vendoring its own copy, which failed to configure (missing diff --git a/scripts/packages/config.sh b/scripts/packages/config.sh index 01af56e2..56eaf32f 100755 --- a/scripts/packages/config.sh +++ b/scripts/packages/config.sh @@ -52,6 +52,13 @@ declare -gA VERSION_SOURCES=( [lua55]="tag" ) +# Version pins: only consider upstream versions starting with this prefix. +# Use when a dependent can't build against a newer major series yet. +declare -gA VERSION_PINS=( + # Hyprland 0.56 does find_package(glaze 7...<8); glaze 8+ breaks the build + [glaze]="7." +) + # Package dependencies (for determining build order) declare -gA PACKAGE_DEPS=( # Base packages with no dependencies @@ -90,7 +97,7 @@ declare -gA PACKAGE_DEPS=( [hypridle]="hyprland-protocols hyprlang hyprutils hyprwayland-scanner" [hyprpaper]="hyprgraphics hyprlang hyprutils hyprwayland-scanner hyprwire hyprtoolkit" [xdg-desktop-portal-hyprland]="hyprland-protocols hyprlang hyprutils hyprwayland-scanner" - [hyprpolkitagent]="hyprutils hyprland-qt-support" + [hyprpolkitagent]="hyprgraphics hyprlang hyprutils hyprtoolkit" [hyprtoolkit]="aquamarine hyprgraphics hyprlang hyprutils hyprwayland-scanner" [hyprland-guiutils]="aquamarine hyprtoolkit hyprlang hyprutils" ) @@ -100,12 +107,13 @@ declare -gA BUILD_BATCHES=( [1]="hyprutils hyprwayland-scanner hyprland-protocols hyprwire glaze uwsm eza starship lazygit quickshell livesys-scripts wifitui resvg yazi bluetui iamb meli lazyjournal lazysql resterm zellij alacritty lua55" [2]="hyprlang hyprgraphics aquamarine" [3]="hyprcursor hyprland-qt-support" - [4]="hyprland hyprlock hypridle xdg-desktop-portal-hyprland hyprpolkitagent hyprtoolkit" - [5]="hyprpaper hyprland-guiutils" + [4]="hyprland hyprlock hypridle xdg-desktop-portal-hyprland hyprtoolkit" + [5]="hyprpaper hyprland-guiutils hyprpolkitagent" ) # Export for use in other scripts export PACKAGE_REPOS export VERSION_SOURCES +export VERSION_PINS export PACKAGE_DEPS export BUILD_BATCHES diff --git a/scripts/packages/get-upstream-version.sh b/scripts/packages/get-upstream-version.sh index 9020b9a5..147f63c0 100755 --- a/scripts/packages/get-upstream-version.sh +++ b/scripts/packages/get-upstream-version.sh @@ -33,9 +33,20 @@ fi REPO="${PACKAGE_REPOS[$PACKAGE]}" VERSION_SOURCE="${VERSION_SOURCES[$PACKAGE]:-release}" +VERSION_PIN="${VERSION_PINS[$PACKAGE]:-}" + # Get upstream version from GitHub # Try gh first (if authenticated), fall back to curl -if command -v gh &> /dev/null && gh auth status &> /dev/null; then +if [[ -n "$VERSION_PIN" ]]; then + # Pinned: newest tag within the pinned series + PIN_RE="^v?${VERSION_PIN//./\\.}" + if command -v gh &> /dev/null && gh auth status &> /dev/null; then + TAGS=$(gh api "repos/$REPO/tags?per_page=100" --jq '.[].name' 2>/dev/null || echo "") + else + TAGS=$(curl -sf "https://api.github.com/repos/$REPO/tags?per_page=100" 2>/dev/null | jq -r '.[].name' 2>/dev/null || echo "") + fi + UPSTREAM=$(echo "$TAGS" | grep -E "$PIN_RE" | grep -E '^v?[0-9]+(\.[0-9]+)*$' | sed 's/^v//' | sort -V | tail -1 || true) +elif command -v gh &> /dev/null && gh auth status &> /dev/null; then # Use gh CLI (faster and more reliable if authenticated) if [[ "$VERSION_SOURCE" == "tag" ]]; then UPSTREAM=$(gh api "repos/$REPO/tags" --jq '.[0].name' 2>/dev/null || echo "") diff --git a/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode b/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode index 23216692..8ec47cf3 100644 --- a/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode +++ b/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode @@ -7,4 +7,4 @@ gtk-theme='Tokyonight-Dark' icon-theme='Tokyonight-Dark' cursor-theme='Adwaita' -# Note: XKB options are now configured in Hyprland (hyprland.conf) +# Note: XKB options are now configured in Hyprland (hyprland.lua) diff --git a/system_files/shared/usr/share/hypercube/migrations/003-hyprland-lua-user-config.sh b/system_files/shared/usr/share/hypercube/migrations/003-hyprland-lua-user-config.sh new file mode 100755 index 00000000..b6fed56a --- /dev/null +++ b/system_files/shared/usr/share/hypercube/migrations/003-hyprland-lua-user-config.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# Migration: Move users' Hyprland stub config from hyprlang to Lua +# +# Hyprland 0.55+ prefers hyprland.lua anywhere on the config search path over +# hyprland.conf, and the system default is now hyprland.lua. Existing users +# still have the old ~/.config/hypr/hyprland.conf stub, which sources a file +# that no longer exists and is ignored in favour of the system hyprland.lua. +# +# For each user with a hyprland.conf but no hyprland.lua, write the new Lua +# stub. Any customizations they added to the old stub are carried over as +# comments so they can be ported by hand. hyprland.conf is left in place. + +set -euo pipefail + +SYSTEM_CONFIG="/usr/share/hypercube/config/hypr/hyprland.lua" + +[[ -f "$SYSTEM_CONFIG" ]] || exit 0 + +while IFS=: read -r user _ uid gid _ home _; do + [[ "$uid" -ge 1000 && "$uid" -lt 60000 ]] || continue + + hypr_dir="$home/.config/hypr" + old="$hypr_dir/hyprland.conf" + new="$hypr_dir/hyprland.lua" + + # Don't follow symlinks into places we shouldn't write (e.g. dotfile repos) + [[ -f "$old" && ! -L "$old" && ! -L "$hypr_dir" ]] || continue + [[ -e "$new" || -L "$new" ]] && continue + + echo "Migrating Hyprland config for $user to Lua..." + + # Everything the user wrote besides the stock stub lines + custom=$(grep -vE '^\s*(#|$)|^\s*source\s*=\s*/usr/share/hypercube/config/hypr/hyprland\.conf\s*$' "$old" || true) + + tmp=$(mktemp) + cat >"$tmp" <>"$tmp" + fi + + install -m 0644 -o "$uid" -g "$gid" "$tmp" "$new" + rm -f "$tmp" + + luarc="/usr/share/hypercube/config/hypr/.luarc.json" + if [[ -f "$luarc" && ! -e "$hypr_dir/.luarc.json" ]]; then + install -m 0644 -o "$uid" -g "$gid" "$luarc" "$hypr_dir/.luarc.json" + fi +done < <(getent passwd) + +echo "Hyprland user config migration complete"