From 82c9af346cc453a2fc94d5acad83a45c1de3c362 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 9 Aug 2021 11:25:41 -0400 Subject: [PATCH] Kiosk Session - Support systemd --user sessions - Add script-session subpackage Related: #1965338 --- ...ositor-Support-systemd-user-sessions.patch | 429 ++++++++++++++++++ ...a-script-for-simplifying-kiosk-setup.patch | 309 +++++++++++++ gnome-kiosk.spec | 33 +- 3 files changed, 770 insertions(+), 1 deletion(-) create mode 100644 0001-compositor-Support-systemd-user-sessions.patch create mode 100644 0002-Add-a-script-for-simplifying-kiosk-setup.patch diff --git a/0001-compositor-Support-systemd-user-sessions.patch b/0001-compositor-Support-systemd-user-sessions.patch new file mode 100644 index 0000000..b9823c8 --- /dev/null +++ b/0001-compositor-Support-systemd-user-sessions.patch @@ -0,0 +1,429 @@ +From 00aa37d927c3fd24769bd5c68a8a1ddc9acfb7bd Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 6 Aug 2021 17:51:14 -0400 +Subject: [PATCH 1/2] compositor: Support systemd --user sessions + +This commit adds unit files for supporting starting org.gnome.Kiosk +from systemd --user. +--- + compositor/data/org.gnome.Kiosk.desktop.in.in | 1 + + .../data/systemd/org.gnome.Kiosk.target | 10 ++++++++ + .../org.gnome.Kiosk@wayland.service.in | 20 ++++++++++++++++ + .../systemd/org.gnome.Kiosk@x11.service.in | 20 ++++++++++++++++ + compositor/kiosk-compositor.c | 10 ++++++++ + meson.build | 24 +++++++++++++++++++ + 6 files changed, 85 insertions(+) + create mode 100644 compositor/data/systemd/org.gnome.Kiosk.target + create mode 100644 compositor/data/systemd/org.gnome.Kiosk@wayland.service.in + create mode 100644 compositor/data/systemd/org.gnome.Kiosk@x11.service.in + +diff --git a/compositor/data/org.gnome.Kiosk.desktop.in.in b/compositor/data/org.gnome.Kiosk.desktop.in.in +index bb603c8..cdbbe6a 100644 +--- a/compositor/data/org.gnome.Kiosk.desktop.in.in ++++ b/compositor/data/org.gnome.Kiosk.desktop.in.in +@@ -1,12 +1,13 @@ + [Desktop Entry] + Type=Application + Name=GNOME Kiosk + Comment=Compositor for Kiosk and Single Application deployments + Exec=@bindir@/gnome-kiosk + Categories=GNOME;GTK;Core;System; + OnlyShowIn=GNOME; + NoDisplay=true + X-GNOME-Autostart-Phase=DisplayServer + X-GNOME-Provides=panel;windowmanager; + X-GNOME-Autostart-Notify=true + X-GNOME-AutoRestart=false ++X-GNOME-HiddenUnderSystemd=true +diff --git a/compositor/data/systemd/org.gnome.Kiosk.target b/compositor/data/systemd/org.gnome.Kiosk.target +new file mode 100644 +index 0000000..eb92b4a +--- /dev/null ++++ b/compositor/data/systemd/org.gnome.Kiosk.target +@@ -0,0 +1,10 @@ ++[Unit] ++Description=GNOME Kiosk ++DefaultDependencies=no ++ ++Requisite=gnome-session-initialized.target ++PartOf=gnome-session-initialized.target ++Before=gnome-session-initialized.target ++ ++Wants=org.gnome.Kiosk@wayland.service ++Wants=org.gnome.Kiosk@x11.service +diff --git a/compositor/data/systemd/org.gnome.Kiosk@wayland.service.in b/compositor/data/systemd/org.gnome.Kiosk@wayland.service.in +new file mode 100644 +index 0000000..19cd4a0 +--- /dev/null ++++ b/compositor/data/systemd/org.gnome.Kiosk@wayland.service.in +@@ -0,0 +1,20 @@ ++[Unit] ++Description=GNOME Kiosk on Wayland ++OnFailure=gnome-session-shutdown.target ++OnFailureJobMode=replace-irreversibly ++CollectMode=inactive-or-failed ++RefuseManualStart=on ++RefuseManualStop=on ++After=gnome-session-manager.target ++Requisite=gnome-session-initialized.target ++PartOf=gnome-session-initialized.target ++Before=gnome-session-initialized.target ++ConditionEnvironment=XDG_SESSION_TYPE=%I ++ ++[Service] ++Slice=session.slice ++Type=notify ++ExecStart=/usr/bin/gnome-kiosk ++ExecStopPost=-/bin/sh -c 'test "$SERVICE_RESULT" != "exec-condition" && systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY' ++Restart=no ++TimeoutStopSec=5 +diff --git a/compositor/data/systemd/org.gnome.Kiosk@x11.service.in b/compositor/data/systemd/org.gnome.Kiosk@x11.service.in +new file mode 100644 +index 0000000..291baaa +--- /dev/null ++++ b/compositor/data/systemd/org.gnome.Kiosk@x11.service.in +@@ -0,0 +1,20 @@ ++[Unit] ++Description=GNOME Kiosk on X11 ++OnFailure=gnome-session-failed.target ++OnFailureJobMode=replace ++CollectMode=inactive-or-failed ++RefuseManualStart=on ++RefuseManualStop=on ++After=gnome-session-manager.target ++Requisite=gnome-session-initialized.target ++PartOf=gnome-session-initialized.target ++Before=gnome-session-initialized.target ++ConditionEnvironment=XDG_SESSION_TYPE=%I ++ ++[Service] ++Slice=session.slice ++Type=notify ++ExecStart=/usr/bin/gnome-kiosk ++Restart=always ++RestartSec=0ms ++TimeoutStopSec=5 +diff --git a/compositor/kiosk-compositor.c b/compositor/kiosk-compositor.c +index 6753a87..43329c7 100644 +--- a/compositor/kiosk-compositor.c ++++ b/compositor/kiosk-compositor.c +@@ -1,46 +1,48 @@ + #include "config.h" + #include "kiosk-compositor.h" + + #include + #include + + #include + + #include + #include + #include + #include + #include + #include + #include + ++#include ++ + #include "kiosk-backgrounds.h" + #include "kiosk-input-sources-manager.h" + #include "kiosk-service.h" + + #include "org.gnome.DisplayManager.Manager.h" + + struct _KioskCompositor + { + MetaPlugin parent; + + /* weak references */ + MetaDisplay *display; + ClutterBackend *backend; + ClutterActor *stage; + + /* strong references */ + GCancellable *cancellable; + KioskBackgrounds *backgrounds; + KioskInputSourcesManager *input_sources_manager; + KioskService *service; + }; + + enum { + X_SERVER_EVENT, + NUMBER_OF_SIGNALS + }; + + static guint signals [NUMBER_OF_SIGNALS] = { 0, }; + + G_DEFINE_TYPE (KioskCompositor, kiosk_compositor, META_TYPE_PLUGIN) +@@ -85,66 +87,74 @@ register_with_display_manager (KioskCompositor *self) + } + + display_manager = gdm_manager_proxy_new_sync (system_bus, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/Manager", + self->cancellable, + &error); + + if (error != NULL) { + g_debug ("KioskCompositor: Could not contact display manager: %s", + error->message); + return; + } + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}")); + + gdm_manager_call_register_display_sync (display_manager, + g_variant_builder_end (&builder), + self->cancellable, + &error); + + if (error != NULL) { + g_debug ("KioskCompositor: Could not register with display manager: %s", + error->message); + return; + } + } + ++static void ++register_with_systemd (KioskCompositor *self) ++{ ++ sd_notify (TRUE, "READY=1"); ++} ++ + static void + register_session (KioskCompositor *self) + { + meta_register_with_session (); + + register_with_display_manager (self); ++ ++ register_with_systemd (self); + } + + static void + kiosk_compositor_start (MetaPlugin *plugin) + { + KioskCompositor *self = KIOSK_COMPOSITOR (plugin); + g_autoptr (GError) error = NULL; + + g_set_weak_pointer (&self->display, meta_plugin_get_display (META_PLUGIN (self))); + g_set_weak_pointer (&self->backend, clutter_get_default_backend ()); + g_set_weak_pointer (&self->stage, meta_get_stage_for_display (self->display)); + + clutter_actor_show (self->stage); + + self->cancellable = g_cancellable_new (); + + self->service = kiosk_service_new (self); + kiosk_service_start (self->service, &error); + + if (error != NULL) { + g_debug ("KioskCompositor: Could not start D-Bus service: %s", error->message); + g_clear_error (&error); + } + + self->backgrounds = kiosk_backgrounds_new (self); + self->input_sources_manager = kiosk_input_sources_manager_new (self); + + register_session (self); + } + +diff --git a/meson.build b/meson.build +index 0766f8d..c2988ad 100644 +--- a/meson.build ++++ b/meson.build +@@ -9,60 +9,64 @@ c_compiler = meson.get_compiler('c') + + gnome = import('gnome') + i18n = import('i18n') + + prefix = get_option('prefix') + datadir = join_paths(prefix, get_option('datadir')) + bindir = join_paths(prefix, get_option('bindir')) + localedir = join_paths(datadir, 'locale') + desktop_data_dir = join_paths(datadir, 'applications') + session_dir = join_paths(datadir, 'gnome-session', 'sessions') + xsessions_dir = join_paths(datadir, 'xsessions') + + po_dir = join_paths(meson.current_source_dir(), 'po') + + config_data = configuration_data() + config_data.set_quoted('GETTEXT_PACKAGE', meson.project_name()) + config_data.set_quoted('VERSION', meson.project_version()) + config_data.set_quoted('LOCALEDIR', localedir) + + config_h = configure_file( + input: 'config.h.meson', + output: 'config.h', + configuration: config_data + ) + + meson.add_install_script ('meson/postinstall.py') + + mutter_dependency = dependency('libmutter-8') + mutter_libdir = mutter_dependency.get_pkgconfig_variable('typelibdir') + ++systemd_user_unit_dir = dependency('systemd').get_pkgconfig_variable('systemduserunitdir', ++ define_variable: ['prefix', prefix]) ++systemd_dependency = dependency('libsystemd') ++ + dbus_proxies = [] + dbus_proxies += { + 'prefix': 'org.gnome.DisplayManager', + 'namespace': 'Gdm', + 'interface': 'Manager', + } + + dbus_proxies += { + 'prefix': 'org.freedesktop', + 'namespace': 'Sd', + 'interface': 'locale1', + } + + dbus_proxies += { + 'prefix': 'org.gnome', + 'namespace': 'Gsm', + 'interface': 'SessionManager', + } + + dbus_interface_sources_map = {} + foreach dbus_proxy : dbus_proxies + dbus_interface = dbus_proxy['prefix'] + '.' + dbus_proxy['interface'] + dbus_interface_file = join_paths('dbus-interfaces', dbus_interface + '.xml') + sources = gnome.gdbus_codegen(dbus_interface, dbus_interface_file, + namespace: dbus_proxy['namespace'], + interface_prefix: dbus_proxy['prefix'], + ) + dbus_interface_sources_map += { dbus_interface: sources } + endforeach + +@@ -75,103 +79,123 @@ sources = gnome.gdbus_codegen(dbus_interface, dbus_interface_file, + annotations: [ + [ dbus_interface, 'org.gtk.GDBus.C.Name', 'Service' ], + [ dbus_interface + '.InputSources', 'org.gtk.GDBus.C.Name', 'InputSourcesManager' ], + [ dbus_interface + '.InputSources.InputSource', 'org.gtk.GDBus.C.Name', 'InputSource' ], + ] + ) + dbus_interface_sources_map += { dbus_interface: sources } + + dbus_interface = 'org.gnome.Shell' + dbus_interface_file = join_paths('dbus-interfaces', dbus_interface + '.xml') + sources = gnome.gdbus_codegen(dbus_interface, dbus_interface_file, + namespace: 'Kiosk', + interface_prefix: 'org.gnome', + annotations: [ + [ dbus_interface, 'org.gtk.GDBus.C.Name', 'ShellDBusService' ] + ] + ) + dbus_interface_sources_map += { dbus_interface: sources } + + compositor_dependencies = [] + compositor_dependencies += c_compiler.find_library('m') + compositor_dependencies += dependency('gio-2.0') + compositor_dependencies += dependency('glib-2.0') + compositor_dependencies += dependency('gnome-desktop-3.0') + compositor_dependencies += dependency('gobject-2.0') + compositor_dependencies += dependency('ibus-1.0') + compositor_dependencies += dependency('mutter-cogl-8') + compositor_dependencies += dependency('mutter-cogl-pango-8') + compositor_dependencies += dependency('mutter-clutter-8') + compositor_dependencies += mutter_dependency ++compositor_dependencies += systemd_dependency + + compositor_sources = [] + compositor_sources += 'compositor/kiosk-backgrounds.c' + compositor_sources += 'compositor/kiosk-compositor.c' + compositor_sources += 'compositor/kiosk-dbus-utils.c' + compositor_sources += 'compositor/kiosk-gobject-utils.c' + compositor_sources += 'compositor/kiosk-input-sources-manager.c' + compositor_sources += 'compositor/kiosk-input-engine-manager.c' + compositor_sources += 'compositor/kiosk-input-source-group.c' + compositor_sources += 'compositor/kiosk-service.c' + compositor_sources += 'compositor/kiosk-shell-service.c' + compositor_sources += 'compositor/kiosk-x-keyboard-manager.c' + compositor_sources += 'compositor/main.c' + + foreach dbus_interface, sources: dbus_interface_sources_map + compositor_sources += sources + endforeach + + executable('gnome-kiosk', compositor_sources, + dependencies: compositor_dependencies, + build_rpath: mutter_libdir, + install_rpath: mutter_libdir, + install: true + ) + + desktop_config_data = configuration_data() + desktop_config_data.set('bindir', bindir) + + desktop_file = configure_file( + input: 'compositor/data/org.gnome.Kiosk.desktop.in.in', + output: 'org.gnome.Kiosk.desktop.in', + configuration: desktop_config_data + ) + + i18n.merge_file('desktop', + input: desktop_file, + output: 'org.gnome.Kiosk.desktop', + po_dir: po_dir, + install: true, + install_dir: desktop_data_dir, + type: 'desktop' + ) + ++systemd_service_config_data = configuration_data() ++systemd_service_config_data.set('bindir', bindir) ++ ++systemd_service_files = [] ++systemd_service_files += 'compositor/data/systemd/org.gnome.Kiosk@wayland.service.in' ++systemd_service_files += 'compositor/data/systemd/org.gnome.Kiosk@x11.service.in' ++ ++foreach service_file : systemd_service_files ++ configure_file( ++ input: service_file, ++ output: '@BASENAME@', ++ configuration: systemd_service_config_data, ++ install_dir: systemd_user_unit_dir ++ ) ++endforeach ++ ++install_data('compositor/data/systemd/org.gnome.Kiosk.target', ++ install_dir: systemd_user_unit_dir) ++ + session_config_data = configuration_data() + session_config_data.set('required_components', 'org.gnome.Kiosk;org.gnome.Kiosk.SearchApp;') + + session_file = configure_file( + input: 'search-app/org.gnome.Kiosk.SearchApp.session.desktop.in.in', + output: 'org.gnome.Kiosk.SearchApp.session.desktop.in', + configuration: session_config_data + ) + + subdir('input-selector') + + i18n.merge_file('desktop', + input: session_file, + output: 'org.gnome.Kiosk.SearchApp.session', + po_dir: po_dir, + install: true, + install_dir: session_dir, + type: 'desktop' + ) + + i18n.merge_file('desktop', + input: 'search-app/org.gnome.Kiosk.SearchApp.Session.desktop.in', + output: 'org.gnome.Kiosk.SearchApp.Session.desktop', + po_dir: po_dir, + install: true, + install_dir: xsessions_dir, + type: 'desktop' + ) + + search_app_desktop_file = configure_file( +-- +2.31.1 + diff --git a/0002-Add-a-script-for-simplifying-kiosk-setup.patch b/0002-Add-a-script-for-simplifying-kiosk-setup.patch new file mode 100644 index 0000000..7bb444f --- /dev/null +++ b/0002-Add-a-script-for-simplifying-kiosk-setup.patch @@ -0,0 +1,309 @@ +From db768718666563f5ad9658ba4cc07987122b4e89 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 9 Aug 2021 10:30:36 -0400 +Subject: [PATCH 2/2] Add a script for simplifying kiosk setup + +This commit adds a new session "Kiosk Script Session" to the login +screen that starts a shell script that starts a gedit window that opens +the shell script. + +It should make it easy to customize the session to use a bespoke +application from within the session itself. +--- + .../org.gnome.Kiosk.Script.desktop.in.in | 4 ++ + kiosk-script/gnome-kiosk-script | 23 +++++++ + .../gnome-session/gnome-kiosk-script.session | 3 + + .../systemd/org.gnome.Kiosk.Script.service.in | 8 +++ + kiosk-script/systemd/session.conf | 3 + + .../gnome-kiosk-script-wayland.desktop.in | 9 +++ + .../gnome-kiosk-script-xorg.desktop.in | 9 +++ + meson.build | 61 ++++++++++++++++++- + 8 files changed, 118 insertions(+), 2 deletions(-) + create mode 100644 kiosk-script/desktop/org.gnome.Kiosk.Script.desktop.in.in + create mode 100755 kiosk-script/gnome-kiosk-script + create mode 100644 kiosk-script/gnome-session/gnome-kiosk-script.session + create mode 100644 kiosk-script/systemd/org.gnome.Kiosk.Script.service.in + create mode 100644 kiosk-script/systemd/session.conf + create mode 100644 kiosk-script/wayland-sessions/gnome-kiosk-script-wayland.desktop.in + create mode 100644 kiosk-script/xsessions/gnome-kiosk-script-xorg.desktop.in + +diff --git a/kiosk-script/desktop/org.gnome.Kiosk.Script.desktop.in.in b/kiosk-script/desktop/org.gnome.Kiosk.Script.desktop.in.in +new file mode 100644 +index 0000000..dd562b2 +--- /dev/null ++++ b/kiosk-script/desktop/org.gnome.Kiosk.Script.desktop.in.in +@@ -0,0 +1,4 @@ ++[Desktop Entry] ++Name=Kiosk Script ++Type=Application ++Exec=gnome-kiosk-script +diff --git a/kiosk-script/gnome-kiosk-script b/kiosk-script/gnome-kiosk-script +new file mode 100755 +index 0000000..b595cd8 +--- /dev/null ++++ b/kiosk-script/gnome-kiosk-script +@@ -0,0 +1,23 @@ ++#!/usr/bin/sh ++ ++if [ ! -e ~/.local/bin/gnome-kiosk-script ]; then ++ mkdir -p ~/.local/bin ~/.config ++ cat > ~/.local/bin/gnome-kiosk-script <<- "EOF" ++ #!/bin/sh ++ # This script is located in ~/.local/bin. ++ # It's provided as an example script to show how ++ # the kiosk session works. At the moment, the script ++ # just starts a text editor open to itself, but it ++ # should get customized to instead start a full screen ++ # application designed for the kiosk deployment. ++ gedit ~/.local/bin/gnome-kiosk-script ++ ++ sleep 1.0 ++ exec "$0" "$@" ++EOF ++ ++ chmod +x ~/.local/bin/gnome-kiosk-script ++ touch ~/.config/gnome-initial-setup-done ++fi ++ ++exec ~/.local/bin/gnome-kiosk-script "$@" +diff --git a/kiosk-script/gnome-session/gnome-kiosk-script.session b/kiosk-script/gnome-session/gnome-kiosk-script.session +new file mode 100644 +index 0000000..3b2cc7b +--- /dev/null ++++ b/kiosk-script/gnome-session/gnome-kiosk-script.session +@@ -0,0 +1,3 @@ ++[GNOME Session] ++Name=Kiosk ++RequiredComponents=org.gnome.Kiosk;org.gnome.Kiosk.Script; +diff --git a/kiosk-script/systemd/org.gnome.Kiosk.Script.service.in b/kiosk-script/systemd/org.gnome.Kiosk.Script.service.in +new file mode 100644 +index 0000000..8194f1c +--- /dev/null ++++ b/kiosk-script/systemd/org.gnome.Kiosk.Script.service.in +@@ -0,0 +1,8 @@ ++[Unit] ++Description=Kiosk script ++BindsTo=gnome-session.target ++After=gnome-session.target ++ ++[Service] ++ExecStart=@bindir@/gnome-kiosk-script ++Restart=always +diff --git a/kiosk-script/systemd/session.conf b/kiosk-script/systemd/session.conf +new file mode 100644 +index 0000000..a948efb +--- /dev/null ++++ b/kiosk-script/systemd/session.conf +@@ -0,0 +1,3 @@ ++[Unit] ++Requires=org.gnome.Kiosk.target ++Requires=org.gnome.Kiosk.Script.service +diff --git a/kiosk-script/wayland-sessions/gnome-kiosk-script-wayland.desktop.in b/kiosk-script/wayland-sessions/gnome-kiosk-script-wayland.desktop.in +new file mode 100644 +index 0000000..05e8dea +--- /dev/null ++++ b/kiosk-script/wayland-sessions/gnome-kiosk-script-wayland.desktop.in +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Name=Kiosk Script Session (Wayland Display Server) ++Comment=This session logs you into the sessoin started by ~/.local/bin/gnome-kiosk-script ++Exec=gnome-session --session gnome-kiosk-script ++TryExec=gnome-session ++Type=Application ++DesktopNames=GNOME-Kiosk;GNOME; ++X-GDM-SessionRegisters=true ++ +diff --git a/kiosk-script/xsessions/gnome-kiosk-script-xorg.desktop.in b/kiosk-script/xsessions/gnome-kiosk-script-xorg.desktop.in +new file mode 100644 +index 0000000..11dc0cf +--- /dev/null ++++ b/kiosk-script/xsessions/gnome-kiosk-script-xorg.desktop.in +@@ -0,0 +1,9 @@ ++[Desktop Entry] ++Name=Kiosk Script Session (X11 Display Server) ++Comment=This session logs you into the sessoin started by ~/.local/bin/gnome-kiosk-script ++Exec=gnome-session --session gnome-kiosk-script ++TryExec=gnome-session ++Type=Application ++DesktopNames=GNOME-Kiosk;GNOME; ++X-GDM-SessionRegisters=true ++ +diff --git a/meson.build b/meson.build +index c2988ad..1f5a756 100644 +--- a/meson.build ++++ b/meson.build +@@ -1,49 +1,50 @@ + project('gnome-kiosk', 'c', + version: '40.0' + ) + add_project_arguments('-D_GNU_SOURCE', + language: 'c' + ) + + c_compiler = meson.get_compiler('c') + + gnome = import('gnome') + i18n = import('i18n') + + prefix = get_option('prefix') + datadir = join_paths(prefix, get_option('datadir')) + bindir = join_paths(prefix, get_option('bindir')) + localedir = join_paths(datadir, 'locale') + desktop_data_dir = join_paths(datadir, 'applications') + session_dir = join_paths(datadir, 'gnome-session', 'sessions') + xsessions_dir = join_paths(datadir, 'xsessions') ++wayland_sessions_dir = join_paths(datadir, 'wayland-sessions') + + po_dir = join_paths(meson.current_source_dir(), 'po') + + config_data = configuration_data() + config_data.set_quoted('GETTEXT_PACKAGE', meson.project_name()) + config_data.set_quoted('VERSION', meson.project_version()) + config_data.set_quoted('LOCALEDIR', localedir) + + config_h = configure_file( + input: 'config.h.meson', + output: 'config.h', + configuration: config_data + ) + + meson.add_install_script ('meson/postinstall.py') + + mutter_dependency = dependency('libmutter-8') + mutter_libdir = mutter_dependency.get_pkgconfig_variable('typelibdir') + + systemd_user_unit_dir = dependency('systemd').get_pkgconfig_variable('systemduserunitdir', + define_variable: ['prefix', prefix]) + systemd_dependency = dependency('libsystemd') + + dbus_proxies = [] + dbus_proxies += { + 'prefix': 'org.gnome.DisplayManager', + 'namespace': 'Gdm', + 'interface': 'Manager', + } + +@@ -139,62 +140,118 @@ desktop_file = configure_file( + input: 'compositor/data/org.gnome.Kiosk.desktop.in.in', + output: 'org.gnome.Kiosk.desktop.in', + configuration: desktop_config_data + ) + + i18n.merge_file('desktop', + input: desktop_file, + output: 'org.gnome.Kiosk.desktop', + po_dir: po_dir, + install: true, + install_dir: desktop_data_dir, + type: 'desktop' + ) + + systemd_service_config_data = configuration_data() + systemd_service_config_data.set('bindir', bindir) + + systemd_service_files = [] + systemd_service_files += 'compositor/data/systemd/org.gnome.Kiosk@wayland.service.in' + systemd_service_files += 'compositor/data/systemd/org.gnome.Kiosk@x11.service.in' + + foreach service_file : systemd_service_files + configure_file( + input: service_file, + output: '@BASENAME@', + configuration: systemd_service_config_data, + install_dir: systemd_user_unit_dir + ) + endforeach + +-install_data('compositor/data/systemd/org.gnome.Kiosk.target', +- install_dir: systemd_user_unit_dir) ++install_data( ++ 'compositor/data/systemd/org.gnome.Kiosk.target', ++ install_dir: systemd_user_unit_dir ++) ++ ++install_data('kiosk-script/gnome-kiosk-script', ++ install_dir: bindir, ++ install_mode: 'rwxr-xr-x' ++) ++ ++desktop_file = configure_file( ++ input: 'kiosk-script/desktop/org.gnome.Kiosk.Script.desktop.in.in', ++ output: 'org.gnome.Kiosk.Script.desktop.in', ++ configuration: desktop_config_data ++) ++ ++i18n.merge_file('desktop', ++ input: desktop_file, ++ output: 'org.gnome.Kiosk.Script.desktop', ++ po_dir: po_dir, ++ install: true, ++ install_dir: desktop_data_dir, ++ type: 'desktop' ++) ++ ++configure_file( ++ input: 'kiosk-script/systemd/org.gnome.Kiosk.Script.service.in', ++ output: '@BASENAME@', ++ configuration: systemd_service_config_data, ++ install_dir: systemd_user_unit_dir ++) ++ ++kiosk_script_systemd_target_dir = join_paths(systemd_user_unit_dir, 'gnome-session@gnome-kiosk-script.target.d') ++install_data('kiosk-script/systemd/session.conf', ++ install_dir: kiosk_script_systemd_target_dir ++) ++ ++install_data('kiosk-script/gnome-session/gnome-kiosk-script.session', ++ install_dir: session_dir, ++) ++ ++i18n.merge_file('desktop', ++ input: 'kiosk-script/xsessions/gnome-kiosk-script-xorg.desktop.in', ++ output: '@BASENAME@', ++ po_dir: po_dir, ++ install: true, ++ install_dir: xsessions_dir, ++ type: 'desktop' ++) ++ ++i18n.merge_file('desktop', ++ input: 'kiosk-script/wayland-sessions/gnome-kiosk-script-wayland.desktop.in', ++ output: '@BASENAME@', ++ po_dir: po_dir, ++ install: true, ++ install_dir: wayland_sessions_dir, ++ type: 'desktop' ++) + + session_config_data = configuration_data() + session_config_data.set('required_components', 'org.gnome.Kiosk;org.gnome.Kiosk.SearchApp;') + + session_file = configure_file( + input: 'search-app/org.gnome.Kiosk.SearchApp.session.desktop.in.in', + output: 'org.gnome.Kiosk.SearchApp.session.desktop.in', + configuration: session_config_data + ) + + subdir('input-selector') + + i18n.merge_file('desktop', + input: session_file, + output: 'org.gnome.Kiosk.SearchApp.session', + po_dir: po_dir, + install: true, + install_dir: session_dir, + type: 'desktop' + ) + + i18n.merge_file('desktop', + input: 'search-app/org.gnome.Kiosk.SearchApp.Session.desktop.in', + output: 'org.gnome.Kiosk.SearchApp.Session.desktop', + po_dir: po_dir, + install: true, + install_dir: xsessions_dir, + type: 'desktop' + ) + +-- +2.31.1 + diff --git a/gnome-kiosk.spec b/gnome-kiosk.spec index 59c8c8f..4d3b6e6 100644 --- a/gnome-kiosk.spec +++ b/gnome-kiosk.spec @@ -12,7 +12,7 @@ Name: gnome-kiosk Version: 40.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Window management and application launching for GNOME License: GPLv2+ @@ -39,6 +39,9 @@ BuildRequires: meson Requires: gnome-settings-daemon%{?_isa} >= %{gnome_settings_daemon_version} Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version} +Patch10001: 0001-compositor-Support-systemd-user-sessions.patch +Patch10002: 0002-Add-a-script-for-simplifying-kiosk-setup.patch + %description GNOME Kiosk provides a desktop enviroment suitable for fixed purpose, or single application deployments like wall displays and point-of-sale systems. @@ -54,6 +57,17 @@ BuildArch: noarch %description search-appliance This package provides a full screen firefox window pointed to google. +%package script-session +Summary: Basic session used for running kiosk application from shell script +License: GPLv2+ +Requires: %{name} = %{version}-%{release} +Recommends: gedit +Requires: gnome-session +BuildArch: noarch + +%description script-session +This package generates a shell script and the necessary scaffolding to start that shell script within a kiosk session. + %prep %autosetup -S git -n %{name}-%{tarball_version} @@ -73,6 +87,18 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.Searc %doc README.md %{_bindir}/gnome-kiosk %{_datadir}/applications/org.gnome.Kiosk.desktop +%{_userunitdir}/org.gnome.Kiosk.target +%{_userunitdir}/org.gnome.Kiosk@wayland.service +%{_userunitdir}/org.gnome.Kiosk@x11.service + +%files -n gnome-kiosk-script-session +%{_bindir}/gnome-kiosk-script +%{_userunitdir}/gnome-session@gnome-kiosk-script.target.d/session.conf +%{_userunitdir}/org.gnome.Kiosk.Script.service +%{_datadir}/applications/org.gnome.Kiosk.Script.desktop +%{_datadir}/gnome-session/sessions/gnome-kiosk-script.session +%{_datadir}/wayland-sessions/gnome-kiosk-script-wayland.desktop +%{_datadir}/xsessions/gnome-kiosk-script-xorg.desktop %files -n gnome-kiosk-search-appliance %{_datadir}/applications/org.gnome.Kiosk.SearchApp.desktop @@ -81,6 +107,11 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.Searc %{_datadir}/wayland-sessions/org.gnome.Kiosk.SearchApp.Session.desktop %changelog +* Fri Aug 06 2021 Ray Strode - 40.0-2 +- Support systemd --user sessions +- Add script-session subpackage + Related: #1965338 + * Mon May 17 2021 Ray Strode - 40.0-1 - Update to 40.0 Related: #1950042