diff --git a/flake.nix b/flake.nix
index b764fbf..5c5c8f8 100644
--- a/flake.nix
+++ b/flake.nix
@@ -80,7 +80,7 @@
})
(builtins.attrNames (builtins.readDir ./modules)));
- nixosConfigurations = builtins.mapAttrs (name: value: (lib.mkMachine { host = name; host-config = value; modules = self.nixosModules; nixpkgs = inputs.${lib.luj.machines.${name}.nixpkgs_version}; system = lib.luj.machines.${name}.arch; })) (lib.importConfig ./machines);
+ nixosConfigurations = builtins.mapAttrs (name: value: (lib.mkMachine { host = name; host-config = value; modules = self.nixosModules; nixpkgs = inputs.nixos-apple-silicon.inputs.nixpkgs; system = lib.luj.machines.${name}.arch; })) (lib.importConfig ./machines);
deploy.nodes.lambda = {
hostname = "lambda.julienmalka.me";
diff --git a/home-manager-modules/hyprland/default.nix b/home-manager-modules/hyprland/default.nix
new file mode 100644
index 0000000..35b930c
--- /dev/null
+++ b/home-manager-modules/hyprland/default.nix
@@ -0,0 +1,232 @@
+{ config, pkgs, lib, inputs, ... }:
+let
+ cfg = config.luj.programs.hyprland;
+ terminal = "${pkgs.kitty}/bin/kitty";
+ menu = "${pkgs.rofi-wayland}/bin/rofi -no-lazy-grab -show";
+in
+with lib;
+{
+ options.luj.programs.hyprland = {
+ enable = mkEnableOption "Enable HyprLand";
+ };
+
+ config = mkIf cfg.enable
+ {
+ wayland.windowManager.hyprland = {
+ enable = true;
+ package = pkgs.hyprland;
+
+ };
+ xdg.configFile."hypr/hyprland.conf".text = ''
+ exec-once=${pkgs.dbus}/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP && systemctl --user start hyprland-session.target
+ exec-once = waybar
+ # Monitors
+ monitor = eDP-1, preferred, auto, auto
+
+ # Input
+ input {
+ kb_layout = fr
+ kb_variant = mac
+ follow_mouse = 1
+ touchpad {
+ disable_while_typing = false
+ natural_scroll = true
+ tap-to-click = true
+ }
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+ }
+
+ # General
+ general {
+ gaps_in = 7.5
+ gaps_out = 15
+ border_size = 2
+ col.active_border = rgb(11111b)
+ col.inactive_border = rgb(11111b)
+ cursor_inactive_timeout = 1
+ layout = master
+ }
+
+ # Misc
+ misc {
+ disable_hyprland_logo = true
+ disable_splash_rendering = true
+ }
+
+ # Decorations
+ decoration {
+ # Opacity
+ active_opacity = 1.0
+ inactive_opacity = 1.0
+
+ # Blur
+ blur = false
+ blur_size = 10
+ blur_passes = 4
+ blur_new_optimizations = true
+
+ # Shadow
+ drop_shadow = true
+ shadow_ignore_window = true
+ shadow_offset = 2 2
+ shadow_range = 4
+ shadow_render_power = 2
+ col.shadow = 0x66000000
+ }
+
+ # Blurring layerSurfaces
+ blurls = gtk-layer-shell
+ blurls = lockscreen
+
+ # Animations
+ animations {
+ enabled = true
+
+ # bezier curve
+ bezier = overshot, 0.05, 0.9, 0.1, 1.05
+ bezier = smoothOut, 0.36, 0, 0.66, -0.56
+ bezier = smoothIn, 0.25, 1, 0.5, 1
+
+ # animation list
+ animation = windows, 1, 5, overshot, slide
+ animation = windowsOut, 1, 4, smoothOut, slide
+ animation = windowsMove, 1, 4, default
+ animation = border, 1, 10, default
+ animation = fade, 1, 10, smoothIn
+ animation = fadeDim, 1, 10, smoothIn
+ animation = workspaces, 1, 6, overshot, slidevert
+ }
+
+ # Gestures
+ gestures {
+ workspace_swipe = true
+ workspace_swipe_fingers = 3
+ }
+
+ # Layouts
+ dwindle {
+ no_gaps_when_only = true
+ pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = true # you probably want this
+ }
+
+ # Window rules
+ windowrule = float, file_progress
+ windowrule = float, confirm
+ windowrule = float, dialog
+ windowrule = float, download
+ windowrule = float, notification
+ windowrule = float, error
+ windowrule = float, splash
+ windowrule = float, confirmreset
+ windowrule = float, title:Open File
+ windowrule = float, title:branchdialog
+ windowrule = float, zoom
+ windowrule = float, vlc
+ windowrule = float, Lxappearance
+ windowrule = float, ncmpcpp
+ windowrule = float, Rofi
+ windowrule = animation none, Rofi
+ windowrule = float, viewnior
+ windowrule = float, pavucontrol-qt
+ windowrule = float, gucharmap
+ windowrule = float, gnome-font
+ windowrule = float, org.gnome.Settings
+ windowrule = float, file-roller
+ windowrule = float, nautilus
+ windowrule = float, nemo
+ windowrule = float, thunar
+ windowrule = float, wdisplays
+ windowrule = fullscreen, wlogout
+ windowrule = float, title:wlogout
+ windowrule = fullscreen, title:wlogout
+ windowrule = float, pavucontrol-qt
+ windowrule = float, keepassxc
+ windowrule = idleinhibit focus, mpv
+ windowrule = idleinhibit fullscreen, firefox
+ windowrule = float, title:^(Media viewer)$
+ windowrule = float, title:^(Transmission)$
+ windowrule = float, title:^(Volume Control)$
+ windowrule = float, title:^(Picture-in-Picture)$
+ windowrule = float, title:^(Firefox — Sharing Indicator)$
+ windowrule = move 0 0, title:^(Firefox — Sharing Indicator)$
+ windowrule = size 800 600, title:^(Volume Control)$
+ windowrule = move 75 44%, title:^(Volume Control)$
+
+ # Variables
+ $term = ${terminal}
+ $browser = firefox
+ $editor = nvim
+ $files = nemo
+ $launcher = ${menu}
+
+ # Apps
+ bind = SUPER, RETURN, exec, $term
+ bind = SUPER SHIFT, E, exec, $editor
+ bind = SUPER SHIFT, F, exec, $files
+ bind = SUPER SHIFT, B, exec, $browser
+ bind = SUPER, SPACE, exec, $launcher
+ bind = SUPER, E, exec, $emoji
+ bind = SUPER, X, exec, power-menu
+
+ # Function keys
+ bind = ,XF86MonBrightnessUp, exec, brightnessctl s +10
+ bind = ,XF86MonBrightnessDown, exec, brightnessctl s 10-
+
+ # Screenshots
+ bind = , Print, exec, $screenshotarea
+ bind = CTRL, Print, exec, grimblast --notify --cursor copysave output
+ bind = SUPER SHIFT CTRL, R, exec, grimblast --notify --cursor copysave output
+ bind = ALT, Print, exec, grimblast --notify --cursor copysave screen
+ bind = SUPER SHIFT ALT, R, exec, grimblast --notify --cursor copysave screen
+
+ # Misc
+ bind = CTRL ALT, L, exec, swaylock
+
+ # Window management
+ bind = SUPER, Q, killactive,
+ bind = SUPER, M, exit,
+ bind = SUPER, F, fullscreen,
+ bind = SUPER, Space, togglefloating,
+ bind = SUPER, P, pseudo, # dwindle
+ bind = SUPER, J, togglesplit, # dwindle
+
+ # Focus
+ bind = SUPER, left, movefocus, l
+ bind = SUPER, right, movefocus, r
+ bind = SUPER, up, movefocus, u
+ bind = SUPER, down, movefocus, d
+
+ # Move
+ bind = SUPER SHIFT, left, movewindow, l
+ bind = SUPER SHIFT, right, movewindow, r
+ bind = SUPER SHIFT, up, movewindow, u
+ bind = SUPER SHIFT, down, movewindow, d
+
+ # Resize
+ bind = SUPER CTRL, left, resizeactive, -20 0
+ bind = SUPER CTRL, right, resizeactive, 20 0
+ bind = SUPER CTRL, up, resizeactive, 0 -20
+ bind = SUPER CTRL, down, resizeactive, 0 20
+
+ # Tabbed
+ bind= SUPER, g, togglegroup
+ bind= SUPER, tab, changegroupactive
+
+ # Special workspace
+ bind = SUPER, grave, togglespecialworkspace
+ bind = SUPERSHIFT, grave, movetoworkspace, special
+
+ # Switch workspaces
+ bind = SUPER, ampersand, workspace, 1
+ bind = SUPER, eacute, workspace, 2
+ bind = SUPER, quotedbl, workspace,
+ bindm = SUPER, mouse:272, movewindow
+ bindm = SUPER, mouse:273, resizewindow
+ bind = SUPER, mouse_down, workspace, e+1
+ bind = SUPER, mouse_up, workspace, e-1
+ '';
+
+ };
+}
+
diff --git a/home-manager-modules/waybar/default.nix b/home-manager-modules/waybar/default.nix
new file mode 100644
index 0000000..970efe1
--- /dev/null
+++ b/home-manager-modules/waybar/default.nix
@@ -0,0 +1,153 @@
+{ config, pkgs, lib, ... }:
+let
+ cfg = config.luj.programs.waybar;
+in
+with lib;
+{
+ options.luj.programs.waybar = {
+ enable = mkEnableOption "Enable waybar";
+ };
+
+ config = mkIf cfg.enable {
+ programs.waybar = {
+ enable = true;
+ settings = {
+ mainBar = {
+ layer = "top";
+ modules-left = [ "custom/arch" "wlr/workspaces" ];
+ modules-center = [ "clock" ];
+ modules-right = [ "backlight" "pulseaudio" "network" "battery" ];
+ "custom/arch" = {
+ format = " ❄ ";
+ tooltip = false;
+ on-click = "sh $HOME/.config/rofi/bin/powermenu";
+ };
+ "wlr/workspaces" = {
+ format = "{name}";
+ tooltip = false;
+ all-outputs = true;
+ };
+ "clock" = { };
+ "backlight" = {
+ device = "intel_backlight";
+ format = "{icon} {percent}%";
+ format-icons = [ "" "" "" "" "" "" "" "" "" ];
+ };
+ "pulseaudio" = {
+ format = "{icon} {volume}%";
+ format-muted = "";
+ tooltip = false;
+ format-icons = {
+ headphone = "";
+ default = [ "" "" "" "" "" "" "" "" ];
+ };
+ scroll-step = 1;
+ };
+ "bluetooth" = {
+ format = " {status}";
+ format-disabled = "";
+ format-connected = " {num_connections}";
+ tooltip-format = "{device_enumerate}";
+ tooltip-format-enumerate-connected = "{device_alias} {device_address}";
+ };
+ "network" = {
+ interface = "wlp1s0f0";
+ format = "{ifname}";
+ format-wifi = " {essid}";
+ format-ethernet = "{ipaddr}/{cidr} ";
+ format-disconnected = " No Network";
+ tooltip = false;
+ };
+ "battery" = {
+ format = "{icon} {capacity}%";
+ format-icons = [ "" "" "" "" "" "" "" "" "" "" ];
+ format-charging = " {capacity}%";
+ tooltip = false;
+ };
+ };
+ };
+ style = ''
+ * {
+ border: none;
+ font-family: 'Fira Code', 'Symbols Nerd Font Mono';
+ font-size: 12px;
+ font-feature-settings: '"zero", "ss01", "ss02", "ss03", "ss04", "ss05", "cv31"';
+ min-height: 12px;
+ }
+
+ window#waybar {
+ background: transparent;
+ }
+
+ #custom-arch, #workspaces {
+ border-radius: 10px;
+ background-color: #11111b;
+ color: #cba6f7;
+ margin-top: 15px;
+ margin-right: 15px;
+ padding-top: 1px;
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+
+ #custom-arch {
+ font-size: 20px;
+ margin-left: 15px;
+ }
+
+ #workspaces button {
+ background: #11111b;
+ color: #cdd6f4;
+ }
+
+ #workspaces button.active {
+ color: #cba6f7;
+ }
+
+ #clock, #backlight, #pulseaudio, #bluetooth, #network, #battery{
+ border-radius: 10px;
+ background-color: #11111b;
+ color: #cdd6f4;
+ margin-top: 15px;
+ padding-left: 10px;
+ padding-right: 10px;
+ margin-right: 15px;
+ }
+
+ #backlight, #bluetooth {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ padding-right: 5px;
+ margin-right: 0
+ }
+
+ #pulseaudio, #network {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ padding-left: 5px;
+ }
+
+ #clock {
+ margin-right: 0;
+ }
+
+ @keyframes blink {
+ to {
+ background-color: #ffffff;
+ color: black;
+ }
+ }
+
+ #battery.warning:not(.charging) {
+ background: #f38ba8;
+ color: white;
+ animation-name: blink;
+ animation-duration: 0.5s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+ }
+ '';
+ };
+ };
+}
diff --git a/lib/default.nix b/lib/default.nix
index 8c2e11b..6528ecd 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -28,6 +28,15 @@ in
(overlay-unstable system)
(final: prev:
{
+ hyprland = inputs.hyprland.packages.${system}.default.override {
+ enableXWayland = true;
+ hidpiXWayland = true;
+ nvidiaPatches = false;
+ legacyRenderer = true;
+ };
+ waybar = prev.waybar.overrideAttrs (oldAttrs: {
+ mesonFlags = oldAttrs.mesonFlags ++ [ "-Dexperimental=true" ];
+ });
tinystatus = prev.pkgs.callPackage ../packages/tinystatus { };
jackett = prev.unstable.jackett;
radarr = prev.unstable.radarr;
diff --git a/lib/luj.nix b/lib/luj.nix
index 9b772bb..babe472 100644
--- a/lib/luj.nix
+++ b/lib/luj.nix
@@ -34,7 +34,7 @@ lib: with lib; let
};
macintosh = {
arch = "aarch64-linux";
- nixpkgs_version = "unstable";
+ nixpkgs_version = "nixos-apple-silicon.inputs";
};
lambda = {
arch = "aarch64-linux";
diff --git a/machines/macintosh/default.nix b/machines/macintosh/default.nix
index ac8e7f8..7d0e230 100644
--- a/machines/macintosh/default.nix
+++ b/machines/macintosh/default.nix
@@ -29,8 +29,7 @@
programs.hyprland.enable = true;
-
-
+ programs.hyprland.package = pkgs.hyprland;
programs.fish.shellInit = ''
if test -z (pgrep ssh-agent)
diff --git a/machines/macintosh/home-julien.nix b/machines/macintosh/home-julien.nix
index 38a7201..97c0497 100644
--- a/machines/macintosh/home-julien.nix
+++ b/machines/macintosh/home-julien.nix
@@ -25,7 +25,8 @@
luj.programs.git.enable = true;
luj.programs.gtk.enable = true;
luj.programs.alacritty.enable = true;
- luj.programs.sway.enable = true;
+ luj.programs.hyprland.enable = true;
+ luj.programs.waybar.enable = true;
programs.rofi = {
enable = true;
@@ -53,6 +54,7 @@
home.packages = with pkgs;
[
du-dust
+ kitty
jq
lazygit
fira-code
diff --git a/machines/macintosh/wallpaper.jpg b/machines/macintosh/wallpaper.jpg
new file mode 100644
index 0000000..403fd4e
Binary files /dev/null and b/machines/macintosh/wallpaper.jpg differ