240 lines
7.8 KiB
Diff
240 lines
7.8 KiB
Diff
From 28a560fdc1a8571d0e1d34da5cb57f43d2fe1a54 Mon Sep 17 00:00:00 2001
|
|
From: Ray Strode <rstrode@redhat.com>
|
|
Date: Wed, 11 Aug 2021 14:47:05 -0400
|
|
Subject: [PATCH 1/6] compositor: Ignore some of the builtin keybindings
|
|
|
|
Mutter on wayland currently has a bug where it crashes if the run dialog
|
|
keybinding is pressed. No one notices the bug for gnome-shell, since
|
|
gnome-shell overrides mutters run dialog keybinding.
|
|
|
|
This commit makes GNOME Kiosk also override the keybinding to avoid the
|
|
crash. At the same time it neuters a few other builtin keybindings that
|
|
aren't so useful to GNOME Kiosk.
|
|
---
|
|
compositor/kiosk-compositor.c | 90 +++++++++++++++++++++++++++++++++++
|
|
1 file changed, 90 insertions(+)
|
|
|
|
diff --git a/compositor/kiosk-compositor.c b/compositor/kiosk-compositor.c
|
|
index 43329c7..2db58ed 100644
|
|
--- a/compositor/kiosk-compositor.c
|
|
+++ b/compositor/kiosk-compositor.c
|
|
@@ -1,42 +1,43 @@
|
|
#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/keybindings.h>
|
|
#include <meta/main.h>
|
|
#include <meta/util.h>
|
|
#include <meta/meta-window-group.h>
|
|
|
|
#include <systemd/sd-daemon.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,
|
|
@@ -103,82 +104,171 @@ register_with_display_manager (KioskCompositor *self)
|
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{ss}"));
|
|
|
|
gdm_manager_call_register_display_sync (display_manager,
|
|
g_variant_builder_end (&builder),
|
|
self->cancellable,
|
|
&error);
|
|
|
|
if (error != NULL) {
|
|
g_debug ("KioskCompositor: Could not register with display manager: %s",
|
|
error->message);
|
|
return;
|
|
}
|
|
}
|
|
|
|
static void
|
|
register_with_systemd (KioskCompositor *self)
|
|
{
|
|
sd_notify (TRUE, "READY=1");
|
|
}
|
|
|
|
static void
|
|
register_session (KioskCompositor *self)
|
|
{
|
|
meta_register_with_session ();
|
|
|
|
register_with_display_manager (self);
|
|
|
|
register_with_systemd (self);
|
|
}
|
|
|
|
+static void
|
|
+on_builtin_keybinding_triggered (MetaDisplay *display,
|
|
+ MetaWindow *window,
|
|
+ ClutterKeyEvent *event,
|
|
+ MetaKeyBinding *binding,
|
|
+ KioskCompositor *self)
|
|
+{
|
|
+ g_debug ("KioskCompositor: Ignoring '%s' request",
|
|
+ meta_key_binding_get_name (binding));
|
|
+}
|
|
+
|
|
+static void
|
|
+neuter_builtin_keybindings (KioskCompositor *self)
|
|
+{
|
|
+ const char *builtin_keybindings[] = {
|
|
+ "switch-to-workspace-1",
|
|
+ "switch-to-workspace-2",
|
|
+ "switch-to-workspace-3",
|
|
+ "switch-to-workspace-4",
|
|
+ "switch-to-workspace-5",
|
|
+ "switch-to-workspace-6",
|
|
+ "switch-to-workspace-7",
|
|
+ "switch-to-workspace-8",
|
|
+ "switch-to-workspace-9",
|
|
+ "switch-to-workspace-10",
|
|
+ "switch-to-workspace-11",
|
|
+ "switch-to-workspace-12",
|
|
+ "switch-to-workspace-left",
|
|
+ "switch-to-workspace-right",
|
|
+ "switch-to-workspace-up",
|
|
+ "switch-to-workspace-down",
|
|
+ "switch-to-workspace-last",
|
|
+ "panel-main-menu",
|
|
+ "panel-run-dialog",
|
|
+ "set-spew-mark",
|
|
+ "switch-monitor",
|
|
+ "rotate-monitor",
|
|
+ "switch-to-session-1",
|
|
+ "switch-to-session-2",
|
|
+ "switch-to-session-3",
|
|
+ "switch-to-session-4",
|
|
+ "switch-to-session-5",
|
|
+ "switch-to-session-6",
|
|
+ "switch-to-session-7",
|
|
+ "switch-to-session-8",
|
|
+ "switch-to-session-9",
|
|
+ "switch-to-session-10",
|
|
+ "switch-to-session-11",
|
|
+ "switch-to-session-12",
|
|
+ "restore-shortcuts",
|
|
+ "activate-window-menu",
|
|
+ "toggle-above",
|
|
+ "toggle-shaded",
|
|
+ "minimize",
|
|
+ "toggle-on-all-workspaces",
|
|
+ "move-to-workspace-1",
|
|
+ "move-to-workspace-2",
|
|
+ "move-to-workspace-3",
|
|
+ "move-to-workspace-4",
|
|
+ "move-to-workspace-5",
|
|
+ "move-to-workspace-6",
|
|
+ "move-to-workspace-7",
|
|
+ "move-to-workspace-8",
|
|
+ "move-to-workspace-9",
|
|
+ "move-to-workspace-10",
|
|
+ "move-to-workspace-11",
|
|
+ "move-to-workspace-12",
|
|
+ "move-to-workspace-last",
|
|
+ "move-to-workspace-left",
|
|
+ "move-to-workspace-right",
|
|
+ "move-to-workspace-up",
|
|
+ "move-to-workspace-down",
|
|
+ NULL
|
|
+ };
|
|
+ size_t i;
|
|
+
|
|
+ g_debug ("KioskCompositor: Neutering builtin keybindings");
|
|
+
|
|
+ for (i = 0; builtin_keybindings[i] != NULL; i++) {
|
|
+ meta_keybindings_set_custom_handler (builtin_keybindings[i],
|
|
+ (MetaKeyHandlerFunc)
|
|
+ on_builtin_keybinding_triggered,
|
|
+ self,
|
|
+ NULL);
|
|
+ }
|
|
+}
|
|
+
|
|
static void
|
|
kiosk_compositor_start (MetaPlugin *plugin)
|
|
{
|
|
KioskCompositor *self = KIOSK_COMPOSITOR (plugin);
|
|
g_autoptr (GError) error = NULL;
|
|
|
|
g_set_weak_pointer (&self->display, meta_plugin_get_display (META_PLUGIN (self)));
|
|
g_set_weak_pointer (&self->backend, clutter_get_default_backend ());
|
|
g_set_weak_pointer (&self->stage, meta_get_stage_for_display (self->display));
|
|
|
|
clutter_actor_show (self->stage);
|
|
|
|
self->cancellable = g_cancellable_new ();
|
|
|
|
self->service = kiosk_service_new (self);
|
|
kiosk_service_start (self->service, &error);
|
|
|
|
if (error != NULL) {
|
|
g_debug ("KioskCompositor: Could not start D-Bus service: %s", error->message);
|
|
g_clear_error (&error);
|
|
}
|
|
|
|
+ neuter_builtin_keybindings (self);
|
|
+
|
|
self->backgrounds = kiosk_backgrounds_new (self);
|
|
self->input_sources_manager = kiosk_input_sources_manager_new (self);
|
|
|
|
register_session (self);
|
|
}
|
|
|
|
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,
|
|
--
|
|
2.31.1
|
|
|