From 4890c86b4efc299ca9da71408af9574dd3663505 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Date: Tue, 15 Dec 2020 13:20:34 +0000 Subject: [PATCH] dbus: Reset hints if text input missing --- src/dbus.c | 2 +- src/server-context-service.c | 15 ++++++++++++++- src/server-context-service.h | 2 +- src/submission.h | 1 + src/submission.rs | 12 ++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/dbus.c b/src/dbus.c index 046b6bd8..24bab66f 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -59,7 +59,7 @@ handle_set_visible(SmPuriOSK0 *object, GDBusMethodInvocation *invocation, if (service->context) { if (arg_visible) { - server_context_service_show_keyboard (service->context); + server_context_service_force_show_keyboard (service->context); } else { server_context_service_hide_keyboard (service->context); } diff --git a/src/server-context-service.c b/src/server-context-service.c index 44364aec..8c907848 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -255,7 +255,7 @@ on_hide (ServerContextService *self) return G_SOURCE_REMOVE; } -void +static void server_context_service_show_keyboard (ServerContextService *self) { g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(self)); @@ -270,6 +270,19 @@ server_context_service_show_keyboard (ServerContextService *self) } } +void +server_context_service_force_show_keyboard (ServerContextService *self) +{ + if (!submission_hint_available(self->submission)) { + eekboard_context_service_set_hint_purpose( + self->state, + ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE, + ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL + ); + } + server_context_service_show_keyboard(self); +} + void server_context_service_hide_keyboard (ServerContextService *self) { diff --git a/src/server-context-service.h b/src/server-context-service.h index 99aca139..a77a8edd 100644 --- a/src/server-context-service.h +++ b/src/server-context-service.h @@ -31,7 +31,7 @@ G_DECLARE_FINAL_TYPE (ServerContextService, server_context_service, SERVER, CONT ServerContextService *server_context_service_new(EekboardContextService *self, struct submission *submission, struct squeek_layout_state *layout, struct ui_manager *uiman, struct vis_manager *visman); enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *); -void server_context_service_show_keyboard (ServerContextService *self); +void server_context_service_force_show_keyboard (ServerContextService *self); void server_context_service_hide_keyboard (ServerContextService *self); G_END_DECLS #endif /* SERVER_CONTEXT_SERVICE_H */ diff --git a/src/submission.h b/src/submission.h index 49a15116..1e7274ae 100644 --- a/src/submission.h +++ b/src/submission.h @@ -17,6 +17,7 @@ struct submission* get_submission(struct zwp_input_method_manager_v2 *immanager, // Defined in Rust struct submission* submission_new(struct zwp_input_method_v2 *im, struct zwp_virtual_keyboard_v1 *vk, EekboardContextService *state, struct vis_manager *vis_manager); +uint8_t submission_hint_available(struct submission *self); void submission_set_ui(struct submission *self, ServerContextService *ui_context); void submission_use_layout(struct submission *self, struct squeek_layout *layout, uint32_t time); #endif diff --git a/src/submission.rs b/src/submission.rs index f64810f8..ba9f0c7a 100644 --- a/src/submission.rs +++ b/src/submission.rs @@ -93,6 +93,18 @@ pub mod c { let layout = unsafe { &*layout }; submission.use_layout(layout, Timestamp(time)); } + + #[no_mangle] + pub extern "C" + fn submission_hint_available(submission: *mut Submission) -> u8 { + if submission.is_null() { + panic!("Null submission pointer"); + } + let submission: &mut Submission = unsafe { &mut *submission }; + let active = submission.imservice.as_ref() + .map(|imservice| imservice.is_active()); + (Some(true) == active) as u8 + } } #[derive(Clone, Copy)] -- GitLab