GNU bug report logs - #77352
[PATCH] home: services: define hyprland home service

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: guix-patches; Reported by: Carmine Margiotta <email@HIDDEN>; Keywords: patch; dated Sat, 29 Mar 2025 06:22:02 UTC; Maintainer for guix-patches is guix-patches@HIDDEN.

Message received at 77352 <at> debbugs.gnu.org:


Received: (at 77352) by debbugs.gnu.org; 29 Mar 2025 15:37:47 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 29 11:37:47 2025
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
Subject: Re: [bug#77352] [PATCH] home: services: define hyprland home service
To: Carmine Margiotta <email@HIDDEN>, 77352 <at> debbugs.gnu.org
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-Debbugs-Envelope-To: 77352
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




Information forwarded to guix-patches@HIDDEN:
bug#77352; Package guix-patches. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 29 Mar 2025 06:21:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 29 02:21:10 2025
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>
To: guix-patches@HIDDEN
Subject: [PATCH] home: services: define hyprland home service
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-Debbugs-Envelope-To: submit
X-Mailman-Approved-At: Sat, 29 Mar 2025 02:21:01 -0400
Cc: Carmine Margiotta <email@HIDDEN>
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





Acknowledgement sent to Carmine Margiotta <email@HIDDEN>:
New bug report received and forwarded. Copy sent to guix-patches@HIDDEN. Full text available.
Report forwarded to guix-patches@HIDDEN:
bug#77352; Package guix-patches. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sat, 29 Mar 2025 15:45:01 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.