mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 21:38:07 -05:00
system: grub: Add preliminary support for themes.
* gnu/system/grub.scm (<grub-image>, <grub-theme>): New record types. (%artwork-repository, %background-image): New variables. (<grub-configuration>)[theme]: New field. (svg->png, resize-image, grub-background-image, eye-candy): New procedures. (grub-configuration-file): Use 'eye-candy' and add it in BUILDER.
This commit is contained in:
parent
810568b35f
commit
99ae9ceb18
1 changed files with 164 additions and 19 deletions
|
@ -23,9 +23,29 @@ (define-module (gnu system grub)
|
||||||
#:use-module (guix records)
|
#:use-module (guix records)
|
||||||
#:use-module (guix monads)
|
#:use-module (guix monads)
|
||||||
#:use-module (guix gexp)
|
#:use-module (guix gexp)
|
||||||
|
#:use-module (guix download)
|
||||||
|
#:use-module (guix git-download)
|
||||||
|
#:autoload (gnu packages grub) (grub)
|
||||||
|
#:autoload (gnu packages inkscape) (inkscape)
|
||||||
|
#:autoload (gnu packages imagemagick) (imagemagick)
|
||||||
|
#:autoload (gnu packages compression) (gzip)
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
#:export (grub-configuration
|
#:export (grub-image
|
||||||
|
grub-image?
|
||||||
|
grub-image-aspect-ratio
|
||||||
|
grub-image-file
|
||||||
|
|
||||||
|
grub-theme
|
||||||
|
grub-theme?
|
||||||
|
grub-theme-images
|
||||||
|
grub-theme-color-normal
|
||||||
|
grub-theme-color-highlight
|
||||||
|
|
||||||
|
%background-image
|
||||||
|
%default-theme
|
||||||
|
|
||||||
|
grub-configuration
|
||||||
grub-configuration?
|
grub-configuration?
|
||||||
grub-configuration-device
|
grub-configuration-device
|
||||||
|
|
||||||
|
@ -40,6 +60,45 @@ (define-module (gnu system grub)
|
||||||
;;;
|
;;;
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
(define-record-type* <grub-image>
|
||||||
|
grub-image make-grub-image
|
||||||
|
grub-image?
|
||||||
|
(aspect-ratio grub-image-aspect-ratio ;rational number
|
||||||
|
(default 4/3))
|
||||||
|
(file grub-image-file)) ;file-valued gexp (SVG)
|
||||||
|
|
||||||
|
(define-record-type* <grub-theme>
|
||||||
|
grub-theme make-grub-theme
|
||||||
|
grub-theme?
|
||||||
|
(images grub-theme-images
|
||||||
|
(default '())) ;list of <grub-image>
|
||||||
|
(color-normal grub-theme-color-normal
|
||||||
|
(default '((fg . cyan) (bg . blue))))
|
||||||
|
(color-highlight grub-theme-color-highlight
|
||||||
|
(default '((fg . white) (bg . blue)))))
|
||||||
|
|
||||||
|
(define %artwork-repository
|
||||||
|
(origin
|
||||||
|
(method git-fetch)
|
||||||
|
(uri (git-reference
|
||||||
|
(url "git://git.savannah.gnu.org/guix/guix-artwork.git")
|
||||||
|
(commit "281157a")))
|
||||||
|
(sha256
|
||||||
|
(base32
|
||||||
|
"02x1myh013mzqnr28d4k1mxs4malv5vszpxdwkjarbhbbkchypz5"))))
|
||||||
|
|
||||||
|
(define %background-image
|
||||||
|
(grub-image
|
||||||
|
(aspect-ratio 4/3)
|
||||||
|
(file #~(string-append #$%artwork-repository "/grub/guix-4-3.svg"))))
|
||||||
|
|
||||||
|
(define %default-theme
|
||||||
|
;; Default theme contributed by Felipe López.
|
||||||
|
(grub-theme
|
||||||
|
(images (list %background-image))
|
||||||
|
(color-highlight '((fg . white) (bg . black))) ;XXX: fg should be #x3bb7f5
|
||||||
|
(color-normal '((fg . light-gray) (bg . black))))) ;XXX: #x303030
|
||||||
|
|
||||||
(define-record-type* <grub-configuration>
|
(define-record-type* <grub-configuration>
|
||||||
grub-configuration make-grub-configuration
|
grub-configuration make-grub-configuration
|
||||||
grub-configuration?
|
grub-configuration?
|
||||||
|
@ -51,7 +110,9 @@ (define-record-type* <grub-configuration>
|
||||||
(default-entry grub-configuration-default-entry ; integer
|
(default-entry grub-configuration-default-entry ; integer
|
||||||
(default 0))
|
(default 0))
|
||||||
(timeout grub-configuration-timeout ; integer
|
(timeout grub-configuration-timeout ; integer
|
||||||
(default 5)))
|
(default 5))
|
||||||
|
(theme grub-configuration-theme ; <grub-theme>
|
||||||
|
(default %default-theme)))
|
||||||
|
|
||||||
(define-record-type* <menu-entry>
|
(define-record-type* <menu-entry>
|
||||||
menu-entry make-menu-entry
|
menu-entry make-menu-entry
|
||||||
|
@ -62,6 +123,88 @@ (define-record-type* <menu-entry>
|
||||||
(default '())) ; list of string-valued gexps
|
(default '())) ; list of string-valued gexps
|
||||||
(initrd menu-entry-initrd)) ; file name of the initrd as a gexp
|
(initrd menu-entry-initrd)) ; file name of the initrd as a gexp
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Background image & themes.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define (svg->png svg)
|
||||||
|
"Build a PNG from SVG."
|
||||||
|
;; Don't use #:local-build? so that it's substitutable.
|
||||||
|
(gexp->derivation "grub-image.png"
|
||||||
|
#~(zero?
|
||||||
|
(system* (string-append #$inkscape "/bin/inkscape")
|
||||||
|
"--without-gui"
|
||||||
|
(string-append "--export-png=" #$output)
|
||||||
|
#$svg))))
|
||||||
|
|
||||||
|
(define (resize-image image width height)
|
||||||
|
"Resize IMAGE to WIDTHxHEIGHT."
|
||||||
|
;; Don't use #:local-build? so that it's substitutable.
|
||||||
|
(let ((size (string-append (number->string width)
|
||||||
|
"x" (number->string height))))
|
||||||
|
(gexp->derivation "grub-image.resized.png"
|
||||||
|
#~(zero?
|
||||||
|
(system* (string-append #$imagemagick "/bin/convert")
|
||||||
|
"-resize" #$size #$image #$output)))))
|
||||||
|
|
||||||
|
(define* (grub-background-image config #:key (width 640) (height 480))
|
||||||
|
"Return the GRUB background image defined in CONFIG with a ratio of
|
||||||
|
WIDTH/HEIGHT, or #f if none was found."
|
||||||
|
(let* ((ratio (/ width height))
|
||||||
|
(image (find (lambda (image)
|
||||||
|
(= (grub-image-aspect-ratio image) ratio))
|
||||||
|
(grub-theme-images (grub-configuration-theme config)))))
|
||||||
|
(if image
|
||||||
|
(mlet %store-monad ((png (svg->png (grub-image-file image))))
|
||||||
|
(resize-image png width height))
|
||||||
|
(with-monad %store-monad
|
||||||
|
(return #f)))))
|
||||||
|
|
||||||
|
(define (eye-candy config port)
|
||||||
|
"Return in %STORE-MONAD a gexp that writes to PORT (a port-valued gexp) the
|
||||||
|
'grub.cfg' part concerned with graphics mode, background images, colors, and
|
||||||
|
all that."
|
||||||
|
(define (theme-colors type)
|
||||||
|
(let* ((theme (grub-configuration-theme config))
|
||||||
|
(colors (type theme)))
|
||||||
|
(string-append (symbol->string (assoc-ref colors 'fg)) "/"
|
||||||
|
(symbol->string (assoc-ref colors 'bg)))))
|
||||||
|
|
||||||
|
(mlet* %store-monad ((image (grub-background-image config)))
|
||||||
|
(return (and image #~(format #$port "
|
||||||
|
function load_video {
|
||||||
|
insmod vbe
|
||||||
|
insmod vga
|
||||||
|
insmod video_bochs
|
||||||
|
insmod video_cirrus
|
||||||
|
}
|
||||||
|
|
||||||
|
if loadfont ~a/share/grub/unicode.pf2; then
|
||||||
|
set gfxmode=640x480
|
||||||
|
load_video
|
||||||
|
insmod gfxterm
|
||||||
|
terminal_output gfxterm
|
||||||
|
fi
|
||||||
|
|
||||||
|
insmod png
|
||||||
|
if background_image ~a; then
|
||||||
|
set color_normal=~a
|
||||||
|
set color_highlight=~a
|
||||||
|
else
|
||||||
|
set menu_color_normal=cyan/blue
|
||||||
|
set menu_color_highlight=white/blue
|
||||||
|
fi~%"
|
||||||
|
#$grub
|
||||||
|
#$image
|
||||||
|
#$(theme-colors grub-theme-color-normal)
|
||||||
|
#$(theme-colors grub-theme-color-highlight))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Configuration file.
|
||||||
|
;;;
|
||||||
|
|
||||||
(define* (grub-configuration-file config entries
|
(define* (grub-configuration-file config entries
|
||||||
#:key
|
#:key
|
||||||
(system (%current-system))
|
(system (%current-system))
|
||||||
|
@ -83,28 +226,30 @@ (define entry->gexp
|
||||||
#$linux (string-join (list #$@arguments))
|
#$linux (string-join (list #$@arguments))
|
||||||
#$initrd))))
|
#$initrd))))
|
||||||
|
|
||||||
(define builder
|
(mlet %store-monad ((sugar (eye-candy config #~port)))
|
||||||
#~(call-with-output-file #$output
|
(define builder
|
||||||
(lambda (port)
|
#~(call-with-output-file #$output
|
||||||
(format port "
|
(lambda (port)
|
||||||
|
#$sugar
|
||||||
|
(format port "
|
||||||
set default=~a
|
set default=~a
|
||||||
set timeout=~a
|
set timeout=~a
|
||||||
search.file ~a/bzImage~%"
|
search.file ~a/bzImage~%"
|
||||||
#$(grub-configuration-default-entry config)
|
#$(grub-configuration-default-entry config)
|
||||||
#$(grub-configuration-timeout config)
|
#$(grub-configuration-timeout config)
|
||||||
#$(any (match-lambda
|
#$(any (match-lambda
|
||||||
(($ <menu-entry> _ linux)
|
(($ <menu-entry> _ linux)
|
||||||
linux))
|
linux))
|
||||||
all-entries))
|
all-entries))
|
||||||
#$@(map entry->gexp all-entries)
|
#$@(map entry->gexp all-entries)
|
||||||
|
|
||||||
#$@(if (pair? old-entries)
|
#$@(if (pair? old-entries)
|
||||||
#~((format port "
|
#~((format port "
|
||||||
submenu \"GNU system, old configurations...\" {~%")
|
submenu \"GNU system, old configurations...\" {~%")
|
||||||
#$@(map entry->gexp old-entries)
|
#$@(map entry->gexp old-entries)
|
||||||
(format port "}~%"))
|
(format port "}~%"))
|
||||||
#~()))))
|
#~()))))
|
||||||
|
|
||||||
(gexp->derivation "grub.cfg" builder))
|
(gexp->derivation "grub.cfg" builder)))
|
||||||
|
|
||||||
;;; grub.scm ends here
|
;;; grub.scm ends here
|
||||||
|
|
Loading…
Reference in a new issue