openbox.scm
| 1 | ;;; Guix Home Manager. |
| 2 | ;;; |
| 3 | ;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu> |
| 4 | ;;; |
| 5 | ;;; This program is free software: you can redistribute it and/or modify |
| 6 | ;;; it under the terms of the GNU General Public License as published by |
| 7 | ;;; the Free Software Foundation, either version 3 of the License, or |
| 8 | ;;; (at your option) any later version. |
| 9 | ;;; |
| 10 | ;;; This program is distributed in the hope that it will be useful, |
| 11 | ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | ;;; GNU General Public License for more details. |
| 14 | ;;; |
| 15 | ;;; You should have received a copy of the GNU General Public License |
| 16 | ;;; along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 17 | |
| 18 | (define-module (home openbox) |
| 19 | #:use-module (guix build utils) |
| 20 | #:use-module (guix build-system trivial) |
| 21 | #:use-module (guix gexp) |
| 22 | #:use-module (guix licenses) |
| 23 | #:use-module (guix packages) |
| 24 | #:use-module (guix records) |
| 25 | #:use-module (gnu packages lxde) |
| 26 | #:use-module (home) |
| 27 | #:use-module (ice-9 match) |
| 28 | #:export (openbox-configuration |
| 29 | openbox-configuration? |
| 30 | openbox-configuration-autostart |
| 31 | openbox-configuration-environ |
| 32 | openbox-configuration-menu |
| 33 | openbox-configuration-rc |
| 34 | |
| 35 | openbox-menu |
| 36 | openbox-menu-id |
| 37 | openbox-menu-label |
| 38 | opebnox-menu-elements |
| 39 | |
| 40 | openbox-element-menu |
| 41 | openbox-element-execute |
| 42 | |
| 43 | openbox-home-type)) |
| 44 | |
| 45 | (define-record-type* <openbox-configuration> |
| 46 | openbox-configuration make-openbox-configuration |
| 47 | openbox-configuration? |
| 48 | (autostart openbox-configuration-autostart |
| 49 | (default #f)) |
| 50 | (environ openbox-configuration-environ |
| 51 | (default #f)) |
| 52 | (menus openbox-configuration-menus |
| 53 | (default '())) |
| 54 | (root-elements openbox-configuration-root-elements |
| 55 | (default '())) |
| 56 | (rc openbox-configuration-rc |
| 57 | (default #f))) |
| 58 | |
| 59 | (define-record-type* <openbox-menu> |
| 60 | openbox-menu make-openbox-menu |
| 61 | openbox-menu? |
| 62 | (id openbox-menu-id) |
| 63 | (label openbox-menu-label) |
| 64 | (elements openbox-menu-elements)) |
| 65 | |
| 66 | (define-record-type* <openbox-element-menu> |
| 67 | openbox-element-menu make-openbox-element-menu |
| 68 | openbox-element-menu? |
| 69 | (id openbox-element-menu-id)) |
| 70 | |
| 71 | (define-record-type* <openbox-element-execute> |
| 72 | openbox-element-execute make-openbox-element-execute |
| 73 | openbox-element-execute? |
| 74 | (label openbox-element-execute-label) |
| 75 | (command openbox-element-execute-command) |
| 76 | (notify? openbox-element-execute-notify? |
| 77 | (default #t))) |
| 78 | |
| 79 | (define (generate-openbox-menu menus root-menu) |
| 80 | (define (element->item element) |
| 81 | (match element |
| 82 | (($ <openbox-element-menu> id) |
| 83 | `(menu (@ (id ,id)))) |
| 84 | (($ <openbox-element-execute> label command notify?) |
| 85 | `(item (@ (label ,label)) |
| 86 | (action (@ (name "Execute")) |
| 87 | (command ,command) |
| 88 | ,@(if notify? '(startupnotify (enabled "yes")) '())))))) |
| 89 | #~(begin |
| 90 | (use-modules (sxml simple)) |
| 91 | (with-output-to-file #$output |
| 92 | (lambda _ |
| 93 | (sxml->xml |
| 94 | `(openbox_menu (@ (xmlns "http://openbox.org/3.4/menu")) |
| 95 | #$(map |
| 96 | (lambda (menu) |
| 97 | `(menu (@ (id ,(openbox-menu-id menu)) (label ,(openbox-menu-label menu))) |
| 98 | ,(map element->item (openbox-menu-elements menu)))) |
| 99 | menus) |
| 100 | (menu (@ (id "root-menu") (label "Openbox 3")) |
| 101 | #$(map element->item root-menu)))))))) |
| 102 | |
| 103 | (define (openbox-autostart autostart) |
| 104 | (match autostart |
| 105 | (#f (plain-file "autostart" "")) |
| 106 | (_ autostart))) |
| 107 | |
| 108 | (define (openbox-environment environ) |
| 109 | (match environ |
| 110 | (#f (plain-file "environ" "")) |
| 111 | (_ environ))) |
| 112 | |
| 113 | (define (openbox-rc rc) |
| 114 | (match rc |
| 115 | (#f (plain-file "rc.xml" "")) |
| 116 | (_ rc))) |
| 117 | |
| 118 | (define openbox-home-type |
| 119 | (home-type |
| 120 | (name 'openbox) |
| 121 | (default-value (openbox-configuration)) |
| 122 | (extensions |
| 123 | (list |
| 124 | (home-extension |
| 125 | (target root-home-type) |
| 126 | (compute |
| 127 | (lambda (config) |
| 128 | (match config |
| 129 | (($ <openbox-configuration> autostart environ menus root-elements rc) |
| 130 | `((".config/openbox/menu.xml" |
| 131 | ,(computed-file "menu.xml" (generate-openbox-menu menus root-elements))) |
| 132 | (".config/openbox/autostart" ,(openbox-autostart autostart)) |
| 133 | (".config/openbox/environment" ,(openbox-environment environ)) |
| 134 | (".config/openbox/rc.xml" ,(openbox-rc rc)))))))))))) |
| 135 |