Update to 40.0

Related: #1950042
This commit is contained in:
Ray Strode 2021-05-17 17:02:58 -04:00
parent 5dcafc6da2
commit 599435da06
11 changed files with 8 additions and 2495 deletions

1
.gitignore vendored
View File

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

View File

@ -1,32 +0,0 @@
From 342cc4adec33571e6e0d786a297f0034161dc6ee Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Tue, 27 Apr 2021 16:07:13 -0400
Subject: [PATCH] Make the desktop file valid
desktop-file-validate was complaining about the
lack of a main category in the Categories value.
So add one.
---
compositor/data/org.gnome.Kiosk.desktop.in.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/compositor/data/org.gnome.Kiosk.desktop.in.in b/compositor/data/org.gnome.Kiosk.desktop.in.in
index bf6ec39..bb603c8 100644
--- a/compositor/data/org.gnome.Kiosk.desktop.in.in
+++ b/compositor/data/org.gnome.Kiosk.desktop.in.in
@@ -1,12 +1,12 @@
[Desktop Entry]
Type=Application
Name=GNOME Kiosk
Comment=Compositor for Kiosk and Single Application deployments
Exec=@bindir@/gnome-kiosk
-Categories=GNOME;GTK;Core;
+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
--
2.31.1

View File

@ -1,228 +0,0 @@
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

@ -1,82 +0,0 @@
From ed8dbeb00ef64faa047652ac7fc9bf029348a6df Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 6 May 2021 14:17:26 -0400
Subject: [PATCH] compositor: Put the on top windows actually on top
A typo in the code left me putting new windows under old ones.
This commit fixes that.
---
compositor/kiosk-compositor.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/compositor/kiosk-compositor.c b/compositor/kiosk-compositor.c
index 14f5de3..6753a87 100644
--- a/compositor/kiosk-compositor.c
+++ b/compositor/kiosk-compositor.c
@@ -239,61 +239,61 @@ on_faded_in (KioskCompositor *self,
MetaWindowActor *actor = g_object_get_data (G_OBJECT (transition), "actor");
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 (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);
+ clutter_actor_set_child_above_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)
--
2.31.1

View File

@ -1,116 +0,0 @@
From ab8482bab7981321f0f2fbd401907ac34028bb1a Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 20 Apr 2021 09:27:01 -0400
Subject: [PATCH 1/4] gobject-utils: Log when executing deferred tasks
At the moment, the code defers execution until "later" in
various parts of the code to ensure a flood of related events
doesn't lead to a flood of duplicated work.
But, its on the called code to log at the moment.
This commit adds logging to the generic part of the code to
for clarity.
---
compositor/kiosk-gobject-utils.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/compositor/kiosk-gobject-utils.c b/compositor/kiosk-gobject-utils.c
index a0dfcd8..c38db7e 100644
--- a/compositor/kiosk-gobject-utils.c
+++ b/compositor/kiosk-gobject-utils.c
@@ -1,83 +1,87 @@
#include "config.h"
#include "kiosk-gobject-utils.h"
#define COALESCE_INTERVAL 250 /* milliseconds */
static void
on_task_wait_complete (GObject *self,
GTask *task)
{
KioskObjectCallback callback;
gpointer user_data;
gboolean completed;
g_autofree char *data_key = NULL;
+ g_debug ("KioskGObjectUtils: Executing deferred task '%s'", g_task_get_name (task));
+
callback = g_object_get_data (G_OBJECT (task), "callback");
user_data = g_object_get_data (G_OBJECT (task), "user-data");
completed = g_task_propagate_boolean (task, NULL);
if (completed) {
callback (self, user_data);
}
data_key = g_strdup_printf ("kiosk-gobject-utils-%p-%p-task",
callback, user_data);
g_object_set_data (G_OBJECT (self), data_key, NULL);
}
static gboolean
on_coalesce_timeout (GTask *task)
{
if (!g_task_return_error_if_cancelled (task)) {
g_task_return_boolean (task, TRUE);
}
return G_SOURCE_REMOVE;
}
void
kiosk_gobject_utils_queue_defer_callback (GObject *self,
const char *name,
GCancellable *cancellable,
KioskObjectCallback callback,
gpointer user_data)
{
g_autofree char *data_key = NULL;
g_autoptr (GSource) timeout_source = NULL;
GTask *task;
g_return_if_fail (G_IS_OBJECT (self));
g_return_if_fail (callback != NULL);
data_key = g_strdup_printf ("kiosk-gobject-utils-%p-%p-task",
callback, user_data);
task = g_object_get_data (G_OBJECT (self), data_key);
if (task != NULL) {
return;
}
timeout_source = g_timeout_source_new (COALESCE_INTERVAL);
- if (name != NULL) {
- g_source_set_name (timeout_source, name);
- }
-
task = g_task_new (self,
cancellable,
(GAsyncReadyCallback) on_task_wait_complete,
NULL);
+
+ if (name != NULL) {
+ g_task_set_name (task, name);
+ g_debug ("KioskGObjectUtils: Deferring task '%s' for %dms", name, COALESCE_INTERVAL);
+ }
+
g_task_attach_source (task, timeout_source, G_SOURCE_FUNC (on_coalesce_timeout));
g_object_set_data (G_OBJECT (task), "callback", callback);
g_object_set_data (G_OBJECT (task), "user-data", user_data);
g_object_set_data_full (G_OBJECT (self),
data_key,
task,
(GDestroyNotify)
g_object_unref);
}
--
2.30.2

View File

@ -1,109 +0,0 @@
From 89b5facb7545c0423673c500343794a6c07fabfe Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 12 May 2021 15:19:26 -0400
Subject: [PATCH] input-sources-manager: Fail better if localed isn't available
At the moment we assumed the localed proxy will always return valid
strings. If localed exits, though, there's a small window where the
properties can return NULL.
This commit tries to handle that transient failure better.
---
compositor/kiosk-input-sources-manager.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/compositor/kiosk-input-sources-manager.c b/compositor/kiosk-input-sources-manager.c
index 7bb67b0..49973db 100644
--- a/compositor/kiosk-input-sources-manager.c
+++ b/compositor/kiosk-input-sources-manager.c
@@ -807,80 +807,87 @@ kiosk_input_sources_manager_add_layout (KioskInputSourcesManager *self,
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)
{
KioskInputSourceGroup *old_input_source_group;
g_autofree char *old_input_engine = NULL;
g_autofree char *old_selected_layout = NULL;
+ g_autofree char *localed_name_owner = 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;
g_return_val_if_fail (KIOSK_IS_INPUT_SOURCES_MANAGER (self), FALSE);
if (self->locale_proxy == NULL) {
return FALSE;
}
+ localed_name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (self->locale_proxy));
+
+ if (localed_name_owner == 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);
--
2.31.1

View File

@ -1,188 +0,0 @@
From f553708a756682d625f51e7c0f3d2a31f39442bb 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.30.2

View File

@ -1,229 +0,0 @@
From a944f0d27a42028ec18edb17f65957780c400104 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 15 Apr 2021 13:28:00 -0400
Subject: [PATCH 3/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.30.2

File diff suppressed because it is too large Load Diff

View File

@ -11,8 +11,8 @@
%global gnome_settings_daemon_version 40~rc
Name: gnome-kiosk
Version: 40~alpha
Release: 9%{?dist}
Version: 40.0
Release: 1%{?dist}
Summary: Window management and application launching for GNOME
License: GPLv2+
@ -39,24 +39,6 @@ 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-gobject-utils-Log-when-executing-deferred-tasks.patch
Patch20002: 0002-input-sources-manager-Fix-overzealous-rename-mistake.patch
Patch20003: 0003-compositor-Add-signal-for-reporting-X-server-events.patch
Patch20004: 0004-input-sources-manager-Support-libxklavier-managed-ke.patch
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/3
Patch30001: 0001-Make-the-desktop-file-valid.patch
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/4
Patch40001: 0001-compositor-Put-the-on-top-windows-actually-on-top.patch
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/5
Patch50001: 0001-input-sources-manager-Fail-better-if-localed-isn-t-a.patch
%description
GNOME Kiosk provides a desktop enviroment suitable for fixed purpose, or
single application deployments like wall displays and point-of-sale systems.
@ -99,6 +81,10 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.Searc
%{_datadir}/wayland-sessions/org.gnome.Kiosk.SearchApp.Session.desktop
%changelog
* Mon May 17 2021 Ray Strode <rstrode@redhat.com> - 40.0-1
- Update to 40.0
Related: #1950042
* Wed May 12 2021 Ray Strode <rstrode@redhat.com> - 40~alpha-9
- Fix crash
Resolves: #1957754

View File

@ -1 +1 @@
SHA512 (gnome-kiosk-40.alpha.tar.xz) = c79645935438f5512b437ae19ea8016a8b2ce6fd49a4e5426956d6fc21b33d622e82d01ce3c0cb97f540c5a889c1a098b0e9e8d65d33e0669dc989e1d391f9fb
SHA512 (gnome-kiosk-40.0.tar.xz) = 2e670046b9cf9031bfa2b95969726c626d83c6d84ffb0ecc50a67414d406f05e515dbf7716b7f84c9342aec84e93369c07199ef233923cbb527d267c61374d35