X-Loop: help-debbugs@HIDDEN
Subject: [bug#77352] [PATCH] home: services: define hyprland home service
Resent-From: Carmine Margiotta <email@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 29 Mar 2025 06:22:02 +0000
Resent-Message-ID: <handler.77352.B.174322927012599 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: report 77352
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 77352 <at> debbugs.gnu.org
Cc: Carmine Margiotta <email@HIDDEN>
X-Debbugs-Original-To: guix-patches@HIDDEN
Received: via spool by submit <at> debbugs.gnu.org id=B.174322927012599
(code B ref -1); Sat, 29 Mar 2025 06:22:02 +0000
Received: (at submit) by debbugs.gnu.org; 29 Mar 2025 06:21:10 +0000
Received: from localhost ([127.0.0.1]:56430 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1tyPZ7-0003H6-88
for submit <at> debbugs.gnu.org; Sat, 29 Mar 2025 02:21:10 -0400
Received: from lists.gnu.org ([2001:470:142::17]:55278)
by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.84_2) (envelope-from <email@HIDDEN>)
id 1tyJ5E-0000pz-Cc
for submit <at> debbugs.gnu.org; Fri, 28 Mar 2025 19:25:53 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.90_1) (envelope-from <email@HIDDEN>)
id 1tyJ59-0007a6-1W
for guix-patches@HIDDEN; Fri, 28 Mar 2025 19:25:47 -0400
Received: from out-02.smtp.spacemail.com ([63.250.43.87])
by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
(Exim 4.90_1) (envelope-from <email@HIDDEN>)
id 1tyJ56-0007jn-7E
for guix-patches@HIDDEN; Fri, 28 Mar 2025 19:25:46 -0400
Received: from prod-lbout-phx.jellyfish.systems (unknown [198.177.122.3])
by smtp.spacemail.com (Postfix) with ESMTPA id 4ZPc8N0Ty4zGp4h;
Fri, 28 Mar 2025 23:25:40 +0000 (UTC)
Received: from localhost.localdomain (unknown [81.56.0.160])
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256)
(No client certificate requested)
by mail.spacemail.com (Postfix) with ESMTPSA id 4ZPc8M1KNBz6tkM;
Fri, 28 Mar 2025 23:25:39 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cmargiotta.net;
s=spacemail; t=1743204339;
bh=x6yfU4GDJkSZiQzkyfRAw8mAGMxs+DnY470lKXze37Q=;
h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
b=XphTa53VQqrGT2QF5if8fSZ83Cz9lcr/LCveIcBvIsVEtSIbdKefUt9Lh68lQB7p7
/nOa1LuVhh6XOHhvxIi4eB6cBoXbezN6y3i3vIiL0pVh9mXXTZzptBASD/FUkoEO35
FQ5lNAVp8zRw3BBm/i1HUaD0Hwu91iQHIjy/baen19bx71V23mGUoNpLN7U26f9ctl
JEjeu1/2e6rDzxvxtBnY+RHZ6D3q3sceVi7jzVKiolaRieM8h70e06jJ8ZlbzvGBu9
0FBbpb4AHU7sFQ3dAV9FZ55Qj7kkwM2WqRu7MEA5QdU9WLguMI5ezx/jMt5n1Co6Yg
AJuBQruxQmQBA==
From: Carmine Margiotta <email@HIDDEN>
Date: Sat, 29 Mar 2025 00:25:03 +0100
Message-ID: <20250328232510.32282-2-email@HIDDEN>
X-Mailer: git-send-email 2.49.0
In-Reply-To: <20250328232510.32282-1-email@HIDDEN>
References: <20250328232510.32282-1-email@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Received-SPF: pass client-ip=63.250.43.87; envelope-from=email@HIDDEN;
helo=out-02.smtp.spacemail.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001,
RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001,
SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.0 (+)
X-Mailman-Approved-At: Sat, 29 Mar 2025 02:21:01 -0400
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)
---
gnu/home/services/hyprland.scm | 490 +++++++++++++++++++++++++++++++++
1 file changed, 490 insertions(+)
create mode 100644 gnu/home/services/hyprland.scm
diff --git a/gnu/home/services/hyprland.scm b/gnu/home/services/hyprland.scm
new file mode 100644
index 0000000000..f024f272d7
--- /dev/null
+++ b/gnu/home/services/hyprland.scm
@@ -0,0 +1,490 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2025 Carmine Margiotta <email@HIDDEN>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home services hyprland)
+ #:use-module (gnu packages wm)
+ #:use-module (guix gexp)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu home services)
+ #:use-module (guix packages)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1)
+
+ #:export (hyprland-extension hyprland-configuration binding monitor
+ home-hyprland-service-type))
+
+;;; Commentary:
+;;;
+;;; A Guix Home service to configure Hyprland, an highly customizabile dynamic tiling Wayland compositor
+;;;
+;;; Code:
+
+;;;
+;;; Helper functions.
+;;;
+
+;; Repeat v n times
+(define (repeat v n)
+ (if (eq? n 0)
+ '()
+ `(,v ,@(repeat v
+ (- n 1)))))
+
+;; Generate an indenter string of n tabs
+(define (indent tabs)
+ (if (<= tabs 0) ""
+ (apply string-append
+ (repeat "\t" tabs))))
+
+(define (flatten lst)
+ (let loop
+ ((lst lst)
+ (acc '()))
+ (cond
+ ((null? lst)
+ acc)
+ ((pair? lst)
+ (loop (car lst)
+ (loop (cdr lst) acc)))
+ (else (cons lst acc)))))
+
+;;;
+;;; Definition of configurations.
+;;;
+
+;; Entry inside a 'block' configuration
+;; allowed formats: (symbol string) (symbol number) (symbol boolean) (symbol block-entries)
+;; A block entry can contain a list of block entries, effectively allowing nested blocks
+(define (block-entry? data)
+ (or (null? data)
+ (match data
+ (((? symbol?)
+ (or (? string?)
+ (? number?)
+ (? boolean?)
+ (? block-entries?)))
+ #t))))
+
+;; List of block entries
+(define (block-entries? data)
+ (every block-entry? data))
+
+;; An executable (a target for the exec action) can be a string or a gexp
+(define (executable? value)
+ (or (string? value)
+ (gexp? value)))
+
+;; A list of valid executables
+(define (executable-list? values)
+ (every executable? values))
+
+;; Block sub-configuration (a container of block entries)
+(define-configuration block
+ (entries (block-entries '()) "Block entries"
+ (serializer (lambda (name value)
+ (serialize-block-entries name value 1)))))
+
+;; Monitor sub-configuration
+(define-configuration monitor
+ (name (string "") "Monitor's name"
+ (serializer (lambda (_ n)
+ (string-append "monitor = " n ", "))))
+ (resolution (string "preferred") "Monitor's resolution"
+ (serializer (lambda (_ n)
+ (string-append n ", "))))
+ (position (string "auto") "Monitor's position"
+ (serializer (lambda (_ n)
+ (string-append n ", "))))
+ (scale (string "1") "Monitor's scale"
+ (serializer (lambda (_ n)
+ n)))
+ (transform (string "") "Monitor's scale"
+ (serializer (lambda (_ n)
+ (if (string-null? n) "\n"
+ (string-append ", transform, " n "\n"))))))
+
+;; List of monitors definition
+(define (monitors? arg)
+ (every monitor? arg))
+
+;; List of strings
+(define (string-list? arg)
+ (every string? arg))
+
+;; Binding sub-configuration
+(define-configuration binding
+ (flags (string "")
+ "Bind flags (https://wiki.hyprland.org/Configuring/Binds/)"
+ (serializer (lambda (_ n)
+ (string-append "bind" n " = "))))
+ (mod (string "$mod") "Mod key"
+ (serializer (lambda (_ n)
+ n)))
+ (shift? (boolean #f) "If mod is shifted"
+ (serializer (lambda (_ n)
+ (string-append (if n " SHIFT" "") ", "))))
+ (key (string) "Binding main key"
+ (serializer (lambda (_ n)
+ (string-append n ", "))))
+ (action (string "exec") "Binding action"
+ (serializer (lambda (_ n)
+ n)))
+ (args (executable "") "Binding action's args"
+ (serializer (lambda (name value)
+ (if (string? value)
+ (if (string-null? value) "\n"
+ (string-append ", " value "\n"))
+ #~(string-append ", "
+ #$(serialize-executable name value)
+ "\n"))))))
+
+;; List of bindings
+(define (binding-list? value)
+ (every binding? value))
+
+;; Optional string
+(define-maybe/no-serialization string)
+
+;; Binding block sub-configuration
+(define-configuration bindings
+ (main-mod (maybe-string "") "Main mod bound to $mod"
+ (serializer (lambda (_ n)
+ (string-append "\n$mod = " n "\n\n"))))
+ (binds (binding-list '()) "Bindings"
+ (serializer (lambda (_ n)
+ #~(string-append #$@(map (lambda (b)
+ (serialize-configuration b
+ binding-fields)) n))))))
+
+;;;
+;;; Serialization functions.
+;;;
+
+(define (serialize-block name block)
+ #~(string-append #$(symbol->string name) " {\n"
+ #$(if (null? block) ""
+ (serialize-configuration block block-fields)) "\n}\n"))
+
+;; A block entry will be serialized as an indented hyprlang
+;; statement, nested blocks are allowed
+(define (serialize-block-entry value tabs)
+ (string-append (or (match value
+ (() "")
+ (((? symbol? name)
+ value)
+ (string-append (indent tabs)
+ (symbol->string name)
+ (match value
+ ((? string? v)
+ (string-append " = " v))
+ ((? number? v)
+ (string-append " = "
+ (number->string v)))
+ ((? boolean? v)
+ (if v " = true" " = false"))
+ ((? block-entries? v)
+ (string-append " {\n"
+ (serialize-block-entries
+ #f v
+ (+ tabs 1))
+ (indent tabs) "}")))
+ "\n"))
+ ((_)
+ #f)) "\n")))
+
+;; String lists will be serialized as name = value\n
+(define (serialize-string-list name values)
+ (apply string-append
+ (map (lambda (w)
+ (string-append (symbol->string name) " = " w "\n")) values)))
+
+;; Gexp executables will be serialized on a program-file
+(define (serialize-executable name value)
+ (if (string? value) value
+ (program-file (symbol->string name) value
+ #:module-path %load-path)))
+
+;; Lists serializers
+(define (serialize-block-entries _ entries level)
+ (apply string-append
+ (map (lambda (e)
+ (serialize-block-entry e level)) entries)))
+
+(define (serialize-monitors _ monitors)
+ #~(string-append #$@(map (lambda (m)
+ (serialize-configuration m monitor-fields))
+ monitors)))
+
+(define (serialize-executable-list name values)
+ #~(apply string-append
+ (map (lambda (w)
+ (string-append #$(symbol->string name) " = " w "\n"))
+ '#$(map (lambda (v)
+ (serialize-executable name v)) values))))
+
+;; Hyprland full configuration
+(define-configuration hyprland-configuration
+ (package
+ (package
+ hyprland) "Hyprland package to use"
+ (serializer (λ (_ n) "")))
+ (monitors (monitors (list (monitor))) "Monitors definition")
+ (exec-once (executable-list '()) "Command to exec once")
+ (exec (executable-list '()) "Command to automatically exec")
+ (general (block (block)) "General configuration variables")
+ (decoration (block (block)) "Decoration configuration variables")
+ (animations (block (block)) "Animation configuration variables")
+ (workspace (string-list '()) "Workspaces settings")
+ (windowrule (string-list '()) "Window rules (v2)")
+ (dwindle (block (block)) "Dwindle layout settings")
+ (master (block (block)) "Master layout settings")
+ (misc (block (block)) "Misc settings")
+ (input (block (block)) "Input settings")
+ (gestures (block (block)) "Gestures settings")
+ (bindings (bindings (bindings)) "Bindings configuration"
+ (serializer (λ (_ n)
+ (serialize-configuration n bindings-fields))))
+ (extra-config (string "") "Extra config"
+ (serializer (λ (_ n)
+ (string-append n "\n")))))
+
+;; Hyprland configuration extension for other services
+;; External services can add new exec entries or new bindings
+(define-configuration hyprland-extension
+ (exec-once (executable-list '())
+ "Commands to be executed with hyprland once")
+ (exec (executable-list '()) "Commands to be executed with hyprland")
+ (bindings (binding-list '()) "Extra binds")
+ (no-serialization))
+
+;;;
+;;; Default settings and useful constants.
+;;;
+(define-public %default-hyprland-general
+ (block (entries '((gaps_in 5)
+ (gaps_out 20)
+ (border_size 2)
+ (col.active_border "rgba(33ccffee) rgba(00ff99ee) 45deg")
+ (col.inactive_border "rgba(595959aa)")
+ (resize_on_border #f)
+ (allow_tearing #f)
+ (layout "dwindle")))))
+
+(define-public %default-hyprland-decoration
+ (block (entries '((rounding 10)
+ (rounding_power 2)
+ (active_opacity 1.0)
+ (inactive_opacity 0.9)
+ (dim_inactive #t)
+ (dim_strength 0.05)
+
+ (shadow ((enabled #t)
+ (range 4)
+ (render_power 3)
+ (color "rgba(1a1a1aee)")))
+ (blur ((enabled #t)
+ (size 3)
+ (passes 1)
+ (vibrancy 0.1696)))))))
+
+(define-public %default-hyprland-animations
+ (block (entries '((enabled #t)
+ (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.0")
+ (bezier "quick,0.15,0,0.1,1")
+
+ (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")))))
+
+(define-public %default-hyprland-workspace
+ '("w[tv1], gapsout:0, gapsin:0" "f[1], gapsout:0, gapsin:0"))
+
+(define-public %default-hyprland-windowrule
+ '("bordersize 0, floating:0, onworkspace:w[tv1]"
+ "rounding 0, floating:0, onworkspace:w[tv1]"
+ "bordersize 0, floating:0, onworkspace:f[1]"
+ "rounding 0, floating:0, onworkspace:f[1]"))
+
+(define-public %default-hyprland-misc
+ (block (entries '((force_default_wallpaper -1)
+ (disable_hyprland_logo #f)
+ (enable_swallow #t)
+ (vrr 2)))))
+
+(define-public %default-hyprland-gestures
+ (block (entries '((workspace_swipe #t)))))
+
+(define-public %default-hyprland-bindings
+ (bindings (main-mod "SUPER")
+ (binds `(,(binding (key "Q")
+ (action "killactive")) ,(binding (shift? #t)
+ (key "F")
+ (action
+ "togglefloating"))
+ ,(binding (key "F")
+ (action "fullscreen"))
+ ,(binding (shift? #t)
+ (key "R")
+ (action "exec")
+ (args "hyprctl reload"))
+ ;; Dwindle layout
+ ,(binding (key "P")
+ (action "pseudo"))
+ ,(binding (key "J")
+ (action "togglesplit"))
+ ;; Move focus with arrow keys
+ ,(binding (key "left")
+ (action "movefocus")
+ (args "l"))
+ ,(binding (key "right")
+ (action "movefocus")
+ (args "r"))
+ ,(binding (key "up")
+ (action "movefocus")
+ (args "u"))
+ ,(binding (key "down")
+ (action "movefocus")
+ (args "d"))
+ ;; Switch workspaces
+ ,@(map (lambda (index)
+ (binding (key (number->string index))
+ (action "workspace")
+ (args (number->string index))))
+ (iota 10))
+ ;; Move active window to workspace
+ ,@(map (lambda (index)
+ (binding (shift? #t)
+ (key (number->string index))
+ (action "movetoworkspace")
+ (args (number->string index))))
+ (iota 10))
+ ;; Move/resize with mouse
+ ,(binding (flags "m")
+ (key "mouse:272")
+ (action "movewindow"))
+ ,(binding (flags "m")
+ (key "mouse:273")
+ (action "resizewindow"))
+ ,(binding (key "R")
+ (action "submap")
+ (args "resize"))))))
+
+(define-public %hyprland-resize-submap
+ "submap = resize
+binde = ,right, resizeactive, 10 0
+binde = ,left, resizeactive, -10 0
+binde = ,up, resizeactive, 0 -10
+binde = ,down, resizeactive, 0 10
+bind = ,escape, submap, reset
+submap = reset
+")
+
+(define-public %default-hyprland-configuration
+ (hyprland-configuration (general %default-hyprland-general)
+ (decoration %default-hyprland-decoration)
+ (animations %default-hyprland-animations)
+ (workspace %default-hyprland-workspace)
+ (windowrule %default-hyprland-windowrule)
+ (misc %default-hyprland-misc)
+ (gestures %default-hyprland-gestures)
+ (bindings %default-hyprland-bindings)
+ (extra-config %hyprland-resize-submap)))
+
+;;;
+;;; Useful scripts
+;;;
+
+;; Reload the first instance of hyprland, to
+;; automatically load the new configuration
+(define (hyprland-reload config)
+ #~(begin
+ (display "Reloading hyprland configuration...")
+ (system* #$(file-append (hyprland-configuration-package config)
+ "/bin/hyprctl") "--instance" "0" "reload")))
+
+;;;
+;;; Definition of the Home Service.
+;;;
+
+(define-public home-hyprland-service-type
+ (service-type (name 'home-hyprland-config)
+ (description "Configure Sway by providing a file
+@file{~/.config/hypr/hyprland.conf}.")
+ (compose (λ (extensions)
+ (hyprland-extension (exec-once (flatten (map
+ hyprland-extension-exec-once
+ extensions)))
+ (exec (flatten (map
+ hyprland-extension-exec
+ extensions)))
+ (bindings (flatten (map
+ hyprland-extension-bindings
+ extensions))))))
+ (extend (λ (config rules)
+ (hyprland-configuration (inherit config)
+ (exec-once (append (hyprland-configuration-exec-once
+ config)
+ (hyprland-extension-exec-once
+ rules)))
+ (exec (append (hyprland-configuration-exec
+ config)
+ (hyprland-extension-exec
+ rules)))
+ (bindings (bindings (inherit
+ (hyprland-configuration-bindings
+ config))
+ (binds (append
+ (bindings-binds
+ (hyprland-configuration-bindings
+ config))
+
+ (hyprland-extension-bindings
+ rules))))))))
+ (extensions (list (service-extension
+ home-activation-service-type
+ ;; Trigger hyprctl reload after a new config has been applied
+ hyprland-reload)
+ (service-extension home-profile-service-type
+ (λ (config)
+ `(,(hyprland-configuration-package
+ config))))
+ (service-extension
+ home-xdg-configuration-files-service-type
+ (λ (c)
+ `(("hypr/hyprland.conf" ,(mixed-text-file
+ "hyprland-cfg"
+ (serialize-configuration
+ c
+ hyprland-configuration-fields))))))))
+ (default-value %default-hyprland-configuration)))
base-commit: b282b5ecd90da5dc3a034e7064ac41808f7f6c24
--
2.49.0
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: Carmine Margiotta <email@HIDDEN> Subject: bug#77352: Acknowledgement ([PATCH] home: services: define hyprland home service) Message-ID: <handler.77352.B.174322927012599.ack <at> debbugs.gnu.org> References: <20250328232510.32282-2-email@HIDDEN> X-Gnu-PR-Message: ack 77352 X-Gnu-PR-Package: guix-patches X-Gnu-PR-Keywords: patch Reply-To: 77352 <at> debbugs.gnu.org Date: Sat, 29 Mar 2025 06:22:02 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): guix-patches@HIDDEN If you wish to submit further information on this problem, please send it to 77352 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 77352: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D77352 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
X-Loop: help-debbugs@HIDDEN
Subject: [bug#77352] [PATCH] home: services: define hyprland home service
Resent-From: Andrew Wong <wongandj@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 29 Mar 2025 15:38:02 +0000
Resent-Message-ID: <handler.77352.B77352.174326266722372 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 77352
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Carmine Margiotta <email@HIDDEN>, 77352 <at> debbugs.gnu.org
Received: via spool by 77352-submit <at> debbugs.gnu.org id=B77352.174326266722372
(code B ref 77352); Sat, 29 Mar 2025 15:38:02 +0000
Received: (at 77352) by debbugs.gnu.org; 29 Mar 2025 15:37:47 +0000
Received: from localhost ([127.0.0.1]:60893 helo=debbugs.gnu.org)
by debbugs.gnu.org with esmtp (Exim 4.84_2)
(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
id 1tyYFm-0005om-Sz
for submit <at> debbugs.gnu.org; Sat, 29 Mar 2025 11:37:47 -0400
Received: from qs51p00im-qukt01071901.me.com ([17.57.155.8]:2863)
by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
(Exim 4.84_2) (envelope-from <wongandj@HIDDEN>)
id 1tyYFk-0005oW-No
for 77352 <at> debbugs.gnu.org; Sat, 29 Mar 2025 11:37:45 -0400
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=icloud.com;
s=1a1hai; bh=ew60oUYIpBaWGG5eA/lCc/n32AHG28LtnxU0joU0fxQ=;
h=Message-ID:Date:MIME-Version:Subject:To:From:Content-Type:x-icloud-hme;
b=dER2FT9qqy2JhwZeEYyw9LtItFudNn1ZDFtHYHbOjxMtyvtiBLqt9AG6yMLsfguta
aT+C7jK8L2RLvzLAt61Ow1T9UIjse+GX2fiCAGGYIqVPBZEBeJI5COVuYceU4OJ15e
4uraZBHmFX8kkGpnThaFC71xuuRGDj6uNEjAnapDvX0Q5mPZ0z+E27Ab8w158yLJ8A
6HW4se2ElyDjxHu5qfuZby5fCLjXQ3NRpm+/PuhAw00YFvlXrn4+TvhGGBgJqyHZRD
qsd5xIl5w54xnLESD5OrfNRPRvjp7vSFcT+c8WHBhUeB0lTRn0Kcr8BVPE57QYVdFZ
KBvCXcobRzrUg==
Received: from [192.168.86.109] (qs51p00im-dlb-asmtp-mailmevip.me.com
[17.57.155.28])
by qs51p00im-qukt01071901.me.com (Postfix) with ESMTPSA id E5F4C6280265;
Sat, 29 Mar 2025 15:37:37 +0000 (UTC)
Message-ID: <3b19a930-abf9-4f6a-baad-bb2c29e723e0@HIDDEN>
Date: Sat, 29 Mar 2025 11:37:36 -0400
MIME-Version: 1.0
User-Agent: Icedove Daily
References: <20250328232510.32282-1-email@HIDDEN>
<20250328232510.32282-2-email@HIDDEN>
Content-Language: en-US
From: Andrew Wong <wongandj@HIDDEN>
In-Reply-To: <20250328232510.32282-2-email@HIDDEN>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Proofpoint-GUID: e9vcuRy9RKD38NfPwakt_Z1dibl4DOD7
X-Proofpoint-ORIG-GUID: e9vcuRy9RKD38NfPwakt_Z1dibl4DOD7
X-Proofpoint-Virus-Version: vendor=baseguard
engine=ICAP:2.0.272,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34
definitions=2025-03-29_01,2025-03-27_02,2024-11-22_01
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0
malwarescore=0 spamscore=0
mlxscore=0 clxscore=1011 suspectscore=0 mlxlogscore=999 phishscore=0
adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1
engine=8.19.0-2308100000 definitions=main-2503290113
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)
Very cool patch! Would it be possible to add functionality for loading
plugins on startup? I have a pending patch series[1] that packages
several Hyprland plugins, and it would be nice to be able to enter a
list of plugin packages to be loaded directly in the config so they
could be "dependencies" of the service.
Also, how does this cooperate with session managers like the default
GDM, which launches wayland from its .desktop entry in
/run/current-system/profile/share/wayland-sessions[2]? If it only
generates a configuration (i.e. doesn't start the Hyprland process),
would it be possible to define services that start and run only while
Hyprland runs? (this would be distinct from what "exec" lines do in that
the packages are then pulled into the profile by the service, letting
Guix "understand" the dependency)
The default settings should be the same as Hyprland's auto-generated
config[3], unless there's some guix-specific requirement. This is
because users will want to be able to easily transfer the config they
already use, and to be able to use the documentation and advice that
already exists that assumes new users have the autogenerated config.
Users should not have to do extra configuration to get a consistent
default experience.
To name a few issues, having `extra-config` defined by default would
require users to go out of their way to use what would otherwise be a
"last-resort" feature in order to get the default experience. Also, I
know from experience that settings vrr to anything but 0 can cause some
monitors to go black unless the vrr matches their (fixed) refresh rate;
vrr is not a universal feature, the ability for the computer to control
the monitor's vrr setting even less so.
Perhaps the service could straight-up copy or parse-in the file (which
would make transitioning from a "traditional" config file easy, too!)
from the Hyprland package itself to reduce the need for Guix to maintain
it every time it changes. Off the top of my head, the cheapest solution
to the problem would be to hardcode the default config's checksum, and
print an alert asking for maintenance when it changes.
Finally, you should check over your patch with regards to Guix' coding
style conventions[4]. Most conspicuously, lines should be 80 characters
wide at maximum. Also, when updating a patch, you should send a v2
instead of creating a new bug number.
Your patch shows a lot of promise, and it's great to see someone get the
ball rolling on something I've only been daydreaming about for a while
now. If you'd like help on any specific part, LMK!
- Andrew Wong
[1] bug#76910
[2]
https://guix.gnu.org/manual/devel/en/html_node/X-Window.html#index-gdm_002dservice_002dtype
[3] less $(guix build hyprland)/share/hypr/hyprland.conf
[4] https://guix.gnu.org/manual/en/html_node/Formatting-Code.html
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.