From c5d2d76ab18d8f4e107af24a992c6eaeae6f9ac6 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Mon, 22 Jul 2019 15:56:38 +0000 Subject: [PATCH] imservice: Handle unavailable message --- src/imservice.c | 9 ++++++--- src/imservice.h | 1 + src/imservice.rs | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/imservice.c b/src/imservice.c index 0eaa9db7..df245072 100644 --- a/src/imservice.c +++ b/src/imservice.c @@ -5,9 +5,6 @@ #include "eekboard/eekboard-context-service.h" -void imservice_handle_unavailable(void *data, struct zwp_input_method_v2 *input_method) {} - - static const struct zwp_input_method_v2_listener input_method_listener = { .activate = imservice_handle_input_method_activate, .deactivate = imservice_handle_input_method_deactivate, @@ -42,3 +39,9 @@ void imservice_try_hide(EekboardContextService *context, (void)im; eekboard_context_service_hide_keyboard (context); } + +/// Declared explicitly because _destroy is inline, +/// making it unavailable in Rust +void imservice_destroy_im(struct zwp_input_method_v2 *im) { + zwp_input_method_v2_destroy(im); +} diff --git a/src/imservice.h b/src/imservice.h index 6f41bdbe..71c59275 100644 --- a/src/imservice.h +++ b/src/imservice.h @@ -20,5 +20,6 @@ void imservice_handle_surrounding_text(void *data, struct zwp_input_method_v2 *i void imservice_handle_commit_state(void *data, struct zwp_input_method_v2 *input_method); void imservice_handle_content_type(void *data, struct zwp_input_method_v2 *input_method, uint32_t hint, uint32_t purpose); void imservice_handle_text_change_cause(void *data, struct zwp_input_method_v2 *input_method, uint32_t cause); +void imservice_handle_unavailable(void *data, struct zwp_input_method_v2 *input_method); #endif diff --git a/src/imservice.rs b/src/imservice.rs index b0daea89..73f9d7ee 100644 --- a/src/imservice.rs +++ b/src/imservice.rs @@ -33,6 +33,7 @@ pub mod c { extern "C" { fn imservice_make_visible(imservice: *const UIManager); fn imservice_try_hide(imservice: *const UIManager); + fn imservice_destroy_im(im: *mut c::InputMethod); fn eekboard_context_service_set_hint_purpose(imservice: *const UIManager, hint: u32, purpose: u32); } @@ -162,6 +163,22 @@ pub mod c { } } + #[no_mangle] + pub unsafe extern "C" + fn imservice_handle_unavailable(imservice: *mut IMService, + im: *mut InputMethod) + { + imservice_destroy_im(im); + + let imservice = &mut *imservice; + + // no need to care about proper double-buffering, + // the keyboard is already decommissioned + imservice.current.active = false; + + imservice_try_hide(imservice.ui_manager); + } + // FIXME: destroy and deallocate }