Make work better with Anaconda
- Work with 3rd party keyboard layout selectors - Be less aggressive about fullscreening windows
This commit is contained in:
parent
ff8a53e464
commit
653abc0a81
229
0001-compositor-Add-signal-for-reporting-X-server-events.patch
Normal file
229
0001-compositor-Add-signal-for-reporting-X-server-events.patch
Normal file
@ -0,0 +1,229 @@
|
||||
From e27d9527fa03be29ad030634ab3b5de652527d81 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 b3cd10f..a8ecf5f 100644
|
||||
--- a/compositor/kiosk-compositor.c
|
||||
+++ b/compositor/kiosk-compositor.c
|
||||
@@ -7,60 +7,67 @@
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
#include <meta/display.h>
|
||||
#include <meta/main.h>
|
||||
#include <meta/util.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;
|
||||
@@ -267,62 +274,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)
|
||||
{
|
||||
|
||||
@@ -358,60 +367,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
|
||||
|
228
0001-compositor-Be-less-aggressive-about-full-screening-w.patch
Normal file
228
0001-compositor-Be-less-aggressive-about-full-screening-w.patch
Normal file
@ -0,0 +1,228 @@
|
||||
From 348cb4fda7da06da3194a784a97946364dd3182b 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 a8ecf5f..14f5de3 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;
|
||||
};
|
||||
|
||||
enum {
|
||||
X_SERVER_EVENT,
|
||||
NUMBER_OF_SIGNALS
|
||||
};
|
||||
|
||||
static guint signals [NUMBER_OF_SIGNALS] = { 0, };
|
||||
|
||||
@@ -150,91 +152,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.30.2
|
||||
|
188
0002-input-sources-manager-Fix-overzealous-rename-mistake.patch
Normal file
188
0002-input-sources-manager-Fix-overzealous-rename-mistake.patch
Normal file
@ -0,0 +1,188 @@
|
||||
From dcda260069ff811dc46a9ab0524eab273275206f 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
|
||||
|
219
0003-input-sources-manager-Add-function-to-load-input-sou.patch
Normal file
219
0003-input-sources-manager-Add-function-to-load-input-sou.patch
Normal file
@ -0,0 +1,219 @@
|
||||
From 3acb4e6e52c183eb756b61880e320fa3af639f89 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.30.2
|
||||
|
1210
0004-wip-Better-support-libxklavier.patch
Normal file
1210
0004-wip-Better-support-libxklavier.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,7 @@
|
||||
|
||||
Name: gnome-kiosk
|
||||
Version: 40~alpha
|
||||
Release: 1%{?dist}
|
||||
Release: 2%{?dist}
|
||||
Summary: Window management and application launching for GNOME
|
||||
|
||||
License: GPLv2+
|
||||
@ -37,6 +37,15 @@ 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-Add-signal-for-reporting-X-server-events.patch
|
||||
|
||||
# https://gitlab.gnome.org/halfline/gnome-kiosk/-/merge_requests/2
|
||||
Patch20001: 0001-compositor-Be-less-aggressive-about-full-screening-w.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.
|
||||
@ -79,6 +88,10 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Kiosk.Searc
|
||||
%{_datadir}/wayland-sessions/org.gnome.Kiosk.SearchApp.Session.desktop
|
||||
|
||||
%changelog
|
||||
* 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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user