From 4ccf11f4fd26083048f0ba80f5bc150dfa6aa688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 11 Sep 2020 16:17:45 +0200 Subject: [PATCH] server-context-service: Don't show keyboard when disabled If the corresponding a11y settings is disbaled don't unfold the keyboad at all. This helps e.g. running the same session on laptops or when an external keyboard is attached. Closes: #222 --- src/server-context-service.c | 58 ++++++++++++++++++++++++++++++++++-- src/server-context-service.h | 1 + 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/server-context-service.c b/src/server-context-service.c index ded432ef..515caf6e 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -31,6 +31,7 @@ enum { PROP_0, PROP_VISIBLE, + PROP_ENABLED, PROP_LAST }; @@ -44,6 +45,7 @@ struct _ServerContextService { struct ui_manager *manager; // unowned gboolean visible; + gboolean enabled; PhoshLayerSurface *window; GtkWidget *widget; // nullable guint hiding; @@ -208,6 +210,9 @@ on_hide (ServerContextService *self) static void server_context_service_real_show_keyboard (ServerContextService *self) { + if (!self->enabled) + return; + if (self->hiding) { g_source_remove (self->hiding); self->hiding = 0; @@ -263,7 +268,9 @@ server_context_service_set_property (GObject *object, case PROP_VISIBLE: self->visible = g_value_get_boolean (value); break; - + case PROP_ENABLED: + server_context_service_set_enabled (self, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -319,11 +326,43 @@ server_context_service_class_init (ServerContextServiceClass *klass) g_object_class_install_property (gobject_class, PROP_VISIBLE, pspec); + + /** + * ServerContextServie:keyboard: + * + * Does the user want the keyboard to show up automatically? + */ + pspec = + g_param_spec_boolean ("enabled", + "Enabled", + "Whether the keyboard is enabled", + TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (gobject_class, + PROP_ENABLED, + pspec); } static void server_context_service_init (ServerContextService *self) { - (void)self; + const char *schema_name = "org.gnome.desktop.a11y.applications"; + GSettingsSchemaSource *ssrc = g_settings_schema_source_get_default(); + g_autoptr(GSettingsSchema) schema = NULL; + + self->enabled = TRUE; + if (!ssrc) { + g_warning("No gsettings schemas installed."); + return; + } + schema = g_settings_schema_source_lookup(ssrc, schema_name, TRUE); + if (schema) { + g_autoptr(GSettings) settings = g_settings_new (schema_name); + g_settings_bind (settings, "screen-keyboard-enabled", + self, "enabled", G_SETTINGS_BIND_GET); + } else { + g_warning("Gsettings schema %s is not installed on the system. " + "Enabling by default.", schema_name); + } } ServerContextService * @@ -336,3 +375,18 @@ server_context_service_new (EekboardContextService *self, struct submission *sub ui->manager = uiman; return ui; } + +void +server_context_service_set_enabled (ServerContextService *self, gboolean enabled) +{ + g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (self)); + + if (enabled == self->enabled) + return; + + self->enabled = enabled; + if (self->enabled) + server_context_service_show_keyboard (self); + else + server_context_service_hide_keyboard (self); +} diff --git a/src/server-context-service.h b/src/server-context-service.h index bafe71c3..a091d0f9 100644 --- a/src/server-context-service.h +++ b/src/server-context-service.h @@ -33,6 +33,7 @@ ServerContextService *server_context_service_new(EekboardContextService *self, s enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *); void server_context_service_show_keyboard (ServerContextService *self); void server_context_service_hide_keyboard (ServerContextService *self); +void server_context_service_set_enabled (ServerContextService *self, gboolean enabled); G_END_DECLS #endif /* SERVER_CONTEXT_SERVICE_H */