David Pirotte <da...@altosw.be> writes:
> Excellent! Note that you'll need to update your configuration and
> use/grab 0.8.0-rc7 - which fixes a 'missing some distributed files',
> necessary to be able to run the newly added
>
>       examples/gtk-4/layout-manager.scm
>       [ a g-golf port of the upstream gtk4-demo layout manager
>       [ (transition) example

I see, but since Guix builds G-Golf from git rather than a tarball,
examples/gtk-4/layout-manager.scm had worked already with rc6.

Tarballs contain bundled M4 files and other build-aux files.  Guix
rather uses its own packaged version of these, avoiding something like
the xz vulnerability’s code injection.  Still it is good that you fixed
the tarball.


>>  Now I can embed GTK programs within the Guix Home
>> configurations ...
>
> I am glad that you (finally) can happily use the distro of your dream.
> Your config example certainly should help other guixers willing to use
> g-golf.

:)


>> All that is left is that I do not understand why
>> (gdk-display-get-default) returns #f in G-Golf but
>> gdk_display_get_default () in C returns 0x1c0e36c0.
>
> You need to have initialized either Gtk or Adw, otherwise it returns #f
> (as expected).
>
>       scheme@(guile-user)> ,use (g-golf)
>       scheme@(guile-user)> (gi-import-by-name "Gdk" "Display")
>       $5 = #<<gobject-class> <gdk-display> 7fee0e488c30>
>
>       scheme@(guile-user)> (gdk-display-get-default)
>       $6 = #f
>
>       scheme@(guile-user)> (gi-import-by-name "Gtk" "init")
>       $7 = #<<function> 7fee075cb480>
>       scheme@(guile-user)> (gtk-init)
>
>       scheme@(guile-user)> (gdk-display-get-default)
>       $8 = #<<gdk-wayland-display> 7fee0f054a10>
>
> David

This helped.  When manually run, missing gtk-init import and use was the
issue; thank you!  Funny enough, when auto-started, gtk-init is run by
GtkApplication or perhaps by some library constructor, but I also had
forgotten to actually call add-css-class.  Still I added gtk-init, so I
can manually run my launcher as well.

In case others use it as reference, the fixed version is attached.

Regards,
Florian

;;; Copyright © 2023, 2024 Florian Pelz <pelzflor...@pelzflorian.de>
;;
;; This program 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.
;; 
;; This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
;; 
;; Dieses Programm ist Freie Software: Sie können es unter den Bedingungen
;; der GNU General Public License, wie von der Free Software Foundation,
;; Version 3 der Lizenz oder (nach Ihrer Wahl) jeder neueren
;; veröffentlichten Version, weiter verteilen und/oder modifizieren.
;; 
;; Dieses Programm wird in der Hoffnung bereitgestellt, dass es nützlich sein 
wird, jedoch
;; OHNE JEDE GEWÄHR,; sogar ohne die implizite
;; Gewähr der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.
;; Siehe die GNU General Public License für weitere Einzelheiten.
;; 
;; Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
;; Programm erhalten haben. Wenn nicht, siehe <https://www.gnu.org/licenses/>.

(use-modules (gnu home)
             (gnu home services)
             (gnu home services desktop)
             (gnu home services shells)
             (gnu home services sound)
             (gnu home services sway)
             (gnu packages)
             (gnu packages gtk)
             (gnu packages guile-xyz)
             (gnu services)
             (guix build-system glib-or-gtk)
             (guix gexp)
             (guix licenses)
             (guix packages)
             (guix transformations))

(home-environment
  (packages (specifications->packages (list "git")))
  (services
   (list (service home-bash-service-type)
         (service home-dbus-service-type) ;für VLC
         ;; (service home-pipewire-service-type)
         (service home-sway-service-type
           (sway-configuration
            (execs
             `(,(with-extensions
                 (list graphene gtk
                       ((options->transformation
                         '((with-commit . "guile-g-golf=v0.8.0-rc6")))
                        guile-g-golf))
                 #~(string-append
                    "guile "
                    #$(scheme-file "launcher.scm"
                       #~(begin
                           (eval-when (expand load eval)
                             (use-modules (oop goops))
                             (default-duplicate-binding-handler
                               '(merge-generics replace
                                 warn-override-core warn last))
                             (setenv "GI_TYPELIB_PATH"
                                     #$(file-append
                                        (directory-union
                                         "typelibs"
                                         (list gdk-pixbuf
                                               graphene gtk harfbuzz
                                               pango))
                                        "/lib/girepository-1.0"))
                             (use-modules (g-golf))
                             (g-irepository-require
                              "Gtk" #:version "4.0")
                             (for-each (lambda (name)
                                         (gi-import-by-name "Gtk" name))
                                       '("Application"
                                         "ApplicationWindow"
                                         "Builder"
                                         "CssProvider"
                                         "init")))
                           (use-modules (sxml simple))
                           (gtk-init)
                           (define ui
                             '(interface
                               (requires (@ (version 4.0) (lib gtk)))
                               (object
                                (@ (id window) (class GtkApplicationWindow))
                                (child
                                 (object
                                  (@ (class GtkGrid))
                                  (property (@ (name row-homogeneous)) 1)
                                  (property (@ (name column-homogeneous)) 1)
                                  (child
                                   (object
                                    (@ (id btn-kodi) (class GtkButton))
                                    (property (@ (name label)) Kodi)
                                    (layout
                                     (property (@ (name column)) 0)
                                     (property (@ (name row)) 0))))
                                  (child
                                   (object
                                    (@ (id btn-halt) (class GtkButton))
                                    (property (@ (name label)) Halt)
                                    (layout
                                     (property (@ (name column)) 0)
                                     (property (@ (name row)) 1))))
                                  (child
                                   (object
                                    (@ (id btn-reboot) (class GtkButton))
                                    (property (@ (name label)) Reboot)
                                    (layout
                                     (property (@ (name column)) 1)
                                     (property (@ (name row)) 1))))
                                  (child
                                   (object
                                    (@ (id btn-mount) (class GtkButton))
                                    (property (@ (name label)) Mounten)
                                    (layout
                                     (property (@ (name column)) 1)
                                     (property (@ (name row)) 0)))))))))
                           (define provider
                             (make <gtk-css-provider>))
                           (define (mount-all)
                             (gtk-css-provider-load-from-string provider "\
.reddable label {
  background-color: red;
}
")
                             (unless (= 0 (system "\
sudo /run/privileged/bin/mount \
/dev/disk/by-id/usb-WD_Elements_25A3_574343374B31544434313530-0:0-part1 \
/media/WDElements/"))
                               (gtk-style-context-add-provider-for-display
                                (gdk-display-get-default)
                                provider
                                100)))
                           (define (activate app)
                             (let ((builder (make <gtk-builder>)))
                               (define (get str)
                                 (get-object builder str))
                               (add-from-string builder
                                                (with-output-to-string
                                                  (lambda ()
                                                    (sxml->xml ui)))
                                                -1)
                               (let ((window (get "window"))
                                     (btn-kodi (get "btn-kodi"))
                                     (btn-mount (get "btn-mount"))
                                     (btn-halt (get "btn-halt"))
                                     (btn-reboot (get "btn-reboot")))
                                 (connect btn-kodi 'clicked
                                          (lambda (b)
                                            (gtk-widget-hide window)
                                            (system
                                             (string-append "\
/var/guix/profiles/per-user/florian/current-guix/bin/guix \
shell --container --network --no-cwd flatpak \
--expose=/home/user/.local/share/flatpak/ \
--share=/home/user/you-kodi/.kodi=/home/user/.var/app/tv.kodi.Kodi/data \
--expose=/sys \
--preserve='^DBUS_.*' \
--share=/media/WDElements \
--expose=/dev/dri --expose=" "/run/user/1001";(getenv "XDG_RUNTIME_DIR")
"/bus=/var/run/dbus/system_bus_socket --expose=/dev/dri --expose=/dev/snd \
--preserve='^DISPLAY$' -- flatpak run -v tv.kodi.Kodi --audio-backend=alsa"))
                                            (present window)))
                                 (connect btn-mount 'clicked
                                          (lambda (b)
                                            (mount-all)))
                                 (add-css-class btn-mount "reddable")
                                 (connect btn-halt 'clicked
                                          (lambda (b)
                                            (system "\
sudo /run/current-system/profile/sbin/halt")))
                                 (connect btn-reboot 'clicked
                                          (lambda (b)
                                            (system "\
sudo /run/current-system/profile/sbin/reboot")))
                                 (add-window app window)
                                 (present window))))
                           (let ((app (make <gtk-application>
                                        #:application-id "my.launcher")))
                             (mount-all)
                             (connect app 'activate activate)
                             (let ((status (g-application-run app '())))
                               (exit status status)))))
                    " 2>&1 | tee /home/user/errors"))))))
         (simple-service 'gtk-config-service
                         home-xdg-configuration-files-service-type
                         `(("gtk-4.0/settings.ini" ,(mixed-text-file
                                                     "gtk-config"
                                                     "\
[Settings]
gtk-xft-dpi=500000
")))))))

Reply via email to