Initial import

Resolves: #1950042
This commit is contained in:
Ray Strode 2021-04-19 16:56:00 -04:00
parent e03eb8aaea
commit 90f8237c97
9 changed files with 2184 additions and 0 deletions

1
.gitignore vendored
View File

@ -0,0 +1 @@
/gnome-kiosk-40.alpha.tar.xz

View File

@ -0,0 +1,229 @@
From 6b1fa184af2a847d8b3d74a09bb65af6803d4e6d Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 15 Apr 2021 13:28:00 -0400
Subject: [PATCH 1/4] compositor: Add signal for reporting X server events
The keyboard layout handling code currently doesn't notice
when the keyboard layout is changed using libxklavier, out from
under it.
As a first step toward fixing that problem, this commit adds a
new signal "x-server-event" to KioskCompositor, so that the
InputSourcesManager can watch for root window property changes.
---
compositor/kiosk-compositor.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/compositor/kiosk-compositor.c b/compositor/kiosk-compositor.c
index dad7776..14f5de3 100644
--- a/compositor/kiosk-compositor.c
+++ b/compositor/kiosk-compositor.c
@@ -9,60 +9,67 @@
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <meta/common.h>
#include <meta/display.h>
#include <meta/main.h>
#include <meta/util.h>
#include <meta/meta-window-group.h>
#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)
static void kiosk_compositor_dispose (GObject *object);
static void
kiosk_compositor_dispose (GObject *object)
{
KioskCompositor *self = KIOSK_COMPOSITOR (object);
if (self->cancellable != NULL) {
g_cancellable_cancel (self->cancellable);
g_clear_object (&self->cancellable);
}
g_clear_weak_pointer (&self->stage);
g_clear_weak_pointer (&self->display);
g_clear_weak_pointer (&self->backend);
g_clear_object (&self->backgrounds);
G_OBJECT_CLASS (kiosk_compositor_parent_class)->dispose (object);
}
static void
register_with_display_manager (KioskCompositor *self)
{
g_autoptr (GDBusConnection) system_bus = NULL;
g_autoptr (GdmManager) display_manager = NULL;
GVariantBuilder builder;
g_autoptr (GError) error = NULL;
@@ -329,62 +336,64 @@ kiosk_compositor_show_tile_preview (MetaPlugin *plugin,
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->show_tile_preview == NULL);
}
static void
kiosk_compositor_hide_tile_preview (MetaPlugin *plugin)
{
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->hide_tile_preview == NULL);
}
static void
kiosk_compositor_show_window_menu (MetaPlugin *plugin,
MetaWindow *window,
MetaWindowMenuType menu,
int x,
int y)
{
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->show_window_menu == NULL);
}
static void
kiosk_compositor_show_window_menu_for_rect (MetaPlugin *plugin,
MetaWindow *window,
MetaWindowMenuType menu,
MetaRectangle *rect)
{
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->show_window_menu_for_rect == NULL);
}
static gboolean
kiosk_compositor_xevent_filter (MetaPlugin *plugin,
- XEvent *xev)
+ XEvent *x_server_event)
{
+ KioskCompositor *self = KIOSK_COMPOSITOR (plugin);
+ g_signal_emit (G_OBJECT (self), signals[X_SERVER_EVENT], 0, x_server_event);
return FALSE;
}
static gboolean
kiosk_compositor_keybinding_filter (MetaPlugin *plugin,
MetaKeyBinding *binding)
{
return FALSE;
}
static void
kiosk_compositor_confirm_display_change (MetaPlugin *plugin)
{
KioskCompositor *self = KIOSK_COMPOSITOR (plugin);
meta_plugin_complete_display_change (META_PLUGIN (self), TRUE);
}
static const MetaPluginInfo info = {
.name = "GNOME Kiosk",
.version = VERSION,
.author = "Various",
.license = "GPLv2+",
.description = "Provides Kiosk compositor plugin for mutter"
};
static const MetaPluginInfo *
kiosk_compositor_plugin_info (MetaPlugin *plugin)
{
@@ -420,60 +429,71 @@ kiosk_compositor_class_init (KioskCompositorClass *compositor_class)
plugin_class->start = kiosk_compositor_start;
plugin_class->map = kiosk_compositor_map;
plugin_class->minimize = kiosk_compositor_minimize;
plugin_class->unminimize = kiosk_compositor_unminimize;
plugin_class->size_changed = kiosk_compositor_size_changed;
plugin_class->size_change = kiosk_compositor_size_change;
plugin_class->destroy = kiosk_compositor_destroy;
plugin_class->switch_workspace = kiosk_compositor_switch_workspace;
plugin_class->kill_window_effects = kiosk_compositor_kill_window_effects;
plugin_class->kill_switch_workspace = kiosk_compositor_kill_switch_workspace;
plugin_class->show_tile_preview = kiosk_compositor_show_tile_preview;
plugin_class->hide_tile_preview = kiosk_compositor_hide_tile_preview;
plugin_class->show_window_menu = kiosk_compositor_show_window_menu;
plugin_class->show_window_menu_for_rect = kiosk_compositor_show_window_menu_for_rect;
plugin_class->xevent_filter = kiosk_compositor_xevent_filter;
plugin_class->keybinding_filter = kiosk_compositor_keybinding_filter;
plugin_class->confirm_display_change = kiosk_compositor_confirm_display_change;
plugin_class->plugin_info = kiosk_compositor_plugin_info;
plugin_class->create_close_dialog = kiosk_compositor_create_close_dialog;
plugin_class->create_inhibit_shortcuts_dialog = kiosk_compositor_create_inhibit_shortcuts_dialog;
plugin_class->locate_pointer = kiosk_compositor_locate_pointer;
+
+ signals [X_SERVER_EVENT] =
+ g_signal_new ("x-server-event",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1, G_TYPE_POINTER);
}
static void
kiosk_compositor_init (KioskCompositor *compositor)
{
g_debug ("KioskCompositor: Initializing");
}
KioskBackgrounds *
kiosk_compositor_get_backgrounds (KioskCompositor *self)
{
g_return_val_if_fail (KIOSK_IS_COMPOSITOR (self), NULL);
return KIOSK_BACKGROUNDS (self->backgrounds);
}
KioskInputSourcesManager *
kiosk_compositor_get_input_sources_manager (KioskCompositor *self)
{
g_return_val_if_fail (KIOSK_IS_COMPOSITOR (self), NULL);
return KIOSK_INPUT_SOURCES_MANAGER (self->input_sources_manager);
}
KioskService *
kiosk_compositor_get_service (KioskCompositor *self)
{
g_return_val_if_fail (KIOSK_IS_COMPOSITOR (self), NULL);
return KIOSK_SERVICE (self->service);
--
2.31.1

View File

@ -0,0 +1,228 @@
From 7ea1746494f0b2e381fe8f08249f7751cd8ae578 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 15 Apr 2021 13:00:16 -0400
Subject: [PATCH] compositor: Be less aggressive about full screening windows
It's common for kiosk type applications to have dialogs and utility
windows that shouldn't get fullscreen.
This commit tries to be a little less aggressive above fullscreening
windows. Now we assume only the first window is "the application" and
subsequent windows are auxillary and should be layered on top.
---
compositor/kiosk-compositor.c | 78 +++++++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 8 deletions(-)
diff --git a/compositor/kiosk-compositor.c b/compositor/kiosk-compositor.c
index b3cd10f..dad7776 100644
--- a/compositor/kiosk-compositor.c
+++ b/compositor/kiosk-compositor.c
@@ -1,43 +1,45 @@
#include "config.h"
#include "kiosk-compositor.h"
#include <stdlib.h>
#include <string.h>
#include <glib-object.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
+#include <meta/common.h>
#include <meta/display.h>
#include <meta/main.h>
#include <meta/util.h>
+#include <meta/meta-window-group.h>
#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;
};
G_DEFINE_TYPE (KioskCompositor, kiosk_compositor, META_TYPE_PLUGIN)
static void kiosk_compositor_dispose (GObject *object);
static void
kiosk_compositor_dispose (GObject *object)
{
@@ -143,91 +145,151 @@ static void
kiosk_compositor_minimize (MetaPlugin *plugin,
MetaWindowActor *actor)
{
meta_plugin_minimize_completed (plugin, actor);
}
static void
kiosk_compositor_unminimize (MetaPlugin *plugin,
MetaWindowActor *actor)
{
meta_plugin_unminimize_completed (plugin, actor);
}
static void
kiosk_compositor_size_changed (MetaPlugin *plugin,
MetaWindowActor *actor)
{
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->size_changed == NULL);
}
static void
kiosk_compositor_size_change (MetaPlugin *plugin,
MetaWindowActor *actor,
MetaSizeChange which_change,
MetaRectangle *old_frame_rect,
MetaRectangle *old_buffer_rect)
{
g_assert (META_PLUGIN_CLASS (kiosk_compositor_parent_class)->size_change == NULL);
}
+static gboolean
+kiosk_compositor_wants_window_fullscreen (KioskCompositor *self,
+ MetaWindow *window)
+{
+ MetaWindowType window_type;
+ g_autoptr (GList) windows = NULL;
+ GList *node;
+
+ if (!meta_window_allows_resize (window)) {
+ g_debug ("KioskCompositor: Window does not allow resizes");
+ return FALSE;
+ }
+
+ if (meta_window_is_override_redirect (window)) {
+ g_debug ("KioskCompositor: Window is override redirect");
+ return FALSE;
+ }
+
+ window_type = meta_window_get_window_type (window);
+
+ if (window_type != META_WINDOW_NORMAL) {
+ g_debug ("KioskCompositor: Window is not normal");
+ return FALSE;
+ }
+
+ windows = meta_display_get_tab_list (self->display, META_TAB_LIST_NORMAL_ALL, NULL);
+
+ for (node = windows; node != NULL; node = node->next) {
+ MetaWindow *existing_window = node->data;
+
+ if (meta_window_is_fullscreen (existing_window)) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+kiosk_compositor_wants_window_above (KioskCompositor *self,
+ MetaWindow *window)
+{
+ if (meta_window_is_screen_sized (window)) {
+ return FALSE;
+ }
+
+ if (meta_window_is_monitor_sized (window)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static void
on_faded_in (KioskCompositor *self,
ClutterTransition *transition)
{
MetaWindowActor *actor = g_object_get_data (G_OBJECT (transition), "actor");
- MetaWindow *window;
-
- window = meta_window_actor_get_meta_window (actor);
-
- if (!meta_window_allows_resize (window) && !meta_window_is_override_redirect (window)) {
- meta_window_make_above (window);
- }
meta_plugin_map_completed (META_PLUGIN (self), actor);
}
static void
kiosk_compositor_map (MetaPlugin *plugin,
MetaWindowActor *actor)
{
KioskCompositor *self = KIOSK_COMPOSITOR (plugin);
MetaWindow *window;
ClutterTransition *fade_in_transition;
int easing_duration;
window = meta_window_actor_get_meta_window (actor);
- if (meta_window_allows_resize (window)) {
+ if (kiosk_compositor_wants_window_fullscreen (self, window)) {
+ g_debug ("KioskCompositor: Mapping window that does need to be fullscreened");
meta_window_make_fullscreen (window);
easing_duration = 3000;
} else {
+ ClutterActor *window_group;
+
+ g_debug ("KioskCompositor: Mapping window that does not need to be fullscreened");
+ window_group = meta_get_top_window_group_for_display (self->display);
+
+ if (kiosk_compositor_wants_window_above (self, window)) {
+ g_object_ref (G_OBJECT (actor));
+ clutter_actor_remove_child (clutter_actor_get_parent (CLUTTER_ACTOR (actor)), CLUTTER_ACTOR (actor));
+ clutter_actor_add_child (window_group, CLUTTER_ACTOR (actor));
+ clutter_actor_set_child_below_sibling (window_group, CLUTTER_ACTOR (actor), NULL);
+ g_object_unref (G_OBJECT (actor));
+ }
+
easing_duration = 500;
}
clutter_actor_show (self->stage);
clutter_actor_show (CLUTTER_ACTOR (actor));
clutter_actor_set_opacity (CLUTTER_ACTOR (actor), 0);
clutter_actor_save_easing_state (CLUTTER_ACTOR (actor));
clutter_actor_set_easing_duration (CLUTTER_ACTOR (actor), easing_duration);
clutter_actor_set_easing_mode (CLUTTER_ACTOR (actor), CLUTTER_EASE_IN_OUT_QUINT);
clutter_actor_set_opacity (CLUTTER_ACTOR (actor), 255);
fade_in_transition = clutter_actor_get_transition (CLUTTER_ACTOR (actor), "opacity");
clutter_actor_restore_easing_state (CLUTTER_ACTOR (actor));
g_object_set_data (G_OBJECT (fade_in_transition), "actor", actor);
g_signal_connect_object (G_OBJECT (fade_in_transition),
"completed",
G_CALLBACK (on_faded_in),
self,
G_CONNECT_SWAPPED);
}
static void
kiosk_compositor_destroy (MetaPlugin *plugin,
MetaWindowActor *actor)
{
KioskCompositor *self = KIOSK_COMPOSITOR (plugin);
--
2.31.1

View File

@ -0,0 +1,188 @@
From 840bac654aef7aa0e241be8ac0052f5a5c67e4d5 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 15 Apr 2021 14:39:55 -0400
Subject: [PATCH 2/4] input-sources-manager: Fix overzealous rename mistake
At some point during development something called
KioskInputSources got renamed to KioskInputSourceGroup.
Unfortunately, my sed-fu was weak and I renamed things it shouldn't.
This commit fixes the errors.
---
compositor/kiosk-input-sources-manager.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/compositor/kiosk-input-sources-manager.c b/compositor/kiosk-input-sources-manager.c
index 58d7a4c..a1a4cfa 100644
--- a/compositor/kiosk-input-sources-manager.c
+++ b/compositor/kiosk-input-sources-manager.c
@@ -1,60 +1,60 @@
#include "config.h"
#include "kiosk-input-sources-manager.h"
#include <stdlib.h>
#include <string.h>
#include <xkbcommon/xkbcommon.h>
#include <meta/display.h>
#include <meta/keybindings.h>
#include <meta/util.h>
#include <meta/meta-backend.h>
#include <meta/meta-plugin.h>
#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libgnome-desktop/gnome-languages.h>
#include <libgnome-desktop/gnome-xkb-info.h>
#include "org.freedesktop.locale1.h"
#include "kiosk-compositor.h"
#include "kiosk-dbus-utils.h"
#include "kiosk-gobject-utils.h"
#include "kiosk-input-engine-manager.h"
#include "kiosk-input-source-group.h"
#define SD_LOCALE1_BUS_NAME "org.freedesktop.locale1"
#define SD_LOCALE1_OBJECT_PATH "/org/freedesktop/locale1"
-#define KIOSK_INPUT_SOURCE_GROUP_SCHEMA "org.gnome.desktop.input-sources"
-#define KIOSK_INPUT_SOURCE_GROUP_SETTING "sources"
+#define KIOSK_INPUT_SOURCES_SCHEMA "org.gnome.desktop.input-sources"
+#define KIOSK_INPUT_SOURCES_SETTING "sources"
#define KIOSK_INPUT_OPTIONS_SETTING "xkb-options"
#define KIOSK_INPUT_SOURCE_OBJECTS_PATH_PREFIX "/org/gnome/Kiosk/InputSources"
#define KIOSK_KEYBINDINGS_SCHEMA "org.gnome.desktop.wm.keybindings"
#define KIOSK_SWITCH_INPUT_SOURCES_KEYBINDING "switch-input-source"
#define KIOSK_SWITCH_INPUT_SOURCES_BACKWARD_KEYBINDING "switch-input-source-backward"
#define KIOSK_DBUS_INPUT_SOURCES_MANGER_INPUT_SOURCE_INTERFACE "org.gnome.Kiosk.InputSources.InputSource"
struct _KioskInputSourcesManager
{
GObject parent;
/* weak references */
KioskCompositor *compositor;
MetaDisplay *display;
KioskDBusInputSourcesManager *dbus_service;
GDBusObjectManagerServer *dbus_object_manager;
/* strong references */
GCancellable *cancellable;
KioskInputEngineManager *input_engine_manager;
SdLocale1 *locale_proxy;
GnomeXkbInfo *xkb_info;
GSettings *input_sources_settings;
GSettings *key_binding_settings;
GPtrArray *input_source_groups;
/* state */
@@ -913,94 +913,94 @@ kiosk_input_sources_manager_set_input_sources_from_system_configuration (KioskIn
return TRUE;
}
static void
on_session_input_configuration_changed (KioskInputSourcesManager *self)
{
g_debug ("KioskInputSourcesManager: Session input sources configuration changed");
if (self->overriding_configuration) {
g_debug ("KioskInputSourcesManager: Ignoring change, because keymap is overriden");
return;
}
kiosk_input_sources_manager_set_input_sources_from_session_configuration (self);
}
static void
on_session_input_sources_setting_changed (KioskInputSourcesManager *self)
{
kiosk_gobject_utils_queue_defer_callback (G_OBJECT (self),
"[kiosk-input-sources-manager] on_session_input_configuration_changed",
self->cancellable,
KIOSK_OBJECT_CALLBACK (on_session_input_configuration_changed),
NULL);
}
gboolean
kiosk_input_sources_manager_set_input_sources_from_session_configuration (KioskInputSourcesManager *self)
{
- g_autoptr (GVariant) input_source_group = NULL;
+ g_autoptr (GVariant) input_sources = NULL;
g_auto (GStrv) options = NULL;
- gboolean input_source_group_active;
+ gboolean input_sources_active;
g_return_val_if_fail (KIOSK_IS_INPUT_SOURCES_MANAGER (self), FALSE);
g_debug ("KioskInputSourcesManager: Setting input sources from session configuration");
self->overriding_configuration = FALSE;
if (self->input_sources_settings == NULL) {
- self->input_sources_settings = g_settings_new (KIOSK_INPUT_SOURCE_GROUP_SCHEMA);
+ self->input_sources_settings = g_settings_new (KIOSK_INPUT_SOURCES_SCHEMA);
g_signal_connect_object (G_OBJECT (self->input_sources_settings),
- "changed::" KIOSK_INPUT_SOURCE_GROUP_SETTING,
+ "changed::" KIOSK_INPUT_SOURCES_SETTING,
G_CALLBACK (on_session_input_sources_setting_changed),
self,
G_CONNECT_SWAPPED);
g_signal_connect_object (G_OBJECT (self->input_sources_settings),
"changed::" KIOSK_INPUT_OPTIONS_SETTING,
G_CALLBACK (on_session_input_sources_setting_changed),
self,
G_CONNECT_SWAPPED);
}
options = g_settings_get_strv (self->input_sources_settings, KIOSK_INPUT_OPTIONS_SETTING);
- input_source_group = g_settings_get_value (self->input_sources_settings,
- KIOSK_INPUT_SOURCE_GROUP_SETTING);
+ input_sources = g_settings_get_value (self->input_sources_settings,
+ KIOSK_INPUT_SOURCES_SETTING);
- input_source_group_active = kiosk_input_sources_manager_set_input_sources (self, input_source_group, (const char * const *) options);
+ input_sources_active = kiosk_input_sources_manager_set_input_sources (self, input_sources, (const char * const *) options);
- if (!input_source_group_active) {
+ if (!input_sources_active) {
g_debug ("KioskInputSourcesManager: Session has no valid configured input sources");
return kiosk_input_sources_manager_set_input_sources_from_system_configuration (self);
}
return TRUE;
}
gboolean
kiosk_input_sources_manager_set_input_sources_from_locales (KioskInputSourcesManager *self,
const char * const *locales,
const char *options)
{
KioskInputSourceGroup *old_input_source_group;
g_autofree char *old_selected_layout = NULL;
g_autofree char *old_input_engine = NULL;
g_autofree char *locales_string = NULL;
gboolean input_source_group_active;
g_return_val_if_fail (KIOSK_IS_INPUT_SOURCES_MANAGER (self), FALSE);
g_return_val_if_fail (locales != NULL, FALSE);
locales_string = g_strjoinv (",", (GStrv) locales);
g_debug ("KioskInputSourcesManager: Setting keymap from locales '%s'",
locales_string);
self->overriding_configuration = TRUE;
old_input_source_group = kiosk_input_sources_manager_get_selected_input_source_group (self);
--
2.31.1

View File

@ -0,0 +1,219 @@
From b321b57e2908fddcde9da31e0d71af54c3e2cd98 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 15 Apr 2021 14:41:41 -0400
Subject: [PATCH 3/4] input-sources-manager: Add function to load input sources
from strings
kiosk_input_sources_manager_set_input_sources_from_system_settings
currently has code to load fetch the strings from localed and then
use them.
This commit moves the "use them" part to its own function so it can
be reused in a subsequent commit for something else.
---
compositor/kiosk-input-sources-manager.c | 73 ++++++++++++++++--------
1 file changed, 48 insertions(+), 25 deletions(-)
diff --git a/compositor/kiosk-input-sources-manager.c b/compositor/kiosk-input-sources-manager.c
index a1a4cfa..4b4ef62 100644
--- a/compositor/kiosk-input-sources-manager.c
+++ b/compositor/kiosk-input-sources-manager.c
@@ -793,147 +793,170 @@ kiosk_input_sources_manager_add_layout (KioskInputSourcesManager *self,
input_source_group = kiosk_input_sources_manager_add_new_input_source_group (self, options);
}
mapping_full = !kiosk_input_source_group_add_layout (input_source_group, xkb_layout, xkb_variant);
if (mapping_full) {
g_debug ("KioskInputSourcesManager: Keyboard mapping full, starting another one");
input_source_group = kiosk_input_sources_manager_add_new_input_source_group (self, options);
kiosk_input_source_group_add_layout (input_source_group, xkb_layout, xkb_variant);
}
}
void
kiosk_input_sources_manager_add_input_engine (KioskInputSourcesManager *self,
const char *engine_name,
const char *options)
{
KioskInputSourceGroup *input_source_group = NULL;
g_debug ("KioskInputSourcesManager: Adding input engine '%s'", engine_name);
input_source_group = kiosk_input_sources_manager_add_new_input_source_group (self, options);
kiosk_input_source_group_set_input_engine (input_source_group, engine_name);
kiosk_input_source_group_set_options (input_source_group, options);
}
-gboolean
-kiosk_input_sources_manager_set_input_sources_from_system_configuration (KioskInputSourcesManager *self)
+static gboolean
+kiosk_input_sources_manager_set_input_sources_from_strings (KioskInputSourcesManager *self,
+ const char *layouts_string,
+ const char *variants_string,
+ const char *options_string)
{
KioskInputSourceGroup *old_input_source_group;
g_autofree char *old_input_engine = NULL;
g_autofree char *old_selected_layout = NULL;
- const char *layouts_string = NULL;
g_auto (GStrv) layouts = NULL;
size_t number_of_layouts = 0;
- const char *variants_string = NULL;
g_auto (GStrv) variants = NULL;
size_t number_of_variants = 0;
- const char *options = NULL;
size_t i, j;
- gboolean input_source_group_active;
+ gboolean input_sources_active;
g_return_val_if_fail (KIOSK_IS_INPUT_SOURCES_MANAGER (self), FALSE);
- if (self->locale_proxy == NULL) {
- return FALSE;
- }
-
- g_debug ("KioskInputSourcesManager: Setting keymap from system configuration");
-
- layouts_string = sd_locale1_get_x11_layout (self->locale_proxy);
- g_debug ("KioskInputSourcesManager: System layout is '%s'", layouts_string);
-
layouts = g_strsplit (layouts_string, ",", -1);
number_of_layouts = g_strv_length (layouts);
- options = sd_locale1_get_x11_options (self->locale_proxy);
- g_debug ("KioskInputSourcesManager: System layout options are '%s'", options);
-
- variants_string = sd_locale1_get_x11_variant (self->locale_proxy);
- g_debug ("KioskInputSourcesManager: System layout variant is '%s'", variants_string);
variants = g_strsplit (variants_string, ",", -1);
number_of_variants = g_strv_length (variants);
if (number_of_layouts < number_of_variants) {
g_debug ("KioskInputSourcesManager: There is a layout variant mismatch");
return FALSE;
}
old_input_source_group = kiosk_input_sources_manager_get_selected_input_source_group (self);
if (old_input_source_group != NULL) {
old_input_engine = g_strdup (kiosk_input_source_group_get_input_engine (old_input_source_group));
old_selected_layout = kiosk_input_source_group_get_selected_layout (old_input_source_group);
}
kiosk_input_sources_manager_clear_input_sources (self);
for (i = 0, j = 0; layouts[i] != NULL; i++) {
char *id = NULL;
const char *layout = layouts[i];
const char *variant = "";
if (variants[j] != NULL) {
variant = variants[j++];
}
if (variant[0] == '\0') {
id = g_strdup (layout);
} else {
id = g_strdup_printf ("%s+%s", layout, variant);
}
- kiosk_input_sources_manager_add_layout (self, id, options);
+ kiosk_input_sources_manager_add_layout (self, id, options_string);
}
- input_source_group_active = activate_best_available_input_source_group (self, old_input_engine, old_selected_layout);
+ input_sources_active = activate_best_available_input_source_group (self, old_input_engine, old_selected_layout);
- if (!input_source_group_active) {
+ if (!input_sources_active) {
+ return FALSE;
+ }
+
+ sync_dbus_service (self);
+
+ return TRUE;
+}
+
+gboolean
+kiosk_input_sources_manager_set_input_sources_from_system_configuration (KioskInputSourcesManager *self)
+{
+ const char *layouts_string = NULL;
+ const char *variants_string = NULL;
+ const char *options = NULL;
+
+ gboolean input_sources_active;
+
+ g_return_val_if_fail (KIOSK_IS_INPUT_SOURCES_MANAGER (self), FALSE);
+
+ if (self->locale_proxy == NULL) {
+ return FALSE;
+ }
+
+ g_debug ("KioskInputSourcesManager: Setting keymap from system configuration");
+
+ layouts_string = sd_locale1_get_x11_layout (self->locale_proxy);
+ g_debug ("KioskInputSourcesManager: System layout is '%s'", layouts_string);
+
+ options = sd_locale1_get_x11_options (self->locale_proxy);
+ g_debug ("KioskInputSourcesManager: System layout options are '%s'", options);
+
+ variants_string = sd_locale1_get_x11_variant (self->locale_proxy);
+ g_debug ("KioskInputSourcesManager: System layout variant is '%s'", variants_string);
+
+ input_sources_active = kiosk_input_sources_manager_set_input_sources_from_strings (self, layouts_string, variants_string, options);
+
+ if (!input_sources_active) {
const char * const *locales;
locales = sd_locale1_get_locale (self->locale_proxy);
- input_source_group_active = kiosk_input_sources_manager_set_input_sources_from_locales (self, locales, options);
+ input_sources_active = kiosk_input_sources_manager_set_input_sources_from_locales (self, locales, options);
}
sync_dbus_service (self);
self->overriding_configuration = FALSE;
- if (!input_source_group_active) {
+ if (!input_sources_active) {
g_debug ("KioskInputSourcesManager: System has no valid configured input sources");
return FALSE;
}
return TRUE;
}
static void
on_session_input_configuration_changed (KioskInputSourcesManager *self)
{
g_debug ("KioskInputSourcesManager: Session input sources configuration changed");
if (self->overriding_configuration) {
g_debug ("KioskInputSourcesManager: Ignoring change, because keymap is overriden");
return;
}
kiosk_input_sources_manager_set_input_sources_from_session_configuration (self);
}
static void
on_session_input_sources_setting_changed (KioskInputSourcesManager *self)
{
kiosk_gobject_utils_queue_defer_callback (G_OBJECT (self),
"[kiosk-input-sources-manager] on_session_input_configuration_changed",
self->cancellable,
KIOSK_OBJECT_CALLBACK (on_session_input_configuration_changed),
NULL);
}
--
2.31.1

File diff suppressed because it is too large Load Diff

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# gnome-kiosk
The gnome-kiosk package

100
gnome-kiosk.spec Normal file
View File

@ -0,0 +1,100 @@
%global tarball_version %%(echo %{version} | tr '~' '.')
%global major_version %(echo -n %{tarball_version} | sed 's/[.].*//')
%global gettext_version 0.19.6
%global gnome_desktop_version 40~rc
%global glib2_version 2.68.0
%global gtk4_version 3.24.27
%global mutter_version 40.0
%global gsettings_desktop_schemas_version 40~rc
%global ibus_version 1.5.24
%global gnome_settings_daemon_version 40~rc
Name: gnome-kiosk
Version: 40~alpha
Release: 3%{?dist}
Summary: Window management and application launching for GNOME
License: GPLv2+
URL: https://gitlab.gnome.org/halfline/gnome-kiosk
Source0: https://download.gnome.org/sources/%{name}/%{major_version}/%{name}-%{tarball_version}.tar.xz
BuildRequires: desktop-file-utils
BuildRequires: gcc
BuildRequires: gettext >= %{gettext_version}
BuildRequires: git
BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version}
BuildRequires: pkgconfig(gobject-2.0) >= %{glib2_version}
BuildRequires: pkgconfig(gio-2.0) >= %{glib2_version}
BuildRequires: pkgconfig(gnome-desktop-3.0) >= %{gnome_desktop_version}
BuildRequires: pkgconfig(gtk4) >= %{gtk4_version}
BuildRequires: pkgconfig(ibus-1.0) >= %{ibus_version}
BuildRequires: pkgconfig(libmutter-8) >= %{mutter_version}
BuildRequires: mesa-libEGL-devel
BuildRequires: mesa-libGL-devel
BuildRequires: meson
Requires: gnome-settings-daemon%{?_isa} >= %{gnome_settings_daemon_version}
Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version}
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/1
Patch10001: 0001-compositor-Be-less-aggressive-about-full-screening-w.patch
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/2
Patch20001: 0001-compositor-Add-signal-for-reporting-X-server-events.patch
Patch20002: 0002-input-sources-manager-Fix-overzealous-rename-mistake.patch
Patch20003: 0003-input-sources-manager-Add-function-to-load-input-sou.patch
Patch20004: 0004-wip-Better-support-libxklavier.patch
%description
GNOME Kiosk provides a desktop enviroment suitable for fixed purpose, or
single application deployments like wall displays and point-of-sale systems.
%package search-appliance
Summary: Example search application application that uses GNOME Kiosk
License: GPLv2+
Requires: %{name} = %{version}-%{release}
Requires: firefox
Requires: gnome-session
BuildArch: noarch
%description search-appliance
This package provides a full screen firefox window pointed to google.
%prep
%autosetup -S git -n %{name}-%{tarball_version}
%build
%meson
%meson_build
%install
%meson_install
%check
desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.desktop
desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.SearchApp.desktop
%files
%license COPYING
%doc README.md
%{_bindir}/gnome-kiosk
%{_datadir}/applications/org.gnome.Kiosk.desktop
%files -n gnome-kiosk-search-appliance
%{_datadir}/applications/org.gnome.Kiosk.SearchApp.desktop
%{_datadir}/gnome-session/sessions/org.gnome.Kiosk.SearchApp.session
%{_datadir}/xsessions/org.gnome.Kiosk.SearchApp.Session.desktop
%{_datadir}/wayland-sessions/org.gnome.Kiosk.SearchApp.Session.desktop
%changelog
* Mon Apr 19 2021 Ray Strode <rstrode@redhat.com> - 40~alpha-3
- Fix crash
* Sun Apr 18 2021 Ray Strode <rstrode@redhat.com> - 40~alpha-2
- Work with 3rd party keyboard layout selectors
- Be less aggressive about fullscreening windows
* Mon Apr 12 2021 Ray Strode <rstrode@redhat.com> - 40~alpha-1
- Initial import

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (gnome-kiosk-40.alpha.tar.xz) = c79645935438f5512b437ae19ea8016a8b2ce6fd49a4e5426956d6fc21b33d622e82d01ce3c0cb97f540c5a889c1a098b0e9e8d65d33e0669dc989e1d391f9fb