diff --git a/home/default.nix b/home/default.nix index 709e6d6..fc15a74 100644 --- a/home/default.nix +++ b/home/default.nix @@ -33,6 +33,7 @@ in ./packages ./programs ./impermanence + ./themes ]; config = { diff --git a/home/misc/dconf.nix b/home/misc/dconf.nix index f876c1a..b7a7b17 100644 --- a/home/misc/dconf.nix +++ b/home/misc/dconf.nix @@ -1,10 +1,13 @@ { - dconf.settings = { - # This is like a system-wide dark mode swithc that some apps respect - # Equivalent of the following dconf command: - # `conf write /org/gnome/desktop/interface/color-scheme "'prefer-dark'"` - "org/gnome/desktop/interface" = { - color-scheme = "prefer-dark"; + dconf = { + enable = true; + settings = { + # This is like a system-wide dark mode swithc that some apps respect + # Equivalent of the following dconf command: + # `conf write /org/gnome/desktop/interface/color-scheme "'prefer-dark'"` + "org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + }; }; }; } diff --git a/home/themes/cursor.nix b/home/themes/cursor.nix new file mode 100644 index 0000000..265bdd2 --- /dev/null +++ b/home/themes/cursor.nix @@ -0,0 +1,16 @@ +{ + osConfig, + ... +}: let + cfg = osConfig.myOptions.home-manager.theme.cursor; +in { + home = { + pointerCursor = { + package = cfg.package; + name = cfg.name; + size = cfg.size; + gtk.enable = true; + x11.enable = true; + }; + }; +} diff --git a/home/themes/default.nix b/home/themes/default.nix new file mode 100644 index 0000000..f2802d1 --- /dev/null +++ b/home/themes/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./gtk.nix + ./qt.nix + ./cursor.nix + ]; +} diff --git a/home/themes/gtk.nix b/home/themes/gtk.nix new file mode 100644 index 0000000..131c421 --- /dev/null +++ b/home/themes/gtk.nix @@ -0,0 +1,80 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: let + cfg = osConfig.myOptions.home-manager.theme.gtk; +in { + home = { + packages = with pkgs; [ + glib # gsettings + cfg.theme.package + cfg.iconTheme.package + ]; + + sessionVariables = { + # set GTK theme to the name specified by the gtk theme package + GTK_THEME = "${cfg.theme.name}"; + + # gtk applications should use filepickers specified by xdg + GTK_USE_PORTAL = "${toString (if cfg.usePortal then 1 else 0)}"; + }; + }; + + gtk = { + enable = true; + + theme = { + name = cfg.theme.name; + package = cfg.theme.package; + }; + + iconTheme = { + name = cfg.iconTheme.name; + package = cfg.iconTheme.package; + }; + + font = { + name = cfg.font.name; + size = cfg.font.size; + }; + + gtk2 = { + configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; + extraConfig = '' + gtk-xft-antialias=1 + gtk-xft-hinting=1 + gtk-xft-hintstyle="hintslight" + gtk-xft-rgba="rgb" + ''; + }; + + gtk3.extraConfig = { + gtk-toolbar-style = "GTK_TOOLBAR_BOTH"; + gtk-toolbar-icon-size = "GTK_ICON_SIZE_LARGE_TOOLBAR"; + gtk-decoration-layout = "appmenu:none"; + gtk-button-images = 1; + gtk-menu-images = 1; + gtk-enable-event-sounds = 0; + gtk-enable-input-feedback-sounds = 0; + gtk-xft-antialias = 1; + gtk-xft-hinting = 1; + gtk-xft-hintstyle = "hintslight"; + gtk-error-bell = 0; + gtk-application-prefer-dark-theme = true; + }; + + gtk4.extraConfig = { + gtk-decoration-layout = "appmenu:none"; + gtk-enable-event-sounds = 0; + gtk-enable-input-feedback-sounds = 0; + gtk-xft-antialias = 1; + gtk-xft-hinting = 1; + gtk-xft-hintstyle = "hintslight"; + gtk-error-bell = 0; + gtk-application-prefer-dark-theme = true; + }; + }; +} diff --git a/home/themes/qt.nix b/home/themes/qt.nix new file mode 100644 index 0000000..0e257a7 --- /dev/null +++ b/home/themes/qt.nix @@ -0,0 +1,57 @@ +{ + pkgs, + lib, + osConfig, + ... +}: let + inherit (lib) mkIf mkMerge; + + cfg = osConfig.myOptions.home-manager.theme.qt; +in { + qt = { + enable = true; + platformTheme.name = mkIf cfg.forceGtk "gtk"; # just an override for QT_QPA_PLATFORMTHEME, takes "gtk", "gnome", "qtct" or "kde" + style = mkIf (!cfg.forceGtk) { + name = cfg.theme.name; + package = cfg.theme.package; + }; + }; + + home = { + packages = with pkgs; + mkMerge [ + [ + # libraries and programs to ensure that qt applications load without issue + # breeze-icons is added as a fallback + libsForQt5.qt5ct + kdePackages.qt6ct + breeze-icons + ] + + (mkIf cfg.forceGtk [ + # libraries to ensure that "gtk" platform theme works + # as intended after the following PR: + # + libsForQt5.qtstyleplugins + qt6Packages.qt6gtk2 + ]) + ]; + + sessionVariables = { + # scaling - 1 means no scaling + QT_AUTO_SCREEN_SCALE_FACTOR = "1"; + + # use wayland as the default backend, fallback to xcb if wayland is not available + QT_QPA_PLATFORM = "wayland;xcb"; + + # disable window decorations everywhere + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + + # remain backwards compatible with qt5 + DISABLE_QT5_COMPAT = "0"; + + # tell calibre to use the dark theme, because the light one hurts my eyes + CALIBRE_USE_DARK_PALETTE = "1"; + }; + }; +} diff --git a/options/home/default.nix b/options/home/default.nix index 9f3f0c2..8e7f5a8 100644 --- a/options/home/default.nix +++ b/options/home/default.nix @@ -6,6 +6,7 @@ in ./programs ./git.nix ./wms.nix + ./theme.nix ]; options.myOptions.home-manager = { diff --git a/options/home/theme.nix b/options/home/theme.nix new file mode 100644 index 0000000..a2e76bb --- /dev/null +++ b/options/home/theme.nix @@ -0,0 +1,108 @@ +{ lib, pkgs, ... }: let + inherit (lib) mkEnableOption mkOption types; +in +{ + options.myOptions.home-manager.theme = { + gtk = { + enable = mkEnableOption "GTK theming optionss"; + usePortal = mkEnableOption "native desktop portal use for filepickers"; + + theme = { + name = mkOption { + type = types.str; + default = "Catppuccin-Mocha-Standard-Blue-dark"; + description = "The name for the GTK theme package"; + }; + + package = mkOption { + type = types.package; + description = "The theme package to be used for GTK programs"; + default = pkgs.catppuccin-gtk.override { + size = "standard"; + accents = ["blue"]; + variant = "mocha"; + tweaks = ["normal"]; + }; + }; + }; + + iconTheme = { + name = mkOption { + type = types.str; + description = "The name for the icon theme that will be used for GTK programs"; + default = "Papirus-Dark"; + }; + + package = mkOption { + type = types.package; + description = "The GTK icon theme package to be used"; + default = pkgs.catppuccin-papirus-folders.override { + accent = "blue"; + flavor = "mocha"; + }; + }; + }; + + font = { + name = mkOption { + type = types.str; + description = "The name of the font that will be used for GTK applications"; + default = "Noto Sans"; # Lexend + }; + + size = mkOption { + type = types.int; + description = "The size of the font"; + default = 10; # 10 + }; + }; + }; + + qt = { + forceGtk = mkOption { + type = types.bool; + default = false; + description = "Whether to force QT applications to try and use the GTK theme."; + }; + + theme = { + name = mkOption { + type = types.str; + default = "Catppuccin-Mocha-Dark"; + description = "The name for the QT theme package"; + }; + + package = mkOption { + type = types.package; + description = "The theme package to be used for QT programs"; + default = pkgs.catppuccin-kde.override { + flavour = ["mocha"]; + accents = ["blue"]; + winDecStyles = ["modern"]; + }; + }; + }; + }; + + cursor = { + name = mkOption { + type = types.str; + default = "catppuccin-mocha-dark-cursors"; + description = "The name of the cursor inside the package"; + }; + + package = mkOption { + type = types.package; + default = pkgs.catppuccin-cursors.mochaDark; + description = "The package providing the cursors"; + }; + + size = mkOption { + type = types.int; + default = 24; + description = "The size of the cursor"; + }; + }; + + }; +} diff --git a/system/roles/workstation/fonts.nix b/system/roles/workstation/fonts.nix index 0dedb34..600b778 100644 --- a/system/roles/workstation/fonts.nix +++ b/system/roles/workstation/fonts.nix @@ -23,6 +23,8 @@ in { ++ common; sansSerif = [ + "Noto Sans" + "Jost" "Lexend" ] ++ common; @@ -62,6 +64,7 @@ in { inter lato lexend + jost dejavu_fonts noto-fonts noto-fonts-cjk @@ -72,6 +75,7 @@ in { openmoji-color openmoji-black font-awesome + material-symbols # defaults worth keeping dejavu_fonts