From 4503e7c046150655da94ce4ed52d7fd92a7e0daa Mon Sep 17 00:00:00 2001 From: Joseph DiGiovanni Date: Sat, 3 Aug 2024 08:21:07 -0400 Subject: [PATCH] Add monitor brightness gnome extension --- custom-pkgs/default.nix | 9 ++-- .../monitor-brightness-and-volume.nix | 29 +++++++++++++ .../home-manager/common/gnome/default.nix | 1 + .../common/gnome/extensions/default.nix | 7 ++++ .../monitor-brightness-and-volume.nix | 42 +++++++++++++++++++ modules/options/hardware/monitor-control.nix | 8 ++-- 6 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 custom-pkgs/gnomeExtensions/monitor-brightness-and-volume.nix create mode 100644 hosts/Joe-Desktop/home-manager/common/gnome/extensions/default.nix create mode 100644 hosts/Joe-Desktop/home-manager/common/gnome/extensions/monitor-brightness-and-volume.nix diff --git a/custom-pkgs/default.nix b/custom-pkgs/default.nix index f54983d..dc9b969 100644 --- a/custom-pkgs/default.nix +++ b/custom-pkgs/default.nix @@ -1,14 +1,15 @@ { inputs, pkgs, system, ... }: let - customPkgs = final: prev: { - adwaita-for-steam = pkgs.callPackage ./adwaita-for-steam.nix { }; + customPkgs = final: prev: with pkgs;{ + adwaita-for-steam = callPackage ./adwaita-for-steam.nix { }; gnomeExtensions = prev.gnomeExtensions // { - rounded-window-corners-reborn = pkgs.callPackage ./gnomeExtensions/rounded-window-corners-reborn.nix { }; + monitor-brightness-and-volume = callPackage ./gnomeExtensions/monitor-brightness-and-volume.nix { }; + rounded-window-corners-reborn = callPackage ./gnomeExtensions/rounded-window-corners-reborn.nix { }; }; - mkvextract-gtk = pkgs.callPackage ./mkvextract-gtk.nix { }; + mkvextract-gtk = callPackage ./mkvextract-gtk.nix { }; }; unstableOverlay = final: prev: { diff --git a/custom-pkgs/gnomeExtensions/monitor-brightness-and-volume.nix b/custom-pkgs/gnomeExtensions/monitor-brightness-and-volume.nix new file mode 100644 index 0000000..a03d044 --- /dev/null +++ b/custom-pkgs/gnomeExtensions/monitor-brightness-and-volume.nix @@ -0,0 +1,29 @@ +{ lib, stdenv, fetchurl, unzip, glib }: + +stdenv.mkDerivation rec { + pname = "gnome-shell-extension-monitor-brightness-volume"; + version = "7"; + + src = fetchurl { + url = "https://extensions.gnome.org/extension-data/monitor-brightness-volumeailin.nemui.v${version}.shell-extension.zip"; + hash = "sha256-NrFZZdQTgnMyYk2Yp2l3RiXM2C+/NHhIPv/Fo/KrXt8="; + }; + + sourceRoot = "."; + + nativeBuildInputs = [ unzip glib ]; + + installPhase = '' + mkdir -p $out/share/gnome-shell/extensions/monitor-brightness-volume@ailin.nemui + mv * $out/share/gnome-shell/extensions/monitor-brightness-volume@ailin.nemui + glib-compile-schemas $out/share/gnome-shell/extensions/monitor-brightness-volume@ailin.nemui/schemas + ''; + + meta = with lib; { + description = "GNOME Shell extension to control monitor brightness and volume."; + homepage = "https://extensions.gnome.org/extension/1292/monitor-brightness-and-volume/"; + license = licenses.gpl2; + platforms = platforms.linux; + maintainers = with maintainers; [ jdig78 ]; + }; +} diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/default.nix b/hosts/Joe-Desktop/home-manager/common/gnome/default.nix index 87461f2..b6e6e4a 100644 --- a/hosts/Joe-Desktop/home-manager/common/gnome/default.nix +++ b/hosts/Joe-Desktop/home-manager/common/gnome/default.nix @@ -3,5 +3,6 @@ { imports = [ ./custom-wallpaper + ./extensions ]; } diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/extensions/default.nix b/hosts/Joe-Desktop/home-manager/common/gnome/extensions/default.nix new file mode 100644 index 0000000..f335053 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/extensions/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./monitor-brightness-and-volume.nix + ]; +} diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/extensions/monitor-brightness-and-volume.nix b/hosts/Joe-Desktop/home-manager/common/gnome/extensions/monitor-brightness-and-volume.nix new file mode 100644 index 0000000..14dd692 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/extensions/monitor-brightness-and-volume.nix @@ -0,0 +1,42 @@ +{ pkgs, ... }: + +let + UUID = "monitor-brightness-volume@ailin.nemui"; + lightModeBrightness = 50; + darkModeBrightness = 20; +in +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ UUID ]; + + "org/gnome/shell/extensions/monitor-brightness-volume".show-volume = false; + }; + + systemd.user.services.ddcutil-auto-brightness-gnome = { + Install.WantedBy = [ "default.target" ]; + + Service = { + ExecStart = pkgs.writeShellScript "ddcutil-auto-brightness-gnome" '' + ${pkgs.glib}/bin/gsettings monitor org.gnome.desktop.interface color-scheme | while read -r line; do + ${pkgs.gnome.gnome-shell}/bin/gnome-extensions disable ${UUID} # Reload the extension to detect the brightness change + if [[ "$line" == *"prefer-dark"* ]]; then + ${pkgs.ddcutil}/bin/ddcutil setvcp 10 ${toString darkModeBrightness} + else + ${pkgs.ddcutil}/bin/ddcutil setvcp 10 ${toString lightModeBrightness} + fi + # Reload the extension to apply the brightness change + ${pkgs.gnome.gnome-shell}/bin/gnome-extensions enable ${UUID} + done + ''; + Restart = "always"; + RestartSec = 10; + }; + + Unit = { + After = [ "graphical-session.target" ]; + Description = "ddcutil auto brightness service for GNOME"; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.monitor-brightness-and-volume ]; +} diff --git a/modules/options/hardware/monitor-control.nix b/modules/options/hardware/monitor-control.nix index 603ccc5..0e1eafd 100644 --- a/modules/options/hardware/monitor-control.nix +++ b/modules/options/hardware/monitor-control.nix @@ -2,11 +2,9 @@ { config = lib.mkIf config.hardware.monitor-control.enable { - environment.systemPackages = with pkgs; [ - ddcutil - ]; - - boot.kernelModules = [ "i2c-dev" ]; + environment.systemPackages = with pkgs; [ ddcutil ]; + hardware.i2c.enable = true; + users.groups."i2c".members = builtins.attrNames config.users.users; }; options.hardware.monitor-control.enable = lib.mkEnableOption "enable support for controlling monitor settings.";